From 4b262d020835b1de1c1d9c73be19f80a026fa81d Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 20 Jul 2022 14:40:37 +0200 Subject: [PATCH 001/150] Update CustomLoggerImpl.cpp (#723) Co-authored-by: Fabio Vitello --- Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp b/Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp index d983f289c..b1dd51605 100644 --- a/Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp +++ b/Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp @@ -661,7 +661,7 @@ void CustomStructuredPushConsumer::push_structured_event (const CosNotification: const char *type_name = notification.header.fixed_header.event_type.type_name;*/ const char *xmlLog; notification.remainder_of_body >>= xmlLog; - Logging::XmlLogRecordSeq *reclist; + const Logging::XmlLogRecordSeq *reclist; notification.remainder_of_body >>= reclist; LogRecord_sp lr; try { -- GitLab From ef1b01e35785da644709ffdc6d31909d3316b324 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sun, 24 Jul 2022 15:34:06 +0200 Subject: [PATCH 002/150] Fix #724, fixed CDBs (#726) As all Centos 7 related fixes, this should be tested thoroughly --- .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../ExternalClientsContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../KBandContainer/KBandContainer.xml | 2 +- .../LocalOscillatorContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../SardaraContainer/SardaraContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- .../MACI/Containers/XContainer/XContainer.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 30 ++++++------ .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../ExternalClientsContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../KBandContainer/KBandContainer.xml | 2 +- .../LocalOscillatorContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../SardaraContainer/SardaraContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- .../MACI/Containers/XContainer/XContainer.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 30 ++++++------ .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../ExternalClientContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../FrontEndsContainer/FrontEndsContainer.xml | 2 +- .../LocalOscillatorContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 2 +- .../NotoActiveSurfaceContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- Noto/CDB/MACI/Managers/Manager/Manager.xml | 32 ++++++------- .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../ExternalClientsContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../FrontEndsContainer/FrontEndsContainer.xml | 2 +- .../LocalOscillatorContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 2 +- .../NotoActiveSurfaceContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 34 +++++++------- .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../DewarPositionerData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR01/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR01/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR01/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR01/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR01/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR01/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR01/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR02/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR02/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR02/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR02/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR02/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR02/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR02/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR02/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR02/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR03/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR03/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR03/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR03/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR03/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR03/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR03/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR03/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR04/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR04/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR04/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR04/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR04/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR04/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR04/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR04/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR04/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR05/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR05/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR05/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR05/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR05/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR05/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR05/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR05/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR05/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR06/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR06/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR06/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR06/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR06/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR06/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR06/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR06/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR06/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR06/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR06/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR06/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR07/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR07/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR07/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR07/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR07/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR07/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR07/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR07/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR07/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR08/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR08/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR08/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR08/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR08/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR08/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR08/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR08/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR08/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR08/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR08/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR08/LAN12/LAN12.xml | 18 +++---- .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 0 .../TestNamespace/Positioner/Positioner.xml | 0 .../Positioner00/Positioner00.xml | 0 .../Positioner01/Positioner01.xml | 0 .../Positioner02/Positioner02.xml | 0 .../Positioner03/Positioner03.xml | 0 .../AntennaBossContainer.xml | 2 +- .../AntennaBossSimContainer.xml | 2 +- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../DerotatorContainer/DerotatorContainer.xml | 2 +- .../DerotatorPositionerContainer.xml | 2 +- .../ExternalClientsContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../HolographyContainer.xml | 2 +- .../HolographyDXCContainer.xml | 2 +- .../LocalOscillatorCContainer.xml | 2 +- .../LocalOscillatorKContainer.xml | 2 +- .../LocalOscillatorLPContainer.xml | 2 +- .../LocalOscillatorsContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MinorServoContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 47 ++++++++----------- .../NoiseGeneratorContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PositionerContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../PyIFDistributorContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../SRT7GHzContainer/SRT7GHzContainer.xml | 2 +- .../SRTActiveSurfaceContainer.xml | 2 +- .../SRTActiveSurfaceContainer01.xml | 2 +- .../SRTActiveSurfaceContainer02.xml | 2 +- .../SRTActiveSurfaceContainer03.xml | 2 +- .../SRTActiveSurfaceContainer04.xml | 2 +- .../SRTActiveSurfaceContainer05.xml | 2 +- .../SRTActiveSurfaceContainer06.xml | 2 +- .../SRTActiveSurfaceContainer07.xml | 2 +- .../SRTActiveSurfaceContainer08.xml | 2 +- .../SRTKBandContainer/SRTKBandContainer.xml | 2 +- .../SRTLPBandContainer/SRTLPBandContainer.xml | 2 +- .../SRTSBandContainer/SRTSBandContainer.xml | 2 +- .../SardaraContainer/SardaraContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- .../MACI/Containers/XContainer/XContainer.xml | 2 +- SRT/CDB/MACI/Managers/Manager/Manager.xml | 32 ++++++------- SRT/CDB/alma/AS/Boss/Boss.xml | 18 +++---- .../MACI/Channels/AntennaData/AntennaData.xml | 2 +- .../DewarPositionerData.xml | 2 +- .../Components/ANTENNA/IncludeDynamic.xml | 6 +-- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR01/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR01/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR01/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR01/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR01/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR01/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR01/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR02/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR02/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR02/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR02/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR02/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR02/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR02/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR02/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR02/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR03/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR03/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR03/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR03/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR03/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR03/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR03/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR03/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR04/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR04/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR04/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR04/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR04/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR04/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR04/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR04/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR04/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR05/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR05/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR05/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR05/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR05/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR05/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR05/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR05/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR05/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR05/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR06/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR06/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR06/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR06/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR06/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR06/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR06/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR06/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR06/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR06/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR06/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR06/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR07/LAN01/LAN01.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR07/LAN03/LAN03.xml | 30 ++++++------ .../Components/AS/SECTOR07/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR07/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR07/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR07/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR07/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR07/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR07/LAN11/LAN11.xml | 32 ++++++------- .../Components/AS/SECTOR07/LAN12/LAN12.xml | 18 +++---- .../Components/AS/SECTOR08/LAN01/LAN01.xml | 28 +++++------ .../Components/AS/SECTOR08/LAN02/LAN02.xml | 18 +++---- .../Components/AS/SECTOR08/LAN03/LAN03.xml | 32 ++++++------- .../Components/AS/SECTOR08/LAN04/LAN04.xml | 18 +++---- .../Components/AS/SECTOR08/LAN05/LAN05.xml | 26 +++++----- .../Components/AS/SECTOR08/LAN06/LAN06.xml | 18 +++---- .../Components/AS/SECTOR08/LAN07/LAN07.xml | 30 ++++++------ .../Components/AS/SECTOR08/LAN08/LAN08.xml | 18 +++---- .../Components/AS/SECTOR08/LAN09/LAN09.xml | 26 +++++----- .../Components/AS/SECTOR08/LAN10/LAN10.xml | 18 +++---- .../Components/AS/SECTOR08/LAN11/LAN11.xml | 30 ++++++------ .../Components/AS/SECTOR08/LAN12/LAN12.xml | 18 +++---- .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 0 .../AntennaBossContainer.xml | 2 +- .../AntennaContainer/AntennaContainer.xml | 2 +- .../CalibrationToolContainer.xml | 2 +- .../DerotatorContainer/DerotatorContainer.xml | 2 +- .../DerotatorPositionerContainer.xml | 2 +- .../ExternalClientsContainer.xml | 2 +- .../FitsZillaContainer/FitsZillaContainer.xml | 2 +- .../HolographyContainer.xml | 2 +- .../HolographyDXCContainer.xml | 2 +- .../LocalOscillatorCContainer.xml | 2 +- .../LocalOscillatorKContainer.xml | 2 +- .../LocalOscillatorLPContainer.xml | 2 +- .../LocalOscillatorsContainer.xml | 2 +- .../LoggerContainer/LoggerContainer.xml | 2 +- .../ManagementContainer.xml | 2 +- .../MinorServoBossContainer.xml | 2 +- .../MinorServoContainer.xml | 2 +- .../MountContainer/MountContainer.xml | 2 +- .../NoiseGeneratorContainer.xml | 2 +- .../PointContainer/PointContainer.xml | 2 +- .../PyCalmuxContainer/PyCalmuxContainer.xml | 2 +- .../PyIFDistributorContainer.xml | 2 +- .../RFIMonitoringContainer.xml | 2 +- .../ReceiversContainer/ReceiversContainer.xml | 2 +- .../SRT7GHzContainer/SRT7GHzContainer.xml | 2 +- .../SRTActiveSurfaceContainer.xml | 2 +- .../SRTActiveSurfaceContainer01.xml | 2 +- .../SRTActiveSurfaceContainer02.xml | 2 +- .../SRTActiveSurfaceContainer03.xml | 2 +- .../SRTActiveSurfaceContainer04.xml | 2 +- .../SRTActiveSurfaceContainer05.xml | 2 +- .../SRTActiveSurfaceContainer06.xml | 2 +- .../SRTActiveSurfaceContainer07.xml | 2 +- .../SRTActiveSurfaceContainer08.xml | 2 +- .../SRTKBandContainer/SRTKBandContainer.xml | 2 +- .../SRTLPBandContainer/SRTLPBandContainer.xml | 2 +- .../SardaraContainer/SardaraContainer.xml | 2 +- .../TotalPowerContainer.xml | 2 +- .../WeatherStationContainer.xml | 2 +- .../MACI/Containers/XContainer/XContainer.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 30 ++++++------ 368 files changed, 2526 insertions(+), 2537 deletions(-) mode change 100755 => 100644 Medicina/CDB/MACI/Managers/Manager/Manager.xml mode change 100755 => 100644 Medicina/Configuration/CDB/MACI/Managers/Manager/Manager.xml mode change 100755 => 100644 Noto/CDB/MACI/Managers/Manager/Manager.xml mode change 100755 => 100644 Noto/Configuration/CDB/MACI/Managers/Manager/Manager.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml mode change 100755 => 100644 SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml mode change 100755 => 100644 SRT/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml mode change 100755 => 100644 SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml mode change 100755 => 100644 SRT/CDB/MACI/Managers/Manager/Manager.xml mode change 100755 => 100644 SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml mode change 100755 => 100644 SRT/Configuration/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml mode change 100755 => 100644 SRT/Configuration/CDB/MACI/Managers/Manager/Manager.xml diff --git a/Medicina/CDB/MACI/Channels/AntennaData/AntennaData.xml b/Medicina/CDB/MACI/Channels/AntennaData/AntennaData.xml index 0ee6f43ed..9cf76bd9f 100644 --- a/Medicina/CDB/MACI/Channels/AntennaData/AntennaData.xml +++ b/Medicina/CDB/MACI/Channels/AntennaData/AntennaData.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" EventReliability="BestEffort" ConnectionReliability="Persistent"> - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/Medicina/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/Medicina/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/Medicina/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/Medicina/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/Medicina/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/Medicina/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/Medicina/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/Medicina/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - + + + + + + - - - - - - - - - + + + + + + + + + - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/Noto/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/Noto/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/Noto/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/Noto/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + + - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/Noto/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/Noto/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/Noto/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/Noto/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - + + + + + + + + - - - - - - - - - + + + + + + + + + - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/SRT/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml b/SRT/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml index c9009db74..0513e4bcd 100644 --- a/SRT/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml +++ b/SRT/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" EventReliability="BestEffort" ConnectionReliability="Persistent"> - <_ Name="DewarPositionerDataBlock" MaxProcessTime="2.0"/> + diff --git a/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index 0f8058b85..231c3bb71 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index 7260f7d3e..01579f7be 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index 6937a9051..e192f6bf0 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index 963662181..ead90682f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index b317e5d06..4bade23d1 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index ee27d4d13..f81bf8281 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index 1ae4ab0b0..d0cecd58c 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index a742622a9..3333f401a 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index cb8bd0ade..fea579d38 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index 37740f850..bb4af221b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index 205603fe6..d8e56106d 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index b29bcf2c4..52dc6c157 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD17" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index 9adbf9d1f..2157b0597 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index 7ba217caa..6d712909a 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index 1c42f2182..a9626036f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 92389d2cd..6b7e46ec9 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index 48aaf1136..9e45bab17 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index 5e6e623c9..9666dff3a 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index 06425df13..c43dfe99d 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index 14e57a5e8..5ede45ebd 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index 776542cf4..d8a2e8896 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index d4cf29704..095bc39a3 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index 02e5d119e..cae010a49 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 2f5e09424..87d0f3205 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index 288b0fd6a..cd8f2580f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index bc709f0c5..48388e3a2 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index 2e47e9073..db9c6666e 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index 4ed109368..582d5a928 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index c64a0524b..9d73c6621 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index 1d4405871..c5512f87b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index 15a329e31..845b6072a 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index 94365d8f5..94cf298cb 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index 5161a702f..acb51354c 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index 705d90784..0302f4250 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index cde31b60b..dcdcbf2dd 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index 44fde5506..66326fc50 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD17" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index 096493eb4..9686c34ba 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index 572162917..55aae257d 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index bb556cfc2..1862b31bb 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index aa536c4b8..0028e40ad 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index deef37e77..56a45c10f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index 5d69d4dac..dcd347f71 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index 3a255248c..351010da3 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index f802e5e65..0209db330 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index 35195f658..e0ebdaf01 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 3fa090a44..83101bb08 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 83524e4f6..4408f2d95 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml index d9eaa693b..d6b92595b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml index dfcdbcc9f..1969dc8f4 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml index ad6028567..32200ba2b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml index 48f8f1ef0..f03cb859e 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml index 334870a5f..f0a5e1655 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml index 8bf828c02..15dc033a9 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml index 6ec54c8c1..3cdbf85e4 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml index c98d7d378..6065d5ce9 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml index ed8b21612..aeaae849b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml index 1118cf9c5..9a58a14dd 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml index 3aaf68356..3d9545964 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml index dd6f4aeac..d50332639 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml index 62889e742..55396e1be 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD17" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml index 984100eb0..f1b5d74e8 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml index 7785f8241..0480687c6 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml index 9723fbc66..cfd67e74a 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml index 7e70eb5f8..63411a875 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml index d08dc05c3..ee100c060 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml index b9619e6d7..91347f499 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml index 72438d1e5..65d06e24f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml index fdc1cfa95..343b413e3 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml index d8a32d19b..ff59156e8 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml index 20db35716..655f6425c 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml index a14e8c156..67dcf4264 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml index 4bc222cba..4a6957b9c 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml index 56987df22..7d3fe67cf 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml index 4b008d6fd..abbded010 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml index f80384bff..a93071da4 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml index 1f5f3c90a..d0603a2c6 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml index de6fb168c..4d5d4491e 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml index 963c1cee2..11ec6a180 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml index 7d0e1471b..4b63d4e43 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml index 2d5619bc3..414e2feda 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml index ae7d06ee3..fb3b2067d 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml index 2d9c43406..314520a74 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml index b25d9c8b9..765e1a726 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml index cd6b6cf3a..1c162760b 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD17" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml index 5d69cfc16..ec5342599 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml index 43b9ca7fd..340b60fa7 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD16" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml index 955b55d70..912cc820f 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml index 03bff1c76..e13bb61fe 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml index f2e133a04..96089448e 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml index c998a31d4..2a3300a16 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml index b92f7f236..f689948b3 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml index 31a20f99e..319cd9f6c 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml index 1b560b647..6daa3f300 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml index 5f3f5a1fd..1573bc289 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml index 755676d41..a2c09e33e 100644 --- a/SRT/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml +++ b/SRT/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml b/SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml b/SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml b/SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml b/SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml b/SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml old mode 100755 new mode 100644 diff --git a/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml b/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml index 8b6e502bf..b6cba5510 100644 --- a/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml +++ b/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml @@ -13,7 +13,7 @@ Recovery="false"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - + - + - - - + centralizedLogger="Log" + minLogLevel="5" + minLogLevelLocal="5" + dispatchPacketSize="0" + immediateDispatchLevel="8" + flushPeriodSeconds="1" > + - diff --git a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml b/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml index 8b6e502bf..b6cba5510 100644 --- a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml +++ b/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml @@ -13,7 +13,7 @@ Recovery="false"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml index fd4f5a614..c2efb0e9b 100644 --- a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml +++ b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml @@ -11,7 +11,7 @@ ImplLang="cpp"> - + - + - + - + - + - + - + - + diff --git a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml b/SRT/CDB/MACI/Containers/XContainer/XContainer.xml index fdebffedc..d807ff223 100644 --- a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml +++ b/SRT/CDB/MACI/Containers/XContainer/XContainer.xml @@ -13,7 +13,7 @@ Recovery="false"> - + - + - - - - - - - - - - + + + + + + + + + + @@ -41,7 +41,7 @@ minLogLevelLocal="5" dispatchPacketSize="10" immediateDispatchLevel="8"> - + diff --git a/SRT/CDB/alma/AS/Boss/Boss.xml b/SRT/CDB/alma/AS/Boss/Boss.xml index c53eea829..d2fdada51 100644 --- a/SRT/CDB/alma/AS/Boss/Boss.xml +++ b/SRT/CDB/alma/AS/Boss/Boss.xml @@ -1,16 +1,12 @@ - + + - + \ No newline at end of file diff --git a/SRT/Configuration/CDB/MACI/Channels/AntennaData/AntennaData.xml b/SRT/Configuration/CDB/MACI/Channels/AntennaData/AntennaData.xml index 0ee6f43ed..9cf76bd9f 100644 --- a/SRT/Configuration/CDB/MACI/Channels/AntennaData/AntennaData.xml +++ b/SRT/Configuration/CDB/MACI/Channels/AntennaData/AntennaData.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" EventReliability="BestEffort" ConnectionReliability="Persistent"> - <_ Name="AntennaDataBlock" MaxProcessTime="2.0"/> + diff --git a/SRT/Configuration/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml b/SRT/Configuration/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml index c9009db74..0513e4bcd 100644 --- a/SRT/Configuration/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml +++ b/SRT/Configuration/CDB/MACI/Channels/DewarPositionerData/DewarPositionerData.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" EventReliability="BestEffort" ConnectionReliability="Persistent"> - <_ Name="DewarPositionerDataBlock" MaxProcessTime="2.0"/> + diff --git a/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index 3d9e717de..ea6e644ba 100644 --- a/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -3,17 +3,17 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <_ Name="*" + - <_ Name="*" + - <_ Name="*" + - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index 82f99db40..6391c8df3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index ba5ddb777..d439973c1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index 84caa1bfa..6d33e567d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index 650338981..57ea31e36 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index 57de25eb3..5cc781c38 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index 82ff950b4..5aac64ded 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index 011386a54..7d8f9feb3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index 43118cb25..fa91a50ea 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index 60351c5c7..b2310ec7f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index c0952684d..2aa9b8e1d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index d6a8424b4..2a9007dd5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index a20521ca5..caa700e97 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD17" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index 0c71d0ecf..16e89b6d9 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index 8324ddda5..b6d31e4cc 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index 214aba999..a9fdc2d88 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 4de96dc34..29abc97fc 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index 5e7d21604..f360b7e7a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index 6ac7b2ab8..999066c02 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index fd232a448..295606563 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index d2030bc62..26a03b430 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index 9ebe4cde0..09d1d964c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index 223d06038..e96617e9a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index ea4d0eee3..744444bd5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 6dfd82732..11e898b00 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index 9d0ed32d8..3def242bb 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index ae357d4b9..54a6ea0e4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index 5d70b0780..c22932d1a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index ac0effa59..5331ea2b7 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index 9cd492df4..12bcaf600 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index be254e6dc..a1370059f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index 41fbca03b..1f0e25636 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index 19137d61f..8699f989e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index 32905bf82..e3b8bf8f4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index 252d6e917..b55ec707c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index 0ce612780..f6689b087 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index 438930bfc..5d4fcb766 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD17" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index c9f760e3c..ce1b77284 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index cb936d990..5cf57b618 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index 1a6fabf02..12401d925 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index 4444e4836..96e61c5cc 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index af7b8e93d..cec53799d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index e9a97e904..1900df40d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index 2a7ac65ce..fd85efc77 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index e0410eeab..b637f43ad 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index d2fea9193..ea79c93a5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 8c48edc84..304c5334a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 1129fa37b..0a6229206 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml index 7b992a8bc..ef39cebf7 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml index 1ececed81..3bd9fe4ee 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml index 941c3e8a7..df8f0bb14 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml index 44fd202f7..b7702ace5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml index e94f743ed..e75901745 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml index a2190f6d5..7ed23e07f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml index e47703bf9..f2dde4d04 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml index c1436632d..131d98aac 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml index caa379a5c..3e1955bc1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml index 04fc3047f..ee372d3c1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml index 001ad0233..11749f479 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml index 2ba23b321..7ea89856d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml index 6ee5a5ed6..38a9b181a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD17" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml index e9c99530f..cf0a2ad42 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml index b5c964e83..d468eda2c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml index 2f8b5a9bf..d4189765d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml index 07db0cfe6..a67365828 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml index b276baab7..3ef5dd8c7 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml index b34718139..cdbcef502 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml index 7e8ba8edc..5d9abb89d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml index b30681a67..a41b056f7 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml index 4cb635c6f..0498a63c6 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml index 60533d14b..25efd6430 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml index 6457e0cf9..3791a78c6 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml index cb37f3a22..3b2ce1c76 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml index ea90e773f..d7ad9cbc3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml index d686339e6..0e50139fb 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml index 34ae7de8c..0ca0c44d1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml index ecb1b1672..ed705d2e5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml index d0ca118eb..6a1ba51df 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml index 86d6f98fa..5714b794a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml index 87bfb1b87..24f9c84f1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml index 401ebfe8c..ae84c1d81 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml index d836e476e..860a35c33 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml index 7ab1b8b44..36fb1d033 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml index 02cc96331..5c2b50f19 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml index de67f1103..020181fb5 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD17" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml index c02365ac2..801a3c8de 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml index b2a4b70a0..f7ebec3de 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD16" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml index 6cdaf6e8d..91e991e74 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml index 01b4138a8..b0169afd9 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml index 6db7a0f41..dfaa871f3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml index dc725c8ec..df6a67575 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml index d3dea0029..8d160570b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml index e61ac3152..a9d25aed4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml index 696dd9859..b07e1d1b4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml index 73fee34f8..899028eb8 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD01" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD02" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD03" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD04" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD05" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD06" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml index 8d7ced638..600054140 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - <_ Name="USD07" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD08" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD09" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD10" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD11" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD12" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD13" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD14" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> - <_ Name="USD15" Code="usdImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"/> + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml old mode 100755 new mode 100644 diff --git a/SRT/Configuration/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml b/SRT/Configuration/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml index 8b6e502bf..b6cba5510 100644 --- a/SRT/Configuration/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml +++ b/SRT/Configuration/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml @@ -13,7 +13,7 @@ Recovery="false"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - + + + + + + + + + + -- GitLab From c4f265d5c180d3857eeeb0a33a9c53674c972874 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 25 Jul 2022 12:51:57 +0200 Subject: [PATCH 003/150] Ported most Python 2 to Python 3 (#725) * Fix #720, ported most python to python 3 Compatibility with python 2 was retained by adding the `from __future__ import print_function` statement when needed. Changed `except Exception, ex:` to `except Exception as ex:` Changed some occurrencies of `raise Exception "message"` to `raise Exception("message")` There are many, many python scripts and I probably missed some of them. I guess I will fix them whenever an error pops up * Fix #720, found some other python files * Fix #720, fixed calibrationtoolclient indentation issues * Fix #720, fixed some issues with discosConsole interfaces * Fix #720, meteoClient updated It now uses the Qwt python wrapper found here https://github.com/GauiStori/PyQt-Qwt The code has been refactored in order to be properly organized and it has been updated in order to use Qwt 6 It seems to be working properly when used in conjunction with the simulators * Fix #720, updated meteoClient * Fix #720, updated CaltoolClient * Fix #720, fixed some Python 3 related errors --- Common/Clients/CaltoolClient/src/Makefile | 4 +- Common/Clients/CaltoolClient/src/_ctc.py | 666 +++++++------- .../CaltoolClient/src/customwidgets.py | 121 ++- .../src/_gui_customLoggingClient.py | 26 +- Common/Clients/MeteoClient/src/meteoClient.py | 827 ++++++++---------- .../SystemTerminal/src/_tui_SysTerm.py | 235 ++--- .../SystemTerminal/src/nuraghe_commands.py | 13 +- .../IRALibrary/src/IRAPy/__init__.py | 4 +- .../src/SimpleParserPy/__init__.py | 4 +- .../PyTesting/src/testing/simulator.py | 3 +- .../Misc/InjectCommand/src/injectCommand.py | 12 +- Common/Misc/KStars/src/startKS.py | 10 +- Common/Misc/OnOffSwitching/devices.py | 6 +- Common/Misc/OnOffSwitching/handler.py | 96 +- Common/Misc/OnOffSwitching/models.py | 6 +- Common/Misc/OnOffSwitching/onoff_switching.py | 5 +- .../OnOffSwitching/utils/test_tracking.py | 2 +- Common/Misc/PMUpdate/src/PMUpdate.py | 79 +- Common/Misc/PMUpdate/src/PMUpdate_main.py | 16 +- Common/Misc/PMUpdate/src/upgrade_module.py | 19 +- Common/Misc/PMUpdate/src/utility.py | 6 +- Common/Misc/Plotter/src/plotter.py | 111 +-- Common/Misc/Scripts/src/data_stats | 5 +- Common/Misc/Scripts/src/tabbify | 2 +- .../src/getTemplateForTests | 4 +- .../src/gettemplatefortests.py | 4 +- .../PyCalmux/src/Calmux/PyCalmuxImpl.py | 16 +- .../DewarPositioner/DewarPositionerImpl.py | 119 +-- .../src/DewarPositioner/cdbconf.py | 2 +- .../src/DewarPositioner/posgenerator.py | 12 +- .../src/DewarPositioner/positioner.py | 36 +- .../src/derotatorPosition.py | 3 +- .../src/LocalOscillatorImpl/CommandLine.py | 67 +- .../LocalOscillatorImpl/LocalOscillator.py | 9 +- .../src/LocalOscillatorImpl/devios.py | 10 +- .../src/AntennaBossSim/AntennaBossSimImpl.py | 2 +- .../src/ReceiverBoardSimImpl/board_server.py | 19 +- .../TCPGenericProtocolSimImpl/TCPServer.py | 19 +- Medicina/Misc/MedScripts/src/medsubr.py | 10 +- Medicina/Misc/MedScripts/src/setupccc.py | 14 +- Medicina/Misc/MedScripts/src/setupkkc.py | 14 +- .../CommandLine.py | 13 +- Noto/Misc/NotoScripts/src/peakf.py | 65 +- Noto/Misc/NotoScripts/src/subr.py | 63 +- Noto/Misc/NotoScripts/src/subrOff.py | 41 +- .../NotoPyIfDistributor/src/_ifdist.py | 3 +- .../NotoLocalOscillatorImpl/CommandLine.py | 21 +- SRT/Misc/SRTScripts/src/receiversmonitor.py | 11 +- 48 files changed, 1391 insertions(+), 1464 deletions(-) diff --git a/Common/Clients/CaltoolClient/src/Makefile b/Common/Clients/CaltoolClient/src/Makefile index 8ee218bce..a6d602bc0 100644 --- a/Common/Clients/CaltoolClient/src/Makefile +++ b/Common/Clients/CaltoolClient/src/Makefile @@ -210,7 +210,9 @@ install : install_all gui: pyuic4 calibrationToolClient.ui -o calibrationtool_ui.py - @sed -ie 's/Qwt5.QwtPlot/PlotProperty/g' calibrationtool_ui.py + @sed -ie 's/from qwt_plot import QwtPlot//g' calibrationtool_ui.py + + @sed -ie 's/QwtPlot/PlotProperty/g' calibrationtool_ui.py @sed -ie '9 i\from customwidgets import *' calibrationtool_ui.py diff --git a/Common/Clients/CaltoolClient/src/_ctc.py b/Common/Clients/CaltoolClient/src/_ctc.py index 94708793d..ca41edf75 100644 --- a/Common/Clients/CaltoolClient/src/_ctc.py +++ b/Common/Clients/CaltoolClient/src/_ctc.py @@ -1,27 +1,27 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- +from __future__ import print_function from Acspy.Clients.SimpleClient import PySimpleClient import Acspy.Common.Err import maciErrType import maciErrTypeImpl -import ClientErrorsImpl +import ClientErrorsImpl import ACSLog import ACS, ACS__POA # Import the Python CORBA stubs for BACI from PyQt4 import Qt from PyQt4.QtCore import pyqtSlot,QThread,QMutex,QTimer -import PyQt4.Qwt5 as Qwt +import PyQt4.Qwt as Qwt import sys,getopt,os from time import sleep -import math +import math from IRAPy import logger,userLogger -import calibrationtool_ui # file generated by pyuic4 but modified to include - #custom widgets. - +import calibrationtool_ui # file generated by pyuic4 but modified to include custom widgets. + __version__ = '$Id' @@ -32,348 +32,328 @@ __version__ = '$Id' DEFAULT_COMPONENT="MANAGEMENT/CalibrationTool" class MyWorker(QThread): - def __init__(self,component,parent=None): - self.Mutex =QMutex() - QThread.__init__(self,parent) - self.caltool=component[0] - self.scheduler=component[1] - self.boss =component[2] - self.simpleClient=component[3] - self.run=True; - self.scanAxis = self.caltool._get_scanAxis() - - self.arrayDataY=self.caltool._get_arrayDataY() - self.arrayDataX=self.caltool._get_arrayDataX() - self.dataX=self.caltool._get_dataX() - self.dataY=self.caltool._get_dataY() - # self.datax_tmp=[0 for i in len(self_data)] - self.datay_tmp=[] - self.datax_tmp=[] - self.projectname=self.caltool._get_projectName() - self.observer =self.caltool._get_observer() - self.filename =self.caltool._get_fileName() - self.deviceID =self.caltool._get_deviceID() - self.subscan =self.scheduler._get_subScanID() - self.scan =self.scheduler._get_scanID() - self.hpbw =self.caltool._get_hpbw() - self.amplitude =self.caltool._get_amplitude() - self.peakOffset =self.caltool._get_peakOffset() - self.slope =self.caltool._get_slope() - self.offset =self.caltool._get_offset() - self.name =self.boss._get_target() - self.device =self.caltool._get_deviceID() - self.oldscan=0L - self.newscan=0L - self.oldsubscan=0L - self.newsubscan=0L - self.oldrecordingstatus=False - self.newrecordingstatus=False - self.azimuthOffset=self.boss._get_azimuthOffset() - self.elevationOffset=self.boss._get_elevationOffset() - - - def run (self): - try: - -# arrayDataX=self.componenselft._get_arrayDataX() -# arrayDataY=self.component._get_arrayDataY() - while self.run: - (scanaxis,compl)=self.scanAxis.get_sync() - #self.scanAx - (arraydatax,compl)=self.arrayDataX.get_sync() - if 'SUBR' not in str(scanaxis): - arraydatax[:]=[x /math.pi*180. for x in arraydatax] - - - self.emit(Qt.SIGNAL("arrayDataX"),arraydatax) - (arraydatay,compl2)=self.arrayDataY.get_sync() - - self.emit(Qt.SIGNAL("arrayDataY"),arraydatay) - (datay,compl3)=self.dataY.get_sync() - (datax,compl3)=self.dataX.get_sync() - if 'SUBR' not in str(scanaxis): - - datax=datax/math.pi*180. - (projectname,compl4)=self.projectname.get_sync() - self.emit(Qt.SIGNAL("projectname"),projectname) - (observername,compl5)=self.observer.get_sync() - self.emit(Qt.SIGNAL("observer"),observername) - (filename,compl6)=self.filename.get_sync() - self.emit(Qt.SIGNAL("filename"),filename) - (subscanid,compl7)=self.subscan.get_sync() - self.emit(Qt.SIGNAL("subscan"),str(subscanid)) - (scanid,compl8)=self.scan.get_sync() - self.emit(Qt.SIGNAL("scan"),str(scanid)) - (hpbw,compl9)=self.hpbw.get_sync() - - if 'SUBR' not in str(scanaxis): - hpbw= hpbw/math.pi*180*60 - self.emit(Qt.SIGNAL("hpbw"),("%5.3f" % (hpbw))) - (amplitude,compl10)=self.amplitude.get_sync() - self.emit(Qt.SIGNAL("amplitude"),"%5.3f" % amplitude) - (peakOffset,compl11)=self.peakOffset.get_sync() - if 'SUBR' not in str(scanaxis): - peakOffset=peakOffset/math.pi*180 - - self.emit(Qt.SIGNAL("peakOffset"),"%5.3f" % (peakOffset)) - (slope,compl12)=self.slope.get_sync() - - self.emit(Qt.SIGNAL("slope"),"%5.3f" %slope) - (offset,compl13)=self.offset.get_sync() - self.emit(Qt.SIGNAL("offset"),"%5.3f" % offset) - (target,compl13)=self.name.get_sync() - self.emit(Qt.SIGNAL("target"),target) - (device,compl13)=self.device.get_sync() - self.emit(Qt.SIGNAL("device"),str(device)) - self.emit(Qt.SIGNAL("scanAxis"),scanaxis) - (azOffset,_)=self.azimuthOffset.get_sync() - (elOffset,_)=self.elevationOffset.get_sync() - - self.emit(Qt.SIGNAL("azoffset"),str(azOffset/math.pi*180)) - self.emit(Qt.SIGNAL("eloffset"),str(elOffset/math.pi*180)) - - - rec= self.caltool.isRecording() - if rec==True: - self.datay_tmp.append(datay) - self.datax_tmp.append(datax) - self.emit(Qt.SIGNAL("DataY"),self.datay_tmp) - self.emit(Qt.SIGNAL("DataX"),self.datax_tmp) - - self.emit(Qt.SIGNAL("isRecording"),rec) - self.emit(Qt.SIGNAL("scanAxis"),scanaxis) - - # print rec -# if (subscanid!=self.oldsubscan and scanid !=self.oldscanid): -# print "scan changed",self.oldsubscan,subscanid -# self.oldsubscan=subscanid -# self.subscan=subscanid -# self.datax_tmp=[] -# self.datay_tmp=[] - - - if (rec!=self.oldrecordingstatus): - self.oldrecordingstatus=rec - self.datax_tmp=[] - self.datay_tmp=[] - - - - QThread.msleep(200) - print "Exited from thread" - - except Exception,ex: - newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) - newEx.setPropertyName("") - #ACS_LOG_ERROR - newEx.log(self.simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) - - self.run=False - - def __del__(self): + def __init__(self,component,parent=None): + self.Mutex =QMutex() + QThread.__init__(self,parent) + self.caltool=component[0] + self.scheduler=component[1] + self.boss =component[2] + self.simpleClient=component[3] + self.run=True; + self.scanAxis = self.caltool._get_scanAxis() + + self.arrayDataY=self.caltool._get_arrayDataY() + self.arrayDataX=self.caltool._get_arrayDataX() + self.dataX=self.caltool._get_dataX() + self.dataY=self.caltool._get_dataY() + #self.datax_tmp=[0 for i in len(self_data)] + self.datay_tmp=[] + self.datax_tmp=[] + self.projectname=self.caltool._get_projectName() + self.observer =self.caltool._get_observer() + self.filename =self.caltool._get_fileName() + self.deviceID =self.caltool._get_deviceID() + self.subscan =self.scheduler._get_subScanID() + self.scan =self.scheduler._get_scanID() + self.hpbw =self.caltool._get_hpbw() + self.amplitude =self.caltool._get_amplitude() + self.peakOffset =self.caltool._get_peakOffset() + self.slope =self.caltool._get_slope() + self.offset =self.caltool._get_offset() + self.name =self.boss._get_target() + self.device =self.caltool._get_deviceID() + self.oldscan=0 + self.newscan=0 + self.oldsubscan=0 + self.newsubscan=0 + self.oldrecordingstatus=False + self.newrecordingstatus=False + self.azimuthOffset=self.boss._get_azimuthOffset() + self.elevationOffset=self.boss._get_elevationOffset() + + + def run (self): + try: + #arrayDataX=self.componenselft._get_arrayDataX() + #arrayDataY=self.component._get_arrayDataY() + while self.run: + (scanaxis,compl)=self.scanAxis.get_sync() + #self.scanAx + (arraydatax,compl)=self.arrayDataX.get_sync() + if 'SUBR' not in str(scanaxis): + arraydatax[:]=[x /math.pi*180. for x in arraydatax] + self.emit(Qt.SIGNAL("arrayDataX"),arraydatax) + (arraydatay,compl2)=self.arrayDataY.get_sync() + self.emit(Qt.SIGNAL("arrayDataY"),arraydatay) + (datay,compl3)=self.dataY.get_sync() + (datax,compl3)=self.dataX.get_sync() + if 'SUBR' not in str(scanaxis): + datax=datax/math.pi*180. + (projectname,compl4)=self.projectname.get_sync() + self.emit(Qt.SIGNAL("projectname"),projectname) + (observername,compl5)=self.observer.get_sync() + self.emit(Qt.SIGNAL("observer"),observername) + (filename,compl6)=self.filename.get_sync() + self.emit(Qt.SIGNAL("filename"),filename) + (subscanid,compl7)=self.subscan.get_sync() + self.emit(Qt.SIGNAL("subscan"),str(subscanid)) + (scanid,compl8)=self.scan.get_sync() + self.emit(Qt.SIGNAL("scan"),str(scanid)) + (hpbw,compl9)=self.hpbw.get_sync() + if 'SUBR' not in str(scanaxis): + hpbw= hpbw/math.pi*180*60 + self.emit(Qt.SIGNAL("hpbw"),("%5.3f" % (hpbw))) + (amplitude,compl10)=self.amplitude.get_sync() + self.emit(Qt.SIGNAL("amplitude"),"%5.3f" % amplitude) + (peakOffset,compl11)=self.peakOffset.get_sync() + if 'SUBR' not in str(scanaxis): + peakOffset=peakOffset/math.pi*180 + self.emit(Qt.SIGNAL("peakOffset"),"%5.3f" % (peakOffset)) + (slope,compl12)=self.slope.get_sync() + self.emit(Qt.SIGNAL("slope"),"%5.3f" %slope) + (offset,compl13)=self.offset.get_sync() + self.emit(Qt.SIGNAL("offset"),"%5.3f" % offset) + (target,compl13)=self.name.get_sync() + self.emit(Qt.SIGNAL("target"),target) + (device,compl13)=self.device.get_sync() + self.emit(Qt.SIGNAL("device"),str(device)) + self.emit(Qt.SIGNAL("scanAxis"),scanaxis) + (azOffset,_)=self.azimuthOffset.get_sync() + (elOffset,_)=self.elevationOffset.get_sync() + self.emit(Qt.SIGNAL("azoffset"),str(azOffset/math.pi*180)) + self.emit(Qt.SIGNAL("eloffset"),str(elOffset/math.pi*180)) + + rec= self.caltool.isRecording() + if rec==True: + self.datay_tmp.append(datay) + self.datax_tmp.append(datax) + self.emit(Qt.SIGNAL("DataY"),self.datay_tmp) + self.emit(Qt.SIGNAL("DataX"),self.datax_tmp) + + self.emit(Qt.SIGNAL("isRecording"),rec) + self.emit(Qt.SIGNAL("scanAxis"),scanaxis) + + #print(rec) + #if (subscanid!=self.oldsubscan and scanid !=self.oldscanid): + #print("scan changed",self.oldsubscan,subscanid) + #self.oldsubscan=subscanid + #self.subscan=subscanid + #self.datax_tmp=[] + #self.datay_tmp=[] + + if (rec!=self.oldrecordingstatus): + self.oldrecordingstatus=rec + self.datax_tmp=[] + self.datay_tmp=[] + QThread.msleep(200) - pass - + print("Exited from thread") + + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) + newEx.setPropertyName("") + #ACS_LOG_ERROR + newEx.log(self.simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + self.run=False + + def __del__(self): + QThread.msleep(200) + class Application(Qt.QDialog,calibrationtool_ui.Ui_CalibrationToolDialog): - - def __init__(self,compname,parent=None): - - self.scheduler=None - self.antennaBoss=None - self.component=None - self.componentName=DEFAULT_COMPONENT - self.managerConnected=False - self.thread=None - - try: - self.simpleClient = PySimpleClient() - self.managerConnected=True - except Exception,ex: - newEx = ClientErrorsImpl.CouldntLogManagerExImpl(exception=ex, create=1) - logger.logException(newEx) - print "Please check the system is up and running......" - sys.exit(-1) - - try: - self.scheduler= self.simpleClient.getDefaultComponent("IDL:alma/Management/Scheduler:1.0") - except Exception,ex: - newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) - newEx.setComponentName("IDL:alma/Management/Scheduler:1.0") - logger.logException(newEx) - print "Please check the system is up and running and scheduler component is alive!" - sys.exit(-1) - - try: - self.antennaBoss =self.simpleClient.getDefaultComponent("IDL:alma/Antenna/AntennaBoss:1.0") - except Exception,ex: - newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) - newEx.setComponentName("IDL:alma/Antenna/AntennaBoss:1.0") - logger.logException(newEx) - print "Please check the system is up and running and antenna boss is alive!" - sys.exit(-1) - - #choose default recorder - if compname=='default': - try: - recorder=self.scheduler._get_currentRecorder() - (recordername,compl)=recorder.get_sync() - except Exception,ex: - newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) - logger.logException(newEx) - print "Please check scheduler component is alive and responsive|" - sys.exit(-1) - - print "Starting with default component: " + DEFAULT_COMPONENT - if recordername!=DEFAULT_COMPONENT: - print "Be aware that the in-use recorder is currently " + recordername - - self.componentName=DEFAULT_COMPONENT - - else: - self.componentName=compname - print "Starting with component: " + self.componentName - - try: - self.component= self.simpleClient.getComponent(self.componentName) - except Exception,ex: - newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) - newEx.setComponentName(self.componentName) - logger.logException(newEx) - print "Please check the system is up and running and " + self.componentName + " is alive!" - sys.exit(-1) - - self.thread=MyWorker([self.component,self.scheduler,self.antennaBoss,self.simpleClient]) - Qt.QDialog.__init__(self) - self.setupUi(self) -# self.qwtPlot_datax.setAxisScale(Qwt.QwtPlot.xBottom, 0,1000) - self.qwtPlot_datax.setAxisAutoScale(Qwt.QwtPlot. yLeft) - self.setWindowTitle(self.componentName) - self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") - self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") - - self.connect(self.thread,Qt.SIGNAL("arrayDataX"),self.qwtPlot_datay.setX) - self.connect(self.thread,Qt.SIGNAL("arrayDataY"),self.qwtPlot_datay.setVal) - - self.connect(self.thread,Qt.SIGNAL("DataX"),self.qwtPlot_datax.setX) - self.connect(self.thread,Qt.SIGNAL("DataY"),self.qwtPlot_datax.setVal) - - self.connect(self.thread,Qt.SIGNAL("projectname"),self.plainTextEdit_project.setPlainText) - self.connect(self.thread,Qt.SIGNAL("observer"),self.plainTextEdit_observer.setPlainText) - self.connect(self.thread,Qt.SIGNAL("filename"),self.plainTextEdit_filename.setPlainText) - self.connect(self.thread,Qt.SIGNAL("subscan"),self.subscanIdLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("scan"),self.scanIdLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("hpbw"),self.hpbwLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("amplitude"),self.amplitudeLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("peakOffset"),self.peakoffsetLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("slope"),self.slopeLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("offset"),self.offsetLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("target"),self.nameLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("device"),self.deviceIdLineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("isRecording"),self.isRecording) - self.connect(self.thread,Qt.SIGNAL("scanAxis"),self.scanAxis) - self.connect(self.thread,Qt.SIGNAL("eloffset"),self.elOffsetlineEdit.setText) - self.connect(self.thread,Qt.SIGNAL("azoffset"),self.azOffsetlineEdit.setText) - - - - - - - @pyqtSlot(Qt.QObject,name="isRecording") - def isRecording(self,rec): - if rec==False: - self.recording.setText("OFF") - palette = self.recording.palette() - role = self.recording.backgroundRole() - palette.setColor(role, Qt.QColor('gray')) - self.recording.setPalette(palette) - self.BScanaxis.setEnabled(False) - if rec==True: - self.recording.setText("ON") - palette = self.recording.palette() - role = self.recording.backgroundRole() - palette.setColor(role, Qt.QColor('green')) - self.recording.setPalette(palette) - self.BScanaxis.setEnabled(True) - - @pyqtSlot(Qt.QObject,name="scanAxis") # decorator for the slot - def scanAxis(self,scanaxis): - self.BScanaxis.setText(str(scanaxis)) - if 'SUBR' not in str(scanaxis): - self.scanAxisLabel.setText('ScanAxis - Pointing') - xaxis_text="Direction (Deg)" - hpbw_label_text='HPBW(arcmim)' - peakOffsetLabel_text='PeakOffset(deg)' - else: - self.scanAxisLabel.setText('ScanAxis - Focus') - xaxis_text="Distance (mm)" - hpbw_label_text='HPBW(mm)' - peakOffsetLabel_text='PeakOffset(mm)' - self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) - self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) - self.hpbw_label.setText(hpbw_label_text) - self.peakOffsetLabel.setText(peakOffsetLabel_text) - - @pyqtSlot(Qt.QObject,name="scalePlots") # decorator for the slot - def scalePlots(self,val): - self.qwtPlot_datay.setAxisScale(QwtPlot.xBottom, min(val), max(val)) - - def run(self): - self.thread.start() - - def __del__(self): - #__del__ apparently is called twice, I have no clue and it should be investigated - if self.thread: - if self.thread.isRunning: - self.thread.quit() - - if self.managerConnected: - try: - if self.component: - self.simpleClient.releaseComponent(self.component._get_name()) - if self.scheduler: - self.simpleClient.releaseComponent(self.scheduler._get_name()) - if self.antennaBoss: - self.simpleClient.releaseComponent(self.antennaBoss._get_name()) - except Exception,ex: - print "Error in application cleanup" - - + + def __init__(self,compname,parent=None): + + self.scheduler=None + self.antennaBoss=None + self.component=None + self.componentName=DEFAULT_COMPONENT + self.managerConnected=False + self.thread=None + + try: + self.simpleClient = PySimpleClient() + self.managerConnected=True + except Exception as ex: + newEx = ClientErrorsImpl.CouldntLogManagerExImpl(exception=ex, create=1) + logger.logException(newEx) + print("Please check the system is up and running......") + sys.exit(-1) + + try: + self.scheduler= self.simpleClient.getDefaultComponent("IDL:alma/Management/Scheduler:1.0") + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName("IDL:alma/Management/Scheduler:1.0") + logger.logException(newEx) + print("Please check the system is up and running and scheduler component is alive!") + sys.exit(-1) + + try: + self.antennaBoss =self.simpleClient.getDefaultComponent("IDL:alma/Antenna/AntennaBoss:1.0") + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName("IDL:alma/Antenna/AntennaBoss:1.0") + logger.logException(newEx) + print("Please check the system is up and running and antenna boss is alive!") + sys.exit(-1) + + #choose default recorder + if compname=='default': + try: + recorder=self.scheduler._get_currentRecorder() + (recordername,compl)=recorder.get_sync() + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) + logger.logException(newEx) + print("Please check scheduler component is alive and responsive|") + sys.exit(-1) + + print("Starting with default component: " + DEFAULT_COMPONENT) + if recordername!=DEFAULT_COMPONENT: + print("Be aware that the in-use recorder is currently " + recordername) + + self.componentName=DEFAULT_COMPONENT + + else: + self.componentName=compname + print("Starting with component: " + self.componentName) + + try: + self.component= self.simpleClient.getComponent(self.componentName) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName(self.componentName) + logger.logException(newEx) + print("Please check the system is up and running and " + self.componentName + " is alive!") + sys.exit(-1) + + self.thread=MyWorker([self.component,self.scheduler,self.antennaBoss,self.simpleClient]) + Qt.QDialog.__init__(self) + self.setupUi(self) + #self.qwtPlot_datax.setAxisScale(Qwt.QwtPlot.xBottom, 0,1000) + self.qwtPlot_datax.setAxisAutoScale(Qwt.QwtPlot. yLeft) + self.setWindowTitle(self.componentName) + self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") + self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") + + self.connect(self.thread,Qt.SIGNAL("arrayDataX"),self.qwtPlot_datay.setX) + self.connect(self.thread,Qt.SIGNAL("arrayDataY"),self.qwtPlot_datay.setVal) + + self.connect(self.thread,Qt.SIGNAL("DataX"),self.qwtPlot_datax.setX) + self.connect(self.thread,Qt.SIGNAL("DataY"),self.qwtPlot_datax.setVal) + + self.connect(self.thread,Qt.SIGNAL("projectname"),self.plainTextEdit_project.setPlainText) + self.connect(self.thread,Qt.SIGNAL("observer"),self.plainTextEdit_observer.setPlainText) + self.connect(self.thread,Qt.SIGNAL("filename"),self.plainTextEdit_filename.setPlainText) + self.connect(self.thread,Qt.SIGNAL("subscan"),self.subscanIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("scan"),self.scanIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("hpbw"),self.hpbwLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("amplitude"),self.amplitudeLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("peakOffset"),self.peakoffsetLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("slope"),self.slopeLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("offset"),self.offsetLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("target"),self.nameLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("device"),self.deviceIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("isRecording"),self.isRecording) + self.connect(self.thread,Qt.SIGNAL("scanAxis"),self.scanAxis) + self.connect(self.thread,Qt.SIGNAL("eloffset"),self.elOffsetlineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("azoffset"),self.azOffsetlineEdit.setText) + + @pyqtSlot(Qt.QObject,name="isRecording") + def isRecording(self,rec): + if rec==False: + self.recording.setText("OFF") + palette = self.recording.palette() + role = self.recording.backgroundRole() + palette.setColor(role, Qt.QColor('gray')) + self.recording.setPalette(palette) + self.BScanaxis.setEnabled(False) + if rec==True: + self.recording.setText("ON") + palette = self.recording.palette() + role = self.recording.backgroundRole() + palette.setColor(role, Qt.QColor('green')) + self.recording.setPalette(palette) + self.BScanaxis.setEnabled(True) + + @pyqtSlot(Qt.QObject,name="scanAxis") # decorator for the slot + def scanAxis(self,scanaxis): + self.BScanaxis.setText(str(scanaxis)) + if 'SUBR' not in str(scanaxis): + self.scanAxisLabel.setText('ScanAxis - Pointing') + xaxis_text="Direction (Deg)" + hpbw_label_text='HPBW(arcmim)' + peakOffsetLabel_text='PeakOffset(deg)' + else: + self.scanAxisLabel.setText('ScanAxis - Focus') + xaxis_text="Distance (mm)" + hpbw_label_text='HPBW(mm)' + peakOffsetLabel_text='PeakOffset(mm)' + self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) + self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) + self.hpbw_label.setText(hpbw_label_text) + self.peakOffsetLabel.setText(peakOffsetLabel_text) + + @pyqtSlot(Qt.QObject,name="scalePlots") # decorator for the slot + def scalePlots(self,val): + self.qwtPlot_datay.setAxisScale(QwtPlot.xBottom, min(val), max(val)) + + def run(self): + self.thread.start() + + def __del__(self): + #__del__ apparently is called twice, I have no clue and it should be investigated + if self.thread: + if self.thread.isRunning: + self.thread.quit() + + if self.managerConnected: + try: + if self.component: + self.simpleClient.releaseComponent(self.component._get_name()) + if self.scheduler: + self.simpleClient.releaseComponent(self.scheduler._get_name()) + if self.antennaBoss: + self.simpleClient.releaseComponent(self.antennaBoss._get_name()) + except Exception as ex: + print("Error in application cleanup") + + def usage(): - print "calibrationtoolclient [component name]" - print - print "If no component name is provided, the default MANAGEMENT/CalibrationTool will be used" + print("calibrationtoolclient [component name]") + print() + print("If no component name is provided, the default MANAGEMENT/CalibrationTool will be used") def main(args): - sys.tracebacklimit=0 - - try: - opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) - except getopt.GetoptError, err: - print str(err) - usage() - sys.exit(1) - - for o,a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() - - if len(args)==0: - componentname='MANAGEMENT/CalibrationTool' - else: - componentname=args[0] - - app = Qt.QApplication(args) - a=Application(componentname) #passa il nome del component al costruttore - sleep(1) - a.run() - p=a.show() - sys.exit(app.exec_()) - sleep(2) - print "Application closed!" - + sys.tracebacklimit=0 + + try: + opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) + except getopt.GetoptError as err: + print(str(err)) + usage() + sys.exit(1) + + for o,a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + + if len(args)==0: + componentname='MANAGEMENT/CalibrationTool' + else: + componentname=args[0] + + app = Qt.QApplication(args) + a=Application(componentname) #passa il nome del component al costruttore + sleep(1) + a.run() + p=a.show() + sys.exit(app.exec_()) + sleep(2) + print("Application closed!") + if __name__=='__main__': - main(sys.argv) + main(sys.argv) diff --git a/Common/Clients/CaltoolClient/src/customwidgets.py b/Common/Clients/CaltoolClient/src/customwidgets.py index 8eeb8e3af..b5858e95d 100644 --- a/Common/Clients/CaltoolClient/src/customwidgets.py +++ b/Common/Clients/CaltoolClient/src/customwidgets.py @@ -1,80 +1,77 @@ +from __future__ import print_function from PyQt4 import Qt from PyQt4.QtCore import pyqtSlot,QThread -import PyQt4.Qwt5 as Qwt +import PyQt4.Qwt as Qwt ''' Custom widgets classes. - - The file generated by the compilation of the .ui file with pyuic4 - must be changed. - For example, in the calibrationtool_ui.py the self.qwtPlot_datax widget + + The file generated by the compilation of the .ui file with pyuic4 + must be changed. + For example, in the calibrationtool_ui.py the self.qwtPlot_datax widget must inherit from PlotProperty class instead of its parent QwtPlot. The output of compilation of the .ui file thus must be changed accordingly. - - ''' - - +''' class PlotProperty(Qwt.QwtPlot): - - def __init__(self,parent,*args): - Qwt.QwtPlot.__init__(self,parent,*args) + def __init__(self,parent,*args): + Qwt.QwtPlot.__init__(self,parent,*args) #self.paint=Qt.QPainter(self) # you must initialize the superclass - self.timeData= [i for i in range (1000)] - self.y=[] - self.curve=Qwt.QwtPlotCurve('aaaa') - self.curve.attach(self) - p = Qt.QPalette() # + self.timeData= [i for i in range (1000)] + self.y=[] + self.curve=Qwt.QwtPlotCurve('aaaa') + self.curve.attach(self) + p = Qt.QPalette() p.setColor(self.backgroundRole(), Qt.QColor(30, 30, 50)) self.setPalette(p) - self.curve.setPen(Qt.QPen(Qt.Qt.red)) - - - + self.curve.setPen(Qt.QPen(Qt.Qt.red)) + #void Widget::drawCanvas(QPainter* p) #{ # QwtPlot::drawCanvas( p ); // <<--- # QStaticText txt("number"); # p->drawStaticText ( 0, 0, txt); -#} - - def suspend(self): - pass - @pyqtSlot(Qt.QObject,name="setval") # decorator for the slot - # Qt.Object is necessary for lists - # and dictionarys - def setVal(self,val): - value_decimated=[0 for i in range (len(val))] - - step=len(val)/1000. - if step<1: - step=1 #step 0 not allowed - for i in range(0,min(len(val),1000)): - value_decimated[int(i)] =val[int(i*step-1)] -# self.curve.setData(self.timeData,value_decimated) - self.curve.setData(self.timeData,val) - self.replot() - @pyqtSlot(Qt.QObject,name="setX") # decorator for the slot - - def setX(self,val): - self.timeData=[i for i in val] - def setDataY(self,val): - value_decimated=[0 for i in range (1000)] - - step=len(val)/1000. - if step<1: - step=1 #step 0 not allowed - for i in range(0,min(len(val),1000)): - value_decimated[int(i)] =val[int(i*step)-1] -# self.curve.setData(self.timeData,value_decimated) - self.curve.setData(self.timeData,val) - - self.replot() - def setDataX(self,val): - pass - def setCurveColor(self,val): - pass - def __del__(self): -# self.actMonwspeed.destroy() - print "The end __oOo__" +#} + + def suspend(self): + pass + + @pyqtSlot(Qt.QObject,name="setval") # decorator for the slot, Qt.Object is necessary for lists and dictionarys + def setVal(self,val): + value_decimated=[0 for i in range (len(val))] + + step=len(val)/1000. + if step<1: + step=1 #step 0 not allowed + for i in range(0,min(len(val),1000)): + value_decimated[int(i)] =val[int(i*step-1)] + #self.curve.setSamples(self.timeData, value_decimated) + self.curve.setSamples(self.timeData, val) + self.replot() + + @pyqtSlot(Qt.QObject,name="setX") # decorator for the slot + def setX(self,val): + self.timeData=[i for i in val] + + def setDataY(self,val): + value_decimated=[0 for i in range (1000)] + + step=len(val)/1000. + if step<1: + step=1 #step 0 not allowed + for i in range(0,min(len(val),1000)): + value_decimated[int(i)] =val[int(i*step)-1] + #self.curve.setSamples(self.timeData, value_decimated) + self.curve.setSamples(self.timeData, val) + self.replot() + + def setDataX(self,val): + pass + + def setCurveColor(self,val): + pass + + def __del__(self): + #self.actMonwspeed.destroy() + print("The end __oOo__") diff --git a/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py b/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py index 3aaa1a4ff..468b9bb8b 100755 --- a/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py +++ b/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function """ CustomLoggingClient implements a Tkinter interface that monitors in realtime the ACS custom logging events generated runtime. @@ -13,7 +14,10 @@ import sys import logging import bisect import functools -import Tkinter as tk +try: + import Tkinter as tk +except: + import tkinter as tk from IRAPy.bsqueue import BoundedSortedQueue #DEFINE LOGGING RECORDS TOTAL ORDERING RULES @@ -56,11 +60,11 @@ class App: self.yscrollbar.config(command=self.list_box.yview) def handler(self, event): - """ - Handle a log_event adding it to a BoundedSortedQueue in memory and to the - corresponding GUI representation (in Tkinter this sould be a Listbox). - @param event: the logging event. - """ + """ + Handle a log_event adding it to a BoundedSortedQueue in memory and to the + corresponding GUI representation (in Tkinter this sould be a Listbox). + @param event: the logging event. + """ index, popped = self.record_list.push(event) if popped: self.list_box.delete(0) @@ -83,22 +87,22 @@ if __name__ == '__main__': consumer = Consumer(Management.CUSTOM_LOGGING_CHANNEL_NAME) consumer.addSubscription(Management.CustomLoggingData, app.handler) consumer.consumerReady() - except Exception, ex: - print "exception caught: ", ex #TODO: throw excep + except Exception as ex: + print("exception caught: ", ex) #TODO: throw excep logger.logError(ex.message) #try: def handle_signal(num, trace): #trace.f_locals['app'].clear() #trace.f_locals['consumer'].disconnect() - print "Exiting" + print("Exiting") sys.exit(0) signal.signal(signal.SIGINT, handle_signal) signal.signal(signal.SIGUSR1, handle_signal) root.mainloop() - #except KeyboardInterrupt, ki: + #except KeyboardInterrupt as ki: # pass #finally: # consumer.disconnect() - # print "Exiting" + # print("Exiting") diff --git a/Common/Clients/MeteoClient/src/meteoClient.py b/Common/Clients/MeteoClient/src/meteoClient.py index f751a14a3..aa0d86ff1 100644 --- a/Common/Clients/MeteoClient/src/meteoClient.py +++ b/Common/Clients/MeteoClient/src/meteoClient.py @@ -1,16 +1,13 @@ #! /usr/bin/env python - -# to do: emit from - +from __future__ import print_function from Acspy.Clients.SimpleClient import PySimpleClient # Import the acspy.PySimpleClient class import ACS, ACS__POA # Import the Python CORBA stubs for BACI -from omniORB.CORBA import TRUE, FALSE +from omniORB.CORBA import TRUE, FALSE from time import sleep import time from PyQt4 import Qt, QtCore, QtGui -import PyQt4.Qwt5 as Qwt -from PyQt4.Qwt5.anynumpy import * +import PyQt4.Qwt as Qwt import sys import ACSErrTypeCommonImpl @@ -19,496 +16,436 @@ import ACSErrTypeOKImpl import ClientErrorsImpl from IRAPy import logger from Acspy.Common.Err import ACSError -from Acspy.Common.Log import acsPrintExcDebug -from numpy import concatenate,zeros -from Acspy.Common.TimeHelper import getTimeStamp,TimeUtil +from Acspy.Common.Log import acsPrintExcDebug +from numpy import concatenate, zeros, arange +from Acspy.Common.TimeHelper import getTimeStamp, TimeUtil + def enumList(enum, sentinel): - ''' - ''' - return [enum(i) for i in range(sentinel)] + return [enum(i) for i in range(sentinel)] + colorGroupList = enumList( - Qt.QPalette.ColorGroup, Qt.QPalette.NColorGroups) + Qt.QPalette.ColorGroup, Qt.QPalette.NColorGroups) colorRoleList = enumList( - Qt.QPalette.ColorRole, Qt.QPalette.NColorRoles) + Qt.QPalette.ColorRole, Qt.QPalette.NColorRoles) handList = enumList( - Qwt.QwtAnalogClock.Hand, Qwt.QwtAnalogClock.NHands) + Qwt.QwtAnalogClock.Hand, Qwt.QwtAnalogClock.NHands) +BUFFER = 3600 # number of points for plot -BUFFER = 3600 # number of points for plot - -TIMESTEP=5 # seconds -HISTORY=500 # - +TIMESTEP = 5 # seconds +HISTORY = 500 class PropertyMonitor(ACS__POA.CBdouble,Qt.QObject): - #------------------------------------------------------------------------------ - ''' - This class defines the method(s) that will be invoked asynchronously by the - mount device for any monitors we may create. - ''' - #------------------------------------------------------------------------------ - def __init__ (self,widget, propName = None,*args): - ''' - If the propertys name is specified, it is printed to STDOUT later on. - ''' - if propName != None: - self.propName = propName - else: - self.propName = "NoName" - Qt.QObject.__init__(self) # - - - self.widget = widget -# Qwt.QwtPlot.__init__(self)) - - - #------------------------------------------------------------------------------ - def __del__(self): - ''' - Do nothing - ''' - #------------------------------------------------------------------------------ - def working (self, value, completion, desc): - ''' - Really this is the method that does all the work and the developer should - be concerned with. - Parameters: value = the double we are interested in - completion = completion structure - desc = callback struct description - ''' - #self.count = self.count + 1 - #if self.count <= 5: - try: -# print "Working: ", str(self.propName), " is ", str(value) - # self.widget.setVal(float(str(value))) - value=float(str(value)) - self.emit(Qt.SIGNAL("PropertyChanghed(float)"),value) - - except: - acsPrintExcDebug() - print "exception" - displayMessageEx = ACSErrTypeCommonImpl.GenericErrorExImpl() - displayMessageEx.setErrorDesc("badMethod has thrown an UNEXPECTED exception") - displayMessageEx.log() - - - #------------------------------------------------------------------------------ - def done (self, value, completion, desc): - ''' - Invoked asynchronously when the DO has finished. Normally this is invoked - just before a monitor is destroyed. - Parameters: value = the final value of the double we are interested in - completion = completion structure - desc = callback struct description - ''' - print "Done: ", str(self.propName), " is ", str(value) -# self.widget.setValue(float(value)) - - #------------------------------------------------------------------------------ - def negotiate (self, time_to_transmit, desc): - ''' - For simplicitys sake, we always return true. If you want more detailed, - information on this method, please see the BACI specs. - Parameters: See the BACI specs. - ''' - return TRUE -#------------------------------------------------------------------------------ + #------------------------------------------------------------------------------ + ''' + This class defines the method(s) that will be invoked asynchronously by the + mount device for any monitors we may create. + ''' + def __init__ (self, widget, propName = None, *args): + ''' + If the propertys name is specified, it is printed to STDOUT later on. + ''' + if propName != None: + self.propName = propName + else: + self.propName = "NoName" + Qt.QObject.__init__(self) + + self.widget = widget + #Qwt.QwtPlot.__init__(self)) + + def __del__(self): + ''' + Do nothing + ''' + pass + + def working (self, value, completion, desc): + ''' + Really this is the method that does all the work and the developer should + be concerned with. + Parameters: value = the double we are interested in + completion = completion structure + desc = callback struct description + ''' + #self.count = self.count + 1 + #if self.count <= 5: + try: + #print("Working: ", str(self.propName), " is ", str(value)) + #self.widget.setVal(float(str(value))) + value = float(str(value)) + self.emit(Qt.SIGNAL("PropertyChanghed(float)"), value) + + except: + acsPrintExcDebug() + print("exception") + displayMessageEx = ACSErrTypeCommonImpl.GenericErrorExImpl() + displayMessageEx.setErrorDesc("badMethod has thrown an UNEXPECTED exception") + displayMessageEx.log() + + def done (self, value, completion, desc): + ''' + Invoked asynchronously when the DO has finished. Normally this is invoked + just before a monitor is destroyed. + Parameters: value = the final value of the double we are interested in + completion = completion structure + desc = callback struct description + ''' + print("Done: ", str(self.propName), " is ", str(value)) + #self.widget.setValue(float(value)) + + def negotiate (self, time_to_transmit, desc): + ''' + For simplicitys sake, we always return true. If you want more detailed, + information on this method, please see the BACI specs. + Parameters: See the BACI specs. + ''' + return TRUE + class SpeedoMeter(Qwt.QwtDial): - def __init__(self,parent=None): - Qwt.QwtDial.__init__(self, parent) - self.__label = 'km/h' - self.setWrapping(False) - self.setReadOnly(True) + def __init__(self, limit, parent=None): + Qwt.QwtDial.__init__(self, parent) + self.limit = limit + self.__label = 'km/h' + self.setWrapping(False) + self.setReadOnly(True) - self.setOrigin(135.0) - self.setScaleArc(0.0, 270.0) + self.setOrigin(135.0) + self.setScaleArc(0.0, 270.0) - self.setNeedle(Qwt.QwtDialSimpleNeedle(Qwt.QwtDialSimpleNeedle.Arrow,True,Qt.QColor(Qt.Qt.blue),Qt.QColor(Qt.Qt.gray).light(130))) + self.setNeedle(Qwt.QwtDialSimpleNeedle(Qwt.QwtDialSimpleNeedle.Arrow, True, Qt.QColor(Qt.Qt.blue), Qt.QColor(Qt.Qt.gray).light(130))) - self.setScaleOptions(Qwt.QwtDial.ScaleTicks | Qwt.QwtDial.ScaleLabel) - self.setScaleTicks(0, 4, 8) - self.setRange(0.0,80.0) - self.setScale(-1, 2, 20) - self.setFrameShadow(Qwt.QwtDial.Sunken) + #self.setScaleOptions(Qwt.QwtDial.ScaleTicks | Qwt.QwtDial.ScaleLabel) + #self.setScaleTicks(0, 4, 8) + #self.setMinScaleArc(0.0) + #self.setMaxScaleArc(80.0) + #self.setRange(0.0,80.0) + self.setScale(0.0, 80.0) + self.setFrameShadow(Qwt.QwtDial.Sunken) - # __init__() - - def setLabel(self, text): - self.__label = text - self.update() + def setLabel(self, text): + self.__label = text + self.update() - # setLabel() - - def label(self): - return self.__label + def label(self): + return self.__label - # label() - - def drawScaleContents(self, painter, center, radius): - rect = Qt.QRect(0, 0, 2 * radius, 2 * radius - 10) - rect.moveCenter(center) - painter.setPen(self.palette().color(Qt.QPalette.Text)) - painter.drawText(rect, Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter, self.__label) - rect = Qt.QRect(-1000, -1000, 2 * radius-30, 2 * radius-30) - rect.moveCenter(center) - - painter.setPen(Qt.QPen(Qt.Qt.red,8)) - - painter.drawArc(rect,-500,1300) - painter.setPen(Qt.QPen(Qt.Qt.green,8)) - - painter.drawArc(rect,1000,2500) - - - - def setVal(self,value=0.): - self.setValue(value) - - # drawScaleContents + def drawScaleContents(self, painter, center, radius): + rect = Qt.QRect(0, 0, 2 * radius, 2 * radius - 10) + rect.moveCenter(center.toPoint()) + painter.setPen(self.palette().color(Qt.QPalette.Text)) + painter.drawText(rect, Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter, self.__label) + rect = Qt.QRect(-1000, -1000, 2 * radius - 30, 2 * radius - 30) + rect.moveCenter(center.toPoint()) -# class SpeedoMeter + unit = 270. / 80 + pen = Qt.QPen() + pen.setCapStyle(Qt.Qt.FlatCap) + pen.setWidth(8) + pen.setColor(Qt.Qt.red) + painter.setPen(pen) + painter.drawArc(rect, 16 * -45, 16 * (80 - self.limit) * unit) + pen.setColor(Qt.Qt.green) + painter.setPen(pen) + painter.drawArc(rect, 16 * (-45 + (80 - self.limit) * unit), 16 * self.limit * unit) + def setVal(self, value=0.): + self.setValue(value) -class TimeScaleDraw(Qwt.QwtScaleDraw): +class Background(Qwt.QwtPlotItem): - def __init__(self, baseTime, *args): - Qwt.QwtScaleDraw.__init__(self, *args) - self.baseTime = baseTime - - # __init__() + def __init__(self, limit): + Qwt.QwtPlotItem.__init__(self) + self.setZ(0.0) + self.limit = limit - def label(self, value): - upTime = self.baseTime.addSecs(int(value)*TIMESTEP) - return Qwt.QwtText(upTime.toString()) - + def rtti(self): + return Qwt.QwtPlotItem.Rtti_PlotUserItem + def draw(self, painter, xMap, yMap, rect): + c = Qt.QColor(Qt.Qt.gray) + r = Qt.QRect(rect.toAlignedRect()) + red = Qt.QColor(Qt.Qt.red) + yellow = Qt.QColor(Qt.Qt.yellow) + r.setBottom(yMap.transform(self.limit)) + r.setTop(yMap.transform(self.limit)) + painter.fillRect(r, red) -class Background(Qwt.QwtPlotItem): +class WindWidget(Qt.QWidget): - def __init__(self,limit): - Qwt.QwtPlotItem.__init__(self) - self.setZ(0.0) - self.limit=limit + def __init__(self,parent = None): + Qt.QWidget.__init__(self,parent) - # __init__() + self.compass = Qwt.QwtCompass(self) + self.lcd = QtGui.QLineEdit('0') - def rtti(self): - return Qwt.QwtPlotItem.Rtti_PlotUserItem + palette = Qt.QPalette() + palette.setColor(Qt.QPalette.Foreground, Qt.Qt.black) - # rtti() + newPalette = self.compass.palette() + rose = Qwt.QwtSimpleCompassRose(4, 1) + self.compass.setRose(rose) + self.compass.setNeedle(Qwt.QwtCompassWindArrow(Qwt.QwtCompassWindArrow.Style2, Qt.QColor(0xCCCCFF))) + #self.lcd.setSegmentStyle(Qt.QLCDNumber.Filled) + lcdpalette = Qt.QPalette() + lcdpalette.setBrush(Qt.QPalette.Background, Qt.Qt.red) - def draw(self, painter, xMap, yMap, rect): - c = Qt.QColor(Qt.Qt.gray) - r = Qt.QRect(rect) - red=Qt.QColor(Qt.Qt.red) - yellow=Qt.QColor(Qt.Qt.yellow) - - - r.setBottom(yMap.transform(self.limit)) - r.setTop(yMap.transform(self.limit)) - painter.fillRect(r,red) + layout = Qt.QGridLayout(self) + layout.addWidget(self.compass, 0, 0, 9, 0) + #layout.setColumnStrecth(10) + layout.addWidget(self.lcd, 10, 0) + self.setLayout(layout) - - # draw() + def __del__(self): + pass -# class Background + def setVal(self, value=0.): + self.compass.setValue(value) + self.lcd.setText(str(value) + " deg.") -class WindWidget(Qt.QWidget): - def __init__(self,parent=None): - Qt.QWidget.__init__(self,parent) - - self.compass=Qwt.QwtCompass(self) - self.lcd =QtGui.QLineEdit('0') - - palette = Qt.QPalette( ) - palette.setColor(Qt.QPalette.Foreground,Qt.Qt.black) - - newPalette = self.compass.palette() - rose=Qwt.QwtSimpleCompassRose(4,1) - self.compass.setRose(rose) - self.compass.setNeedle(Qwt.QwtCompassWindArrow(Qwt.QwtCompassWindArrow.Style2,Qt.QColor(0xCCCCFF))) - # self.lcd.setSegmentStyle(Qt.QLCDNumber.Filled)# - lcdpalette = Qt.QPalette( ) - lcdpalette.setBrush(Qt.QPalette.Background,Qt.Qt.red) - - layout = Qt.QGridLayout(self) - layout.addWidget(self.compass,0,0,9,0) - # layout.setColumnStrecth(10) - layout.addWidget(self.lcd,10,0) - self.setLayout(layout) - - def __del__(self): - ''' none''' - def setVal(self,value=0.): - self.compass.setValue(value) - self.lcd.setText(Qt.QString(str(value))+" deg.") - class WindSpeed(Qt.QWidget): - def __init__ (self,parent=None): - Qt.QWidget.__init__(self,parent) - - self.speed=SpeedoMeter(self) - self.speed.setRange(0.0,120.0) - self.speed.setReadOnly(True) - self.setGeometry(0,0,255,255) - - def setVal(self,value=0.): - self.speed.setValue(value) - - + + def __init__ (self, parent=None): + Qt.QWidget.__init__(self, parent) + + self.speed = SpeedoMeter(self) + self.speed.setRange(0.0, 120.0) + self.speed.setReadOnly(True) + self.setGeometry(0, 0, 255, 255) + + def setVal(self, value=0.): + self.speed.setValue(value) + + class Temperature(Qt.QWidget): - def __init__ (self,parent=None): - Qt.QWidget.__init__(self,parent) - self.lcd=Qt.QLineEdit() - self.thermo = Qwt.QwtThermo() - self.thermo.setRange(-5., 45.0) - self.thermo.setFillColor(Qt.Qt.red) - self.thermo.setPipeWidth(12) - self.thermo.setOrientation(Qt.Qt.Vertical, Qwt.QwtThermo.LeftScale) - label = Qt.QLabel("Air Temp", self) - - label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignCenter) - layout = Qt.QVBoxLayout() - layout.setAlignment(Qt.Qt.AlignHCenter) - layout.addWidget(self.thermo,Qt.Qt.AlignCenter) - layout.addWidget(label) - layout.addWidget(self.lcd,1,Qt.Qt.AlignRight) - layout.setMargin(0) - self.setLayout(layout) - - - - - def setVal(self,value=0.): - self.thermo.setValue(value) - lcdpalette = Qt.QPalette( ) - lcdpalette.setColor(Qt.QPalette.Background, Qt.Qt.red); - self.lcd.setPalette( lcdpalette ); - self.lcd.setText(Qt.QString("%1").arg(value,3,'f',1)) - #QString("%1").arg(123.2349102,8,'f',4); + + def __init__ (self, parent=None): + Qt.QWidget.__init__(self, parent) + self.lcd = Qt.QLineEdit() + self.thermo = Qwt.QwtThermo() + self.thermo.setLowerBound(-5.) + self.thermo.setUpperBound(45.0) + self.thermo.setFillBrush(QtGui.QBrush(Qt.Qt.red)) + self.thermo.setPipeWidth(12) + self.thermo.setOrientation(Qt.Qt.Vertical) + self.thermo.setScalePosition(Qwt.QwtThermo.TrailingScale) + #self.thermo.setOrientation(Qt.Qt.Vertical, Qwt.QwtThermo.LeftScale) + label = Qt.QLabel("Air Temp", self) + + label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignCenter) + layout = Qt.QVBoxLayout() + layout.setAlignment(Qt.Qt.AlignHCenter) + layout.addWidget(self.thermo, Qt.Qt.AlignCenter) + layout.addWidget(label) + layout.addWidget(self.lcd, 1, Qt.Qt.AlignRight) + layout.setMargin(0) + self.setLayout(layout) + + def setVal(self, value=0.): + self.thermo.setValue(value) + lcdpalette = Qt.QPalette() + lcdpalette.setColor(Qt.QPalette.Background, Qt.Qt.red); + self.lcd.setPalette(lcdpalette); + self.lcd.setText("%.1f" % value) + class Values(Qt.QFrame): - def __init__(self,*args): - Qt.QFrame.__init__(self,*args) - + def __init__(self, *args): + Qt.QFrame.__init__(self, *args) class PlotWindWidget(Qwt.QwtPlot): - def __init__(self,limit,*args): - Qwt.QwtPlot.__init__(self,*args) - self.setAutoReplot(False) - self.t=Qt.QTime() - ts=getTimeStamp() - epoch=TimeUtil() - pydate=epoch.epoch2py(ts) - t=time.gmtime(pydate) # convert to - h,m,s=t.tm_hour,t.tm_min,t.tm_sec - self.t=Qt.QTime(h,m,s) -# self.timestep=5. # - -# self.curve=Qwt.QwtPlotCurve() -# self.curve.setPen(Qt.QPen(Qt.Qt.blue,2)) -# self.curve.setBrush(Qt.Qt.blue) - -# self.curve.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse,Qt.QBrush(Qt.Qt.blue), Qt.QPen(Qt.Qt.yellow),Qt.QSize(4, 4))) -# self.curve.setZ(2); - - background = Background(limit) - background.attach(self) - - grid = Qwt.QwtPlotGrid() - grid.attach(self) - grid.enableX(False) - - grid.setPen(Qt.QPen(Qt.Qt.black, 0, Qt.Qt.DotLine)) - - self.setCanvasBackground(Qt.Qt.white) - self.curveWSpeedPeak=Qwt.QwtPlotCurve() - self.curveWSpeedPeak.setPen(Qt.QPen(Qt.Qt.blue,2)) -# self.curveWSpeedPeak.setBrush(Qt.Qt.blue) -# self.curveWSpeedPeak.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse,Qt.QBrush(Qt.Qt.blue), Qt.QPen(Qt.Qt.yellow),Qt.QSize(4, 4))) - # self.curveWSpeedPeak.setZ(1) - -# self.y=randn(1000) - self.x=range(BUFFER) - self.y=zeros(BUFFER) - self.windSpeedPeak=zeros(BUFFER) - - self.y2=[0. for i in xrange(BUFFER)]# inizializza una lista di float - - self.timeData = 1.0 * arange(0,-HISTORY , -1)+1 - - currTime=Qt.QTime.currentTime(); - currTime.addSecs(-HISTORY*TIMESTEP); - - self.setAxisScaleDraw( Qwt.QwtPlot.xBottom, TimeScaleDraw(currTime)) - self.setAxisScale(Qwt.QwtPlot.xBottom, 0, HISTORY*TIMESTEP) - self.setAxisLabelRotation(Qwt.QwtPlot.xBottom, -50.0) -# self.curve.attach(self) - self.curveWSpeedPeak.attach(self) -# self.setAxisAutoScale(Qwt.QwtPlot.yLeft) - self.setAxisScale(Qwt.QwtPlot.yLeft,0,80,10) - self.setAxisTitle(Qwt.QwtPlot.yLeft, "Wind Speed (Km/h)") - - self.setAxisLabelAlignment(Qwt.QwtPlot.xBottom, Qt.Qt.AlignLeft | Qt.Qt.AlignBottom) - -#lower, upper, majorTicks, mediumTicks, minorTicks) - - def setVal(self,val): - - self.y[1:]=self.y[0:-1] # scorre a sinistra il vettore - self.y[0]=val -# self.y2[0]=self.y[self.indice] - - def setWindSpeedPeak(self,val): - self.timeData += 1.0 - self.setAxisScale(Qwt.QwtPlot.xBottom,self.timeData[-1],self.timeData[0]) -# self.curve.setData(self.timeData,self.y) - self.windSpeedPeak[1:]=self.windSpeedPeak[0:-1] - self.windSpeedPeak[0]=val - self.curveWSpeedPeak.setData(self.timeData,self.windSpeedPeak) -# self.curveWSpeedPeak.setBaseline(self.y[0]) # baseline set to win - self.replot() + def __init__(self, limit, *args): + Qwt.QwtPlot.__init__(self, *args) + self.setAutoReplot(False) + self.t = Qt.QTime() + ts = getTimeStamp() + epoch = TimeUtil() + pydate = epoch.epoch2py(ts) + t = time.gmtime(pydate) # convert to + h, m, s = t.tm_hour, t.tm_min, t.tm_sec + self.t = Qt.QTime(h, m, s) + #self.timestep = 5. + + #self.curve = Qwt.QwtPlotCurve() + #self.curve.setPen(Qt.QPen(Qt.Qt.blue, 2)) + #self.curve.setBrush(Qt.Qt.blue) + + #self.curve.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse, Qt.QBrush(Qt.Qt.blue), Qt.QPen(Qt.Qt.yellow), Qt.QSize(4, 4))) + #self.curve.setZ(2); + + background = Background(limit) + background.attach(self) + + grid = Qwt.QwtPlotGrid() + grid.attach(self) + grid.enableX(False) + + grid.setPen(Qt.QPen(Qt.Qt.black, 0, Qt.Qt.DotLine)) + + self.setCanvasBackground(Qt.Qt.white) + self.curveWSpeedPeak = Qwt.QwtPlotCurve() + self.curveWSpeedPeak.setPen(Qt.QPen(Qt.Qt.blue, 2)) + #self.curveWSpeedPeak.setBrush(Qt.Qt.blue) + #self.curveWSpeedPeak.setSymbol(Qwt.QwtSymbol(Qwt.QwtSymbol.Ellipse, Qt.QBrush(Qt.Qt.blue), Qt.QPen(Qt.Qt.yellow), Qt.QSize(4, 4))) + #self.curveWSpeedPeak.setZ(1) + + #self.y = randn(1000) + self.windSpeedPeak = zeros(BUFFER) + + self.y2 = [0. for i in range(BUFFER)] # inizializza una lista di float + + a = Qwt.QwtDateScaleDraw() + a.setDateFormat(Qwt.QwtDate.Second, 'hh:mm:ss') + self.setAxisScaleDraw(Qwt.QwtPlot.xBottom, a) + + now = time.time() * 1000 + self.timeData = arange(now, now - BUFFER * 1000, -1000) + self.setAxisScale(Qwt.QwtPlot.xBottom, self.timeData[-1], self.timeData[0]) + #self.setAxisScale(Qwt.QwtPlot.xBottom, 0, HISTORY * TIMESTEP) + self.setAxisLabelRotation(Qwt.QwtPlot.xBottom, -50.0) + #self.curve.attach(self) + self.curveWSpeedPeak.attach(self) + #self.setAxisAutoScale(Qwt.QwtPlot.yLeft) + self.setAxisScale(Qwt.QwtPlot.yLeft, 0, 80, 10) + self.setAxisTitle(Qwt.QwtPlot.yLeft, "Wind Speed (Km/h)") + + self.setAxisLabelAlignment(Qwt.QwtPlot.xBottom, Qt.Qt.AlignLeft | Qt.Qt.AlignBottom) + + def setWindSpeedPeak(self, val): + self.timeData[1:] = self.timeData[0:-1] + self.timeData[0] = time.time() * 1000 + self.setAxisScale(Qwt.QwtPlot.xBottom, self.timeData[-1], self.timeData[0]) + #self.curve.setData(self.timeData, self.y) + self.windSpeedPeak[1:] = self.windSpeedPeak[0:-1] + self.windSpeedPeak[0] = val + self.curveWSpeedPeak.setSamples(self.timeData.tolist(), self.windSpeedPeak.tolist()) + #self.curveWSpeedPeak.setBaseline(self.y[0]) # baseline set to win + self.replot() + class PlotProperty(Qt.QFrame): - - def __init__(self,componentname,propertyname): - Qt.QFrame.__init__(self) # you must initialize the superclass - self.componentname=componentname - self.propertyname = propertyname - try: - self.simpleClient=PySimpleClient() - component=self.simpleClient.getComponent(self.componentname) - self.limit=component._get_autoparkThreshold().get_sync()[0] - except Exception as ex: - newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex,create=1) - newEx.setPropertyName("autoparkThreshold") - raise newEx - - - self.simpleClient.getLogger().logInfo("Wheather station client startup") - - self.plotwidget=PlotWindWidget(self.limit) - self.windspeedw = SpeedoMeter() - self.winddirw= WindWidget() - self.temperaturew= Temperature() - #self.plotwidget.setTitle("WeatherStation") - self.plotwidget.setMargin(5) - mainLayout = Qt.QVBoxLayout(self) - mainLayout.addWidget(self.plotwidget,2) - -# layout = Qt.QGridLayout() - - - - hlayout = Qt.QHBoxLayout() -# hvlayout= Qt.QForm - hlayout.setAlignment(Qt.Qt.AlignHCenter) -# hlayout.setSpacing(150) -# hlayout.addSpacing(10) - hlayout.addStretch(50) - hlayout.addWidget(self.temperaturew) - hlayout.addStretch(50) - hlayout.addWidget(self.windspeedw) - hlayout.addStretch(50) - hlayout.addWidget(self.winddirw) - hlayout.addStretch(50) - mainLayout.addLayout(hlayout) - - #layout.addWidget(self.plotwidget, 0, 0, 9, 3) -# layout.addWidget(self.plotwidget, 1,0) - - - - -# self.setLayout(layout) # - - # self.windspeedw = SpeedoMeter() - def run(self): - self.monitor() - def monitor(self): - component = self.simpleClient.getComponent(self.componentname) - windSpeadAvgPr=component._get_windspeed() - windSpeedPeakProperty =component._get_windspeedpeak() - tempPr = component._get_temperature() - windDirPr = component._get_winddir() - desc = ACS.CBDescIn(0L, 0L, 0L) - - propMonitor = PropertyMonitor(self.plotwidget,self.propertyname) - cbMonServant = self.simpleClient.activateOffShoot(propMonitor) - self.actMon = windSpeadAvgPr.create_monitor(cbMonServant, desc) - self.actMon.set_timer_trigger(TIMESTEP*10000000) - - windSpeedPeakMon=PropertyMonitor(self.plotwidget,"windspeedpeak") - cbMonServant_wsppeak = self.simpleClient.activateOffShoot(windSpeedPeakMon) - self.WSpeedPeakactMon = windSpeedPeakProperty.create_monitor(cbMonServant_wsppeak, desc) - self.WSpeedPeakactMon.set_timer_trigger(TIMESTEP*10000000) - self.connect(windSpeedPeakMon, Qt.SIGNAL("PropertyChanghed(float)"),self.plotwidget.setWindSpeedPeak) - self.connect(windSpeedPeakMon, Qt.SIGNAL("PropertyChanghed(float)"),self.windspeedw.setVal) - - windDirPeakMon = PropertyMonitor(self.plotwidget,"wind dir peak") - cbMonServant = self.simpleClient.activateOffShoot(windDirPeakMon) - self.WDiractMon = windDirPr.create_monitor(cbMonServant, desc) #attenzione l'oggetto property e' stato creato dalla funzione exec - self.WDiractMon.set_timer_trigger(TIMESTEP*10000000) - self.connect(windDirPeakMon, Qt.SIGNAL("PropertyChanghed(float)"),self.winddirw.setVal) - - temperatureMon = PropertyMonitor(self.plotwidget,"Temperature:") - cbMonServant = self.simpleClient.activateOffShoot(temperatureMon) - self.temperatureactMon = tempPr.create_monitor(cbMonServant, desc) #attenzione l'oggetto property e' stato creato dalla funzione exec - self.temperatureactMon.set_timer_trigger(TIMESTEP*10000000*4) - self.connect(temperatureMon, Qt.SIGNAL("PropertyChanghed(float)"),self.temperaturew.setVal) - - - def __del__(self): - self.actMon.destroy() - self.WDiractMon.destroy() - self.temperatureactMon.destroy() - self.WSpeedPeakactMon.destroy() - #self.actMonwspeed.destroy() - self.simpleClient.releaseComponent(self.componentname) - self.simpleClient.disconnect() - print "The end __oOo__" - - - -def make( ): - try: - plot = PlotProperty("WEATHERSTATION/WeatherStation","windspeed") - except ClientErrorsImpl.CouldntAccessPropertyExImpl as ex: - logger.logException(ex) - sys.exit(-1) - - plot.resize(800, 600) - plot.run() - plot.show() - - return plot - - - + + def __init__(self,componentname,propertyname): + Qt.QFrame.__init__(self) # you must initialize the superclass + self.componentname = componentname + self.propertyname = propertyname + try: + self.simpleClient = PySimpleClient() + component = self.simpleClient.getComponent(self.componentname) + self.limit = component._get_autoparkThreshold().get_sync()[0] + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) + newEx.setPropertyName("autoparkThreshold") + raise newEx + + self.simpleClient.getLogger().logInfo("Wheather station client startup") + + self.plotwidget = PlotWindWidget(self.limit) + self.windspeedw = SpeedoMeter(self.limit) + self.winddirw = WindWidget() + self.temperaturew = Temperature() + #self.plotwidget.setTitle("WeatherStation") + #self.plotwidget.setMargin(5) + mainLayout = Qt.QVBoxLayout(self) + mainLayout.addWidget(self.plotwidget, 2) + + #layout = Qt.QGridLayout() + + hlayout = Qt.QHBoxLayout() + #hvlayout = Qt.QForm + hlayout.setAlignment(Qt.Qt.AlignHCenter) + #hlayout.setSpacing(150) + #hlayout.addSpacing(10) + hlayout.addStretch(50) + hlayout.addWidget(self.temperaturew) + hlayout.addStretch(50) + hlayout.addWidget(self.windspeedw) + hlayout.addStretch(50) + hlayout.addWidget(self.winddirw) + hlayout.addStretch(50) + mainLayout.addLayout(hlayout) + + #layout.addWidget(self.plotwidget, 0, 0, 9, 3) + #layout.addWidget(self.plotwidget, 1, 0) + #self.setLayout(layout) + #self.windspeedw = SpeedoMeter() + + def run(self): + self.monitor() + + def monitor(self): + component = self.simpleClient.getComponent(self.componentname) + windSpeadAvgPr = component._get_windspeed() + windSpeedPeakProperty = component._get_windspeedpeak() + tempPr = component._get_temperature() + windDirPr = component._get_winddir() + desc = ACS.CBDescIn(0, 0, 0) + + propMonitor = PropertyMonitor(self.plotwidget, self.propertyname) + cbMonServant = self.simpleClient.activateOffShoot(propMonitor) + self.actMon = windSpeadAvgPr.create_monitor(cbMonServant, desc) + self.actMon.set_timer_trigger(TIMESTEP * 10000000) + + windSpeedPeakMon = PropertyMonitor(self.plotwidget, "windspeedpeak") + cbMonServant_wsppeak = self.simpleClient.activateOffShoot(windSpeedPeakMon) + self.WSpeedPeakactMon = windSpeedPeakProperty.create_monitor(cbMonServant_wsppeak, desc) + self.WSpeedPeakactMon.set_timer_trigger(TIMESTEP * 10000000) + self.connect(windSpeedPeakMon, Qt.SIGNAL("PropertyChanghed(float)"), self.plotwidget.setWindSpeedPeak) + self.connect(windSpeedPeakMon, Qt.SIGNAL("PropertyChanghed(float)"), self.windspeedw.setVal) + + windDirPeakMon = PropertyMonitor(self.plotwidget, "wind dir peak") + cbMonServant = self.simpleClient.activateOffShoot(windDirPeakMon) + self.WDiractMon = windDirPr.create_monitor(cbMonServant, desc) # attenzione l'oggetto property e' stato creato dalla funzione exec + self.WDiractMon.set_timer_trigger(TIMESTEP * 10000000) + self.connect(windDirPeakMon, Qt.SIGNAL("PropertyChanghed(float)"), self.winddirw.setVal) + + temperatureMon = PropertyMonitor(self.plotwidget, "Temperature:") + cbMonServant = self.simpleClient.activateOffShoot(temperatureMon) + self.temperatureactMon = tempPr.create_monitor(cbMonServant, desc) #attenzione l'oggetto property e' stato creato dalla funzione exec + self.temperatureactMon.set_timer_trigger(TIMESTEP * 10000000 * 4) + self.connect(temperatureMon, Qt.SIGNAL("PropertyChanghed(float)"), self.temperaturew.setVal) + + def __del__(self): + self.simpleClient.disconnect() + + +def make(): + try: + plot = PlotProperty("WEATHERSTATION/WeatherStation", "windspeed") + except ClientErrorsImpl.CouldntAccessPropertyExImpl as ex: + logger.logException(ex) + sys.exit(-1) + + plot.resize(800, 600) + plot.run() + plot.show() + return plot + + def main(args): - - app = Qt.QApplication(args) - plot=make() - - -#demo,plot=make(args) - -# w=my.run() - sys.exit(app.exec_()) - sleep(2) + app = Qt.QApplication(args) + plot = make() + + #demo, plot = make(args) + + #w = my.run() + sys.exit(app.exec_()) + sleep(2) + + if __name__=='__main__': - main(sys.argv) + main(sys.argv) diff --git a/Common/Clients/SystemTerminal/src/_tui_SysTerm.py b/Common/Clients/SystemTerminal/src/_tui_SysTerm.py index bff24bcc4..a597dfa7d 100644 --- a/Common/Clients/SystemTerminal/src/_tui_SysTerm.py +++ b/Common/Clients/SystemTerminal/src/_tui_SysTerm.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function # This is a python client that can be used as a terminal to the system, It issues the command # action of the connected sub-system boss. @@ -34,10 +35,10 @@ from nuraghe_commands import commands stopAll=False def usage(): - print "systerm [-h|--help] [ComponentName]" - print "ComponentName The name of a component that implements the CommandInterpreter interface" - print " If not given the Scheduler component is used." - print "[-h|--help] displays this help" + print("systerm [-h|--help] [ComponentName]") + print("ComponentName The name of a component that implements the CommandInterpreter interface") + print(" If not given the Scheduler component is used.") + print("[-h|--help] displays this help") def handler(num, stack): raise EOFError @@ -69,128 +70,130 @@ class HistoryCompleter(object): def main(): - global stopAll + global stopAll - #handler for the external request of termination - signal.signal(signal.SIGUSR1, handler) + #handler for the external request of termination + signal.signal(signal.SIGUSR1, handler) - try: - opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) - except getopt.GetoptError, err: - print str(err) - usage() - sys.exit(1) + try: + opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) + except getopt.GetoptError as err: + print(str(err)) + usage() + sys.exit(1) - for o, a in opts: - if o in ("-h", "--help"): - usage() - sys.exit() + for o, a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() - simpleClient = PySimpleClient() - compName="" + simpleClient = PySimpleClient() + compName="" - if args == []: - compType = "IDL:alma/Management/Scheduler:1.0" - try: - component=simpleClient.getDefaultComponent(compType) - compName=component._get_name() - except Exception , ex: - newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) - newEx.setComponentName(compType) - newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) - sys.exit(1) - else: - compName = args[0] - try: - component=simpleClient.getComponent(compName) - except Exception , ex: - newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) - newEx.setComponentName(compName) - newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) - sys.exit(1) + if args == []: + compType = "IDL:alma/Management/Scheduler:1.0" + try: + component=simpleClient.getDefaultComponent(compType) + compName=component._get_name() + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) + newEx.setComponentName(compType) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + sys.exit(1) + else: + compName = args[0] + try: + component=simpleClient.getComponent(compName) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) + newEx.setComponentName(compName) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + sys.exit(1) - userHome = os.getenv('HOME') - historyFile = None - if userHome == None: - historyFile = '/tmp/.oprin_cmd.hist' - else: - historyFile = userHome+'/.oprin_cmd.hist' + userHome = os.getenv('HOME') + historyFile = None + if userHome == None: + historyFile = '/tmp/.oprin_cmd.hist' + else: + historyFile = userHome+'/.oprin_cmd.hist' - if os.path.exists(historyFile): - readline.read_history_file(historyFile) - - readline.set_completer(HistoryCompleter().complete) - readline.parse_and_bind('tab: complete') + if os.path.exists(historyFile): + readline.read_history_file(historyFile) + + readline.set_completer(HistoryCompleter().complete) + readline.parse_and_bind('tab: complete') - cmdCounter=0 + cmdCounter=0 - while not stopAll: - try: - cmd='' - if cmdCounter>0: - try: - cmd=raw_input("<%d> "%cmdCounter) - except IOError: - cmd='exit' - else: - cmd="version" - cmdCounter=cmdCounter+1 - cmd=cmd.strip() - if cmd=="exit": - stopAll=True - elif cmd == 'help()': - print '\t' + '\n\t'.join(sorted(commands.keys())) - elif cmd.startswith('help('): - start = cmd.find('(') + 1 - end = cmd.find(')') - arg = cmd[start:end] # help(setupCCB) -> arg=setupCCB - if arg not in commands: - print "`%s` is not a valid command" %(arg if arg else cmd) - else: - print commands['help'](arg) - elif cmd: - readline.write_history_file(historyFile) - try: - success, res = component.command(cmd) - idx = res.find('\\') - cmd_name, response = res[:idx+1], res[idx+1:].rstrip('\\') - if success and response: - if response.startswith('STR '): - # We got a formatted string in return, print it - # without any modification - response = response[4:] - lines = response.split('\n') - print cmd_name - for line in lines: - print line - else: - groups = response.split(',') - for group in groups: - values = group.split(';') - if len(values) > 1: - print cmd_name - for i, value in enumerate(values): - print '%02d) %s' %(i, value) - elif res: - print res - elif res: - print res - except Exception, ex: - newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) - newEx.setAction("command()") - newEx.setReason(ex.message) - newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) - except EOFError: - # CTRL + D event: Equivalent to the exit command, we stop the loop - stopAll=True - except KeyboardInterrupt: - # CTRL + C event: Ignore whatever string was written on the - # terminal and show a new prompt line - print '^C' + while not stopAll: + try: + cmd='' + if cmdCounter>0: + try: + cmd=raw_input("<%d> "%cmdCounter) + except NameError: + cmd=input("<%d> "%cmdCounter) + except IOError: + cmd='exit' + else: + cmd="version" + cmdCounter=cmdCounter+1 + cmd=cmd.strip() + if cmd=="exit": + stopAll=True + elif cmd == 'help()': + print('\t' + '\n\t'.join(sorted(commands.keys()))) + elif cmd.startswith('help('): + start = cmd.find('(') + 1 + end = cmd.find(')') + arg = cmd[start:end] # help(setupCCB) -> arg=setupCCB + if arg not in commands: + print("`%s` is not a valid command" %(arg if arg else cmd)) + else: + print(commands['help'](arg)) + elif cmd: + readline.write_history_file(historyFile) + try: + success, res = component.command(cmd) + idx = res.find('\\') + cmd_name, response = res[:idx+1], res[idx+1:].rstrip('\\') + if success and response: + if response.startswith('STR '): + # We got a formatted string in return, print it + # without any modification + response = response[4:] + lines = response.split('\n') + print(cmd_name) + for line in lines: + print(line) + else: + groups = response.split(',') + for group in groups: + values = group.split(';') + if len(values) > 1: + print(cmd_name) + for i, value in enumerate(values): + print('%02d) %s' %(i, value)) + elif res: + print(res) + elif res: + print(res) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) + newEx.setAction("command()") + newEx.setReason(ex.message) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + except EOFError: + # CTRL + D event: Equivalent to the exit command, we stop the loop + stopAll=True + except KeyboardInterrupt: + # CTRL + C event: Ignore whatever string was written on the + # terminal and show a new prompt line + print('^C') - readline.write_history_file(historyFile) - simpleClient.releaseComponent(compName) - simpleClient.disconnect() + readline.write_history_file(historyFile) + simpleClient.releaseComponent(compName) + simpleClient.disconnect() if __name__=="__main__": main() diff --git a/Common/Clients/SystemTerminal/src/nuraghe_commands.py b/Common/Clients/SystemTerminal/src/nuraghe_commands.py index 7390df0e0..9931cce9f 100755 --- a/Common/Clients/SystemTerminal/src/nuraghe_commands.py +++ b/Common/Clients/SystemTerminal/src/nuraghe_commands.py @@ -1,3 +1,4 @@ +from __future__ import print_function # Marco Buttu # Doctrings from the "Observing at the SRT with Nuraghe, Issue n.8, 21/10/14", # by Simona Righini and Andrea Orlati" @@ -410,11 +411,11 @@ def help(command): try: cmd = getattr(myself, command) return cmd.__doc__ - except Exception, ex: - print ex.message - print 'usage: help(command)' - print 'e.g. > help(setupCCB)' - print 'help() (without argument) lists all the available commands' + except Exception as ex: + print(ex.message) + print('usage: help(command)') + print('e.g. > help(setupCCB)') + print('help() (without argument) lists all the available commands') def ifdist(): @@ -697,7 +698,7 @@ import copy myself = __import__(__name__) # Create the commands dictionary commands = myself.__dict__.copy() # Shallow copy, but we do not mind -for cmd in commands.keys(): +for cmd in list(commands.keys()): if cmd.startswith('__'): del commands[cmd] diff --git a/Common/Libraries/IRALibrary/src/IRAPy/__init__.py b/Common/Libraries/IRALibrary/src/IRAPy/__init__.py index f59db02c9..ba534483e 100644 --- a/Common/Libraries/IRALibrary/src/IRAPy/__init__.py +++ b/Common/Libraries/IRALibrary/src/IRAPy/__init__.py @@ -9,9 +9,9 @@ list of modules: - Connection: Connection class implements a contextmanager for a socket """ -import customlogging +from . import customlogging import ACSLog -from Connection import Connection +from .Connection import Connection #Some comments required here. The custom logger mechanism is not working in python. #do the way to separate the system logs to the ones do be shown to the user is to use different diff --git a/Common/Libraries/ParserLibrary/src/SimpleParserPy/__init__.py b/Common/Libraries/ParserLibrary/src/SimpleParserPy/__init__.py index bbb75e9b3..92c7b438c 100644 --- a/Common/Libraries/ParserLibrary/src/SimpleParserPy/__init__.py +++ b/Common/Libraries/ParserLibrary/src/SimpleParserPy/__init__.py @@ -4,7 +4,7 @@ Presently only a small support for scripting commands and the support for python component is included """ -from ParserConnector import add_user_message -from ParserConnector import send_message +from .ParserConnector import add_user_message +from .ParserConnector import send_message diff --git a/Common/Libraries/PyTesting/src/testing/simulator.py b/Common/Libraries/PyTesting/src/testing/simulator.py index 0e04bbce8..f0c8cc1ce 100644 --- a/Common/Libraries/PyTesting/src/testing/simulator.py +++ b/Common/Libraries/PyTesting/src/testing/simulator.py @@ -1,3 +1,4 @@ +from __future__ import print_function import os import sys import time @@ -21,7 +22,7 @@ def run(test_case, server_name='antenna'): suite = unittest.TestSuite() tests = unittest.TestLoader().loadTestsFromTestCase(test_case) suite.addTests(tests) - print 'Running the tests using the antenna simulators...' + print('Running the tests using the antenna simulators...') unittest.TextTestRunner(verbosity=2).run(suite) finally: subprocess.Popen('%s stop' % server_name, shell=True) diff --git a/Common/Misc/InjectCommand/src/injectCommand.py b/Common/Misc/InjectCommand/src/injectCommand.py index 655c537ec..b4446e9b9 100644 --- a/Common/Misc/InjectCommand/src/injectCommand.py +++ b/Common/Misc/InjectCommand/src/injectCommand.py @@ -17,38 +17,38 @@ def main(): if getManager(): simpleClient = PySimpleClient() else: - print "Control software is off line" + print("Control software is off line") sys.exit(1) command="" try: command=sys.argv[1] - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.InvalidArgumentExImpl( exception=ex, create=1 ) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) try: sched=simpleClient.getDefaultComponent("IDL:alma/Management/Scheduler:1.0") - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex,create=1) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) try: answer=sched.command(command) - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CORBAProblemExImpl(exception=ex,create=1) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) - print answer[1] + print(answer[1]) if sched!=None: try: simpleClient.releaseComponent(sched.getName()) - except Exception,ex: + except Exception as ex: pass finally: sched=None diff --git a/Common/Misc/KStars/src/startKS.py b/Common/Misc/KStars/src/startKS.py index e5f6de7b6..0ca075047 100644 --- a/Common/Misc/KStars/src/startKS.py +++ b/Common/Misc/KStars/src/startKS.py @@ -7,7 +7,7 @@ #andrea orlati(a.orlati@ira.inaf.it) 22/05/2008 Creation - +from __future__ import print_function import sys from Acspy.Clients.SimpleClient import PySimpleClient from Acspy.Common.Callbacks import * @@ -34,7 +34,7 @@ def main(): sc = PySimpleClient() try: c = sc.getComponent("ANTENNA/Boss") - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName("ANTENNA/Boss") newEx.log(ACS_LOG_ERROR) @@ -42,14 +42,14 @@ def main(): try: azimuth = c._get_observedAzimuth() - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl( exception=ex, create=1 ) newEx.setPropertyName("observedAzimuth") newEx.log(ACS_LOG_ERROR) sys.exit(1) try: elevation = c._get_observedElevation() - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl( exception=ex, create=1 ) newEx.setPropertyName("observedElevation") newEx.log(ACS_LOG_ERROR) @@ -73,7 +73,7 @@ def main(): else: vivo = 0 - print "Finished..." + print("Finished...") sc.releaseComponent("ANTENNA/Boss") sc.disconnect() diff --git a/Common/Misc/OnOffSwitching/devices.py b/Common/Misc/OnOffSwitching/devices.py index 4765860e1..7a84468fb 100755 --- a/Common/Misc/OnOffSwitching/devices.py +++ b/Common/Misc/OnOffSwitching/devices.py @@ -1,4 +1,4 @@ -from __future__ import division +from __future__ import division, print_function __all__ = ['antenna', 'Recorder', 'mount', 'receiver', 'scheduler', 'ato', 'ANT_J2000', 'ACU_NEUTRAL'] __credits__ = """Author: Marco Buttu @@ -98,7 +98,7 @@ class Recorder(object): mkdir(cycle_type_datadir) else: logging.error('Dir %s already exists') - print 'WARNING: Dir %s already exists' + print('WARNING: Dir %s already exists') self.scanSetup.scanTag += 1 utc = datetime.datetime.utcnow() self.scanSetup.path = abspath(cycle_type_datadir) @@ -127,7 +127,7 @@ try: mount = client.getComponent('ANTENNA/Mount') # If the backend rounds the time to a next upper value, set a negative `ato` ato = -5 # Offset to add to the backend acquisition time -except Exception, e: +except Exception as e: logging.exception('Cannot get the ACS modules and components') print('ERROR: Cannot get the ACS modules and components') raise diff --git a/Common/Misc/OnOffSwitching/handler.py b/Common/Misc/OnOffSwitching/handler.py index f2ec02818..dfe9bd981 100755 --- a/Common/Misc/OnOffSwitching/handler.py +++ b/Common/Misc/OnOffSwitching/handler.py @@ -1,4 +1,4 @@ -from __future__ import division +from __future__ import division, print_function __credits__ = """Author: Marco Buttu Licence: GPL 2.0 """ @@ -64,9 +64,9 @@ class Positioner(object): if not conf.simulate: try: from devices import antenna, ANT_J2000, ACU_NEUTRAL - except Exception, e: + except Exception as e: logging.exception('Cannot get the antenna component') - print 'ERROR: Cannot get the antenna component' + print('ERROR: Cannot get the antenna component') terminate.value = True sys.exit(1) @@ -105,10 +105,10 @@ class Positioner(object): map(lambda x, y: x + y, conf.target.getRaDec(), (ra_offset, 0)) # if abs(ra - ra_py) > 2e-4: # logging.warning('Mismatch between horizons and pyephem RAs: (%.4f, %.4f)', ra, ra_py) - # print '@ WARNING: Mismatch between horizons and pyephem RAs: (%.4f, %.4f)' %(ra, ra_py) + # print('@ WARNING: Mismatch between horizons and pyephem RAs: (%.4f, %.4f)' %(ra, ra_py)) # if abs(dec - dec_py) > 2e-4: # logging.warning('@ Mismatch between horizons and pyephem DECs: (%.4f, %.4f)', dec, dec_py) - # print '@ WARNING: Mismatch between horizons and pyephem DECs: (%.4f, %.4f)' %(dec, dec_py) + # print('@ WARNING: Mismatch between horizons and pyephem DECs: (%.4f, %.4f)' %(dec, dec_py)) del positions[:idx] else: raise Exception('Cannot get a proper date in the horizons file') @@ -118,9 +118,9 @@ class Positioner(object): try: # antenna.sidereal(conf.target.name, ra, dec, ANT_J2000, ACU_NEUTRAL) antenna.sidereal(conf.target.name, ra_py, dec_py, ANT_J2000, ACU_NEUTRAL) - except Exception, e: + except Exception as e: logging.exception('Cannot set the antenna position') - print 'ERROR: Cannot set the antenna position' + print('ERROR: Cannot set the antenna position') terminate.value = True sys.exit(1) @@ -131,9 +131,9 @@ class Positioner(object): break time.sleep(conf.positioning_time) except KeyboardInterrupt: - print 'Stopping the positioning...' - except Exception, e: - print 'UNEXPECTED ERROR in updatePosition(): \n\t%s' %e + print('Stopping the positioning...') + except Exception as e: + print('UNEXPECTED ERROR in updatePosition(): \n\t%s' %e) logging.exception('Got exception on updatePoition()') finally: if terminate.value: @@ -162,16 +162,16 @@ class Handler(object): if not name.startswith('_') and not name in ignored: value = getattr(conf, name) f.write('%s = %s\n' %(name, value)) - except Exception, e: + except Exception as e: logging.exception('Cannot get the devices') - print 'ERROR: Cannot get the devices' + print('ERROR: Cannot get the devices') raise finally: try: f.close() - except Exception, e: + except Exception as e: logging.warning('Cannot create the conf.txt file in the observation directory') - print 'WARNING: Cannot create the conf.txt file in the observation directory' + print('WARNING: Cannot create the conf.txt file in the observation directory') if conf.positioning_time < 0: @@ -211,9 +211,9 @@ class Handler(object): duration += slice_time if duration > timeout: break - except Exception, e: + except Exception as e: logging.exception('Cannot get the tracking value') - print 'Cannot get the tracking value' + print('Cannot get the tracking value') if duration > timeout: break if not track: @@ -249,7 +249,7 @@ class Handler(object): else: continue if found: - print radialSpeed + print(radialSpeed) vobs = self.conf.lab_freq * (1 - radialSpeed/(ephem.c/1000)) lo = vobs - ((self.conf.upper_freq + self.conf.lower_freq)/2) del self._horizons_lo[:idx] @@ -259,13 +259,13 @@ class Handler(object): if not self.conf.simulate: try: self.receiver.setLO([lo]) - except Exception, e: + except Exception as e: logging.exception('Cannot get the receiver') - print 'ERROR: Cannot get the receiver' + print('ERROR: Cannot get the receiver') raise now = datetime.datetime.utcnow() logging.info('At %s: LO value -> %s', now, lo) - print '+> LO(now + %s seconds) -> %.1f MHz' %(delta, lo) + print('+> LO(now + %s seconds) -> %.1f MHz' %(delta, lo)) def acquire(self, cycle, which): """Start and stop the backend acquisition.""" @@ -279,23 +279,23 @@ class Handler(object): if which == 'calibration': try: self.receiver.calOn() - except Exception, e: + except Exception as e: logging.exception('Cannot turn the mark ON') - print '+> ERROR: Cannot turn the mark ON' + print('+> ERROR: Cannot turn the mark ON') sys.exit(1) logging.info('Calibration mark ON') - print '+> Calibration mark ON' + print('+> Calibration mark ON') time.sleep(1) - print '+> Starting acquisition %s' %which + print('+> Starting acquisition %s' %which) logging.info('Starting acquisition at %s', datetime.datetime.utcnow()) self.recorder.start(cycle, which) else: if which == 'calibration': logging.info('Calibration mark ON') - print '+> Calibration mark ON (simulation mode)' + print('+> Calibration mark ON (simulation mode)') logging.info('Starting acquisition at %s', datetime.datetime.utcnow()) - print '+> Starting acquisition %s' %which - except Exception, e: + print('+> Starting acquisition %s' %which) + except Exception as e: logging.exception('Some problems recording') print('Some problems recording') raise @@ -305,22 +305,22 @@ class Handler(object): if not self.conf.simulate: self.recorder.stop() logging.info('Acquisition done at %s', datetime.datetime.utcnow()) - print '+> Acquisition done!' + print('+> Acquisition done!') if which == 'calibration': try: self.receiver.calOff() logging.info('Calibration mark OFF') - print '+> Calibration mark OFF' - except Exception, e: + print('+> Calibration mark OFF') + except Exception as e: logging.exception('Cannot turn the mark OFF') - print '+> ERROR: Cannot turn the mark OFF' + print('+> ERROR: Cannot turn the mark OFF') sys.exit(1) else: logging.info('Acquisition done at %s', datetime.datetime.utcnow()) - print '+> Acquisition done!' + print('+> Acquisition done!') if which == 'calibration': logging.info('Calibration mark OFF (simulation mode)') - print '+> Calibration mark OFF' + print('+> Calibration mark OFF') def getObservationTitle(self): from_ = self.conf.target.from_ @@ -373,7 +373,7 @@ class Handler(object): if date >= datetime.datetime.utcnow() - datetime.timedelta(minutes=20): self._horizons_lo.append((date, radialSpeed)) self._horizons_radec.append((date, ra, dec)) - except Exception, e: + except Exception as e: logging.exception('Cannot get the radial speeds and ra_dec position from the horizons file') print('Cannot get the radial speeds and ra_dec position from the horizons file') sys.exit(1) @@ -389,7 +389,7 @@ class Handler(object): try: mkdir(statsdir) except Exception: - print 'Cannot create the %s dir.' %statsdir + print('Cannot create the %s dir.' %statsdir) logging.warning('Cannot create the %s dir', statsdir) self._enablestats(False) return @@ -399,15 +399,15 @@ class Handler(object): self.statsfile = open(statsfile, 'a') title = self.getObservationTitle() self.statsfile.write(title) - except Exception, e: - print 'Warning: cannot open or write the statitstics file' + except Exception as e: + print('Warning: cannot open or write the statitstics file') logging.exception('Cannot open or write the statistics file') self._enablestats(False) def run(self): """Run the jobs in loop for cycles times.""" if not self.calibrations: - print 'WARNING: Observation without calibration' + print('WARNING: Observation without calibration') logging.warning('Observation withoud calibration') user_input = raw_input('Are you sure you want to continue? (y/n): ') if user_input.strip() != 'y': @@ -419,7 +419,7 @@ class Handler(object): cal_idx = 0 if not self.calibrations else self.conf.cycles/self.calibrations try: for i in range(self.conf.cycles): - print '>> CYCLE N.%02d' %(i+1) + print('>> CYCLE N.%02d' %(i+1)) if positioner.terminated(): raise Exception('Antenna positioning process terminated. See the log file.') positioner.goOnSource() @@ -431,14 +431,14 @@ class Handler(object): self.acquire(i+1, 'off_source') if cal_idx and not i % cal_idx: cal_counter += 1 - print '+> Starting calibration number %d.....' %cal_counter + print('+> Starting calibration number %d.....' %cal_counter) self.acquire(i+1, 'calibration') - print + print() except KeyboardInterrupt: - print 'Program stopped at at %s' %datetime.datetime.utcnow() + print('Program stopped at at %s' %datetime.datetime.utcnow()) logging.info('Program stopped at at %s' %datetime.datetime.utcnow()) - except Exception, e: - print 'UNEXPECTED ERROR: %s' %e + except Exception as e: + print('UNEXPECTED ERROR: %s' %e) logging.exception('Got exception on main handler') finally: positioner.terminate() @@ -446,11 +446,11 @@ class Handler(object): try: logging.info('Observation terminated (%s)', datestr) logging.info('# of cycles: %d | # of calibrations: %d', (i+1), cal_counter) - print '\nObservation terminated (%s)' %datestr - print '# of cycles: %d | # of calibrations: %d' %(i+1, cal_counter) - except Exception, e: + print('\nObservation terminated (%s)' %datestr) + print('# of cycles: %d | # of calibrations: %d' %(i+1, cal_counter)) + except Exception as e: logging.exception('Cannot get the number of cycles and calibrations') - print 'Cannot get the number of cycles and calibrations' + print('Cannot get the number of cycles and calibrations') if __name__ == '__main__': import doctest diff --git a/Common/Misc/OnOffSwitching/models.py b/Common/Misc/OnOffSwitching/models.py index 6e51099ae..0adaee9fa 100755 --- a/Common/Misc/OnOffSwitching/models.py +++ b/Common/Misc/OnOffSwitching/models.py @@ -1,4 +1,4 @@ -from __future__ import division +from __future__ import division, print_function __credits__ = """Author: Marco Buttu Licence: GPL 2.0 """ @@ -23,8 +23,8 @@ class Target(object): """Target information: orbital parameter and observer.""" try: self.source = ephem.readdb(op) - except Exception, e: - print "Unexpected exception: %s" %e + except Exception as e: + print("Unexpected exception: %s" %e) logging.exception('Got exception on pyephem') sys.exit() self.observer = observer diff --git a/Common/Misc/OnOffSwitching/onoff_switching.py b/Common/Misc/OnOffSwitching/onoff_switching.py index 04825188d..8f3a4c28e 100755 --- a/Common/Misc/OnOffSwitching/onoff_switching.py +++ b/Common/Misc/OnOffSwitching/onoff_switching.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function """ Author: Marco Buttu Licence: GPL 2.0 @@ -39,10 +40,10 @@ if __name__ == '__main__': upper_freq=170.6, # Backend upper frequency (MHz) calibrations=10, # Percentage of calibrations (10 means 10% of cycles) ) - except (TypeError, AttributeError), e: + except (TypeError, AttributeError) as e: print('CONFIGURATION ERROR: %s' %e) sys.exit(1) - except Exception, e: + except Exception as e: import traceback print('UNEXPECTED ERROR: %s' %e) traceback.print_tb(sys.exc_info()[2]) diff --git a/Common/Misc/OnOffSwitching/utils/test_tracking.py b/Common/Misc/OnOffSwitching/utils/test_tracking.py index b7af01970..08d9a47e4 100755 --- a/Common/Misc/OnOffSwitching/utils/test_tracking.py +++ b/Common/Misc/OnOffSwitching/utils/test_tracking.py @@ -25,7 +25,7 @@ while True: el_list.append(math.degrees(el)) time_list.append(getTimeStamp().value) time.sleep(0.05) - except KeyboardInterrupt, e: + except KeyboardInterrupt as e: break outfile = open('outfile.data', 'w') diff --git a/Common/Misc/PMUpdate/src/PMUpdate.py b/Common/Misc/PMUpdate/src/PMUpdate.py index 6200f2bfa..703b6784d 100644 --- a/Common/Misc/PMUpdate/src/PMUpdate.py +++ b/Common/Misc/PMUpdate/src/PMUpdate.py @@ -1,42 +1,41 @@ #! /usr/bin/env python +from __future__ import print_function -from upgrade_module import load_error_file_on_xml -import sys, getopt - -def main(argv): - errorfile = "" - pointingxmlfile = "" - receiver = "" - - try: - opts, args = getopt.getopt(argv,"hge:p:r:",["errorfile=", "pointingxmlfile=", "receiver="]) - except getopt.GetoptError: - print 'PMUpdate -e -p -r -g' - sys.exit(2) - for opt, arg in opts: - if opt == '-h': - print 'PMUpdate -e -p -r -g ' - sys.exit() - elif opt == "-g": - from PMUpdate_main import main as main_gui - main_gui() - sys.exit() - elif opt in ("-e", "--errorfile"): - errorfile = arg - elif opt in ("-p", "--pointingfile"): - pointingxmlfile = arg - elif opt in ("-r", "--receiver"): - receiver = arg - - if errorfile == "" or pointingxmlfile == "" or receiver == "": - print 'PMUpdate -e -p -r -g' - sys.exit("ERRORE: all parameters required") - - error_code , result = load_error_file_on_xml(errorfilename=errorfile, pointingxmlfilename=pointingxmlfile, receivername=receiver) - if error_code: - sys.exit("ERRORE: " + result) - -if __name__ == "__main__": - main(sys.argv[1:]) - - +from upgrade_module import load_error_file_on_xml +import sys, getopt + +def main(argv): + errorfile = "" + pointingxmlfile = "" + receiver = "" + + try: + opts, args = getopt.getopt(argv,"hge:p:r:",["errorfile=", "pointingxmlfile=", "receiver="]) + except getopt.GetoptError: + print('PMUpdate -e -p -r -g') + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print('PMUpdate -e -p -r -g ') + sys.exit() + elif opt == "-g": + from PMUpdate_main import main as main_gui + main_gui() + sys.exit() + elif opt in ("-e", "--errorfile"): + errorfile = arg + elif opt in ("-p", "--pointingfile"): + pointingxmlfile = arg + elif opt in ("-r", "--receiver"): + receiver = arg + + if errorfile == "" or pointingxmlfile == "" or receiver == "": + print('PMUpdate -e -p -r -g') + sys.exit("ERRORE: all parameters required") + + error_code , result = load_error_file_on_xml(errorfilename=errorfile, pointingxmlfilename=pointingxmlfile, receivername=receiver) + if error_code: + sys.exit("ERRORE: " + result) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/Common/Misc/PMUpdate/src/PMUpdate_main.py b/Common/Misc/PMUpdate/src/PMUpdate_main.py index ffb830c33..09487ab85 100644 --- a/Common/Misc/PMUpdate/src/PMUpdate_main.py +++ b/Common/Misc/PMUpdate/src/PMUpdate_main.py @@ -144,14 +144,14 @@ class Editor(QtGui.QMainWindow): qmsg.setText("errorfilename: new model section too short") qmsg.show() - if len(errorfilename_rows[0]) <> 7 or \ - len(errorfilename_rows[1]) <> 31 or \ - len(errorfilename_rows[2]) <> 5 or \ - len(errorfilename_rows[3]) <> 5 or \ - len(errorfilename_rows[4]) <> 5 or \ - len(errorfilename_rows[5]) <> 5 or \ - len(errorfilename_rows[6]) <> 5 or \ - len(errorfilename_rows[7]) <> 5: + if len(errorfilename_rows[0]) != 7 or \ + len(errorfilename_rows[1]) != 31 or \ + len(errorfilename_rows[2]) != 5 or \ + len(errorfilename_rows[3]) != 5 or \ + len(errorfilename_rows[4]) != 5 or \ + len(errorfilename_rows[5]) != 5 or \ + len(errorfilename_rows[6]) != 5 or \ + len(errorfilename_rows[7]) != 5: self.pdplt_file_status = False qmsg = QtGui.QMessageBox() qmsg.setIcon(QtGui.QMessageBox.Critical) diff --git a/Common/Misc/PMUpdate/src/upgrade_module.py b/Common/Misc/PMUpdate/src/upgrade_module.py index 26afbf083..dc6e6797f 100644 --- a/Common/Misc/PMUpdate/src/upgrade_module.py +++ b/Common/Misc/PMUpdate/src/upgrade_module.py @@ -1,4 +1,5 @@ # coding: utf-8 +from __future__ import print_function import os from shutil import copy2 from utility import convert_time_doy_to_string_format @@ -67,19 +68,19 @@ def load_error_file_on_xml(errorfilename, pointingxmlfilename, receivername): return (7, "errorfilename: new model section too short") - if len(errorfilename_rows[0]) <> 7 or \ - len(errorfilename_rows[1]) <> 31 or \ - len(errorfilename_rows[2]) <> 5 or \ - len(errorfilename_rows[3]) <> 5 or \ - len(errorfilename_rows[4]) <> 5 or \ - len(errorfilename_rows[5]) <> 5 or \ - len(errorfilename_rows[6]) <> 5 or \ - len(errorfilename_rows[7]) <> 5: + if len(errorfilename_rows[0]) != 7 or \ + len(errorfilename_rows[1]) != 31 or \ + len(errorfilename_rows[2]) != 5 or \ + len(errorfilename_rows[3]) != 5 or \ + len(errorfilename_rows[4]) != 5 or \ + len(errorfilename_rows[5]) != 5 or \ + len(errorfilename_rows[6]) != 5 or \ + len(errorfilename_rows[7]) != 5: return (8, "errorfilename: not enough parameters in new model section") try: newmodel_date = convert_time_doy_to_string_format(errorfilename_rows[0]) - except RuntimeError, e: + except RuntimeError as e: return (1001, "DOY convertion error: " + e.message) phi = errorfilename_rows[1][0] diff --git a/Common/Misc/PMUpdate/src/utility.py b/Common/Misc/PMUpdate/src/utility.py index 5e47801ba..b0ec5e06a 100644 --- a/Common/Misc/PMUpdate/src/utility.py +++ b/Common/Misc/PMUpdate/src/utility.py @@ -39,10 +39,10 @@ def DATE(DAY, YEAR): if Y == 0 and (DAY > 365 or DAY < 1): - raise RuntimeError, str(int(YEAR))+" Number of day less then 1 or more then 365" + raise RuntimeError(str(int(YEAR))+" Number of day less then 1 or more then 365") if Y == 1 and (DAY > 366 or DAY < 1): - raise RuntimeError, str(int(YEAR))+" Number of day less then 1 or more then 366" + raise RuntimeError(str(int(YEAR))+" Number of day less then 1 or more then 366") for N, M in enumerate(MONTH_LEN): if DAY > M: @@ -61,4 +61,4 @@ def DATE(DAY, YEAR): else: M_NUM = str(M_NUM) - return int(YEAR), int(M_NUM), int(DAY) \ No newline at end of file + return int(YEAR), int(M_NUM), int(DAY) diff --git a/Common/Misc/Plotter/src/plotter.py b/Common/Misc/Plotter/src/plotter.py index 568d2822e..8fa1445f2 100644 --- a/Common/Misc/Plotter/src/plotter.py +++ b/Common/Misc/Plotter/src/plotter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function # This is a python client that can be used to display value read from properties of a given # component @@ -186,65 +187,65 @@ class GraphThread(threading.Thread): time.sleep(self.data.sleepTime) def usage(): - print "plotter [-h|--help] [-l|--list] [-s|--sample val] [-g|--gap val] [-c|--call=val]" - print " [-Y|--yscale=val] [-X|--xscale=val] -y|--yaxe=val ComponentName" - print " " - print "[-h|--help] displays this help" - print "[-l|--list] list all the available components, then the program exits" - print "[-s|--sample=val] maximum number of samples in the plots, default is 300" - print "[-g|--gap=val] gap in milliseconds between two sample," - print " default value is 1000 milliseconds" - print "[-c|--call=val] name of an action of the component from which the values to be" - print " plotted are taken from. The pure name is required, no parentesis or" - print " anything else. The action must be of type void and so cannot retrurns values back." - print " Just one name can be provided at a time." - print "-y|--yaxe=val comma separated list of the names of component attributes" - print " that must be plotted along the Y axe. At least one item must be" - print " provided, but a maximum of three will be considered. if the -c option" - print " is provided this must be a comma separeted list of integers. Each integer" - print " indicates a parameter in the argument sequence of the function given with -c." - print " The value of that parameter is drawn in the plot. 0 represents the first parameter." - print " A maximum of three can be given." - print "[-x|--xaxe=val] the name of the component attribute that will be the value" - print " for the X axe. If not specified a sample counter will be adopted. In case of" - print " option -c an integer is expected as for -y option." - print "[-Y|--yscale=val] the value set here will be used as a scale factor for attributes " - print " plotted along the Y axis. The list must be comma separated, a maximum" - print " of three values is considered" - print "[-X|--xscale=val] the value set here will be used a scale factor for the X axis. If the special token" - print " 'time' is provided then the value is treated as time and it is formatted as milliseconds " - print " midnight of the the current day." - print "ComponentName this is the name of the component that must be loaded" + print("plotter [-h|--help] [-l|--list] [-s|--sample val] [-g|--gap val] [-c|--call=val]") + print( " [-Y|--yscale=val] [-X|--xscale=val] -y|--yaxe=val ComponentName") + print(" ") + print("[-h|--help] displays this help") + print("[-l|--list] list all the available components, then the program exits") + print("[-s|--sample=val] maximum number of samples in the plots, default is 300") + print("[-g|--gap=val] gap in milliseconds between two sample,") + print(" default value is 1000 milliseconds") + print("[-c|--call=val] name of an action of the component from which the values to be") + print(" plotted are taken from. The pure name is required, no parentesis or") + print(" anything else. The action must be of type void and so cannot retrurns values back.") + print(" Just one name can be provided at a time.") + print("-y|--yaxe=val comma separated list of the names of component attributes") + print(" that must be plotted along the Y axe. At least one item must be") + print(" provided, but a maximum of three will be considered. if the -c option") + print(" is provided this must be a comma separeted list of integers. Each integer") + print(" indicates a parameter in the argument sequence of the function given with -c.") + print(" The value of that parameter is drawn in the plot. 0 represents the first parameter.") + print(" A maximum of three can be given.") + print("[-x|--xaxe=val] the name of the component attribute that will be the value") + print(" for the X axe. If not specified a sample counter will be adopted. In case of") + print(" option -c an integer is expected as for -y option.") + print("[-Y|--yscale=val] the value set here will be used as a scale factor for attributes ") + print(" plotted along the Y axis. The list must be comma separated, a maximum" ) + print(" of three values is considered" ) + print("[-X|--xscale=val] the value set here will be used a scale factor for the X axis. If the special token") + print(" 'time' is provided then the value is treated as time and it is formatted as milliseconds ") + print(" midnight of the the current day.") + print("ComponentName this is the name of the component that must be loaded") def onlineUsage(): - print "help displays this help" - print "stop stops the automatic update of the plot" - print "start starts the automatic update of the plot" - print "clear clears the current plot" - print "exit exits this application" - print "save [filename] saves the plot into a ps file in the current working directory" - print "savefile [filename] saves the data into a text file in the current working directory" - print "" - print "Then all Gnuplot commands are accepted for example: " - print "set xrange [{x1}:{x2]] - changes the X axis ranges" - print "set yyange [{y1}:{y2}] - changes the Y axis ranges" - print "set autoscale - lets Gnuplot to choose the better scale" - print "set logscale - sets the logaritmic scale" - print "set ytics {value} - sets the spaces between tics in the Y axis" - print "set ytics auto - sets the spaces between tics automatically" - print "set xlabel ""{label}"" - sets the label for the X axis" - print "set style data {lines}{linespoints}{dots}{points} - sets the drawing style for the plot" - print "" - print "show ytics - shows the current configuration for the ytics" - print "unset ytics - resets the current configuration for the ytics" + print("help displays this help") + print("stop stops the automatic update of the plot") + print("start starts the automatic update of the plot") + print("clear clears the current plot") + print("exit exits this application") + print("save [filename] saves the plot into a ps file in the current working directory") + print("savefile [filename] saves the data into a text file in the current working directory") + print("") + print("Then all Gnuplot commands are accepted for example: ") + print("set xrange [{x1}:{x2]] - changes the X axis ranges") + print("set yyange [{y1}:{y2}] - changes the Y axis ranges") + print("set autoscale - lets Gnuplot to choose the better scale") + print("set logscale - sets the logaritmic scale") + print("set ytics {value} - sets the spaces between tics in the Y axis") + print("set ytics auto - sets the spaces between tics automatically") + print("set xlabel ""{label}"" - sets the label for the X axis") + print("set style data {lines}{linespoints}{dots}{points} - sets the drawing style for the plot") + print("") + print("show ytics - shows the current configuration for the ytics") + print("unset ytics - resets the current configuration for the ytics") def main(): try: opts, args = getopt.getopt(sys.argv[1:],"hls:g:y:x:Y:X:c:", ["help","list","sample=","gap=","yaxe=","xaxe=","yscale=","xscale=","call="]) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as err: + print(str(err)) usage() sys.exit(1) @@ -299,13 +300,13 @@ def main(): if list == True: #Lists all available components components = simpleClient.availableComponents() for cob in components: - print cob.name + " of type "+ cob.type + print(cob.name + " of type "+ cob.type) a = sys.__stdin__.readline() sys.exit(0) elif not len(args)==0: #if one component has been set... then run try: component=simpleClient.getComponent(args[0]) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(args[0]) newEx.log(ACS_LOG_ERROR) @@ -340,7 +341,7 @@ def main(): data.Y3 = f3() if not (fx == None): data.X = fx() - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl( exception=ex, create=1 ) newEx.setPropertyName("") newEx.log(ACS_LOG_ERROR) @@ -368,7 +369,7 @@ def main(): loop = GraphThread(data) loop.start() stop = False - print "" + print("") while not stop: command = raw_input("Command ( ? for help): ") a=command.split(" ") diff --git a/Common/Misc/Scripts/src/data_stats b/Common/Misc/Scripts/src/data_stats index 7b72d3332..3d6f7b5b5 100755 --- a/Common/Misc/Scripts/src/data_stats +++ b/Common/Misc/Scripts/src/data_stats @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function """ This script reads from the command line a list of directories and tries to find @@ -122,9 +123,9 @@ def console_app(): scan_list.sort(key=lambda x:x.start_time) if scan_list: - print "N\tSCANID\tSNAME\t\tREC\tSUBSCANS\tSTART TIME" + print("N\tSCANID\tSNAME\t\tREC\tSUBSCANS\tSTART TIME") for i,scan in enumerate(scan_list): - print str(i) + '\t' + str(scan) + print(str(i) + '\t' + str(scan)) if __name__ == "__main__": console_app() diff --git a/Common/Misc/Scripts/src/tabbify b/Common/Misc/Scripts/src/tabbify index 9e41bd839..395d9ebd1 100755 --- a/Common/Misc/Scripts/src/tabbify +++ b/Common/Misc/Scripts/src/tabbify @@ -39,7 +39,7 @@ def console_app(): else: logging.basicConfig(level=logging.INFO) if not args: - print usage + print(usage) sys.exit(0) else: filenames = [os.path.abspath(filename) for filename in args] diff --git a/Common/Misc/getTemplateForTests/src/getTemplateForTests b/Common/Misc/getTemplateForTests/src/getTemplateForTests index fcf4eb231..e26312e42 100644 --- a/Common/Misc/getTemplateForTests/src/getTemplateForTests +++ b/Common/Misc/getTemplateForTests/src/getTemplateForTests @@ -23,7 +23,7 @@ import gettemplatefortests args = sys.argv[1:] try: gettemplatefortests.command_line_util(args) -except Exception, e: - print e.message +except Exception as e: + print(e.message) sys.exit(1) diff --git a/Common/Misc/getTemplateForTests/src/gettemplatefortests.py b/Common/Misc/getTemplateForTests/src/gettemplatefortests.py index 02a5c168d..42f3e0894 100644 --- a/Common/Misc/getTemplateForTests/src/gettemplatefortests.py +++ b/Common/Misc/getTemplateForTests/src/gettemplatefortests.py @@ -32,12 +32,12 @@ def command_line_util(args): if len(args) == 1: arg = args.pop() if arg in ('--help', '-h'): - print usage + print(usage) sys.exit(0) else: target_dir = arg elif len(args) > 1: - print usage + print(usage) sys.exit(0) else: target_dir = 'tests' # Default target directory diff --git a/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py b/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py index 239419977..099156d30 100644 --- a/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py +++ b/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py @@ -65,7 +65,7 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): self._set_calibration(s, 1) self._set_input(s, channel, 0) self.current_backend = '' - except ComponentErrorsImpl.SocketErrorExImpl, ex: + except ComponentErrorsImpl.SocketErrorExImpl as ex: raise ex.getComponentErrorsEx() def calOff(self): @@ -75,18 +75,18 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): self._set_calibration(s, 0) self._set_input(s, channel, 0) self.current_backend = '' - except ComponentErrorsImpl.SocketErrorExImpl, ex: + except ComponentErrorsImpl.SocketErrorExImpl as ex: raise ex.getComponentErrorsEx() def _get_status(self, s): - return self._send_command(s, b'?\n') + return self._send_command(s, '?\n') def getChannel(self): try: with self.connection as s: channel, polarity, status = self._get_status(s) return channel - except ComponentErrorsImpl.SocketErrorExImpl, ex: + except ComponentErrorsImpl.SocketErrorExImpl as ex: raise ex.getComponentErrorsEx() def getPolarity(self): @@ -94,7 +94,7 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): with self.connection as s: channel, polarity, status = self._get_status(s) return polarity - except ComponentErrorsImpl.SocketErrorExImpl, ex: + except ComponentErrorsImpl.SocketErrorExImpl as ex: raise ex.getComponentErrorsEx() def getCalStatus(self): @@ -102,7 +102,7 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): with self.connection as s: channel, polarity, status = self._get_status(s) return bool(status) - except ComponentErrorsImpl.SocketErrorExImpl, ex: + except ComponentErrorsImpl.SocketErrorExImpl as ex: raise ex.getComponentErrorsEx() def _set_input(self, s, channel, polarity): @@ -137,9 +137,7 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): :param s: the socket on which the command will be sent :param command: the command to be sent to the device. """ - s.sendall(command) - -# time.sleep(0.1) + s.sendall(command.encode()) response = s.recv(1024) response = response.strip().split() diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py index 7c6890b30..f41d8a955 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py @@ -1,3 +1,4 @@ +from __future__ import print_function import time from math import radians from multiprocessing import Queue @@ -72,10 +73,10 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.control = Control() try: self.supplier = Supplier(Receivers.DEWAR_POSITIONER_DATA_CHANNEL) - except CORBAProblemExImpl, ex: + except CORBAProblemExImpl as ex: logger.logError('cannot create the dewar positioner data channel') logger.logDebug('cannot create the data channel: %s' %ex.message) - except Exception, ex: + except Exception as ex: reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message logger.logError(reason) @@ -86,10 +87,10 @@ class DewarPositionerImpl(POA, cc, services, lcycle): args=(self.positioner, self.supplier, self.control) ) self.statusThread.start() - except AttributeError, ex: + except AttributeError as ex: logger.logWarning('supplier not available') logger.logDebug('supplier not available: %s' %ex.message) - except Exception, ex: + except Exception as ex: logger.logError('cannot create the status thread: %s' %ex.message) def initialize(self): @@ -102,9 +103,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.statusThread.join(timeout=5) if self.statusThread.isAlive(): logger.logError('thread %s is alive' %self.statusThread.getName()) - except AttributeError, ex: + except AttributeError as ex: logger.logDebug('self has no attribute `supplier`: %s' %ex.message) - except Exception, ex: + except Exception as ex: logger.logError(ex.message) finally: self.control.stop = False @@ -117,13 +118,13 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.cdbconf.setup(self.commandedSetup) deviceName = self.cdbconf.getAttribute('DerotatorName') device = self.client.getComponent(deviceName) - except CannotGetComponentEx, ex: + except CannotGetComponentEx as ex: reason = "cannot get the %s component: %s" %(deviceName, ex.message) logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -135,7 +136,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): lat_obj = observatory._get_latitude() latitude_dec, compl = lat_obj.get_sync() latitude = radians(latitude_dec) - except Exception, ex: + except Exception as ex: reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message logger.logWarning('cannot get the site information: %s' %reason) latitude = radians(float(self.cdbconf.getAttribute('Latitude'))) @@ -161,19 +162,19 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.setRewindingMode(self.cdbconf.getAttribute('DefaultRewindingMode')) self.actualSetup = self.commandedSetup logger.logNotice('derotator %s setup done' %self.commandedSetup) - except PositionerError, ex: + except PositionerError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except ComponentErrors.ComponentErrorsEx, ex: + except ComponentErrors.ComponentErrorsEx as ex: data_list = ex.errorTrace.data # A list reason = data_list[0].value if data_list else 'component error' logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() @@ -189,12 +190,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): else: logger.logWarning('positioner not ready: a setup() is required') self.positioner.park() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -207,17 +208,17 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getPosition(self): try: return self.positioner.getPosition() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx), ex: + except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position") raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -227,12 +228,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getMaxLimit(self): try: return self.positioner.getMaxLimit() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -242,12 +243,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getMinLimit(self): try: return self.positioner.getMinLimit() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -257,17 +258,17 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getPositionFromHistory(self, t): try: return self.positioner.getPositionFromHistory(t) - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx), ex: + except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position at the time %s" %s) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -276,12 +277,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getCmdPosition(self): try: return self.positioner.getCmdPosition() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -291,12 +292,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def setPosition(self, position): try: self.positioner.setPosition(position) - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -353,17 +354,17 @@ class DewarPositionerImpl(POA, cc, services, lcycle): logger.logNotice('starting the derotator position updating') try: self.positioner.startUpdating(axis, sector, az, el, ra, dec) - except PositionerError, ex: + except PositionerError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl(ex.message) exc.setData('Reason', ex.message) @@ -373,12 +374,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): logger.logNotice('stopping the derotator position updating') try: self.positioner.stopUpdating() - except PositionerError, ex: + except PositionerError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -389,7 +390,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def setAutoRewindingSteps(self, steps): try: self.positioner.setAutoRewindingSteps(steps) - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) @@ -407,13 +408,13 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def rewind(self, steps): try: return self.positioner.rewind(steps) - except (PositionerError, NotAllowedError), ex: + except (PositionerError, NotAllowedError) as ex: reason = "cannot rewind the derotator: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -431,12 +432,12 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def getRewindingStep(self): try: return self.positioner.getRewindingStep() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -452,13 +453,13 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def isReady(self): try: return self.positioner.isReady() - except DerotatorErrors.CommunicationErrorEx, ex: + except DerotatorErrors.CommunicationErrorEx as ex: reason = "cannot known if the derotator is ready: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -467,13 +468,13 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def isSlewing(self): try: return self.positioner.isSlewing() - except DerotatorErrors.CommunicationErrorEx, ex: + except DerotatorErrors.CommunicationErrorEx as ex: reason = "cannot known if the derotator is slewing: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -482,13 +483,13 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def isTracking(self): try: return self.positioner.isTracking() - except DerotatorErrors.CommunicationErrorEx, ex: + except DerotatorErrors.CommunicationErrorEx as ex: reason = "cannot known if the derotator is tracking: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -500,18 +501,18 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def setOffset(self, offset): try: self.positioner.setOffset(offset) - except (PositionerError, NotAllowedError), ex: + except (PositionerError, NotAllowedError) as ex: reason = "cannot set the derotator offset: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -520,18 +521,18 @@ class DewarPositionerImpl(POA, cc, services, lcycle): def clearOffset(self): try: self.positioner.clearOffset() - except PositionerError, ex: + except PositionerError as ex: reason = "cannot set the derotator offset: %s" %ex.message logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() - except NotAllowedError, ex: + except NotAllowedError as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.NotAllowedExImpl() exc.setReason(ex.message) raise exc.getComponentErrorsEx() - except Exception, ex: + except Exception as ex: logger.logError(ex.message) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', ex.message) @@ -554,7 +555,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: mode = mode.upper().strip() self.positioner.setRewindingMode(mode) - except PositionerError, ex: + except PositionerError as ex: reason = 'cannot set the rewinding mode: %s' %ex.message logger.logError(reason) exc = ComponentErrorsImpl.ValidationErrorExImpl() @@ -582,7 +583,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.control.clearScanInfo() self.cdbconf.setConfiguration(confCode.upper()) - except Exception, ex: + except Exception as ex: reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() @@ -631,7 +632,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): ) supplier.publishEvent(simple_data=event) error = False - except Exception, ex: + except Exception as ex: reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message if not error: logger.logError('cannot publish the status: %s' %reason) @@ -655,7 +656,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): except ValueError: success = False answer = 'Error - invalid command: maybe there are too many symbols of =' - except Exception, ex: + except Exception as ex: success = False answer = ex.message else: @@ -689,7 +690,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: method = getattr(self, method_name) - except AttributeError, ex: + except AttributeError as ex: success = False answer = "Error - %s has no attribute %s" %(self, method_name) logger.logError(answer) @@ -702,25 +703,25 @@ class DewarPositionerImpl(POA, cc, services, lcycle): # >>> [type_(arg) for (arg, type_) in zip(args, types)] # [1, 'python', 3.5] # >>> def foo(a, b, c): - # ... print a, b, c + # ... print(a, b, c) # ... # >>> foo(*[type_(arg) for (arg, type_) in zip(args, types)]) # 1 python 3.5 answer = '' if result is None else str(result) success = True - except (ValueError, TypeError), ex: + except (ValueError, TypeError) as ex: success = False answer = 'Error - wrong parameter usage.\nType help(%s) for details' %command logger.logError('%s\n%s' %(ex.message, answer)) return (success, answer) - except ComponentErrors.ComponentErrorsEx, ex: + except ComponentErrors.ComponentErrorsEx as ex: success = False data_list = ex.errorTrace.data # A list reason = data_list[0].value if data_list else 'component error' answer = 'Error - %s' %reason logger.logError(answer) return (success, answer) - except Exception, ex: + except Exception as ex: success = False msg = ex.message if ex.message else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py index 8e7369d20..e0c3ec63b 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py @@ -217,7 +217,7 @@ class CDBConf(object): exc = ComponentErrorsImpl.ValidationErrorExImpl() exc.setReason(raeson) raise exc - except Exception, ex: + except Exception as ex: children = () setattr(self, dictName, {}) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py index 0feaa2b96..935a1dc74 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py @@ -30,9 +30,9 @@ class PosGenerator(object): """Return the parallactic angle""" try: latitude = siteInfo['latitude'] - except (KeyError, TypeError), ex: + except (KeyError, TypeError) as ex: raise PosGeneratorError('cannot get the latitude: %s' %ex.message) - except Exception, ex: + except Exception as ex: raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) @@ -59,7 +59,7 @@ class PosGenerator(object): except GeneratorExit: # Required in Python 2.5: # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ raise - except Exception, ex: + except Exception as ex: raeson = 'cannot get the %s (az, el) values' %source._get_name() logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) @@ -68,9 +68,9 @@ class PosGenerator(object): """Return the galactic parallactic angle""" try: latitude = siteInfo['latitude'] - except (KeyError, TypeError), ex: + except (KeyError, TypeError) as ex: raise PosGeneratorError('cannot get the latitude: %s' %ex.message) - except Exception, ex: + except Exception as ex: raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) @@ -97,7 +97,7 @@ class PosGenerator(object): except GeneratorExit: # Required in Python 2.5: # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ raise - except Exception, ex: + except Exception as ex: raeson = 'cannot get the %s (az, el) values' %source._get_name() logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py index f8dbc13f5..03fbc071b 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py @@ -59,9 +59,9 @@ class Positioner(object): self.control.updateScanInfo({'iStaticPos': setupPosition}) self._start(self.posgen.goto, setupPosition) time.sleep(0.1) # Give the thread the time to finish - except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx), ex: + except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: raise PositionerError("cannot set the position: %s" %ex.message) - except Exception, ex: + except Exception as ex: raise PositionerError(ex.message) finally: Positioner.generalLock.release() @@ -119,7 +119,7 @@ class Positioner(object): self.goTo(position) # Set the initialPosition, in order to add it to the dynamic one self.control.user_position = position - except Exception, ex: + except Exception as ex: raise PositionerError('cannot set the position: %s' %ex.message) @@ -128,11 +128,11 @@ class Positioner(object): if self.device.getMinLimit() < self.control.target < self.device.getMaxLimit(): try: self.device.setPosition(self.control.target) - except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx), ex: + except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: raeson = "cannot set the %s position" %self.device._get_name() logger.logError('%s: %s' %(raeson, ex.message)) raise PositionerError(raeson) - except Exception, ex: + except Exception as ex: raeson = "unknown exception setting the %s position" %self.device._get_name() logger.logError('%s: %s' %(raeson, ex.message)) raise PositionerError(raeson) @@ -206,7 +206,7 @@ class Positioner(object): ) self._start(posgen, self.source, self.siteInfo) self.control.mustUpdate = True - except Exception, ex: + except Exception as ex: raise PositionerError('configuration problem: %s' %ex.message) finally: Positioner.generalLock.release() @@ -241,13 +241,13 @@ class Positioner(object): self.control.scanInfo.update({'dParallacticPos': Pdp}) self._setPosition(target) # _setPosition() will add the offset time.sleep(float(self.conf.getAttribute('UpdatingTime'))) - except OutOfRangeError, ex: + except OutOfRangeError as ex: logger.logInfo(ex.message) self.control.isRewindingRequired = True if self.control.modes['rewinding'] == 'AUTO': try: self.rewind() - except Exception, ex: + except Exception as ex: # In case of wrong autoRewindingSteps self.control.isRewindingRequired = True logger.logError('cannot rewind: %s' %ex.message) @@ -261,18 +261,18 @@ class Positioner(object): time.sleep(0.1) # Wait until the user calls a rewind else: logger.logError('wrong rewinding mode: %s' %self.control.modes['rewinding']) - except Exception, ex: + except Exception as ex: logger.logError(ex.message) break self.control.mustUpdate = False except KeyboardInterrupt: logger.logInfo('stopping Positioner._updatePosition() due to KeyboardInterrupt') - except AttributeError, ex: + except AttributeError as ex: logger.logError('Positioner._updatePosition(): attribute error') logger.logDebug('Positioner._updatePosition(): %s' %ex.message) - except PositionerError, ex: + except PositionerError as ex: logger.logError('Positioner._updatePosition(): %s' %ex.message) - except Exception, ex: + except Exception as ex: logger.logError('unexcpected exception in Positioner._updatePosition(): %s' %ex) finally: self.control.scanInfo.update({'rewindingOffset': 0}) @@ -313,7 +313,7 @@ class Positioner(object): raise PositionerError('%ss exceeded' %self.conf.getAttribute('RewindingTimeout')) self.control.isRewindingRequired = False - except Exception, ex: + except Exception as ex: self.control.isRewindingRequired = True raise PositionerError(ex.message) finally: @@ -612,12 +612,12 @@ class Positioner(object): try: status_obj = self.device._get_status() - except Exception, ex: + except Exception as ex: raise PositionerError('cannot get the device status property: %s' %ex.message) try: device_status, compl = status_obj.get_sync() - except Exception, ex: + except Exception as ex: raise PositionerError('cannot get the device status value: %s' %ex.message) if compl.code: @@ -640,7 +640,7 @@ class Positioner(object): # 16 we want to get the string 010000 instead of 10000 try: binrepr = Status.dec2bin(device_status, 6) # A string of 6 values - except Exception, ex: + except Exception as ex: raise PositionerError('error in Status.dec2bin(): %s' %ex.message) po, f, ce, nr, s, w = [bool(int(item)) for item in reversed(binrepr)] @@ -662,9 +662,9 @@ class Positioner(object): status += '1' if self.isTracking() else '0' status += '1' if self.isReady() else '0' return status - except (NotAllowedError), ex: + except NotAllowedError as ex: return '000000' # Not ready - except Exception, ex: + except Exception as ex: logger.logError(ex.message) return '100000' # Failure finally: diff --git a/Common/Servers/PyDewarPositioner/src/derotatorPosition.py b/Common/Servers/PyDewarPositioner/src/derotatorPosition.py index 2d4f03b38..ceb42e3bd 100644 --- a/Common/Servers/PyDewarPositioner/src/derotatorPosition.py +++ b/Common/Servers/PyDewarPositioner/src/derotatorPosition.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +from __future__ import print_function from Acspy.Clients.SimpleClient import PySimpleClient from Acspy.Common.TimeHelper import getTimeStamp @@ -17,6 +18,6 @@ while True: t = getTimeStamp().value + 1*10*6 # 100 ms in the future az, el = antenna.getRawCoordinates(t) # Values in radians parallactic = PosGenerator.getParallacticAngle(latitude, az, el) - print "%d -> %.2f -- parallactic: %.2f" %(counter, position, parallactic) + print("%d -> %.2f -- parallactic: %.2f" %(counter, position, parallactic)) counter += 1 time.sleep(3) diff --git a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py index ba65b47e8..f900f3c36 100644 --- a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py +++ b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py @@ -1,3 +1,4 @@ +from __future__ import print_function import socket import time @@ -28,8 +29,8 @@ class CommandLine: try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - except socket.error , msg: - print msg + except socket.error as msg: + print(msg) self.sock=None def __del__(self): @@ -48,9 +49,9 @@ class CommandLine: msg ='OK' self.sendCmd('*CLS\n') return msg - except socket.error , msg: - print msg - print "connect error: " ,msg + except socket.error as msg: + print(msg) + print("connect error: " ,msg) return msg def init(self,reply): @@ -69,8 +70,8 @@ class CommandLine: return msg,err - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg,False self.sock=None @@ -83,19 +84,19 @@ class CommandLine: commands=msg.split(';') val=int(commands[0])# unit is MHZ, err_msg=commands[1] - print "query err",msg + print("query err",msg) if err_msg != '0,\"No error\"\n': - print "exception",err_msg + print("exception",err_msg) raise CommandLineError(err_msg) return err_msg,val - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg,-1 self.sock=None - except CommandLineError,msg: + except CommandLineError as msg: raise - except ValueError,msg: + except ValueError as msg: raise CommandLineError(msg) @@ -111,8 +112,8 @@ class CommandLine: return msg,err - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg,False self.sock=None @@ -125,19 +126,19 @@ class CommandLine: commands=msg.split(';') val=int(commands[0])/1e6 # unit is MHZ, err_msg=commands[1] - print "query err",msg + print("query err",msg) if err_msg != '0,\"No error\"\n': - print "exception",err_msg + print("exception",err_msg) raise CommandLineError(err_msg) return err_msg,val - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg,-1 self.sock=None - except CommandLineError,msg: + except CommandLineError as msg: raise - except ValueError,msg: + except ValueError as msg: raise CommandLineError(msg) def readStatus(self): @@ -147,13 +148,13 @@ class CommandLine: try: msg=self.query(QUERYERROR) - print "query err",msg + print("query err",msg) if msg != '0,\"No error\"\n': - print "exception",msg + print("exception",msg) raise CommandLineError(msg) return msg - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg def rfOn(self): @@ -168,11 +169,11 @@ class CommandLine: def sendCmd(self,msg): try: - self.sock.sendall(msg) + self.sock.sendall(msg.encode()) return True - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) raise msg self.sock=None return False @@ -183,17 +184,17 @@ class CommandLine: def query(self,cmd): try: - self.sock.sendall(cmd) + self.sock.sendall(cmd.encode()) msg = self.sock.recv(1024) - print 'query:received:',msg + print('query:received:',msg) return msg - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) raise return msg - \ No newline at end of file + diff --git a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillator.py b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillator.py index 7a4f9f63f..e691625f3 100644 --- a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillator.py +++ b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillator.py @@ -47,6 +47,7 @@ # #------------------------------------------------------------------------ # +from __future__ import print_function import time from math import radians @@ -118,7 +119,7 @@ class LocalOscillator(Receivers__POA.LocalOscillator, CharacteristicComponent, C logger.logNotice('SYNT FREQ set to %f ' %self.freq) logger.logNotice('SYNT POWER set to %f ' %self.power) - except CommandLine.CommandLineError,ex : + except CommandLine.CommandLineError as ex : logger.logError(ex,message) @@ -134,8 +135,8 @@ class LocalOscillator(Receivers__POA.LocalOscillator, CharacteristicComponent, C msg,power=self.cl.getPower() msg,freq= self.cl.getFrequency() - print power - print freq + print(power) + print(freq) return (power,freq) def rfon(self): @@ -148,4 +149,4 @@ class LocalOscillator(Receivers__POA.LocalOscillator, CharacteristicComponent, C def getInternalFrequency(self): return self.freq - \ No newline at end of file + diff --git a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/devios.py b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/devios.py index ce1b7542d..36845131a 100644 --- a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/devios.py +++ b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/devios.py @@ -1,6 +1,6 @@ from ACSImpl.DevIO import DevIO from math import fabs -from CommandLine import CommandLineError +from LocalOscillatorImpl.CommandLine import CommandLineError from IRAPy import logger SYNTH_TOLLERANCE = 1. @@ -38,14 +38,14 @@ class frequencyDevIO(DevIO): try: msg,value=self.cl.getFrequency() return value - except CommandLineError, ex: + except CommandLineError as ex: success = False msg = ex.message if ex.message else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) logger.logError(answer) return 0 - except Exception, ex: + except Exception as ex: success = False msg = ex.message if ex.message else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) @@ -73,14 +73,14 @@ class isLockedDevIO(DevIO): return 1 else: return 0 - except CommandLineError, ex: + except CommandLineError as ex: success = False msg = ex.message if ex.message else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) logger.logError(answer) return 0 - except Exception, ex: + except Exception as ex: success = False msg = ex.message if ex.message else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) diff --git a/Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/AntennaBossSimImpl.py b/Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/AntennaBossSimImpl.py index 2edd7a682..2e27276db 100644 --- a/Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/AntennaBossSimImpl.py +++ b/Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/AntennaBossSimImpl.py @@ -100,7 +100,7 @@ class History(object): self.history.append(data) self.history.sort(key=operator.itemgetter(0)) self.history = self.history[-2**15:] # Last 2**15 positions - # print 'position inserted in the history: ', position + # print('position inserted in the history: ', position) def clean(self, since=0): target_time = since if since else getTimeStamp().value diff --git a/Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/board_server.py b/Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/board_server.py index 246dc79d5..836a2b9f6 100755 --- a/Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/board_server.py +++ b/Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/board_server.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # Author: Marco Buttu +from __future__ import print_function """ This module defines a dummy server. @@ -99,9 +100,9 @@ class BoardServer: self.s.bind((self.host, self.port)) self.s.listen(1) # Display a welcome message - print "*"*40 - print "BoardServer - Waiting for connections..." - print "*"*40 + print("*"*40) + print("BoardServer - Waiting for connections...") + print("*"*40) # Number of connections counter counter = 0 @@ -111,7 +112,7 @@ class BoardServer: try: connection, clientaddr = self.s.accept() counter += 1 - print "\n%d. Got connection from %s" %(counter, connection.getpeername()) + print("\n%d. Got connection from %s" %(counter, connection.getpeername())) except KeyboardInterrupt: raise except: @@ -148,8 +149,8 @@ class BoardServer: if(data): if len(data) > 1: for c in data: - print hex(ord(c)), - print + print(hex(ord(c))) + print() # print "\nReceived message from %s: %r" % (connection.getpeername(), # binhex.binascii.hexlify(data)) # Initialize the answer with a wrong message @@ -159,7 +160,7 @@ class BoardServer: if CMD_TYPE_MIN_EXT > data[CMD_IDX] or data[CMD_IDX] > CMD_TYPE_MAX_ABB: # The last byte, 0x01, is the execution result of an "unknow command" answer = "".join([CMD_STX, data[2], data[1], data[3], data[4], chr(0x01)]) - print "Sending message: %r" %binhex.binascii.hexlify(answer) + print("Sending message: %r" %binhex.binascii.hexlify(answer)) connection.send(answer) continue elif data[CMD_IDX] >= CMD_TYPE_MIN_ABB: @@ -204,7 +205,7 @@ class BoardServer: answer += chr(checksum) answer += CMD_ETX - print "Sending message: %r" %binhex.binascii.hexlify(answer) + print("Sending message: %r" %binhex.binascii.hexlify(answer)) connection.send(answer) except: raise @@ -238,7 +239,7 @@ class BoardServer: break except: break - print "Reaped process %d" % result[0] + print("Reaped process %d" % result[0]) if __name__ == "__main__": diff --git a/Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/TCPServer.py b/Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/TCPServer.py index 936357e8f..562c26ecf 100755 --- a/Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/TCPServer.py +++ b/Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/TCPServer.py @@ -1,5 +1,6 @@ #!/usr/bin/env python # Author: Andrea Orlati +from __future__ import print_function # **************************************************************************************************** # DISCOS Project @@ -67,14 +68,14 @@ class TCPServer: self.s.bind((self.host, self.simPort)) self.s.listen(1) - print "*"*40 - print "TCPServer - Waiting for connections from %s port %d..." % (self.host,self.simPort) - print "Valid commands are: %s" % (self.command) - print "*"*40 + print("*"*40) + print("TCPServer - Waiting for connections from %s port %d..." % (self.host,self.simPort)) + print("Valid commands are: %s" % (self.command)) + print("*"*40) error=False try: connection, clientaddr = self.s.accept() - print "Got connection from %s port %d" % (connection.getpeername()) + print("Got connection from %s port %d" % (connection.getpeername())) except KeyboardInterrupt: raise except: @@ -96,7 +97,7 @@ class TCPServer: break answer=self.defaultAnswer if(data): - #print "Received: %s" % data + #print("Received: %s" % data) if self.terminator!=32: termPos=data.find(chr(self.terminator)) if termPos>0: @@ -106,7 +107,7 @@ class TCPServer: answer=self.answer[index] else: pass - #print "Sending message: %s" % (answer) + #print("Sending message: %s" % (answer)) connection.send(answer) except KeyboardInterrupt: raise @@ -115,12 +116,12 @@ class TCPServer: finally: connection.close() - print "Exiting...." + print("Exiting....") sys.exit(0) @staticmethod def stop(): - print "shutdown by external command..." + print("shutdown by external command...") stop_server.value = True if __name__ == "__main__": diff --git a/Medicina/Misc/MedScripts/src/medsubr.py b/Medicina/Misc/MedScripts/src/medsubr.py index 089f68eda..a7a973426 100644 --- a/Medicina/Misc/MedScripts/src/medsubr.py +++ b/Medicina/Misc/MedScripts/src/medsubr.py @@ -29,7 +29,7 @@ def main(): #get the antennaBoss component try: antennaBoss=simpleClient.getComponent(antennaBossInstance) - except Exception , ex: + except Exception as ex: simpleClient.getLogger().logError("Error in retriving antennaBoss component"); simpleClient.disconnect() sys.exit(-1) @@ -38,7 +38,7 @@ def main(): try: mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mySocket.connect((Address,Port)) - except socket.error, (value,message): + except socket.error as (value,message): simpleClient.getLogger().logError("socket error: %s" % message) simpleClient.releaseComponent(antennaBossInstance) simpleClient.disconnect() @@ -47,7 +47,7 @@ def main(): try: elProp=antennaBoss._get_rawElevation() azProp=antennaBoss._get_rawAzimuth() - except Exception, ex: + except Exception as ex: simpleClient.getLogger().logError("Can't read antennaBoss properties") simpleClient.releaseComponent(antennaBossInstance) mySlocket.close() @@ -70,7 +70,7 @@ def main(): sendBuffer="current=0,0,%lf,%lf\n" % (az,el) try: mySocket.send(sendBuffer) - except socket.error, (value,message): + except socket.error as (value,message): simpleClient.getLogger().logError("Send error: %s" % message) simpleClient.releaseComponent(antennaBossInstance) mySocket.close() @@ -91,4 +91,4 @@ def main(): if __name__=="__main__": - main() \ No newline at end of file + main() diff --git a/Medicina/Misc/MedScripts/src/setupccc.py b/Medicina/Misc/MedScripts/src/setupccc.py index 212eeb656..6a062bbe4 100644 --- a/Medicina/Misc/MedScripts/src/setupccc.py +++ b/Medicina/Misc/MedScripts/src/setupccc.py @@ -28,7 +28,7 @@ def main(): REC_CODE = "CCC" try: antennaBoss=simpleClient.getDefaultComponent(antennaBossType) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(antennaBossType) #ACS_LOG_ERROR @@ -38,7 +38,7 @@ def main(): #setup the telescope: prepare it for movement try: antennaBoss.setup(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("AntennaBoss/setup()") #ACS_LOG_ERROR @@ -50,7 +50,7 @@ def main(): #setup the receiver try: receiversBoss=simpleClient.getDefaultComponent(receiversBossType) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(receiversBossType) #ACS_LOG_ERROR @@ -59,7 +59,7 @@ def main(): sys.exit(-1) try: receiversBoss.setup(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("ReceiversBoss/setup()") #ACS_LOG_ERROR @@ -70,7 +70,7 @@ def main(): try: totalPowerBackend= simpleClient.getComponent(totalPowerBackendName) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(receiversBossType) #ACS_LOG_ERROR @@ -79,7 +79,7 @@ def main(): sys.exit(-1) try: totalPowerBackend.initialize(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("TotalPower/initialize()") #ACS_LOG_ERROR @@ -90,7 +90,7 @@ def main(): try: antennaBoss.setHPBW(HPBW) - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("AntennaBoss/setHPBW") #ACS_LOG_ERROR diff --git a/Medicina/Misc/MedScripts/src/setupkkc.py b/Medicina/Misc/MedScripts/src/setupkkc.py index b6eb27730..17f910dbe 100644 --- a/Medicina/Misc/MedScripts/src/setupkkc.py +++ b/Medicina/Misc/MedScripts/src/setupkkc.py @@ -28,7 +28,7 @@ def main(): REC_CODE = "KKC" try: antennaBoss=simpleClient.getDefaultComponent(antennaBossType) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(antennaBossType) #ACS_LOG_ERROR @@ -38,7 +38,7 @@ def main(): #setup the telescope: prepare it for movement try: antennaBoss.setup(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("AntennaBoss/setup()") #ACS_LOG_ERROR @@ -50,7 +50,7 @@ def main(): #setup the receiver try: receiversBoss=simpleClient.getDefaultComponent(receiversBossType) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(receiversBossType) #ACS_LOG_ERROR @@ -59,7 +59,7 @@ def main(): sys.exit(-1) try: receiversBoss.setup(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("ReceiversBoss/setup()") #ACS_LOG_ERROR @@ -70,7 +70,7 @@ def main(): try: totalPowerBackend= simpleClient.getComponent(totalPowerBackendName) - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(receiversBossType) #ACS_LOG_ERROR @@ -79,7 +79,7 @@ def main(): sys.exit(-1) try: totalPowerBackend.initialize(REC_CODE); - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("TotalPower/initialize()") #ACS_LOG_ERROR @@ -90,7 +90,7 @@ def main(): try: antennaBoss.setHPBW(HPBW) - except Exception, ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntPerformActionExImpl( exception=ex, create=1 ) newEx.setAction("AntennaBoss/setHPBW") #ACS_LOG_ERROR diff --git a/Medicina/Servers/MedicinaPyLocalOscillator/src/MedicinaLocalOscillatorImpl/CommandLine.py b/Medicina/Servers/MedicinaPyLocalOscillator/src/MedicinaLocalOscillatorImpl/CommandLine.py index b48fb3f94..cf59f98d6 100644 --- a/Medicina/Servers/MedicinaPyLocalOscillator/src/MedicinaLocalOscillatorImpl/CommandLine.py +++ b/Medicina/Servers/MedicinaPyLocalOscillator/src/MedicinaLocalOscillatorImpl/CommandLine.py @@ -1,3 +1,4 @@ +from __future__ import print_function import socket import time from MedicinaLocalOscillatorImpl import CommandLineError @@ -107,7 +108,7 @@ class CommandLine: cmd=RF_ON_CMD #can rise an error.... answer=self.sendCmd(cmd) - print answer + print(answer) if answer!=RF_ON_ANS_OK: nak,err=answer.split() message="an error occurred, the code is %d"%err @@ -129,14 +130,14 @@ class CommandLine: if self.check(): try: self.sock.sendall(msg) - except socket.error,msg: + except socket.error as msg: slef.close() exc=CommandLineError(msg); raise exc try: ans=self.sock.recv(128) return ans - except socket.error,msg: + except socket.error as msg: self.close() exc=CommandLineError(msg); raise exc @@ -148,7 +149,7 @@ class CommandLine: try: if self.sock==None: self.sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) - except socket.error,msg: + except socket.error as msg: exc=CommandLineError(msg); self.sock=None raise exc @@ -165,7 +166,7 @@ class CommandLine: if self.connected==False: self.sock.connect((self.ip,self.port)) self.connected=True - except socket.error, msg: + except socket.error as msg: exc=CommandLineError(msg); raise exc @@ -179,4 +180,4 @@ class CommandLine: - \ No newline at end of file + diff --git a/Noto/Misc/NotoScripts/src/peakf.py b/Noto/Misc/NotoScripts/src/peakf.py index 98d346ca9..7c5316ad2 100644 --- a/Noto/Misc/NotoScripts/src/peakf.py +++ b/Noto/Misc/NotoScripts/src/peakf.py @@ -3,6 +3,7 @@ # This is a python program that allow to maximize the focus for Noto subreflector #who when what #Andrea Orlati(a.orlati@ira.inaf.it) 24/01/2017 Creation +from __future__ import print_function import getopt, sys @@ -27,21 +28,21 @@ from math import * import os def usage(): - print "subrOff [-h|--help] [-a axis] [-y val] [-z val] [-s val] [-p val]" - print "" - print "[-h|--help] displays this help" - print "[-a axis] scu axis to be moved, currently supported Z, Y, Default Z." - print "[-y val] central offset of Y axis. Default 0.0" - print "[-z val] central offset of Z axis. Default 0.0" - print "[-s val] span in millimeters. Default 40.0" - print "[-p val] number of samples. Default 13" + print("subrOff [-h|--help] [-a axis] [-y val] [-z val] [-s val] [-p val]") + print("") + print("[-h|--help] displays this help") + print("[-a axis] scu axis to be moved, currently supported Z, Y, Default Z.") + print("[-y val] central offset of Y axis. Default 0.0") + print("[-z val] central offset of Z axis. Default 0.0") + print("[-s val] span in millimeters. Default 40.0") + print("[-p val] number of samples. Default 13") def main(): try: opts, args = getopt.getopt(sys.argv[1:],"ha:y:z:c:s:p:",["help"]) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as err: + print(str(err)) usage() sys.exit(1) @@ -69,7 +70,7 @@ def main(): axis.upper() if not((axis=="Z") or (axis=="Y")): - print "currently supported axis are Y and Z" + print("currently supported axis are Y and Z") sys.exit(1) #get the link to the SRTmountcomponent @@ -79,35 +80,35 @@ def main(): try: antennaComponent=simpleClient.getDefaultComponent(antType) antennaCompName=antennaComponent._get_name() - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(antType) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) - print "Antenna boss retrieved" + print("Antenna boss retrieved") tpCompName="" tpInst = "BACKENDS/TotalPower" try: tpComponent=simpleClient.getComponent(tpInst) tpCompName=tpComponent._get_name() - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(tpCompName) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) - print "Total power retrieved" + print("Total power retrieved") - print "Preparing pipe....." + print("Preparing pipe.....") if not os.path.exists(pipeName): - print "Creating pipe" + print("Creating pipe") os.mkfifo(pipeName,0777) - print "Created" + print("Created") else: - print "pipe already exists" + print("pipe already exists") - print "Opening pipe......" + print("Opening pipe......") pipeOut=open(pipeName,'w', 0) - print "Pipe openened for writing......" + print("Pipe openened for writing......") bdf=-0.0036 @@ -125,9 +126,9 @@ def main(): axisPos=centerZ+i*millis pipeString="0.0,%lf,%lf"%(centerY,axisPos) pipeOut.write(pipeString) - except Exception, ex: - print "Error in sending commant to scu" - print ex + except Exception as ex: + print("Error in sending commant to scu") + print(ex) sys.exit(1) try: if axis=="Y": @@ -135,20 +136,20 @@ def main(): else: pass #antennaComponent.setOffsets(math.radians(0.0),math.radians(centerY*bdf),Antenna.ANT_HORIZONTAL) - except Excpetion,ex: - print "Error while sending offset to the telescope" - print ex + except Excpetion as ex: + print("Error while sending offset to the telescope") + print(ex) sys.exit(1) time.sleep(8) try: samples1=tpComponent.getTpi() samples2=tpComponent.getTpi() except: - print "error reading total power measurement" - print ex + print("error reading total power measurement") + print(ex) sys.exit(1) sample=(samples1[1]+samples2[1])/2.0 - print "Lettura %lf,%lf"%(axisPos,sample) + print("Lettura %lf,%lf"%(axisPos,sample)) finally: if not (antennaCompName==""): @@ -160,7 +161,3 @@ def main(): if __name__=="__main__": main() - - - - diff --git a/Noto/Misc/NotoScripts/src/subr.py b/Noto/Misc/NotoScripts/src/subr.py index 1bb57ded3..87bc9f098 100644 --- a/Noto/Misc/NotoScripts/src/subr.py +++ b/Noto/Misc/NotoScripts/src/subr.py @@ -3,6 +3,7 @@ # This is a python test program that refresh the Noto minor servo system #who when what #Andrea Orlati(a.orlati@ira.inaf.it) 02/12/2016 Creation +from __future__ import print_function import getopt, sys import Acspy.Common.Err @@ -27,32 +28,32 @@ offsets=[0.0,0.0,0.0,0.0,0.0] exitFlag=False def readPipe(pipeName): - print "Opening pipe......" + print("Opening pipe......") pipeIn=os.open(pipeName,os.O_RDONLY|os.O_NONBLOCK) - print "Pipe opened for reading......" + print("Pipe opened for reading......") while not exitFlag: try: pipeString=os.read(pipeIn,64) if len(pipeString)>0: - print "received offsets %s"%pipeString + print("received offsets %s"%pipeString) info=pipeString.split(',') - print info + print(info) offsets[0]=float(info[0]) offsets[1]=float(info[1]) offsets[2]=float(info[2]) offsets[3]=float(info[2]) offsets[4]=float(info[2]) time.sleep(1) - except Exception, ex: + except Exception as ex: pass - #print ex + #print(ex) os.close(pipeIn) def usage(): - print "subr [-h|--help] [-c|--code=]" - print "" - print "[-h|--help] displays this help" - print "[-c|--code=] select the setup code" + print("subr [-h|--help] [-c|--code=]") + print("") + print("[-h|--help] displays this help") + print("[-c|--code=] select the setup code") def sendData(socket,msg): length=len(msg) @@ -63,8 +64,8 @@ def main(): try: opts, args = getopt.getopt(sys.argv[1:],"hc:",["help","code="]) - except getopt.GetoptError, err: - print str(err) + except getopt.GetoptError as err: + print(str(err)) usage() sys.exit(1) @@ -83,7 +84,7 @@ def main(): elif o in ("-c", "--code"): code = a - print "The code is %s" % code + print("The code is %s" % code) if code=="QQC": polX[0]=0.0 @@ -148,21 +149,21 @@ def main(): minZ3=-85 else: - print "Unknown code" + print("Unknown code") sys.exit(1); - print "Preparing pipe....." + print("Preparing pipe.....") if not os.path.exists(pipeName): - print "Creating pipe" + print("Creating pipe") os.mkfifo(pipeName,0777) - print "Created" + print("Created") else: - print "pipe already exists" + print("pipe already exists") try: pipeThread=thread.start_new_thread(readPipe,(pipeName, ) ) - except Exception,ex: - print ex + except Exception as ex: + print(ex) sys.exit(1) #get the link to the SRTmountcomponent @@ -172,18 +173,18 @@ def main(): try: component=simpleClient.getDefaultComponent(compType) compName=component._get_name() - except Exception , ex: + except Exception as ex: newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) newEx.setComponentName(compType) newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) sys.exit(1) - print "Antenna boss retrieved" + print("Antenna boss retrieved") client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('192.167.187.92', 5003)) - print "socket connected" + print("socket connected") time.sleep(2) try: @@ -191,10 +192,10 @@ def main(): ctime=getTimeStamp().value try: az,el=component.getRawCoordinates(ctime) - except Exception , ex: - print "Errore nella lettura della posizione" + except Exception as ex: + print("Errore nella lettura della posizione") delev=degrees(el) - print el,delev + print(el,delev) posX=polX[0]*delev*delev+polX[1]*delev+polX[2] posY=polY[0]*delev*delev+polY[1]*delev+polY[2] posZ1=polZ1[0]*delev*delev+polZ1[1]*delev+polZ1[2] @@ -226,13 +227,13 @@ def main(): if posZ3> sys.stderr, answerstr.replace(","," ") + print(answerstr.replace(","," "), file=sys.stderr) if __name__=="__main__": diff --git a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py index 801eb4387..b9b658198 100644 --- a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py +++ b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py @@ -1,3 +1,4 @@ +from __future__ import print_function import socket import time import decimal @@ -47,7 +48,7 @@ class CommandLine: try: if self.sock==None: self.sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) - except socket.error,msg: + except socket.error as msg: self.sock=None return False return True @@ -66,7 +67,7 @@ class CommandLine: self.connected=True self.sock.sendall('*CLS\n;SYST:ERR?\n++read\n') msg=self.sock.recv(1024) - except socket.error, msg: + except socket.error as msg: self.close() return False return True @@ -149,13 +150,13 @@ class CommandLine: try: msg=self.query(QUERYERROR) - print "query err",msg + print("query err",msg) if msg != '0,\"No error\"\n': - print "exception",msg + print("exception",msg) raise CommandLineError(msg) return msg - except socket.error , msg: - print "connect error: " ,msg + except socket.error as msg: + print("connect error: " ,msg) return msg def rfOn(self): @@ -169,7 +170,7 @@ class CommandLine: if self.check(): try: self.sock.sendall(cmd) - except socket.error,msg: + except socket.error as msg: self.close() return False,msg return True,msg @@ -181,12 +182,12 @@ class CommandLine: if self.check(): try: self.sock.sendall(cmd+'\n++read\n') - except socket.error,msg: + except socket.error as msg: self.close() return False,msg try: msg=self.sock.recv(1024) - except socket.error,msg: + except socket.error as msg: self.close() return False,msg if len(msg)==0: @@ -198,4 +199,4 @@ class CommandLine: - \ No newline at end of file + diff --git a/SRT/Misc/SRTScripts/src/receiversmonitor.py b/SRT/Misc/SRTScripts/src/receiversmonitor.py index c4ff14573..498f18bc1 100755 --- a/SRT/Misc/SRTScripts/src/receiversmonitor.py +++ b/SRT/Misc/SRTScripts/src/receiversmonitor.py @@ -1,4 +1,5 @@ #! /usr/bin/env python +from __future__ import print_function import logging import time @@ -12,8 +13,8 @@ from Acspy.Util.ACSCorba import getManager process = os.path.basename(__file__) # Exit in case the user try to run the script on nuraghe-mng #if 'nuraghe-mng' in os.getenv('HOST'): -# print 'ERROR: you can not execute %s on this machine.' % process -# print 'Please, read the SD manual!' +# print('ERROR: you can not execute %s on this machine.' % process) +# print('Please, read the SD manual!') # sys.exit(0) # Exit in case the process is already running @@ -26,7 +27,7 @@ for line in running_processes.split('\n'): # else: counter += 1 if counter > 1: - print '%s already running, everything is OK' % process + print('%s already running, everything is OK' % process) sys.exit(0) #LOGDIR = os.path.join('service','receivers') @@ -34,7 +35,7 @@ LOGDIR ='/service/receivers' FILENAME = os.path.join(LOGDIR,'receivers.log') dirname=os.path.dirname(LOGDIR) if not os.path.exists(dirname): - print 'ERROR: target folder does not exists, check %s' % LOGDIR + print('ERROR: target folder does not exists, check %s' % LOGDIR) sys.exit(-1) logging.basicConfig( @@ -88,7 +89,7 @@ while True: except KeyboardInterrupt: logging.info('program closed by the user') raise - except Exception, ex: + except Exception as ex: pass finally: try: -- GitLab From 02f45c5f3d8922f3d6db70c7d22308d4f78441a3 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 26 Jul 2022 14:05:10 +0200 Subject: [PATCH 004/150] Fix #720, fixed some socket.recv function --- .../PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py index f900f3c36..51a794157 100644 --- a/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py +++ b/Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py @@ -185,7 +185,7 @@ class CommandLine: def query(self,cmd): try: self.sock.sendall(cmd.encode()) - msg = self.sock.recv(1024) + msg = self.sock.recv(1024).decode() print('query:received:',msg) return msg -- GitLab From 25c47227749c7388022163ebc9d68b8897c7f50b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 27 Jul 2022 14:52:00 +0200 Subject: [PATCH 005/150] Fix #733, updated all TextClients (#734) * Fix #733, updated all TextClients * Fix #733, updated the Client.cpp.template as requested --- .../src/AntennaBossTextClient.cpp | 25 ++++++++----------- .../src/BackendClient.cpp | 25 ++++++++----------- .../src/MinorServoBossTextClient.cpp | 25 ++++++++----------- .../src/ObservatoryTextClient.cpp | 25 ++++++++----------- .../src/ReceiversBossTextClient.cpp | 25 ++++++++----------- .../src/SchedulerTuiClient.cpp | 25 ++++++++----------- .../templates/Client.cpp.template | 25 ++++++++----------- .../src/MedicinaMountTextClient.cpp | 25 ++++++++----------- .../src/SRTMountTextClient.cpp | 24 +++++++----------- 9 files changed, 89 insertions(+), 135 deletions(-) diff --git a/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp index 26bfb465c..616ab7337 100644 --- a/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp +++ b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp @@ -201,21 +201,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); diff --git a/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp b/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp index 449994f68..41a1b553d 100644 --- a/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp +++ b/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp @@ -237,21 +237,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_COMPONENENT: %s",COMPONENT_NAME)); try { diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp index b76fb6946..9f490e5ba 100644 --- a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -216,21 +216,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); try { diff --git a/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp b/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp index fb9f3cf2f..f5000b561 100644 --- a/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp +++ b/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp @@ -191,21 +191,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); try { diff --git a/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp b/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp index ab6446942..bbc1faa0f 100644 --- a/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp +++ b/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp @@ -265,21 +265,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); try { diff --git a/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp b/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp index 248b9846b..52618021e 100644 --- a/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp +++ b/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp @@ -190,21 +190,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); try { diff --git a/Common/Libraries/TextWindowLibrary/templates/Client.cpp.template b/Common/Libraries/TextWindowLibrary/templates/Client.cpp.template index b5d43cf97..d42cd8c28 100644 --- a/Common/Libraries/TextWindowLibrary/templates/Client.cpp.template +++ b/Common/Libraries/TextWindowLibrary/templates/Client.cpp.template @@ -166,21 +166,16 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_COMPONENENT: %s",COMPONENT_NAME)); try { diff --git a/Medicina/Clients/MedicinaMountTextClient/src/MedicinaMountTextClient.cpp b/Medicina/Clients/MedicinaMountTextClient/src/MedicinaMountTextClient.cpp index ed6a0c9c6..228de7429 100644 --- a/Medicina/Clients/MedicinaMountTextClient/src/MedicinaMountTextClient.cpp +++ b/Medicina/Clients/MedicinaMountTextClient/src/MedicinaMountTextClient.cpp @@ -179,21 +179,16 @@ int main(int argc, char *argv[]) { window.initFrame(); window.setTitle("Mount"); window.setTitleStyle(CStyle(CColorPair::RED_BLACK,CStyle::BOLD|CStyle::UNDERLINE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); + ACS_LOG(LM_SOURCE_INFO,"mountTui::Main()",(LM_INFO,"FRAME_INITIALIZED")); ACS_LOG(LM_SOURCE_INFO,"mountTui::Main()",(LM_INFO,"GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); try { diff --git a/SRT/Clients/SRTMountTextClient/src/SRTMountTextClient.cpp b/SRT/Clients/SRTMountTextClient/src/SRTMountTextClient.cpp index 12ab78799..5b7ca6c9d 100644 --- a/SRT/Clients/SRTMountTextClient/src/SRTMountTextClient.cpp +++ b/SRT/Clients/SRTMountTextClient/src/SRTMountTextClient.cpp @@ -235,21 +235,15 @@ int main(int argc, char *argv[]) { // Change the style of the main frame window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); - if (window.colorReady()) { - window.defineColor(GRAY_COLOR,255,255,255); - window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); - window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); - } - else { - window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); - window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); - window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); - window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); - window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); - window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); - window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); - window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); - } + window.defineColor(GRAY_COLOR,500,500,500); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_COMPONENENT: %s",COMPONENT_INTERFACE_TYPE)); try { -- GitLab From dd48fc55e9d4cfc08c5e8fb9333efebf21a839d0 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 13 Sep 2022 17:04:54 +0200 Subject: [PATCH 006/150] Fix #742, updated the archive directory in CDBs (#743) * Fix #742, updated the `archive` directory in CDBs * Fix #742, fixed typo --- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- Medicina/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml | 14 +++++++------- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- .../CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml | 14 +++++++------- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- Noto/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml | 8 ++++---- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- .../CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml | 8 ++++---- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 8 ++++---- .../alma/MANAGEMENT/CustomLogger/CustomLogger.xml | 4 ++-- .../CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 8 ++++---- 12 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Medicina/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/Medicina/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/Medicina/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/Medicina/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/Medicina/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml b/Medicina/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml index 7e0cc626b..cc2879fe7 100644 --- a/Medicina/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml +++ b/Medicina/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml @@ -7,13 +7,13 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/extraData/" - LogDir="/archive/logs/" - ScheduleReportPath="/archive/report/" - ScheduleBackuptPath="/archive/backup/" - RecordingLockFile="/archive/locks/ScheduleRecording.lck" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/extraData/" + LogDir="/discos-archive/logs/" + ScheduleReportPath="/discos-archive/report/" + ScheduleBackuptPath="/discos-archive/backup/" + RecordingLockFile="/discos-archive/locks/ScheduleRecording.lck" ProceduresLocation="Procedures" DefaultProceduresFile="StationProcedures" RepetitionCacheTime="2000000" diff --git a/Medicina/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/Medicina/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/Medicina/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/Medicina/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/Medicina/Configuration/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml b/Medicina/Configuration/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml index f8fbdca4b..c0f3db4dc 100644 --- a/Medicina/Configuration/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml +++ b/Medicina/Configuration/CDB/alma/MANAGEMENT/Palmiro/Palmiro.xml @@ -7,13 +7,13 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/extraData/" - LogDir="/archive/logs/" - ScheduleReportPath="/archive/report/" - ScheduleBackuptPath="/archive/backup/" - RecordingLockFile="/archive/locks/ScheduleRecording.lck" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/extraData/" + LogDir="/discos-archive/logs/" + ScheduleReportPath="/discos-archive/report/" + ScheduleBackuptPath="/discos-archive/backup/" + RecordingLockFile="/discos-archive/locks/ScheduleRecording.lck" ProceduresLocation="Procedures" DefaultProceduresFile="StationProcedures" RepetitionCacheTime="2000000" diff --git a/Noto/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/Noto/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/Noto/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/Noto/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/Noto/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml b/Noto/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml index 92880148b..54e2907c9 100644 --- a/Noto/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml +++ b/Noto/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml @@ -7,10 +7,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/extraData/" - LogDir="/archive/logs/" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/extraData/" + LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" RecordingLockFile="" diff --git a/Noto/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/Noto/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/Noto/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/Noto/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/Noto/Configuration/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml b/Noto/Configuration/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml index afaed9b51..f092c79cc 100644 --- a/Noto/Configuration/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml +++ b/Noto/Configuration/CDB/alma/MANAGEMENT/Ducezio/Ducezio.xml @@ -7,10 +7,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/extraData/" - LogDir="/archive/logs/" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/extraData/" + LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" RecordingLockFile="" diff --git a/SRT/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/SRT/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/SRT/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/SRT/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 8bf8de487..32d8ca7d9 100644 --- a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -7,10 +7,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/auxiliary/" - LogDir="/archive/logs/" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/auxiliary/" + LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" RecordingLockFile="" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml index eb40ab75b..8027bb2f9 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/CustomLogger/CustomLogger.xml @@ -6,9 +6,9 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DefaultACSLogDir="/archive/events" + DefaultACSLogDir="/discos-archive/events" DefaultACSLogFile="acs.xml" - DefaultCustomLogDir="/archive/logs" + DefaultCustomLogDir="/discos-archive/logs" DefaultCustomLogFile="station.log" LogMaxAgeMillis="60000" > diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 0e7feb798..b41203b74 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -7,10 +7,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - SchedDir="/archive/schedules/" - DataDir="/archive/data/" - SystemDataDir="/archive/auxiliary/" - LogDir="/archive/logs/" + SchedDir="/discos-archive/schedules/" + DataDir="/discos-archive/data/" + SystemDataDir="/discos-archive/auxiliary/" + LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" RecordingLockFile="" -- GitLab From 207259dcfc671772c5536b7c3b5ad107c03fc86e Mon Sep 17 00:00:00 2001 From: Marco Buttu Date: Wed, 5 Oct 2022 11:11:57 +0000 Subject: [PATCH 007/150] Fix issue 749 --- SRT/Servers/SRTLPBandReceiver/src/ComponentCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRT/Servers/SRTLPBandReceiver/src/ComponentCore.cpp b/SRT/Servers/SRTLPBandReceiver/src/ComponentCore.cpp index 4c6a81efd..c796e9d81 100755 --- a/SRT/Servers/SRTLPBandReceiver/src/ComponentCore.cpp +++ b/SRT/Servers/SRTLPBandReceiver/src/ComponentCore.cpp @@ -100,7 +100,7 @@ void CComponentCore::getPBandLO(ACS::doubleSeq& lo) baci::ThreadSyncGuard guard(&m_mutex); lo.length(m_configuration.getIFs()); for (WORD i=0; i Date: Thu, 6 Oct 2022 14:56:08 +0000 Subject: [PATCH 008/150] Fixed some Python issues with meteoClient Python 3.9.4 raised some compatibility issues/warnings in meteoClient. This commit fixes them. --- Common/Clients/MeteoClient/src/meteoClient.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Common/Clients/MeteoClient/src/meteoClient.py b/Common/Clients/MeteoClient/src/meteoClient.py index aa0d86ff1..265b48c64 100644 --- a/Common/Clients/MeteoClient/src/meteoClient.py +++ b/Common/Clients/MeteoClient/src/meteoClient.py @@ -136,10 +136,11 @@ class SpeedoMeter(Qwt.QwtDial): return self.__label def drawScaleContents(self, painter, center, radius): + radius = int(radius) rect = Qt.QRect(0, 0, 2 * radius, 2 * radius - 10) rect.moveCenter(center.toPoint()) painter.setPen(self.palette().color(Qt.QPalette.Text)) - painter.drawText(rect, Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter, self.__label) + painter.drawText(rect, int(Qt.Qt.AlignBottom | Qt.Qt.AlignHCenter), self.__label) rect = Qt.QRect(-1000, -1000, 2 * radius - 30, 2 * radius - 30) rect.moveCenter(center.toPoint()) @@ -150,11 +151,11 @@ class SpeedoMeter(Qwt.QwtDial): pen.setWidth(8) pen.setColor(Qt.Qt.red) painter.setPen(pen) - painter.drawArc(rect, 16 * -45, 16 * (80 - self.limit) * unit) + painter.drawArc(rect, 16 * -45, int(16 * (80 - self.limit) * unit)) pen.setColor(Qt.Qt.green) painter.setPen(pen) - painter.drawArc(rect, 16 * (-45 + (80 - self.limit) * unit), 16 * self.limit * unit) + painter.drawArc(rect, int(16 * (-45 + (80 - self.limit) * unit)), int(16 * self.limit * unit)) def setVal(self, value=0.): self.setValue(value) @@ -176,8 +177,8 @@ class Background(Qwt.QwtPlotItem): red = Qt.QColor(Qt.Qt.red) yellow = Qt.QColor(Qt.Qt.yellow) - r.setBottom(yMap.transform(self.limit)) - r.setTop(yMap.transform(self.limit)) + r.setBottom(int(yMap.transform(self.limit))) + r.setTop(int(yMap.transform(self.limit))) painter.fillRect(r, red) -- GitLab From 9059811cb4eaacd0170650eed99d5162586e8252 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 18 Oct 2022 10:37:34 +0200 Subject: [PATCH 009/150] Fix #769, update for CGG 8.3.1 (#770) --- Common/Servers/FitsWriter/src/FitsTools.cpp | 2 +- .../src/SRTActiveSurfaceBossSectorThread.cpp | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Common/Servers/FitsWriter/src/FitsTools.cpp b/Common/Servers/FitsWriter/src/FitsTools.cpp index ab541b92d..442cb0f16 100644 --- a/Common/Servers/FitsWriter/src/FitsTools.cpp +++ b/Common/Servers/FitsWriter/src/FitsTools.cpp @@ -60,7 +60,7 @@ CCfits::Table *CFitsTools::createTable(CCfits::FITS *const fits,const IRA::CStri CCfits::Table *table; if (!fits) { errorMessage="fits file is not created"; - return false; + return NULL; } try { table=fits->addTable((const char *)name,0,colName,colForm,colUnit); diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp index 74702ca37..0d35aed43 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp @@ -58,8 +58,7 @@ void CSRTActiveSurfaceBossSectorThread::onStop() void CSRTActiveSurfaceBossSectorThread::runLoop() { - char serial_usd[23]; - char graf[5], mecc[4]; + std::string serial_usd, graf, mecc; int lanIndex; int circleIndex; int usdCircleIndex; @@ -70,12 +69,12 @@ void CSRTActiveSurfaceBossSectorThread::runLoop() try { - current_usd = m_boss->m_services->getComponent(serial_usd); + current_usd = m_boss->m_services->getComponent(serial_usd.c_str()); } catch (maciErrType::CannotGetComponentExImpl& ex) { _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,std::string(m_thread_name + "::runLoop()").c_str()); - Impl.setComponentName(serial_usd); + Impl.setComponentName(serial_usd.c_str()); Impl.log(LM_DEBUG); } -- GitLab From 0383eb4ca0d34543c66bb8313e1920b8e532402c Mon Sep 17 00:00:00 2001 From: Marco Buttu Date: Thu, 15 Dec 2022 11:13:52 +0000 Subject: [PATCH 010/150] Fix issue 785 --- Common/Servers/Scheduler/include/Schedule.h | 4 ++++ Common/Servers/Scheduler/src/Schedule.cpp | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Common/Servers/Scheduler/include/Schedule.h b/Common/Servers/Scheduler/include/Schedule.h index aee7ce884..8f79679e7 100644 --- a/Common/Servers/Scheduler/include/Schedule.h +++ b/Common/Servers/Scheduler/include/Schedule.h @@ -154,6 +154,10 @@ protected: * number of schedule lines */ DWORD m_lines; + /** + * schedule file name (i.e: myschedule.scd) + */ + IRA::CString m_scheduleName; /** * file name */ diff --git a/Common/Servers/Scheduler/src/Schedule.cpp b/Common/Servers/Scheduler/src/Schedule.cpp index 6eff1c0a6..b4c8f4702 100644 --- a/Common/Servers/Scheduler/src/Schedule.cpp +++ b/Common/Servers/Scheduler/src/Schedule.cpp @@ -96,9 +96,10 @@ bool CParser::parse(CBaseSchedule* unit,DWORD& line,IRA::CString& errorMsg) //CBaseSchedule CBaseSchedule::CBaseSchedule(const IRA::CString& path,const IRA::CString& fileName) : m_lines(0), m_fileName(""), - m_filePath(path), m_baseName(""),m_lastError(""),m_config(NULL) + m_scheduleName(""),m_filePath(path), m_baseName(""),m_lastError(""),m_config(NULL) { m_parser=new CParser; + m_scheduleName=fileName; m_fileName=m_filePath+fileName; int pos=fileName.Find('.'); m_baseName=fileName.Mid(0,pos); @@ -112,7 +113,7 @@ CBaseSchedule::~CBaseSchedule() bool CBaseSchedule::readAll(bool check) { IRA::CString err; - if (m_fileName.GetLength()>MAX_SCHED_NAME_LEN) { + if (m_scheduleName.GetLength()>MAX_SCHED_NAME_LEN) { m_lastError.Format("Schedule name exceeds the maximum allowed characters of %d",MAX_SCHED_NAME_LEN); return false; } -- GitLab From 464aeecfd09236d6fbb9836be79d54546df38b40 Mon Sep 17 00:00:00 2001 From: marco-buttu Date: Thu, 15 Dec 2022 12:29:11 +0000 Subject: [PATCH 011/150] Check baseName --- Common/Servers/Scheduler/include/Schedule.h | 4 ---- Common/Servers/Scheduler/src/Schedule.cpp | 5 ++--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Common/Servers/Scheduler/include/Schedule.h b/Common/Servers/Scheduler/include/Schedule.h index 8f79679e7..aee7ce884 100644 --- a/Common/Servers/Scheduler/include/Schedule.h +++ b/Common/Servers/Scheduler/include/Schedule.h @@ -154,10 +154,6 @@ protected: * number of schedule lines */ DWORD m_lines; - /** - * schedule file name (i.e: myschedule.scd) - */ - IRA::CString m_scheduleName; /** * file name */ diff --git a/Common/Servers/Scheduler/src/Schedule.cpp b/Common/Servers/Scheduler/src/Schedule.cpp index b4c8f4702..056b3673e 100644 --- a/Common/Servers/Scheduler/src/Schedule.cpp +++ b/Common/Servers/Scheduler/src/Schedule.cpp @@ -96,10 +96,9 @@ bool CParser::parse(CBaseSchedule* unit,DWORD& line,IRA::CString& errorMsg) //CBaseSchedule CBaseSchedule::CBaseSchedule(const IRA::CString& path,const IRA::CString& fileName) : m_lines(0), m_fileName(""), - m_scheduleName(""),m_filePath(path), m_baseName(""),m_lastError(""),m_config(NULL) + m_filePath(path), m_baseName(""),m_lastError(""),m_config(NULL) { m_parser=new CParser; - m_scheduleName=fileName; m_fileName=m_filePath+fileName; int pos=fileName.Find('.'); m_baseName=fileName.Mid(0,pos); @@ -113,7 +112,7 @@ CBaseSchedule::~CBaseSchedule() bool CBaseSchedule::readAll(bool check) { IRA::CString err; - if (m_scheduleName.GetLength()>MAX_SCHED_NAME_LEN) { + if (m_baseName.GetLength()>MAX_SCHED_NAME_LEN) { m_lastError.Format("Schedule name exceeds the maximum allowed characters of %d",MAX_SCHED_NAME_LEN); return false; } -- GitLab From 0cb9a21c63c0815d360feef1cb48c6a3b38002bd Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 21 Jun 2023 09:30:00 +0200 Subject: [PATCH 012/150] Fix #784, added `acsStop` to `discosdown` script (#798) --- Medicina/Misc/MedScripts/src/discosdown | 2 +- Noto/Misc/NotoScripts/src/discosdown | 2 +- SRT/Misc/SRTScripts/src/discosdown | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Medicina/Misc/MedScripts/src/discosdown b/Medicina/Misc/MedScripts/src/discosdown index 5da350bdd..327ed212d 100644 --- a/Medicina/Misc/MedScripts/src/discosdown +++ b/Medicina/Misc/MedScripts/src/discosdown @@ -32,4 +32,4 @@ #MASTERHOST will be replaced by make file @installation time with proper server address -ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && echo ....it is all over'" +ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && acsStop && echo ....it is all over'" diff --git a/Noto/Misc/NotoScripts/src/discosdown b/Noto/Misc/NotoScripts/src/discosdown index 56c7d8a2c..33cb727b8 100644 --- a/Noto/Misc/NotoScripts/src/discosdown +++ b/Noto/Misc/NotoScripts/src/discosdown @@ -32,4 +32,4 @@ #MASTERHOST will be replaced by make file @installation time with proper server address -ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && echo ....it is all over'" +ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && acsStop && echo ....it is all over'" diff --git a/SRT/Misc/SRTScripts/src/discosdown b/SRT/Misc/SRTScripts/src/discosdown index 8574fc21c..a077fc83e 100644 --- a/SRT/Misc/SRTScripts/src/discosdown +++ b/SRT/Misc/SRTScripts/src/discosdown @@ -32,5 +32,5 @@ #MASTERHOST will be replaced by make file @installation time with proper server address -ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && echo ....it is all over'" +ssh -f -l discos MASTERHOST "/bin/bash --login -c 'echo Shutting down.... && killACS && acsStop && echo ....it is all over'" -- GitLab From 2f6589a6c04e632970fe9e8c6661acabbb3702f4 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 7 Dec 2021 17:42:59 +0100 Subject: [PATCH 013/150] Fix #637, implemented the new SRT Minor Servo Command library (#645) The SRTMinorServoCommandLibrary class exposes a handful of static functions used to build the necessary commands to control the new SRT minor servos --- .../include/SRTMinorServoCommandLibrary.h | 72 ++++++++++++++++++ .../SRTMinorServoLibrary/src/Makefile | 8 +- .../src/SRTMinorServoCommandLibrary.cpp | 74 +++++++++++++++++++ 3 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h new file mode 100644 index 000000000..4eb606149 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -0,0 +1,72 @@ +#ifndef _SRTMINORSERVOCOMMANDLIBRARY_H +#define _SRTMINORSERVOCOMMANDLIBRARY_H + +/** + * SRTMinorServoCommandLibrary.h + * 2021/12/07 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include + +/** + * SRT Minor Servo Command Library + * + * This class features static functions used to build commands to be sent to the PON minor servo control unit of the Sardinia Radio Telescope + */ +class SRTMinorServoCommandLibrary +{ +public: + /** + * Builds the command used to ask the status of the MSCU or, eventually, a single servo + * @param servo_id the ID number of the eventual single servo to retrieve the status + * @return the composed message + */ + static std::string status(int servo_id = -1); + + /** + * Builds the command used to configure the telescope for an observation + * @param configuration the desired observing configuration + * @return the composed message + */ + static std::string setup(std::string configuration); + + /* + * Builds the command used to stow a single servo system to a given stow position + * @param servo_id the ID number of the single servo to be stowed + * @param stow_position the position to which the servo have to stow to + * @return the composed message + */ + static std::string stow(unsigned int servo_id, unsigned int stow_position = 0); + + /* + * Builds the command used to stop a single servo system + * @param servo_id the ID number of the single servo to be stopped + * @return the composed message + */ + static std::string stop(unsigned int servo_id); + + /* + * Builds the command used to move a single servo to a given set of coordinates + * @param servo_id the ID number of the single servo to be moved + * @param coordinates a vector containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string preset(unsigned int servo_id, std::vector coordinates); + + /* + * Builds the command used to provide a single tracking set of coordinates to a single servo + * @param servo_id the ID number of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a vector containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory + * @return the composed message + */ + static std::string programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time = -1); +}; + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 494715771..ab438abf3 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -50,15 +50,17 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = hexlib.h +INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoLibrary +LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib -SRTMinorServoLibrary_LIBS = +SRTMinorServoLibrary_LIBS = +SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary +SRTMinorServoCommandLibrary_LIBS = IRALibrary # # diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp new file mode 100644 index 000000000..a3a937a93 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -0,0 +1,74 @@ +/** + * SRTMinorServoCommandLibrary.cpp + * 2021/12/07 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SRTMinorServoCommandLibrary.h" + +std::string SRTMinorServoCommandLibrary::status(int servo_id) +{ + std::stringstream command; + command << "status"; + if(servo_id >= 0) + { + command << "=" << servo_id; + } + command << std::endl; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::setup(std::string configuration) +{ + std::stringstream command; + command << "setup=" << configuration << std::endl; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::stow(unsigned int servo_id, unsigned int stow_position) +{ + std::stringstream command; + command << "stow=" << servo_id << "," << stow_position << std::endl; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::stop(unsigned int servo_id) +{ + std::stringstream command; + command << "stop=" << servo_id << std::endl; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::preset(unsigned int servo_id, std::vector coordinates) +{ + std::stringstream command; + command << "preset=" << servo_id; + for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) + { + command << "," << coordinates[coordinate]; + } + command << std::endl; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time) +{ + std::stringstream command; + command << "programTrack=" << servo_id << "," << trajectory_id << "," << point_id << ","; + if(start_time > 0) + { + command << std::fixed << std::setprecision(6) << start_time; + } + else + { + command << "*"; + } + + command.unsetf(std::ios_base::floatfield); + for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) + { + command << "," << coordinates[coordinate]; + } + command << std::endl; + return command.str(); +} -- GitLab From 707cdd938d23db6c8a7b42a8038b84a46921cecf Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 13 Dec 2021 12:16:22 +0100 Subject: [PATCH 014/150] Fix #641, added some functions to `IRATools` in order to handle UNIX epochs (#648) --- .../IRALibrary/include/Definitions.h | 1 + .../Libraries/IRALibrary/include/IRATools.h | 18 ++++++++++++++++ Common/Libraries/IRALibrary/src/IRATools.cpp | 21 ++++++++++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Common/Libraries/IRALibrary/include/Definitions.h b/Common/Libraries/IRALibrary/include/Definitions.h index 8d496a1bd..8b7d0cf42 100644 --- a/Common/Libraries/IRALibrary/include/Definitions.h +++ b/Common/Libraries/IRALibrary/include/Definitions.h @@ -50,6 +50,7 @@ #define ABS(X,Y) (X>=Y)?X-Y:Y-X #define LIGHTSPEED_MS 299792458.0 +#define ACSTIME2UNIXEPOCHOFFSET 122192928000000000 /** * Creates an exception diff --git a/Common/Libraries/IRALibrary/include/IRATools.h b/Common/Libraries/IRALibrary/include/IRATools.h index 70c850113..56e7e1f8c 100644 --- a/Common/Libraries/IRALibrary/include/IRATools.h +++ b/Common/Libraries/IRALibrary/include/IRATools.h @@ -30,6 +30,7 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 12/08/2015 Function to check if a file exists or not */ /* Andrea Orlati(aorlati@ira.inaf.it) 19/11/2015 Function timeToStrExtended was added */ /* Andrea Orlati(aorlati@ira.inaf.it) 12/01/2016 reviewed the function skyFrequency in order to address also lower side band during down conversion */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 07/12/2021 added the getUNIXEpoch, ACSTime2UNIXEpoch and UNIXEpoch2ACSTime functions */ #include #include @@ -136,6 +137,23 @@ public: * @return the ACS::Time variable containing the current time */ static ACS::Time getACSTime(); + /** + * Call this function to get the current UNIX epoch + * @return a double containing the current UNIX epoch + */ + static double getUNIXEpoch(); + /** + * Call this function in order to get the UNIX Epoch of the given ACS::Time + * @param acs_time the given ACS::Time + * @return a double containing the UNIX epoch of the given ACS::Time + */ + static double ACSTime2UNIXEpoch(ACS::Time acs_time); + /** + * Call this function in order to get the ACS::Time of the given UNIX Epoch + * @param unix_epoch the given UNIX Epoch (double) + * @return a ACS::Time object of the given UNIX Epoch + */ + static ACS::Time UNIXEpoch2ACSTime(double unix_epoch); /** * This function performs the copy of an epoch * @param dst destination epoch diff --git a/Common/Libraries/IRALibrary/src/IRATools.cpp b/Common/Libraries/IRALibrary/src/IRATools.cpp index 6e1db34d0..ab893ab51 100644 --- a/Common/Libraries/IRALibrary/src/IRATools.cpp +++ b/Common/Libraries/IRALibrary/src/IRATools.cpp @@ -51,9 +51,24 @@ void CIRATools::getTime(TIMEVALUE& Now) ACS::Time CIRATools::getACSTime() { - TIMEVALUE now; - CIRATools::getTime(now); - return now.value().value; + TIMEVALUE now; + CIRATools::getTime(now); + return now.value().value; +} + +double CIRATools::getUNIXEpoch() +{ + return CIRATools::ACSTime2UNIXEpoch(CIRATools::getACSTime()); +} + +double CIRATools::ACSTime2UNIXEpoch(ACS::Time acs_time) +{ + return double(acs_time - ACSTIME2UNIXEPOCHOFFSET) / 10000000; +} + +ACS::Time CIRATools::UNIXEpoch2ACSTime(double unix_epoch) +{ + return ACS::Time(long(unix_epoch * 10000000) + ACSTIME2UNIXEPOCHOFFSET); } void CIRATools::timeCopy(TIMEVALUE& dst,const TIMEVALUE& src) -- GitLab From b3bbae004f630b6608c11ada3d6497e596045df6 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 17 Feb 2022 14:14:55 +0100 Subject: [PATCH 015/150] Fix #672, fix #637, some improvements for the SRTMinorServoCommandLibrary (#674) Fix #672, wrote all the commands in capital letters Fix #673, added the OFFSET command to the library Also, fixed changed the start_time parameter to be written as an integer --- .../include/SRTMinorServoCommandLibrary.h | 28 +++++++---- .../SRTMinorServoLibrary/src/Makefile | 12 +++-- .../src/SRTMinorServoCommandLibrary.cpp | 46 ++++++++++++------- .../src/TestSRTMinorServoCommandLibrary.cpp | 26 +++++++++++ 4 files changed, 81 insertions(+), 31 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 4eb606149..4a766b376 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -22,10 +22,10 @@ class SRTMinorServoCommandLibrary public: /** * Builds the command used to ask the status of the MSCU or, eventually, a single servo - * @param servo_id the ID number of the eventual single servo to retrieve the status + * @param servo_id the ID string of the eventual single servo to retrieve the status * @return the composed message */ - static std::string status(int servo_id = -1); + static std::string status(std::string servo_id = ""); /** * Builds the command used to configure the telescope for an observation @@ -36,37 +36,45 @@ public: /* * Builds the command used to stow a single servo system to a given stow position - * @param servo_id the ID number of the single servo to be stowed + * @param servo_id the ID string of the single servo to be stowed * @param stow_position the position to which the servo have to stow to * @return the composed message */ - static std::string stow(unsigned int servo_id, unsigned int stow_position = 0); + static std::string stow(std::string servo_id, unsigned int stow_position = 0); /* * Builds the command used to stop a single servo system - * @param servo_id the ID number of the single servo to be stopped + * @param servo_id the ID string of the single servo to be stopped * @return the composed message */ - static std::string stop(unsigned int servo_id); + static std::string stop(std::string servo_id); /* * Builds the command used to move a single servo to a given set of coordinates - * @param servo_id the ID number of the single servo to be moved + * @param servo_id the ID string of the single servo to be moved * @param coordinates a vector containing the N coordinates to be sent to the servo * @return the composed message */ - static std::string preset(unsigned int servo_id, std::vector coordinates); + static std::string preset(std::string servo_id, std::vector coordinates); /* * Builds the command used to provide a single tracking set of coordinates to a single servo - * @param servo_id the ID number of the single servo to send the command to + * @param servo_id the ID string of the single servo to send the command to * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to * @param point_id the ID number of the given set of coordinates inside the trajectory * @param coordinates a vector containing the N coordinates the servo have to move to at the given time * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory * @return the composed message */ - static std::string programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time = -1); + static std::string programTrack(std::string servo_id, long unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time = 0); + + /* + * Builds the command used to send a set of offset coordinates + * @param servo_id the ID string of the single servo to send the offsets to + * @param coordinates a vector containing the N offsets to be added the servo coordinates + * @return the composed message + */ + static std::string offset(std::string servo_id, std::vector coordinates); }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index ab438abf3..fe6e38e67 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -23,7 +23,7 @@ USER_CFLAGS = -Wall # # additional include and library search paths # USER_INC = /usr/local/include -USER_LIB = -lgsl -lgslcblas -lm +USER_LIB = # # MODULE CODE DESCRIPTION: @@ -35,11 +35,15 @@ USER_LIB = -lgsl -lgslcblas -lm # C programs (public and local) # ----------------------------- EXECUTABLES = -EXECUTABLES_L = +EXECUTABLES_L = TestSRTMinorServoCommandLibrary + +TestSRTMinorServoCommandLibrary_OBJECTS = TestSRTMinorServoCommandLibrary +TestSRTMinorServoCommandLibrary_CFLAGS = -std=c++0x +TestSRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary IRALibrary # # -xxxxx_OBJECTS = +xxxxx_OBJECTS = xxxxx_LDFLAGS = xxxxx_LIBS = @@ -58,7 +62,7 @@ INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib -SRTMinorServoLibrary_LIBS = +SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary SRTMinorServoCommandLibrary_LIBS = IRALibrary diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index a3a937a93..cb2a99419 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -6,69 +6,81 @@ #include "SRTMinorServoCommandLibrary.h" -std::string SRTMinorServoCommandLibrary::status(int servo_id) +std::string SRTMinorServoCommandLibrary::status(std::string servo_id) { std::stringstream command; - command << "status"; - if(servo_id >= 0) + command << "STATUS"; + if(servo_id != "") { command << "=" << servo_id; } - command << std::endl; + command << "\r\n"; return command.str(); } std::string SRTMinorServoCommandLibrary::setup(std::string configuration) { std::stringstream command; - command << "setup=" << configuration << std::endl; + command << "SETUP=" << configuration << "\r\n"; return command.str(); } -std::string SRTMinorServoCommandLibrary::stow(unsigned int servo_id, unsigned int stow_position) +std::string SRTMinorServoCommandLibrary::stow(std::string servo_id, unsigned int stow_position) { std::stringstream command; - command << "stow=" << servo_id << "," << stow_position << std::endl; + command << "STOW=" << servo_id << "," << stow_position << "\r\n"; return command.str(); } -std::string SRTMinorServoCommandLibrary::stop(unsigned int servo_id) +std::string SRTMinorServoCommandLibrary::stop(std::string servo_id) { std::stringstream command; - command << "stop=" << servo_id << std::endl; + command << "STOP=" << servo_id << "\r\n"; return command.str(); } -std::string SRTMinorServoCommandLibrary::preset(unsigned int servo_id, std::vector coordinates) +std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vector coordinates) { std::stringstream command; - command << "preset=" << servo_id; + command << "PRESET=" << servo_id; for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { command << "," << coordinates[coordinate]; } - command << std::endl; + command << "\r\n"; return command.str(); } -std::string SRTMinorServoCommandLibrary::programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time) +std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, long unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time) { std::stringstream command; - command << "programTrack=" << servo_id << "," << trajectory_id << "," << point_id << ","; + command << "PROGRAMTRACK=" << servo_id << "," << trajectory_id << "," << point_id << ","; if(start_time > 0) { - command << std::fixed << std::setprecision(6) << start_time; + long unsigned int start_time_int = (long unsigned int)(start_time * 1000); + command << start_time_int; } else { command << "*"; } - command.unsetf(std::ios_base::floatfield); for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { command << "," << coordinates[coordinate]; } - command << std::endl; + command << "\r\n"; + return command.str(); +} + +std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vector coordinates) +{ + std::stringstream command; + command << "OFFSET=" << servo_id; + for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) + { + command << "," << coordinates[coordinate]; + } + command << "\r\n"; return command.str(); } diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp new file mode 100644 index 000000000..c52f0e975 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp @@ -0,0 +1,26 @@ +#include +#include "SRTMinorServoCommandLibrary.h" + +using namespace IRA; + +int main(void) +{ + // Skipping std::endl since the protocol adds a \n already + std::cout << SRTMinorServoCommandLibrary::status(); + std::cout << SRTMinorServoCommandLibrary::status("SRP"); + std::cout << SRTMinorServoCommandLibrary::setup("CCB"); + std::cout << SRTMinorServoCommandLibrary::stow("PFP"); + std::cout << SRTMinorServoCommandLibrary::stow("PFP", 1); + std::cout << SRTMinorServoCommandLibrary::stop("PFP"); + std::cout << SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}); + + double start_time = CIRATools::getUNIXEpoch() + 3; + long unsigned int trajectory_id = (long unsigned int)(start_time * 1000); + std::cout << SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, 0, std::vector{0.,1.,2.,3.,4.,5.}, start_time); + for(unsigned int i = 1; i < 10; i++) + { + std::cout << SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, i, std::vector{0.,1.,2.,3.,4.,5.}); + } + + std::cout << SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}); +} -- GitLab From e35b20d0279cfa29ad43063171ae529c54634c49 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 24 Feb 2022 18:08:48 +0100 Subject: [PATCH 016/150] Fix #646, wrote a Python wrapper for the `SRTMinorServoCommandLibrary` (#650) * Fix #646, wrote a Python wrapper for the `SRTMinorServoCommandLibrary` * Fix #646, Added a python module that uses the wrapper library It has been commented in order to replicate the behavior in any future python wrapped C++ library * Fix #646, fixed a few small things regarding some include and the Makefile * Fix #646, added documentation about the Python wrapper Also, fixed some small inconsistencies with the new C++ implementation * Issue #637, removed an unneeded include statement --- .../include/PySRTMinorServoCommandLibrary.h | 85 +++++++++++++++++++ .../include/SRTMinorServoCommandLibrary.h | 4 +- .../SRTMinorServoLibrary/src/Makefile | 10 ++- .../src/PySRTMinorServoCommandLibrary.cpp | 26 ++++++ .../src/SRTMinorServoCommandLibrary/README.md | 18 ++++ .../SRTMinorServoCommandLibrary/__init__.py | 17 ++++ .../src/TestSRTMinorServoCommandLibrary.cpp | 1 + .../test/TestSRTMinorServoCommandLibrary.py | 61 +++++++++++++ 8 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py create mode 100644 SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h new file mode 100644 index 000000000..b7db8fc41 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h @@ -0,0 +1,85 @@ +#ifndef _PYSRTMINORSERVOCOMMANDLIBRARY_H +#define _PYSRTMINORSERVOCOMMANDLIBRARY_H + +/** + * PySRTMinorServoCommandLibrary.h + * 2021/12/13 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include "SRTMinorServoCommandLibrary.h" + + +/** + * SRT Minor Servo Command Library Python Wrapper + * + * This class wraps the SRTMinorServoCommandLibrary with boost_python in order to grant access to its static functions via Python + */ +class PySRTMinorServoCommandLibrary : public SRTMinorServoCommandLibrary +{ +public: + /* + * Builds the command used to move a single servo to a given set of coordinates + * This is an overload of the original SRTMinorServoCommandLibrary::preset function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string preset(std::string servo_id, boost::python::list& coordinates); + + /* + * Builds the command used to provide a single tracking set of coordinates to a single servo + * This is an overload of the original SRTMinorServoCommandLibrary::programTrack function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a Python list containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory + * @return the composed message + */ + static std::string programTrack(std::string servo_id, unsigned int trajectory_id, unsigned int point_id, boost::python::list& coordinates, double start_time=-1); + + /* + * Builds the command used to provide a set of offsets to a given servo + * This is an overload of the original SRTMinorServoCommandLibrary::offset function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string offset(std::string servo_id, boost::python::list& coordinates); + +private: + /* + * Converts the given Python list into a C++ std::vector object + * @param py_list the given Python list to be converted + * @return the composed C++ std::vector containing doubles + */ + static std::vector pylist2cppvector(boost::python::list& py_list); +}; + +/* + * The following 3 lines of code allow the overloaded functions to ignore the optional parameter and use the default one defined in the original SRTMinorServoCommandLibrary header file + */ +BOOST_PYTHON_FUNCTION_OVERLOADS(status, PySRTMinorServoCommandLibrary::status, 0, 1) +BOOST_PYTHON_FUNCTION_OVERLOADS(stow, PySRTMinorServoCommandLibrary::stow, 1, 2) +BOOST_PYTHON_FUNCTION_OVERLOADS(programTrack, PySRTMinorServoCommandLibrary::programTrack, 4, 5) + +/* + * Python module definition. Since the original SRTMinorServoCommandLibrary only contains static functions, we write the Python module with static functions only, omitting the class + */ +BOOST_PYTHON_MODULE(libPySRTMinorServoCommandLibrary) +{ + using namespace boost::python; + def("status", &PySRTMinorServoCommandLibrary::status, status(arg("servo_id") = "")); + def("setup", &PySRTMinorServoCommandLibrary::setup); + def("stow", &PySRTMinorServoCommandLibrary::stow, stow(arg("stow_position") = 1)); + def("stop", &PySRTMinorServoCommandLibrary::stop); + def("preset", &PySRTMinorServoCommandLibrary::preset); + def("programTrack", &PySRTMinorServoCommandLibrary::programTrack, programTrack(arg("start_time") = -1)); + def("offset", &PySRTMinorServoCommandLibrary::offset); +} +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 4a766b376..db407ab37 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -9,8 +9,6 @@ #include #include -#include -#include /** * SRT Minor Servo Command Library @@ -40,7 +38,7 @@ public: * @param stow_position the position to which the servo have to stow to * @return the composed message */ - static std::string stow(std::string servo_id, unsigned int stow_position = 0); + static std::string stow(std::string servo_id, unsigned int stow_position = 1); /* * Builds the command used to stop a single servo system diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index fe6e38e67..70ee8cbf4 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -23,7 +23,7 @@ USER_CFLAGS = -Wall # # additional include and library search paths # USER_INC = /usr/local/include -USER_LIB = +# USER_LIB = # # MODULE CODE DESCRIPTION: @@ -59,12 +59,14 @@ INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary +LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary PySRTMinorServoCommandLibrary LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary -SRTMinorServoCommandLibrary_LIBS = IRALibrary +SRTMinorServoCommandLibrary_LIBS = +PySRTMinorServoCommandLibrary_OBJECTS = PySRTMinorServoCommandLibrary +PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python # # @@ -91,7 +93,7 @@ PY_SCRIPTS_L = PY_MODULES = PY_MODULES_L = -PY_PACKAGES = +PY_PACKAGES = SRTMinorServoCommandLibrary PY_PACKAGES_L = pppppp_MODULES = diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp new file mode 100644 index 000000000..6e06f7b44 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -0,0 +1,26 @@ +#include "PySRTMinorServoCommandLibrary.h" + +std::string PySRTMinorServoCommandLibrary::preset(std::string servo_id, boost::python::list& coordinates) +{ + return SRTMinorServoCommandLibrary::preset(servo_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates)); +} + +std::string PySRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned int trajectory_id, unsigned int point_id, boost::python::list& coordinates, double start_time) +{ + return SRTMinorServoCommandLibrary::programTrack(servo_id, trajectory_id, point_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates), start_time); +} + +std::string PySRTMinorServoCommandLibrary::offset(std::string servo_id, boost::python::list& coordinates) +{ + return SRTMinorServoCommandLibrary::offset(servo_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates)); +} + +std::vector PySRTMinorServoCommandLibrary::pylist2cppvector(boost::python::list& py_list) +{ + std::vector cpp_vector; + for(unsigned int i = 0; i < len(py_list); i++) + { + cpp_vector.push_back(boost::python::extract(py_list[i])); + } + return cpp_vector; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md new file mode 100644 index 000000000..a1877c6f9 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md @@ -0,0 +1,18 @@ +# SRTMinorServoCommandLibrary Python wrapper + +In order to use the SRTMinorServoCommandLibrary python wrapper, it is sufficient to import the SRTCommandLibrary package like this: + +`import SRTMinorServoCommandLibrary` + +The all the functions of the library can be used in the following fashion: + +`SRTMinorServoCommandLibrary.status()` +`SRTMinorServoCommandLibrary.status('PFP')` +`SRTMinorServoCommandLibrary.setup('KKG')` +`SRTMinorServoCommandLibrary.stow('PFP')` +`SRTMinorServoCommandLibrary.stow('PFP', 2)` +`SRTMinorServoCommandLibrary.stop('SRP')` +`SRTMinorServoCommandLibrary.preset('SRP', [0, 1, 2, 3, 4, 5])` +`SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0, 1, 2, 3, 4, 5], )` +`SRTMinorServoCommandLibrary.programTrack('PFP', 0, 1, [0, 1, 2, 3, 4, 5])` +`SRTMinorServoCommandLibrary.offset('SRP', [6, 7, 8, 9, 10, 11])` diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py new file mode 100644 index 000000000..87fbbcd2b --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py @@ -0,0 +1,17 @@ +# The following lines will look for the libPySRTMinorServoCommandLibrary in the +# $INTROOT/lib path instead of looking in the $INTROOT/lib/python/site-packages +# path. This is a workaround needed since the said library is a C++ shared +# library and it does not get automatically installed in the correct folder. +# By adding this workaround we're also able to rename the library with the +# module name SRTMinorServoCommandLibrary, trimming the 'libPy' header. I +# suggest to use this approach whenever a Python wrapper is needed. +import os +import sys +# Temporarily add the $INTROOT/lib path to Python libraries path +sys.path.append(os.path.join(os.environ['INTROOT'], 'lib')) +# Import the functions we need +from libPySRTMinorServoCommandLibrary import status, setup, stop, stow, preset, programTrack, offset +# Remove the added path and unused imported modules +sys.path.remove(os.path.join(os.environ['INTROOT'], 'lib')) +del os +del sys diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp index c52f0e975..ad4bd82b1 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp @@ -1,4 +1,5 @@ #include +#include #include "SRTMinorServoCommandLibrary.h" using namespace IRA; diff --git a/SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py b/SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py new file mode 100644 index 000000000..579dcc862 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python +import unittest +import time +import SRTMinorServoCommandLibrary + +class TestPySRTMinorServoCommandLibrary(unittest.TestCase): + + def test_status(self): + command = SRTMinorServoCommandLibrary.status() + expected_command = 'STATUS\r\n' + self.assertEqual(command, expected_command) + + def test_status_servo(self): + command = SRTMinorServoCommandLibrary.status('PFP') + expected_command = 'STATUS=PFP\r\n' + self.assertEqual(command, expected_command) + + def test_setup(self): + command = SRTMinorServoCommandLibrary.setup('KKG') + expected_command = 'SETUP=KKG\r\n' + self.assertEqual(command, expected_command) + + def test_stow(self): + command = SRTMinorServoCommandLibrary.stow('SRP') + expected_command = 'STOW=SRP,1\r\n' + self.assertEqual(command, expected_command) + + def test_stow_position(self): + command = SRTMinorServoCommandLibrary.stow('SRP', 2) + expected_command = 'STOW=SRP,2\r\n' + self.assertEqual(command, expected_command) + + def test_stop(self): + command = SRTMinorServoCommandLibrary.stop('SRP') + expected_command = 'STOP=SRP\r\n' + self.assertEqual(command, expected_command) + + def test_preset(self): + command = SRTMinorServoCommandLibrary.preset('PFP', [0.1, 1.1, 2.1]) + expected_command = 'PRESET=PFP,0.1,1.1,2.1\r\n' + self.assertEqual(command, expected_command) + + def test_programTrack(self): + now = time.time() + command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0.1, 1.1, 2.1], now) + now = int(now * 1000) + expected_command = 'PROGRAMTRACK=PFP,0,0,%d,0.1,1.1,2.1\r\n' % now + self.assertEqual(command, expected_command) + for i in range(1, 10): + command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, i, [0.1, 1.1, 2.1]) + expected_command = 'PROGRAMTRACK=PFP,0,%d,*,0.1,1.1,2.1\r\n' % i + self.assertEqual(command, expected_command) + + def test_offset(self): + command = SRTMinorServoCommandLibrary.offset('PFP', [0.1, 1.1, 2.1]) + expected_command = 'OFFSET=PFP,0.1,1.1,2.1\r\n' + self.assertEqual(command, expected_command) + + +if __name__ == '__main__': + unittest.main() -- GitLab From 08ac4a9bd60549ba5b5504204ac7712d8e5540ab Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 2 Mar 2022 12:46:16 +0100 Subject: [PATCH 017/150] Fix #684, fixed tests for the SRTMinorServoCommandLibrary and its python wrapper (#685) --- .../SRTMinorServoLibrary/src/Makefile | 8 +- .../src/TestSRTMinorServoCommandLibrary.cpp | 27 ------ .../SRTMinorServoLibrary/tests/.discos | 5 + .../SRTMinorServoLibrary/tests/Makefile | 91 +++++++++++++++++++ .../tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../pyunit/__init__.py} | 0 .../SRTMinorServoLibrary/tests/unittest.cpp | 53 +++++++++++ 8 files changed, 153 insertions(+), 31 deletions(-) delete mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/.discos create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/Makefile create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py rename SRT/Libraries/SRTMinorServoLibrary/{test/TestSRTMinorServoCommandLibrary.py => tests/pyunit/__init__.py} (100%) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 70ee8cbf4..bb2f9a3fd 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -35,11 +35,11 @@ USER_CFLAGS = -Wall # C programs (public and local) # ----------------------------- EXECUTABLES = -EXECUTABLES_L = TestSRTMinorServoCommandLibrary +EXECUTABLES_L = -TestSRTMinorServoCommandLibrary_OBJECTS = TestSRTMinorServoCommandLibrary -TestSRTMinorServoCommandLibrary_CFLAGS = -std=c++0x -TestSRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary IRALibrary +xxxxx_OBJECTS = +xxxxx_CFLAGS = +xxxxx_LIBS = # # diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp deleted file mode 100644 index ad4bd82b1..000000000 --- a/SRT/Libraries/SRTMinorServoLibrary/src/TestSRTMinorServoCommandLibrary.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include "SRTMinorServoCommandLibrary.h" - -using namespace IRA; - -int main(void) -{ - // Skipping std::endl since the protocol adds a \n already - std::cout << SRTMinorServoCommandLibrary::status(); - std::cout << SRTMinorServoCommandLibrary::status("SRP"); - std::cout << SRTMinorServoCommandLibrary::setup("CCB"); - std::cout << SRTMinorServoCommandLibrary::stow("PFP"); - std::cout << SRTMinorServoCommandLibrary::stow("PFP", 1); - std::cout << SRTMinorServoCommandLibrary::stop("PFP"); - std::cout << SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}); - - double start_time = CIRATools::getUNIXEpoch() + 3; - long unsigned int trajectory_id = (long unsigned int)(start_time * 1000); - std::cout << SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, 0, std::vector{0.,1.,2.,3.,4.,5.}, start_time); - for(unsigned int i = 1; i < 10; i++) - { - std::cout << SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, i, std::vector{0.,1.,2.,3.,4.,5.}); - } - - std::cout << SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}); -} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/.discos b/SRT/Libraries/SRTMinorServoLibrary/tests/.discos new file mode 100644 index 000000000..1ada672a9 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/.discos @@ -0,0 +1,5 @@ +This file is here to differentiate between ACS style test directory and discos-style test. + +This is a discos test directory + +DO NOT REMOVE THIS FILE diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile new file mode 100644 index 000000000..b77516f29 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile @@ -0,0 +1,91 @@ +# CPP UNIT TESTING SETUP +#-------------- +GTEST_HOME=/usr/local/include/gtest +GMOCK_HOME=/usr/local/include/gmock +GTEST_LIBS=gtest gtest_main + +USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +EXECUTABLES_L = unittest +unittest_OBJECTS = unittest +unittest_CFLAGS = -std=c++0x +unittest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary +unittest_LDFLAGS = -lstdc++ -lpthread + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py similarity index 100% rename from SRT/Libraries/SRTMinorServoLibrary/test/TestSRTMinorServoCommandLibrary.py rename to SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp new file mode 100644 index 000000000..ed58cd27e --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp @@ -0,0 +1,53 @@ +#include "gtest/gtest.h" +#include +#include "SRTMinorServoCommandLibrary.h" + +using namespace IRA; + +TEST(SRTMinorServoCommandLibraryTest, status) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::status(), "STATUS\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::status("PFP"), "STATUS=PFP\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, setup) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::setup("CCB"), "SETUP=CCB\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, stow) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::stow("PFP"), "STOW=PFP,1\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::stow("PFP", 2), "STOW=PFP,2\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, stop) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::stop("PFP"), "STOP=PFP\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, preset) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "PRESET=PFP,0,1,2,3,4,5\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, programTrack) +{ + double start_time = CIRATools::getUNIXEpoch() + 3; + unsigned long int trajectory_id = (unsigned long int)(start_time * 1000); + std::stringstream expected_answer; + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << ",0," << trajectory_id << ",0,1,2,3,4,5\r\n"; + EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, 0, std::vector{0.,1.,2.,3.,4.,5.}, start_time), expected_answer.str()); + + for(unsigned int i = 1; i < 10; i++) + { + expected_answer.str(std::string()); + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << "," << i << ",*,0,1,2,3,4,5\r\n"; + EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, i, std::vector{0.,1.,2.,3.,4.,5.}), expected_answer.str()); + } +} + +TEST(SRTMinorServoCommandLibraryTest, offset) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "OFFSET=PFP,0,1,2,3,4,5\r\n"); +} -- GitLab From bf8593447603ec14db5d00d5537f6089ebacb0d0 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 2 Nov 2022 16:31:30 +0100 Subject: [PATCH 018/150] Fix #771, first implementation of parseAnswer and related tests (#772) * Issue #771, first implementation of parseAnswer and related tests Right now the function is not robust, it should check for errors in the answer format * Fix #771, complete implementation of `parseAnswer` function Tests were updated as well --- .../include/PySRTMinorServoCommandLibrary.h | 10 +++ .../include/SRTMinorServoCommandLibrary.h | 9 +++ .../SRTMinorServoLibrary/src/Makefile | 4 +- .../src/PySRTMinorServoCommandLibrary.cpp | 16 ++++ .../src/SRTMinorServoCommandLibrary.cpp | 74 +++++++++++++++++++ .../src/SRTMinorServoCommandLibrary/README.md | 1 + .../SRTMinorServoCommandLibrary/__init__.py | 2 +- .../SRTMinorServoLibrary/tests/Makefile | 2 +- .../tests/pyunit/__init__.py | 42 +++++++++++ .../SRTMinorServoLibrary/tests/unittest.cpp | 46 ++++++++++++ 10 files changed, 203 insertions(+), 3 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h index b7db8fc41..ee32b5877 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h @@ -52,6 +52,15 @@ public: */ static std::string offset(std::string servo_id, boost::python::list& coordinates); + /* + * Parses the received answer by splitting it and synamically populating a std::map + * This is an overload of the original SRTMinorServoCommandLibrary::parseAnswer function + * An overload was needed in order to replace the original std::map object with a boost::python::dict + * @param answer the string containing the answer received from the VBrain proxy + * @return a Python dictionary containing the answer splitted into keys and values. The keys are always strings, the values can either be int, double or strings. + */ + static boost::python::dict parseAnswer(std::string answer); + private: /* * Converts the given Python list into a C++ std::vector object @@ -81,5 +90,6 @@ BOOST_PYTHON_MODULE(libPySRTMinorServoCommandLibrary) def("preset", &PySRTMinorServoCommandLibrary::preset); def("programTrack", &PySRTMinorServoCommandLibrary::programTrack, programTrack(arg("start_time") = -1)); def("offset", &PySRTMinorServoCommandLibrary::offset); + def("parseAnswer", &PySRTMinorServoCommandLibrary::parseAnswer); } #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index db407ab37..f62adb794 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -9,6 +9,8 @@ #include #include +#include +#include /** * SRT Minor Servo Command Library @@ -73,6 +75,13 @@ public: * @return the composed message */ static std::string offset(std::string servo_id, std::vector coordinates); + + /* + * Parses the received answer by splitting it and synamically populating a std::map + * @param answer the string containing the answer received from the VBrain proxy + * @return a std::map (dictionary) containing the answer splitted into keys and values. The keys are always std::string, the values can either be int, double or std::string. + */ + static std::map > parseAnswer(std::string answer); }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index bb2f9a3fd..2a1367b96 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -64,9 +64,11 @@ LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary +SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 SRTMinorServoCommandLibrary_LIBS = PySRTMinorServoCommandLibrary_OBJECTS = PySRTMinorServoCommandLibrary -PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python +PySRTMinorServoCommandLibrary_CFLAGS = -std=c++17 +PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python3 # # diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp index 6e06f7b44..a9688c6ee 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -24,3 +24,19 @@ std::vector PySRTMinorServoCommandLibrary::pylist2cppvector(boost::pytho } return cpp_vector; } + +boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(std::string answer) +{ + auto args = SRTMinorServoCommandLibrary::parseAnswer(answer); + + boost::python::dict dictionary; + + typename std::map >::iterator iter; + + for(iter = args.begin(); iter != args.end(); ++iter) + { + std::visit([dictionary, iter](const auto& var) mutable { dictionary[iter->first] = var; }, iter->second); + } + + return dictionary; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index cb2a99419..c150421d8 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -6,6 +6,9 @@ #include "SRTMinorServoCommandLibrary.h" +#include +#include + std::string SRTMinorServoCommandLibrary::status(std::string servo_id) { std::stringstream command; @@ -84,3 +87,74 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto command << "\r\n"; return command.str(); } + +std::map > SRTMinorServoCommandLibrary::parseAnswer(std::string answer) +{ + // First thing first, standardize the separators + std::replace(answer.begin(), answer.end(), ':', '='); + std::replace(answer.begin(), answer.end(), '|', ','); + + // Create the dictionary + std::map > args; + + std::stringstream ss(answer); + std::string token; + + try + { + // Loop through the tokens + while(std::getline(ss, token, ',')) + { + std::stringstream sss(token); + std::string key, value; + std::getline(sss, key, '='); + std::getline(sss, value); + + // No value, should be the timestamp + if(value.empty()) + { + if(args.find("TIMESTAMP") != args.end()) // Timestamp already found, some other value is missing its key + throw std::invalid_argument(std::string("Missing key for value " + value)); + + value = key; + key = "TIMESTAMP"; + } + + if(key == "OUTPUT") + { + if(value != "GOOD" && value != "BAD") + throw std::invalid_argument(std::string("Unrecognized OUTPUT value: " + value)); + + args[key] = value; + } + else if(key == "TIMESTAMP") + { + size_t last_char; + args[key] = std::stod(value, &last_char); + if(last_char != value.size()) + throw std::invalid_argument(std::string("Wrong TIMESTAMP value: " + value)); + } + else + { + size_t last_char; + args[key] = std::stoi(value, &last_char); + if(last_char != value.size()) + args[key] = std::stod(value); + } + } + + if(args.find("OUTPUT") == args.end()) + throw std::invalid_argument(std::string("Missing OUTPUT value!")); + else if(args.find("TIMESTAMP") == args.end()) + throw std::invalid_argument(std::string("Missing TIMESTAMP value!")); + } + catch(const std::invalid_argument& e) + { + // If we are not able to convert any of the values to the correct type, + // or if OUTPUT and/or TIMESTAMP is missing, we send back an empty dictionary. + // It will be the caller's duty to understand that something was wrong with the answer. + args.clear(); + } + + return args; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md index a1877c6f9..7eb57a028 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md @@ -16,3 +16,4 @@ The all the functions of the library can be used in the following fashion: `SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0, 1, 2, 3, 4, 5], )` `SRTMinorServoCommandLibrary.programTrack('PFP', 0, 1, [0, 1, 2, 3, 4, 5])` `SRTMinorServoCommandLibrary.offset('SRP', [6, 7, 8, 9, 10, 11])` +`SRTMinorServoCommandLibrary.parseAnswer('OUTPUT:GOOD,1665757400.123456,PFP_ENABLED=5|PFP_STATUS=44|PFP_BLOCK=7|PFP_WARNING=47|PFP_ROTARY_AXIS_ENABLE=52|PFP_COORD_1=94')` diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py index 87fbbcd2b..f07ae391e 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py @@ -10,7 +10,7 @@ import sys # Temporarily add the $INTROOT/lib path to Python libraries path sys.path.append(os.path.join(os.environ['INTROOT'], 'lib')) # Import the functions we need -from libPySRTMinorServoCommandLibrary import status, setup, stop, stow, preset, programTrack, offset +from libPySRTMinorServoCommandLibrary import status, setup, stop, stow, preset, programTrack, offset, parseAnswer # Remove the added path and unused imported modules sys.path.remove(os.path.join(os.environ['INTROOT'], 'lib')) del os diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile index b77516f29..1af134e84 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile @@ -16,7 +16,7 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) EXECUTABLES_L = unittest unittest_OBJECTS = unittest -unittest_CFLAGS = -std=c++0x +unittest_CFLAGS = -std=c++17 unittest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary unittest_LDFLAGS = -lstdc++ -lpthread diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py index 579dcc862..03d61b9a7 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py @@ -56,6 +56,48 @@ class TestPySRTMinorServoCommandLibrary(unittest.TestCase): expected_command = 'OFFSET=PFP,0.1,1.1,2.1\r\n' self.assertEqual(command, expected_command) + def test_parseAnswer(self): + answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" + args = { + 'OUTPUT': 'GOOD', + 'TIMESTAMP': 1665743366.123456, + 'CURRENT_CONFIG': 21, + 'SIMULATION_ENABLED': 34, + 'PLC_TIME': 78, + 'PLC_VERSION': 69, + 'CONTROL': 14, + 'POWER': 38, + 'EMERGENCY': 69, + 'ENABLED': 51, + 'OPERATIVE_MODE': 94 + } + self.assertEqual( + SRTMinorServoCommandLibrary.parseAnswer(answer), + args + ) + + answer = "OUTPUT:GOOD,1665743366.654321" + args = { + "OUTPUT": "GOOD", + "TIMESTAMP": 1665743366.654321 + } + self.assertEqual( + SRTMinorServoCommandLibrary.parseAnswer(answer), + args + ) + + answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = "OUTPUT:123456" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = "OUTPUT:GOOD,12345,67890" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = "OUTPUT:GOOD,12345.ABCD" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + if __name__ == '__main__': unittest.main() diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp index ed58cd27e..78d74afbc 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp @@ -51,3 +51,49 @@ TEST(SRTMinorServoCommandLibraryTest, offset) { EXPECT_EQ(SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "OFFSET=PFP,0,1,2,3,4,5\r\n"); } + +TEST(SRTMinorServoCommandLibraryTest, parseAnswer) +{ + // Minimal correct answer + std::string answer = "OUTPUT:GOOD,1665743366.654321"; + std::map > args; + args["OUTPUT"] = "GOOD"; + args["TIMESTAMP"] = 1665743366.654321; + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Complete correct answer + answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94"; + args.clear(); + args["OUTPUT"] = "GOOD"; + args["TIMESTAMP"] = 1665743366.123456; + args["CURRENT_CONFIG"] = 21; + args["SIMULATION_ENABLED"] = 34; + args["PLC_TIME"] = 78; + args["PLC_VERSION"] = 69; + args["CONTROL"] = 14; + args["POWER"] = 38; + args["EMERGENCY"] = 69; + args["ENABLED"] = 51; + args["OPERATIVE_MODE"] = 94; + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Missing timestamp + answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Wrong OUTPUT field + answer = "OUTPUT:123456"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Multiple values without key, cannot find the correct timestamp + answer = "OUTPUT:GOOD,12345,67890"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Wrong timestamp format + answer = "OUTPUT:GOOD,12345.ABCD"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); +} -- GitLab From 56330fd39234cc09d9e15ec77ea4246bf172a145 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 2 Dec 2022 14:20:19 +0000 Subject: [PATCH 019/150] Moved old SRT Minor Servos to another directory --- .../config/CDB/schemas/MinorServo.xsd | 0 .../doc/derotator/derotator.pdf | Bin .../doc/derotator/icd.pdf | Bin .../doc/derotator/icd_bus.pdf | Bin .../doc/derotator/sensor.pdf | Bin .../doc/minor_servo/gimbal.pdf | Bin .../doc/minor_servo/minor_servo_system.pdf | Bin .../include/DerotatorImpl.h | 0 .../include/DevIOASConfiguration.h | 0 .../include/DevIOActualSetup.h | 0 .../include/DevIOElevationTrack.h | 0 .../include/DevIOMotionInfo.h | 0 .../include/DevIOParking.h | 0 .../include/DevIOReady.h | 0 .../include/DevIOScanActive.h | 0 .../include/DevIOScanning.h | 0 .../include/DevIOStarting.h | 0 .../include/DevIOTracking.h | 0 .../include/MSBossConfiguration.h | 0 .../include/MSBossPublisher.h | 0 .../include/MSParameters.h | 0 .../include/MinorServoBossImpl.h | 0 .../include/ParkThread.h | 0 .../include/PdoubleSeqDevIO.h | 0 .../include/RequestDispatcher.h | 0 .../include/ScanThread.h | 0 .../include/SetupThread.h | 0 .../include/SocketListener.h | 0 .../include/SubsystemStatusDevIO.h | 0 .../include/SubsystemVStatusDevIO.h | 0 .../include/TrackingThread.h | 0 .../include/WPServoImpl.h | 0 .../include/WPServoSocket.h | 0 .../include/WPServoTalker.h | 0 .../include/WPStatusDevIO.h | 0 .../include/WPStatusUpdater.h | 0 .../include/WPUtils.h | 0 .../include/libCom.h | 0 .../include/macros.def | 0 .../include/utils.h | 0 .../src/MSBossConfiguration.cpp | 0 .../src/MSBossPublisher.cpp | 0 .../src/Makefile | 0 .../src/MinorServoBossImpl.cpp | 0 .../src/ParkThread.cpp | 0 .../src/RequestDispatcher.cpp | 0 .../src/ScanThread.cpp | 0 .../src/SetupThread.cpp | 0 .../src/SocketListener.cpp | 0 .../src/TrackingThread.cpp | 0 .../src/WPServoImpl.cpp | 0 .../src/WPServoSocket.cpp | 0 .../src/WPServoTalker.cpp | 0 .../src/WPStatusUpdater.cpp | 0 .../src/WPUtils.cpp | 0 .../src/libCom.cpp | 0 .../src/utils.cpp | 0 .../test/Makefile | 0 .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/test_container_crash.py | 0 .../test/functional/test_failure.py | 0 .../test/functional/test_setup.py | 0 .../functional/test_setup_after_manual_movement.py | 0 .../test/no_auto/Makefile | 0 .../test/no_auto/commissioning/05082013.rst | 0 .../commissioning/SRP_linear/plot_positions.py | 0 .../SRP_linear/test_SRP_linear_movement.py | 0 .../test/no_auto/commissioning/TODO.rst | 0 .../test/no_auto/commissioning/clean_test.py | 0 .../test/no_auto/commissioning/command_input.py | 0 .../getAxesPosition/test_getAxesPosition.py | 0 .../getAxesPosition/test_getAxesPositionSpeed.py | 0 .../getFromHistory/test_getFromHistory.py | 0 .../offsets/testSRP_after_startFocusScan.py | 0 .../offsets/testSRP_before_startFocusScan.py | 0 .../test/no_auto/commissioning/parameters.py | 0 .../test/no_auto/commissioning/plot_positions.py | 0 .../commissioning/property/property_sampler.py | 0 .../sampling_time/test_getstatus_speed.py | 0 .../commissioning/scan/testSRP_checkFocusScan.py | 0 .../scan/testSRP_checkMinPositioninTime.py | 0 .../scan/testSRP_multiple_startFocusScan.py | 0 .../scan/testSRP_pointingDuringScan.py | 0 .../commissioning/scan/testSRP_startFocusScan.py | 0 .../commissioning/scan/testSRP_startFocusScanNow.py | 0 .../no_auto/commissioning/scan/testSRP_stopScan.py | 0 .../commissioning/timed_pos/timed_positions1SRP.py | 0 .../commissioning/timed_pos/timed_positions2PFP.py | 0 .../commissioning/timed_pos/timed_positions2SRP.py | 0 .../tracking/test_SRP_elevation_tracking.py | 0 .../test/no_auto/performances/get_axes_positions.py | 0 .../test/no_auto/real2virtual.c | 0 .../test/no_auto/send_command.py | 0 .../test/no_auto/simple_talk.py | 0 .../test/no_auto/srp_refsystems/hexlib/Makefile | 0 .../test/no_auto/srp_refsystems/hexlib/hexdata.txt | 0 .../test/no_auto/srp_refsystems/hexlib/hexlib.c | 0 .../test/no_auto/srp_refsystems/hexlib/hexlib.h | 0 .../no_auto/srp_refsystems/hexlib/real2virtual.c | 0 .../no_auto/srp_refsystems/hexlib/virtual2real.c | 0 .../test/no_auto/srp_refsystems/srp_refsystems.pyw | 0 .../test/no_auto/virtual2real.c | 0 .../test/no_auto/wpservo_test.py | 0 .../test/pyunit/__init__.py | 0 .../test/unittest.cpp | 0 106 files changed, 0 insertions(+), 0 deletions(-) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/config/CDB/schemas/MinorServo.xsd (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/derotator.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/icd.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/icd_bus.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/sensor.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/minor_servo/gimbal.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/minor_servo/minor_servo_system.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DerotatorImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOASConfiguration.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOActualSetup.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOElevationTrack.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOMotionInfo.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOParking.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOReady.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOScanActive.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOScanning.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOStarting.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOTracking.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSBossConfiguration.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSBossPublisher.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSParameters.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MinorServoBossImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/ParkThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/PdoubleSeqDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/RequestDispatcher.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/ScanThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SetupThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SocketListener.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SubsystemStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SubsystemVStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/TrackingThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoSocket.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoTalker.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPStatusUpdater.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPUtils.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/libCom.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/macros.def (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/utils.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MSBossConfiguration.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MSBossPublisher.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MinorServoBossImpl.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/ParkThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/RequestDispatcher.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/ScanThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/SetupThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/SocketListener.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/TrackingThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoImpl.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoSocket.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoTalker.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPStatusUpdater.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPUtils.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/libCom.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/utils.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/external/__init__.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/__init__.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_container_crash.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_failure.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_setup.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_setup_after_manual_movement.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/05082013.rst (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/SRP_linear/plot_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/TODO.rst (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/clean_test.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/command_input.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/parameters.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/plot_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/property/property_sampler.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_stopScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/performances/get_axes_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/real2virtual.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/send_command.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/simple_talk.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexdata.txt (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexlib.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexlib.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/real2virtual.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/virtual2real.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/srp_refsystems.pyw (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/virtual2real.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/wpservo_test.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/pyunit/__init__.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/unittest.cpp (100%) diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/MinorServo.xsd b/SRT/Servers/SRTOldMinorServo/config/CDB/schemas/MinorServo.xsd similarity index 100% rename from SRT/Servers/SRTMinorServo/config/CDB/schemas/MinorServo.xsd rename to SRT/Servers/SRTOldMinorServo/config/CDB/schemas/MinorServo.xsd diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/derotator.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/derotator.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/derotator.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/derotator.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/icd.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/icd.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/icd.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/icd.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/icd_bus.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/icd_bus.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/icd_bus.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/icd_bus.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/sensor.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/sensor.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/sensor.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/sensor.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/minor_servo/gimbal.pdf b/SRT/Servers/SRTOldMinorServo/doc/minor_servo/gimbal.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/minor_servo/gimbal.pdf rename to SRT/Servers/SRTOldMinorServo/doc/minor_servo/gimbal.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/minor_servo/minor_servo_system.pdf b/SRT/Servers/SRTOldMinorServo/doc/minor_servo/minor_servo_system.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/minor_servo/minor_servo_system.pdf rename to SRT/Servers/SRTOldMinorServo/doc/minor_servo/minor_servo_system.pdf diff --git a/SRT/Servers/SRTMinorServo/include/DerotatorImpl.h b/SRT/Servers/SRTOldMinorServo/include/DerotatorImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DerotatorImpl.h rename to SRT/Servers/SRTOldMinorServo/include/DerotatorImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOASConfiguration.h b/SRT/Servers/SRTOldMinorServo/include/DevIOASConfiguration.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOASConfiguration.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOASConfiguration.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOActualSetup.h b/SRT/Servers/SRTOldMinorServo/include/DevIOActualSetup.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOActualSetup.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOActualSetup.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOElevationTrack.h b/SRT/Servers/SRTOldMinorServo/include/DevIOElevationTrack.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOElevationTrack.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOElevationTrack.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOMotionInfo.h b/SRT/Servers/SRTOldMinorServo/include/DevIOMotionInfo.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOMotionInfo.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOMotionInfo.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOParking.h b/SRT/Servers/SRTOldMinorServo/include/DevIOParking.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOParking.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOParking.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOReady.h b/SRT/Servers/SRTOldMinorServo/include/DevIOReady.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOReady.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOReady.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOScanActive.h b/SRT/Servers/SRTOldMinorServo/include/DevIOScanActive.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOScanActive.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOScanActive.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOScanning.h b/SRT/Servers/SRTOldMinorServo/include/DevIOScanning.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOScanning.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOScanning.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOStarting.h b/SRT/Servers/SRTOldMinorServo/include/DevIOStarting.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOStarting.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOStarting.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOTracking.h b/SRT/Servers/SRTOldMinorServo/include/DevIOTracking.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOTracking.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOTracking.h diff --git a/SRT/Servers/SRTMinorServo/include/MSBossConfiguration.h b/SRT/Servers/SRTOldMinorServo/include/MSBossConfiguration.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSBossConfiguration.h rename to SRT/Servers/SRTOldMinorServo/include/MSBossConfiguration.h diff --git a/SRT/Servers/SRTMinorServo/include/MSBossPublisher.h b/SRT/Servers/SRTOldMinorServo/include/MSBossPublisher.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSBossPublisher.h rename to SRT/Servers/SRTOldMinorServo/include/MSBossPublisher.h diff --git a/SRT/Servers/SRTMinorServo/include/MSParameters.h b/SRT/Servers/SRTOldMinorServo/include/MSParameters.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSParameters.h rename to SRT/Servers/SRTOldMinorServo/include/MSParameters.h diff --git a/SRT/Servers/SRTMinorServo/include/MinorServoBossImpl.h b/SRT/Servers/SRTOldMinorServo/include/MinorServoBossImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MinorServoBossImpl.h rename to SRT/Servers/SRTOldMinorServo/include/MinorServoBossImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/ParkThread.h b/SRT/Servers/SRTOldMinorServo/include/ParkThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/ParkThread.h rename to SRT/Servers/SRTOldMinorServo/include/ParkThread.h diff --git a/SRT/Servers/SRTMinorServo/include/PdoubleSeqDevIO.h b/SRT/Servers/SRTOldMinorServo/include/PdoubleSeqDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/PdoubleSeqDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/PdoubleSeqDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/RequestDispatcher.h b/SRT/Servers/SRTOldMinorServo/include/RequestDispatcher.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/RequestDispatcher.h rename to SRT/Servers/SRTOldMinorServo/include/RequestDispatcher.h diff --git a/SRT/Servers/SRTMinorServo/include/ScanThread.h b/SRT/Servers/SRTOldMinorServo/include/ScanThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/ScanThread.h rename to SRT/Servers/SRTOldMinorServo/include/ScanThread.h diff --git a/SRT/Servers/SRTMinorServo/include/SetupThread.h b/SRT/Servers/SRTOldMinorServo/include/SetupThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SetupThread.h rename to SRT/Servers/SRTOldMinorServo/include/SetupThread.h diff --git a/SRT/Servers/SRTMinorServo/include/SocketListener.h b/SRT/Servers/SRTOldMinorServo/include/SocketListener.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SocketListener.h rename to SRT/Servers/SRTOldMinorServo/include/SocketListener.h diff --git a/SRT/Servers/SRTMinorServo/include/SubsystemStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/SubsystemStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SubsystemStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/SubsystemStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/SubsystemVStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/SubsystemVStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SubsystemVStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/SubsystemVStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/TrackingThread.h b/SRT/Servers/SRTOldMinorServo/include/TrackingThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/TrackingThread.h rename to SRT/Servers/SRTOldMinorServo/include/TrackingThread.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoImpl.h b/SRT/Servers/SRTOldMinorServo/include/WPServoImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoImpl.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoSocket.h b/SRT/Servers/SRTOldMinorServo/include/WPServoSocket.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoSocket.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoSocket.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoTalker.h b/SRT/Servers/SRTOldMinorServo/include/WPServoTalker.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoTalker.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoTalker.h diff --git a/SRT/Servers/SRTMinorServo/include/WPStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/WPStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/WPStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/WPStatusUpdater.h b/SRT/Servers/SRTOldMinorServo/include/WPStatusUpdater.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPStatusUpdater.h rename to SRT/Servers/SRTOldMinorServo/include/WPStatusUpdater.h diff --git a/SRT/Servers/SRTMinorServo/include/WPUtils.h b/SRT/Servers/SRTOldMinorServo/include/WPUtils.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPUtils.h rename to SRT/Servers/SRTOldMinorServo/include/WPUtils.h diff --git a/SRT/Servers/SRTMinorServo/include/libCom.h b/SRT/Servers/SRTOldMinorServo/include/libCom.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/libCom.h rename to SRT/Servers/SRTOldMinorServo/include/libCom.h diff --git a/SRT/Servers/SRTMinorServo/include/macros.def b/SRT/Servers/SRTOldMinorServo/include/macros.def similarity index 100% rename from SRT/Servers/SRTMinorServo/include/macros.def rename to SRT/Servers/SRTOldMinorServo/include/macros.def diff --git a/SRT/Servers/SRTMinorServo/include/utils.h b/SRT/Servers/SRTOldMinorServo/include/utils.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/utils.h rename to SRT/Servers/SRTOldMinorServo/include/utils.h diff --git a/SRT/Servers/SRTMinorServo/src/MSBossConfiguration.cpp b/SRT/Servers/SRTOldMinorServo/src/MSBossConfiguration.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MSBossConfiguration.cpp rename to SRT/Servers/SRTOldMinorServo/src/MSBossConfiguration.cpp diff --git a/SRT/Servers/SRTMinorServo/src/MSBossPublisher.cpp b/SRT/Servers/SRTOldMinorServo/src/MSBossPublisher.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MSBossPublisher.cpp rename to SRT/Servers/SRTOldMinorServo/src/MSBossPublisher.cpp diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTOldMinorServo/src/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/src/Makefile rename to SRT/Servers/SRTOldMinorServo/src/Makefile diff --git a/SRT/Servers/SRTMinorServo/src/MinorServoBossImpl.cpp b/SRT/Servers/SRTOldMinorServo/src/MinorServoBossImpl.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MinorServoBossImpl.cpp rename to SRT/Servers/SRTOldMinorServo/src/MinorServoBossImpl.cpp diff --git a/SRT/Servers/SRTMinorServo/src/ParkThread.cpp b/SRT/Servers/SRTOldMinorServo/src/ParkThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/ParkThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/ParkThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/RequestDispatcher.cpp b/SRT/Servers/SRTOldMinorServo/src/RequestDispatcher.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/RequestDispatcher.cpp rename to SRT/Servers/SRTOldMinorServo/src/RequestDispatcher.cpp diff --git a/SRT/Servers/SRTMinorServo/src/ScanThread.cpp b/SRT/Servers/SRTOldMinorServo/src/ScanThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/ScanThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/ScanThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/SetupThread.cpp b/SRT/Servers/SRTOldMinorServo/src/SetupThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/SetupThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/SetupThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/SocketListener.cpp b/SRT/Servers/SRTOldMinorServo/src/SocketListener.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/SocketListener.cpp rename to SRT/Servers/SRTOldMinorServo/src/SocketListener.cpp diff --git a/SRT/Servers/SRTMinorServo/src/TrackingThread.cpp b/SRT/Servers/SRTOldMinorServo/src/TrackingThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/TrackingThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/TrackingThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoImpl.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoImpl.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoImpl.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoImpl.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoSocket.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoSocket.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoSocket.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoSocket.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoTalker.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoTalker.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoTalker.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoTalker.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPStatusUpdater.cpp b/SRT/Servers/SRTOldMinorServo/src/WPStatusUpdater.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPStatusUpdater.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPStatusUpdater.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPUtils.cpp b/SRT/Servers/SRTOldMinorServo/src/WPUtils.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPUtils.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPUtils.cpp diff --git a/SRT/Servers/SRTMinorServo/src/libCom.cpp b/SRT/Servers/SRTOldMinorServo/src/libCom.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/libCom.cpp rename to SRT/Servers/SRTOldMinorServo/src/libCom.cpp diff --git a/SRT/Servers/SRTMinorServo/src/utils.cpp b/SRT/Servers/SRTOldMinorServo/src/utils.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/utils.cpp rename to SRT/Servers/SRTOldMinorServo/src/utils.cpp diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTOldMinorServo/test/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/test/Makefile rename to SRT/Servers/SRTOldMinorServo/test/Makefile diff --git a/SRT/Servers/SRTMinorServo/test/external/__init__.py b/SRT/Servers/SRTOldMinorServo/test/external/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/external/__init__.py rename to SRT/Servers/SRTOldMinorServo/test/external/__init__.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/__init__.py b/SRT/Servers/SRTOldMinorServo/test/functional/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/__init__.py rename to SRT/Servers/SRTOldMinorServo/test/functional/__init__.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_container_crash.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_container_crash.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_container_crash.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_container_crash.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_failure.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_failure.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_failure.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_failure.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_setup.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_setup.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_setup.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_setup.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_setup_after_manual_movement.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_setup_after_manual_movement.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_setup_after_manual_movement.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_setup_after_manual_movement.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/Makefile b/SRT/Servers/SRTOldMinorServo/test/no_auto/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/Makefile rename to SRT/Servers/SRTOldMinorServo/test/no_auto/Makefile diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/05082013.rst b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/05082013.rst similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/05082013.rst rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/05082013.rst diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/TODO.rst b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/TODO.rst similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/TODO.rst rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/TODO.rst diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/clean_test.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/clean_test.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/clean_test.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/clean_test.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/command_input.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/command_input.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/command_input.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/command_input.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/parameters.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/parameters.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/parameters.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/parameters.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/plot_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/plot_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/plot_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/plot_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/property/property_sampler.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/property/property_sampler.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/property/property_sampler.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/property/property_sampler.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/performances/get_axes_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/performances/get_axes_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/performances/get_axes_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/performances/get_axes_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/real2virtual.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/real2virtual.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/real2virtual.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/real2virtual.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/send_command.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/send_command.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/send_command.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/send_command.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/simple_talk.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/simple_talk.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/simple_talk.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/simple_talk.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/virtual2real.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/virtual2real.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/virtual2real.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/virtual2real.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/wpservo_test.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/wpservo_test.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/wpservo_test.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/wpservo_test.py diff --git a/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py b/SRT/Servers/SRTOldMinorServo/test/pyunit/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/pyunit/__init__.py rename to SRT/Servers/SRTOldMinorServo/test/pyunit/__init__.py diff --git a/SRT/Servers/SRTMinorServo/test/unittest.cpp b/SRT/Servers/SRTOldMinorServo/test/unittest.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/test/unittest.cpp rename to SRT/Servers/SRTOldMinorServo/test/unittest.cpp -- GitLab From 24de1ddacf9b30edbe3944426b53e034bdca851b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 24 Feb 2023 19:53:09 +0100 Subject: [PATCH 020/150] Fix #782, wrote a singleton socket class for SRT new minor servos (#783) * Fix #782, wrote a singleton socket class for SRT new minor servos This is the first implementation, connection checks for the socket should be added in order to avoid some disconnection errors * Fix #782, improved SRT MS singleton socket and tests The socket is now set to non-blocking, therefore some checks were added in order to accomodate to this change. Fixed a wrong behavior regarding the singleton design pattern. Previously it was possible to call the getInstance(ip_address, port) method multiple times with multiple addresses, but only the first instance was returned, meaning that only the first instance was actually opened to the correct IP address and port. Now if the user tries to open a second socket on a different IP address and port an exception is raised. --- .../include/SRTMinorServoCommandLibrary.h | 2 + .../src/SRTMinorServoCommandLibrary.cpp | 17 ++- .../include/SRTMinorServoSocket.h | 107 ++++++++++++++ SRT/Servers/SRTMinorServo/src/Makefile | 61 ++++++++ .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 130 ++++++++++++++++++ SRT/Servers/SRTMinorServo/test/Makefile | 91 ++++++++++++ .../SRTMinorServo/test/external/__init__.py | 0 .../SRTMinorServo/test/functional/__init__.py | 0 .../SRTMinorServo/test/pyunit/__init__.py | 0 SRT/Servers/SRTMinorServo/test/unittest.cpp | 126 +++++++++++++++++ 10 files changed, 525 insertions(+), 9 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h create mode 100644 SRT/Servers/SRTMinorServo/src/Makefile create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/Makefile create mode 100644 SRT/Servers/SRTMinorServo/test/external/__init__.py create mode 100644 SRT/Servers/SRTMinorServo/test/functional/__init__.py create mode 100644 SRT/Servers/SRTMinorServo/test/pyunit/__init__.py create mode 100644 SRT/Servers/SRTMinorServo/test/unittest.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index f62adb794..8a6631316 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -12,6 +12,8 @@ #include #include +#define CLOSER std::string("\r\n") + /** * SRT Minor Servo Command Library * diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index c150421d8..81dc5404d 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -4,10 +4,9 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommandLibrary.h" - #include #include +#include "SRTMinorServoCommandLibrary.h" std::string SRTMinorServoCommandLibrary::status(std::string servo_id) { @@ -17,28 +16,28 @@ std::string SRTMinorServoCommandLibrary::status(std::string servo_id) { command << "=" << servo_id; } - command << "\r\n"; + command << CLOSER; return command.str(); } std::string SRTMinorServoCommandLibrary::setup(std::string configuration) { std::stringstream command; - command << "SETUP=" << configuration << "\r\n"; + command << "SETUP=" << configuration << CLOSER; return command.str(); } std::string SRTMinorServoCommandLibrary::stow(std::string servo_id, unsigned int stow_position) { std::stringstream command; - command << "STOW=" << servo_id << "," << stow_position << "\r\n"; + command << "STOW=" << servo_id << "," << stow_position << CLOSER; return command.str(); } std::string SRTMinorServoCommandLibrary::stop(std::string servo_id) { std::stringstream command; - command << "STOP=" << servo_id << "\r\n"; + command << "STOP=" << servo_id << CLOSER; return command.str(); } @@ -50,7 +49,7 @@ std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vecto { command << "," << coordinates[coordinate]; } - command << "\r\n"; + command << CLOSER; return command.str(); } @@ -72,7 +71,7 @@ std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, long { command << "," << coordinates[coordinate]; } - command << "\r\n"; + command << CLOSER; return command.str(); } @@ -84,7 +83,7 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto { command << "," << coordinates[coordinate]; } - command << "\r\n"; + command << CLOSER; return command.str(); } diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h new file mode 100644 index 000000000..cfe5615c9 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -0,0 +1,107 @@ +#ifndef __SRTMINORSERVOSOCKET_H__ +#define __SRTMINORSERVOSOCKET_H__ + +/** + * SRTMinorServoSocketLibrary.h + * 2023/02/23 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include "SRTMinorServoCommandLibrary.h" + +#define TIMEOUT 0.1 + +using namespace IRA; + +// Definition of test class. It is re-defined in the unittest.cpp file. +class SRTMinorServoSocketTest; + +class SRTMinorServoSocket: public IRA::CSocket +{ +// Declare the SRTMinorServoSocketTest class as friend in order for it to have access to destroyInstance for testing purposes +friend class SRTMinorServoSocketTest; + +public: + /** + * Calls the constructor and returns the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + * @return the singleton socket instance, connected to the given IP address and port, by reference + * @throw ComponentErrors::SocketErrorExImpl when the user calls this method a second time with different IP address and port arguments + */ + static SRTMinorServoSocket& getInstance(std::string ip_address, int port); + + /** + * Returns the previously generated singleton socket instance + * @return the singleton socket instance, by reference + * @throw ComponentErrors::SocketErrorExImpl when the user calls this method when the instance has not been generated yet + */ + static SRTMinorServoSocket& getInstance(); + + /** + * Sends a command on the socket and returns the received answer, if any + * @param command the command to be sent over the socket + * @return the received answer to the given command + */ + std::string sendCommand(std::string command); + + /** + * Copy constructor operator disabled by default + */ + SRTMinorServoSocket(SRTMinorServoSocket const&) = delete; + + /** + * Copy assignment operator disabled by default + */ + void operator=(SRTMinorServoSocket const&) = delete; + +protected: + /* + * Force the destruction of the singleton socket object. Only used in tests + */ + static void destroyInstance(); + +private: + /* + * Constructor method. Generates the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + */ + SRTMinorServoSocket(std::string ip_address, int port); + + /* + * Destructor method. Closes the socket upon destruction + */ + ~SRTMinorServoSocket(); + + /* + * Instance of the socket. By default it gets initialized to a null pointer + */ + inline static SRTMinorServoSocket* m_instance = nullptr; + + /* + * IP address and port of the socket. Being object members their values only exist when a singleton socket object is created correctly + */ + std::string m_address; + int m_port; + + /* + * Mutex object used to syncronize communications and prevent collisions between multiple threads + */ + std::mutex m_mutex; + + /* + * Socket status enumerator + */ + enum socket_status { READY, NOTRDY, BROKEN, TOUT, BUSY } m_socket_status; + + /* + * Socket error variable. This stores an error condition in case it arises + */ + IRA::CError m_error; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile new file mode 100644 index 000000000..6cca032de --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -0,0 +1,61 @@ +#******************************************** +#-------------------------------------------- +# Giuseppe Carboni +#-------------------------------------------- +#******************************************** +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# On-Line Database Files +# ---------------------- +CDB_SCHEMAS = + +# ---------------------------- +# Libraries (public and local) +# ---------------------------- +LIBRARIES = SRTMinorServoSocket + +SRTMinorServoSocket_OBJECTS = SRTMinorServoSocket +SRTMinorServoSocket_CFLAGS = -std=c++17 +SRTMinorServoSocket_LIBS = IRALibrary ComponentErrors SRTMinorServoCommandLibrary + + +# ---------------------------------------------------------------------- +# List of all possible C-sources (used to create automatic dependencies) +# ---------------------------------------------------------------------- +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + + +# ----------------- +# Include Standards +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + + +# TARGETS +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + +#___oOo___ diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp new file mode 100644 index 000000000..ad3a53ca2 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp @@ -0,0 +1,130 @@ +#include "SRTMinorServoSocket.h" + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port) +{ + if(m_instance != nullptr) + { + if(m_instance->m_address != ip_address && m_instance->m_port != port) + { + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::getInstance(std::string, int)"); + exImpl.addData("Reason", "Socket already open on '" + m_instance->m_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object."); + throw exImpl; + } + } + else + { + m_instance = new SRTMinorServoSocket(ip_address, port); + } + return *m_instance; +} + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance() +{ + if(m_instance == nullptr) + { + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::getInstance()"); + exImpl.addData("Reason", "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + throw exImpl; + } + return *m_instance; +} + +void SRTMinorServoSocket::destroyInstance() +{ + if(m_instance != nullptr) + { + delete m_instance; + m_instance = nullptr; + } +} + +SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port) +{ + if(Create(m_error, STREAM) == FAIL) + { + Close(m_error); + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); + exImpl.addData("Reason", "Cannot create the socket."); + throw exImpl; + } + + if(Connect(m_error, ip_address.c_str(), port) == FAIL) + { + m_socket_status = TOUT; + Close(m_error); + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); + exImpl.addData("Reason", "Cannot connect the socket."); + throw exImpl; + } + + if(setSockMode(m_error, NONBLOCKING) != SUCCESS) + { + m_socket_status = NOTRDY; + Close(m_error); + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); + exImpl.addData("Reason", "Cannot set the socket to non-blocking."); + throw exImpl; + } + + m_address = ip_address; + m_port = port; +} + +SRTMinorServoSocket::~SRTMinorServoSocket() +{ + std::lock_guard guard(m_mutex); + Close(m_error); +} + +std::string SRTMinorServoSocket::sendCommand(std::string command) +{ + std::lock_guard guard(m_mutex); + + double start_time = CIRATools::getUNIXEpoch(); + size_t sent_bytes = 0; + + while(sent_bytes < command.size()) + { + size_t sent_now = Send(m_error, command.substr(sent_bytes, command.size() - sent_bytes).c_str(), command.size() - sent_bytes); + sent_bytes += sent_now; + + if(sent_now > 0) + { + // Reset the timer + start_time = CIRATools::getUNIXEpoch(); + } + else if(CIRATools::getUNIXEpoch() - start_time >= TIMEOUT) + { + m_socket_status = TOUT; + Close(m_error); + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); + exImpl.addData("Reason", "Timeout when sending command."); + throw exImpl; + } + } + + start_time = CIRATools::getUNIXEpoch(); + std::string answer; + + while(answer.size() < 2 || !(answer.rfind(CLOSER) == answer.size() - CLOSER.size())) + { + char buf; + if(Receive(m_error, &buf, 1) == 1) + { + answer += buf; + + // Reset the timer + start_time = CIRATools::getUNIXEpoch(); + } + else if(CIRATools::getUNIXEpoch() - start_time >= TIMEOUT) + { + m_socket_status = TOUT; + Close(m_error); + ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); + exImpl.addData("Reason", "Timeout when receiving answer."); + throw exImpl; + } + } + + return answer; +} diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile new file mode 100644 index 000000000..6419faf13 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -0,0 +1,91 @@ +# CPP UNIT TESTING SETUP +#-------------- +GTEST_HOME=/usr/local/include/gtest +GMOCK_HOME=/usr/local/include/gmock +GTEST_LIBS=gtest gtest_main + +USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +EXECUTABLES_L = unittest +unittest_OBJECTS = unittest +unittest_CFLAGS = -std=c++17 +unittest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary +unittest_LDFLAGS = -lstdc++ -lpthread + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Servers/SRTMinorServo/test/external/__init__.py b/SRT/Servers/SRTMinorServo/test/external/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTMinorServo/test/functional/__init__.py b/SRT/Servers/SRTMinorServo/test/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py b/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTMinorServo/test/unittest.cpp b/SRT/Servers/SRTMinorServo/test/unittest.cpp new file mode 100644 index 000000000..de7bd9c37 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/unittest.cpp @@ -0,0 +1,126 @@ +/* These tests require a running simulator and were designed * + * to test the thread-safeness and singleton design pattern of the * + * SRTMinorServoSocket class. */ +#include "gtest/gtest.h" +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 + +class SRTMinorServoSocketTest : public ::testing::Test +{ +protected: + std::vector commands; + std::vector threads; + + void SetUp() override + { + std::cout << std::fixed << std::setprecision(6); + + // The following commands yield an articulated answer in return + commands.push_back(SRTMinorServoCommandLibrary::status()); + commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); + commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); + } + + void TearDown() override + { + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); + + SRTMinorServoSocket::destroyInstance(); + } +}; + +// This test passes the already created instance to some threads +TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + for(auto command : this->commands) + { + this->threads.push_back(std::thread([command, &socket]() + { + auto args = SRTMinorServoCommandLibrary::parseAnswer(socket.sendCommand(command)); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); + })); + } +} + +// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it +TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) +{ + for(auto command : this->commands) + { + this->threads.push_back(std::thread([command]() + { + auto args = SRTMinorServoCommandLibrary::parseAnswer(SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command)); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); + })); + } +} + +// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails +TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) +{ + // First let's open the socket with the chosen ADDRESS and PORT + SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + try + { + // Let's try to instance another socket on a different port + SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + } +} + +// This test tries to retrieve an instance which has not been generated yet, failing +TEST_F(SRTMinorServoSocketTest, try_open_without_args) +{ + try + { + SRTMinorServoSocket::getInstance(); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); + } +} + +// This test tries to generate an instance using a pair of address and port on which the socket fails to open +TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) +{ + try + { + // The exception is raised only if the given port is wrong + SRTMinorServoSocket::getInstance(ADDRESS, 0); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Cannot connect the socket.").c_str()); + } +} -- GitLab From ade9e053684258b729a85c08773f2c123a684937 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 23 Mar 2023 09:18:08 +0000 Subject: [PATCH 021/150] Updated the SRTMinorServoCommandLibrary --- .../include/SRTMinorServoCommandLibrary.h | 4 +++- .../src/PySRTMinorServoCommandLibrary.cpp | 2 +- .../src/SRTMinorServoCommandLibrary.cpp | 8 +++++--- .../SRTMinorServoLibrary/tests/unittest.cpp | 14 +++++++------- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 8a6631316..603263fbf 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -14,6 +14,8 @@ #define CLOSER std::string("\r\n") +using SRTMinorServoAnswerMap = std::map >; + /** * SRT Minor Servo Command Library * @@ -83,7 +85,7 @@ public: * @param answer the string containing the answer received from the VBrain proxy * @return a std::map (dictionary) containing the answer splitted into keys and values. The keys are always std::string, the values can either be int, double or std::string. */ - static std::map > parseAnswer(std::string answer); + static SRTMinorServoAnswerMap parseAnswer(std::string answer); }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp index a9688c6ee..ed66a79ba 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -31,7 +31,7 @@ boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(std::string answe boost::python::dict dictionary; - typename std::map >::iterator iter; + SRTMinorServoAnswerMap::iterator iter; for(iter = args.begin(); iter != args.end(); ++iter) { diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index 81dc5404d..53cdd8302 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -87,14 +87,16 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto return command.str(); } -std::map > SRTMinorServoCommandLibrary::parseAnswer(std::string answer) +SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answer) { - // First thing first, standardize the separators + // First thing first, standardize the separators and remove the newline/carriage return characters std::replace(answer.begin(), answer.end(), ':', '='); std::replace(answer.begin(), answer.end(), '|', ','); + answer.erase(std::remove(answer.begin(), answer.end(), '\n'), answer.end()); + answer.erase(std::remove(answer.begin(), answer.end(), '\r'), answer.end()); // Create the dictionary - std::map > args; + SRTMinorServoAnswerMap args; std::stringstream ss(answer); std::string token; diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp index 78d74afbc..9ebdcf668 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp @@ -55,14 +55,14 @@ TEST(SRTMinorServoCommandLibraryTest, offset) TEST(SRTMinorServoCommandLibraryTest, parseAnswer) { // Minimal correct answer - std::string answer = "OUTPUT:GOOD,1665743366.654321"; - std::map > args; + std::string answer = "OUTPUT:GOOD,1665743366.654321\r\n"; + SRTMinorServoAnswerMap args; args["OUTPUT"] = "GOOD"; args["TIMESTAMP"] = 1665743366.654321; EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Complete correct answer - answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94"; + answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; args.clear(); args["OUTPUT"] = "GOOD"; args["TIMESTAMP"] = 1665743366.123456; @@ -78,22 +78,22 @@ TEST(SRTMinorServoCommandLibraryTest, parseAnswer) EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Missing timestamp - answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94"; + answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; args.clear(); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Wrong OUTPUT field - answer = "OUTPUT:123456"; + answer = "OUTPUT:123456\r\n"; args.clear(); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Multiple values without key, cannot find the correct timestamp - answer = "OUTPUT:GOOD,12345,67890"; + answer = "OUTPUT:GOOD,12345,67890\r\n"; args.clear(); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Wrong timestamp format - answer = "OUTPUT:GOOD,12345.ABCD"; + answer = "OUTPUT:GOOD,12345.ABCD\r\n"; args.clear(); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); } -- GitLab From 749441dd548088c5822e3b41df6cceb1823d0105 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 24 Mar 2023 12:54:52 +0000 Subject: [PATCH 022/150] Added a test for SRP Program Track --- .../include/SRTMinorServoSocket.h | 24 +- .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 21 +- SRT/Servers/SRTMinorServo/test/Makefile | 19 +- .../test/SRPProgramTrackTest.cpp | 213 ++++++++++++++++++ .../test/SRTMinorServoSocketTest.cpp | 187 +++++++++++++++ SRT/Servers/SRTMinorServo/test/unittest.cpp | 126 ----------- 6 files changed, 444 insertions(+), 146 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp delete mode 100644 SRT/Servers/SRTMinorServo/test/unittest.cpp diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index cfe5615c9..fcf71eb12 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -2,7 +2,7 @@ #define __SRTMINORSERVOSOCKET_H__ /** - * SRTMinorServoSocketLibrary.h + * SRTMinorServoSocket.h * 2023/02/23 * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ @@ -16,23 +16,22 @@ using namespace IRA; -// Definition of test class. It is re-defined in the unittest.cpp file. -class SRTMinorServoSocketTest; - class SRTMinorServoSocket: public IRA::CSocket { // Declare the SRTMinorServoSocketTest class as friend in order for it to have access to destroyInstance for testing purposes friend class SRTMinorServoSocketTest; +friend class SRPProgramTrackTest; public: /** * Calls the constructor and returns the singleton socket instance * @param ip_address the IP address to which the socket will connect * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed * @return the singleton socket instance, connected to the given IP address and port, by reference * @throw ComponentErrors::SocketErrorExImpl when the user calls this method a second time with different IP address and port arguments */ - static SRTMinorServoSocket& getInstance(std::string ip_address, int port); + static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=TIMEOUT); /** * Returns the previously generated singleton socket instance @@ -46,7 +45,7 @@ public: * @param command the command to be sent over the socket * @return the received answer to the given command */ - std::string sendCommand(std::string command); + SRTMinorServoAnswerMap sendCommand(std::string command); /** * Copy constructor operator disabled by default @@ -69,8 +68,9 @@ private: * Constructor method. Generates the singleton socket instance * @param ip_address the IP address to which the socket will connect * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed */ - SRTMinorServoSocket(std::string ip_address, int port); + SRTMinorServoSocket(std::string ip_address, int port, double timeout); /* * Destructor method. Closes the socket upon destruction @@ -88,11 +88,21 @@ private: std::string m_address; int m_port; + /* + * Timeout for communication operations + */ + double m_timeout; + /* * Mutex object used to syncronize communications and prevent collisions between multiple threads */ std::mutex m_mutex; + /* + * Library mutex, used only to synchronize the getInstance methods + */ + static std::mutex c_mutex; + /* * Socket status enumerator */ diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp index ad3a53ca2..acdebca2a 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp @@ -1,7 +1,11 @@ #include "SRTMinorServoSocket.h" -SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port) +std::mutex SRTMinorServoSocket::c_mutex; + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port, double timeout) { + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + if(m_instance != nullptr) { if(m_instance->m_address != ip_address && m_instance->m_port != port) @@ -13,13 +17,15 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, in } else { - m_instance = new SRTMinorServoSocket(ip_address, port); + m_instance = new SRTMinorServoSocket(ip_address, port, timeout); } return *m_instance; } SRTMinorServoSocket& SRTMinorServoSocket::getInstance() { + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + if(m_instance == nullptr) { ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::getInstance()"); @@ -38,7 +44,7 @@ void SRTMinorServoSocket::destroyInstance() } } -SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port) +SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, double timeout) { if(Create(m_error, STREAM) == FAIL) { @@ -68,6 +74,7 @@ SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port) m_address = ip_address; m_port = port; + m_timeout = timeout; } SRTMinorServoSocket::~SRTMinorServoSocket() @@ -76,7 +83,7 @@ SRTMinorServoSocket::~SRTMinorServoSocket() Close(m_error); } -std::string SRTMinorServoSocket::sendCommand(std::string command) +SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) { std::lock_guard guard(m_mutex); @@ -93,7 +100,7 @@ std::string SRTMinorServoSocket::sendCommand(std::string command) // Reset the timer start_time = CIRATools::getUNIXEpoch(); } - else if(CIRATools::getUNIXEpoch() - start_time >= TIMEOUT) + else if(CIRATools::getUNIXEpoch() - start_time >= m_timeout) { m_socket_status = TOUT; Close(m_error); @@ -116,7 +123,7 @@ std::string SRTMinorServoSocket::sendCommand(std::string command) // Reset the timer start_time = CIRATools::getUNIXEpoch(); } - else if(CIRATools::getUNIXEpoch() - start_time >= TIMEOUT) + else if(CIRATools::getUNIXEpoch() - start_time >= m_timeout) { m_socket_status = TOUT; Close(m_error); @@ -126,5 +133,5 @@ std::string SRTMinorServoSocket::sendCommand(std::string command) } } - return answer; + return SRTMinorServoCommandLibrary::parseAnswer(answer); } diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 6419faf13..9d3a94f5d 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,11 +14,17 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = unittest -unittest_OBJECTS = unittest -unittest_CFLAGS = -std=c++17 -unittest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary -unittest_LDFLAGS = -lstdc++ -lpthread +EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest + +SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest +SRTMinorServoSocketTest_CFLAGS = -std=c++17 +SRTMinorServoSocketTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors +SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread + +SRPProgramTrackTest_OBJECTS = SRPProgramTrackTest +SRPProgramTrackTest_CFLAGS = -std=c++17 +SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors +SRPProgramTrackTest_LDFLAGS = -lstdc++ -lpthread # END OF CUSTOMIZATION # do not edit below this line @@ -40,7 +46,8 @@ endif do_unit: all @echo "running cpp unit tests" - ../bin/unittest --gtest_output=xml:results/cppunittest.xml + ../bin/SRTMinorServoSocketTest --gtest_output=xml:results/cppSRTMinorServoSocketTest.xml + ../bin/SRPProgramTrackTest --gtest_output=xml:results/cppSRPProgramTrackTest.xml do_pyunit: @echo "running python unit tests" diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp new file mode 100644 index 000000000..f514cb821 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -0,0 +1,213 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 +#define TIMEOUT 0.1 +#define NOISE_THRESHOLD 0.2 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 5 + + +std::atomic terminate = false; + +void sigintHandler(int sig_num) +{ + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; +} + +std::string serializeStatus(SRTMinorServoAnswerMap map) +{ + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + stream << std::get(map["TIMESTAMP"]); + stream << "\t" << std::get(map["SRP_TX"]); + stream << "\t" << std::get(map["SRP_TY"]); + stream << "\t" << std::get(map["SRP_TZ"]); + stream << "\t" << std::get(map["SRP_RX"]); + stream << "\t" << std::get(map["SRP_RY"]); + stream << "\t" << std::get(map["SRP_RZ"]); + return stream.str(); +} + +std::string serializeProgramTrack(double timestamp, std::vector coordinates) +{ + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + { + stream << "\t" << coordinate; + } + return stream.str(); +} + +class SRPProgramTrackTest : public ::testing::Test +{ +protected: + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentCoordinates; + currentCoordinates.push_back(std::get(SRPStatus["SRP_TX"])); + currentCoordinates.push_back(std::get(SRPStatus["SRP_TY"])); + currentCoordinates.push_back(std::get(SRPStatus["SRP_TZ"])); + currentCoordinates.push_back(std::get(SRPStatus["SRP_RX"])); + currentCoordinates.push_back(std::get(SRPStatus["SRP_RY"])); + currentCoordinates.push_back(std::get(SRPStatus["SRP_RZ"])); + return currentCoordinates; + } + + static bool compareCoordinates(std::vector first, std::vector second) + { + if(first.size() != second.size()) + { + return false; + } + + for(size_t i = 0; i < first.size(); i++) + { + if(first[i] != second[i]) + { + return false; + } + } + + return true; + } + + static void addNoiseToCoordinates(std::vector &coordinates) + { + for(size_t i = 0; i < coordinates.size(); i++) + { + coordinates[i] += std::max(-1, std::min(1, rand() % 5 - 2)) * (double(rand() % 100) / 100) * NOISE_THRESHOLD; + } + } + + void SetUp() override + { + signal(SIGINT, sigintHandler); + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, TIMEOUT); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + } + else + { + FAIL() << "Unexpected failure." << std::endl; + } + } + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + } +}; + +TEST_F(SRPProgramTrackTest, z_axis_translation) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap::iterator iterator; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_ENABLED"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + + /*for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + + std::vector startingCoordinates = {0, 0, 0, 0, 0, 0}; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + } + while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); + + std::thread t([]() + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream statusFile; + statusFile.open("SRPStatus.txt", ios::out); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + statusFile << serializeStatus(SRPStatus) << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + + statusFile.close(); + }); + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open("SRPTrajectory.txt", ios::out); + programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + std::cout << next_expected_time << std::endl; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + addNoiseToCoordinates(programTrackCoordinates); + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + programTrackFile << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + t.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp b/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp new file mode 100644 index 000000000..72399f6f7 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp @@ -0,0 +1,187 @@ +/* These tests require a running simulator and were designed * + * to test the thread-safeness and singleton design pattern of the * + * SRTMinorServoSocket class. */ +#include "gtest/gtest.h" +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 + + +class SRTMinorServoSocketTest : public ::testing::Test +{ +protected: + std::vector commands; + std::vector threads; + + void SetUp() override + { + std::cout << std::fixed << std::setprecision(6); + + // The following commands yield an articulated answer in return + commands.push_back(SRTMinorServoCommandLibrary::status()); + commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); + commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + } +}; + +// This test passes the already created instance to some threads +TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) +{ + try + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + for(auto command : this->commands) + { + this->threads.push_back(std::thread([command, &socket]() + { + auto args = socket.sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); + })); + } + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + } + else + { + FAIL() << "Unexpected failure." << std::endl; + } + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); +} + +// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it +TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) +{ + std::string error = ""; + + for(auto command : this->commands) + { + std::mutex mutex; + + this->threads.push_back(std::thread([command, &error, &mutex]() + { + try + { + auto args = SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + std::lock_guard guard(mutex); + + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + { + error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; + } + else + { + error = "Unexpected failure."; + } + } + })); + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); + + if(error != "") + { + FAIL() << error << std::endl; + } +} + +// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails +TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) +{ + try + { + // First let's open the socket with the chosen ADDRESS and PORT + SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + // Let's try to instance another socket on a different port + SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + } + } +} + +// This test tries to retrieve an instance which has not been generated yet, failing +TEST_F(SRTMinorServoSocketTest, try_open_without_args) +{ + try + { + SRTMinorServoSocket::getInstance(); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); + } + } +} + +// This test tries to generate an instance using a pair of address and port on which the socket fails to open +TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) +{ + try + { + // The exception is raised only if the given port is wrong + SRTMinorServoSocket::getInstance(ADDRESS, 0); + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + // Check if we got the correct exception + EXPECT_EQ(ex.getData("Reason"), std::string("Cannot connect the socket.").c_str()); + } +} diff --git a/SRT/Servers/SRTMinorServo/test/unittest.cpp b/SRT/Servers/SRTMinorServo/test/unittest.cpp deleted file mode 100644 index de7bd9c37..000000000 --- a/SRT/Servers/SRTMinorServo/test/unittest.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* These tests require a running simulator and were designed * - * to test the thread-safeness and singleton design pattern of the * - * SRTMinorServoSocket class. */ -#include "gtest/gtest.h" -#include -#include -#include "SRTMinorServoSocket.h" -#include "SRTMinorServoCommandLibrary.h" - -// This address and port are the ones set in the simulator -// In order for the test to properly be executed, the simulator should be launched with the following command: -// discos-simulator -s minor_servo start & -#define ADDRESS std::string("127.0.0.1") -#define PORT 12800 - -class SRTMinorServoSocketTest : public ::testing::Test -{ -protected: - std::vector commands; - std::vector threads; - - void SetUp() override - { - std::cout << std::fixed << std::setprecision(6); - - // The following commands yield an articulated answer in return - commands.push_back(SRTMinorServoCommandLibrary::status()); - commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); - commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); - commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); - commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); - } - - void TearDown() override - { - std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) - { - t.join(); - }); - - SRTMinorServoSocket::destroyInstance(); - } -}; - -// This test passes the already created instance to some threads -TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) -{ - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); - - for(auto command : this->commands) - { - this->threads.push_back(std::thread([command, &socket]() - { - auto args = SRTMinorServoCommandLibrary::parseAnswer(socket.sendCommand(command)); - // By testing if the command was received correctly we also test if the socket is working properly - // and if the answer was received correctly without being interleaved with the answer from another thread - EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); - })); - } -} - -// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it -TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) -{ - for(auto command : this->commands) - { - this->threads.push_back(std::thread([command]() - { - auto args = SRTMinorServoCommandLibrary::parseAnswer(SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command)); - // By testing if the command was received correctly we also test if the socket is working properly - // and if the answer was received correctly without being interleaved with the answer from another thread - EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); - })); - } -} - -// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails -TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) -{ - // First let's open the socket with the chosen ADDRESS and PORT - SRTMinorServoSocket::getInstance(ADDRESS, PORT); - - try - { - // Let's try to instance another socket on a different port - SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); - } -} - -// This test tries to retrieve an instance which has not been generated yet, failing -TEST_F(SRTMinorServoSocketTest, try_open_without_args) -{ - try - { - SRTMinorServoSocket::getInstance(); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); - } -} - -// This test tries to generate an instance using a pair of address and port on which the socket fails to open -TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) -{ - try - { - // The exception is raised only if the given port is wrong - SRTMinorServoSocket::getInstance(ADDRESS, 0); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Cannot connect the socket.").c_str()); - } -} -- GitLab From ca6a805819ecc04435efcbb652b96e9573bd6acd Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 28 Mar 2023 09:28:10 +0000 Subject: [PATCH 023/150] Some minor fixes for the SRTMinorServoCommandLibrary --- .../include/SRTMinorServoCommandLibrary.h | 2 +- .../src/SRTMinorServoCommandLibrary.cpp | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 603263fbf..8649d5c0c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -14,7 +14,7 @@ #define CLOSER std::string("\r\n") -using SRTMinorServoAnswerMap = std::map >; +using SRTMinorServoAnswerMap = std::map >; /** * SRT Minor Servo Command Library diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index 53cdd8302..04350ed59 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -111,14 +111,18 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ std::getline(sss, key, '='); std::getline(sss, value); - // No value, should be the timestamp + // No value, could be the timestamp if(value.empty()) { - if(args.find("TIMESTAMP") != args.end()) // Timestamp already found, some other value is missing its key - throw std::invalid_argument(std::string("Missing key for value " + value)); - - value = key; - key = "TIMESTAMP"; + if(args.find("TIMESTAMP") != args.end()) // Timestamp already found, some other value is missing + { + value = "0"; + } + else + { + value = key; + key = "TIMESTAMP"; + } } if(key == "OUTPUT") @@ -138,7 +142,7 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ else { size_t last_char; - args[key] = std::stoi(value, &last_char); + args[key] = std::stol(value, &last_char); if(last_char != value.size()) args[key] = std::stod(value); } -- GitLab From 15c6b60a62033dc9986d7a7533b7b9b6017d1825 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 28 Mar 2023 13:48:56 +0000 Subject: [PATCH 024/150] Updated SRPProgramTrackTest --- .../test/SRPProgramTrackTest.cpp | 128 +++++++++++++----- 1 file changed, 96 insertions(+), 32 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index f514cb821..d91dbdb09 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -8,12 +8,15 @@ // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & +//#define ADDRESS std::string("192.168.200.13") +//#define PORT 4758 #define ADDRESS std::string("127.0.0.1") #define PORT 12800 -#define TIMEOUT 0.1 -#define NOISE_THRESHOLD 0.2 +#define SOCKET_TIMEOUT 0.1 +#define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 -#define ADVANCE_TIMEGAP 5 +#define ADVANCE_TIMEGAP 5 +#define EPSILON 0.001 std::atomic terminate = false; @@ -29,12 +32,23 @@ std::string serializeStatus(SRTMinorServoAnswerMap map) std::stringstream stream; stream << std::fixed << std::setprecision(6); stream << std::get(map["TIMESTAMP"]); - stream << "\t" << std::get(map["SRP_TX"]); - stream << "\t" << std::get(map["SRP_TY"]); - stream << "\t" << std::get(map["SRP_TZ"]); - stream << "\t" << std::get(map["SRP_RX"]); - stream << "\t" << std::get(map["SRP_RY"]); - stream << "\t" << std::get(map["SRP_RZ"]); + std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; + + for(std::string coordinate : coordinates) + { + double value; + + try + { + value = std::get(map[coordinate]); + } + catch(...) + { + value = (double)std::get(map[coordinate]); + } + + stream << "\t" << value; + } return stream.str(); } @@ -55,12 +69,24 @@ protected: static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus) { std::vector currentCoordinates; - currentCoordinates.push_back(std::get(SRPStatus["SRP_TX"])); - currentCoordinates.push_back(std::get(SRPStatus["SRP_TY"])); - currentCoordinates.push_back(std::get(SRPStatus["SRP_TZ"])); - currentCoordinates.push_back(std::get(SRPStatus["SRP_RX"])); - currentCoordinates.push_back(std::get(SRPStatus["SRP_RY"])); - currentCoordinates.push_back(std::get(SRPStatus["SRP_RZ"])); + std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; + + for(std::string coordinate : coordinates) + { + double value; + + try + { + value = std::get(SRPStatus[coordinate]); + } + catch(...) + { + value = (double)std::get(SRPStatus[coordinate]); + } + + currentCoordinates.push_back(value); + } + return currentCoordinates; } @@ -73,7 +99,8 @@ protected: for(size_t i = 0; i < first.size(); i++) { - if(first[i] != second[i]) + double diff = fabs(first[i] - second[i]); + if(diff > EPSILON) { return false; } @@ -84,7 +111,7 @@ protected: static void addNoiseToCoordinates(std::vector &coordinates) { - for(size_t i = 0; i < coordinates.size(); i++) + for(size_t i = 0; i < 3; i++) { coordinates[i] += std::max(-1, std::min(1, rand() % 5 - 2)) * (double(rand() % 100) / 100) * NOISE_THRESHOLD; } @@ -92,13 +119,13 @@ protected: void SetUp() override { - signal(SIGINT, sigintHandler); srand((int)CIRATools::getUNIXEpoch()); std::cout << std::fixed << std::setprecision(6); try { - SRTMinorServoSocket::getInstance(ADDRESS, PORT, TIMEOUT); + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; } catch(ComponentErrors::SocketErrorExImpl& ex) { @@ -124,35 +151,65 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); SRTMinorServoAnswerMap::iterator iterator; + std::cout << "Sending MS STATUS command..."; + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + + /*SRTMinorServoAnswerMap::iterator iter; + + for(iter = MSStatus.begin(); iter != MSStatus.end(); ++iter) + { + std::visit([iter](const auto& var) mutable { std::cout << iter->first << ": " << var << std::endl; }, iter->second); + }*/ + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); - EXPECT_EQ(std::get(MSStatus["POWER"]), 1); - EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); - EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + //EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + //EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + //EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + //EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + + std::cout << "OK." << std::endl; + std::cout << "Sending initial SRP STATUS command..."; SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_ENABLED"]), 1); - EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); - EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + - /*for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + /*SRTMinorServoAnswerMap::iterator iter; + + for(iter = SRPStatus.begin(); iter != SRPStatus.end(); ++iter) { - std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + std::visit([iter](const auto& var) mutable { std::cout << iter->first << ": " << var << std::endl; }, iter->second); }*/ + std::cout << "OK." << std::endl; + std::cout << "Sending PRESET command..."; + std::vector startingCoordinates = {0, 0, 0, 0, 0, 0}; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + std::cout << "OK." << std::endl; + + signal(SIGINT, sigintHandler); + do { - std::this_thread::sleep_for(std::chrono::milliseconds(10)); + std::this_thread::sleep_for(std::chrono::milliseconds(100)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + + std::cout << serializeStatus(SRPStatus) << std::endl; + + if(terminate) + { + return; + } } while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); @@ -164,10 +221,17 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) ofstream statusFile; statusFile.open("SRPStatus.txt", ios::out); + long unsigned int counter = 0; + while(!terminate) { SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); statusFile << serializeStatus(SRPStatus) << std::endl; + if(counter % 10 == 0) + { + std::cout << serializeStatus(SRPStatus) << std::endl; + } + counter++; std::this_thread::sleep_for(std::chrono::milliseconds(10)); } @@ -175,6 +239,7 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) }); double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; long unsigned int trajectory_id = int(start_time); unsigned int point_id = 0; std::vector programTrackCoordinates = startingCoordinates; @@ -186,7 +251,7 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); ofstream programTrackFile; programTrackFile.open("SRPTrajectory.txt", ios::out); @@ -197,7 +262,6 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) while(!terminate) { next_expected_time += TIMEGAP; - std::cout << next_expected_time << std::endl; std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; -- GitLab From 4bfce05954ae59f779312bdc64e6dac773109856 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 30 Mar 2023 14:47:22 +0000 Subject: [PATCH 025/150] Improved SRP tests --- SRT/Servers/SRTMinorServo/test/Makefile | 2 +- .../test/SRPProgramTrackTest.cpp | 212 ++++++++++++++---- 2 files changed, 173 insertions(+), 41 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 9d3a94f5d..d8d695cbe 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -23,7 +23,7 @@ SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread SRPProgramTrackTest_OBJECTS = SRPProgramTrackTest SRPProgramTrackTest_CFLAGS = -std=c++17 -SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors +SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem SRPProgramTrackTest_LDFLAGS = -lstdc++ -lpthread # END OF CUSTOMIZATION diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index d91dbdb09..9859e037d 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "SRTMinorServoSocket.h" #include "SRTMinorServoCommandLibrary.h" @@ -17,6 +19,7 @@ #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 5 #define EPSILON 0.001 +#define MAX_RANGES std::vector{40, 100, 40, 0.2, 0.2, 0.2} std::atomic terminate = false; @@ -57,9 +60,7 @@ std::string serializeProgramTrack(double timestamp, std::vector coordina std::stringstream stream; stream << std::fixed << std::setprecision(6) << timestamp; for(double coordinate : coordinates) - { stream << "\t" << coordinate; - } return stream.str(); } @@ -93,17 +94,13 @@ protected: static bool compareCoordinates(std::vector first, std::vector second) { if(first.size() != second.size()) - { return false; - } for(size_t i = 0; i < first.size(); i++) { double diff = fabs(first[i] - second[i]); if(diff > EPSILON) - { return false; - } } return true; @@ -112,9 +109,18 @@ protected: static void addNoiseToCoordinates(std::vector &coordinates) { for(size_t i = 0; i < 3; i++) - { coordinates[i] += std::max(-1, std::min(1, rand() % 5 - 2)) * (double(rand() % 100) / 100) * NOISE_THRESHOLD; - } + } + + static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + sign = sign / abs(sign); + double offset_to_add; + axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 1.0; + coordinates[axis_to_move] += sign * offset_to_add; + if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + return true; + return false; } void SetUp() override @@ -130,13 +136,9 @@ protected: catch(ComponentErrors::SocketErrorExImpl& ex) { if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) - { FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - } else - { FAIL() << "Unexpected failure." << std::endl; - } } } @@ -146,7 +148,7 @@ protected: } }; -TEST_F(SRPProgramTrackTest, z_axis_translation) +TEST_F(SRPProgramTrackTest, noise_translation) { SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); SRTMinorServoAnswerMap::iterator iterator; @@ -155,18 +157,11 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); - /*SRTMinorServoAnswerMap::iterator iter; - - for(iter = MSStatus.begin(); iter != MSStatus.end(); ++iter) - { - std::visit([iter](const auto& var) mutable { std::cout << iter->first << ": " << var << std::endl; }, iter->second); - }*/ - EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); - //EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); - //EXPECT_EQ(std::get(MSStatus["POWER"]), 1); - //EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); - //EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); std::cout << "OK." << std::endl; std::cout << "Sending initial SRP STATUS command..."; @@ -176,14 +171,6 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); - - /*SRTMinorServoAnswerMap::iterator iter; - - for(iter = SRPStatus.begin(); iter != SRPStatus.end(); ++iter) - { - std::visit([iter](const auto& var) mutable { std::cout << iter->first << ": " << var << std::endl; }, iter->second); - }*/ - std::cout << "OK." << std::endl; std::cout << "Sending PRESET command..."; @@ -207,32 +194,39 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) std::cout << serializeStatus(SRPStatus) << std::endl; if(terminate) - { return; - } } while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); - std::thread t([]() + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "NoiseTranslationTest-" << 1900 + now->tm_year << std::setfill('0') << std::setw(2) << now->tm_mon + 1 << now->tm_mday << "-" << now->tm_hour << now->tm_min << now->tm_sec; + std::string directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + std::thread t([directory]() { SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; ofstream statusFile; - statusFile.open("SRPStatus.txt", ios::out); + statusFile.open(directory + "/status.txt", ios::out); long unsigned int counter = 0; + double tn = CIRATools::getUNIXEpoch(); + while(!terminate) { SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); statusFile << serializeStatus(SRPStatus) << std::endl; if(counter % 10 == 0) - { std::cout << serializeStatus(SRPStatus) << std::endl; - } counter++; - std::this_thread::sleep_for(std::chrono::milliseconds(10)); + + tn += 0.01; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); } statusFile.close(); @@ -254,7 +248,7 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); ofstream programTrackFile; - programTrackFile.open("SRPTrajectory.txt", ios::out); + programTrackFile.open(directory + "/trajectory.txt", ios::out); programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; @@ -275,3 +269,141 @@ TEST_F(SRPProgramTrackTest, z_axis_translation) programTrackFile.close(); t.join(); } + +TEST_F(SRPProgramTrackTest, cycle_movement) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap::iterator iterator; + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + + std::cout << "OK." << std::endl; + std::cout << "Sending initial SRP STATUS command..."; + + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + + std::cout << "OK." << std::endl; + std::cout << "Sending all axes to 0..."; + + std::vector startingCoordinates = {0, 0, 0, 0, 0, 0}; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + std::cout << "OK." << std::endl; + + signal(SIGINT, sigintHandler); + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + + std::cout << serializeStatus(SRPStatus) << std::endl; + + if(terminate) + return; + } + while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "CycleMovementTest-" << 1900 + now->tm_year << std::setfill('0') << std::setw(2) << now->tm_mon + 1 << now->tm_mday << "-" << now->tm_hour << now->tm_min << now->tm_sec; + std::string directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + std::thread t([directory]() + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream statusFile; + statusFile.open(directory + "/status.txt", ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + statusFile << serializeStatus(SRPStatus) << std::endl; + if(counter % 10 == 0) + std::cout << serializeStatus(SRPStatus) << std::endl; + counter++; + + tn += 0.01; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + }); + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + unsigned int axis_to_move = 3; + int sign = 1; + + while(!terminate) + { + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + sign = sign * -1; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + //std::cout << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + + if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + break; + } + } + + axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; + } + + programTrackFile.close(); + t.join(); +} -- GitLab From 207d1f480baab74da95a1d55b51e482032001b85 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 3 Apr 2023 20:11:02 +0000 Subject: [PATCH 026/150] Updated SRPProgramTrackTest --- .../test/SRPProgramTrackTest.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index 9859e037d..73c783f40 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -145,6 +145,7 @@ protected: void TearDown() override { SRTMinorServoSocket::destroyInstance(); + terminate = false; } }; @@ -374,8 +375,10 @@ TEST_F(SRPProgramTrackTest, cycle_movement) programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; - unsigned int axis_to_move = 3; + unsigned int axis_to_move = 0; int sign = 1; + unsigned int idle_count = 0; + bool idle = false; while(!terminate) { @@ -386,8 +389,20 @@ TEST_F(SRPProgramTrackTest, cycle_movement) std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; - if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + if(idle) + { + idle_count++; + if(idle_count == 5) + { + idle_count = 0; + idle = false; + } + } + else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { sign = sign * -1; + idle = true; + } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); -- GitLab From 94a3e593124afc4dd001dca981f67b257fdf1a5d Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 5 Apr 2023 08:40:03 +0000 Subject: [PATCH 027/150] Updated SRPProgramTrackTest Added a script to plot trajectories --- .../test/SRPProgramTrackTest.cpp | 311 +++++++----------- .../SRTMinorServo/test/plotTrajectories.py | 88 +++++ 2 files changed, 216 insertions(+), 183 deletions(-) create mode 100755 SRT/Servers/SRTMinorServo/test/plotTrajectories.py diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index 73c783f40..14fa0484b 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -10,63 +10,93 @@ // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & -//#define ADDRESS std::string("192.168.200.13") -//#define PORT 4758 #define ADDRESS std::string("127.0.0.1") #define PORT 12800 -#define SOCKET_TIMEOUT 0.1 +//#define ADDRESS std::string("192.168.200.13") +//#define PORT 4758 +#define SOCKET_TIMEOUT 0.5 #define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 5 -#define EPSILON 0.001 -#define MAX_RANGES std::vector{40, 100, 40, 0.2, 0.2, 0.2} - +#define EPSILON 0.00001 +#define MAX_RANGES std::vector{ 40, 100, 40, 0.2, 0.2, 0.2 } +#define STATUS_PERIOD 0.01 std::atomic terminate = false; -void sigintHandler(int sig_num) -{ - std::cout << std::endl << "Terminating..." << std::endl; - terminate = true; -} -std::string serializeStatus(SRTMinorServoAnswerMap map) +class SRPProgramTrackTest : public ::testing::Test { - std::stringstream stream; - stream << std::fixed << std::setprecision(6); - stream << std::get(map["TIMESTAMP"]); - std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; +protected: + std::vector startingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; - for(std::string coordinate : coordinates) + static void printStatus(std::string filename) { - double value; + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; - try + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) { - value = std::get(map[coordinate]); + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + statusFile << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + if(counter % 10 == 0) + std::cout << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); } - catch(...) + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeStatus(SRTMinorServoAnswerMap map) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + stream << std::get(map["TIMESTAMP"]); + std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; + + for(std::string coordinate : coordinates) { - value = (double)std::get(map[coordinate]); - } + double value; + + try + { + value = std::get(map[coordinate]); + } + catch(...) + { + value = (double)std::get(map[coordinate]); + } - stream << "\t" << value; + stream << "\t" << value; + } + return stream.str(); } - return stream.str(); -} -std::string serializeProgramTrack(double timestamp, std::vector coordinates) -{ - std::stringstream stream; - stream << std::fixed << std::setprecision(6) << timestamp; - for(double coordinate : coordinates) - stream << "\t" << coordinate; - return stream.str(); -} + static std::string serializeProgramTrack(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } -class SRPProgramTrackTest : public ::testing::Test -{ -protected: static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus) { std::vector currentCoordinates; @@ -140,65 +170,74 @@ protected: else FAIL() << "Unexpected failure." << std::endl; } - } - void TearDown() override - { - SRTMinorServoSocket::destroyInstance(); - terminate = false; - } -}; + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); -TEST_F(SRPProgramTrackTest, noise_translation) -{ - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); - SRTMinorServoAnswerMap::iterator iterator; + std::cout << "Sending MS STATUS command..."; - std::cout << "Sending MS STATUS command..."; + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "OK." << std::endl; - SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } - EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); - EXPECT_EQ(std::get(MSStatus["POWER"]), 1); - EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); - EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "Sending initial SRP STATUS command..."; - std::cout << "OK." << std::endl; - std::cout << "Sending initial SRP STATUS command..."; + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + std::cout << "OK." << std::endl; - SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); - EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } - std::cout << "OK." << std::endl; - std::cout << "Sending PRESET command..."; + std::cout << "Sending all axes to 0..."; - std::vector startingCoordinates = {0, 0, 0, 0, 0, 0}; - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - std::cout << "OK." << std::endl; + signal(SIGINT, SRPProgramTrackTest::sigintHandler); - signal(SIGINT, sigintHandler); + while(true) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); - do - { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + if(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))) + std::cout << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + else + break; - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } - std::cout << serializeStatus(SRPStatus) << std::endl; + std::cout << "OK." << std::endl; + } - if(terminate) - return; + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; } - while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); +}; +TEST_F(SRPProgramTrackTest, noise_translation) +{ std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; @@ -206,32 +245,7 @@ TEST_F(SRPProgramTrackTest, noise_translation) std::string directory = directory_ss.str(); boost::filesystem::create_directory(directory); - std::thread t([directory]() - { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); - SRTMinorServoAnswerMap SRPStatus; - - ofstream statusFile; - statusFile.open(directory + "/status.txt", ios::out); - - long unsigned int counter = 0; - - double tn = CIRATools::getUNIXEpoch(); - - while(!terminate) - { - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - statusFile << serializeStatus(SRPStatus) << std::endl; - if(counter % 10 == 0) - std::cout << serializeStatus(SRPStatus) << std::endl; - counter++; - - tn += 0.01; - std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); - } - - statusFile.close(); - }); + std::thread t(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; @@ -239,6 +253,8 @@ TEST_F(SRPProgramTrackTest, noise_translation) unsigned int point_id = 0; std::vector programTrackCoordinates = startingCoordinates; + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -250,7 +266,7 @@ TEST_F(SRPProgramTrackTest, noise_translation) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; @@ -264,7 +280,7 @@ TEST_F(SRPProgramTrackTest, noise_translation) addNoiseToCoordinates(programTrackCoordinates); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - programTrackFile << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; } programTrackFile.close(); @@ -273,54 +289,6 @@ TEST_F(SRPProgramTrackTest, noise_translation) TEST_F(SRPProgramTrackTest, cycle_movement) { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); - SRTMinorServoAnswerMap::iterator iterator; - - std::cout << "Sending MS STATUS command..."; - - SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); - - EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); - EXPECT_EQ(std::get(MSStatus["POWER"]), 1); - EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); - EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); - - std::cout << "OK." << std::endl; - std::cout << "Sending initial SRP STATUS command..."; - - SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); - EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); - - std::cout << "OK." << std::endl; - std::cout << "Sending all axes to 0..."; - - std::vector startingCoordinates = {0, 0, 0, 0, 0, 0}; - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - - std::cout << "OK." << std::endl; - - signal(SIGINT, sigintHandler); - - do - { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); - - std::cout << serializeStatus(SRPStatus) << std::endl; - - if(terminate) - return; - } - while(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))); - std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; @@ -328,32 +296,7 @@ TEST_F(SRPProgramTrackTest, cycle_movement) std::string directory = directory_ss.str(); boost::filesystem::create_directory(directory); - std::thread t([directory]() - { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); - SRTMinorServoAnswerMap SRPStatus; - - ofstream statusFile; - statusFile.open(directory + "/status.txt", ios::out); - - long unsigned int counter = 0; - - double tn = CIRATools::getUNIXEpoch(); - - while(!terminate) - { - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - statusFile << serializeStatus(SRPStatus) << std::endl; - if(counter % 10 == 0) - std::cout << serializeStatus(SRPStatus) << std::endl; - counter++; - - tn += 0.01; - std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); - } - - statusFile.close(); - }); + std::thread t(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; @@ -361,6 +304,8 @@ TEST_F(SRPProgramTrackTest, cycle_movement) unsigned int point_id = 0; std::vector programTrackCoordinates = startingCoordinates; + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -372,7 +317,7 @@ TEST_F(SRPProgramTrackTest, cycle_movement) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - programTrackFile << serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; unsigned int axis_to_move = 0; @@ -406,8 +351,8 @@ TEST_F(SRPProgramTrackTest, cycle_movement) SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - //std::cout << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; - programTrackFile << serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + //std::cout << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) { diff --git a/SRT/Servers/SRTMinorServo/test/plotTrajectories.py b/SRT/Servers/SRTMinorServo/test/plotTrajectories.py new file mode 100755 index 000000000..d55b0ae4c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/plotTrajectories.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +status_time = [] +status_tx = [] +status_ty = [] +status_tz = [] +status_rx = [] +status_ry = [] +status_rz = [] +starttime = None + +with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + status_time.append(float(args[0]) - starttime) + status_tx.append(float(args[1])) + status_ty.append(float(args[2])) + status_tz.append(float(args[3])) + status_rx.append(float(args[4])) + status_ry.append(float(args[5])) + status_rz.append(float(args[6])) + +trajectory_time = [] +trajectory_tx = [] +trajectory_ty = [] +trajectory_tz = [] +trajectory_rx = [] +trajectory_ry = [] +trajectory_rz = [] + +with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_tx.append(float(args[1])) + trajectory_ty.append(float(args[2])) + trajectory_tz.append(float(args[3])) + trajectory_rx.append(float(args[4])) + trajectory_ry.append(float(args[5])) + trajectory_rz.append(float(args[6])) + +fig = plt.figure() +fig.canvas.manager.set_window_title('SRP Positions') +fig.suptitle('SRP Positions') +gs = fig.add_gridspec(3, 2, hspace=0) +((tx, rx), (ty, ry), (tz, rz)) = gs.subplots(sharex=True, sharey='col') +tx.plot(status_time, status_tx, 'r') +tx.plot(trajectory_time, trajectory_tx, 'b') +tx.set_ylabel('tx (mm)') + +ty.plot(status_time, status_ty, 'r') +ty.plot(trajectory_time, trajectory_ty, 'b') +ty.set_ylabel('ty (mm)') + +tz.plot(status_time, status_tz, 'r') +tz.plot(trajectory_time, trajectory_tz, 'b') +tz.set_xlabel('time (s)') +tz.set_ylabel('tz (mm)') + +rx.plot(status_time, status_rx, 'r') +rx.plot(trajectory_time, trajectory_rx, 'b') +rx.set_ylabel('rx (deg)') + +ry.plot(status_time, status_ry, 'r') +ry.plot(trajectory_time, trajectory_ry, 'b') +ry.set_ylabel('ry (deg)') + +rz.plot(status_time, status_rz, 'r') +rz.plot(trajectory_time, trajectory_rz, 'b') +rz.set_xlabel('time (s)') +rz.set_ylabel('rz (deg)') + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +plt.show() -- GitLab From b1188aacb2df2b11f71975deace44e6ded970927 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 5 Apr 2023 08:44:12 +0000 Subject: [PATCH 028/150] Added .gitignore in order to ignore test folders --- SRT/Servers/SRTMinorServo/test/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 SRT/Servers/SRTMinorServo/test/.gitignore diff --git a/SRT/Servers/SRTMinorServo/test/.gitignore b/SRT/Servers/SRTMinorServo/test/.gitignore new file mode 100644 index 000000000..be36a6cef --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/.gitignore @@ -0,0 +1,2 @@ +CycleMovementTest* +NoiseTranslationTest* -- GitLab From a3ea22fadcbc1dbc686988afa58aea44ce96cbd0 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 5 Apr 2023 14:54:12 +0000 Subject: [PATCH 029/150] Updated SRPProgramTrackTest Added a separate trajectories test --- SRT/Servers/SRTMinorServo/test/.gitignore | 3 +- .../test/SRPProgramTrackTest.cpp | 124 ++++++++++++++---- 2 files changed, 103 insertions(+), 24 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/.gitignore b/SRT/Servers/SRTMinorServo/test/.gitignore index be36a6cef..cbb54b0a8 100644 --- a/SRT/Servers/SRTMinorServo/test/.gitignore +++ b/SRT/Servers/SRTMinorServo/test/.gitignore @@ -1,2 +1,3 @@ -CycleMovementTest* NoiseTranslationTest* +ContinuousMovementTest* +SeparateMovementTest* diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index 14fa0484b..5355123ea 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -29,6 +29,8 @@ class SRPProgramTrackTest : public ::testing::Test { protected: std::vector startingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + std::string directory; + std::thread statusThread; static void printStatus(std::string filename) { @@ -227,6 +229,23 @@ protected: } std::cout << "OK." << std::endl; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + statusThread = std::thread(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); } void TearDown() override @@ -236,17 +255,8 @@ protected: } }; -TEST_F(SRPProgramTrackTest, noise_translation) +TEST_F(SRPProgramTrackTest, NoiseTranslationTest) { - std::time_t tn = std::time(0); - std::tm* now = std::localtime(&tn); - std::stringstream directory_ss; - directory_ss << "NoiseTranslationTest-" << 1900 + now->tm_year << std::setfill('0') << std::setw(2) << now->tm_mon + 1 << now->tm_mday << "-" << now->tm_hour << now->tm_min << now->tm_sec; - std::string directory = directory_ss.str(); - boost::filesystem::create_directory(directory); - - std::thread t(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); - double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; long unsigned int trajectory_id = int(start_time); @@ -284,20 +294,11 @@ TEST_F(SRPProgramTrackTest, noise_translation) } programTrackFile.close(); - t.join(); + statusThread.join(); } -TEST_F(SRPProgramTrackTest, cycle_movement) +TEST_F(SRPProgramTrackTest, ContinuousMovementTest) { - std::time_t tn = std::time(0); - std::tm* now = std::localtime(&tn); - std::stringstream directory_ss; - directory_ss << "CycleMovementTest-" << 1900 + now->tm_year << std::setfill('0') << std::setw(2) << now->tm_mon + 1 << now->tm_mday << "-" << now->tm_hour << now->tm_min << now->tm_sec; - std::string directory = directory_ss.str(); - boost::filesystem::create_directory(directory); - - std::thread t(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); - double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; long unsigned int trajectory_id = int(start_time); @@ -345,7 +346,7 @@ TEST_F(SRPProgramTrackTest, cycle_movement) } else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) { - sign = sign * -1; + sign *= -1; idle = true; } @@ -365,5 +366,82 @@ TEST_F(SRPProgramTrackTest, cycle_movement) } programTrackFile.close(); - t.join(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, SeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 25) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + else if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); } -- GitLab From 1e62629ec21d40a4c99b072029c4a8090b811693 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 13 Apr 2023 10:16:35 +0000 Subject: [PATCH 030/150] Updated SRPProgramTrackTest.cpp --- .../test/SRPProgramTrackTest.cpp | 131 ++++++++++++------ 1 file changed, 92 insertions(+), 39 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index 5355123ea..beb943d15 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -47,9 +47,11 @@ protected: while(!terminate) { SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - statusFile << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + std::string status = serializeStatus(SRPStatus); + + statusFile << status << std::endl; if(counter % 10 == 0) - std::cout << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + std::cout << status << std::endl; counter++; tn += STATUS_PERIOD; @@ -67,30 +69,10 @@ protected: static std::string serializeStatus(SRTMinorServoAnswerMap map) { - std::stringstream stream; - stream << std::fixed << std::setprecision(6); - stream << std::get(map["TIMESTAMP"]); - std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; - - for(std::string coordinate : coordinates) - { - double value; - - try - { - value = std::get(map[coordinate]); - } - catch(...) - { - value = (double)std::get(map[coordinate]); - } - - stream << "\t" << value; - } - return stream.str(); + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); } - static std::string serializeProgramTrack(double timestamp, std::vector coordinates) + static std::string serializeCoordinates(double timestamp, std::vector coordinates) { std::stringstream stream; stream << std::fixed << std::setprecision(6) << timestamp; @@ -106,18 +88,17 @@ protected: for(std::string coordinate : coordinates) { - double value; + auto value = SRPStatus[coordinate]; try { - value = std::get(SRPStatus[coordinate]); + currentCoordinates.push_back(std::get(value)); } - catch(...) + catch(std::bad_variant_access const& ex) { - value = (double)std::get(SRPStatus[coordinate]); + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); } - - currentCoordinates.push_back(value); } return currentCoordinates; @@ -220,7 +201,7 @@ protected: EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); if(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))) - std::cout << SRPProgramTrackTest::serializeStatus(SRPStatus) << std::endl; + std::cout << serializeStatus(SRPStatus) << std::endl; else break; @@ -276,7 +257,7 @@ TEST_F(SRPProgramTrackTest, NoiseTranslationTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; @@ -290,7 +271,7 @@ TEST_F(SRPProgramTrackTest, NoiseTranslationTest) addNoiseToCoordinates(programTrackCoordinates); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } programTrackFile.close(); @@ -318,7 +299,7 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; unsigned int axis_to_move = 0; @@ -352,8 +333,8 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - //std::cout << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) { @@ -394,7 +375,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(start_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(20)); @@ -437,8 +418,80 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); } - //std::cout << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; - programTrackFile << SRPProgramTrackTest::serializeProgramTrack(next_expected_time, programTrackCoordinates) << std::endl; + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 2; //Always Z + int sign = -1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + + while(!terminate) + { + std::vector programTrackCoordinates = startingCoordinates; + programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 25) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } } -- GitLab From 58c24354a70412ef6bcb153d3b2a023ec6ef3324 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 29 May 2023 09:21:52 +0000 Subject: [PATCH 031/150] Fix SRTMinorServoCommandLibrary programTrack start_time issue --- .../src/SRTMinorServoCommandLibrary.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index 04350ed59..fce0e1b48 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include "SRTMinorServoCommandLibrary.h" @@ -47,7 +48,7 @@ std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vecto command << "PRESET=" << servo_id; for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { - command << "," << coordinates[coordinate]; + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; } command << CLOSER; return command.str(); @@ -59,8 +60,7 @@ std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, long command << "PROGRAMTRACK=" << servo_id << "," << trajectory_id << "," << point_id << ","; if(start_time > 0) { - long unsigned int start_time_int = (long unsigned int)(start_time * 1000); - command << start_time_int; + command << std::fixed << std::setprecision(6) << start_time; } else { @@ -69,7 +69,7 @@ std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, long for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { - command << "," << coordinates[coordinate]; + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; } command << CLOSER; return command.str(); @@ -81,7 +81,7 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto command << "OFFSET=" << servo_id; for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { - command << "," << coordinates[coordinate]; + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; } command << CLOSER; return command.str(); -- GitLab From ca7c75615fc6287103cd9bd967b33c2f767da687 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 7 Jun 2023 12:55:02 +0000 Subject: [PATCH 032/150] Minor fixes for SRTMinorServoCommandLibrary --- .../src/SRTMinorServoCommandLibrary.cpp | 12 +++----- .../SRTMinorServoLibrary/tests/unittest.cpp | 29 ++++++++++--------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index fce0e1b48..ba0e1fb6c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -115,14 +115,10 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ if(value.empty()) { if(args.find("TIMESTAMP") != args.end()) // Timestamp already found, some other value is missing - { - value = "0"; - } - else - { - value = key; - key = "TIMESTAMP"; - } + throw std::invalid_argument(std::string("Missing key for value " + value)); + + value = key; + key = "TIMESTAMP"; } if(key == "OUTPUT") diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp index 9ebdcf668..4b54b64bc 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp @@ -28,28 +28,29 @@ TEST(SRTMinorServoCommandLibraryTest, stop) TEST(SRTMinorServoCommandLibraryTest, preset) { - EXPECT_EQ(SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "PRESET=PFP,0,1,2,3,4,5\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "PRESET=PFP,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"); } TEST(SRTMinorServoCommandLibraryTest, programTrack) { double start_time = CIRATools::getUNIXEpoch() + 3; - unsigned long int trajectory_id = (unsigned long int)(start_time * 1000); + unsigned long int trajectory_id = (unsigned long int)start_time; std::stringstream expected_answer; - expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << ",0," << trajectory_id << ",0,1,2,3,4,5\r\n"; + expected_answer << std::fixed << std::setprecision(6); + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << ",0," << start_time << ",0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"; EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, 0, std::vector{0.,1.,2.,3.,4.,5.}, start_time), expected_answer.str()); for(unsigned int i = 1; i < 10; i++) { expected_answer.str(std::string()); - expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << "," << i << ",*,0,1,2,3,4,5\r\n"; + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << "," << i << ",*,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"; EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, i, std::vector{0.,1.,2.,3.,4.,5.}), expected_answer.str()); } } TEST(SRTMinorServoCommandLibraryTest, offset) { - EXPECT_EQ(SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "OFFSET=PFP,0,1,2,3,4,5\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "OFFSET=PFP,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"); } TEST(SRTMinorServoCommandLibraryTest, parseAnswer) @@ -66,15 +67,15 @@ TEST(SRTMinorServoCommandLibraryTest, parseAnswer) args.clear(); args["OUTPUT"] = "GOOD"; args["TIMESTAMP"] = 1665743366.123456; - args["CURRENT_CONFIG"] = 21; - args["SIMULATION_ENABLED"] = 34; - args["PLC_TIME"] = 78; - args["PLC_VERSION"] = 69; - args["CONTROL"] = 14; - args["POWER"] = 38; - args["EMERGENCY"] = 69; - args["ENABLED"] = 51; - args["OPERATIVE_MODE"] = 94; + args["CURRENT_CONFIG"] = (long)21; + args["SIMULATION_ENABLED"] = (long)34; + args["PLC_TIME"] = (long)78; + args["PLC_VERSION"] = (long)69; + args["CONTROL"] = (long)14; + args["POWER"] = (long)38; + args["EMERGENCY"] = (long)69; + args["ENABLED"] = (long)51; + args["OPERATIVE_MODE"] = (long)94; EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Missing timestamp -- GitLab From 41f8e45ecc552cd8256b9d2af8cc33afd48a82e7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 7 Jun 2023 13:01:56 +0000 Subject: [PATCH 033/150] Updated SRP and Derotator programTrack tests --- .../include/SRTMinorServoSocket.h | 1 + .../test/DerotatorProgramTrackTest.cpp | 452 ++++++++++++++++++ SRT/Servers/SRTMinorServo/test/Makefile | 8 +- .../test/SRPProgramTrackTest.cpp | 89 ++-- .../test/plotDerotatorTrajectory.py | 44 ++ ...Trajectories.py => plotSRPTrajectories.py} | 40 +- 6 files changed, 579 insertions(+), 55 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp create mode 100755 SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py rename SRT/Servers/SRTMinorServo/test/{plotTrajectories.py => plotSRPTrajectories.py} (71%) diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index fcf71eb12..45b31ad12 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -21,6 +21,7 @@ class SRTMinorServoSocket: public IRA::CSocket // Declare the SRTMinorServoSocketTest class as friend in order for it to have access to destroyInstance for testing purposes friend class SRTMinorServoSocketTest; friend class SRPProgramTrackTest; +friend class DerotatorProgramTrackTest; public: /** diff --git a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp new file mode 100644 index 000000000..5c57c064d --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp @@ -0,0 +1,452 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 +//#define ADDRESS std::string("192.168.200.13") +//#define PORT 4758 +#define SOCKET_TIMEOUT 0.5 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 5 +#define EPSILON 0.00001 +#define MAX_RANGES std::vector{ 220 } +#define STATUS_PERIOD 0.01 +#define DEROTATOR std::string("GFR1") + +std::atomic terminate = false; + + +class DerotatorProgramTrackTest : public ::testing::Test +{ +protected: + std::vector startingCoordinates = { 0.0 }; + std::string directory; + std::thread statusThread; + + static void printStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string status = serializeStatus(DerotatorStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap DerotatorStatus) + { + std::vector currentCoordinates; + std::vector coordinates = { DEROTATOR + "_ROTATION" }; + + for(std::string coordinate : coordinates) + { + auto value = DerotatorStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static bool compareCoordinates(std::vector first, std::vector second) + { + if(first.size() != second.size()) + return false; + + for(size_t i = 0; i < first.size(); i++) + { + double diff = fabs(first[i] - second[i]); + if(diff > EPSILON) + return false; + } + + return true; + } + + static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + sign = sign / abs(sign); + double offset_to_add = 3.3 / 5; + coordinates[axis_to_move] += sign * offset_to_add; + if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + { + sign = coordinates[axis_to_move] / fabs(coordinates[axis_to_move]); + coordinates[axis_to_move] = MAX_RANGES[axis_to_move] * sign; + return true; + } + return false; + } + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "OK." << std::endl; + + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending initial Derotator STATUS command..."; + + SRTMinorServoAnswerMap DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_STATUS"]), 1); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_BLOCK"]), 2); + std::cout << "OK." << std::endl; + + for(iterator = DerotatorStatus.begin(); iterator != DerotatorStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending derotator to 0..."; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("Derotatore" + DEROTATOR, startingCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + signal(SIGINT, DerotatorProgramTrackTest::sigintHandler); + + while(true) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); + + if(!compareCoordinates(startingCoordinates, getCoordinates(DerotatorStatus))) + std::cout << serializeStatus(DerotatorStatus) << std::endl; + else + break; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + + std::cout << "OK." << std::endl; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "Derotator"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + statusThread = std::thread(&DerotatorProgramTrackTest::printStatus, directory + "/status.txt"); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + std::string command = SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time); + std::cout << command << std::endl; + DerotatorStatus = socket.sendCommand(command); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + while(!terminate) + { + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 5) + { + idle_count = 0; + idle = false; + } + } + else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + break; + } + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 25) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; //Always Rotation + int sign = -1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + + while(!terminate) + { + std::vector programTrackCoordinates = startingCoordinates; + programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 25) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index d8d695cbe..4fc791f23 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,7 +14,7 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest +EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest SRTMinorServoSocketTest_CFLAGS = -std=c++17 @@ -26,6 +26,11 @@ SRPProgramTrackTest_CFLAGS = -std=c++17 SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem SRPProgramTrackTest_LDFLAGS = -lstdc++ -lpthread +DerotatorProgramTrackTest_OBJECTS = DerotatorProgramTrackTest +DerotatorProgramTrackTest_CFLAGS = -std=c++17 +DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +DerotatorProgramTrackTest_LDFLAGS = -lstdc++ -lpthread + # END OF CUSTOMIZATION # do not edit below this line #---------------------------- @@ -48,6 +53,7 @@ do_unit: all @echo "running cpp unit tests" ../bin/SRTMinorServoSocketTest --gtest_output=xml:results/cppSRTMinorServoSocketTest.xml ../bin/SRPProgramTrackTest --gtest_output=xml:results/cppSRPProgramTrackTest.xml + ../bin/DerotatorProgramTrackTest --gtest_output=xml:results/cppDerotatorProgramTrackTest.xml do_pyunit: @echo "running python unit tests" diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index beb943d15..dba2afa9f 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -69,7 +69,9 @@ protected: static std::string serializeStatus(SRTMinorServoAnswerMap map) { - return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + status += serializeElongations(getElongations(map)); + return status; } static std::string serializeCoordinates(double timestamp, std::vector coordinates) @@ -81,6 +83,15 @@ protected: return stream.str(); } + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus) { std::vector currentCoordinates; @@ -104,6 +115,29 @@ protected: return currentCoordinates; } + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + auto value = SRPStatus[elongation]; + + try + { + currentElongations.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentElongations.push_back(10000.0); + } + } + + return currentElongations; + } + static bool compareCoordinates(std::vector first, std::vector second) { if(first.size() != second.size()) @@ -119,17 +153,11 @@ protected: return true; } - static void addNoiseToCoordinates(std::vector &coordinates) - { - for(size_t i = 0; i < 3; i++) - coordinates[i] += std::max(-1, std::min(1, rand() % 5 - 2)) * (double(rand() % 100) / 100) * NOISE_THRESHOLD; - } - static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) { sign = sign / abs(sign); double offset_to_add; - axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 1.0; + axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 0.8; coordinates[axis_to_move] += sign * offset_to_add; if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) return true; @@ -214,6 +242,9 @@ protected: std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; + directory_ss << "SRP"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); directory_ss << "-"; directory_ss << 1900 + now->tm_year; @@ -236,48 +267,6 @@ protected: } }; -TEST_F(SRPProgramTrackTest, NoiseTranslationTest) -{ - double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; - std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; - long unsigned int trajectory_id = int(start_time); - unsigned int point_id = 0; - std::vector programTrackCoordinates = startingCoordinates; - - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); - SRTMinorServoAnswerMap SRPStatus; - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - - std::this_thread::sleep_for(std::chrono::milliseconds(20)); - - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); - - ofstream programTrackFile; - programTrackFile.open(directory + "/trajectory.txt", ios::out); - programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - - double next_expected_time = start_time; - - while(!terminate) - { - next_expected_time += TIMEGAP; - - std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); - point_id++; - - addNoiseToCoordinates(programTrackCoordinates); - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - } - - programTrackFile.close(); - statusThread.join(); -} - TEST_F(SRPProgramTrackTest, ContinuousMovementTest) { double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; diff --git a/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py b/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py new file mode 100755 index 000000000..8c959f9e5 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +status_time = [] +status_rotation = [] +starttime = None + +with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + status_time.append(float(args[0]) - starttime) + status_rotation.append(float(args[1])) + +trajectory_time = [] +trajectory_rotation = [] + +with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_rotation.append(float(args[1])) + +#plt.canvas.manager.set_window_title('Derotator positions') +plt.suptitle('Derotator positions') +plt.plot(status_time, status_rotation, 'r') +plt.plot(trajectory_time, trajectory_rotation, 'b') +plt.ylabel('rot (deg)') +plt.xlabel('time (sec)') + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +plt.show() diff --git a/SRT/Servers/SRTMinorServo/test/plotTrajectories.py b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py similarity index 71% rename from SRT/Servers/SRTMinorServo/test/plotTrajectories.py rename to SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py index d55b0ae4c..e55eb7e53 100755 --- a/SRT/Servers/SRTMinorServo/test/plotTrajectories.py +++ b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py @@ -19,6 +19,12 @@ status_tz = [] status_rx = [] status_ry = [] status_rz = [] +status_ez1 = [] +status_ez2 = [] +status_ez3 = [] +status_ey1 = [] +status_ey2 = [] +status_ex1 = [] starttime = None with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: @@ -33,6 +39,12 @@ with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: status_rx.append(float(args[4])) status_ry.append(float(args[5])) status_rz.append(float(args[6])) + status_ez1.append(float(args[7])) + status_ez2.append(float(args[8])) + status_ez3.append(float(args[9])) + status_ey1.append(float(args[10])) + status_ey2.append(float(args[11])) + status_ex1.append(float(args[12])) trajectory_time = [] trajectory_tx = [] @@ -56,8 +68,8 @@ with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajector fig = plt.figure() fig.canvas.manager.set_window_title('SRP Positions') fig.suptitle('SRP Positions') -gs = fig.add_gridspec(3, 2, hspace=0) -((tx, rx), (ty, ry), (tz, rz)) = gs.subplots(sharex=True, sharey='col') +gs = fig.add_gridspec(6, 2, hspace=0) +((tx, rx), (ty, ry), (tz, rz), (ez1, ey1), (ez2, ey2), (ez3, ex1)) = gs.subplots(sharex=True, sharey='col') tx.plot(status_time, status_tx, 'r') tx.plot(trajectory_time, trajectory_tx, 'b') tx.set_ylabel('tx (mm)') @@ -68,9 +80,19 @@ ty.set_ylabel('ty (mm)') tz.plot(status_time, status_tz, 'r') tz.plot(trajectory_time, trajectory_tz, 'b') -tz.set_xlabel('time (s)') tz.set_ylabel('tz (mm)') +ez1.plot(status_time, status_ez1, 'b') +ez1.set_ylabel('ez1 (mm)') + +ez2.plot(status_time, status_ez2, 'b') +ez2.set_ylabel('ez2 (mm)') + +ez3.plot(status_time, status_ez3, 'b') +ez3.set_ylabel('ez3 (mm)') +ez3.set_xlabel('time (s)') + + rx.plot(status_time, status_rx, 'r') rx.plot(trajectory_time, trajectory_rx, 'b') rx.set_ylabel('rx (deg)') @@ -81,8 +103,18 @@ ry.set_ylabel('ry (deg)') rz.plot(status_time, status_rz, 'r') rz.plot(trajectory_time, trajectory_rz, 'b') -rz.set_xlabel('time (s)') rz.set_ylabel('rz (deg)') +ey1.plot(status_time, status_ey1, 'b') +ey1.set_ylabel('ey1 (mm)') + +ey2.plot(status_time, status_ey2, 'b') +ey2.set_ylabel('ey2 (mm)') + +ex1.plot(status_time, status_ex1, 'b') +ex1.set_ylabel('ex1 (mm)') +ex1.set_xlabel('time (s)') + + plt.get_current_fig_manager().window.attributes('-zoomed', True) plt.show() -- GitLab From 2273761ff160a79681497682399bacc51e6ac052 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 7 Jun 2023 13:25:34 +0000 Subject: [PATCH 034/150] Small update for plotting scripts --- SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py | 5 ++++- SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py b/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py index 8c959f9e5..649ae367a 100755 --- a/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py +++ b/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py @@ -41,4 +41,7 @@ plt.ylabel('rot (deg)') plt.xlabel('time (sec)') plt.get_current_fig_manager().window.attributes('-zoomed', True) -plt.show() +try: + plt.show() +except KeyboardInterrupt: + pass diff --git a/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py index e55eb7e53..75a5550a5 100755 --- a/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py +++ b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py @@ -117,4 +117,7 @@ ex1.set_xlabel('time (s)') plt.get_current_fig_manager().window.attributes('-zoomed', True) -plt.show() +try: + plt.show() +except KeyboardInterrupt: + pass -- GitLab From 86d6e849b33347302baf0101ac3f1ef56f3ee7cd Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 20 Jun 2023 12:45:42 +0000 Subject: [PATCH 035/150] Updated SRPProgramTrackTest.cpp --- SRT/Servers/SRTMinorServo/test/.gitignore | 5 +-- .../test/SRPProgramTrackTest.cpp | 10 ++--- .../SRTMinorServo/test/plotSRPTrajectories.py | 45 ++++++++++++------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/.gitignore b/SRT/Servers/SRTMinorServo/test/.gitignore index cbb54b0a8..764e4f7bc 100644 --- a/SRT/Servers/SRTMinorServo/test/.gitignore +++ b/SRT/Servers/SRTMinorServo/test/.gitignore @@ -1,3 +1,2 @@ -NoiseTranslationTest* -ContinuousMovementTest* -SeparateMovementTest* +SRP/* +Derotator/* diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index dba2afa9f..e546e7ff9 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -280,7 +280,7 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -366,7 +366,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -382,7 +382,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) if(idle) { idle_count++; - if(idle_count == 25) + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) { idle_count = 0; idle = false; @@ -445,7 +445,7 @@ TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -461,7 +461,7 @@ TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) if(idle) { idle_count++; - if(idle_count == 25) + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) { idle_count = 0; idle = false; diff --git a/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py index 75a5550a5..e2f39fe77 100755 --- a/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py +++ b/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py @@ -68,53 +68,64 @@ with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajector fig = plt.figure() fig.canvas.manager.set_window_title('SRP Positions') fig.suptitle('SRP Positions') + gs = fig.add_gridspec(6, 2, hspace=0) -((tx, rx), (ty, ry), (tz, rz), (ez1, ey1), (ez2, ey2), (ez3, ex1)) = gs.subplots(sharex=True, sharey='col') +((tx, ex1), (ty, ey1), (tz, ey2), (rx, ez1), (ry, ez2), (rz, ez3)) = gs.subplots(sharex=True) + tx.plot(status_time, status_tx, 'r') tx.plot(trajectory_time, trajectory_tx, 'b') tx.set_ylabel('tx (mm)') +tx.sharey(ty) ty.plot(status_time, status_ty, 'r') ty.plot(trajectory_time, trajectory_ty, 'b') ty.set_ylabel('ty (mm)') +ty.sharey(tz) tz.plot(status_time, status_tz, 'r') tz.plot(trajectory_time, trajectory_tz, 'b') tz.set_ylabel('tz (mm)') - -ez1.plot(status_time, status_ez1, 'b') -ez1.set_ylabel('ez1 (mm)') - -ez2.plot(status_time, status_ez2, 'b') -ez2.set_ylabel('ez2 (mm)') - -ez3.plot(status_time, status_ez3, 'b') -ez3.set_ylabel('ez3 (mm)') -ez3.set_xlabel('time (s)') - +tz.sharey(ex1) rx.plot(status_time, status_rx, 'r') rx.plot(trajectory_time, trajectory_rx, 'b') rx.set_ylabel('rx (deg)') +rx.sharey(ry) ry.plot(status_time, status_ry, 'r') ry.plot(trajectory_time, trajectory_ry, 'b') ry.set_ylabel('ry (deg)') +ry.sharey(rz) rz.plot(status_time, status_rz, 'r') rz.plot(trajectory_time, trajectory_rz, 'b') rz.set_ylabel('rz (deg)') +rz.set_xlabel('time (s)') -ey1.plot(status_time, status_ey1, 'b') + +ex1.plot(status_time, status_ex1, 'g') +ex1.set_ylabel('ex1 (mm)') +ex1.sharey(ey1) + +ey1.plot(status_time, status_ey1, 'g') ey1.set_ylabel('ey1 (mm)') +ey1.sharey(ey2) -ey2.plot(status_time, status_ey2, 'b') +ey2.plot(status_time, status_ey2, 'g') ey2.set_ylabel('ey2 (mm)') +ey2.sharey(ez1) -ex1.plot(status_time, status_ex1, 'b') -ex1.set_ylabel('ex1 (mm)') -ex1.set_xlabel('time (s)') +ez1.plot(status_time, status_ez1, 'g') +ez1.set_ylabel('ez1 (mm)') +ez1.sharey(ez2) +ez2.plot(status_time, status_ez2, 'g') +ez2.set_ylabel('ez2 (mm)') +ez2.sharey(ez3) + +ez3.plot(status_time, status_ez3, 'g') +ez3.set_ylabel('ez3 (mm)') +ez3.set_xlabel('time (s)') plt.get_current_fig_manager().window.attributes('-zoomed', True) try: -- GitLab From d8b74c409e48d839725f34cc43d43cdb8f88ee8d Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 3 Jul 2023 11:37:48 +0000 Subject: [PATCH 036/150] First skeleton of combined SRP and Derotator tests --- .../include/SRTMinorServoSocket.h | 1 + .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 3 + SRT/Servers/SRTMinorServo/test/.gitignore | 5 +- .../test/CombinedProgramTrackTest.cpp | 426 ++++++++++++++++++ .../test/DerotatorProgramTrackTest.cpp | 2 +- SRT/Servers/SRTMinorServo/test/Makefile | 8 +- .../test/SRPProgramTrackTest.cpp | 2 +- .../{ => TESTS}/plotDerotatorTrajectory.py | 0 .../test/{ => TESTS}/plotSRPTrajectories.py | 0 .../SRTMinorServo/test/external/__init__.py | 0 .../SRTMinorServo/test/functional/__init__.py | 0 .../SRTMinorServo/test/pyunit/__init__.py | 0 12 files changed, 442 insertions(+), 5 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp rename SRT/Servers/SRTMinorServo/test/{ => TESTS}/plotDerotatorTrajectory.py (100%) rename SRT/Servers/SRTMinorServo/test/{ => TESTS}/plotSRPTrajectories.py (100%) delete mode 100644 SRT/Servers/SRTMinorServo/test/external/__init__.py delete mode 100644 SRT/Servers/SRTMinorServo/test/functional/__init__.py delete mode 100644 SRT/Servers/SRTMinorServo/test/pyunit/__init__.py diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index 45b31ad12..660457797 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -22,6 +22,7 @@ class SRTMinorServoSocket: public IRA::CSocket friend class SRTMinorServoSocketTest; friend class SRPProgramTrackTest; friend class DerotatorProgramTrackTest; +friend class CombinedProgramTrackTest; public: /** diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp index acdebca2a..a66fa5e0a 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp @@ -1,4 +1,5 @@ #include "SRTMinorServoSocket.h" +#include std::mutex SRTMinorServoSocket::c_mutex; @@ -106,6 +107,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) Close(m_error); ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); exImpl.addData("Reason", "Timeout when sending command."); + std::cout << "Timeout sending command" << std::endl; throw exImpl; } } @@ -129,6 +131,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) Close(m_error); ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); exImpl.addData("Reason", "Timeout when receiving answer."); + std::cout << "Timeout receiving answer" << std::endl; throw exImpl; } } diff --git a/SRT/Servers/SRTMinorServo/test/.gitignore b/SRT/Servers/SRTMinorServo/test/.gitignore index 764e4f7bc..d3a2a1447 100644 --- a/SRT/Servers/SRTMinorServo/test/.gitignore +++ b/SRT/Servers/SRTMinorServo/test/.gitignore @@ -1,2 +1,3 @@ -SRP/* -Derotator/* +TESTS/SRP/* +TESTS/COMBINED/* +TESTS/DEROTATOR* diff --git a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp new file mode 100644 index 000000000..e0e06a2ae --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp @@ -0,0 +1,426 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif + +#define SOCKET_TIMEOUT 0.5 +#define NOISE_THRESHOLD 1 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 5 +#define STATUS_PERIOD 0.01 +#define EPSILON 0.00001 + +#define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } +#define SRP_MAX_RANGES std::vector{ 40, 100, 40, 0.2, 0.2, 0.2 } + +#define DEROTATOR std::string("GFR1") +#define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } +#define DEROTATOR_MAX_RANGES std::vector{ 220 } + + +std::atomic terminate = false; + + +class CombinedProgramTrackTest : public ::testing::Test +{ +protected: + std::vector SRPStartingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + std::vector DerotatorStartingCoordinates = { 0.0 }; + std::string directory; + std::thread SRPStatusThread; + std::thread DerotatorStatusThread; + + static void printSRPStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + std::string status = serializeSRPStatus(SRPStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void printDerotatorStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string status = serializeDerotatorStatus(DerotatorStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeSRPStatus(SRTMinorServoAnswerMap map) + { + std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, SRP_COORDINATES)); + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeDerotatorStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, DEROTATOR_COORDINATES)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus, std::vector coordinates) + { + std::vector currentCoordinates; + + for(std::string coordinate : coordinates) + { + auto value = SRPStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + auto value = SRPStatus[elongation]; + + try + { + currentElongations.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentElongations.push_back(10000.0); + } + } + + return currentElongations; + } + + static bool compareCoordinates(std::vector first, std::vector second) + { + if(first.size() != second.size()) + return false; + + for(size_t i = 0; i < first.size(); i++) + { + double diff = fabs(first[i] - second[i]); + if(diff > EPSILON) + return false; + } + + return true; + } + + /*static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + sign = sign / abs(sign); + double offset_to_add; + axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 0.8; + coordinates[axis_to_move] += sign * offset_to_add; + if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + return true; + return false; + }*/ + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "OK." << std::endl; + + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending initial SRP STATUS command..."; + + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + std::cout << "OK." << std::endl; + + for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + SRTMinorServoAnswerMap DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_STATUS"]), 1); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_BLOCK"]), 2); + + for(iterator = DerotatorStatus.begin(); iterator != DerotatorStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "OK." << std::endl; + std::cout << "Sending all axes to 0..." << std::endl; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", SRPStartingCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("Derotatore" + DEROTATOR, DerotatorStartingCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + signal(SIGINT, CombinedProgramTrackTest::sigintHandler); + + bool SRPReady = false, DerotatorReady = false; + + while(true) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + std::cout << serializeSRPStatus(SRPStatus) << std::endl; + + if(compareCoordinates(SRPStartingCoordinates, getCoordinates(SRPStatus, SRP_COORDINATES))) + SRPReady = true; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); + std::cout << serializeDerotatorStatus(DerotatorStatus) << std::endl; + + if(compareCoordinates(DerotatorStartingCoordinates, getCoordinates(DerotatorStatus, DEROTATOR_COORDINATES))) + DerotatorReady = true; + + if(SRPReady && DerotatorReady) + break; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + + std::cout << "OK." << std::endl; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/COMBINED"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + boost::filesystem::create_directory(directory + "/SRP"); + boost::filesystem::create_directory(directory + "/DEROTATOR"); + + SRPStatusThread = std::thread(&CombinedProgramTrackTest::printSRPStatus, directory + "/SRP/status.txt"); + DerotatorStatusThread = std::thread(&CombinedProgramTrackTest::printDerotatorStatus, directory + "/DEROTATOR/status.txt"); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(CombinedProgramTrackTest, CombinedProgramTrackTest) +{ + std::this_thread::sleep_for(std::chrono::seconds(5)); + terminate = true; + SRPStatusThread.join(); + DerotatorStatusThread.join(); + return; + + /*SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + programTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + else if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join();*/ +} diff --git a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp index 5c57c064d..bfa61a851 100644 --- a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp @@ -211,7 +211,7 @@ protected: std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; - directory_ss << "Derotator"; + directory_ss << "TESTS/DEROTATOR"; boost::filesystem::create_directory(directory_ss.str()); directory_ss << "/"; directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 4fc791f23..7493b4c96 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,7 +14,7 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest +EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest CombinedProgramTrackTest SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest SRTMinorServoSocketTest_CFLAGS = -std=c++17 @@ -31,6 +31,11 @@ DerotatorProgramTrackTest_CFLAGS = -std=c++17 DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem DerotatorProgramTrackTest_LDFLAGS = -lstdc++ -lpthread +CombinedProgramTrackTest_OBJECTS = CombinedProgramTrackTest +CombinedProgramTrackTest_CFLAGS = -std=c++17 +CombinedProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +CombinedProgramTrackTest_LDFLAGS = -lstdc++ -lpthread + # END OF CUSTOMIZATION # do not edit below this line #---------------------------- @@ -54,6 +59,7 @@ do_unit: all ../bin/SRTMinorServoSocketTest --gtest_output=xml:results/cppSRTMinorServoSocketTest.xml ../bin/SRPProgramTrackTest --gtest_output=xml:results/cppSRPProgramTrackTest.xml ../bin/DerotatorProgramTrackTest --gtest_output=xml:results/cppDerotatorProgramTrackTest.xml + ../bin/CombinedProgramTrackTest --gtest_output=xml:results/cppCombinedProgramTrackTest.xml do_pyunit: @echo "running python unit tests" diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index e546e7ff9..f0ea71a5f 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -242,7 +242,7 @@ protected: std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; - directory_ss << "SRP"; + directory_ss << "TESTS/SRP"; boost::filesystem::create_directory(directory_ss.str()); directory_ss << "/"; directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); diff --git a/SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/plotDerotatorTrajectory.py rename to SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py diff --git a/SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/plotSRPTrajectories.py rename to SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py diff --git a/SRT/Servers/SRTMinorServo/test/external/__init__.py b/SRT/Servers/SRTMinorServo/test/external/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/SRT/Servers/SRTMinorServo/test/functional/__init__.py b/SRT/Servers/SRTMinorServo/test/functional/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py b/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py deleted file mode 100644 index e69de29bb..000000000 -- GitLab From d054c778e4fbe89055a3e61f99295217670179e4 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 12 Jul 2023 09:09:51 +0000 Subject: [PATCH 037/150] Added sine wave tests --- .../test/DerotatorProgramTrackTest.cpp | 120 ++++++++---- .../test/SRPProgramTrackTest.cpp | 180 +++++++++++++++--- 2 files changed, 228 insertions(+), 72 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp index bfa61a851..65133c073 100644 --- a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp @@ -10,16 +10,20 @@ // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & -#define ADDRESS std::string("127.0.0.1") -#define PORT 12800 -//#define ADDRESS std::string("192.168.200.13") -//#define PORT 4758 +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif #define SOCKET_TIMEOUT 0.5 #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 5 #define EPSILON 0.00001 -#define MAX_RANGES std::vector{ 220 } #define STATUS_PERIOD 0.01 +#define RANGES std::vector{ 10.0, 50.0 } #define DEROTATOR std::string("GFR1") std::atomic terminate = false; @@ -28,7 +32,7 @@ std::atomic terminate = false; class DerotatorProgramTrackTest : public ::testing::Test { protected: - std::vector startingCoordinates = { 0.0 }; + std::vector startingCoordinates = { RANGES[0] }; std::string directory; std::thread statusThread; @@ -104,32 +108,21 @@ protected: return currentCoordinates; } - static bool compareCoordinates(std::vector first, std::vector second) - { - if(first.size() != second.size()) - return false; - - for(size_t i = 0; i < first.size(); i++) - { - double diff = fabs(first[i] - second[i]); - if(diff > EPSILON) - return false; - } - - return true; - } - static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) { sign = sign / abs(sign); double offset_to_add = 3.3 / 5; coordinates[axis_to_move] += sign * offset_to_add; - if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + if(sign > 0) { - sign = coordinates[axis_to_move] / fabs(coordinates[axis_to_move]); - coordinates[axis_to_move] = MAX_RANGES[axis_to_move] * sign; - return true; + coordinates[axis_to_move] = std::min(RANGES[1], coordinates[axis_to_move]); + } + else + { + coordinates[axis_to_move] = std::max(RANGES[0], coordinates[axis_to_move]); } + if(coordinates[axis_to_move] == RANGES[0] || coordinates[axis_to_move] == RANGES[1]) + return true; return false; } @@ -189,22 +182,20 @@ protected: signal(SIGINT, DerotatorProgramTrackTest::sigintHandler); - while(true) + + do { std::this_thread::sleep_for(std::chrono::milliseconds(100)); - DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); - if(!compareCoordinates(startingCoordinates, getCoordinates(DerotatorStatus))) - std::cout << serializeStatus(DerotatorStatus) << std::endl; - else - break; + std::cout << serializeStatus(DerotatorStatus) << std::endl; if(terminate) FAIL() << "Aborting test..." << std::endl; } + while(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]) != 40); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); std::cout << "OK." << std::endl; @@ -262,7 +253,6 @@ TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; double next_expected_time = start_time; - unsigned int axis_to_move = 0; int sign = 1; unsigned int idle_count = 0; bool idle = false; @@ -285,7 +275,7 @@ TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) idle = false; } } - else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + else if(moveAxis(programTrackCoordinates, 0, sign)) { sign *= -1; idle = true; @@ -296,9 +286,9 @@ TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + if(round(programTrackCoordinates[0] * 100) == 10 && sign == 1) { - programTrackCoordinates[axis_to_move] = 0.0; + programTrackCoordinates[0] = RANGES[0]; break; } } @@ -308,6 +298,56 @@ TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) statusThread.join(); } +TEST_F(DerotatorProgramTrackTest, SineWaveMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + double phase_shift = (double)std::rand() / RAND_MAX * 60; + double amplitude = (RANGES[1] - RANGES[0]) / 2; + double center = (RANGES[0] + RANGES[1]) / 2; + programTrackCoordinates[0] = center + amplitude * sin(phase_shift * 2 * M_PI / 60); + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + programTrackCoordinates[0] = center + amplitude * sin((time_delta + phase_shift) * 2 * M_PI / 60); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + statusThread.join(); +} + TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) { SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); @@ -316,7 +356,6 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - unsigned int axis_to_move = 0; int sign = 1; unsigned int idle_count = 0; bool idle = false; @@ -360,7 +399,7 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) } else { - if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + if(moveAxis(programTrackCoordinates, 0, sign)) { sign *= -1; idle = true; @@ -387,7 +426,6 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - unsigned int axis_to_move = 0; //Always Rotation int sign = -1; unsigned int idle_count = 0; bool idle = false; @@ -397,7 +435,7 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) while(!terminate) { std::vector programTrackCoordinates = startingCoordinates; - programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + programTrackCoordinates[0] = 25.0; double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; long unsigned int trajectory_id = int(start_time); @@ -433,7 +471,7 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) } else { - if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + if(moveAxis(programTrackCoordinates, 0, sign)) { idle = true; } diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index f0ea71a5f..750972051 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -10,16 +10,19 @@ // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & -#define ADDRESS std::string("127.0.0.1") -#define PORT 12800 -//#define ADDRESS std::string("192.168.200.13") -//#define PORT 4758 +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif #define SOCKET_TIMEOUT 0.5 #define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 5 -#define EPSILON 0.00001 -#define MAX_RANGES std::vector{ 40, 100, 40, 0.2, 0.2, 0.2 } +#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } #define STATUS_PERIOD 0.01 std::atomic terminate = false; @@ -138,29 +141,17 @@ protected: return currentElongations; } - static bool compareCoordinates(std::vector first, std::vector second) - { - if(first.size() != second.size()) - return false; - - for(size_t i = 0; i < first.size(); i++) - { - double diff = fabs(first[i] - second[i]); - if(diff > EPSILON) - return false; - } - - return true; - } - static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) { sign = sign / abs(sign); double offset_to_add; - axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 0.8; + axis_to_move >= 3 ? offset_to_add = 0.076 : offset_to_add = 0.8; coordinates[axis_to_move] += sign * offset_to_add; if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + { + coordinates[axis_to_move] = sign * MAX_RANGES[axis_to_move]; return true; + } return false; } @@ -213,32 +204,30 @@ protected: std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); } - std::cout << "Sending all axes to 0..."; + std::cout << "Sending all axes to the starting position..." << std::endl; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); signal(SIGINT, SRPProgramTrackTest::sigintHandler); - while(true) + do { std::this_thread::sleep_for(std::chrono::milliseconds(100)); - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); - - if(!compareCoordinates(startingCoordinates, getCoordinates(SRPStatus))) - std::cout << serializeStatus(SRPStatus) << std::endl; - else - break; + std::cout << serializeStatus(SRPStatus) << std::endl; if(terminate) FAIL() << "Aborting test..." << std::endl; } + while(std::get(SRPStatus["SRP_OPERATIVE_MODE"]) != 40); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); std::cout << "OK." << std::endl; + startingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + std::time_t tn = std::time(0); std::tm* now = std::localtime(&tn); std::stringstream directory_ss; @@ -339,6 +328,135 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) statusThread.join(); } +TEST_F(SRPProgramTrackTest, AllAxesMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + std::vector sign = { 1, 1, 1 }; + std::vector idle_count = { 0, 0, 0 }; + std::vector idle = { false, false, false }; + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + if(!idle[axis]) + { + if(moveAxis(programTrackCoordinates, axis, sign[axis])) + { + sign[axis] *= -1; + idle[axis] = true; + } + } + else + { + idle_count[axis]++; + if(idle_count[axis] == 5) + { + idle_count[axis] = 0; + idle[axis] = false; + } + } + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + for(size_t axis = 0; axis < 3; axis++) + { + if(round(programTrackCoordinates[axis] * 100) == 0 && sign[axis] == 1) + { + programTrackCoordinates[axis] = 0.0; + } + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, SineWaveMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + std::vector phase_shift; + for(size_t axis = 0; axis < 3; axis++) + { + phase_shift.push_back((double)std::rand() / RAND_MAX * 60); + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); + } + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + statusThread.join(); +} + TEST_F(SRPProgramTrackTest, SeparateMovementTest) { SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); -- GitLab From c7a31211a33109fcfd75400e5cd4b9889dff52b7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 12 Jul 2023 09:55:28 +0000 Subject: [PATCH 038/150] Added combined test and plotting script --- .../test/CombinedProgramTrackTest.cpp | 83 +++++++++++-- .../SRTMinorServo/test/TESTS/plotCombined.py | 112 ++++++++++++++++++ 2 files changed, 188 insertions(+), 7 deletions(-) create mode 100755 SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py diff --git a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp index e0e06a2ae..ffe65f60e 100644 --- a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp @@ -27,11 +27,11 @@ #define EPSILON 0.00001 #define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } -#define SRP_MAX_RANGES std::vector{ 40, 100, 40, 0.2, 0.2, 0.2 } +#define SRP_MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } #define DEROTATOR std::string("GFR1") #define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } -#define DEROTATOR_MAX_RANGES std::vector{ 220 } +#define DEROTATOR_RANGES std::vector{ 10.0, 50.0 } std::atomic terminate = false; @@ -342,15 +342,84 @@ protected: } }; -TEST_F(CombinedProgramTrackTest, CombinedProgramTrackTest) +TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) { - std::this_thread::sleep_for(std::chrono::seconds(5)); - terminate = true; + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector SRPCoordinates = SRPStartingCoordinates; + std::vector DerotatorCoordinates = DerotatorStartingCoordinates; + + std::vector phase_shift; + for(size_t axis = 0; axis < 3; axis++) + { + phase_shift.push_back((double)std::rand() / RAND_MAX * 60); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); + } + + phase_shift.push_back((double)std::rand() / RAND_MAX * 60); + double derotator_amplitude = (DEROTATOR_RANGES[1] - DEROTATOR_RANGES[0]) / 2; + double derotator_center = (DEROTATOR_RANGES[0] + DEROTATOR_RANGES[1]) / 2; + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[3] * 2 * M_PI / 60); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream SRPProgramTrackFile; + SRPProgramTrackFile.open(directory + "/SRP/trajectory.txt", ios::out); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, SRPCoordinates) << std::endl; + + ofstream DerotatorProgramTrackFile; + DerotatorProgramTrackFile.open(directory + "/DEROTATOR/trajectory.txt", ios::out); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, DerotatorCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); + } + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[3]) * 2 * M_PI / 60); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, SRPCoordinates) << std::endl; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, DerotatorCoordinates) << std::endl; + } + + SRPProgramTrackFile.close(); + DerotatorProgramTrackFile.close(); SRPStatusThread.join(); DerotatorStatusThread.join(); - return; - /*SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + /* SRTMinorServoAnswerMap SRPStatus; ofstream programTrackFile; diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py new file mode 100755 index 000000000..90ae79f00 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +srp_status_time = [] +derotator_status_time = [] +status_tx = [] +status_ty = [] +status_tz = [] +status_rx = [] +status_ry = [] +status_rz = [] +status_rotation = [] +starttime = None + +with open(os.path.join(arguments.directory, 'SRP', 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + srp_status_time.append(float(args[0]) - starttime) + status_tx.append(float(args[1])) + status_ty.append(float(args[2])) + status_tz.append(float(args[3])) + status_rx.append(float(args[4])) + status_ry.append(float(args[5])) + status_rz.append(float(args[6])) + +with open(os.path.join(arguments.directory, 'DEROTATOR', 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + derotator_status_time.append(float(args[0]) - starttime) + status_rotation.append(float(args[1])) + +trajectory_time = [] +trajectory_tx = [] +trajectory_ty = [] +trajectory_tz = [] +trajectory_rx = [] +trajectory_ry = [] +trajectory_rz = [] +trajectory_rotation = [] + +with open(os.path.join(arguments.directory, 'SRP', 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_tx.append(float(args[1])) + trajectory_ty.append(float(args[2])) + trajectory_tz.append(float(args[3])) + trajectory_rx.append(float(args[4])) + trajectory_ry.append(float(args[5])) + trajectory_rz.append(float(args[6])) + +with open(os.path.join(arguments.directory, 'DEROTATOR', 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_rotation.append(float(args[1])) + +fig, axs = plt.subplots(7) +fig.canvas.manager.set_window_title('Program Track Positions') +fig.suptitle('Program Track Positions') + +axs[0].plot(srp_status_time, status_tx, 'r') +axs[0].plot(trajectory_time, trajectory_tx, 'b') +axs[0].set_ylabel('tx (mm)') +axs[0].sharey(axs[1]) + +axs[1].plot(srp_status_time, status_ty, 'r') +axs[1].plot(trajectory_time, trajectory_ty, 'b') +axs[1].set_ylabel('ty (mm)') +axs[1].sharey(axs[2]) + +axs[2].plot(srp_status_time, status_tz, 'r') +axs[2].plot(trajectory_time, trajectory_tz, 'b') +axs[2].set_ylabel('tz (mm)') + +axs[3].plot(srp_status_time, status_rx, 'r') +axs[3].plot(trajectory_time, trajectory_rx, 'b') +axs[3].set_ylabel('rx (deg)') +axs[3].sharey(axs[4]) + +axs[4].plot(srp_status_time, status_ry, 'r') +axs[4].plot(trajectory_time, trajectory_ry, 'b') +axs[4].set_ylabel('ry (deg)') +axs[4].sharey(axs[5]) + +axs[5].plot(srp_status_time, status_rz, 'r') +axs[5].plot(trajectory_time, trajectory_rz, 'b') +axs[5].set_ylabel('rz (deg)') + +axs[6].plot(derotator_status_time, status_rotation, 'r') +axs[6].plot(trajectory_time, trajectory_rotation, 'b') +axs[6].set_ylabel('derot (deg)') +axs[6].set_xlabel('time (s)') + + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +try: + plt.show() +except KeyboardInterrupt: + pass -- GitLab From 2da5baf48c0b0e58109c802e9775bac3408ae7d7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 12 Jul 2023 10:16:03 +0000 Subject: [PATCH 039/150] Included rotations in sine wave tests --- .../test/CombinedProgramTrackTest.cpp | 78 +------------------ .../test/SRPProgramTrackTest.cpp | 5 +- 2 files changed, 4 insertions(+), 79 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp index ffe65f60e..0e5ce51fd 100644 --- a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp @@ -355,7 +355,7 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) std::vector DerotatorCoordinates = DerotatorStartingCoordinates; std::vector phase_shift; - for(size_t axis = 0; axis < 3; axis++) + for(size_t axis = 0; axis < 6; axis++) { phase_shift.push_back((double)std::rand() / RAND_MAX * 60); SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); @@ -399,7 +399,7 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; - for(size_t axis = 0; axis < 3; axis++) + for(size_t axis = 0; axis < 6; axis++) { SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); } @@ -418,78 +418,4 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) DerotatorProgramTrackFile.close(); SRPStatusThread.join(); DerotatorStatusThread.join(); - - /* - SRTMinorServoAnswerMap SRPStatus; - - ofstream programTrackFile; - programTrackFile.open(directory + "/trajectory.txt", ios::out); - - unsigned int axis_to_move = 0; - int sign = 1; - unsigned int idle_count = 0; - bool idle = false; - - std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; - std::vector programTrackCoordinates = startingCoordinates; - - while(!terminate) - { - double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; - long unsigned int trajectory_id = int(start_time); - double next_expected_time = start_time; - unsigned int point_id = 0; - - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - programTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); - - while(!terminate) - { - next_expected_time += TIMEGAP; - - std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); - point_id++; - - if(idle) - { - idle_count++; - if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) - { - idle_count = 0; - idle = false; - break; - } - } - else - { - if(moveAxis(programTrackCoordinates, axis_to_move, sign)) - { - sign *= -1; - idle = true; - } - else if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) - { - programTrackCoordinates[axis_to_move] = 0.0; - axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; - idle = true; - } - - SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - } - - //std::cout << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - programTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - } - } - - programTrackFile.close(); - statusThread.join();*/ } diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index 750972051..d66bca9de 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -411,7 +411,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) std::vector programTrackCoordinates = startingCoordinates; std::vector phase_shift; - for(size_t axis = 0; axis < 3; axis++) + for(size_t axis = 0; axis < 6; axis++) { phase_shift.push_back((double)std::rand() / RAND_MAX * 60); programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); @@ -442,14 +442,13 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; - for(size_t axis = 0; axis < 3; axis++) + for(size_t axis = 0; axis < 6; axis++) { programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } -- GitLab From 8bdc922d911203a9638a48c52ed7f5ead6f6ac77 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 4 Sep 2023 14:44:52 +0000 Subject: [PATCH 040/150] Updated new minor servos tests --- .../include/SRTMinorServoSocket.h | 1 + .../test/CombinedProgramTrackTest.cpp | 187 ++++++++++++--- .../test/DerotatorProgramTrackTest.cpp | 29 ++- SRT/Servers/SRTMinorServo/test/Makefile | 8 +- .../SRTMinorServo/test/ReadStatusOnlyTest.cpp | 216 ++++++++++++++++++ .../test/SRPProgramTrackTest.cpp | 58 +++-- .../SRTMinorServo/test/TESTS/plotCombined.py | 2 +- 7 files changed, 434 insertions(+), 67 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index 660457797..e00f63cb7 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -23,6 +23,7 @@ friend class SRTMinorServoSocketTest; friend class SRPProgramTrackTest; friend class DerotatorProgramTrackTest; friend class CombinedProgramTrackTest; +friend class ReadStatusOnlyTest; public: /** diff --git a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp index 0e5ce51fd..d53245b9f 100644 --- a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp @@ -27,11 +27,13 @@ #define EPSILON 0.00001 #define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } -#define SRP_MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } +#define SRP_MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } +#define SRP_MAX_SPEED std::vector{ 4.0, 4.0, 4.0, 0.04, 0.04, 0.04 } #define DEROTATOR std::string("GFR1") #define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } -#define DEROTATOR_RANGES std::vector{ 10.0, 50.0 } +#define DEROTATOR_RANGES std::vector{ 10.0, 100.0 } +#define DEROTATOR_MAX_SPEED std::vector{ 3.3 } std::atomic terminate = false; @@ -41,10 +43,46 @@ class CombinedProgramTrackTest : public ::testing::Test { protected: std::vector SRPStartingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; - std::vector DerotatorStartingCoordinates = { 0.0 }; + std::vector DerotatorStartingCoordinates = { 10.0 }; std::string directory; - std::thread SRPStatusThread; - std::thread DerotatorStatusThread; + std::thread statusThread; + + static void printStatus(std::string directory) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPStatusFile, DerotatorStatusFile; + SRPStatusFile.open(directory + "/SRP/status.txt", ios::out); + DerotatorStatusFile.open(directory + "/DEROTATOR/status.txt", ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string SRPStringStatus = serializeSRPStatus(SRPStatus); + std::string DerotatorStringStatus = serializeDerotatorStatus(DerotatorStatus); + + SRPStatusFile << SRPStringStatus << std::endl; + DerotatorStatusFile << DerotatorStringStatus << std::endl; + if(counter % 10 == 0) + { + std::cout << SRPStringStatus << std::endl; + std::cout << DerotatorStringStatus << std::endl; + } + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + SRPStatusFile.close(); + DerotatorStatusFile.close(); + } static void printSRPStatus(std::string filename) { @@ -200,17 +238,6 @@ protected: return true; } - /*static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) - { - sign = sign / abs(sign); - double offset_to_add; - axis_to_move >= 3 ? offset_to_add = 0.05 : offset_to_add = 0.8; - coordinates[axis_to_move] += sign * offset_to_add; - if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) - return true; - return false; - }*/ - void SetUp() override { srand((int)CIRATools::getUNIXEpoch()); @@ -282,32 +309,26 @@ protected: bool SRPReady = false, DerotatorReady = false; - while(true) + do { std::this_thread::sleep_for(std::chrono::milliseconds(100)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); std::cout << serializeSRPStatus(SRPStatus) << std::endl; - - if(compareCoordinates(SRPStartingCoordinates, getCoordinates(SRPStatus, SRP_COORDINATES))) - SRPReady = true; + SRPReady = std::get(SRPStatus["SRP_OPERATIVE_MODE"]) == 40 ? true : false; DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); std::cout << serializeDerotatorStatus(DerotatorStatus) << std::endl; - - if(compareCoordinates(DerotatorStartingCoordinates, getCoordinates(DerotatorStatus, DEROTATOR_COORDINATES))) - DerotatorReady = true; - - if(SRPReady && DerotatorReady) - break; + DerotatorReady = std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]) == 40 ? true : false; if(terminate) FAIL() << "Aborting test..." << std::endl; } + while(!SRPReady || !DerotatorReady); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); std::cout << "OK." << std::endl; @@ -331,8 +352,7 @@ protected: boost::filesystem::create_directory(directory + "/SRP"); boost::filesystem::create_directory(directory + "/DEROTATOR"); - SRPStatusThread = std::thread(&CombinedProgramTrackTest::printSRPStatus, directory + "/SRP/status.txt"); - DerotatorStatusThread = std::thread(&CombinedProgramTrackTest::printDerotatorStatus, directory + "/DEROTATOR/status.txt"); + statusThread = std::thread(&CombinedProgramTrackTest::printStatus, directory); } void TearDown() override @@ -355,16 +375,20 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) std::vector DerotatorCoordinates = DerotatorStartingCoordinates; std::vector phase_shift; + std::vector period; for(size_t axis = 0; axis < 6; axis++) { - phase_shift.push_back((double)std::rand() / RAND_MAX * 60); - SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); + period.push_back(SRP_MAX_RANGES[axis] / SRP_MAX_SPEED[axis] * 4); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); } - phase_shift.push_back((double)std::rand() / RAND_MAX * 60); double derotator_amplitude = (DEROTATOR_RANGES[1] - DEROTATOR_RANGES[0]) / 2; double derotator_center = (DEROTATOR_RANGES[0] + DEROTATOR_RANGES[1]) / 2; - DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[3] * 2 * M_PI / 60); + // Derotator period + period.push_back(80); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[6]); + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[6] * 2 * M_PI / period[6]); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates, start_time)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -401,9 +425,9 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) for(size_t axis = 0; axis < 6; axis++) { - SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); } - DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[3]) * 2 * M_PI / 60); + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[6]) * 2 * M_PI / period[6]); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates)); EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); @@ -416,6 +440,93 @@ TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) SRPProgramTrackFile.close(); DerotatorProgramTrackFile.close(); - SRPStatusThread.join(); - DerotatorStatusThread.join(); + statusThread.join(); +} + +TEST_F(CombinedProgramTrackTest, SineWaveSeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPProgramTrackFile; + SRPProgramTrackFile.open(directory + "/SRP/trajectory.txt", ios::out); + + ofstream DerotatorProgramTrackFile; + DerotatorProgramTrackFile.open(directory + "/DEROTATOR/trajectory.txt", ios::out); + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "Starting new trajectory with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector SRPCoordinates = SRPStartingCoordinates; + std::vector DerotatorCoordinates = DerotatorStartingCoordinates; + + std::vector phase_shift; + std::vector period; + for(size_t axis = 0; axis < 6; axis++) + { + period.push_back(SRP_MAX_RANGES[axis] / SRP_MAX_SPEED[axis] * 4); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); + } + + double derotator_amplitude = (DEROTATOR_RANGES[1] - DEROTATOR_RANGES[0]) / 2; + double derotator_center = (DEROTATOR_RANGES[0] + DEROTATOR_RANGES[1]) / 2; + // Derotator period + period.push_back(80); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[6]); + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[6] * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, SRPCoordinates) << std::endl; + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, DerotatorCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 6; axis++) + { + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); + } + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[6]) * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, SRPCoordinates) << std::endl; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, DerotatorCoordinates) << std::endl; + + if(point_id == 1000) + break; + } + } + + SRPProgramTrackFile.close(); + DerotatorProgramTrackFile.close(); + statusThread.join(); } diff --git a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp index 65133c073..6f5f719da 100644 --- a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp @@ -54,7 +54,7 @@ protected: std::string status = serializeStatus(DerotatorStatus); statusFile << status << std::endl; - if(counter % 10 == 0) + if(counter % (long unsigned int)(0.1 / STATUS_PERIOD) == 0) std::cout << status << std::endl; counter++; @@ -111,7 +111,7 @@ protected: static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) { sign = sign / abs(sign); - double offset_to_add = 3.3 / 5; + double offset_to_add = 3.3 * TIMEGAP; coordinates[axis_to_move] += sign * offset_to_add; if(sign > 0) { @@ -175,14 +175,13 @@ protected: std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); } - std::cout << "Sending derotator to 0..."; + std::cout << "Sending derotator to the initial position..." << std::endl; DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("Derotatore" + DEROTATOR, startingCoordinates)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); signal(SIGINT, DerotatorProgramTrackTest::sigintHandler); - do { std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -242,7 +241,7 @@ TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) DerotatorStatus = socket.sendCommand(command); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); @@ -309,7 +308,8 @@ TEST_F(DerotatorProgramTrackTest, SineWaveMovementTest) double phase_shift = (double)std::rand() / RAND_MAX * 60; double amplitude = (RANGES[1] - RANGES[0]) / 2; double center = (RANGES[0] + RANGES[1]) / 2; - programTrackCoordinates[0] = center + amplitude * sin(phase_shift * 2 * M_PI / 60); + double period = 80; + programTrackCoordinates[0] = center + amplitude * sin(phase_shift * 2 * M_PI / period); SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); SRTMinorServoAnswerMap DerotatorStatus; @@ -336,7 +336,7 @@ TEST_F(DerotatorProgramTrackTest, SineWaveMovementTest) std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; - programTrackCoordinates[0] = center + amplitude * sin((time_delta + phase_shift) * 2 * M_PI / 60); + programTrackCoordinates[0] = center + amplitude * sin((time_delta + phase_shift) * 2 * M_PI / period); DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); @@ -363,6 +363,8 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; std::vector programTrackCoordinates = startingCoordinates; + bool immediate = true; + while(!terminate) { double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; @@ -374,7 +376,7 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); @@ -390,7 +392,8 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) if(idle) { idle_count++; - if(idle_count == 25) + //if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP || immediate) { idle_count = 0; idle = false; @@ -412,6 +415,8 @@ TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } + + //immediate = immediate ? false : true; } programTrackFile.close(); @@ -435,7 +440,7 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) while(!terminate) { std::vector programTrackCoordinates = startingCoordinates; - programTrackCoordinates[0] = 25.0; + programTrackCoordinates[0] = RANGES[1]; double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; long unsigned int trajectory_id = int(start_time); @@ -446,7 +451,7 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(20)); + std::this_thread::sleep_for(std::chrono::milliseconds(50)); DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); @@ -462,7 +467,7 @@ TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) if(idle) { idle_count++; - if(idle_count == 25) + if(idle_count == (ADVANCE_TIMEGAP * 2) / TIMEGAP) { idle_count = 0; idle = false; diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 7493b4c96..035f03688 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,7 +14,7 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest CombinedProgramTrackTest +EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest SRTMinorServoSocketTest_CFLAGS = -std=c++17 @@ -36,6 +36,11 @@ CombinedProgramTrackTest_CFLAGS = -std=c++17 CombinedProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem CombinedProgramTrackTest_LDFLAGS = -lstdc++ -lpthread +ReadStatusOnlyTest_OBJECTS = ReadStatusOnlyTest +ReadStatusOnlyTest_CFLAGS = -std=c++17 +ReadStatusOnlyTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +ReadStatusOnlyTest_LDFLAGS = -lstdc++ -lpthread + # END OF CUSTOMIZATION # do not edit below this line #---------------------------- @@ -60,6 +65,7 @@ do_unit: all ../bin/SRPProgramTrackTest --gtest_output=xml:results/cppSRPProgramTrackTest.xml ../bin/DerotatorProgramTrackTest --gtest_output=xml:results/cppDerotatorProgramTrackTest.xml ../bin/CombinedProgramTrackTest --gtest_output=xml:results/cppCombinedProgramTrackTest.xml + ../bin/ReadStatusOnlyTest --gtest_output=xml:results/cppReadStatusOnlyTest.xml do_pyunit: @echo "running python unit tests" diff --git a/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp b/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp new file mode 100644 index 000000000..833348bba --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp @@ -0,0 +1,216 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +//#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif + +#define SOCKET_TIMEOUT 0.5 +#define STATUS_PERIOD 0.1 +#define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } +#define DEROTATOR std::string("GFR1") +#define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } + + +std::atomic terminate = false; + + +class ReadStatusOnlyTest : public ::testing::Test +{ +protected: + std::string directory; + + static void printStatus(std::string directory, bool timestamp_only=false) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPStatusFile, DerotatorStatusFile; + SRPStatusFile.open(directory + "/SRP/status.txt", ios::out); + SRPStatusFile << std::fixed << std::setprecision(6); + DerotatorStatusFile.open(directory + "/DEROTATOR/status.txt", ios::out); + DerotatorStatusFile << std::fixed << std::setprecision(6); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string SRPStringStatus = serializeSRPStatus(SRPStatus); + std::string DerotatorStringStatus = serializeDerotatorStatus(DerotatorStatus); + + if(timestamp_only) + { + SRPStatusFile << std::get(SRPStatus["TIMESTAMP"]) << std::endl; + DerotatorStatusFile << std::get(DerotatorStatus["TIMESTAMP"]) << std::endl; + } + else + { + SRPStatusFile << SRPStringStatus << std::endl; + DerotatorStatusFile << DerotatorStringStatus << std::endl; + } + + if(counter % 10 == 0) + { + std::cout << SRPStringStatus << std::endl; + std::cout << DerotatorStringStatus << std::endl; + } + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + SRPStatusFile.close(); + DerotatorStatusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeSRPStatus(SRTMinorServoAnswerMap map) + { + std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, SRP_COORDINATES)); + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeDerotatorStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, DEROTATOR_COORDINATES)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus, std::vector coordinates) + { + std::vector currentCoordinates; + + for(std::string coordinate : coordinates) + { + auto value = SRPStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + auto value = SRPStatus[elongation]; + + try + { + currentElongations.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentElongations.push_back(10000.0); + } + } + + return currentElongations; + } + + void SetUp() override + { + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + signal(SIGINT, ReadStatusOnlyTest::sigintHandler); + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/COMBINED"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + boost::filesystem::create_directory(directory + "/SRP"); + boost::filesystem::create_directory(directory + "/DEROTATOR"); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(ReadStatusOnlyTest, ReadStatusTest) +{ + ReadStatusOnlyTest::printStatus(directory, true); +} diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index d66bca9de..c53bebd49 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -22,7 +22,9 @@ #define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 5 -#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } +//#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } +#define MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } +#define MAX_SPEED std::vector{ 4, 4, 4, 0.04, 0.04, 0.04 } #define STATUS_PERIOD 0.01 std::atomic terminate = false; @@ -72,7 +74,21 @@ protected: static std::string serializeStatus(SRTMinorServoAnswerMap map) { - std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + std::string status; + try + { + status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad timestamp!" << std::endl; + + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = map.begin(); iterator != map.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + } status += serializeElongations(getElongations(map)); return status; } @@ -110,8 +126,8 @@ protected: } catch(std::bad_variant_access const& ex) { - std::cout << ex.what() << ", variant index: " << value.index() << std::endl; - currentCoordinates.push_back(200.0); + std::cout << "Bad floating point coordinate:" << std::get(value) << std::endl; + currentCoordinates.push_back(double(std::get(value))); } } @@ -133,8 +149,8 @@ protected: } catch(std::bad_variant_access const& ex) { - std::cout << ex.what() << ", variant index: " << value.index() << std::endl; - currentElongations.push_back(10000.0); + std::cout << "Bad floating point elongation:" << std::get(value) << std::endl; + currentElongations.push_back(double(std::get(value))); } } @@ -143,10 +159,16 @@ protected: static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) { - sign = sign / abs(sign); - double offset_to_add; - axis_to_move >= 3 ? offset_to_add = 0.076 : offset_to_add = 0.8; + double starting_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + double offset_to_add = MAX_SPEED[axis_to_move] / 5; coordinates[axis_to_move] += sign * offset_to_add; + double ending_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + if(starting_sign == -1 && ending_sign >= 0) + { + // Zero crossed + coordinates[axis_to_move] = 0.0; + return false; + } if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) { coordinates[axis_to_move] = sign * MAX_RANGES[axis_to_move]; @@ -411,10 +433,13 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) std::vector programTrackCoordinates = startingCoordinates; std::vector phase_shift; + std::vector period; for(size_t axis = 0; axis < 6; axis++) { - phase_shift.push_back((double)std::rand() / RAND_MAX * 60); - programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / 60); + double period_multiplier = axis < 3 ? 4 : 4; + period.push_back(MAX_RANGES[axis] / MAX_SPEED[axis] * period_multiplier); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); } SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); @@ -444,7 +469,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) for(size_t axis = 0; axis < 6; axis++) { - programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / 60); + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); @@ -472,6 +497,8 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; std::vector programTrackCoordinates = startingCoordinates; + bool immediate = true; + while(!terminate) { double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; @@ -499,7 +526,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) if(idle) { idle_count++; - if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + if(idle_count == (ADVANCE_TIMEGAP / TIMEGAP) || immediate) { idle_count = 0; idle = false; @@ -513,9 +540,8 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) sign *= -1; idle = true; } - else if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + else if(programTrackCoordinates[axis_to_move] == 0.0 && sign == 1) { - programTrackCoordinates[axis_to_move] = 0.0; axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; idle = true; } @@ -527,6 +553,8 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } + + //immediate = immediate ? false : true; } programTrackFile.close(); diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py index 90ae79f00..87127cccb 100755 --- a/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py @@ -67,7 +67,7 @@ with open(os.path.join(arguments.directory, 'DEROTATOR', 'trajectory.txt'), 'r') args = line.strip().split() trajectory_rotation.append(float(args[1])) -fig, axs = plt.subplots(7) +fig, axs = plt.subplots(7, sharex=True) fig.canvas.manager.set_window_title('Program Track Positions') fig.suptitle('Program Track Positions') -- GitLab From de3d709bb930f1f726438f63d9c24904b1fa8b80 Mon Sep 17 00:00:00 2001 From: Andrea Orlati Date: Thu, 7 Sep 2023 09:57:42 +0200 Subject: [PATCH 041/150] Adding C-band receiver supporto to centos_7_compatibility (#811) * fix issue #806: Preliminary support for C band receiver at the SRT. IF2 conversion control, component configuration, data configuration, Station procedure, changelog, Receivers boss configuration are still missing. I also recoded some parts of the system in order to get rid of the warnings coming from new gcc compiler. Introduced a GCC Compiler Directive workaround to by pass warning from ACS source code. * fix issue #806: Recoding to overcome warnings during compilation ended. Drawbacks are not expected but a check is required since some library header files have been touched. Added all missing receiver configurations (mnemonic is CCG). Missing other subsystem configurations such us servo system or backend. Missing as well the part to control the board for the 1st and 2nd conversion of the receiver. * fix issue #806: a couple of fixes to guarantee nothing is broken by the changes made to get rid of deprecated code --------- Co-authored-by: Andrea Orlati --- CHANGELOG.md | 1 + .../IRALibrary/include/Cplusplus11Helper.h | 11 + .../IRALibrary/include/CustomLoggerUtils.h | 7 + Common/Libraries/IRALibrary/include/DBTable.h | 7 + .../Libraries/IRALibrary/include/DataField.h | 7 + .../Libraries/IRALibrary/include/DateTime.h | 7 + .../IRALibrary/include/Definitions.h | 19 + Common/Libraries/IRALibrary/include/IRA | 7 + .../Libraries/IRALibrary/include/IRATools.h | 8 + .../Libraries/IRALibrary/include/LogFilter.h | 7 + .../IRALibrary/include/MicroControllerBoard.h | 10 +- .../IRALibrary/include/ReceiverControl.h | 90 +- .../IRALibrary/include/ScheduleTimer.h | 7 + Common/Libraries/IRALibrary/include/String.h | 136 +- .../include/TimeTaggedCircularArray.h | 8 + .../IRALibrary/include/TimeoutSync.h | 7 +- Common/Libraries/IRALibrary/src/Lecom.cpp | 2 +- Common/Libraries/IRALibrary/src/Makefile | 2 +- .../IRALibrary/src/MicroControllerBoard.cpp | 10 +- .../IRALibrary/src/ReceiverControl.cpp | 90 +- .../Libraries/IRALibrary/src/SourceFlux.cpp | 3 +- Common/Libraries/IRALibrary/src/String.cpp | 32 +- .../src/TimeTaggedCircularArray.cpp | 3 +- .../ParserLibrary/include/SP_function0.h | 22 +- .../ParserLibrary/include/SP_function1.h | 22 +- .../ParserLibrary/include/SP_function2.h | 22 +- .../ParserLibrary/include/SP_function3.h | 22 +- .../ParserLibrary/include/SP_function4.h | 22 +- .../ParserLibrary/include/SP_function5.h | 22 +- .../ParserLibrary/include/SP_function6.h | 22 +- .../ParserLibrary/include/SP_function7.h | 20 +- .../ParserLibrary/include/SP_parser.h | 20 +- .../ParserLibrary/include/SP_parser.i | 35 +- .../ParserLibrary/include/SP_typeConversion.h | 100 +- .../ParserLibrary/include/SP_types.h | 74 +- .../ParserLibrary/src/TestFunctions.cpp | 2 +- .../ParserLibrary/src/TestParser.cpp | 3 +- .../Libraries/ParserLibrary/src/TestTypes.cpp | 3 +- .../CDB/MACI/Managers/Manager/Manager.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 2 +- Noto/CDB/MACI/Managers/Manager/Manager.xml | 2 +- .../CDB/MACI/Managers/Manager/Manager.xml | 2 +- .../StationProcedures/StationProcedures.xml | 8 + SRT/CDB/alma/RECEIVERS/Boss/Boss.xml | 2 + .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 18 + .../SRT7GHzReceiver/SRT7GHzReceiver.xml | 2 +- .../SRT5GHzContainer/SRT5GHzContainer.xml | 36 + .../CDB/MACI/Managers/Manager/Manager.xml | 2 +- .../DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml | 15 + .../SRT5GHzReceiver/NoiseMark/NoiseMark.xml | 16 + .../NormalModeSetup/NormalModeSetup.xml | 25 + .../Synthesizer/Synthesizer.xml | 10 + .../DataBlock/SRT5GHzReceiver/Taper/Taper.xml | 14 + .../StationProcedures/StationProcedures.xml | 8 + .../CDB/alma/RECEIVERS/Boss/Boss.xml | 2 + .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 187 +++ .../SRTReceiversInterface/idl/SRT5GHz.idl | 108 ++ .../SRTReceiversInterface/src/Makefile | 3 +- .../SRTScripts/app-defaults/discosStartup.xml | 20 +- .../app-defaults/simulationStartup.xml | 11 +- .../config/CDB/schemas/SRT5GHzReceiver.xsd | 106 ++ .../SRT5GHzReceiver/include/ComponentCore.h | 490 ++++++++ .../SRT5GHzReceiver/include/Configuration.h | 272 ++++ .../SRT5GHzReceiver/include/DevIOBandWidth.h | 78 ++ .../include/DevIOComponentStatus.h | 61 + .../include/DevIOCryoTemperatureCoolHead.h | 78 ++ .../DevIOCryoTemperatureCoolHeadWindow.h | 78 ++ .../include/DevIOCryoTemperatureLNA.h | 78 ++ .../include/DevIOCryoTemperatureLNAWindow.h | 78 ++ .../include/DevIOEnvTemperature.h | 78 ++ .../include/DevIOInitialFrequency.h | 77 ++ .../include/DevIOLNAControls.h | 80 ++ .../include/DevIOLocalOscillator.h | 77 ++ .../SRT5GHzReceiver/include/DevIOMode.h | 59 + .../include/DevIOPolarization.h | 77 ++ .../SRT5GHzReceiver/include/DevIOStatus.h | 80 ++ .../SRT5GHzReceiver/include/DevIOVacuum.h | 77 ++ .../SRT5GHzReceiver/include/MonitorThread.h | 87 ++ .../SRT5GHzReceiver/include/SRT5GHzImpl.h | 493 ++++++++ .../SRT5GHzReceiver/src/ComponentCore.cpp | 1117 +++++++++++++++++ .../SRT5GHzReceiver/src/Configuration.cpp | 523 ++++++++ SRT/Servers/SRT5GHzReceiver/src/Makefile | 209 +++ .../SRT5GHzReceiver/src/MonitorThread.cpp | 199 +++ .../SRT5GHzReceiver/src/SRT5GHzImpl.cpp | 581 +++++++++ SystemMake/Makefile | 5 +- 85 files changed, 6222 insertions(+), 303 deletions(-) create mode 100644 Common/Libraries/IRALibrary/include/Cplusplus11Helper.h create mode 100644 SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml create mode 100644 SRT/Configuration/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml create mode 100644 SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml create mode 100644 SRT/Interfaces/SRTReceiversInterface/idl/SRT5GHz.idl create mode 100644 SRT/Servers/SRT5GHzReceiver/config/CDB/schemas/SRT5GHzReceiver.xsd create mode 100644 SRT/Servers/SRT5GHzReceiver/include/ComponentCore.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/Configuration.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOBandWidth.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOComponentStatus.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHead.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHeadWindow.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNA.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNAWindow.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOEnvTemperature.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOInitialFrequency.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOLNAControls.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOLocalOscillator.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOMode.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOPolarization.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOStatus.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/DevIOVacuum.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/MonitorThread.h create mode 100644 SRT/Servers/SRT5GHzReceiver/include/SRT5GHzImpl.h create mode 100644 SRT/Servers/SRT5GHzReceiver/src/ComponentCore.cpp create mode 100644 SRT/Servers/SRT5GHzReceiver/src/Configuration.cpp create mode 100644 SRT/Servers/SRT5GHzReceiver/src/Makefile create mode 100644 SRT/Servers/SRT5GHzReceiver/src/MonitorThread.cpp create mode 100644 SRT/Servers/SRT5GHzReceiver/src/SRT5GHzImpl.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 8bc409201..5836a5f16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -97,6 +97,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/ ## [Next Release] - ## Added + issue #806 Added supprto for the C-band receiver at the SRT ## Fixed ## Changed issue #689 - The dataset provided by wether station has been enlarged by the wind direction. The correctponding RAL 'wx' command will noe provided wind direction readout, as well diff --git a/Common/Libraries/IRALibrary/include/Cplusplus11Helper.h b/Common/Libraries/IRALibrary/include/Cplusplus11Helper.h new file mode 100644 index 000000000..fd00329b6 --- /dev/null +++ b/Common/Libraries/IRALibrary/include/Cplusplus11Helper.h @@ -0,0 +1,11 @@ +#ifndef CPLUSPLUS_HELPER_H +#define CPLUSPLUS_HELPER_H + +#if (__cplusplus > 199711L ) +#define C11_STRINGIFY(X) #X +#define C11_IGNORE_WARNING_PUSH _Pragma("GCC diagnostic push") +#define C11_IGNORE_WARNING_POP _Pragma("GCC diagnostic pop") +#define C11_IGNORE_WARNING(X) _Pragma(C11_STRINGIFY(GCC diagnostic ignored X)) +#endif + +#endif \ No newline at end of file diff --git a/Common/Libraries/IRALibrary/include/CustomLoggerUtils.h b/Common/Libraries/IRALibrary/include/CustomLoggerUtils.h index 3cc494f34..9669a02ee 100644 --- a/Common/Libraries/IRALibrary/include/CustomLoggerUtils.h +++ b/Common/Libraries/IRALibrary/include/CustomLoggerUtils.h @@ -1,7 +1,14 @@ #ifndef CUSTOM_LOGGER_UTILS_H #define CUSTOM_LOGGER_UTILS_H +#include + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include #define CUSTOM_LOGGING_DATA_NAME "source" diff --git a/Common/Libraries/IRALibrary/include/DBTable.h b/Common/Libraries/IRALibrary/include/DBTable.h index d920c1c0f..fdc74b70c 100644 --- a/Common/Libraries/IRALibrary/include/DBTable.h +++ b/Common/Libraries/IRALibrary/include/DBTable.h @@ -11,8 +11,15 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 22/06/2006 Creation */ /* Andrea Orlati(aorlati@ira.inaf.it) 15/04/2010 Now the table also suppport calls from maci simple clients */ +#include + #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include "IRA" #include "DataField.h" #include diff --git a/Common/Libraries/IRALibrary/include/DataField.h b/Common/Libraries/IRALibrary/include/DataField.h index 521ffbf2e..36c47de85 100644 --- a/Common/Libraries/IRALibrary/include/DataField.h +++ b/Common/Libraries/IRALibrary/include/DataField.h @@ -11,8 +11,15 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 07/06/2006 Creation */ /* Andrea Orlati(aorlati@ira.inaf.it) 26/01/2018 Rewritten in order to bypass an issue with 64bit ACS2017 */ +#include + #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include "Definitions.h" #include "String.h" diff --git a/Common/Libraries/IRALibrary/include/DateTime.h b/Common/Libraries/IRALibrary/include/DateTime.h index 97e676527..1f48d6f61 100644 --- a/Common/Libraries/IRALibrary/include/DateTime.h +++ b/Common/Libraries/IRALibrary/include/DateTime.h @@ -16,7 +16,14 @@ #ifndef DATETIME_H #define DATETIME_H +#include + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include "Definitions.h" #include "IRATools.h" #include "Site.h" diff --git a/Common/Libraries/IRALibrary/include/Definitions.h b/Common/Libraries/IRALibrary/include/Definitions.h index 8b7d0cf42..230baecf8 100644 --- a/Common/Libraries/IRALibrary/include/Definitions.h +++ b/Common/Libraries/IRALibrary/include/Definitions.h @@ -252,6 +252,24 @@ COMPL.getErrorTraceHelper()->top(); \ } +#ifdef _CPLUSPLUS11_PORTING_ +/** + * This macro is a shortcut. This is the implementation of the function that will returns the reference of a component + * property. + * @param IMPLCLASS the name of the c++ class that implements the IDL interface of the component. + * @param TYPE the type of the ACS property that will be returned as a reference + * @param PROPERTY the c++ object that implmemnts the ACS property + * @param PROPERTYNAME the name of the property as reported in the idl file that defines the interface + * @throw CORBA::SystemException +*/ +#define _PROPERTY_REFERENCE_CPP(IMPLCLASS,TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr IMPLCLASS::PROPERTYNAME() \ +{ \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + +#else /** * This macro is a shortcut. This is the implementation of the function that will returns the reference of a component * property. @@ -266,5 +284,6 @@ TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ return tmp._retn(); \ } +#endif #endif diff --git a/Common/Libraries/IRALibrary/include/IRA b/Common/Libraries/IRALibrary/include/IRA index cb15cd348..32ccc3bd8 100644 --- a/Common/Libraries/IRALibrary/include/IRA +++ b/Common/Libraries/IRALibrary/include/IRA @@ -4,6 +4,12 @@ // $Id: IRA,v 1.3 2007-09-11 14:58:09 a.orlati Exp $ #include "Definitions.h" +//#include + +//C11_IGNORE_WARNING_PUSH +//C11_IGNORE_WARNING("-Wdeprecated-declarations") +//C11_IGNORE_WARNING("-Wmisleading-indentation") +//C11_IGNORE_WARNING("-Wcatch-value=") #include "String.h" #include "IRATools.h" #include "Error.h" @@ -17,5 +23,6 @@ #include "TimeTaggedCircularArray.h" #include "CustomLoggerUtils.h" #include "Timer.h" +//C11_IGNORE_WARNING_POP #endif diff --git a/Common/Libraries/IRALibrary/include/IRATools.h b/Common/Libraries/IRALibrary/include/IRATools.h index 56e7e1f8c..33a03b687 100644 --- a/Common/Libraries/IRALibrary/include/IRATools.h +++ b/Common/Libraries/IRALibrary/include/IRATools.h @@ -32,12 +32,20 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 12/01/2016 reviewed the function skyFrequency in order to address also lower side band during down conversion */ /* Giuseppe Carboni (giuseppe.carboni@inaf.it) 07/12/2021 added the getUNIXEpoch, ACSTime2UNIXEpoch and UNIXEpoch2ACSTime functions */ +#include + #include #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include #include #include #include +C11_IGNORE_WARNING_POP + #include #include diff --git a/Common/Libraries/IRALibrary/include/LogFilter.h b/Common/Libraries/IRALibrary/include/LogFilter.h index 09c7e05a6..e2221caba 100644 --- a/Common/Libraries/IRALibrary/include/LogFilter.h +++ b/Common/Libraries/IRALibrary/include/LogFilter.h @@ -13,11 +13,18 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 17/03/2008 Fixed a bug in ErrorWrapper that causes the component to crash */ /* Andrea Orlati(aorlati@ira.inaf.it) 12/02/2010 Added the destroy method that should guarantee a smoother close up */ +#include + #include "Definitions.h" #include "String.h" #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include #include +C11_IGNORE_WARNING_POP #include #include diff --git a/Common/Libraries/IRALibrary/include/MicroControllerBoard.h b/Common/Libraries/IRALibrary/include/MicroControllerBoard.h index 574eb2fe9..aed54f79b 100644 --- a/Common/Libraries/IRALibrary/include/MicroControllerBoard.h +++ b/Common/Libraries/IRALibrary/include/MicroControllerBoard.h @@ -52,7 +52,7 @@ public: MicroControllerBoard(std::string IP, unsigned short port=8000, BYTE master_address=0x7C, BYTE slave_address=0x7F, DWORD timeout=MCB_TOUT - ) throw (MicroControllerBoardEx); + ); /** Destructor */ @@ -62,7 +62,7 @@ public: /** Perform a TCP connection socket to the board * @throw MicroControllerBoardEx */ - void openConnection(void) throw (MicroControllerBoardEx); + void openConnection(void); /** Return the status of TCP socket connection to the board @@ -93,7 +93,7 @@ public: * @throw MicroControllerBoardEx * @return a vector storing the requested parameters */ - std::vector receive(void) throw (MicroControllerBoardEx); + std::vector receive(void); /** Send a command to the board. @@ -101,7 +101,7 @@ public: * @param parameters a vector of parameters to send (it could be empty) * @throw MicroControllerBoardEx */ - void send(const BYTE command, std::vector parameters=std::vector()) throw (MicroControllerBoardEx); + void send(const BYTE command, std::vector parameters=std::vector()); /** Return the IP address of the board */ std::string getIP() const { return(m_IP); } @@ -116,7 +116,7 @@ private: * @param message the vector on which to compute the checksum * @throw MicroControllerBoardEx */ - BYTE computeChecksum(std::vector message) throw (MicroControllerBoardEx); + BYTE computeChecksum(std::vector message); const std::string m_IP; diff --git a/Common/Libraries/IRALibrary/include/ReceiverControl.h b/Common/Libraries/IRALibrary/include/ReceiverControl.h index 9d20083f2..08024c0b3 100644 --- a/Common/Libraries/IRALibrary/include/ReceiverControl.h +++ b/Common/Libraries/IRALibrary/include/ReceiverControl.h @@ -179,7 +179,7 @@ public: const BYTE switch_madd=0x7C, // Switch board master address const BYTE switch_sadd=0x7F, // Switch board slave address - We use broadcast address bool reliable_comm=false - ) throw (ReceiverControlEx); + ); /** Destructor */ @@ -201,7 +201,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_11, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Set the noise mark generator to OFF @@ -216,7 +216,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_11, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the noise mark generator set to ON? @@ -230,7 +230,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_11 - ) throw (ReceiverControlEx); + ); /** Enable the external noise mark generator synchronous command @@ -245,7 +245,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_12, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Disable the external noise mark generator synchronous command @@ -260,7 +260,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_12, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the external noise mark generator command enabled? @@ -274,7 +274,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_12 - ) throw (ReceiverControlEx); + ); /** Set the reliable communication to/from the board to ON */ @@ -310,7 +310,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_AD24, const BYTE port_number=MCB_PORT_NUMBER_00_07, const size_t raw_index=2 - ) throw (ReceiverControlEx); + ); /** Return the vertex temperature @@ -334,7 +334,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_AD24, const BYTE port_number=MCB_PORT_NUMBER_00_07, const size_t raw_index=6 - ) throw (ReceiverControlEx); + ); /** Return the cryogenic temperature @@ -357,7 +357,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_F32, const BYTE port_type=MCB_PORT_TYPE_AD24, const BYTE port_number=MCB_PORT_NUMBER_00_07 - ) throw (ReceiverControlEx); + ); /** Set to ON the cool head @@ -372,7 +372,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_08, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Set to OFF the cool head @@ -387,7 +387,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_08, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the cool head set ON? * @param data_type the type of the data; the default type is 1 bit @@ -400,7 +400,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_08 - ) throw (ReceiverControlEx); + ); /** Is the cool head status ON? @@ -414,7 +414,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_24 - ) throw (ReceiverControlEx); + ); /** Set to ON the vacuum sensor @@ -429,7 +429,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_04, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Set to OFF the vacuum sensor @@ -444,7 +444,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_04, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the vacuum sensor ON? @@ -458,7 +458,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_04 - ) throw (ReceiverControlEx); + ); /** Set to ON the vacuum pump @@ -473,7 +473,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_05, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Set to OFF the vacuum pump @@ -488,7 +488,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_05, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the vacuum pump ON? @@ -502,7 +502,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_05 - ) throw (ReceiverControlEx); + ); /** Has the vacuum pump a fault? @@ -516,7 +516,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_06 - ) throw (ReceiverControlEx); + ); /** Set to ON the vacuum valve @@ -531,7 +531,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_07, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Set to OFF the vacuum valve @@ -546,7 +546,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_07, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is the vacuum valve ON? @@ -560,7 +560,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_07 - ) throw (ReceiverControlEx); + ); /** Is the remote command enable? @@ -574,7 +574,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_26 - ) throw (ReceiverControlEx); + ); /** Select the first local oscillator (LO1) @@ -589,7 +589,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_00, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Is LO1 selected? @@ -603,7 +603,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_16 - ) throw (ReceiverControlEx); + ); /** Select the second local oscillator (LO2) @@ -618,7 +618,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_00, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Is LO2 selected? @@ -632,7 +632,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_17 - ) throw (ReceiverControlEx); + ); /** Is LO2 locked? @@ -646,7 +646,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_18 - ) throw (ReceiverControlEx); + ); /** Set the single dish mode to ON. The VLBI mode will be turn OFF @@ -669,7 +669,7 @@ public: const BYTE port_number_vlbi=MCB_PORT_NUMBER_14, const BYTE value_sd=0x00, const BYTE value_vlbi=0x01 - ) throw (ReceiverControlEx); + ); /** Is the single dish mode set to ON? @@ -683,7 +683,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_29 - ) throw (ReceiverControlEx); + ); /** Set the VLBI mode to ON. The SD mode will be turn OFF @@ -706,7 +706,7 @@ public: const BYTE port_number_sd=MCB_PORT_NUMBER_13, const BYTE value_vlbi=0x00, const BYTE value_sd=0x01 - ) throw (ReceiverControlEx); + ); /** Is the VLBI mode set to ON? @@ -720,7 +720,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_30 - ) throw (ReceiverControlEx); + ); /** return the FetValues (VDL, IDL, VGR, VDR, IDR and VGR) @@ -746,7 +746,7 @@ public: unsigned short stage_number, double (*currentConverter)(double voltage) = NULL, double (*voltageConverter)(double voltage) = NULL - ) throw (ReceiverControlEx); + ); /** Return for each feed and channel the fet quantity value of a given stage. For @@ -768,7 +768,7 @@ public: FetValue quantity, unsigned short stage_number, double (*converter)(double voltage)=NULL - ) throw (ReceiverControlEx); + ); /** Turn the LNAs of the left channels ON @@ -783,7 +783,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_08, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Turn the LNAs of the left channels OFF @@ -798,7 +798,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_08, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Turn the LNAs of the right channels ON @@ -813,7 +813,7 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_09, const BYTE value=0x00 - ) throw (ReceiverControlEx); + ); /** Turn the LNAs of the right channels OFF @@ -828,13 +828,13 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_09, const BYTE value=0x01 - ) throw (ReceiverControlEx); + ); /** Perform a TCP connection socket to the boards * @throw ReceiverControlEx */ - void openConnection(void) throw (ReceiverControlEx); + void openConnection(void); /** Close the TCP connection sockets to the boards */ @@ -876,7 +876,7 @@ public: const BYTE port_number, const size_t width, const std::vector parameters - ) throw (ReceiverControlEx); + ); /** Set the RF path to the cold load @@ -891,7 +891,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_U16, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_00_15 - ) throw (ReceiverControlEx); + ) ; /** Set the RF path to the sky @@ -906,7 +906,7 @@ public: const BYTE data_type=MCB_CMD_DATA_TYPE_U16, const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number=MCB_PORT_NUMBER_00_15 - ) throw (ReceiverControlEx); + ); private: @@ -922,7 +922,7 @@ private: std::vector makeRequest( MicroControllerBoard *board_ptr, const BYTE command, size_t len, ... - ) throw(MicroControllerBoardEx); + ); /** Return the requested value computed from a vector of parameters diff --git a/Common/Libraries/IRALibrary/include/ScheduleTimer.h b/Common/Libraries/IRALibrary/include/ScheduleTimer.h index 95089e1a0..9c8eac0c6 100644 --- a/Common/Libraries/IRALibrary/include/ScheduleTimer.h +++ b/Common/Libraries/IRALibrary/include/ScheduleTimer.h @@ -12,10 +12,17 @@ #ifndef SCHEDULETIMER_H_ #define SCHEDULETIMER_H_ +#include + #include #include #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include namespace IRA { diff --git a/Common/Libraries/IRALibrary/include/String.h b/Common/Libraries/IRALibrary/include/String.h index 04bf65eaf..39cf12648 100644 --- a/Common/Libraries/IRALibrary/include/String.h +++ b/Common/Libraries/IRALibrary/include/String.h @@ -19,6 +19,34 @@ #include namespace IRA { + +class CString; + +CString operator +(const CString& s1,const CString & s2); +CString operator +(const CString & s1, char ch); +CString operator +(const CString & s1, const char *str); +CString operator +(char ch, const CString & s2); +CString operator +(const char *str, const CString & s2); +bool operator ==(const CString & s1, const CString & s2); +bool operator ==(const CString & s1, const char *s2); +bool operator ==(const char *s1, const CString & s2); +bool operator !=(const CString & s1, const CString & s2); +bool operator !=(const CString & s1, const char *s2); +bool operator !=(const char *s1, const CString & s2); +bool operator < (const CString & s1, const CString & s2); +bool operator < (const CString & s1, const char *s2); +bool operator < (const char *s1, const CString & s2); +bool operator > (const CString & s1, const CString & s2); +bool operator > (const CString & s1, const char *s2); +bool operator > (const char *s1, const CString & s2); +bool operator <=(const CString & s1, const CString & s2); +bool operator <=(const CString & s1, const char *s2); +bool operator <=(const char *s1, const CString & s2); +bool operator >=(const CString & s1, const CString & s2); +bool operator >=(const CString & s1, const char *s2); +bool operator >=(const char *s1, const CString & s2); + + /** * This class allow to manage strings easier than standard C/CPP methods @@ -364,115 +392,113 @@ public: // Operations const CString & operator =(const CString& src); const CString & operator =(char ch); const CString & operator =(const char* str); - // have to be friend so we can use char and char* as first arguments /** - * Friend operator, used to concatenate. + * Operator used to concatenate the string with another one. */ - friend CString operator +(const CString& s1,const CString & s2); + const CString & operator +=(const CString & src); /** - * Friend operator, used to concatenate. + * Operator used to concatenate the string with another one. */ - friend CString operator +(const CString & s1, char ch); + const CString & operator +=(char ch); /** - * Friend operator, used to concatenate. + * Operator used to concatenate the string with another one. */ - friend CString operator +(const CString & s1, const char *str); + const CString & operator +=(const char *str); + // have to be friend so we can use char and char* as first arguments /** * Friend operator, used to concatenate. - */ - friend CString operator +(char ch, const CString & s2); + */ + friend CString IRA::operator +(const CString& s1,const CString & s2); /** * Friend operator, used to concatenate. */ - friend CString operator +(const char *str, const CString & s2); + friend CString IRA::operator +(const CString & s1, char ch); /** - * Operator used to concatenate the string with another one. - */ - const CString & operator +=(const CString & src); + * Friend operator, used to concatenate. + */ + friend CString IRA::operator +(const CString & s1, const char *str); /** - * Operator used to concatenate the string with another one. + * Friend operator, used to concatenate. */ - const CString & operator +=(char ch); + friend CString IRA::operator +(char ch, const CString & s2); /** - * Operator used to concatenate the string with another one. + * Friend operator, used to concatenate. */ - const CString & operator +=(const char *str); + friend CString IRA::operator +(const char *str, const CString & s2); + // compare /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator ==(const CString & s1, const CString & s2); + friend bool IRA::operator ==(const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator ==(const CString & s1, const char *s2); + friend bool IRA::operator ==(const CString & s1, const char *s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator ==(const char *s1, const CString & s2); + friend bool IRA::operator ==(const char *s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator !=(const CString & s1, const CString & s2); + friend bool IRA::operator !=(const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator !=(const CString & s1, const char *s2); + friend bool IRA::operator !=(const CString & s1, const char *s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator !=(const char *s1, const CString & s2); + friend bool IRA::operator !=(const char *s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator < (const CString & s1, const CString & s2); + friend bool IRA::operator < (const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator < (const CString & s1, const char *s2); + friend bool IRA::operator < (const CString & s1, const char *s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator < (const char *s1, const CString & s2); + friend bool IRA::operator < (const char *s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator > (const CString & s1, const CString & s2); + friend bool IRA::operator > (const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator > (const CString & s1, const char *s2); + friend bool IRA::operator > (const CString & s1, const char *s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator > (const char *s1, const CString & s2); + friend bool IRA::operator > (const char *s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator <=(const CString & s1, const CString & s2); + friend bool IRA::operator <=(const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ friend bool operator <=(const CString & s1, const char *s2); /** - * Frind operator used to compare strings - */ - friend bool operator <=(const char *s1, const CString & s2); - /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator >=(const CString & s1, const CString & s2); + friend bool IRA::operator <=(const char *s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator >=(const CString & s1, const char *s2); + friend bool IRA::operator >=(const CString & s1, const CString & s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ - friend bool operator >=(const char *s1, const CString & s2); + friend bool IRA::operator >=(const CString & s1, const char *s2); /** - * Frind operator used to compare strings + * Friend operator used to compare strings */ + friend bool IRA::operator >=(const char *s1, const CString & s2); protected: int m_iSize; char *m_cpString; diff --git a/Common/Libraries/IRALibrary/include/TimeTaggedCircularArray.h b/Common/Libraries/IRALibrary/include/TimeTaggedCircularArray.h index fa1fd0f00..81526d522 100644 --- a/Common/Libraries/IRALibrary/include/TimeTaggedCircularArray.h +++ b/Common/Libraries/IRALibrary/include/TimeTaggedCircularArray.h @@ -14,7 +14,15 @@ /* Andrea Orlati(aorlati@ira.inaf.it) 08/09/2010 added the averagePoint method */ /* G. Carboni(giuseppe.carboni@inaf.it) 26/07/2019 the class is now thread safe */ + +#include + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include "Definitions.h" namespace IRA { diff --git a/Common/Libraries/IRALibrary/include/TimeoutSync.h b/Common/Libraries/IRALibrary/include/TimeoutSync.h index d7196ab84..ecf76735b 100644 --- a/Common/Libraries/IRALibrary/include/TimeoutSync.h +++ b/Common/Libraries/IRALibrary/include/TimeoutSync.h @@ -10,8 +10,13 @@ /* Who when What */ /* Andrea Orlati(aorlati@ira.inaf.it) 05/1/2010 Creation */ - +#include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +C11_IGNORE_WARNING_POP #include "Definitions.h" namespace IRA { diff --git a/Common/Libraries/IRALibrary/src/Lecom.cpp b/Common/Libraries/IRALibrary/src/Lecom.cpp index 11bcc0d7a..53cf86b31 100644 --- a/Common/Libraries/IRALibrary/src/Lecom.cpp +++ b/Common/Libraries/IRALibrary/src/Lecom.cpp @@ -255,7 +255,7 @@ double CLecom::Answer(WORD Code,BYTE SubCode,CError& Err) bool Sync=false; double Val; sprintf((char *)(C),"%04X",Code); - sprintf((char *)(C+4),"%02X",SubCode); + sprintf((char *)(C+4),"%c",SubCode); while (!Ok) { if ((Rx(&m_ucBuffer[BytesRead],1,Err))>0) { if (!Err.isNoError()) { diff --git a/Common/Libraries/IRALibrary/src/Makefile b/Common/Libraries/IRALibrary/src/Makefile index 3fe0a2e34..8c9fa9012 100644 --- a/Common/Libraries/IRALibrary/src/Makefile +++ b/Common/Libraries/IRALibrary/src/Makefile @@ -36,7 +36,7 @@ USER_CFLAGS = INCLUDES = Definitions.h String.h IRATools.h Error.h SecureArea.h SerialPort.h Lecom.h FastQueue.h\ Socket.h DataField.h DBTable.h LogFilter.h Site.h DateTime.h Timer.h SkySource.h TimeTaggedCircularArray.h \ ScheduleTimer.h TimeoutSync.h MicroControllerBoard.h ReceiverControl.h MicroControllerBoardDef.h \ - SourceFlux.h CustomLoggerUtils.h LogDike.h FrequencyTracking.h BaseConverter.h IRA + SourceFlux.h CustomLoggerUtils.h LogDike.h FrequencyTracking.h BaseConverter.h Cplusplus11Helper.h IRA # # Libraries (public and local) diff --git a/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp b/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp index 3b32db1ba..e74c82817 100644 --- a/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp +++ b/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp @@ -5,7 +5,7 @@ using namespace IRA; MicroControllerBoard::MicroControllerBoard( const std::string IP, const unsigned short port, const BYTE master_address, const BYTE slave_address, - const DWORD timeout) throw (MicroControllerBoardEx) : + const DWORD timeout) : m_IP(IP), m_port(port), m_timeout(timeout), m_master_address(master_address), m_slave_address(slave_address), m_socket(NULL), m_id(0), m_command_type(0x00) @@ -30,7 +30,7 @@ MicroControllerBoard::~MicroControllerBoard() { } -void MicroControllerBoard::openConnection(void) throw (MicroControllerBoardEx) { +void MicroControllerBoard::openConnection(void) { if (m_socket->Connect(m_Error, m_IP.c_str(), m_port) == CSocket::FAIL) { closeConnection(); @@ -59,7 +59,7 @@ void MicroControllerBoard::closeConnection(void) { pthread_mutex_unlock(&m_socket_mutex); } -std::vector MicroControllerBoard::receive(void) throw (MicroControllerBoardEx) { +std::vector MicroControllerBoard::receive(void) { pthread_mutex_lock(&m_socket_mutex); BYTE msg[MCB_BUFF_LIMIT] = {0x00}; bool is_short_cmd = false, has_data_cmd = false; @@ -230,7 +230,7 @@ std::vector MicroControllerBoard::receive(void) throw (MicroControllerBoar return(clean_data); // Return just the answer parameters } -void MicroControllerBoard::send(const BYTE command, std::vector parameters) throw (MicroControllerBoardEx) { +void MicroControllerBoard::send(const BYTE command, std::vector parameters) { pthread_mutex_lock(&m_socket_mutex); try { if(command >= MCB_CMD_TYPE_MIN_EXT && command <= MCB_CMD_TYPE_MAX_ABB) { @@ -284,7 +284,7 @@ void MicroControllerBoard::send(const BYTE command, std::vector parameters } -BYTE MicroControllerBoard::computeChecksum(std::vector message) throw (MicroControllerBoardEx) { +BYTE MicroControllerBoard::computeChecksum(std::vector message) { if(message.empty()) throw MicroControllerBoardEx("Checksum error: no bytes to check"); diff --git a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp index 7fdb9575f..b08ae03ab 100644 --- a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp +++ b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp @@ -28,7 +28,7 @@ ReceiverControl::ReceiverControl( const BYTE switch_madd, const BYTE switch_sadd, bool reliable_comm -) throw (ReceiverControlEx) : +): m_dewar_ip(dewar_ip), m_dewar_port(dewar_port), m_lna_ip(lna_ip), @@ -76,7 +76,7 @@ void ReceiverControl::setCalibrationOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -101,7 +101,7 @@ void ReceiverControl::setCalibrationOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -125,7 +125,7 @@ bool ReceiverControl::isCalibrationOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -155,7 +155,7 @@ void ReceiverControl::setExtCalibrationOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -180,7 +180,7 @@ void ReceiverControl::setExtCalibrationOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -204,7 +204,7 @@ bool ReceiverControl::isExtCalibrationOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -235,7 +235,7 @@ double ReceiverControl::vacuum( const BYTE port_type, const BYTE port_number, const size_t raw_index - ) throw (ReceiverControlEx) + ) { try { @@ -265,7 +265,7 @@ double ReceiverControl::vertexTemperature( const BYTE port_type, const BYTE port_number, const size_t raw_index - ) throw (ReceiverControlEx) + ) { try { @@ -295,7 +295,7 @@ double ReceiverControl::cryoTemperature( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { const size_t raw_index = temperature_id; @@ -333,7 +333,7 @@ void ReceiverControl::setCoolHeadOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -358,7 +358,7 @@ void ReceiverControl::setCoolHeadOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -382,7 +382,7 @@ bool ReceiverControl::isCoolHeadSetOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -411,7 +411,7 @@ bool ReceiverControl::isCoolHeadOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -441,7 +441,7 @@ void ReceiverControl::setVacuumSensorOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -466,7 +466,7 @@ void ReceiverControl::setVacuumSensorOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -490,7 +490,7 @@ bool ReceiverControl::isVacuumSensorOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -520,7 +520,7 @@ void ReceiverControl::setVacuumPumpOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -545,7 +545,7 @@ void ReceiverControl::setVacuumPumpOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -569,7 +569,7 @@ bool ReceiverControl::isVacuumPumpOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -598,7 +598,7 @@ bool ReceiverControl::hasVacuumPumpFault( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -628,7 +628,7 @@ void ReceiverControl::setVacuumValveOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -653,7 +653,7 @@ void ReceiverControl::setVacuumValveOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -677,7 +677,7 @@ bool ReceiverControl::isVacuumValveOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -706,7 +706,7 @@ bool ReceiverControl::isRemoteOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -736,7 +736,7 @@ void ReceiverControl::selectLO1( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -760,7 +760,7 @@ bool ReceiverControl::isLO1Selected( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -790,7 +790,7 @@ void ReceiverControl::selectLO2( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -814,7 +814,7 @@ bool ReceiverControl::isLO2Selected( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -843,7 +843,7 @@ bool ReceiverControl::isLO2Locked( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -875,7 +875,7 @@ void ReceiverControl::setSingleDishMode( const BYTE port_number_vlbi, const BYTE value_sd, const BYTE value_vlbi - ) throw (ReceiverControlEx) + ) { try { pthread_mutex_lock(&m_dewar_mutex); @@ -943,7 +943,7 @@ bool ReceiverControl::isSingleDishModeOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -975,7 +975,7 @@ void ReceiverControl::setVLBIMode( const BYTE port_number_sd, const BYTE value_vlbi, const BYTE value_sd - ) throw (ReceiverControlEx) + ) { try { pthread_mutex_lock(&m_dewar_mutex); @@ -1042,7 +1042,7 @@ bool ReceiverControl::isVLBIModeOn( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { std::vector parameters = makeRequest( @@ -1067,7 +1067,7 @@ bool ReceiverControl::isVLBIModeOn( } -void ReceiverControl::openConnection(void) throw (ReceiverControlEx) +void ReceiverControl::openConnection(void) { try { m_dewar_board_ptr = new MicroControllerBoard(m_dewar_ip, m_dewar_port, m_dewar_madd, m_dewar_sadd); @@ -1139,7 +1139,7 @@ ReceiverControl::FetValues ReceiverControl::fetValues( unsigned short stage_number, double (*currentConverter)(double voltage), double (*voltageConverter)(double voltage) - ) throw (ReceiverControlEx) + ) { std::string column_selector; // EN03: the signal that addresses the column multiplexing of AD24 std::string vd_selector; // A03: it allows to select the value requested for a given stadium @@ -1363,7 +1363,7 @@ ReceiverControl::StageValues ReceiverControl::stageValues( FetValue quantity, unsigned short stage_number, double (*converter)(double voltage) - ) throw (ReceiverControlEx) + ) { IRA::CString quant; // Each item is a EN03 value: the signal that addresses the column multiplexing of AD24 @@ -1547,7 +1547,7 @@ void ReceiverControl::turnLeftLNAsOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -1572,7 +1572,7 @@ void ReceiverControl::turnLeftLNAsOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -1597,7 +1597,7 @@ void ReceiverControl::turnRightLNAsOn( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -1622,7 +1622,7 @@ void ReceiverControl::turnRightLNAsOff( const BYTE port_type, const BYTE port_number, const BYTE value - ) throw (ReceiverControlEx) + ) { try { makeRequest( @@ -1647,7 +1647,7 @@ void ReceiverControl::setPath( const BYTE port_number, const size_t width, const std::vector parameters - ) throw (ReceiverControlEx) + ) { if(parameters.size() % width != 0) throw ReceiverControlEx("ReceiverControl: wrong number of parameters.\n"); @@ -1686,7 +1686,7 @@ void ReceiverControl::setColdLoadPath( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { const BYTE two_high_bits = 0x03; // Binary value 11 @@ -1748,7 +1748,7 @@ void ReceiverControl::setSkyPath( const BYTE data_type, const BYTE port_type, const BYTE port_number - ) throw (ReceiverControlEx) + ) { try { const BYTE two_high_bits = 0x03; // Binary value 11 @@ -1804,9 +1804,7 @@ void ReceiverControl::setSkyPath( } - std::vector ReceiverControl::makeRequest(MicroControllerBoard *board_ptr, BYTE command, size_t len, ...) - throw (MicroControllerBoardEx) { pthread_mutex_lock(&m_request_mutex); va_list parameters; // A place to store the list of arguments diff --git a/Common/Libraries/IRALibrary/src/SourceFlux.cpp b/Common/Libraries/IRALibrary/src/SourceFlux.cpp index 0eb569b69..04bec2a44 100644 --- a/Common/Libraries/IRALibrary/src/SourceFlux.cpp +++ b/Common/Libraries/IRALibrary/src/SourceFlux.cpp @@ -31,7 +31,7 @@ double CSourceFlux::computeSourceFlux(const double&frequency, const double& FWHM { double logfreq,logflux,fluxv; double fac0,fac1,fac2,fac4,fac5,fac; - double corr, size; + double corr; double fMin=0.0, fMax=0.0; double fMinRange[3], fMaxRange[3]; double fluxCoeff1[3], fluxCoeff2[3], fluxCoeff3[3]; @@ -39,7 +39,6 @@ double CSourceFlux::computeSourceFlux(const double&frequency, const double& FWHM fluxv=1.0; corr=1.0; - size=0.0; if (m_flux.nFreqRange == 1) { sscanf(m_flux.freqRange,"%lf-%lf",&fMinRange[0],&fMaxRange[0]); diff --git a/Common/Libraries/IRALibrary/src/String.cpp b/Common/Libraries/IRALibrary/src/String.cpp index 62bf246ca..23bf77921 100644 --- a/Common/Libraries/IRALibrary/src/String.cpp +++ b/Common/Libraries/IRALibrary/src/String.cpp @@ -544,27 +544,27 @@ bool CString::CheckIsValidLongLong() const bool CString::CheckIsValidFloat() const { - char *endptr; - float val; - if (IsEmpty()) return false; - errno=0; - val = strtof(m_cpString,&endptr); - if (errno==ERANGE) { - return false; - } - if (endptr==m_cpString) { - return false; - } - return true; + char *endptr; + //float val; + if (IsEmpty()) return false; + errno=0; + /*val = */strtof(m_cpString,&endptr); + if (errno==ERANGE) { + return false; + } + if (endptr==m_cpString) { + return false; + } + return true; } bool CString::CheckIsValidDouble() const { char *endptr; - double val; + //double val; if (IsEmpty()) return false; errno=0; - val = strtod(m_cpString,&endptr); + /*val = */strtod(m_cpString,&endptr); if (errno==ERANGE) { return false; } @@ -577,10 +577,10 @@ bool CString::CheckIsValidDouble() const bool CString::CheckIsValidLongDouble() const { char *endptr; - long double val; + //long double val; if (IsEmpty()) return false; errno=0; - val = strtold(m_cpString,&endptr); + /*val = */strtold(m_cpString,&endptr); if (errno==ERANGE) { return false; } diff --git a/Common/Libraries/IRALibrary/src/TimeTaggedCircularArray.cpp b/Common/Libraries/IRALibrary/src/TimeTaggedCircularArray.cpp index e8dd6518b..985a5241f 100644 --- a/Common/Libraries/IRALibrary/src/TimeTaggedCircularArray.cpp +++ b/Common/Libraries/IRALibrary/src/TimeTaggedCircularArray.cpp @@ -15,7 +15,8 @@ CTimeTaggedCircularArray::CTimeTaggedCircularArray(const unsigned& positions, m_array=new TArrayRecord[m_size]; m_lastAzimuth=m_lastElevation=0.0; m_isRad=isRadians; - m_lastTime.value().value=0; + //m_lastTime.value().value=0; + m_lastTime.value((ACS::Time)0); } CTimeTaggedCircularArray::~CTimeTaggedCircularArray() diff --git a/Common/Libraries/ParserLibrary/include/SP_function0.h b/Common/Libraries/ParserLibrary/include/SP_function0.h index 99e727f55..4929c19a5 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function0.h +++ b/Common/Libraries/ParserLibrary/include/SP_function0.h @@ -24,11 +24,16 @@ public: typedef typename conditional::type func_type; function0(OBJ *object, func_type func) : _SP_FUNCTOR(object,0), m_func(func) {}; - return_type operator()() const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()() const { return (*_SP_FUNCTOR::m_obj.*m_func)( ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { retVal=(*_SP_FUNCTOR::m_obj.*m_func)(); //can throw a generic exception } WORD get(IRA::CString *params) { @@ -50,11 +55,16 @@ public: typedef typename conditional::type func_type; function0(OBJ *object, func_type func) : _SP_FUNCTOR(object,0), m_func(func) { }; - void operator()() const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()() const { (*_SP_FUNCTOR::m_obj.*m_func)(); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { (*_SP_FUNCTOR::m_obj.*m_func)(); //can throw a generic exception } WORD get(IRA::CString *params) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function1.h b/Common/Libraries/ParserLibrary/include/SP_function1.h index 18d1024b9..2238f026b 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function1.h +++ b/Common/Libraries/ParserLibrary/include/SP_function1.h @@ -26,11 +26,16 @@ public: typedef typename conditional::type func_type; function1(OBJ *object, func_type func) : _SP_FUNCTOR(object,1),m_func(func) {}; - return_type operator()(arg0& pp0) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -76,11 +81,16 @@ public: typedef typename conditional::type func_type; function1(OBJ *object, func_type func) : _SP_FUNCTOR(object,1),m_func(func) {}; - void operator()(arg0& pp0) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function2.h b/Common/Libraries/ParserLibrary/include/SP_function2.h index 9f7e5b804..230045bc5 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function2.h +++ b/Common/Libraries/ParserLibrary/include/SP_function2.h @@ -28,11 +28,16 @@ public: typedef typename conditional::type func_type; function2(OBJ *object, func_type func) : _SP_FUNCTOR(object,2),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -91,11 +96,16 @@ public: typedef typename conditional::type func_type; function2(OBJ *object, func_type func) : _SP_FUNCTOR(object,2),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function3.h b/Common/Libraries/ParserLibrary/include/SP_function3.h index c6811c3e0..f407201c5 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function3.h +++ b/Common/Libraries/ParserLibrary/include/SP_function3.h @@ -30,11 +30,16 @@ public: typedef typename conditional::type func_type; function3(OBJ *object, func_type func) : _SP_FUNCTOR(object,3),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -106,11 +111,16 @@ public: typedef typename conditional::type func_type; function3(OBJ *object, func_type func) : _SP_FUNCTOR(object,3),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1,arg2& pp2) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1,arg2& pp2) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function4.h b/Common/Libraries/ParserLibrary/include/SP_function4.h index 6fa382c8b..c0d319aa0 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function4.h +++ b/Common/Libraries/ParserLibrary/include/SP_function4.h @@ -32,11 +32,16 @@ public: typedef typename conditional::type func_type; function4(OBJ *object, func_type func) : _SP_FUNCTOR(object,4),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -121,11 +126,16 @@ public: typedef return_type (OBJ::*const_func_type)(param0,param1,param2,param3) const; typedef typename conditional::type func_type; function4(OBJ *object, func_type func) : _SP_FUNCTOR(object,4),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3 ); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function5.h b/Common/Libraries/ParserLibrary/include/SP_function5.h index 7cc58f520..5e24ba1b3 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function5.h +++ b/Common/Libraries/ParserLibrary/include/SP_function5.h @@ -35,11 +35,16 @@ public: typedef typename conditional::type func_type; function5(OBJ *object, func_type func) : _SP_FUNCTOR(object,5),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -139,11 +144,16 @@ public: typedef typename conditional::type func_type; function5(OBJ *object, func_type func) : _SP_FUNCTOR(object,5),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function6.h b/Common/Libraries/ParserLibrary/include/SP_function6.h index ecf259ce3..a271088b1 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function6.h +++ b/Common/Libraries/ParserLibrary/include/SP_function6.h @@ -37,11 +37,16 @@ public: typedef typename conditional::type func_type; function6(OBJ *object, func_type func) : _SP_FUNCTOR(object,6),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4,pp5); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -153,11 +158,16 @@ public: typedef return_type (OBJ::*const_func_type)(param0,param1,param2,param3,param4,param5) const; typedef typename conditional::type func_type; function6(OBJ *object, func_type func) : _SP_FUNCTOR(object,6),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4,pp5); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw ( - ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_function7.h b/Common/Libraries/ParserLibrary/include/SP_function7.h index f99db27b9..60b5b11f4 100644 --- a/Common/Libraries/ParserLibrary/include/SP_function7.h +++ b/Common/Libraries/ParserLibrary/include/SP_function7.h @@ -40,10 +40,16 @@ public: typedef typename conditional::type func_type; function7(OBJ *object, func_type func) : _SP_FUNCTOR(object,7),m_func(func) {}; - return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5,arg6& pp6) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + return_type operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5,arg6& pp6) const { return (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4,pp5,pp6); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw (ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { @@ -169,10 +175,16 @@ public: typedef typename conditional::type func_type; function7(OBJ *object, func_type func) : _SP_FUNCTOR(object,7),m_func(func) {}; - void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5,arg6& pp6) const throw (ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl) + */ + void operator()(arg0& pp0,arg1& pp1,arg2& pp2,arg3& pp3,arg4& pp4,arg5& pp5,arg6& pp6) const { (*_SP_FUNCTOR::m_obj.*m_func)( pp0,pp1,pp2,pp3,pp4,pp5,pp6); //can throw a generic exception } - void call(IRA::CString *params,const WORD& parLen) throw (ParserErrors::ConversionErrorExImpl,ACSErr::ACSbaseExImpl) { + /* + * @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) + */ + void call(IRA::CString *params,const WORD& parLen) { WORD pCount=0; try { if (A0::isInput) { diff --git a/Common/Libraries/ParserLibrary/include/SP_parser.h b/Common/Libraries/ParserLibrary/include/SP_parser.h index 4896211ca..de7edd0b5 100644 --- a/Common/Libraries/ParserLibrary/include/SP_parser.h +++ b/Common/Libraries/ParserLibrary/include/SP_parser.h @@ -104,8 +104,9 @@ namespace SimpleParser { /** * Prototype of a remote function, it will accept the full command, the extra parameter and the name of the package. * It could throw a remote package error + * @throw throw (ParserErrors::PackageErrorExImpl) */ -#define _SP_REMOTECALL(X) bool (OBJ::*X)(const IRA::CString& command,const IRA::CString& package,const long& param,IRA::CString& out) throw (ParserErrors::PackageErrorExImpl) +#define _SP_REMOTECALL(X) bool (OBJ::*X)(const IRA::CString& command,const IRA::CString& package,const long& param,IRA::CString& out) /** * Prototype of the callback function, invoked when a injected procedure has completed. If accepts the name of the procedure and the execution result */ @@ -342,7 +343,7 @@ public: * @param command string that stores the command to be executed. * @param out the result of the requested command */ - void run(const IRA::CString& command,IRA::CString& out) throw (ParserErrors::ParserErrorsExImpl,ACSErr::ACSbaseExImpl); + void run(const IRA::CString& command,IRA::CString& out); /** * This function parses and executes a command asynchronously independently if the command is a simple procedure, a simple command with or without the time mark character. @@ -352,7 +353,7 @@ public: * @param callBack callback function to be invoked as soon as the operation completes * @param callBackParam parameter to passed to the callback function as argument */ - void runAsync(const IRA::CString& command,_SP_CALLBACK(callBack),const void * callBackParam) throw (ParserErrors::ParserErrorsExImpl); + void runAsync(const IRA::CString& command,_SP_CALLBACK(callBack),const void * callBackParam); /** * Call in order to know the command delimiter char that the parser is using @@ -487,10 +488,7 @@ private: * @return the output of the command, if more than one value has to be returned (for example in case of more than one output * arguments), the list is separated by the answerDelimiter. In case of exception the value is not meaningful. */ - IRA::CString executeCommand(const IRA::CString& command,IRA::CString& instr) throw (ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl, - ParserErrors::NotEnoughParametersExImpl,ParserErrors::SystemCommandErrorExImpl,ParserErrors::ProcedureErrorExImpl,ParserErrors::TimeFormatErrorExImpl,ParserErrors::ParserTimerErrorExImpl, - ParserErrors::NotSupportedErrorExImpl,ParserErrors::TooManyParametersExImpl,ParserErrors::ConversionErrorExImpl,ParserErrors::PackageErrorExImpl,ParserErrors::RemoteCommandErrorExImpl, - ACSErr::ACSbaseExImpl); + IRA::CString executeCommand(const IRA::CString& command,IRA::CString& instr); /** * Format an output string that summarizes the time based commands that are in the execution queue. @@ -555,10 +553,7 @@ private: * @param execInterval execution interval * @return the pointer to the element that defines the command */ - TRule *checkCommand(const IRA::CString& line,IRA::CString& instr, IRA::CString* inParams,WORD& parNum,bool& timeTagged,IRA::CString& timeCommand,ACS::Time& execTime,ACS::TimeInterval& execInterval) throw ( - ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl,ParserErrors::NotEnoughParametersExImpl,ParserErrors::TimeFormatErrorExImpl,ParserErrors::NotSupportedErrorExImpl, - ParserErrors::TooManyParametersExImpl); - + TRule *checkCommand(const IRA::CString& line,IRA::CString& instr, IRA::CString* inParams,WORD& parNum,bool& timeTagged,IRA::CString& timeCommand,ACS::Time& execTime,ACS::TimeInterval& execInterval); /** * This function searches the execution rules to find if a command has been defined. * @param instr name of the command to look for. @@ -585,8 +580,7 @@ private: * @param procPrm list of procedure parameters * @param parNumber number of parameters of the procedure */ - void pushProcedure(const IRA::CString& name,const ACS::stringSeq& procedure,IRA::CString *procPrm=NULL,WORD& parNumber=0,_SP_CALLBACK(callBack)=NULL,const void* parameter=NULL) throw ( - ParserErrors::ProcedureErrorExImpl); + void pushProcedure(const IRA::CString& name,const ACS::stringSeq& procedure,IRA::CString *procPrm=NULL,WORD& parNumber=0,_SP_CALLBACK(callBack)=NULL,const void* parameter=NULL); /** * Pop a command form the begging of the command list diff --git a/Common/Libraries/ParserLibrary/include/SP_parser.i b/Common/Libraries/ParserLibrary/include/SP_parser.i index fc230f015..cddaf919a 100644 --- a/Common/Libraries/ParserLibrary/include/SP_parser.i +++ b/Common/Libraries/ParserLibrary/include/SP_parser.i @@ -2,8 +2,11 @@ #define TIMERIDENTIFIER '!' #define PROCEDUREPARAMETER '$' +/* +* @throw (ACSErr::ACSbaseExImpl, ParserErrors::ConversionErrorExImpl) +*/ template -void CParser::run(const IRA::CString& command,IRA::CString& out) throw (ParserErrors::ParserErrorsExImpl,ACSErr::ACSbaseExImpl) +void CParser::run(const IRA::CString& command,IRA::CString& out) { IRA::CString instr; if ((command=="") || (command=="\n")) { @@ -33,8 +36,11 @@ void CParser::run(const IRA::CString& command,IRA::CString& out) throw (Pa } } +/* +* @throw (ParserErrors::ConversionErrorExImpl) +*/ template -void CParser::runAsync(const IRA::CString& command,_SP_CALLBACK(callBack),const void * callBackParam) throw (ParserErrors::ParserErrorsExImpl) +void CParser::runAsync(const IRA::CString& command,_SP_CALLBACK(callBack),const void * callBackParam) { TRule *elem; bool timeTagged; @@ -53,10 +59,16 @@ void CParser::runAsync(const IRA::CString& command,_SP_CALLBACK(callBack),c } } +/* +* @throw ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl, +* ParserErrors::NotEnoughParametersExImpl,ParserErrors::SystemCommandErrorExImpl, +* ParserErrors::ProcedureErrorExImpl,ParserErrors::TimeFormatErrorExImpl, +* ParserErrors::ParserTimerErrorExImpl,ParserErrors::NotSupportedErrorExImpl, +* ParserErrors::TooManyParametersExImpl,ParserErrors::ConversionErrorExImpl, +* ParserErrors::PackageErrorExImpl,ParserErrors::RemoteCommandErrorExImpl,ACSErr::ACSbaseExImpl) +*/ template -IRA::CString CParser::executeCommand(const IRA::CString& command,IRA::CString& instr) throw (ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl, - ParserErrors::NotEnoughParametersExImpl,ParserErrors::SystemCommandErrorExImpl,ParserErrors::ProcedureErrorExImpl,ParserErrors::TimeFormatErrorExImpl,ParserErrors::ParserTimerErrorExImpl, - ParserErrors::NotSupportedErrorExImpl,ParserErrors::TooManyParametersExImpl,ParserErrors::ConversionErrorExImpl,ParserErrors::PackageErrorExImpl,ParserErrors::RemoteCommandErrorExImpl,ACSErr::ACSbaseExImpl) +IRA::CString CParser::executeCommand(const IRA::CString& command,IRA::CString& instr) { TRule *elem; WORD outNumber; @@ -212,10 +224,14 @@ IRA::CString CParser::executeCommand(const IRA::CString& command,IRA::CStri } } +/* +* @throw ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl, +* ParserErrors::NotEnoughParametersExImpl,ParserErrors::TimeFormatErrorExImpl, +* ParserErrors::NotSupportedErrorExImpl,ParserErrors::TooManyParametersExImpl) +*/ template typename CParser::TRule *CParser::checkCommand(const IRA::CString& line,IRA::CString& instr,IRA::CString* inParams,WORD& parNum,bool& timeTagged,IRA::CString& timeCommand,ACS::Time& execTime, - ACS::TimeInterval& execInterval) throw (ParserErrors::SyntaxErrorExImpl,ParserErrors::CommandNotFoundExImpl,ParserErrors::NotEnoughParametersExImpl,ParserErrors::TimeFormatErrorExImpl, - ParserErrors::NotSupportedErrorExImpl,ParserErrors::TooManyParametersExImpl) + ACS::TimeInterval& execInterval) { IRA::CString timeMark; TRule *elem; @@ -352,9 +368,12 @@ void CParser::timerCleanup(const void * par) } } +/* +* @throw ParserErrors::ProcedureErrorExImpl +*/ template void CParser::pushProcedure(const IRA::CString& name,const ACS::stringSeq& procedure,IRA::CString *procPrm,WORD& parNumber, - _SP_CALLBACK(callBack),const void* parameter) throw (ParserErrors::ProcedureErrorExImpl) + _SP_CALLBACK(callBack),const void* parameter) { TRule *elem; IRA::CString instr; diff --git a/Common/Libraries/ParserLibrary/include/SP_typeConversion.h b/Common/Libraries/ParserLibrary/include/SP_typeConversion.h index 822347d11..bddba983c 100644 --- a/Common/Libraries/ParserLibrary/include/SP_typeConversion.h +++ b/Common/Libraries/ParserLibrary/include/SP_typeConversion.h @@ -27,7 +27,10 @@ enum _sp_symbols { class int_converter { public: - int strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + int strToVal(const char * str) { int ret; if (sscanf(str,"%d",&ret)!=1) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"int_converter::strToVal()"); @@ -55,7 +58,10 @@ public: class long_converter { public: - long strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + long strToVal(const char * str) { long ret; if (sscanf(str,"%ld",&ret)!=1) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"long_converter::strToVal()"); @@ -76,7 +82,10 @@ public: class double_converter { public: - double strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char * str) { double ret; if (sscanf(str,"%lf",&ret)!=1) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"double_converter::strToVal()"); @@ -97,7 +106,10 @@ public: class string_converter { public: - char *strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + char *strToVal(const char * str) { return const_cast(str) ; } char *valToStr(char * const & val) { @@ -110,7 +122,10 @@ public: class longString_converter { public: - IRA::CString strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + IRA::CString strToVal(const char * str) { return IRA::CString(str); } char *valToStr(const IRA::CString& val) { @@ -133,7 +148,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::angleToRad(str,radians)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"angle_converter::strToVal()"); @@ -157,7 +175,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::offsetToRad(str,radians)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"angleOffset_converter::strToVal()"); @@ -181,7 +202,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::declinationToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"declination_converter::strToVal()"); @@ -205,7 +229,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::rightAscensionToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"rightAscension_type::strToVal()"); @@ -229,7 +256,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::azimuthToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"azimuth_converter::strToVal()"); @@ -253,7 +283,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::elevationToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"elevation_converter::strToVal()"); @@ -277,7 +310,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::galLatitudeToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"galacticLatitude_converter::strToVal()"); @@ -301,7 +337,10 @@ public: strcpy(c,(const char *)out); return c; } - double strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + double strToVal(const char*str) { double radians; if (!IRA::CIRATools::galLongitudeToRad(str,radians,RANGECHECK)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"galacticLongitude_converter::strToVal()"); @@ -322,7 +361,10 @@ public: strcpy(c,(const char *)out); return c; } - ACS::Time strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + ACS::Time strToVal(const char*str) { ACS::Time ret; if (!IRA::CIRATools::strToTime(str,ret)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"time_converter::strToVal()"); @@ -342,7 +384,10 @@ public: strcpy(c,(const char *)out); return c; } - ACS::TimeInterval strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + ACS::TimeInterval strToVal(const char*str) { ACS::TimeInterval ret; if (!IRA::CIRATools::strToInterval(str,ret)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"interval_converter::strToVal()"); @@ -370,7 +415,10 @@ public: strcpy(c,tmp); return c; } - ACS::longSeq strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + ACS::longSeq strToVal(const char*str) { ACS::longSeq out; IRA::CString param(str); IRA::CString ret; @@ -429,7 +477,10 @@ public: strcpy(c,tmp); return c; } - ACS::doubleSeq strToVal(const char*str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + ACS::doubleSeq strToVal(const char*str) { ACS::doubleSeq out; IRA::CString param(str); IRA::CString ret; @@ -485,7 +536,10 @@ public: } return c; } - Antenna::TSections strToVal(const char* str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + Antenna::TSections strToVal(const char* str) { IRA::CString strVal(str); strVal.MakeUpper(); if (strVal=="CW") { @@ -516,7 +570,10 @@ public: strcpy(c,(const char *)out); return c; } - Antenna::TSystemEquinox strToVal(const char* str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + Antenna::TSystemEquinox strToVal(const char* str) { Antenna::TSystemEquinox eq; if (!IRA::CIRATools::strToEquinox(str,eq)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"AntennaEquinox2String::strToVal()"); @@ -537,7 +594,10 @@ public: strcpy(c,(const char *)out); return c; } - Antenna::TCoordinateFrame strToVal(const char* str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + Antenna::TCoordinateFrame strToVal(const char* str) { Antenna::TCoordinateFrame frame; if (!IRA::CIRATools::strToCoordinateFrame(str,frame)) { _EXCPT(ParserErrors::BadTypeFormatExImpl,ex,"AntennaFrame2String::strToVal()"); diff --git a/Common/Libraries/ParserLibrary/include/SP_types.h b/Common/Libraries/ParserLibrary/include/SP_types.h index af1269ccc..9b7e5e35a 100644 --- a/Common/Libraries/ParserLibrary/include/SP_types.h +++ b/Common/Libraries/ParserLibrary/include/SP_types.h @@ -14,14 +14,22 @@ #ifndef _SP_TYPES_H_ #define _SP_TYPES_H_ +#include + #include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") #include +#include +#include +C11_IGNORE_WARNING_POP #include #include #include #include -#include -#include + #include "SP_typeConversion.h" #define _SP_JOLLYCHARACTER '*' @@ -75,7 +83,10 @@ public: m_val=bt.m_val; } basic_type(const T& val): m_strVal(NULL ) { m_strVal=m_conv.valToStr(val); m_val=val; } - basic_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl): m_strVal(NULL) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + basic_type(const char *str) : m_strVal(NULL) { clone(str); try { convert(); // check the string contains proper value @@ -111,7 +122,7 @@ public: * Initializes the type starting from a string. * @throw ParserErrors::BadTypeFormatExImpl if the string cannot be converted into the specific type (@sa strToVal() */ - virtual const basic_type& operator =(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + virtual const basic_type& operator =(const char * str) { clone(str); convert(); return *this; @@ -143,7 +154,10 @@ protected: strcpy(m_strVal,src); } private: - void convert() throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + void convert() { char *str=WILDCARD::replace(m_strVal); try { m_val=m_conv.strToVal(str); @@ -188,7 +202,10 @@ public: string_type::clone(bt.m_val); return *this; } - virtual const string_type& operator =(const char* str) throw (ParserErrors::BadTypeFormatExImpl) { + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + virtual const string_type& operator =(const char* str) { string_type::clone(str); return *this; } @@ -231,7 +248,10 @@ public: enum_type() : basic_type() {} enum_type(const enum_type& bt): basic_type(bt) { } enum_type(const ENUM& val): basic_type(val) {} - enum_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + enum_type(const char *str) : basic_type(str) {} virtual ~enum_type() { } using basic_type::operator =; }; @@ -245,7 +265,10 @@ public: angle_type() : basic_type, WILDCARD>() {} angle_type(const angle_type& bt): basic_type, WILDCARD>(bt) { } angle_type(const double& val): basic_type, WILDCARD>(val) {} - angle_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type, WILDCARD>(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + angle_type(const char *str) : basic_type, WILDCARD>(str) {} virtual ~angle_type() { } using basic_type,WILDCARD>::operator =; }; @@ -259,7 +282,10 @@ public: angleOffset_type() : basic_type,WILDCARD>() {} angleOffset_type(const angleOffset_type& bt): basic_type,WILDCARD>(bt) { } angleOffset_type(const double& val): basic_type,WILDCARD>(val) {} - angleOffset_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type,WILDCARD>(str) { } + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + angleOffset_type(const char *str) : basic_type,WILDCARD>(str) { } virtual ~angleOffset_type() { } using basic_type,WILDCARD>::operator =; }; @@ -275,7 +301,10 @@ public: declination_type() : basic_type, WILDCARD>() {} declination_type(const declination_type& bt): basic_type, WILDCARD>(bt) { } declination_type(const double& val): basic_type, WILDCARD>(val) {} - declination_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type, WILDCARD>(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + declination_type(const char *str) : basic_type, WILDCARD>(str) {} virtual ~declination_type() { } using basic_type, WILDCARD>::operator =; }; @@ -291,7 +320,10 @@ public: rightAscension_type() : basic_type, WILDCARD>() {} rightAscension_type(const rightAscension_type& bt): basic_type, WILDCARD>(bt) { } rightAscension_type(const double& val): basic_type, WILDCARD>(val) {} - rightAscension_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type, WILDCARD>(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + rightAscension_type(const char *str) : basic_type, WILDCARD>(str) {} virtual ~rightAscension_type() { } using basic_type, WILDCARD>::operator =; }; @@ -307,7 +339,10 @@ public: azimuth_type() : basic_type,WILDCARD >() {} azimuth_type(const azimuth_type& bt): basic_type,WILDCARD >(bt) { } azimuth_type(const double& val): basic_type,WILDCARD >(val) {} - azimuth_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type,WILDCARD >(str) { } + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + azimuth_type(const char *str) : basic_type,WILDCARD >(str) { } virtual ~azimuth_type() { } using basic_type,WILDCARD >::operator =; }; @@ -323,7 +358,10 @@ public: elevation_type() : basic_type,WILDCARD>() {} elevation_type(const elevation_type& bt): basic_type,WILDCARD>(bt) { } elevation_type(const double& val): basic_type,WILDCARD>(val) {} - elevation_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type,WILDCARD>(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + elevation_type(const char *str) : basic_type,WILDCARD>(str) {} virtual ~elevation_type() { } using basic_type,WILDCARD>::operator =; }; @@ -339,7 +377,10 @@ public: galacticLatitude_type() : basic_type,WILDCARD>() {} galacticLatitude_type(const galacticLatitude_type& bt): basic_type,WILDCARD>(bt) { } galacticLatitude_type(const double& val): basic_type,WILDCARD>(val) {} - galacticLatitude_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type,WILDCARD>(str) { } + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + galacticLatitude_type(const char *str) : basic_type,WILDCARD>(str) { } virtual ~galacticLatitude_type() { } using basic_type,WILDCARD>::operator =; }; @@ -355,7 +396,10 @@ public: galacticLongitude_type() : basic_type,WILDCARD>() {} galacticLongitude_type(const galacticLongitude_type& bt): basic_type,WILDCARD>(bt) { } galacticLongitude_type(const double& val): basic_type,WILDCARD>(val) {} - galacticLongitude_type(const char *str) throw (ParserErrors::BadTypeFormatExImpl) : basic_type,WILDCARD>(str) {} + /* + * @throw ParserErrors::BadTypeFormatExImpl + */ + galacticLongitude_type(const char *str) : basic_type,WILDCARD>(str) {} virtual ~galacticLongitude_type() { } using basic_type,WILDCARD>::operator =; }; diff --git a/Common/Libraries/ParserLibrary/src/TestFunctions.cpp b/Common/Libraries/ParserLibrary/src/TestFunctions.cpp index d69d1b506..27f9e5592 100644 --- a/Common/Libraries/ParserLibrary/src/TestFunctions.cpp +++ b/Common/Libraries/ParserLibrary/src/TestFunctions.cpp @@ -68,7 +68,7 @@ void test3Unary(const int& i,const int& j,const int& k) { int y=i+j+k; printf("'Test3Unary': %d\n",y); } -void Error() throw (ComponentErrors::MemoryAllocationExImpl) { +void Error() /*throw (ComponentErrors::MemoryAllocationExImpl)*/ { _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl,"CProva::Error()"); } void testRadHourAngle(double& ra) { diff --git a/Common/Libraries/ParserLibrary/src/TestParser.cpp b/Common/Libraries/ParserLibrary/src/TestParser.cpp index 394f18cf4..227d8d477 100644 --- a/Common/Libraries/ParserLibrary/src/TestParser.cpp +++ b/Common/Libraries/ParserLibrary/src/TestParser.cpp @@ -132,7 +132,8 @@ void wait(const long& sec) const IRA::CIRATools::Wait(sec,0); } -bool remoteCall(const IRA::CString& command,const IRA::CString& package,const long& par,IRA::CString& out) throw (ParserErrors::PackageErrorExImpl) +//throw (ParserErrors::PackageErrorExImpl) +bool remoteCall(const IRA::CString& command,const IRA::CString& package,const long& par,IRA::CString& out) { if (par==0) { out.Format("%s/ eseguito con successo nel package %s \n",(const char *)command,(const char *)package); diff --git a/Common/Libraries/ParserLibrary/src/TestTypes.cpp b/Common/Libraries/ParserLibrary/src/TestTypes.cpp index a63c79bc4..31a0dcad7 100644 --- a/Common/Libraries/ParserLibrary/src/TestTypes.cpp +++ b/Common/Libraries/ParserLibrary/src/TestTypes.cpp @@ -14,7 +14,8 @@ typedef enum { class Disney_converter { public: - Disney strToVal(const char * str) throw (ParserErrors::BadTypeFormatExImpl) { + //throw (ParserErrors::BadTypeFormatExImpl) + Disney strToVal(const char * str) { if (strcmp(str,"PIPPO")==0) { return PIPPO; } diff --git a/Medicina/CDB/MACI/Managers/Manager/Manager.xml b/Medicina/CDB/MACI/Managers/Manager/Manager.xml index 640629bf9..cf1a9dfae 100644 --- a/Medicina/CDB/MACI/Managers/Manager/Manager.xml +++ b/Medicina/CDB/MACI/Managers/Manager/Manager.xml @@ -36,7 +36,7 @@ dispatchPacketSize="0" immediateDispatchLevel="8" > - + diff --git a/Medicina/Configuration/CDB/MACI/Managers/Manager/Manager.xml b/Medicina/Configuration/CDB/MACI/Managers/Manager/Manager.xml index 640629bf9..cf1a9dfae 100644 --- a/Medicina/Configuration/CDB/MACI/Managers/Manager/Manager.xml +++ b/Medicina/Configuration/CDB/MACI/Managers/Manager/Manager.xml @@ -36,7 +36,7 @@ dispatchPacketSize="0" immediateDispatchLevel="8" > - + diff --git a/Noto/CDB/MACI/Managers/Manager/Manager.xml b/Noto/CDB/MACI/Managers/Manager/Manager.xml index 4a58ab59f..db7927c94 100644 --- a/Noto/CDB/MACI/Managers/Manager/Manager.xml +++ b/Noto/CDB/MACI/Managers/Manager/Manager.xml @@ -37,7 +37,7 @@ dispatchPacketSize="0" immediateDispatchLevel="8" > - + diff --git a/Noto/Configuration/CDB/MACI/Managers/Manager/Manager.xml b/Noto/Configuration/CDB/MACI/Managers/Manager/Manager.xml index ceccb0b63..6d17d0ab4 100644 --- a/Noto/Configuration/CDB/MACI/Managers/Manager/Manager.xml +++ b/Noto/Configuration/CDB/MACI/Managers/Manager/Manager.xml @@ -38,7 +38,7 @@ dispatchPacketSize="0" immediateDispatchLevel="8" > - + diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 8a48c22c5..b6d47acd7 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -17,6 +17,14 @@ + + + receiversSetup=CCG + chooseBackend=TotalPower + calOff + + + antennaSetup=KKG diff --git a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml index 24541dd03..b098cecce 100644 --- a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -26,6 +26,8 @@ + + diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml new file mode 100644 index 000000000..a5c080c2a --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -0,0 +1,18 @@ + + + diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT7GHzReceiver/SRT7GHzReceiver.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT7GHzReceiver/SRT7GHzReceiver.xml index c7bd6ace9..bd263ee6c 100644 --- a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT7GHzReceiver/SRT7GHzReceiver.xml +++ b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT7GHzReceiver/SRT7GHzReceiver.xml @@ -14,5 +14,5 @@ Container="SRT7GHzContainer" KeepAliveTime="-1" Default="false" - ImplLang="cpp" + ImplLang="cpp" /> diff --git a/SRT/Configuration/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml b/SRT/Configuration/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml new file mode 100644 index 000000000..05a4289d3 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Managers/Manager/Manager.xml b/SRT/Configuration/CDB/MACI/Managers/Manager/Manager.xml index 14d60fe9b..0936b64a6 100644 --- a/SRT/Configuration/CDB/MACI/Managers/Manager/Manager.xml +++ b/SRT/Configuration/CDB/MACI/Managers/Manager/Manager.xml @@ -41,7 +41,7 @@ minLogLevelLocal="5" dispatchPacketSize="10" immediateDispatchLevel="8"> - + diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml new file mode 100644 index 000000000..9bc79d702 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml @@ -0,0 +1,15 @@ + + + + + + 0 + 0.0 + 0.0 + 1.0 + + + \ No newline at end of file diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml new file mode 100644 index 000000000..d4e46f443 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml @@ -0,0 +1,16 @@ + + + + +LEFT4200.00.93 +LEFT4900.00.93 +LEFT5600.00.93 + +RIGHT4200.01.02 +RIGHT4900.01.02 +RIGHT5600.01.02 + + \ No newline at end of file diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml new file mode 100644 index 000000000..44e1e2e0a --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml @@ -0,0 +1,25 @@ + + + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml new file mode 100644 index 000000000..892a6cf1f --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml @@ -0,0 +1,10 @@ + + + + +8200.06 + + \ No newline at end of file diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml new file mode 100644 index 000000000..5e9edf53c --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml @@ -0,0 +1,14 @@ + + + + +4200-8.5 + +4900-12 + +5600-17 + + diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 8a48c22c5..b6d47acd7 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -17,6 +17,14 @@ + + + receiversSetup=CCG + chooseBackend=TotalPower + calOff + + + antennaSetup=KKG diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml index 24541dd03..b098cecce 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -26,6 +26,8 @@ + + diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml new file mode 100644 index 000000000..939faecf2 --- /dev/null +++ b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Interfaces/SRTReceiversInterface/idl/SRT5GHz.idl b/SRT/Interfaces/SRTReceiversInterface/idl/SRT5GHz.idl new file mode 100644 index 000000000..f1422c564 --- /dev/null +++ b/SRT/Interfaces/SRTReceiversInterface/idl/SRT5GHz.idl @@ -0,0 +1,108 @@ +#ifndef ___5GHZ_IDL__ +#define ___5GHZ_IDL__ + + +#include +#include +#include "GenericReceiver.idl" + +#pragma prefix "alma" + +module Receivers { + + /** + * This module defines the interface of the 5GHz receiver installed in the SRT. + * @author Andrea Orlati + *
+ * @copybrief Receivers::Receiver::status + * the single bits of the status word assumed the following meaning: + * @arg \c 0 LOCAL, set if the receiver is in remote and can be controlled remotely, error + * @arg \c 1 VACUUMSENSOR, set if the vacuum sensor is turned on, status + * @arg \c 2 VACUUMPUMPSTATUS, set if the vacuum pump is on, status + * @arg \c 3 VACUUMPUMPFAULT, set if the vacuum pump is in fault state, warning + * @arg \c 4 VACUUMVALVEOPEN, set if the vacuum valve i sopen, status + * @arg \c 5 COOLHEADON, set if the cool head is turned on, status + * @arg \c 6 COMPRESSORFAULT, set if the compressor is in fault state is turned on, error + * @arg \c 7 NOISEMARK, set is the calibration diode is on, status + * @arg \c 8 NOISEMARKERROR, set if the calibration mark should be and it is not, or viceversa, error + * @arg \c 9 EXTNOISEMARK, set if the control of the calibration diode from external source is enabled, status + * @arg \c 10 CONNECTIONERROR, set if an error was found during the comunication from/to the receiver, error + * @arg \c 11 UNLOCKED, set if at least one of the local oscillator is not locked, error + * @copybrief Receivers::CommonReceiverInterface::setLO + */ + interface SRT5GHz : ACS::CharacteristicComponent, Receiver { + + + /** + * Drain voltage of LNA, IF 1 + */ + readonly attribute ACS::ROdouble Vd_1; + + /** + * Drain voltage of LNA, IF 2 + */ + readonly attribute ACS::ROdouble Vd_2; + + /** + * Drain current of LNA, IF 1 + */ + readonly attribute ACS::ROdouble Id_1; + + /** + * Drain current of LNA, IF 2 + */ + readonly attribute ACS::ROdouble Id_2; + + /** + * Gate voltage of LNA, IF 1 + */ + readonly attribute ACS::ROdouble Vg_1; + + /** + * Gate voltage of LNA, IF 2 + */ + readonly attribute ACS::ROdouble Vg_2; + + /** + * Cryogenic temperature of the cool head. Approximately 65K + */ + readonly attribute ACS::ROdouble cryoTemperatureCoolHead; + + /** + * Cryogenic temperature of the cool head measured at the window. Approximately 100K + */ + readonly attribute ACS::ROdouble cryoTemperatureCoolHeadWindow; + + /** + * Cryogenic temperature of the Low Noise Amplifier. Approximately 20K + */ + readonly attribute ACS::ROdouble cryoTemperatureLNA; + + /** + * Cryogenic temperature of the cool head measured at the window. Approximately 35K + */ + readonly attribute ACS::ROdouble cryoTemperatureLNAWindow; + + /** + * Value of the environment temperature in °C. + */ + readonly attribute ACS::ROdouble environmentTemperature; + + /** + * It allows to turn the vacuum sensor on. The vacuum sensor is necessary to have a correct measurment of the vacuum characteristic. + * If the vacuum sensor is not working the dafult_value for the vacuum characteristic is always reported. + */ + void turnVacuumSensorOn() raises (ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx); + + /** + * It allows to turn the vacuum sensor off. The vacuum sensor is necessary to have a correct measurment of the vacuum characteristic. + * If the vacuum sensor is not working the dafult_value for the vacuum characteristic is always reported. + */ + void turnVacuumSensorOff() raises (ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx); + + }; + + +}; + +#endif \ No newline at end of file diff --git a/SRT/Interfaces/SRTReceiversInterface/src/Makefile b/SRT/Interfaces/SRTReceiversInterface/src/Makefile index 1c7ed34fb..d97a2b510 100644 --- a/SRT/Interfaces/SRTReceiversInterface/src/Makefile +++ b/SRT/Interfaces/SRTReceiversInterface/src/Makefile @@ -13,11 +13,12 @@ CDB_SCHEMAS = SRTLPBandNoiseMarkLookUpTable SRTLPBandReceiverModeSetup \ MarkCoefficientsSBandLookUpTable SRTIFDistributorTable #SRTIFDistributor14Table # IDL Files and flags -IDL_FILES = SRTKBandMF SRTSBandMF SRT7GHz SRTLPBand \ +IDL_FILES = SRTKBandMF SRTSBandMF SRT7GHz SRT5GHz SRTLPBand \ SRTKBandDerotator SRTIFDistributor #SRTIFDistributor14 SRTKBandMFStubs_LIBS = baciStubs ComponentErrorsStubs GenericReceiverStubs SRTSBandMFStubs_LIBS = baciStubs ComponentErrorsStubs GenericReceiverStubs SRT7GHzStubs_LIBS = baciStubs ComponentErrorsStubs GenericReceiverStubs +SRT5GHzStubs_LIBS = baciStubs ComponentErrorsStubs GenericReceiverStubs SRTLPBandStubs_LIBS = baciStubs ComponentErrorsStubs GenericReceiverStubs ManagmentDefinitionsStubs SRTKBandDerotatorStubs_LIBS = baciStubs ComponentErrorsStubs GenericDerotatorStubs SRTIFDistributorStubs_LIBS = GenericIFDistributorStubs LocalOscillatorInterfaceStubs diff --git a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml index 759140ae0..0b0581971 100644 --- a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml @@ -14,7 +14,7 @@ - + @@ -154,15 +154,6 @@ MASTERHOST discos - ReceiversContainer cpp @@ -199,6 +190,15 @@ MASTERHOST discos + + SRT5GHzContainer + cpp + + true + 0 + MASTERHOST + discos + SRTKBandContainer cpp diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index fc00b44c7..2fb1a7429 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -14,7 +14,7 @@ - + @@ -190,6 +190,15 @@ MASTERHOST discos + + SRT5GHzContainer + cpp + + true + 0 + MASTERHOST + discos + SRTKBandContainer cpp diff --git a/SRT/Servers/SRT5GHzReceiver/config/CDB/schemas/SRT5GHzReceiver.xsd b/SRT/Servers/SRT5GHzReceiver/config/CDB/schemas/SRT5GHzReceiver.xsd new file mode 100644 index 000000000..fb97c4a19 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/config/CDB/schemas/SRT5GHzReceiver.xsd @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRT5GHzReceiver/include/ComponentCore.h b/SRT/Servers/SRT5GHzReceiver/include/ComponentCore.h new file mode 100644 index 000000000..79eed3886 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/ComponentCore.h @@ -0,0 +1,490 @@ +#ifndef _COMPONENTCORE_H_ +#define _COMPONENTCORE_H_ + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public License (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + +#include "Configuration.h" +#include +#include +#include +#include + +/** + * This class contains the code of almost all the features of the component + * @author Andrea Orlati, + * Istituto di Radioastronomia, INAF + *
+ */ +class CComponentCore { +public: + /** + * Constructor + */ + CComponentCore(); + + /** + * Destructor + */ + virtual ~CComponentCore(); + + /** + * This method initializes the object + * @param service pointer to container services object provided by the container + */ + virtual void initialize(maci::ContainerServices* services) noexcept; + + /** + * This method prepares the object for execution. + * @return the pointer to the configuration class + * @throw ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl,ComponentErrors::SocketErrorExImpl + + */ + virtual CConfiguration const * const execute(); + /** + * This function is responsible to free all allocated resources + */ + virtual void cleanup(); + + /** + * It sets the local oscillator. Only the first value is considered in this case, since the receiver has just one synthesizer. Before commanding the new value some check are done. The the correspnding signal + * amplitude is computed. + * @param lo lists of values for the local oscillator (MHz), one for each IF. In that case just the first one is significant. In a -1 is passed the present value is kept + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + * @throw ComponentErrors::CouldntGetComponentExImpl + * @throw ComponentErrors::CORBAProblemExImpl + * @thorw ReceiversErrors::LocalOscillatorErrorExImpl + */ + void setLO(const ACS::doubleSeq& lo); + + /** + * It allows to change the operating mode of the receiver. If the mode does not correspond to a valid mode an error is thrown. + * @param mode mode code as a string + * @throw ReceiversErrors::ModeErrorExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl, + * @throw ComponentErrors::CouldntGetComponentExImpl + * @throw ComponentErrors::CORBAProblemExImpl + * @throw ReceiversErrors::LocalOscillatorErrorExImpl) + */ + void setMode(const char * mode); + + /** + * It activate the receiver, in other words it allows to setup the default configuration and to make sure the LNA are turned on. + * @throw ReceiversErrors::ModeErrorExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl, + * @throw ComponentErrors::CouldntGetComponentExImpl + * @throw ComponentErrors::CORBAProblemExImpl + * @throw ReceiversErrors::LocalOscillatorErrorExImpl + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void activate(); + + /** + * It deactivates the receiver. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void deactivate(); + + /** + * It allows to compute the value of the calibration mark for any given sub bands in the IF space. + * @param result this the sequence of computed mark values, the first entry correspond to first sub band and so on.... + * @param, resFreq the sequence reports the initial observed sky frequency (MHz), the first entry correspond to first sub band and so on.... + * @param resBw the sequence reports the real bandwidth observed (MHz), the first entry correspond to first sub band and so on.... + * @param freqs list of start frequencies (MHz) + * @param bandwidth list of the band widths (MHz) + * @param feeds list of feed identifier, it allows to specifies form which feed the sub band comes from. In that case it is neglected since the receiver is a single feed + * @param ifs list of IF identifier, it allows to specifies from which receiver IF the sub band comes from. + * @param true if the calibration diode is turned on. + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + */ + void getCalibrationMark(ACS::doubleSeq& result,ACS::doubleSeq& resFreq,ACS::doubleSeq& resBw,const ACS::doubleSeq& freqs,const ACS::doubleSeq& bandwidths,const ACS::longSeq& feeds, + const ACS::longSeq& ifs,bool& onoff,double& scaleFactor); + + /** + * It is called to get the all the receiver output information in one call. + * An output is identified by providing the feed and the IF identifier. It can process any number of requests at a time. + * @param feeds is a list that stores the corresponding feed of the output we are asking for + * @param ifs is a list that identifies which IFs of the feed we are interested in, usually 0..IFs-1 + * @param freq used to return the start frequency of the band provided by the output the oscillator + * (if present) is not added (MHz) + * @param bw used to return the total provided bandwidth. (MHz) + * @param pols it specifies the polarization of the receiver output, since ACS does not support for enum + * sequences the correct value must be matched against the Receivers::TPolarization enumeration. + * @param LO it gives (if present) the value of the local oscillator (MHz). + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + */ + void getIFOutput( + const ACS::longSeq& feeds, + const ACS::longSeq& ifs, + ACS::doubleSeq& freqs, + ACS::doubleSeq& bw, + ACS::longSeq& pols, + ACS::doubleSeq& LO + ); + + /** + * It computes the taper given a reference band. + * @param freq start frequency of the reference band + * @param bw width of the reference band + * @param feed feed number + * @param ifNumber IF chain identifier + * @param waveLen wave length of the reference band, the band is transformed in a real sky observed band and + * the the central frequency is taken + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + */ + double getTaper(const double& freq,const double& bw,const long& feed,const long& ifNumber,double& waveLen); + + /** + * It turns the calibration diode on. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void calOn(); + /** + * It turns the calibration diode off + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void calOff(); + + /** It turns the external calibration diode on. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl,ComponentErrors::ValidationErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void externalCalOn(); + + /** It turns the external calibration diode off. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl, + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void externalCalOff(); + + /** + * It turns on the sensor for vacuum measurement. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void vacuumSensorOn(); + + /** + * It turns off the sensor for vacuum measurement. + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void vacuumSensorOff(); + + /** + * It allows to turn LNA on + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void lnaOn(); + + /** + * It allows to turn LNA off + * @throw ReceiversErrors::NoRemoteControlErrorExImpl + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void lnaOff(); + + /** + * It reads and updates from the control board the current value of the vacuum + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateVacuum(); + + /** + * It check if the vacuum pump is on and check is the status is fault or not (VACUUMPUMPFAULT) + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateVacuumPump(); + + /** + * It checks if the vacuum valve is opened or not + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateVacuumValve(); + + /** + * It reads and updates from the control board the current cryo temperature measured near the cool head + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateCryoCoolHead(); + + /** + * It reads and updates from the control board the current cryo temperature measured near the cool head window + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateCryoCoolHeadWin(); + + /** + * It reads and updates from the control board the current cryo temperature measured near the LNA + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateCryoLNA(); + + /** + * It reads and updates from the LNA control board the current values of current and voltage of gate and drain of the transistors + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateLNAControls(); + + /** + * It reads and updates from the control board the current cryo temperature measured near the LNA window + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateCryoLNAWin(); + + /** + * It reads and updates from the control board the current vertex temperature + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateEnvironmentTemperature(); + + /** + * It checks if the Dewar power box is in remote or not + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateIsRemote(); + + /** + * It checks if the cool head is turned on or not + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateCoolHead(); + + /** + * It checks is the status of the noise mark correspond to the commanded status, otherwise it sets the NOISEMARKERROR bit. It also check if the + * external control of the noise mark has been enabled or not + * @throw ReceiversErrors::ReceiverControlBoardErrorExImpl + */ + void updateNoiseMark(); + + /** + * This method resumes the whole status of the component. It set the componentStatus member variable. + */ + void updateComponent(); + + /** + * I checks if the local oscillator is locked properly + * @throw ComponentErrors::CORBAProblemExImpl + * @throw ComponentErrors::CouldntGetAttributeExImpl + */ + void checkLocalOscillator(); + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the vacuum in mbar + */ + double getVacuum() const { return m_vacuum; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the cryogenic temperature at cool head in °K + */ + CConfiguration::BoardValue getCryoCoolHead() const noexcept { return m_cryoCoolHead; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the cryogenic temperature at cool head window in °K + */ + CConfiguration::BoardValue getCryoCoolHeadWin() const noexcept { return m_cryoCoolHeadWin; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the cryogenic temperature at LNA in °K + */ + CConfiguration::BoardValue getCryoLNA() const noexcept { return m_cryoLNA; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the cryogenic temperature at LNA window in °K + */ + CConfiguration::BoardValue getCryoLNAWin() const noexcept { return m_cryoLNAWin; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current value of the vertex temperature + */ + CConfiguration::BoardValue getEnvironmentTemperature() const noexcept { return m_environmentTemperature; } + + /** + * This is getter method. No need to make it thread safe...... + * @return the current status word + */ + DWORD getStatusWord() const noexcept { return m_statusWord; } + + /** + * This is getter method. In this case, since it makes use of some class members that could be changed by other methods it is advisable to protect this method with the class mutex. + * @param control name of the parameter that must be returned + * @param ifs Intermediate frequency identifier, it permits to select which amplification chain we are interested in + * @return a specific value of from the transistor control parameters + */ + double getFetValue(const IRA::ReceiverControl::FetValue& control,const DWORD& ifs) noexcept; + + /** + * It returns the feed geometry of the receiver with respect to the central one. For this implementation it is just a placeholder since there is just one feed. + */ + long getFeeds(ACS::doubleSeq& X,ACS::doubleSeq& Y,ACS::doubleSeq& power) noexcept; + + /** + * It returns back the current local oscillator frequency settings. + * @param lo output sequence + */ + void getLO(ACS::doubleSeq& lo); + + /** + * It returns back the current bandwidth for each IF. + * @param bw output sequence + */ + void getBandwidth(ACS::doubleSeq& bw); + + /** + * It returns back the current start frequency for each IF. + * @param sf output sequence + */ + void getStartFrequency(ACS::doubleSeq& sf); + + /** + * It returns back the current polarization for each IF. + * @param pol output sequence + */ + void getPolarization(ACS::longSeq& pol); + + /** + * It returns the current operating mode of the receiver. + * @return output string + */ + const IRA::CString& getSetupMode(); + + /** + * It returns the number of IF chains + * @return output value + */ + const DWORD& getIFs(); + + /** + * It returns the number of feeds + * @return output value + */ + const DWORD& getFeeds(); + + /** + * @return the status flag of the component + */ + const Management::TSystemStatus& getComponentStatus(); + + /** + * Allows to set the "default_value" for the vacuum characteristic. In principle it is possible to read it directly from CDB, but I found it more + * comfortable to get it directly from the characteristic itself. + */ + inline void setVacuumDefault(const double& val) noexcept { m_vacuumDefault=val; } + +protected: + /** + * Obtain a valid reference to the local oscillator device + * @throw ComponentErrors::CouldntGetComponentExImpl + */ + void loadLocalOscillator(); + + /** + * used to free the reference to the local oscillator device + */ + void unloadLocalOscillator() noexcept; +private: + + enum TStatusBit { + LOCAL=0, + VACUUMSENSOR=1, + VACUUMPUMPSTATUS=2, + VACUUMPUMPFAULT=3, + VACUUMVALVEOPEN=4, + COOLHEADON=5, + COMPRESSORFAULT=6, + NOISEMARK=7, + NOISEMARKERROR=8, + EXTNOISEMARK=9, + CONNECTIONERROR=10, + UNLOCKED=11 + }; + + CConfiguration m_configuration; + maci::ContainerServices* m_services; + BACIMutex m_mutex; + IRA::ReceiverControl *m_control; // this object is thread safe + Receivers::LocalOscillator_var m_localOscillatorDevice; + bool m_localOscillatorFault; + double m_localOscillatorValue; + ACS::doubleSeq m_startFreq; + ACS::doubleSeq m_bandwidth; + ACS::longSeq m_polarization; + IRA::CString m_setupMode; + double m_vacuum; + CConfiguration::BoardValue m_cryoCoolHead; + CConfiguration::BoardValue m_cryoCoolHeadWin; + CConfiguration::BoardValue m_cryoLNA; + CConfiguration::BoardValue m_cryoLNAWin; + CConfiguration::BoardValue m_environmentTemperature; + double m_vacuumDefault; + bool m_calDiode; + IRA::ReceiverControl::FetValues m_fetValues; + DWORD m_statusWord; + // m_ioMarkError is a flag used to know if we already got an IO + // error. See mantis issue n.0000236 + bool m_ioMarkError; + Management::TSystemStatus m_componentStatus; + + void setComponentStatus(const Management::TSystemStatus& status) { if (status>m_componentStatus) m_componentStatus=status; } + + /** + * This function will set the a status bit. It may be considered thread safe due to its definition + */ + inline void setStatusBit(TStatusBit bit) { m_statusWord |= 1 << bit; } + + /** + * This function will unset (clear) a status bit. It may be considered thread safe due to its definition + */ + inline void clearStatusBit(TStatusBit bit) { m_statusWord &= ~(1 << bit); } + + /** + * This function check is a bit is set or not. It may be considered thread safe due to its definition + */ + inline bool checkStatusBit(TStatusBit bit) { return m_statusWord & (1 << bit); } + + double linearFit(double *X,double *Y,const WORD& size,double x) noexcept; + /************************ CONVERSION FUNCTIONS **************************/ + // Convert the voltage value of the vacuum to mbar + static double voltage2mbar(double voltage) { return(pow(10, 1.5 * voltage - 12)); } + // Convert the voltage value of the temperatures to Kelvin + static double voltage2Kelvin(double voltage) { + return voltage < 1.12 ? (660.549422889947 * pow(voltage, 6)) - (2552.334255456860 * pow(voltage, 5)) + (3742.529989384570 * pow(voltage, 4)) + - (2672.656926956470 * pow(voltage, 3)) + (947.905578508975 * pow(voltage, 2)) - 558.351002849576 * voltage + 519.607622398508 : + (865.747519105672 * pow(voltage, 6)) - (7271.931957100480 * pow(voltage, 5)) + (24930.666241800500 * pow(voltage, 4)) + - (44623.988512320400 * pow(voltage, 3)) + (43962.922216886600 * pow(voltage, 2)) - 22642.245121997700 * voltage + 4808.631312836750; + } + // Convert the voltage value of the temperatures to Celsius (Sensor B57703-10K) + static double voltage2Celsius(double voltage) + { return -5.9931 * pow(voltage, 5) + 40.392 * pow(voltage, 4) - 115.41 * pow(voltage, 3) + 174.67 * pow(voltage, 2) - 174.23 * voltage + 112.79; } + // Convert the ID voltage value to the mA value + static double currentConverter(double voltage) { return(10 * voltage); } + // Convert the VD and VG voltage values using a right scale factor + static double voltageConverter(double voltage) { return(voltage); } +}; + + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/Configuration.h b/SRT/Servers/SRT5GHzReceiver/include/Configuration.h new file mode 100644 index 000000000..64816cdbf --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/Configuration.h @@ -0,0 +1,272 @@ +#ifndef CCONFIGURATION_H +#define CCONFIGURATION_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include +#include +#include + + +// Dummy value for a board connection error +#define CEDUMMY 100000 + + +/** + * This class implements the component configuration. The data inside this class are initialized at the startup from the + * configuration database and then are used (read) inside the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, INAF + *
+ */ +class CConfiguration { +public: + + typedef struct { + double skyFrequency; + double markValue; + Receivers::TPolarization polarization; + } TMarkValue; + + typedef struct { + double frequency; + double outputPower; + } TLOValue; + + typedef struct { + double frequency; + double taper; + } TTaperValue; + + typedef struct { + WORD code; + double xOffset; + double yOffset; + double relativePower; + } TFeedValue; + + typedef struct { + double temperature; + ACS::Time timestamp; + } BoardValue; + + + /** + * Default constructor + */ + CConfiguration(); + + /** + * Destructor + */ + ~CConfiguration(); + + /** + * @return the IP address of the board that controls the dewar + */ + inline const IRA::CString& getDewarIPAddress() const { return m_dewarIPAddress; } + + /** + * @return the IP port of the board that controls the dewar + */ + inline const WORD& getDewarPort() const { return m_dewarPort; } + + /** + * @return the IP address of the board that controls the receiver LNA + */ + inline const IRA::CString& getLNAIPAddress() const { return m_LNAIPAddress; } + + /** + * @return the IP port of the board that controls the receiver LNA + */ + inline const WORD& getLNAPort() const { return m_LNAPort; } + + /** + * @return the time allowed to the watch dog thread to complete an iteration and respond to the thread manager (microseconds) + */ + inline const DDWORD& getWarchDogResponseTime() const { return m_watchDogResponseTime; } + + /** + * @return the time between two execution of the watch dog thread (microseconds) + */ + inline const DDWORD& getWatchDogSleepTime() const { return m_watchDogSleepTime; } + + /** + * @return the time required by the board to sample the values of LNA (microseconds) + */ + inline const DDWORD& getLNASamplingTime() const { return m_LNASamplingTime; } + + /** + * @return the time the repetition log guard will cache new log messages before sending to the central logger (microseconds) + */ + inline const DDWORD& getRepetitionCacheTime() const { return m_repetitionCacheTime; } + + /** + * @return the time of expiration of a log sent to the repetition log guard (microseconds) + */ + inline const DDWORD& getRepetitionExpireTime() const { return m_repetitionExpireTime; } + + /** + * @return the instance of the local oscillator component that the receiver will use to drive the set its LO + */ + inline const IRA::CString& getLocalOscillatorInstance() const { return m_localOscillatorInstance; } + + /** + * Allows to get the table of mark values relative to left polarization + * @param freq vector containing the frequency value of the mark table. It must be freed by caller. + * @param markValue vector of the value of the calibration diode. It must be freed by caller. + * @param len used to return the length of the mark values array + * @return the size of the output vectors + */ + DWORD getLeftMarkTable(double *& freq,double *& markValuel) const; + + /** + * Allows to get the table of mark values relative to left polarization + * @param freq vector containing the frequency value of the mark table. It must be freed by caller. + * @param markValue vector of the value of the calibration diode. It must be freed by caller. + * @param len used to return the length of the mark values array + * @return the size of the output vectors + */ + DWORD getRightMarkTable(double *& freq,double *& markValue) const; + + /** + * @param freq vector with the synthesizer frequencies. It must be freed by caller. + * @param power corresponding powers for the frequencies vector. It must be freed by caller. + * @return the size of the output vectors + */ + DWORD getSynthesizerTable(double *& freq,double *& power) const; + + /** + * @param freq vector with the frequencies. It must be freed by caller. + * @param taper corresponding taper for the frequencies vector. It must be freed by caller. + * @return the size of the output vectors + */ + DWORD getTaperTable(double * &freq,double *&taper) const; + + /** + * @param code feed identification codes. It must be freed by caller. + * @param xOffset displacement of the feed with respect to the central one along x axis. It must be freed by caller. + *@param yOffset displacement of the feed with respect to the central one along y axis. It must be freed by caller. + *@param relativePower expected percentage of variation of gain with respect to the central one. It must be freed by caller. + * @return the size of the output vectors + */ + DWORD getFeedInfo(WORD *& code,double *& xOffset,double *& yOffset,double *& relativePower) const; + + /** + * @return mnemonic of the working mode of the receiver + */ + inline const IRA::CString& getSetupMode() const { return m_mode; } + + /** + * @return the lower limit of the RF coming from the receiver (MHz) + */ + inline double const * const getRFMin() const { return m_RFMin; } + + /** + * @return the upper limit of the RF coming from the receiver (MHz) + */ + inline double const * const getRFMax() const { return m_RFMax; } + + /** + * @return the start frequency of the IF coming from the receiver (MHz) + */ + inline double const * const getIFMin() const { return m_IFMin; } + + /** + * @return the bandwidth of the IF coming from the receiver (MHz) + */ + inline double const * const getIFBandwidth() const{ return m_IFBandwidth; } + + /** + * @return the number of IF chains for each feed + */ + inline const DWORD& getIFs() const { return m_IFs; } + + /** + * @return the pointer to the polarizations array, the first element correspond to the first IF and so on..... + */ + inline Receivers::TPolarization const * const getPolarizations() const { return m_polarizations; } + + /** + * @return the number of feeds + */ + inline const DWORD& getFeeds() const { return m_feeds; } + + /** + * @return the default frequency for the synthesizer (MHz) + */ + inline double const * const getDefaultLO() const { return m_defaultLO; } + + /** + * @return the value of the fixed synthesizer used for the second conversion (MHz) + */ + inline double const * const getFixedLO2() const { return m_fixedLO2; } + + /** + * @return lower limit for the synthesizer tuning (MHz) + */ + inline double const * const getLOMin() const { return m_LOMin; } + + /** + * @return upper limit for the synthesizer tuning (MHz) + */ + inline double const * const getLOMax() const { return m_LOMax; } + + /** + * This member function is used to configure component by reading the configuration parameter from the CDB. + * This must be the first call before using any other function of this class. + * @throw ComponentErrors::CDBAccess. ComponentErrors::MemoryAllocationExImpl + * @param Services pointer to the container services object + */ + //throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl); + void init(maci::ContainerServices *Services); + +private: + IRA::CString m_dewarIPAddress; + WORD m_dewarPort; + IRA::CString m_LNAIPAddress; + WORD m_LNAPort; + DDWORD m_watchDogResponseTime; + DDWORD m_watchDogSleepTime; + DDWORD m_LNASamplingTime; + DDWORD m_repetitionCacheTime; + DDWORD m_repetitionExpireTime; + IRA::CString m_localOscillatorInstance; + + IRA::CString m_mode; + double *m_RFMin; + double *m_RFMax; + double *m_IFMin; + double *m_IFBandwidth; + DWORD m_IFs; + Receivers::TPolarization *m_polarizations; + DWORD m_feeds; + double *m_defaultLO; + double *m_fixedLO2; + double *m_LOMin; + double *m_LOMax; + + IRA::CDBTable *m_markTable; + IRA::CDBTable *m_loTable; + IRA::CDBTable *m_taperTable; + IRA::CDBTable *m_feedsTable; + + TMarkValue *m_markVector; + DWORD m_markVectorLen; + TLOValue * m_loVector; + DWORD m_loVectorLen; + TTaperValue * m_taperVector; + DWORD m_taperVectorLen; + TFeedValue * m_feedVector; // length given by m_feeds +}; + + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOBandWidth.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOBandWidth.h new file mode 100644 index 000000000..d3b41a089 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOBandWidth.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOBANDWIDTH_H_ +#define _DEVIOBANDWIDTH_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the bandWidth property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOBandWidth : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOBandWidth(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOBandWidth::DevIOBandWidth()"); + } + + /** + * Destructor + */ + ~DevIOBandWidth() + { + ACS_TRACE("DevIOBandWidth::~DevIOBandWidth()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOBandWidth::DevIOBandWidth()"); + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + ACS::doubleSeq read(ACS::Time& timestamp) + { + m_pCore->getBandwidth(m_val); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + ACS::doubleSeq m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOComponentStatus.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOComponentStatus.h new file mode 100644 index 000000000..4f9af74ff --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOComponentStatus.h @@ -0,0 +1,61 @@ +#ifndef _DEVIOCOMPONENTSTATUS_H_ +#define _DEVIOCOMPONENTSTATUS_H_ + +/* ************************************************************************************************************* */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + +#include +#include + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the componentStatus property + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOComponentStatus: public virtual DevIO +{ + +public: + + DevIOComponentStatus(CComponentCore* core): m_pCore(core) { + AUTO_TRACE("DevIOComponentStatus::DevIOComponentStatus()"); + } + + ~DevIOComponentStatus() { + AUTO_TRACE("DevIOComponentStatus::~DevIOComponentStatus()"); + } + + bool initializeValue(){ + return false; + } + + /* + * @throw ACSErr::ACSbaseExImpl + */ + Management::TSystemStatus read(ACS::Time& timestamp) { + m_val=m_pCore->getComponentStatus(); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + + /* + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Long& value, ACS::Time& timestamp) { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + Management::TSystemStatus m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHead.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHead.h new file mode 100644 index 000000000..d4467e77c --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHead.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOCRYOCOOLHEAD_H_ +#define _DEVIOCRYOCOOLHEAD_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the cryoTemparatureCoolHead property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOCryoTemperatureCoolHead : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOCryoTemperatureCoolHead(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOCryoTemperatureCoolHead::DevIOCryoTemperatureCoolHead()"); + } + + /** + * Destructor + */ + ~DevIOCryoTemperatureCoolHead() + { + ACS_TRACE("DevIOCryoTemperatureCoolHead::~DevIOCryoTemperatureCoolHead()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOCryoTemperatureCoolHead::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + CConfiguration::BoardValue result = m_pCore->getCryoCoolHead(); + m_val = result.temperature; + timestamp = result.timestamp; + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHeadWindow.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHeadWindow.h new file mode 100644 index 000000000..2d6dffbe9 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureCoolHeadWindow.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOCRYOCOOLHEADWIN_H_ +#define _DEVIOCRYOCOOLHEADWIN_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the cryoTemparatureCoolHeadWindow property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOCryoTemperatureCoolHeadWin : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOCryoTemperatureCoolHeadWin(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOCryoTemperatureCoolHeadWin::DevIOCryoTemperatureCoolHeadWin()"); + } + + /** + * Destructor + */ + ~DevIOCryoTemperatureCoolHeadWin() + { + ACS_TRACE("DevIOCryoTemperatureCoolHeadWin::~DevIOCryoTemperatureCoolHeadWin()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOCryoTemperatureCoolHeadWin::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + CConfiguration::BoardValue result = m_pCore->getCryoCoolHeadWin(); + m_val = result.temperature; + timestamp = result.timestamp; + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNA.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNA.h new file mode 100644 index 000000000..0d4b89464 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNA.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOCRYOLNA_H_ +#define _DEVIOCRYOLNA_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the cryoTemparatureLNA property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOCryoTemperatureLNA : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOCryoTemperatureLNA(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOCryoTemperatureLNA::DevIOCryoTemperatureLNA()"); + } + + /** + * Destructor + */ + ~DevIOCryoTemperatureLNA() + { + ACS_TRACE("DevIOCryoTemperatureLNA::~DevIOCryoTemperatureLNA()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOCryoTemperatureLNA::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + CConfiguration::BoardValue result = m_pCore->getCryoLNA(); + m_val = result.temperature; + timestamp = result.timestamp; + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNAWindow.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNAWindow.h new file mode 100644 index 000000000..c892a5e13 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOCryoTemperatureLNAWindow.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOCRYOLNAWIN_H_ +#define _DEVIOCRYOLNAWIN_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the cryoTemparatureLNAWindow property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOCryoTemperatureLNAWin : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOCryoTemperatureLNAWin(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOCryoTemperatureLNAWin::DevIOCryoTemperatureLNAWin()"); + } + + /** + * Destructor + */ + ~DevIOCryoTemperatureLNAWin() + { + ACS_TRACE("DevIOCryoTemperatureLNAWin::~DevIOCryoTemperatureLNAWin()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOCryoTemperatureLNAWin::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + CConfiguration::BoardValue result = m_pCore->getCryoLNAWin(); + m_val = result.temperature; + timestamp = result.timestamp; + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOEnvTemperature.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOEnvTemperature.h new file mode 100644 index 000000000..8566c3c07 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOEnvTemperature.h @@ -0,0 +1,78 @@ +#ifndef _DEVIOENVTEMPERATURE_H_ +#define _DEVIOENVTEMPERATURE_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the environmentTemperature property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOEnvTemperature: public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOEnvTemperature(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOEnvTemperature::DevIOEnvTemperature()"); + } + + /** + * Destructor + */ + ~DevIOEnvTemperature() + { + ACS_TRACE("DevIOEnvTemperature::~DevIOEnvTemperature()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOEnvTemperature::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + CConfiguration::BoardValue result = m_pCore->getEnvironmentTemperature(); + m_val = result.temperature; + timestamp = result.timestamp; + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOInitialFrequency.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOInitialFrequency.h new file mode 100644 index 000000000..685657b66 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOInitialFrequency.h @@ -0,0 +1,77 @@ +#ifndef _DEVIOINITIALFREQUENCY_H_ +#define _DEVIOINITIALFREQUENCY_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the initialFrequency property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOInitialFrequency : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOInitialFrequency(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOInitialFrequency::DevIOInitialFrequency()"); + } + + /** + * Destructor + */ + ~DevIOInitialFrequency() + { + ACS_TRACE("DevIOInitialFrequency::~DevIOInitialFrequency()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOInitialFrequency::DevIOInitialFrequency()"); + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + ACS::doubleSeq read(ACS::Time& timestamp) + { + m_pCore->getStartFrequency(m_val); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + ACS::doubleSeq m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOLNAControls.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOLNAControls.h new file mode 100644 index 000000000..f575aa56d --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOLNAControls.h @@ -0,0 +1,80 @@ +#ifndef _DEVIOLNACONTROLS_H_ +#define _DEVIOLNACONTROLS_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include +#include + +/** + * This class is derived from template DevIO and it is used by the LNA controls properties of the component: Vd_1, Id_2 and so on..... + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOLNAControls : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOLNAControls(CComponentCore* core,const IRA::ReceiverControl::FetValue& control,const DWORD& ifs) : m_pCore(core), m_control(control), m_ifs(ifs) + { + AUTO_TRACE("DevIOLNAControls::DevIOLNAControls()"); + } + + /** + * Destructor + */ + ~DevIOLNAControls() + { + ACS_TRACE("DevIOLNAControls::~DevIOLNAControls()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOLNAControls::initializeValue()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + m_val=m_pCore->getFetValue(m_control,m_ifs); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; + IRA::ReceiverControl::FetValue m_control; + DWORD m_ifs; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOLocalOscillator.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOLocalOscillator.h new file mode 100644 index 000000000..25246f3cd --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOLocalOscillator.h @@ -0,0 +1,77 @@ +#ifndef _DEVIOLOCALOSCILLATOR_H_ +#define _DEVIOLOCALOSCILLATOR_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the LO property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOLocalOscillator : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOLocalOscillator(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOLocalOscillator::DevIOLocalOscillator()"); + } + + /** + * Destructor + */ + ~DevIOLocalOscillator() + { + ACS_TRACE("DevIOLocalOscillator::~DevIOLocalOscillator()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOLocalOscillator::DevIOLocalOscillator()"); + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + ACS::doubleSeq read(ACS::Time& timestamp) + { + m_pCore->getLO(m_val); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + ACS::doubleSeq m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOMode.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOMode.h new file mode 100644 index 000000000..95dfefdf1 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOMode.h @@ -0,0 +1,59 @@ +#ifndef _DEVIOMODE_H_ +#define _DEVIOMODE_H_ + +/** ************************************************************************************************************* */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + +#include +#include + +using namespace baci; + +/** + * This class is derived from the template DevIO. It is used by the by the mode property. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+ */ +class DevIOMode: public virtual DevIO +{ +public: + + DevIOMode(CComponentCore* core): m_core(core) { + AUTO_TRACE("DevIOMode::DevIOMode()"); + } + + ~DevIOMode() { + AUTO_TRACE("DevIOMode::~DevIOMode()"); + } + + bool initializeValue(){ + return false; + } + + /* + * @throw ACSErr::ACSbaseExImpl + */ + ACE_CString read(ACS::Time& timestamp) { + AUTO_TRACE("DevIOMode::read()"); + timestamp=getTimeStamp(); + return (const char *)m_core->getSetupMode(); + } + + /* + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACE_CString& value, ACS::Time& timestamp) { + AUTO_TRACE("DevIOMode::write()"); + } + +private: + CComponentCore *m_core; +}; + + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOPolarization.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOPolarization.h new file mode 100644 index 000000000..0a8fd730c --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOPolarization.h @@ -0,0 +1,77 @@ +#ifndef _DEVIOPOLARIZATION_H_ +#define _DEVIOPOLARIZATION_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + +#include +#include + + +/** + * This class is derived from template DevIO and it is used by the polarization property of the receiverBoss component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOPolarization : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the boss core + */ + DevIOPolarization(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOPolarization::DevIOPolarization()"); + } + + /** + * Destructor + */ + ~DevIOPolarization() + { + ACS_TRACE("DevIOPolarization::~DevIOPolarization()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOLO::DevIOPolarization()"); + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + ACS::longSeq read(ACS::Time& timestamp) + { + m_pCore->getPolarization(m_val); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACS::longSeq& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + ACS::longSeq m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOStatus.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOStatus.h new file mode 100644 index 000000000..799971aaa --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOStatus.h @@ -0,0 +1,80 @@ +#ifndef _DEVIOSTATUS_H_ +#define _DEVIOSTATUS_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the status property + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOStatus : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the component core + */ + DevIOStatus(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOStatus::DevIOStatus()"); + } + + /** + * Destructor + */ + ~DevIOStatus() + { + ACS_TRACE("DevIOStatus::~DevIOStatus()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOStatus::DevIOStatus()"); + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + ACS::pattern read(ACS::Time& timestamp) + { + m_val=m_pCore->getStatusWord(); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const ACS::pattern& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + ACS::pattern m_val; +}; + + +#endif /*_DEVIOSTATUS_H_*/ diff --git a/SRT/Servers/SRT5GHzReceiver/include/DevIOVacuum.h b/SRT/Servers/SRT5GHzReceiver/include/DevIOVacuum.h new file mode 100644 index 000000000..4a92aa2cc --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/DevIOVacuum.h @@ -0,0 +1,77 @@ +#ifndef _DEVIOVACUUM_H_ +#define _DEVIOVACUUM_H_ + +/** **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + +#include +#include + +/** + * This class is derived from template DevIO and it is used by the vacuum property of the component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia
+*/ +class DevIOVacuum : public DevIO +{ +public: + + /** + * Constructor + * @param core pointer to the component core + */ + DevIOVacuum(CComponentCore* core) : m_pCore(core) + { + AUTO_TRACE("DevIOVacuum::DevIOVacuum()"); + } + + /** + * Destructor + */ + ~DevIOVacuum() + { + ACS_TRACE("DevIOVacuum::~DevIOVacuum()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOVacuum::DevIOVacuum()"); + return true; // initialize with the default in order to avoid the alarm system when the component start and the value has not been read at least once + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + * @throw ACSErr::ACSbaseExImpl + */ + CORBA::Double read(ACS::Time& timestamp) + { + m_val=m_pCore->getVacuum(); + timestamp=getTimeStamp(); //Completion time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + * @throw ACSErr::ACSbaseExImpl + */ + void write(const CORBA::Double& value, ACS::Time& timestamp) + { + timestamp=getTimeStamp(); + return; + } + +private: + CComponentCore* m_pCore; + double m_val; +}; + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/include/MonitorThread.h b/SRT/Servers/SRT5GHzReceiver/include/MonitorThread.h new file mode 100644 index 000000000..f34d592d5 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/MonitorThread.h @@ -0,0 +1,87 @@ +#ifndef _MONITORTHREAD_H_ +#define _MONITORTHREAD_H_ + +/* ************************************************************************************************************* */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + +#include + +#define _CPLUSPLUS11_PORTING_ + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +#include +C11_IGNORE_WARNING_POP + +#include + +/** + * This class implements a component monitoring thread . This thread is in charge of update all the attributes of the component in order to make sure the receiver is correctly working. +*/ +class CMonitorThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + CMonitorThread(const ACE_CString& name,CComponentCore *param, + const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime,const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~CMonitorThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. The method is executed in a loop until the thread is alive. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * This method allows to inform the watch dog on how long the LNA sampling time takes. + */ + void setLNASamplingTime(const DDWORD& time); +private: + enum TStage { + VACUUM, + STATUS, + LNA, + CTEMPCOOLHEAD, + CTEMPCOOLHEADW, + CTEMPLNA, + CTEMPLNAW, + REMOTE, + COOLHEAD, + VACUUMPUMP, + VACUUMVALVE, + NOISEMARK, + UNLOCKED, + ENVTEMP + }; + CComponentCore *m_core; + ACS::TimeInterval m_currentResponseTime; + ACS::TimeInterval m_currentSampling; + TStage m_currentStage; +}; + +#endif + diff --git a/SRT/Servers/SRT5GHzReceiver/include/SRT5GHzImpl.h b/SRT/Servers/SRT5GHzReceiver/include/SRT5GHzImpl.h new file mode 100644 index 000000000..ca76379c4 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/include/SRT5GHzImpl.h @@ -0,0 +1,493 @@ +#ifndef __SRT5GHZIMPL_H_ +#define __SRT5GHZIMPL_H_ + +/* ************************************************************************************************************* */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public License (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(andrea.orlati@inaf.it) 10/08/2023 Creation */ + + + +#ifndef __cplusplus +#error This is a C++ include file and cannot be used from plain C +#else +#define STRING2(X) #X +#define STRING(X) STRING2(X) +#pragma message ("C++ version is " STRING(__cplusplus)) +#endif + +#include + +#define _CPLUSPLUS11_PORTING_ + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") +#include +C11_IGNORE_WARNING_POP + +#include +#include +#include +#include +#include +#include + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wsequence-point") +#include +C11_IGNORE_WARNING_POP + +//C11_IGNORE_WARNING_PUSH +//C11_IGNORE_WARNING("-Wdeprecated-declarations") +#include +//C11_IGNORE_WARNING_POP +#include +#include +#include +#include +#include "ComponentCore.h" +#include "MonitorThread.h" + +#undef _CPLUSPLUS11_PORTING_ + + +/** + * @mainpage 5GHz receiver component Implementation + * @date 10/08/2023 + * @version 1.0.0 + * @author Andrea Orlati + * @remarks the case there are connection problems with the control boards it is not very satisfactory and should be reviewed + * even if this implies a review as the receiverControl library is designed.. + * At the moment the component does not react when a connection error is detected it just takes note of the event + * (changing the status word). The component should be allowed to close the connection, delete the object and recreate it, + * but at the moment a lock is taken inside the library and the component has no way to check is there sone one using + * the library at the moment, so a delete could lead to a segmentation-fault. The fact a ReceiverControl is protected + * by a inner lock instead of the component mutex is due to the fact that some operation of the library + * could take much time and this could have caused critical delays on the component. + * +*/ + +/** + * @author Orlati Andrea + * Istituto di Radioastronomia, Italia + *
+ */ +class SRT5GHzImpl: public baci::CharacteristicComponentImpl, + public virtual POA_Receivers::SRT5GHz +{ +public: + + /** + * Constructor. + * @param CompName component's name. This is also the name that will be used to find the configuration data for the component in the Configuration Database. + * @param containerServices pointer to the class that exposes all services offered by container + */ + SRT5GHzImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices); + + /** + * Destructor. + */ + virtual ~SRT5GHzImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters or + * builds up connection to devices or other components. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ACSErr::ACSbaseExImpl + */ + virtual void initialize(); + + /** + * Called after initialize() to tell the component that it has to be ready to accept incoming + * functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only + * logs the COMPSTATE_OPERATIONAL + * @throw ACSErr::ACSbaseExImpl + */ + virtual void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of + * releasing all resources. + */ + virtual void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. This function tries to free all resources + * even though there is no warranty that the function is completely executed before the component is destroyed. + */ + virtual void aboutToAbort(); + + /** + * It must be called to switch the receiver to operative mode. when called the default configuration and mode is loaded. Regarding this + * implementation calling this method corresponds to a call to setMode("NORMAL"). + * @param setup_mode the setup mode (KKG, CCB, LLP, PLP, ecc.) + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void activate(const char * setup_mode); + + /** + * It must be called to switch off the receiver. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void deactivate(); + + /** + * This method is used to turn the calibration diode on. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void calOn(); + + /** + * This method is used to turn the calibration diode off. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void calOff(); + + + /** + * This method is used to turn the external calibration diode on. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void externalCalOn(); + + /** + * This method is used to turn the external calibration diode off. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void externalCalOff(); + + /** + * This method allows to set local oscillator. In this implementation only the first value is considered. + * @param lo the list contains the values in MHz for the local oscillator + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void setLO(const ACS::doubleSeq& lo); + + /** + * This method allows to set the operating mode of the receiver. In that implementation the receiver does not have special modes so a call to this method + * will lead to Configuration exception. + * @param mode string identifier of the operating mode + * @throw CORBA::SystemException + * @throw ReceiversErrors::ReceiversErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + void setMode(const char * mode); + + /** + * This method is called when the values of the calibration mark of the receiver are required. A value is returned for every provided sub bands. + * The sub bands are defined by giving the feed number, the polarization, the initial frequency and the bandwidth. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + * @param freqs for each sub band this is the list of the starting frequencies (in MHz). The value is compared and adjusted to the the real + * initial frequency of the receiver. + * @param bandwidths for each sub band this is the width in MHz. The value is compared and adjusted to the the real + * band width of the receiver. + * @param feeds for each sub band this if the feed number. In that case zero is the only allowed value. + * @param ifs for each sub band this indicates the proper IF + * @param skyFreq for each sub band it returns the real observed frequency(MHz), included detector, receiver IF and Local Oscillator. + * @param skyBw for each sub band it returns the real observed bandwidth(MHz), included detector bandwidth , receiver IF bandwidth + * @param onoff true if the calibration diode is turned on. + * @param scaleFactor this is a value to be applied as scale factor during system temperature computation + * @return the list of the noise calibration value in Kelvin degrees. + */ + virtual ACS::doubleSeq * getCalibrationMark(const ACS::doubleSeq& freqs, const ACS::doubleSeq& bandwidths, const ACS::longSeq& feeds, const ACS::longSeq& ifs, + ACS::doubleSeq_out skyFreq,ACS::doubleSeq_out skyBw,CORBA::Boolean_out onoff,CORBA::Double_out scaleFactor); + + /** + * This method is called in order to know the geometry of the receiver. The geometry is given along the X and Y axis where the central feed is the origin + * the axis. The relative power (normalized to one) with respect to the central feed is also given. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + * @param X the positions relative to the central beam of the feeds along the X axis (radians) + * @param Y the positions relative to the central beam of the feeds along the Y axis (radians) + * @param power the relative power of the feeds + * @return the number of feeds + */ + virtual CORBA::Long getFeeds(ACS::doubleSeq_out X,ACS::doubleSeq_out Y,ACS::doubleSeq_out power); + + + /** + * It is called to get the all the receiver output information in one call. + * An output is identified by providing the feed and the IF identifier. It can process any number of requests at a time. + * @param feeds is a list that stores the corresponding feed of the output we are asking for + * @param ifs is a list that identifies which IFs of the feed we are interested in, usually 0..IFs-1 + * @param freq used to return the start frequency of the band provided by the output the oscillator + * (if present) is not added (MHz) + * @param bw used to return the total provided bandwidth. (MHz) + * @param pols it specifies the polarization of the receiver output, since ACS does not support for enum + * sequences the correct value must be matched against the Receivers::TPolarization enumeration. + * @param LO it gives (if present) the value of the local oscillator (MHz). + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + * @throw CORBA::SystemException + */ + virtual void getIFOutput( + const ACS::longSeq& feeds, + const ACS::longSeq& ifs, + ACS::doubleSeq_out freqs, + ACS::doubleSeq_out bw, + ACS::longSeq_out pols, + ACS::doubleSeq_out LO + ); + + /** + * This method is called in order to know the taper of the receiver. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + * @param freq starting frequency of the detector in MHz. The value is compared and adjusted to the the real initial frequency of the receiver. + * @param bandWidth bandwidth of the detector n MHz. The value is compared and adjusted to the the real band width of the receiver. + * @param feed feed id the detector is attached to + * @param ifNumber Number of the IF, given the feed + * @param waveLen corresponding wave length in meters + * @return the value of the taper in db + */ + virtual CORBA::Double getTaper(CORBA::Double freq,CORBA::Double bandWidth,CORBA::Long feed,CORBA::Long ifNumber,CORBA::Double_out waveLen) ; + + /** + * This method is called in order to turn the LNA On. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnLNAsOn(); + + /** + * This method is called in order to turn the LNA Off. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnLNAsOff(); + + /** + * it turns the vacuum sensor on + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnVacuumSensorOn(); + + /** + * it turns the vacuum sensor on + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnVacuumSensorOff(); + + /** + * It allows to turn the antenna unit on + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnAntennaUnitOn(); + + /** + * It allows to turn the antenna unit off + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + virtual void turnAntennaUnitOff(); + + /** + * Returns a reference to the mode property implementation of the IDL interface. + * @return pointer to read-only string property + * @throw CORBA::SystemException + */ + virtual ACS::ROstring_ptr mode(); + + /** + * Returns a reference to the LO property implementation of the IDL interface. + * @return pointer to read-only double sequence property + * @throw CORBA::SystemException + */ + virtual ACS::ROdoubleSeq_ptr LO(); + + /** + * Returns a reference to the feeds property implementation of the IDL interface. + * @return pointer to read-only long property + * @throw CORBA::SystemException + */ + virtual ACS::ROlong_ptr feeds(); + + /** + * Returns a reference to the IFs property implementation of the IDL interface. + * @return pointer to read-only long property + * @throw CORBA::SystemException + */ + virtual ACS::ROlong_ptr IFs(); + + /** + * Returns a reference to the initialFrequency property implementation of the IDL interface. + * @return pointer to read-only doubleSeq property + * @throw CORBA::SystemException + */ + virtual ACS::ROdoubleSeq_ptr initialFrequency(); + + /** + * Returns a reference to the bandWidth property implementation of the IDL interface. + * @return pointer to read-only doubleSeq property + * @throw CORBA::SystemException + */ + virtual ACS::ROdoubleSeq_ptr bandWidth(); + + /** + * Returns a reference to the polarization property implementation of the IDL interface. + * @return pointer to read-only long sequence property + * @throw CORBA::SystemException + */ + virtual ACS::ROlongSeq_ptr polarization(); + + /** + * Returns a reference to the status property Implementation of IDL interface. + * @return pointer to read-only pattern property + * @throw CORBA::SystemException + */ + virtual ACS::ROpattern_ptr status(); + + /** + * Returns a reference to the vacuum property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr vacuum(); + + /** + * Returns a reference to the Vd_1 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Vd_1(); + + /** + * Returns a reference to the Vd_2 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Vd_2(); + + /** + * Returns a reference to the Id_1 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Id_1(); + + /** + * Returns a reference to the Id_2 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Id_2(); + + /** + * Returns a reference to the Vg_1 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Vg_1(); + + /** + * Returns a reference to the Vg_2 property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr Vg_2(); + + /** + * Returns a reference to the cryoTemperatureCoolHead property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr cryoTemperatureCoolHead(); + + /** + * Returns a reference to the cryoTemperatureCoolHeadWindow property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr cryoTemperatureCoolHeadWindow(); + + /** + * Returns a reference to the cryoTemperatureLNA property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr cryoTemperatureLNA(); + + /** + * Returns a reference to the cryoTemperatureLNAWindow property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr cryoTemperatureLNAWindow(); + + /** + * Returns a reference to the environmentTemperature property implementation of the IDL interface. + * @return pointer to read-only double property + * @throw CORBA::SystemException + */ + virtual ACS::ROdouble_ptr environmentTemperature(); + + /** + * Returns a reference to the status property Implementation of IDL interface. + * @return pointer to read-only ROTSystemStatus property status + * @throw CORBA::SystemException + */ + virtual Management::ROTSystemStatus_ptr receiverStatus(); + +private: + baci::SmartPropertyPointer m_plocalOscillator; + baci::SmartPropertyPointer m_pfeeds; + baci::SmartPropertyPointer m_pIFs; + baci::SmartPropertyPointer m_pinitialFrequency; + baci::SmartPropertyPointer m_pbandWidth; + baci::SmartPropertyPointer m_ppolarization; + baci::SmartPropertyPointer m_pstatus; + baci::SmartPropertyPointer m_pvacuum; + baci::SmartPropertyPointer m_pVd_1; + baci::SmartPropertyPointer m_pVd_2; + baci::SmartPropertyPointer m_pId_1; + baci::SmartPropertyPointer m_pId_2; + baci::SmartPropertyPointer m_pVg_1; + baci::SmartPropertyPointer m_pVg_2; + baci::SmartPropertyPointer m_pcryoTemperatureCoolHead; + baci::SmartPropertyPointer m_pcryoTemperatureCoolHeadWindow; + baci::SmartPropertyPointer m_pcryoTemperatureLNA; + baci::SmartPropertyPointer m_pcryoTemperatureLNAWindow; + baci::SmartPropertyPointer m_penvironmentTemperature; + baci::SmartPropertyPointer m_pmode; + baci::SmartPropertyPointer < ROEnumImpl > m_preceiverStatus; + + CComponentCore m_core; + CMonitorThread *m_monitor; +}; + + + +#endif diff --git a/SRT/Servers/SRT5GHzReceiver/src/ComponentCore.cpp b/SRT/Servers/SRT5GHzReceiver/src/ComponentCore.cpp new file mode 100644 index 000000000..ab537c8ce --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/src/ComponentCore.cpp @@ -0,0 +1,1117 @@ +#include "ComponentCore.h" +#include + +_IRA_LOGFILTER_IMPORT; + +// speed of light in meters per second +#define LIGHTSPEED 299792458.0 + +CComponentCore::CComponentCore() +{ + +} + +CComponentCore::~CComponentCore() +{ +} + +void CComponentCore::initialize(maci::ContainerServices* services) noexcept +{ + m_services=services; + m_control=NULL; + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + m_localOscillatorFault=false; + m_cryoCoolHead.temperature = 0.0; + m_cryoCoolHeadWin.temperature = 0.0; + m_cryoLNA.temperature = 0.0; + m_cryoLNAWin.temperature = 0.0; + m_environmentTemperature.temperature = 20.0; + m_vacuum=0.0; + m_calDiode=false; + m_fetValues.VDL=m_fetValues.IDL=m_fetValues.VGL=m_fetValues.VDR=m_fetValues.IDR=m_fetValues.VGR=0.0; + m_statusWord=0; + m_ioMarkError = false; +} +//throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl,ComponentErrors::SocketErrorExImpl) +CConfiguration const * const CComponentCore::execute() +{ + m_configuration.init(m_services); //throw (ComponentErrors::CDBAccessExImpl); + try { + m_control=new IRA::ReceiverControl( + (const char *)m_configuration.getDewarIPAddress(), + m_configuration.getDewarPort(), + (const char *)m_configuration.getLNAIPAddress(), + m_configuration.getLNAPort(), + m_configuration.getLNASamplingTime(), + m_configuration.getFeeds() + ); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CComponentCore::execute()"); + throw dummy; + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CComponentCore::execute()"); + throw dummy; + } + //members initialization + m_startFreq.length(m_configuration.getIFs()); + m_bandwidth.length(m_configuration.getIFs()); + m_polarization.length(m_configuration.getIFs()); + for (WORD i=0;icloseConnection(); + delete m_control; + } +} + +void CComponentCore::getLO(ACS::doubleSeq& lo) +{ + baci::ThreadSyncGuard guard(&m_mutex); + lo.length(m_configuration.getIFs()); + for (WORD i=0;iisRemoteOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::activate()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if (answer) { + _IRA_LOGFILTER_LOG(LM_NOTICE, "CComponentCore::activate()", "RECEIVER_COMMUNICATION_MODE_REMOTE"); + clearStatusBit(LOCAL); + } + else { + _IRA_LOGFILTER_LOG(LM_NOTICE, "CComponentCore::activate()", "RECEIVER_COMMUNICATION_MODE_LOCAL"); + setStatusBit(LOCAL); + } +} + + +//throw (ReceiversErrors::NoRemoteControlErrorExImpl,ComponentErrors::ValidationErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::externalCalOn() +{ + baci::ThreadSyncGuard guard(&m_mutex); + if (m_setupMode=="") { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::externalCalOn()"); + impl.setReason("receiver not configured yet"); + throw impl; + } + guard.release(); + // if (checkStatusBit(LOCAL)) { + // _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::externalCalOn()"); + // throw impl; + // } + try { + m_control->setExtCalibrationOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::externalCalOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + try { + m_control->isExtCalibrationOn() ? setStatusBit(EXTNOISEMARK) : clearStatusBit(EXTNOISEMARK); + clearStatusBit(CONNECTIONERROR); // The communication was ok so clear the CONNECTIONERROR bit + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::externalCalOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + +} + +//throw (ReceiversErrors::NoRemoteControlErrorExImpl,ComponentErrors::ValidationErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::externalCalOff() +{ + baci::ThreadSyncGuard guard(&m_mutex); + if (m_setupMode=="") { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::externalCalOff()"); + impl.setReason("receiver not configured yet"); + throw impl; + } + guard.release(); + // if (checkStatusBit(LOCAL)) { + // _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::externalCalOff()"); + // throw impl; + // } + try { + m_control->setExtCalibrationOff(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::externalCalOff()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + try { + m_control->isExtCalibrationOn() ? setStatusBit(EXTNOISEMARK) : clearStatusBit(EXTNOISEMARK); + clearStatusBit(CONNECTIONERROR); // The communication was ok so clear the CONNECTIONERROR bit + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::externalCalOff()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } +} + +// throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::deactivate() +{ + // no guard needed. + lnaOff(); // throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +} + + +//throw (ReceiversErrors::ModeErrorExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl, +// ComponentErrors::CouldntGetComponentExImpl,ComponentErrors::CORBAProblemExImpl,ReceiversErrors::LocalOscillatorErrorExImpl) +void CComponentCore::setMode(const char * mode) + { + baci::ThreadSyncGuard guard(&m_mutex); + IRA::CString cmdMode(mode); + cmdMode.MakeUpper(); + if (cmdMode!=m_configuration.getSetupMode()) { // in this case i have just one allowed mode...so no need to do many checks and settings + _EXCPT(ReceiversErrors::ModeErrorExImpl,impl,"CComponentErrors::setMode()"); + throw impl; + } + // + for (WORD i=0;isetCalibrationOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::calOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + setStatusBit(NOISEMARK); + m_calDiode=true; + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +// throw (ReceiversErrors::NoRemoteControlErrorExImpl,ComponentErrors::ValidationErrorExImpl, +// ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::calOff() +{ + baci::ThreadSyncGuard guard(&m_mutex); + if (m_setupMode=="") { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::calOff()"); + impl.setReason("receiver not configured yet"); + throw impl; + } + // guard.release(); + // if (checkStatusBit(LOCAL)) { + // _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::calOff()"); + // throw impl; + // } + try { + m_control->setCalibrationOff(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::calOff()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(NOISEMARK); + m_calDiode=false; + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +// throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::vacuumSensorOff() +{ + if (checkStatusBit(LOCAL)) { + _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::vacuumSensorOff()"); + throw impl; + } + try { + m_control->setVacuumSensorOff(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::vacuumSensorOff()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +// throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::vacuumSensorOn() +{ + if (checkStatusBit(LOCAL)) { + _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::vacuumSensorOn()"); + throw impl; + } + try { + m_control->setVacuumSensorOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::vacuumSensorOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl +void CComponentCore::lnaOff() +{ + // if (checkStatusBit(LOCAL)) { + // _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::lnaOff()"); + // throw impl; + // } + try { + m_control-> turnRightLNAsOff(); + m_control-> turnLeftLNAsOff(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::lnaOff()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl +void CComponentCore::lnaOn() +{ + // if (checkStatusBit(LOCAL)) { + // _EXCPT(ReceiversErrors::NoRemoteControlErrorExImpl,impl,"CComponentCore::lnaOn()"); + // throw impl; + // } + try { + m_control-> turnRightLNAsOn(); + m_control-> turnLeftLNAsOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::lnaOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +// throw (ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,ComponentErrors::CouldntGetComponentExImpl, +// ComponentErrors::CORBAProblemExImpl,ReceiversErrors::LocalOscillatorErrorExImpl) +void CComponentCore::setLO(const ACS::doubleSeq& lo) +{ + double trueValue,amp; + double *freq=NULL; + double *power=NULL; + DWORD size; + baci::ThreadSyncGuard guard(&m_mutex); + if (lo.length()==0) { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::setLO"); + impl.setReason("at least one value must be provided"); + throw impl; + } + // in case -1 is given we keep the current value...so nothing to do + if (lo[0]==-1) { + ACS_LOG(LM_FULL_INFO,"CComponentCore::setLO()",(LM_NOTICE,"Current local oscillator value unchanged: %lf",m_localOscillatorValue)); + return; + } + // now check if the requested value match the limits + if (lo[0]m_configuration.getLOMax()[0]) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::setLO"); + impl.setValueName("local oscillator upper limit"); + impl.setValueLimit(m_configuration.getLOMax()[0]); + throw impl; + } + //computes the synthesizer settings + trueValue=lo[0]+m_configuration.getFixedLO2()[0]; + size=m_configuration.getSynthesizerTable(freq,power); + amp=round(linearFit(freq,power,size,trueValue)); + if (power) delete [] power; + if (freq) delete [] freq; + ACS_LOG(LM_FULL_INFO,"CComponentCore::setLO()",(LM_DEBUG,"SYNTHESIZER_VALUES %lf %lf",trueValue,amp)); + // make sure the synthesizer component is available + loadLocalOscillator(); // throw (ComponentErrors::CouldntGetComponentExImpl) + try { + m_localOscillatorDevice->set(amp,trueValue); + } + catch (CORBA::SystemException& ex) { + m_localOscillatorFault=true; + _EXCPT(ComponentErrors::CORBAProblemExImpl,impl,"CComponentCore::setLO()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + throw impl; + } + catch (ReceiversErrors::ReceiversErrorsEx& ex) { + _ADD_BACKTRACE(ReceiversErrors::LocalOscillatorErrorExImpl,impl,ex,"CComponentCore::setLO()"); + throw impl; + } + // now that the local oscillator has been properly set...let's do some easy computations + m_localOscillatorValue=lo[0]; + for (WORD i=0;im_configuration.getIFBandwidth()[i]) m_bandwidth[i]=m_configuration.getIFBandwidth()[i]; + } + ACS_LOG(LM_FULL_INFO,"CComponentCore::setLO()",(LM_NOTICE,"Local Oscillator set to: %lf",m_localOscillatorValue)); +} + +//throw (ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl) +void CComponentCore::getCalibrationMark(ACS::doubleSeq& result,ACS::doubleSeq& resFreq,ACS::doubleSeq& resBw,const ACS::doubleSeq& freqs,const ACS::doubleSeq& bandwidths,const ACS::longSeq& feeds, + const ACS::longSeq& ifs,bool& onoff,double &scaleFactor) +{ + double realFreq,realBw; + double *tableLeftFreq=NULL; + double *tableLeftMark=NULL; + double *tableRightFreq=NULL; + double *tableRightMark=NULL; + DWORD sizeL=0; + DWORD sizeR=0; + baci::ThreadSyncGuard guard(&m_mutex); + if (m_setupMode=="") { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::getCalibrationMark()"); + impl.setReason("receiver not configured yet"); + throw impl; + } + //let's do some checks about input data + unsigned stdLen=freqs.length(); + if ((stdLen!=bandwidths.length()) || (stdLen!=feeds.length()) || (stdLen!=ifs.length())) { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CComponentCore::getCalibrationMark()"); + impl.setReason("sub-bands definition is not consistent"); + throw impl; + } + for (unsigned i=0;i=(long)m_configuration.getIFs()) || (ifs[i]<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getCalibrationMark()"); + impl.setValueName("IF identifier"); + throw impl; + } + } + for (unsigned i=0;i=(long)m_configuration.getFeeds()) || (feeds[i]<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getCalibrationMark()"); + impl.setValueName("feed identifier"); + throw impl; + } + } + result.length(stdLen); + resFreq.length(stdLen); + resBw.length(stdLen); + // first get the calibration mark tables + sizeL=m_configuration.getLeftMarkTable(tableLeftFreq,tableLeftMark); + sizeR=m_configuration.getRightMarkTable(tableRightFreq,tableRightMark); + for (unsigned i=0;i=(long)m_configuration.getIFs()) || (ifs[i]<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getIFOutputMark()"); + impl.setValueName("IF identifier"); + throw impl; + } + } + for (unsigned i=0;i=(long)m_configuration.getFeeds()) || (feeds[i]<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getIFOutput()"); + impl.setValueName("feed identifier"); + throw impl; + } + } + freqs.length(stdLen); + bw.length(stdLen); + pols.length(stdLen); + LO.length(stdLen); + for (unsigned i=0;i=(long)m_configuration.getIFs()) || (ifNumber<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getTaper()"); + impl.setValueName("IF identifier"); + throw impl; + } + if ((feed>=(long)m_configuration.getFeeds()) || (feed<0)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CComponentCore::getTaper()"); + impl.setValueName("feed identifier"); + throw impl; + } + // take the real observed bandwidth....the correlation between detector device and the band provided by the receiver + if (!IRA::CIRATools::skyFrequency(freq,bw,m_startFreq[ifNumber],m_bandwidth[ifNumber],realFreq,realBw)) { + realFreq=m_startFreq[ifNumber]; + realBw=0.0; + } + centralFreq=realFreq+m_localOscillatorValue+realBw/2.0; + ACS_LOG(LM_FULL_INFO,"CComponentCore::getTaper()",(LM_DEBUG,"CENTRAL_FREQUENCY %lf",centralFreq)); + waveLen=LIGHTSPEED/(centralFreq*1000000); + ACS_LOG(LM_FULL_INFO,"CComponentCore::getTaper()",(LM_DEBUG,"WAVELENGTH %lf",waveLen)); + size=m_configuration.getTaperTable(freqVec,taperVec); + taper=linearFit(freqVec,taperVec,size,centralFreq); + ACS_LOG(LM_FULL_INFO,"CComponentCore::getTaper()",(LM_DEBUG,"TAPER %lf",taper)); + if (freqVec) delete [] freqVec; + if (taperVec) delete [] taperVec; + return taper; +} + +long CComponentCore::getFeeds(ACS::doubleSeq& X,ACS::doubleSeq& Y,ACS::doubleSeq& power) noexcept +{ + DWORD size; + WORD *code; + double *xOffset; + double *yOffset; + double *rPower; + baci::ThreadSyncGuard guard(&m_mutex); + size=m_configuration.getFeedInfo(code,xOffset,yOffset,rPower); + X.length(size); + Y.length(size); + power.length(size); + for (DWORD j=0;j=m_configuration.getIFs()) { + return 0.0; + } + else if (m_polarization[ifs]==(long)Receivers::RCV_LCP) { + if (control==IRA::ReceiverControl::DRAIN_VOLTAGE) return m_fetValues.VDL; + else if (control==IRA::ReceiverControl::DRAIN_CURRENT) return m_fetValues.IDL; + else return m_fetValues.VGL; + } + else { //RCV_RCP + if (control==IRA::ReceiverControl::DRAIN_VOLTAGE) return m_fetValues.VDR; + else if (control==IRA::ReceiverControl::DRAIN_CURRENT) return m_fetValues.IDR; + else return m_fetValues.VGR; + } +} + +//throw (ComponentErrors::CORBAProblemExImpl,ComponentErrors::CouldntGetAttributeExImpl) +void CComponentCore::checkLocalOscillator() +{ + baci::ThreadSyncGuard guard(&m_mutex); + if (m_setupMode=="") { // if the receiver is not configured the check makes no sense + return; + } + // make sure the synthesizer component is available + loadLocalOscillator(); // throw (ComponentErrors::CouldntGetComponentExImpl) + ACSErr::Completion_var comp; + ACS::ROlong_var isLockedRef; + CORBA::Long isLocked; + try { + isLockedRef=m_localOscillatorDevice->isLocked(); + } + catch (CORBA::SystemException& ex) { + m_localOscillatorFault=true; + _EXCPT(ComponentErrors::CORBAProblemExImpl,impl,"CComponentCore::checkLocalOscillator()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + throw impl; + } + isLocked=isLockedRef->get_sync(comp.out()); + ACSErr::CompletionImpl complImpl(comp); + if (!complImpl.isErrorFree()) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetAttributeExImpl,impl,complImpl,"CComponentCore::checkLocalOscillator()"); + impl.setAttributeName("isLocked"); + impl.setComponentName((const char *)m_configuration.getLocalOscillatorInstance()); + throw impl; + } + if (!isLocked) setStatusBit(UNLOCKED); + else clearStatusBit(UNLOCKED); +} + +void CComponentCore::updateComponent() +{ + baci::ThreadSyncGuard guard(&m_mutex); + m_componentStatus=Management::MNG_OK; + // if (checkStatusBit(LOCAL)) { + // setComponentStatus(Management::MNG_FAILURE); + // _IRA_LOGFILTER_LOG(LM_CRITICAL,"CComponentCore::updateComponent()","RECEIVER_NOT_REMOTELY_CONTROLLABLE"); + // } + if (checkStatusBit(VACUUMPUMPFAULT)) { + setComponentStatus(Management::MNG_WARNING); + _IRA_LOGFILTER_LOG(LM_WARNING,"CComponentCore::updateComponent()","VACUUM_PUMP_FAILURE"); + } + if (checkStatusBit(NOISEMARKERROR)) { + setComponentStatus(Management::MNG_FAILURE); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CComponentCore::updateComponent()","NOISE_MARK_ERROR"); + } + if (checkStatusBit(CONNECTIONERROR)) { + setComponentStatus(Management::MNG_FAILURE); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CComponentCore::updateComponent()","RECEIVER_CONNECTION_ERROR"); + } + if (checkStatusBit(UNLOCKED)) { + setComponentStatus(Management::MNG_FAILURE); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CComponentCore::updateComponent()","LOCAL_OSCILLATOR_NOT_LOCKED"); + } +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateVacuum() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + bool vacuumSensor; + try { + vacuumSensor=m_control->isVacuumSensorOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateVacuum()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if (vacuumSensor) { + try { + m_vacuum=m_control->vacuum(CComponentCore::voltage2mbar); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateVacuum()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + } + else { + m_vacuum=m_vacuumDefault; + } + if (!vacuumSensor) setStatusBit(VACUUMSENSOR); + else clearStatusBit(VACUUMSENSOR); + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateVacuumPump() +{ + bool answer; + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + answer=m_control->isVacuumPumpOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateVacuumPump()"); + impl.setDetails(ex.what().c_str()); + baci::ThreadSyncGuard guard(&m_mutex); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if (!answer) setStatusBit(VACUUMPUMPSTATUS); + else clearStatusBit(VACUUMPUMPSTATUS); + //**********************************************************************************/ + // VACUUM PUMP FAULT MISSING (VACUUMPUMPFAULT) + //************************************************************************************ + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateNoiseMark() +{ + bool answer; + baci::ThreadSyncGuard guard(&m_mutex); + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + answer=m_control->isCalibrationOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateNoiseMark()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if(answer!=checkStatusBit(NOISEMARK)) { + if(m_ioMarkError) { + setStatusBit(NOISEMARKERROR); + } + else { + m_ioMarkError = true; + } + } + else { + clearStatusBit(NOISEMARKERROR); + m_ioMarkError = false; + } + //*********************************************************************************************/ + // EXTNOISEMARK is missing + /**********************************************************************************************/ + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateVacuumValve() +{ + bool answer; + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + answer=m_control->isVacuumValveOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateVacuumValve()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if (!answer) setStatusBit(VACUUMVALVEOPEN); + else clearStatusBit(VACUUMVALVEOPEN); + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateIsRemote() +{ + bool answer; + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + answer=m_control->isRemoteOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateIsRemote()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + + if (checkStatusBit(LOCAL) && answer) { + _IRA_LOGFILTER_LOG( + LM_NOTICE, + "CComponentCore::updateIsRemote()", + "RECEIVER_SWITCHED_FROM_LOCAL_TO_REMOTE" + ); + } + else if (!checkStatusBit(LOCAL) && !answer) { + _IRA_LOGFILTER_LOG( + LM_NOTICE, + "CComponentCore::updateIsRemote()", + "RECEIVER_SWITCHED_FROM_REMOTE_TO_LOCAL" + ); + } + + if (!answer) setStatusBit(LOCAL); + else clearStatusBit(LOCAL); + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateCoolHead() +{ + bool answer; + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + answer=m_control->isCoolHeadOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCoolHead()->isCoolHeadOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if (!answer) { + setStatusBit(COOLHEADON); + try { + answer=m_control->isCoolHeadSetOn(); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCoolHead() - isCoolHeadSetOn()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + if(!answer) + setStatusBit(COMPRESSORFAULT); + else + clearStatusBit(COMPRESSORFAULT); + } + else + clearStatusBit(COOLHEADON); + + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateCryoCoolHead() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_cryoCoolHead.temperature = m_control->cryoTemperature(0,CComponentCore::voltage2Kelvin); + m_cryoCoolHead.timestamp = getTimeStamp(); + } + catch (IRA::ReceiverControlEx& ex) { + m_cryoCoolHead.temperature = CEDUMMY; + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoCoolHead()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateCryoCoolHeadWin() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_cryoCoolHeadWin.temperature = m_control->cryoTemperature(1,CComponentCore::voltage2Kelvin); + m_cryoCoolHeadWin.timestamp = getTimeStamp(); + } + catch (IRA::ReceiverControlEx& ex) { + m_cryoCoolHeadWin.temperature = CEDUMMY; + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoCoolHeadWin()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +// throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateCryoLNA() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_cryoLNA.temperature = m_control->cryoTemperature(3,CComponentCore::voltage2Kelvin); + m_cryoLNA.timestamp = getTimeStamp(); + } + catch (IRA::ReceiverControlEx& ex) { + m_cryoLNA.temperature = CEDUMMY; + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoLNA()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateCryoLNAWin() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_cryoLNAWin.temperature = m_control->cryoTemperature(4,CComponentCore::voltage2Kelvin); + m_cryoLNAWin.timestamp = getTimeStamp(); + } + catch (IRA::ReceiverControlEx& ex) { + m_cryoLNAWin.temperature = CEDUMMY; + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoLNAWin()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateEnvironmentTemperature() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_environmentTemperature.temperature = m_control->vertexTemperature(CComponentCore::voltage2Celsius); + m_environmentTemperature.timestamp = getTimeStamp(); + } + catch (IRA::ReceiverControlEx& ex) { + m_environmentTemperature.temperature = CEDUMMY; + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateEnvironmentTemperature()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ReceiversErrors::ReceiverControlBoardErrorExImpl) +void CComponentCore::updateLNAControls() +{ + // not under the mutex protection because the m_control object is thread safe (at the micro controller board stage) + try { + m_fetValues=m_control->fetValues(0,1,CComponentCore::currentConverter, CComponentCore::voltageConverter); + } + catch (IRA::ReceiverControlEx& ex) { + _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoLNAWin()"); + impl.setDetails(ex.what().c_str()); + setStatusBit(CONNECTIONERROR); + throw impl; + } + clearStatusBit(CONNECTIONERROR); // the communication was ok so clear the CONNECTIONERROR bit +} + +//throw (ComponentErrors::CouldntGetComponentExImpl) +void CComponentCore::loadLocalOscillator() +{ + if ((!CORBA::is_nil(m_localOscillatorDevice)) && (m_localOscillatorFault)) { // if reference was already taken, but an error was found....dispose the reference + try { + m_services->releaseComponent((const char*)m_localOscillatorDevice->name()); + } + catch (...) { //dispose silently...if an error...no matter + } + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + } + if (CORBA::is_nil(m_localOscillatorDevice)) { //only if it has not been retrieved yet + try { + m_localOscillatorDevice=m_services->getComponent((const char*)m_configuration.getLocalOscillatorInstance()); + ACS_LOG(LM_FULL_INFO,"CCore::loadLocalOscillator()",(LM_INFO,"LOCAL_OSCILLATOR_OBTAINED")); + m_localOscillatorFault=false; + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CComponentCore::loadLocalOscillator()"); + Impl.setComponentName((const char*)m_configuration.getLocalOscillatorInstance()); + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + throw Impl; + } + catch (maciErrType::NoPermissionExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CComponentCore::loadLocalOscillator()"); + Impl.setComponentName((const char*)m_configuration.getLocalOscillatorInstance()); + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + throw Impl; + } + catch (maciErrType::NoDefaultComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CComponentCore::loadLocalOscillator()"); + Impl.setComponentName((const char*)m_configuration.getLocalOscillatorInstance()); + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + throw Impl; + } + } +} + +void CComponentCore::unloadLocalOscillator() noexcept +{ + if (!CORBA::is_nil(m_localOscillatorDevice)) { + try { + m_services->releaseComponent((const char*)m_localOscillatorDevice->name()); + } + catch (maciErrType::CannotReleaseComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntReleaseComponentExImpl,Impl,ex,"CComponentCore::unloadLocalOscillator()"); + Impl.setComponentName((const char *)m_configuration.getLocalOscillatorInstance()); + Impl.log(LM_WARNING); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CComponentCore::unloadLocalOscillator()"); + impl.log(LM_WARNING); + } + m_localOscillatorDevice=Receivers::LocalOscillator::_nil(); + } +} + +double CComponentCore::linearFit(double *X,double *Y,const WORD& size,double x) noexcept +{ + int low=-1,high=-1; + for (WORD j=0;jX[j]) { // X value is lower + if (low==-1) low=j; + else if (X[j]>X[low]) low=j; + } + } + if ((high!=-1) && (low!=-1)) { + double slope=X[low]-X[high]; + return ((x-X[high])/slope)*Y[low]-((x-X[low])/slope)*Y[high]; + } + else if (high==-1) { + return Y[low]; + } + else if (low==-1) { + return Y[high]; + } + else return 0.0; //this will never happen if size!=0 +} diff --git a/SRT/Servers/SRT5GHzReceiver/src/Configuration.cpp b/SRT/Servers/SRT5GHzReceiver/src/Configuration.cpp new file mode 100644 index 000000000..0946a3034 --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/src/Configuration.cpp @@ -0,0 +1,523 @@ + +#include "Configuration.h" + +using namespace IRA; + +#define _GET_DOUBLE_ATTRIBUTE(ATTRIB,DESCR,FIELD,NAME) { \ + double tmpd; \ + if (!CIRATools::getDBValue(Services,ATTRIB,tmpd,"alma/",NAME)) { \ + _EXCPT(ComponentErrors::CDBAccessExImpl,dummy,"CConfiguration::Init()"); \ + dummy.setFieldName(ATTRIB); \ + throw dummy; \ + } \ + else { \ + FIELD=tmpd; \ + ACS_DEBUG_PARAM("CConfiguration::Init()",DESCR" %lf",tmpd); \ + } \ +} + +#define _GET_DWORD_ATTRIBUTE(ATTRIB,DESCR,FIELD,NAME) { \ + DWORD tmpw; \ + if (!CIRATools::getDBValue(Services,ATTRIB,tmpw,"alma/",NAME)) { \ + _EXCPT(ComponentErrors::CDBAccessExImpl,dummy,"CConfiguration::Init()"); \ + dummy.setFieldName(ATTRIB); \ + throw dummy; \ + } \ + else { \ + FIELD=tmpw; \ + ACS_DEBUG_PARAM("CConfiguration::Init()",DESCR" %u",tmpw); \ + } \ +} + +#define _GET_STRING_ATTRIBUTE(ATTRIB,DESCR,FIELD,NAME) { \ + CString tmps; \ + if (!CIRATools::getDBValue(Services,ATTRIB,tmps,"alma/",NAME)) { \ + _EXCPT(ComponentErrors::CDBAccessExImpl,dummy,"::CConfiguration::Init()"); \ + dummy.setFieldName(ATTRIB); \ + throw dummy; \ + } \ + else { \ + FIELD=tmps; \ + ACS_DEBUG_PARAM("CConfiguration::Init()",DESCR" %s",(const char*)tmps); \ + } \ +} + +#define CONFIG_PATH "DataBlock/SRT5GHzReceiver" +#define LOTABLE_PATH CONFIG_PATH"/Synthesizer" +#define MARKTABLE_PATH CONFIG_PATH"/NoiseMark" +#define NORMALMODE_PATH CONFIG_PATH"/NormalModeSetup" +#define FEEDTABLE_PATH CONFIG_PATH"/Feeds" +#define TAPERTABLE_PATH CONFIG_PATH"/Taper" + + +CConfiguration::CConfiguration() +{ + m_markTable=m_loTable=NULL; + m_markVector=NULL; + m_markVectorLen=0; + m_loTable=NULL; + m_loVector=NULL; + m_loVectorLen=0; + m_polarizations=NULL; + m_feedsTable=NULL; + m_feedVector=NULL; + m_taperTable=NULL; + m_taperVector=NULL; + m_taperVectorLen=0; + m_RFMin=m_RFMax=m_IFMin=m_IFBandwidth=m_defaultLO=m_fixedLO2=m_LOMin=m_LOMax=NULL; +} + +CConfiguration::~CConfiguration() +{ + if (m_markTable) { + delete m_markTable; + } + if (m_loTable) { + delete m_loTable; + } + if (m_feedsTable) { + delete m_feedsTable; + } + if (m_taperTable) { + delete m_taperTable; + } + if (m_markVector) { + delete [] m_markVector; + } + if (m_loVector) { + delete [] m_loVector; + } + if (m_taperVector) { + delete [] m_taperVector; + } + if (m_polarizations) { + delete [] m_polarizations; + } + if (m_feedVector) { + delete [] m_feedVector; + } + if (m_RFMin) { + delete [] m_RFMin; + } + if (m_RFMax) { + delete [] m_RFMax; + } + if (m_IFMin) { + delete [] m_IFMin; + } + if (m_IFBandwidth) { + delete [] m_IFBandwidth; + } + if (m_defaultLO) { + delete [] m_defaultLO; + } + if (m_fixedLO2) { + delete [] m_fixedLO2; + } + if (m_LOMin) { + delete [] m_LOMin; + } + if (m_LOMax) { + delete [] m_LOMax; + } +} +// throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl) +void CConfiguration::init(maci::ContainerServices *Services) +{ + IRA::CError error; + IRA::CString field,value,token; + WORD len; + int start=0; + // read component configuration + _GET_STRING_ATTRIBUTE("DewarIPAddress","Dewar IP address:",m_dewarIPAddress,""); + _GET_STRING_ATTRIBUTE("LNAIPAddress","LNA IP address:",m_LNAIPAddress,""); + _GET_STRING_ATTRIBUTE("LocalOscillatorInstance","Local oscillator instance:",m_localOscillatorInstance,""); + _GET_DWORD_ATTRIBUTE("DewarPort","Dewar port:",m_dewarPort,""); + _GET_DWORD_ATTRIBUTE("LNAPort","LNA port:",m_LNAPort,""); + _GET_DWORD_ATTRIBUTE("WatchDogResponseTime","Response time of watch dog thread (uSec):",m_watchDogResponseTime,""); + _GET_DWORD_ATTRIBUTE("WatchDogSleepTime","Sleep time of the watch dog thread (uSec):",m_watchDogSleepTime,""); + _GET_DWORD_ATTRIBUTE("LNASamplingTime","Time needed to collect LNA information from control boards (uSec):",m_LNASamplingTime,""); + _GET_DWORD_ATTRIBUTE("RepetitionCacheTime","Log repetition filter, caching time (uSec):",m_repetitionCacheTime,""); + _GET_DWORD_ATTRIBUTE("RepetitionExpireTime","Log repetition filter, expire time (uSec):",m_repetitionExpireTime,""); + _GET_STRING_ATTRIBUTE("LocalOscillatorInstance","Local oscillator instance:",m_localOscillatorInstance,""); + // now read the receiver configuration + _GET_STRING_ATTRIBUTE("Mode","mode name:",m_mode,NORMALMODE_PATH); + _GET_DWORD_ATTRIBUTE("Feeds","Number of feeds:",m_feeds,NORMALMODE_PATH); + _GET_DWORD_ATTRIBUTE("IFs","Number of IFs per feed:",m_IFs,NORMALMODE_PATH); + try { + m_polarizations=new Receivers::TPolarization[m_IFs]; + m_RFMin=new double[m_IFs]; + m_RFMax=new double[m_IFs]; + m_IFMin=new double[m_IFs]; + m_IFBandwidth=new double[m_IFs]; + m_defaultLO=new double[m_IFs]; + m_fixedLO2=new double[m_IFs]; + m_LOMin=new double[m_IFs]; + m_LOMax=new double[m_IFs]; + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + _GET_STRING_ATTRIBUTE("Polarization","IF polarization:",value,NORMALMODE_PATH); + start=0; + for (WORD k=0;kaddField(error,"Polarization",IRA::CDataField::STRING)) { + field="Polarization"; + } + else if (!m_markTable->addField(error,"SkyFrequency",IRA::CDataField::DOUBLE)) { + field="SkyFrequency"; + } + else if (!m_markTable->addField(error,"NoiseMark",IRA::CDataField::DOUBLE)) { + field="NoiseMark"; + } + if (!error.isNoError()) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl,dummy,error); + dummy.setFieldName((const char *)field); + throw dummy; + } + if (!m_markTable->openTable(error)) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + m_markTable->First(); + len=m_markTable->recordCount(); + try { + m_markVector=new TMarkValue[len]; + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"MARK_VALUE_ENTRY_NUMBER: %d",len)); + for (WORD i=0;iasDouble(); + m_markVector[i].markValue=(*m_markTable)["NoiseMark"]->asDouble(); + m_markVector[i].polarization=(*m_markTable)["Polarization"]->asString()=="LEFT"?Receivers::RCV_LCP:Receivers::RCV_RCP; + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"MARK_VALUE_ENTRY: %d %lf %lf",m_markVector[i].polarization,m_markVector[i].skyFrequency, + m_markVector[i].markValue)); + m_markTable->Next(); + } + m_markVectorLen=len; + m_markTable->closeTable(); + delete m_markTable; + m_markTable=NULL; + // The synthesizer + try { + m_loTable=new IRA::CDBTable(Services,"SynthesizerEntry",LOTABLE_PATH); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + error.Reset(); + if (!m_loTable->addField(error,"Frequency",IRA::CDataField::DOUBLE)) { + field="Frequency"; + } + else if (!m_loTable->addField(error,"OutputPower",IRA::CDataField::DOUBLE)) { + field="OutputPower"; + } + if (!error.isNoError()) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl,dummy,error); + dummy.setFieldName((const char *)field); + throw dummy; + } + if (!m_loTable->openTable(error)) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + m_loTable->First(); + len=m_loTable->recordCount(); + try { + m_loVector=new TLOValue[len]; + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"SYNTH_VALUE_ENTRY_NUMBER: %d",len)); + for (WORD i=0;iasDouble(); + m_loVector[i].outputPower=(*m_loTable)["OutputPower"]->asDouble(); + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"SYNTH_VALUE_ENTRY: %lf %lf",m_loVector[i].frequency,m_loVector[i].outputPower)); + m_loTable->Next(); + } + m_loVectorLen=len; + m_loTable->closeTable(); + delete m_loTable; + m_loTable=NULL; + // The feeds + try { + m_feedsTable=new IRA::CDBTable(Services,"Feed",FEEDTABLE_PATH); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + error.Reset(); + if (!m_feedsTable->addField(error,"feedCode",IRA::CDataField::LONGLONG)) { + field="feedCode"; + } + else if (!m_feedsTable->addField(error,"xOffset",IRA::CDataField::DOUBLE)) { + field="xOffset"; + } + else if (!m_feedsTable->addField(error,"yOffset",IRA::CDataField::DOUBLE)) { + field="yOffset"; + } + else if (!m_feedsTable->addField(error,"relativePower",IRA::CDataField::DOUBLE)) { + field="relativePower"; + } + if (!error.isNoError()) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl,dummy,error); + dummy.setFieldName((const char *)field); + throw dummy; + } + if (!m_feedsTable->openTable(error)) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + m_feedsTable->First(); + if (m_feeds!=m_feedsTable->recordCount()) { + _EXCPT(ComponentErrors::CDBAccessExImpl, dummy, "CConfiguration::init()"); + dummy.setFieldName("feed table size"); + throw dummy; + } + len=m_feeds; + try { + m_feedVector=new TFeedValue[len]; + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + for (WORD i=0;iasDouble(); + m_feedVector[i].yOffset=(*m_feedsTable)["yOffset"]->asDouble(); + m_feedVector[i].relativePower=(*m_feedsTable)["relativePower"]->asDouble(); + m_feedVector[i].code=(WORD)(*m_feedsTable)["feedCode"]->asLongLong(); + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"FEED_VALUE_ENTRY: %d %lf %lf %lf",m_feedVector[i].code,m_feedVector[i].xOffset,m_feedVector[i].yOffset,m_feedVector[i].relativePower)); + m_feedsTable->Next(); + } + m_feedsTable->closeTable(); + delete m_feedsTable; + m_feedsTable=NULL; + //The taper..... + try { + m_taperTable=new IRA::CDBTable(Services,"TaperEntry",TAPERTABLE_PATH); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + error.Reset(); + if (!m_taperTable->addField(error,"Frequency",IRA::CDataField::DOUBLE)) { + field="Frequency"; + } + else if (!m_taperTable->addField(error,"Taper",IRA::CDataField::DOUBLE)) { + field="OutputPower"; + } + if (!error.isNoError()) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl,dummy,error); + dummy.setFieldName((const char *)field); + throw dummy; + } + if (!m_taperTable->openTable(error)) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + m_taperTable->First(); + len=m_taperTable->recordCount(); + try { + m_taperVector=new TTaperValue[len]; + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"CConfiguration::init()"); + throw dummy; + } + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"TAPER_ENTRY_NUMBER: %d",len)); + for (WORD i=0;iasDouble(); + m_taperVector[i].taper=(*m_taperTable)["Taper"]->asDouble(); + ACS_LOG(LM_FULL_INFO,"CConfiguration::init()",(LM_DEBUG,"SYNTH_VALUE_ENTRY: %lf %lf",m_taperVector[i].frequency,m_taperVector[i].taper)); + m_taperTable->Next(); + } + m_taperVectorLen=len; + m_taperTable->closeTable(); + delete m_taperTable; + m_taperTable=NULL; +} + +DWORD CConfiguration::getSynthesizerTable(double * &freq,double *&power) const +{ + freq= new double [m_loVectorLen]; + power=new double [m_loVectorLen]; + for (DWORD j=0;j +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = SRT5GHzImpl +LIBRARIES_L = + +# +# +SRT5GHzImpl_OBJECTS = Configuration SRT5GHzImpl ComponentCore MonitorThread +SRT5GHzImpl_LIBS = IRALibrary ComponentErrors ManagementErrors ReceiversErrors CommonReceiverInterfaceStubs GenericReceiverStubs SRT5GHzStubs \ + LocalOscillatorInterfaceStubs ReceiversDefinitionsStubs ManagmentDefinitionsStubs + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = SRT5GHzReceiver + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/SRT/Servers/SRT5GHzReceiver/src/MonitorThread.cpp b/SRT/Servers/SRT5GHzReceiver/src/MonitorThread.cpp new file mode 100644 index 000000000..f7cd32f3a --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/src/MonitorThread.cpp @@ -0,0 +1,199 @@ +#include "MonitorThread.h" +#include + +_IRA_LOGFILTER_IMPORT; + +CMonitorThread::CMonitorThread(const ACE_CString& name,CComponentCore *param, + const ACS::TimeInterval& responseTime,const ACS::TimeInterval& sleepTime) : ACS::Thread(name,responseTime,sleepTime), m_core(param) +{ + AUTO_TRACE("CMonitorThread::CMonitorThread()"); + m_core=param; +} + +CMonitorThread::~CMonitorThread() +{ + AUTO_TRACE("CMonitorThread::~CMonitorThread()"); +} + +void CMonitorThread::onStart() +{ + AUTO_TRACE("CMonitorThread::onStart()"); + m_currentStage=VACUUM; +} + + void CMonitorThread::onStop() +{ + AUTO_TRACE("CMonitorThread::onStop()"); +} + + void CMonitorThread::setLNASamplingTime(const DDWORD& time) +{ + m_currentResponseTime=getResponseTime(); + m_currentSampling=time*10; // uSec to 100 nanoSec + if (m_currentResponseTime(m_currentResponseTime)/10 + ) + ); + setResponseTime(m_currentResponseTime); + } +} + + void CMonitorThread::runLoop() +{ + m_core->updateComponent(); + switch( m_currentStage) { + case VACUUM: { + m_currentStage=STATUS; + try { + m_core->updateVacuum(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case STATUS: { + m_currentStage=LNA; + break; + } + case LNA: { + try { + m_core->updateLNAControls(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + m_currentStage=CTEMPCOOLHEAD; + break; + } + case CTEMPCOOLHEAD: { + m_currentStage=CTEMPCOOLHEADW; + try { + m_core->updateCryoCoolHead(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case CTEMPCOOLHEADW: { + m_currentStage=CTEMPLNA; + try { + m_core->updateCryoCoolHeadWin(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case CTEMPLNA: { + m_currentStage=CTEMPLNAW; + try { + m_core->updateCryoLNA(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case CTEMPLNAW: { + m_currentStage=ENVTEMP; + try { + m_core->updateCryoLNAWin(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case ENVTEMP: { + m_currentStage=REMOTE; + try { + m_core->updateEnvironmentTemperature(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case REMOTE: { + m_currentStage=COOLHEAD; + try { + m_core->updateIsRemote(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case COOLHEAD: { + m_currentStage=VACUUMPUMP; + try { + m_core->updateCoolHead(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case VACUUMPUMP: { + m_currentStage=VACUUMVALVE; + try { + m_core->updateVacuumPump(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case VACUUMVALVE: { + m_currentStage=NOISEMARK; + try { + m_core->updateVacuumValve(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case NOISEMARK: { + m_currentStage=UNLOCKED; + try { + m_core->updateNoiseMark(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + case UNLOCKED: { + m_currentStage=VACUUM; + try { + m_core->checkLocalOscillator(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,impl,ex,"CMonitorThread::runLoop"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + break; + } + } +} diff --git a/SRT/Servers/SRT5GHzReceiver/src/SRT5GHzImpl.cpp b/SRT/Servers/SRT5GHzReceiver/src/SRT5GHzImpl.cpp new file mode 100644 index 000000000..14ced49fa --- /dev/null +++ b/SRT/Servers/SRT5GHzReceiver/src/SRT5GHzImpl.cpp @@ -0,0 +1,581 @@ +#include "SRT5GHzImpl.h" +#include "DevIOBandWidth.h" +#include "DevIOInitialFrequency.h" +#include "DevIOLocalOscillator.h" +#include "DevIOPolarization.h" +#include "DevIOMode.h" +#include "DevIOVacuum.h" +#include "DevIOCryoTemperatureCoolHead.h" +#include "DevIOCryoTemperatureCoolHeadWindow.h" +#include "DevIOCryoTemperatureLNA.h" +#include "DevIOCryoTemperatureLNAWindow.h" +#include "DevIOEnvTemperature.h" +#include "DevIOLNAControls.h" +#include "DevIOStatus.h" +#include "DevIOComponentStatus.h" +#include + + +_IRA_LOGFILTER_DECLARE; + +SRT5GHzImpl::SRT5GHzImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices) : + CharacteristicComponentImpl(CompName,containerServices), + m_plocalOscillator(this), + m_pfeeds(this), + m_pIFs(this), + m_pinitialFrequency(this), + m_pbandWidth(this), + m_ppolarization(this), + m_pstatus(this), + m_pvacuum(this), + m_pVd_1(this), + m_pVd_2(this), + m_pId_1(this), + m_pId_2(this), + m_pVg_1(this), + m_pVg_2(this), + m_pcryoTemperatureCoolHead(this), + m_pcryoTemperatureCoolHeadWindow(this), + m_pcryoTemperatureLNA(this), + m_pcryoTemperatureLNAWindow(this), + m_penvironmentTemperature(this), + m_pmode(this), + m_preceiverStatus(this) +{ + AUTO_TRACE("SRT5GHzImpl::SRT5GHzImpl()"); +} + +SRT5GHzImpl::~SRT5GHzImpl() +{ + AUTO_TRACE("SRT5GHzImpl::~SRT5GHzImpl()"); +} + +//throw (ACSErr::ACSbaseExImpl) +void SRT5GHzImpl::initialize() +{ + AUTO_TRACE("SRT5GHzImpl::initialize()"); + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZING")); + m_core.initialize(getContainerServices()); + m_monitor=NULL; + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZED")); +} + +//throw (ACSErr::ACSbaseExImpl) +void SRT5GHzImpl::execute() +{ + AUTO_TRACE("SRT5GHzImpl::execute()"); + ACS::Time timestamp; + const CConfiguration *config=m_core.execute(); //throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl,ComponentErrors::SocketErrorExImpl) + + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::execute()",(LM_INFO,"ACTIVATING_LOG_REPETITION_FILTER")); + _IRA_LOGFILTER_ACTIVATE(config->getRepetitionCacheTime(),config->getRepetitionExpireTime()); + + try { + m_plocalOscillator=new baci::ROdoubleSeq(getContainerServices()->getName()+":LO",getComponent(),new DevIOLocalOscillator(&m_core),true); + m_ppolarization=new baci::ROlongSeq(getContainerServices()->getName()+":polarization",getComponent(),new DevIOPolarization(&m_core),true); + m_pmode=new baci::ROstring(getContainerServices()->getName()+":mode",getComponent(),new DevIOMode(&m_core),true); + m_pinitialFrequency=new baci::ROdoubleSeq(getContainerServices()->getName()+":initialFrequency",getComponent(),new DevIOInitialFrequency(&m_core),true); + m_pbandWidth=new baci::ROdoubleSeq(getContainerServices()->getName()+":bandWidth",getComponent(),new DevIOBandWidth(&m_core),true); + m_pIFs=new baci::ROlong(getContainerServices()->getName()+":IFs",getComponent()); + m_pfeeds=new baci::ROlong(getContainerServices()->getName()+":feeds",getComponent()); + m_pvacuum=new baci::ROdouble(getContainerServices()->getName()+":vacuum",getComponent(),new DevIOVacuum(&m_core),true); + m_pVd_1=new baci::ROdouble(getContainerServices()->getName()+":Vd_1",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::DRAIN_VOLTAGE,0),true); + m_pVd_2=new baci::ROdouble(getContainerServices()->getName()+":Vd_2",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::DRAIN_VOLTAGE,1),true); + m_pId_1=new baci::ROdouble(getContainerServices()->getName()+":Id_1",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::DRAIN_CURRENT,0),true); + m_pId_2=new baci::ROdouble(getContainerServices()->getName()+":Id_2",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::DRAIN_CURRENT,1),true); + m_pVg_1=new baci::ROdouble(getContainerServices()->getName()+":Vg_1",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::GATE_VOLTAGE,0),true); + m_pVg_2=new baci::ROdouble(getContainerServices()->getName()+":Vg_2",getComponent(), + new DevIOLNAControls(&m_core,IRA::ReceiverControl::GATE_VOLTAGE,1),true); + m_pcryoTemperatureCoolHead=new baci::ROdouble(getContainerServices()->getName()+":cryoTemperatureCoolHead",getComponent(), + new DevIOCryoTemperatureCoolHead(&m_core),true); + m_pcryoTemperatureCoolHeadWindow=new baci::ROdouble(getContainerServices()->getName()+":cryoTemperatureCoolHeadWindow",getComponent(), + new DevIOCryoTemperatureCoolHeadWin(&m_core),true); + m_pcryoTemperatureLNA=new baci::ROdouble(getContainerServices()->getName()+":cryoTemperatureLNA",getComponent(), + new DevIOCryoTemperatureLNA(&m_core),true); + m_pcryoTemperatureLNAWindow=new baci::ROdouble(getContainerServices()->getName()+":cryoTemperatureLNAWindow",getComponent(), + new DevIOCryoTemperatureLNAWin(&m_core),true); + m_penvironmentTemperature=new baci::ROdouble(getContainerServices()->getName()+":environmentTemperature",getComponent()); + // new DevIOEnvTemperature(&m_core),true); // Is there a sensor? + m_pstatus=new baci::ROpattern(getContainerServices()->getName()+":status",getComponent(), + new DevIOStatus(&m_core),true); + m_preceiverStatus=new ROEnumImpl + (getContainerServices()->getName()+":receiverStatus",getComponent(),new DevIOComponentStatus(&m_core),true); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SRT5GHzImpl::initialize()"); + throw dummy; + } + + // write some fixed values + m_pfeeds->getDevIO()->write(m_core.getFeeds(),timestamp); + m_pIFs->getDevIO()->write(m_core.getIFs(),timestamp); + m_core.setVacuumDefault(m_pvacuum->default_value()); + + CComponentCore *temp=&m_core; + try { + m_monitor=getContainerServices()->getThreadManager()->create ( + "WHATCHDOG5GHZ",temp,config->getWarchDogResponseTime()*10,config->getWatchDogSleepTime()*10); + } + catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SRT5GHzImpl::execute()"); + throw _dummy; + } + catch (...) { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SRT5GHzImpl::execute()"); + } + m_monitor->setLNASamplingTime(config->getLNASamplingTime()); + m_monitor->resume(); + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::execute()",(LM_INFO,"WATCH_DOG_SPAWNED")); + try { + startPropertiesMonitoring(); + } + catch (acsthreadErrType::CanNotStartThreadExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SRT5GHzImpl::execute()"); + throw __dummy; + } + catch (ACSErrTypeCommon::NullPointerExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SRT5GHzImpl::execute()"); + throw __dummy; + } + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::execute()",(LM_INFO,"COMPSTATE_OPERATIONAL")); +} + +void SRT5GHzImpl::cleanUp() +{ + AUTO_TRACE("SRT5GHzImpl::cleanUp()"); + stopPropertiesMonitoring(); + if (m_monitor!=NULL) { + m_monitor->suspend(); + getContainerServices()->getThreadManager()->destroy(m_monitor); + m_monitor=NULL; + } + m_core.cleanup(); + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; + CharacteristicComponentImpl::cleanUp(); +} + +void SRT5GHzImpl::aboutToAbort() +{ + AUTO_TRACE("SRT5GHzImpl::aboutToAbort()"); + if (m_monitor!=NULL) { + getContainerServices()->getThreadManager()->destroy(m_monitor); + } + m_core.cleanup(); +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::activate(const char * setup_mode) +{ + try { + m_core.activate(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::activate()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::deactivate() +{ + try { + m_core.deactivate(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::deactivate()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::calOn() +{ + try { + m_core.calOn(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::calOn()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::calOff() +{ + try { + m_core.calOff(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::calOff()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::externalCalOn() +{ + try { + m_core.externalCalOn(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl, impl, "SRT5GHzImpl::externalCalOn()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::externalCalOff() +{ + try { + m_core.externalCalOff(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl, impl, "SRT5GHzImpl::externalCalOff()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::setLO(const ACS::doubleSeq& lo) +{ + try { + m_core.setLO(lo); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::setLO()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::setMode(const char * mode) +{ + try { + m_core.setMode(mode); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::setMode()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +ACS::doubleSeq *SRT5GHzImpl::getCalibrationMark(const ACS::doubleSeq& freqs, const ACS::doubleSeq& bandwidths, const ACS::longSeq& feeds,const ACS::longSeq& ifs, + ACS::doubleSeq_out skyFreq,ACS::doubleSeq_out skyBw,CORBA::Boolean_out onoff,CORBA::Double_out scaleFactor) +{ + ACS::doubleSeq_var result=new ACS::doubleSeq; + ACS::doubleSeq_var resFreq=new ACS::doubleSeq; + ACS::doubleSeq_var resBw=new ACS::doubleSeq; + try { + m_core.getCalibrationMark(result.inout(),resFreq.inout(),resBw.inout(),freqs,bandwidths,feeds,ifs,onoff,scaleFactor); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::getCalibrationMark()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } + skyFreq=resFreq._retn(); + skyBw=resBw._retn(); + return result._retn(); +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +CORBA::Long SRT5GHzImpl::getFeeds(ACS::doubleSeq_out X,ACS::doubleSeq_out Y,ACS::doubleSeq_out power) +{ + ACS::doubleSeq_var tempX=new ACS::doubleSeq; + ACS::doubleSeq_var tempY=new ACS::doubleSeq; + ACS::doubleSeq_var tempPower=new ACS::doubleSeq; + long res; + try { + res=m_core.getFeeds(tempX.inout(),tempY.inout(),tempPower.inout()); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::getFeeds()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } + X=tempX._retn(); + Y=tempY._retn(); + power=tempPower._retn(); + return res; +} + +// throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::getIFOutput( + const ACS::longSeq& feeds, + const ACS::longSeq& ifs, + ACS::doubleSeq_out freqs, + ACS::doubleSeq_out bw, + ACS::longSeq_out pols, + ACS::doubleSeq_out LO +) +{ + ACS::doubleSeq_var freqs_res = new ACS::doubleSeq; + ACS::doubleSeq_var bw_res = new ACS::doubleSeq; + ACS::longSeq_var pols_res = new ACS::longSeq; + ACS::doubleSeq_var LO_res = new ACS::doubleSeq; + + try { + m_core.getIFOutput(feeds, ifs, freqs_res.inout(), bw_res.inout(), pols_res.inout(), LO_res.inout()); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::getIFOutput()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } + freqs = freqs_res._retn(); + bw = bw_res._retn(); + pols = pols_res._retn(); + LO = LO_res._retn(); +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +CORBA::Double SRT5GHzImpl::getTaper(CORBA::Double freq,CORBA::Double bandWidth,CORBA::Long feed,CORBA::Long ifNumber,CORBA::Double_out waveLen) +{ + CORBA::Double res; + double wL; + try { + res=(CORBA::Double)m_core.getTaper(freq,bandWidth,feed,ifNumber,wL); + waveLen=wL; + return res; + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::getTaper()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnLNAsOn() +{ + try { + m_core.lnaOn(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::turnLNAsOn()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnLNAsOff() +{ + try { + m_core.lnaOff(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::turnLNAsOff()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnVacuumSensorOn() +{ + try { + m_core.vacuumSensorOn(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::turnVacuumSensorOn()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnVacuumSensorOff() +{ + try { + m_core.vacuumSensorOff(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getReceiversErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SRT5GHzImpl::turnVacuumSensorOff()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnAntennaUnitOn() +{ + //has it to be implemented? + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::turnAntennaUnitOn()",(LM_WARNING,"Antenna Unit not supported")); +} + +//throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,ReceiversErrors::ReceiversErrorsEx) +void SRT5GHzImpl::turnAntennaUnitOff() +{ + //has it to be implemented? + ACS_LOG(LM_FULL_INFO,"SRT5GHzImpl::turnAntennaUnitOff()",(LM_NOTICE,"Antenna Unit not supported")); +} + +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdoubleSeq,m_plocalOscillator,LO); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROpattern,m_pstatus,status); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROlongSeq,m_ppolarization,polarization); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROlong,m_pfeeds,feeds); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROlong,m_pIFs,IFs); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdoubleSeq,m_pbandWidth,bandWidth); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdoubleSeq,m_pinitialFrequency,initialFrequency); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pvacuum,vacuum); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pVd_1,Vd_1); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pVd_2,Vd_2); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pId_1,Id_1); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pId_2,Id_2); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pVg_1,Vg_1); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pVg_2,Vg_2); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pcryoTemperatureCoolHead,cryoTemperatureCoolHead); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pcryoTemperatureCoolHeadWindow,cryoTemperatureCoolHeadWindow); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pcryoTemperatureLNA,cryoTemperatureLNA); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_pcryoTemperatureLNAWindow,cryoTemperatureLNAWindow); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROdouble,m_penvironmentTemperature,environmentTemperature); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,ACS::ROstring,m_pmode,mode); +_PROPERTY_REFERENCE_CPP(SRT5GHzImpl,Management::ROTSystemStatus,m_preceiverStatus,receiverStatus); + + +/* --------------- [ MACI DLL support functions ] -----------------*/ +#include +MACI_DLL_SUPPORT_FUNCTIONS(SRT5GHzImpl) diff --git a/SystemMake/Makefile b/SystemMake/Makefile index 683311521..0eeb149da 100644 --- a/SystemMake/Makefile +++ b/SystemMake/Makefile @@ -52,7 +52,7 @@ SRT_INTERFACES:=SRTAntennaInterface SRTActiveSurfaceInterface \ SRTReceiversInterface SRT_LIBRARIES:=SRTMinorServoLibrary SRT_SERVERS:=SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver \ - SRT7GHzReceiver SRTLPBandReceiver SRTPyIFDistributor WeatherStation + SRT7GHzReceiver SRT5GHzReceiver SRTLPBandReceiver SRTPyIFDistributor WeatherStation SRT_CLIENTS:=SRTActiveSurfaceGUIClient SRTMountTextClient \ MinorServoBossTextClient SRT_MISC:=SRTScripts @@ -83,7 +83,8 @@ ifeq ($(STATION),SRT) SRTAntennaInterface SRTActiveSurfaceInterface SRTWeatherStationInterface SRTReceiversInterface \ SlaLibrary IRALibrary TextWindowLibrary ParserLibrary XarcosLibrary SRTMinorServoLibrary ComponentProxy ModbusChannel PyTestingLibrary \ AntennaBoss Observatory OTF PointingModel Refraction SkySource Moon FitsWriter Scheduler ReceiversBoss ExternalClients CalibrationTool TotalPower NoiseGenerator DBBC CustomLogger XBackend \ - SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver SRTWeatherStation SRT7GHzReceiver SRTLPBandReceiver PyDewarPositioner \ + SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver SRTWeatherStation SRT7GHzReceiver SRTLPBandReceiver \ + SRT5GHzReceiver PyDewarPositioner \ SRTPyIFDistributor AntennaBossTextClient ObservatoryTextClient GenericBackendTextClient ReceiversBossTextClient SystemTerminal CaltoolClient CustomLoggingClient SchedulerTextClient \ SRTActiveSurfaceGUIClient SRTMountTextClient MinorServoBossTextClient \ Plotter KStars SRTScripts -- GitLab From 06733f741c0ef6f95d12a3bb1712788dfbc0bd91 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 28 Nov 2023 15:05:26 +0000 Subject: [PATCH 042/150] Some CDB updates --- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 26 +++++++-------- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR01/LAN03/LAN03.xml | 30 ++++++++--------- .../Components/AS/SECTOR01/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR01/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR01/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR01/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR01/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR01/LAN11/LAN11.xml | 32 +++++++++---------- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN01/LAN01.xml | 28 ++++++++-------- .../Components/AS/SECTOR02/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN03/LAN03.xml | 32 +++++++++---------- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR02/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR02/LAN11/LAN11.xml | 30 ++++++++--------- .../Components/AS/SECTOR02/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN01/LAN01.xml | 26 +++++++-------- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN03/LAN03.xml | 30 ++++++++--------- .../Components/AS/SECTOR03/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR03/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR03/LAN11/LAN11.xml | 32 +++++++++---------- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN01/LAN01.xml | 28 ++++++++-------- .../Components/AS/SECTOR04/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN03/LAN03.xml | 32 +++++++++---------- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR04/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR04/LAN11/LAN11.xml | 30 ++++++++--------- .../Components/AS/SECTOR04/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN01/LAN01.xml | 26 +++++++-------- .../Components/AS/SECTOR05/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN03/LAN03.xml | 30 ++++++++--------- .../Components/AS/SECTOR05/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR05/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR05/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR05/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR05/LAN11/LAN11.xml | 32 +++++++++---------- .../Components/AS/SECTOR05/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN01/LAN01.xml | 28 ++++++++-------- .../Components/AS/SECTOR06/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN03/LAN03.xml | 32 +++++++++---------- .../Components/AS/SECTOR06/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR06/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR06/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR06/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR06/LAN11/LAN11.xml | 30 ++++++++--------- .../Components/AS/SECTOR06/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN01/LAN01.xml | 26 +++++++-------- .../Components/AS/SECTOR07/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN03/LAN03.xml | 30 ++++++++--------- .../Components/AS/SECTOR07/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR07/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR07/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR07/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR07/LAN11/LAN11.xml | 32 +++++++++---------- .../Components/AS/SECTOR07/LAN12/LAN12.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN01/LAN01.xml | 28 ++++++++-------- .../Components/AS/SECTOR08/LAN02/LAN02.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN03/LAN03.xml | 32 +++++++++---------- .../Components/AS/SECTOR08/LAN04/LAN04.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN05/LAN05.xml | 26 +++++++-------- .../Components/AS/SECTOR08/LAN06/LAN06.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN07/LAN07.xml | 30 ++++++++--------- .../Components/AS/SECTOR08/LAN08/LAN08.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN09/LAN09.xml | 26 +++++++-------- .../Components/AS/SECTOR08/LAN10/LAN10.xml | 18 +++++------ .../Components/AS/SECTOR08/LAN11/LAN11.xml | 30 ++++++++--------- .../Components/AS/SECTOR08/LAN12/LAN12.xml | 18 +++++------ SRT/Configuration/CDB/alma/AS/Boss/Boss.xml | 12 +------ .../ExternalClients/ExternalClients.xml | 6 ++-- .../RFIMonitoring/RFIMonitoring.xml | 6 ++-- 99 files changed, 1123 insertions(+), 1133 deletions(-) diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml index 8bc5508cc..e8942676e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index 6391c8df3..231c3bb71 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index d439973c1..01579f7be 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index 6d33e567d..e192f6bf0 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index 57ea31e36..ead90682f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index 5cc781c38..4bade23d1 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index 5aac64ded..f81bf8281 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index 7d8f9feb3..d0cecd58c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index fa91a50ea..3333f401a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index b2310ec7f..fea579d38 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index 2aa9b8e1d..bb4af221b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index 2a9007dd5..d8e56106d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer01" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index caa700e97..52dc6c157 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index 16e89b6d9..2157b0597 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index b6d31e4cc..6d712909a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index a9fdc2d88..a9626036f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 29abc97fc..6b7e46ec9 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index f360b7e7a..9e45bab17 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index 999066c02..9666dff3a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index 295606563..c43dfe99d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index 26a03b430..5ede45ebd 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index 09d1d964c..d8a2e8896 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index e96617e9a..095bc39a3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index 744444bd5..cae010a49 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer02" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 11e898b00..87d0f3205 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index 3def242bb..cd8f2580f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index 54a6ea0e4..48388e3a2 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index c22932d1a..db9c6666e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index 5331ea2b7..582d5a928 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index 12bcaf600..9d73c6621 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index a1370059f..c5512f87b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index 1f0e25636..845b6072a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index 8699f989e..94cf298cb 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index e3b8bf8f4..acb51354c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index b55ec707c..0302f4250 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index f6689b087..dcdcbf2dd 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer03" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index 5d4fcb766..66326fc50 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index ce1b77284..9686c34ba 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index 5cf57b618..55aae257d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index 12401d925..1862b31bb 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index 96e61c5cc..0028e40ad 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index cec53799d..56a45c10f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index 1900df40d..dcd347f71 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index fd85efc77..351010da3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index b637f43ad..0209db330 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index ea79c93a5..e0ebdaf01 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 304c5334a..83101bb08 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 0a6229206..4408f2d95 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer04" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml index ef39cebf7..d6b92595b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml index 3bd9fe4ee..1969dc8f4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml index df8f0bb14..32200ba2b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml index b7702ace5..f03cb859e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml index e75901745..f0a5e1655 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml index 7ed23e07f..15dc033a9 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml index f2dde4d04..3cdbf85e4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml index 131d98aac..6065d5ce9 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml index 3e1955bc1..aeaae849b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml index ee372d3c1..9a58a14dd 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml index 11749f479..3d9545964 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml index 7ea89856d..d50332639 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR05/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer05" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml index 38a9b181a..55396e1be 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml index cf0a2ad42..f1b5d74e8 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml index d468eda2c..0480687c6 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml index d4189765d..cfd67e74a 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml index a67365828..63411a875 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml index 3ef5dd8c7..ee100c060 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml index cdbcef502..91347f499 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml index 5d9abb89d..65d06e24f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml index a41b056f7..343b413e3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml index 0498a63c6..ff59156e8 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml index 25efd6430..655f6425c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml index 3791a78c6..67dcf4264 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR06/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer06" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml index 3b2ce1c76..4a6957b9c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN01/LAN01.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml index d7ad9cbc3..7d3fe67cf 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml index 0e50139fb..abbded010 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN03/LAN03.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml index 0ca0c44d1..a93071da4 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml index ed705d2e5..d0603a2c6 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml index 6a1ba51df..4d5d4491e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml index 5714b794a..11ec6a180 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml index 24f9c84f1..4b63d4e43 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml index ae84c1d81..414e2feda 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml index 860a35c33..fb3b2067d 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml index 36fb1d033..314520a74 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN11/LAN11.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml index 5c2b50f19..765e1a726 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR07/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer07" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml index 020181fb5..1c162760b 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN01/LAN01.xml @@ -4,19 +4,19 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml index 801a3c8de..ec5342599 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN02/LAN02.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml index f7ebec3de..340b60fa7 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN03/LAN03.xml @@ -4,21 +4,21 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml index 91e991e74..912cc820f 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN04/LAN04.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml index b0169afd9..e13bb61fe 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN05/LAN05.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml index dfaa871f3..96089448e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN06/LAN06.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml index df6a67575..2a3300a16 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN07/LAN07.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml index 8d160570b..f689948b3 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN08/LAN08.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml index a9d25aed4..319cd9f6c 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN09/LAN09.xml @@ -4,18 +4,18 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml index b07e1d1b4..6daa3f300 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN10/LAN10.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml index 899028eb8..1573bc289 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN11/LAN11.xml @@ -4,20 +4,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml index 600054140..a2c09e33e 100644 --- a/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml +++ b/SRT/Configuration/CDB/MACI/Components/AS/SECTOR08/LAN12/LAN12.xml @@ -4,14 +4,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="SRTActiveSurfaceContainer08" ImplLang="cpp"> - - - - - - - - - + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml index 4bb5f1cfc..3482c5193 100644 --- a/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml @@ -1,17 +1,7 @@ - + - diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/ExternalClients/ExternalClients.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/ExternalClients/ExternalClients.xml index 74b1e4cdd..2c525ef7f 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/ExternalClients/ExternalClients.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/ExternalClients/ExternalClients.xml @@ -7,11 +7,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - IPAddress="192.168.200.203" + IPAddress="0.0.0.0" Port="30000" - ReceiveTimeout="10000000" + ReceiveTimeout="10000000" ControlThreadPeriod="10000000" SuperVisor="Gavino"> - + diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml index 66085c8b3..db61aa7aa 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml @@ -7,11 +7,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - IPAddress="192.168.200.203" + IPAddress="0.0.0.0" Port="40000" - ReceiveTimeout="10000000" + ReceiveTimeout="10000000" ControlThreadPeriod="10000000" SuperVisor="Gavino"> - + -- GitLab From f5920395ff34e988a59af8d6d8725a965464d528 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 28 Nov 2023 15:15:55 +0000 Subject: [PATCH 043/150] Minor Servos update --- .../MACI/Components/MINORSERVO/Boss/Boss.xml | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 7 +- .../MACI/Components/MINORSERVO/SRP/GFR.xml | 14 + .../MACI/Components/MINORSERVO/SRP/SRP.xml | 8 +- .../MinorServoBossContainer.xml | 20 +- .../GFR/LookupTables/LookupTables.xml | 42 ++ .../MinorServo/GFR/Properties/Properties.xml | 22 + .../M3R/LookupTables/LookupTables.xml | 33 ++ .../MinorServo/M3R/Properties/Properties.xml | 22 + .../MinorServo/PFP/Properties/Properties.xml | 32 ++ .../SRP/LookupTables/LookupTables.xml | 106 +++++ .../MinorServo/SRP/Properties/Properties.xml | 40 ++ .../alma/MANAGEMENT/FitsZilla/FitsZilla.xml | 2 +- SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- SRT/CDB/alma/MANAGEMENT/Point/Point.xml | 2 +- SRT/CDB/alma/MINORSERVO/Boss/Boss.xml | 207 +-------- SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 362 +-------------- SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 363 +-------------- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 364 +-------------- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 365 +-------------- SRT/CDB/alma/MINORSERVO/Socket/Socket.xml | 12 + .../idl/SRTMinorServo.idl | 60 +++ .../idl/SRTMinorServoBoss.idl | 74 +++ .../idl/SRTMinorServoCommon.idl | 131 ++++++ .../idl/SRTMinorServoCommon.midl | 84 ++++ .../SRTMinorServoInterface/src/Makefile | 65 +++ .../SRTMinorServoInterface/test/Makefile | 92 ++++ .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/commands/__init__.py | 0 .../functional/commands/test_servoSetup.py | 62 +++ .../commands/test_setServoASConfiguration.py | 44 ++ .../test_setServoElevationTracking.py | 46 ++ .../commands/test_setServoOffset.py | 38 ++ .../test/functional/test_clearUserOffset.py | 58 +++ .../test/functional/test_getAxesInfo.py | 92 ++++ .../test/functional/test_getAxesPosition.py | 87 ++++ .../functional/test_getCentralScanPosition.py | 58 +++ .../test/functional/test_position.py | 126 +++++ .../test/functional/test_scan.py | 430 ++++++++++++++++++ .../functional/test_setASConfiguration.py | 56 +++ .../functional/test_setElevationTracking.py | 56 +++ .../test/functional/test_systemOffset.py | 95 ++++ .../test/functional/test_userOffset.py | 96 ++++ .../test/pyunit/__init__.py | 0 .../SRTMinorServoInterface/test/unittest.cpp | 6 + .../src/SRTMinorServoCommandLibrary.cpp | 2 +- .../config/CDB/schemas/SRTMinorServo.xsd | 61 +++ .../config/CDB/schemas/SRTMinorServoBoss.xsd | 71 +++ .../CDB/schemas/SRTMinorServoLookupTable.xsd | 44 ++ .../CDB/schemas/SRTMinorServoProperties.xsd | 34 ++ .../CDB/schemas/SRTMinorServoSocket.xsd | 32 ++ SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 213 +++++++++ .../include/SRTMinorServoBossCore.h | 78 ++++ .../include/SRTMinorServoBossImpl.h | 93 ++++ .../SRTMinorServo/include/SRTMinorServoImpl.h | 142 ++++++ .../include/SRTMinorServoParkThread.h | 68 +++ .../include/SRTMinorServoSetupThread.h | 68 +++ .../include/SRTMinorServoSocket.h | 31 +- .../include/SRTMinorServoStatusThread.h | 65 +++ .../SRTMinorServo/include/SuppressWarnings.h | 12 + SRT/Servers/SRTMinorServo/src/Makefile | 24 +- .../src/SRTBaseMinorServoImpl.cpp | 318 +++++++++++++ .../src/SRTGenericMinorServoImpl.cpp | 15 + .../src/SRTMinorServoBossCore.cpp | 213 +++++++++ .../src/SRTMinorServoBossImpl.cpp | 250 ++++++++++ .../src/SRTMinorServoParkThread.cpp | 59 +++ .../src/SRTMinorServoSetupThread.cpp | 111 +++++ .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 62 ++- .../src/SRTMinorServoStatusThread.cpp | 47 ++ .../src/SRTProgramTrackMinorServoImpl.cpp | 34 ++ 71 files changed, 4410 insertions(+), 1627 deletions(-) create mode 100644 SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/MINORSERVO/Socket/Socket.xml create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/src/Makefile create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/Makefile create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/external/__init__.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/__init__.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/__init__.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd create mode 100644 SRT/Servers/SRTMinorServo/include/MSDevIOs.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SuppressWarnings.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp diff --git a/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml b/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml index 2705230c3..b7a0bfd41 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Boss" - Code="MinorServoBossImpl" + Code="SRTMinorServoBossImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/MinorServoBoss:1.0" - Container="MinorServoBossContainer" - Default="true" - + Type="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" + Container="MinorServoContainer" + Default="true" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index ed2c44f77..23da6db86 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="GFR" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="true" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml new file mode 100644 index 000000000..6e6b16d10 --- /dev/null +++ b/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml @@ -0,0 +1,14 @@ + + diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index 4534c3d82..b957480d6 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -5,11 +5,11 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="SRP" - Code="WPServoImpl" + Name="SRP" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="true" /> diff --git a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml b/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml index 64fcda240..508635633 100644 --- a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml +++ b/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml @@ -15,17 +15,13 @@ - - + +
- - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml new file mode 100644 index 000000000..715f7031c --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -0,0 +1,42 @@ + + + + + + + ROTATION + + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml new file mode 100644 index 000000000..0c087d882 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -0,0 +1,22 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + OFFSET + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml new file mode 100644 index 000000000..ce0cb0857 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -0,0 +1,33 @@ + + + + + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + ROTATION 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml new file mode 100644 index 000000000..0c087d882 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -0,0 +1,22 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + OFFSET + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml new file mode 100644 index 000000000..0dd96f036 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -0,0 +1,32 @@ + + + + + + X_ENABLED + Z_MASTER_ENABLED + Z_SLAVE_ENABLED + THETA_MASTER_ENABLED + THETA_SLAVE_ENABLED + + ELONG_X + ELONG_Z_MASTER + ELONG_Z_SLAVE + ELONG_THETA_MASTER + ELONG_THETA_SLAVE + + TX + TZ + RTHETA + + OFFSET_TX + OFFSET_TZ + OFFSET_RTHETA + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..3c2c8cfcb --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -0,0 +1,106 @@ + + + + + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + + TX -1.5 + TY 28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ 9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX -0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY -0.03611111111111111 + RZ 0 + + + TX -1.5 + TY 28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ 9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX -0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY -0.03611111111111111 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + TX 0 + + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + TX 0 + TY 0 + TZ 0 + RX 0 + RY 0 + RZ 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml new file mode 100644 index 000000000..896b0e8c4 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -0,0 +1,40 @@ + + + + + + Z1_ENABLED + Z2_ENABLED + Z3_ENABLED + Y1_ENABLED + Y2_ENABLED + X1_ENABLED + + ELONG_Z1 + ELONG_Z2 + ELONG_Z3 + ELONG_Y1 + ELONG_Y2 + ELONG_X1 + + TX + TY + TZ + RX + RY + RZ + + OFFSET_TX + OFFSET_TY + OFFSET_TZ + OFFSET_RX + OFFSET_RY + OFFSET_RZ + diff --git a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml index c17f54267..a40bd6376 100644 --- a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml +++ b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml @@ -20,7 +20,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" MeteoInstance="WEATHERSTATION/WeatherStation" > diff --git a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 32d8ca7d9..4c835f64c 100644 --- a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -23,7 +23,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" ActiveSurfaceBossInterface="IDL:alma/ActiveSurface/SRTActiveSurfaceBoss:1.0" CustomLoggerInterface="IDL:alma/Management/CustomLogger:1.0" WeatherStationInstance="IDL:alma/Weather/GenericWeatherStation:1.0" diff --git a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml index 88c537650..b067e56eb 100644 --- a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml +++ b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="0" diff --git a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml index d4e2d5e3d..4d647f16c 100644 --- a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -1,197 +1,24 @@ - - - - - - - - - - - - - - - - - - - - + status_thread_period="0.05"> + + + + + + + + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index e13e504db..c7bd27cbb 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -1,356 +1,22 @@ - - - - - - - - - - - + physical_axes="2" + virtual_axes="1"> - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index c741e7cd8..c7bd27cbb 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -1,357 +1,22 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="1" - number_of_slaves="3" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="3" - zero="0" - park_position="0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-945, 945)" -> - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 0c7cd46b3..fd8362d3f 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -1,358 +1,22 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="3" - number_of_slaves="5" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="0" - zero="0" - park_position="2730.15,0,-195" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-28.51, 2740); (-1480, 1480); (-199, 40)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index 44730072b..5dea1dfd2 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -1,359 +1,22 @@ - - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="6" - number_of_slaves="7" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="1" - zero="1570.00" - park_position="-5,5,-125,0,0,0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "1" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-50, 50); (-110, 110); (-110, 110); (-0.25, 0.25); (-0.25, 0.25); (-0.25, 0.25)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml new file mode 100644 index 000000000..69aceac45 --- /dev/null +++ b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -0,0 +1,12 @@ + + + + diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl new file mode 100644 index 000000000..29972eb8e --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -0,0 +1,60 @@ +/***************************************************************\ + * Authors: + * Giuseppe Carboni + * + * Created: Mon Mar 06 12:30:00 CEST 2023 + * Last Modified: Mon Mar 06 12:30:00 CEST 2023 +\***************************************************************/ + +#ifndef __SRTMINORSERVO_IDL__ +#define __SRTMINORSERVO_IDL__ + +#include +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + interface SRTBaseMinorServo : ACS::CharacteristicComponent + { + readonly attribute ACS::ROboolean enabled; + + readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; + + readonly attribute ACS::ROboolean block; + + readonly attribute ROSRTMinorServoOperativeMode operative_mode; + + readonly attribute ACS::RObooleanSeq axes_enabled; + + readonly attribute ACS::ROdoubleSeq physical_positions; + + readonly attribute ACS::ROdoubleSeq virtual_positions; + + readonly attribute ACS::ROdoubleSeq virtual_offsets; + + void status(); + + void stow(in long stow_position); + + void stop(); + + void preset(in ACS::doubleSeq coordinates); + + void offset(in ACS::doubleSeq offsets); + + void setup(in string configuration); + }; + + interface SRTGenericMinorServo : SRTBaseMinorServo + { + }; + + interface SRTProgramTrackMinorServo : SRTBaseMinorServo + { + void programTrack(in long trajectory_id, in long point_id, in double start_time, in ACS::doubleSeq coordinates); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl new file mode 100644 index 000000000..0eeb13b74 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -0,0 +1,74 @@ +/***************************************************************\ + * Authors: + * Giuseppe Carboni + * + * Created: Mon Mar 06 12:30:00 CEST 2023 + * Last Modified: Mon Mar 06 12:30:00 CEST 2023 +\***************************************************************/ +#ifndef __SRTMINORSERVOBOSS_IDL__ +#define __SRTMINORSERVOBOSS_IDL__ + +#include +#include +#include +#include +#include "MinorServoDefinitions.idl" +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + interface SRTMinorServoBoss: ACS::CharacteristicComponent + { + readonly attribute ROSRTMinorServoFocalConfiguration current_configuration; + readonly attribute ACS::ROboolean simulation_enabled; + readonly attribute ACS::ROdouble plc_time; + readonly attribute ACS::ROstring plc_version; + readonly attribute ROSRTMinorServoControlStatus control; + readonly attribute ACS::ROboolean power; + readonly attribute ACS::ROboolean emergency; + readonly attribute ROSRTMinorServoGregorianCoverStatus gregorian_cover; + readonly attribute ACS::ROdouble last_executed_command; + + void setElevationTracking(in string value) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + void setASConfiguration(in string value) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + + /** + * Starts the scan of one axis of the MinorServo target. + * + * @param starting_time the time the scan will start or 0 if the scan is required to start immediately + * @param scan structure containing the description of the scan to be executed + * @param antennaInfo auxiliary information from the antenna + * + */ + void startScan(inout ACS::Time starting_time, in MinorServoScan scan, in Antenna::TRunTimeParameters antennaInfo) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + + /** + * Closes the current scan and force the minor servo system to its normal behaviour + * @param timeToStop stores the expected epoch in which the scan will be stopped (closed). It could be zero meaning the + * scan will be closed immediately + * @throw ComponentErrors::ComponentErrorsEx + * @throw ReceiversErrors::ReceiversErrorsEx + */ + void closeScan(out ACS::Time timeToStop) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + + /** + * Checks if it is possible to execute a scan along a given axis + * + * @param starting_time the time the scan will start or 0 if the scan is required to start immediately + * @param scan structure containing the description of the scan to be executed + * @param antennaInfo auxiliary information from the antenna + * @param runTime auxiliary information computed at run time by the subsystem + */ + boolean checkScan(in ACS::Time starting_time, in MinorServoScan scan, in Antenna::TRunTimeParameters antennaInfo, out TRunTimeParameters runtime) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + + /** + * Setup all the minor servos to the given configuration + * @param configuration a string representing the given configuration + */ + void setup(in string configuration) raises (MinorServoErrors::MinorServoErrorsEx); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl new file mode 100644 index 000000000..924fb3996 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl @@ -0,0 +1,131 @@ +/******************************************************************************** $Id: JacPrep,v 1.13 2010/01/04 15:34:48 gchiozzi Exp $ +* DO NOT EDIT +* Automatically generated from ../idl/SRTMinorServoCommon.midl +* on Mon Nov 27 14:03:33 2023 +*******************************************************************************/ +#ifndef _SRTMinorServoCommon_midl_ +#define _SRTMinorServoCommon_midl_ +#ifndef _ACS_PREPROCESSED_ +#define _ACS_PREPROCESSED_ +#endif +#include +#include + + + + + + + +#pragma prefix "alma" + +module MinorServo +{ + enum SRTMinorServoFocalConfiguration + { + CONFIGURATION_UNKNOWN, + CONFIGURATION_PARK, + CONFIGURATION_PRIMARY, + CONFIGURATION_GREGORIAN1, + CONFIGURATION_GREGORIAN2, + CONFIGURATION_GREGORIAN3, + CONFIGURATION_GREGORIAN4, + CONFIGURATION_GREGORIAN5, + CONFIGURATION_GREGORIAN6, + CONFIGURATION_GREGORIAN7, + CONFIGURATION_GREGORIAN8, + CONFIGURATION_BWG1, + CONFIGURATION_BWG2, + CONFIGURATION_BWG3, + CONFIGURATION_BWG4 + }; + + + typedef sequence SRTMinorServoFocalConfigurationSeq; interface CBSRTMinorServoFocalConfiguration : ACS::Callback { oneway void working(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoFocalConfiguration SRTMinorServoFocalConfigurationCB; interface AlarmSRTMinorServoFocalConfiguration : ACS::Callback { oneway void alarm_raised(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoFocalConfiguration SRTMinorServoFocalConfigurationAlarm; interface PSRTMinorServoFocalConfiguration: ACS::TypelessProperty { SRTMinorServoFocalConfiguration get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoFocalConfigurationSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoFocalConfiguration default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoFocalConfigurationSeq allStates; }; + interface ROSRTMinorServoFocalConfiguration: PSRTMinorServoFocalConfiguration{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoFocalConfigurationSeq alarm_on; readonly attribute SRTMinorServoFocalConfigurationSeq alarm_off; }; + interface RWSRTMinorServoFocalConfiguration: PSRTMinorServoFocalConfiguration { ACSErr::Completion set_sync(in SRTMinorServoFocalConfiguration value); void set_async(in SRTMinorServoFocalConfiguration value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoFocalConfiguration value);}; + + + enum SRTMinorServoControlStatus + { + CONTROL_DISCOS, + CONTROL_VBRAIN + }; + + + typedef sequence SRTMinorServoControlStatusSeq; interface CBSRTMinorServoControlStatus : ACS::Callback { oneway void working(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoControlStatus SRTMinorServoControlStatusCB; interface AlarmSRTMinorServoControlStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoControlStatus SRTMinorServoControlStatusAlarm; interface PSRTMinorServoControlStatus: ACS::TypelessProperty { SRTMinorServoControlStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoControlStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoControlStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoControlStatusSeq allStates; }; + interface ROSRTMinorServoControlStatus: PSRTMinorServoControlStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoControlStatusSeq alarm_on; readonly attribute SRTMinorServoControlStatusSeq alarm_off; }; + interface RWSRTMinorServoControlStatus: PSRTMinorServoControlStatus { ACSErr::Completion set_sync(in SRTMinorServoControlStatus value); void set_async(in SRTMinorServoControlStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoControlStatus value);}; + + + enum SRTMinorServoGregorianCoverStatus + { + COVER_STATUS_UNKNOWN, + COVER_STATUS_OPEN, + COVER_STATUS_CLOSED + }; + + + typedef sequence SRTMinorServoGregorianCoverStatusSeq; interface CBSRTMinorServoGregorianCoverStatus : ACS::Callback { oneway void working(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoGregorianCoverStatus SRTMinorServoGregorianCoverStatusCB; interface AlarmSRTMinorServoGregorianCoverStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoGregorianCoverStatus SRTMinorServoGregorianCoverStatusAlarm; interface PSRTMinorServoGregorianCoverStatus: ACS::TypelessProperty { SRTMinorServoGregorianCoverStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoGregorianCoverStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoGregorianCoverStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoGregorianCoverStatusSeq allStates; }; + interface ROSRTMinorServoGregorianCoverStatus: PSRTMinorServoGregorianCoverStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoGregorianCoverStatusSeq alarm_on; readonly attribute SRTMinorServoGregorianCoverStatusSeq alarm_off; }; + interface RWSRTMinorServoGregorianCoverStatus: PSRTMinorServoGregorianCoverStatus { ACSErr::Completion set_sync(in SRTMinorServoGregorianCoverStatus value); void set_async(in SRTMinorServoGregorianCoverStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoGregorianCoverStatus value);}; + + + enum SRTMinorServoCabinetStatus + { + DRIVE_CABINET_OK, + DRIVE_CABINET_WARNING, + DRIVE_CABINET_ERROR + }; + + + typedef sequence SRTMinorServoCabinetStatusSeq; interface CBSRTMinorServoCabinetStatus : ACS::Callback { oneway void working(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoCabinetStatus SRTMinorServoCabinetStatusCB; interface AlarmSRTMinorServoCabinetStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoCabinetStatus SRTMinorServoCabinetStatusAlarm; interface PSRTMinorServoCabinetStatus: ACS::TypelessProperty { SRTMinorServoCabinetStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoCabinetStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoCabinetStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoCabinetStatusSeq allStates; }; + interface ROSRTMinorServoCabinetStatus: PSRTMinorServoCabinetStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoCabinetStatusSeq alarm_on; readonly attribute SRTMinorServoCabinetStatusSeq alarm_off; }; + interface RWSRTMinorServoCabinetStatus: PSRTMinorServoCabinetStatus { ACSErr::Completion set_sync(in SRTMinorServoCabinetStatus value); void set_async(in SRTMinorServoCabinetStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoCabinetStatus value);}; + + + enum SRTMinorServoOperativeMode + { + OPERATIVE_MODE_UNKNOWN, + OPERATIVE_MODE_SETUP, + OPERATIVE_MODE_STOW, + OPERATIVE_MODE_STOP, + OPERATIVE_MODE_PRESET, + OPERATIVE_MODE_PROGRAMTRACK + }; + + + typedef sequence SRTMinorServoOperativeModeSeq; interface CBSRTMinorServoOperativeMode : ACS::Callback { oneway void working(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoOperativeMode SRTMinorServoOperativeModeCB; interface AlarmSRTMinorServoOperativeMode : ACS::Callback { oneway void alarm_raised(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoOperativeMode SRTMinorServoOperativeModeAlarm; interface PSRTMinorServoOperativeMode: ACS::TypelessProperty { SRTMinorServoOperativeMode get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoOperativeModeSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoOperativeMode default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoOperativeModeSeq allStates; }; + interface ROSRTMinorServoOperativeMode: PSRTMinorServoOperativeMode{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoOperativeModeSeq alarm_on; readonly attribute SRTMinorServoOperativeModeSeq alarm_off; }; + interface RWSRTMinorServoOperativeMode: PSRTMinorServoOperativeMode { ACSErr::Completion set_sync(in SRTMinorServoOperativeMode value); void set_async(in SRTMinorServoOperativeMode value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoOperativeMode value);}; + + + enum SRTMinorServoBossStatus + { + BOSS_STATUS_UNCONFIGURED, + BOSS_STATUS_SETUP_IN_PROGRESS, + BOSS_STATUS_PARK_IN_PROGRESS, + BOSS_STATUS_ERROR, + BOSS_STATUS_CONFIGURED + }; + + + typedef sequence SRTMinorServoBossStatusSeq; interface CBSRTMinorServoBossStatus : ACS::Callback { oneway void working(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; +typedef CBSRTMinorServoBossStatus SRTMinorServoBossStatusCB; interface AlarmSRTMinorServoBossStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; + typedef AlarmSRTMinorServoBossStatus SRTMinorServoBossStatusAlarm; interface PSRTMinorServoBossStatus: ACS::TypelessProperty { SRTMinorServoBossStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoBossStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoBossStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoBossStatusSeq allStates; }; + interface ROSRTMinorServoBossStatus: PSRTMinorServoBossStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoBossStatusSeq alarm_on; readonly attribute SRTMinorServoBossStatusSeq alarm_off; }; + interface RWSRTMinorServoBossStatus: PSRTMinorServoBossStatus { ACSErr::Completion set_sync(in SRTMinorServoBossStatus value); void set_async(in SRTMinorServoBossStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoBossStatus value);}; + +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl new file mode 100644 index 000000000..01ab82321 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -0,0 +1,84 @@ +/***************************************************************\ + * Author: Giuseppe Carboni +\***************************************************************/ +#ifndef __SRTMINORSERVOCOMMON_MIDL__ +#define __SRTMINORSERVOCOMMON_MIDL__ + +#include +#include + +#pragma prefix "alma" + +module MinorServo +{ + enum SRTMinorServoFocalConfiguration + { + CONFIGURATION_UNKNOWN, + CONFIGURATION_PARK, + CONFIGURATION_PRIMARY, + CONFIGURATION_GREGORIAN1, + CONFIGURATION_GREGORIAN2, + CONFIGURATION_GREGORIAN3, + CONFIGURATION_GREGORIAN4, + CONFIGURATION_GREGORIAN5, + CONFIGURATION_GREGORIAN6, + CONFIGURATION_GREGORIAN7, + CONFIGURATION_GREGORIAN8, + CONFIGURATION_BWG1, + CONFIGURATION_BWG2, + CONFIGURATION_BWG3, + CONFIGURATION_BWG4 + }; + + ACS_ENUM(SRTMinorServoFocalConfiguration); + + enum SRTMinorServoControlStatus + { + CONTROL_DISCOS, + CONTROL_VBRAIN + }; + + ACS_ENUM(SRTMinorServoControlStatus); + + enum SRTMinorServoGregorianCoverStatus + { + COVER_STATUS_UNKNOWN, + COVER_STATUS_OPEN, + COVER_STATUS_CLOSED + }; + + ACS_ENUM(SRTMinorServoGregorianCoverStatus); + + enum SRTMinorServoCabinetStatus + { + DRIVE_CABINET_OK, + DRIVE_CABINET_WARNING, + DRIVE_CABINET_ERROR + }; + + ACS_ENUM(SRTMinorServoCabinetStatus); + + enum SRTMinorServoOperativeMode + { + OPERATIVE_MODE_UNKNOWN, + OPERATIVE_MODE_SETUP, + OPERATIVE_MODE_STOW, + OPERATIVE_MODE_STOP, + OPERATIVE_MODE_PRESET, + OPERATIVE_MODE_PROGRAMTRACK + }; + + ACS_ENUM(SRTMinorServoOperativeMode); + + enum SRTMinorServoBossStatus + { + BOSS_STATUS_UNCONFIGURED, + BOSS_STATUS_SETUP_IN_PROGRESS, + BOSS_STATUS_PARK_IN_PROGRESS, + BOSS_STATUS_ERROR, + BOSS_STATUS_CONFIGURED + }; + + ACS_ENUM(SRTMinorServoBossStatus); +}; +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile new file mode 100644 index 000000000..c9465cced --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile @@ -0,0 +1,65 @@ +#************************************************************************************** +# E.S.O. - ACS project +# +# Makefile of SRTMinorServo IDL +# +#-------------------------------------------------------------------------------------- +# Giuseppe Carboni (giuseppe.carboni@inaf.it) +#-------------------------------------------------------------------------------------- +# +#************************************************************************************** + +#************************************************************************************** +# This Makefile follows VLT Standards (see Makefile(5) for more). +#************************************************************************************** + +MAKE_PDF = ON + +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +# IDL FILES +# +IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTMinorServoCommon + +SRTMinorServoCommonStubs_LIBS = baciStubs +SRTMinorServoStubs_LIBS = baciStubs SRTMinorServoCommonStubs +SRTMinorServoBossStubs_LIBS = baciStubs SRTMinorServoCommonStubs ComponentErrorsStubs \ + MinorServoErrorsStubs AntennaDefinitionsStubs MinorServoDefinitionsStubs + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + + +# TARGETS +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + $(RM) *~ ../include/*~ ../idl/*~ ../*~ ../../*~ core + $(RM) ../doc/html + $(RM) tmp.txt acsexmplbeans.jar ../doc/abeans.log + @echo " . . . clean done" + +clean_dist : clean clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + # cp ../doc/html/group__ACSEXMPLDOC.html ../doc/html/main.html + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + +#___oOo___ diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/Makefile b/SRT/Interfaces/SRTMinorServoInterface/test/Makefile new file mode 100644 index 000000000..e70daa63e --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/Makefile @@ -0,0 +1,92 @@ +# CPP UNIT TESTING SETUP +#-------------- +# GTEST_HOME=/usr/local/include/gtest +# GMOCK_HOME=/usr/local/include/gmock +# GTEST_LIBS=gtest gtest_main + +# USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# USER_LIBS=C++ pthread +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# EXECUTABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + python -m unittest functional/commands + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + rm -rf ../lib/python/site-packages/* + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/external/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/external/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py new file mode 100644 index 000000000..aa862cae0 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py @@ -0,0 +1,62 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestServoSetupCmd(unittest.TestCase): + """Test the servoSetup command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_code(self): + success, answer = self.boss.command('servoSetup=FOO') + self.assertFalse(success) + time.sleep(0.2) + if self.boss.isStarting(): + self.wait_ready() + + def test_right_code(self): + success, answer = self.boss.command('servoSetup=' + self.setup_code) + self.assertTrue(success) + time.sleep(0.2) + if self.boss.isStarting(): + self.wait_ready() + + def wait_ready(self): + while not self.boss.isReady(): + time.sleep(0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from PyMinorServoTest import simunittest + simunittest.run(TestServoSetupCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py new file mode 100644 index 000000000..a4d0b257d --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py @@ -0,0 +1,44 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from PyMinorServoTest import simunittest +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoASConfigurationCmd(unittest.TestCase): + """Test the setServoASConfiguration command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_axis_code(self): + success, answer = self.boss.command('setServoASConfiguration=FOO') + self.assertFalse(success) + + def test_right_axis_code(self): + success, answer = self.boss.command('setServoASConfiguration=on') + self.assertTrue(success) + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + simunittest.run(TestSetServoASConfigurationCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py new file mode 100644 index 000000000..7d67f7ad1 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py @@ -0,0 +1,46 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoElevationTrackingCmd(unittest.TestCase): + """Test the setServoElevationTracking command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_flag(self): + success, answer = self.boss.command('setServoElevationTracking=FOO') + self.assertFalse(success) + + def test_right_flag(self): + #FIXME: we need servoSetup before this + success, answer = self.boss.command('setServoElevationTracking=on') + self.assertTrue(success) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from PyMinorServoTest import simunittest + simunittest.run(TestSetServoElevationTrackingCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py new file mode 100644 index 000000000..64888d527 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py @@ -0,0 +1,38 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoOffsetCmd(unittest.TestCase): + """Test the setServoOffset command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.boss.park() + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_axis_code(self): + success, answer = self.boss.command('setServoOffset=FOO_TX,0') + self.assertFalse(success) + + +if __name__ == '__main__': + unittest.main() diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py new file mode 100644 index 000000000..98ab9110f --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py @@ -0,0 +1,58 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestClearUserOffset(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.clearUserOffset('FOO') + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestClearUserOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py new file mode 100644 index 000000000..ed2b37f2c --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py @@ -0,0 +1,92 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime + +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestGetAxesInfo(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + cls.client.disconnect() + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + with self.assertRaises(MinorServoErrorsEx): + axes, units = self.boss.getAxesInfo() + + def test_ready(self): + """Get the axes information""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + axes, units = self.boss.getAxesInfo() + self.assertTrue(any(axes)) + self.assertTrue(any(units)) + self.assertEqual(len(units), len(axes)) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetAxesInfo, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py new file mode 100644 index 000000000..7a1f57511 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py @@ -0,0 +1,87 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime + +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestGetAxesPosition(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + with self.assertRaises(MinorServoErrorsEx): + position = self.boss.getAxesPosition(0) + + def test_ready(self): + """Get the axes position""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + position = self.boss.getAxesPosition(0) + self.assertTrue(any(position)) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetAxesPosition, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py new file mode 100644 index 000000000..600c3ea58 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py @@ -0,0 +1,58 @@ +from __future__ import with_statement + +import os + +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + +class TestGetCentralScanPosition(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + @classmethod + def tearDownClass(cls): + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_scan_not_active(self): + """Raise a MinorServoErrorsEx if the scan is not active""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.getCentralScanPosition() + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetCentralScanPosition, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py new file mode 100644 index 000000000..892aa9be6 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py @@ -0,0 +1,126 @@ +from __future__ import with_statement +import random +import math +import time +import os +from datetime import datetime + +import unittest +import Management +import MinorServo +import Antenna + +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp +from Acspy.Clients.SimpleClient import PySimpleClient +from Acspy.Util import ACSCorba + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class PositionTest(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.axis_code='SRP_TZ' if self.telescope == 'SRT' else 'Z' + setupCode = 'KKG' if self.telescope == 'SRT' else 'CCC' + # Wait (maximum one minute) in case the boss is parking + if self.boss.isParking(): + t0 = datetime.now() + while self.boss.isParking() and (datetime.now() - t0).seconds < 60: + time.sleep(2) + if self.boss.isParking(): + self.fail('The system can not exit form a parking state') + + if self.boss.getActualSetup() != setupCode: + self.boss.setup(setupCode) + # Wait (maximum 5 minutes) in case the boss is starting + t0 = datetime.now() + while not self.boss.isReady() and (datetime.now() - t0).seconds < 60*5: + time.sleep(2) + if not self.boss.isReady(): + self.fail('The system is not ready for executing the tests') + self.boss.setElevationTracking('OFF') + self.boss.setASConfiguration('OFF') + axes, units = self.boss.getAxesInfo() + self.idx = axes.index(self.axis_code) + + def tearDown(self): + # self.boss.clearUserOffset(self.axis_code) + self.boss.setUserOffset(self.axis_code, 0) + self.wait_tracking() + + def test_get_current_position(self): + timestamp = getTimeStamp().value + position = self.get_position() + position_now = self.get_position(timestamp) + self.assertAlmostEqual(position, position_now, delta=0.1) + + def test_get_offset_position(self): + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + position_now = self.get_position() + self.assertAlmostEqual(position_now, position + 10, delta=0.1) + + def test_get_past_position(self): + timestamp = getTimeStamp().value + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + position_past = self.get_position(timestamp) + self.assertAlmostEqual(position, position_past, delta=0.1) + + def test_get_past_position_with_sleep(self): + timestamp = getTimeStamp().value + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + time.sleep(10) + position_past = self.get_position(timestamp) + self.assertAlmostEqual(position, position_past, delta=0.1) + + def wait_tracking(self): + time.sleep(1) # Give the time to command the new position + # TODO: we need a better solution than this sleep to be sure the tests + # procuce always the same results + while not self.boss.isTracking(): + time.sleep(0.1) + + def get_position(self, timestamp=0): + return self.boss.getAxesPosition(timestamp)[self.idx] + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main(verbosity=2, failfast=True) # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(PositionTest, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py new file mode 100644 index 000000000..1c0c266f8 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py @@ -0,0 +1,430 @@ +from __future__ import with_statement +import random +import math +import time +import os +from datetime import datetime + +import unittest +import Management +import MinorServo +import Antenna + +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp +from Acspy.Clients.SimpleClient import PySimpleClient +from Acspy.Util import ACSCorba + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class ScanBaseTest(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + cls.client.disconnect() + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.antennaInfo = Antenna.TRunTimeParameters( + targetName='dummy', + azimuth=math.pi, + elevation=math.pi/2 * 1/random.randrange(2, 10), + rightAscension=0, + declination=0, + startEpoch=getTimeStamp().value + 100000000, + onTheFly=False, + slewingTime=100000000, + section=Antenna.ANT_SOUTH, + axis=Management.MNG_TRACK, + timeToStop=0) + + self.scan = MinorServo.MinorServoScan( + range=20, + total_time=100000000, # 10 seconds + axis_code='SRP_TZ' if self.telescope == 'SRT' else 'Z', + is_empty_scan=False) + + def tearDown(self): + if self.boss.isScanActive(): + t = self.boss.closeScan() + self.waitUntilTime(t) + + def waitUntilTime(self, targetTime): + while getTimeStamp().value < targetTime: + time.sleep(0.1) + + def waitUntil(self, action, value): + """For instance: waitUntil(isReady, True)""" + while action() != value: + time.sleep(0.1) + + +class ScanTest(ScanBaseTest): + """Test checkScan(), startScan() and closeScan()""" + + def setUp(self): + super(ScanTest, self).setUp() + setupCode = 'KKG' if self.telescope == 'SRT' else 'CCC' + + # Wait (maximum one minute) in case the boss is parking + if self.boss.isParking(): + t0 = datetime.now() + while self.boss.isParking() and (datetime.now() - t0).seconds < 60: + time.sleep(2) + if self.boss.isParking(): + self.fail('The system can not exit form a parking state') + + if self.boss.getActualSetup() != setupCode or not self.boss.isReady(): + self.boss.setup(setupCode) + + # Wait (maximum 5 minutes) in case the boss is starting + t0 = datetime.now() + while not self.boss.isReady() and (datetime.now() - t0).seconds < 60*5: + time.sleep(2) + + if not self.boss.isReady(): + self.fail('The system is not ready for executing the tests') + + self.boss.setElevationTracking('OFF') + self.boss.setASConfiguration('OFF') + axes, units = self.boss.getAxesInfo() + self.idx = axes.index(self.scan.axis_code) + + getPosition = getattr(self, 'get%sPosition' %self.telescope) + centerScanPosition = getPosition( + self.boss.getActualSetup(), + 'SRP', + math.degrees(self.antennaInfo.elevation)) + self.centerScan = centerScanPosition[self.idx] + + def test_startScan_empty_scan_system_ready(self): + """Do nothing in case of empty scan and system ready""" + self.scan.is_empty_scan = True + startTime = 0 + self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_startScan_empty_scan_system_not_ready(self): + """Do nothing in case of empty scan and system NOT ready""" + self.scan.is_empty_scan = True + startTime = 0 + self.boss.park() + self.waitUntil(self.boss.isReady, False) + self.assertFalse(self.boss.isReady()) + self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_startScan_ASAP(self): + """Starting time unknown: the scan must start ASAP""" + startTime = 0 + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertGreater(t, getTimeStamp().value) + self.isAssertScan(t) + + def test_startScan_ASAP_at_checkScan_time(self): + """Starting time given by checkScan()""" + startTime = 0 + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + startTime = msInfo.startEpoch + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertGreater(t, getTimeStamp().value) + self.isAssertScan(t) + + def test_startScan_at_given_time(self): + """Start at given time""" + startTime = getTimeStamp().value + 60*10**7 # Start in one minute + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertEqual(t, startTime) + self.isAssertScan(t) + + def test_startScan_too_fast(self): + """Servo not enough fast for accomplishing the scan in total_time""" + startTime = getTimeStamp().value + 60*10**7 # Start in one minute + self.scan.total_time = 5000000 # 0.5 seconds + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_startScan_out_of_range(self): + """Scan out of the servo position limits""" + startTime = 0 + self.scan.range = 5000 # 5 meters + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_startScan_time_too_close_to_now(self): + """Starting time too close to the current time""" + startTime = getTimeStamp().value + 1*10**7 # Start in 1 second from now + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_closeScan_time_to_stop(self): + """Return the time_to_stop""" + startTime = 0 + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.waitUntilTime(startTime) + time_to_stop = self.boss.closeScan() + # The time_to_stop should be greater than now + self.assertGreater(time_to_stop, getTimeStamp().value) + + def test_checkScan_with_scanActive(self): + """checkScan() raises an exception in case there is an active scan.""" + startTime = getTimeStamp().value + 15*10**7 # Start in 15 seconds + self.boss.startScan(startTime, self.scan, self.antennaInfo) + # Wait untill the scan finishes (one second after the scan) + targetTime = startTime + self.scan.total_time + 1*10**7 + self.waitUntilTime(targetTime) + with self.assertRaises(MinorServoErrorsEx): + self.boss.checkScan(startTime, self.scan, self.antennaInfo) + + def test_checkScan_with_scan_in_execution(self): + """checkScan() raises an exception in case there is a scan in execution.""" + startTime = getTimeStamp().value + 15*10**7 # Start in 15 seconds + self.boss.startScan(startTime, self.scan, self.antennaInfo) + # Wait untill the scan starts + targetTime = startTime + 2*10**7 # 2 seconds after the starting time + self.waitUntilTime(targetTime) + with self.assertRaises(MinorServoErrorsEx): + self.boss.checkScan(startTime, self.scan, self.antennaInfo) + + def test_checkScan_empty_scan_start_ASAP(self): + """Starting time unknown: the scan must start ASAP""" + startTime = 0 + self.scan.is_empty_scan = True + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertGreater(msInfo.startEpoch, getTimeStamp().value) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual(msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_not_empty_scan_start_ASAP(self): + """Scan not empty: starting time unknown, the scan must start ASAP""" + startTime = 0 + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertTrue(msInfo.onTheFly) + self.assertGreater(msInfo.startEpoch, getTimeStamp().value) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_empty_scan_start_at_given_time(self): + """Starting time known and achievable""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute + self.scan.is_empty_scan = True + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertFalse(msInfo.onTheFly) + self.assertEqual(msInfo.startEpoch, startTime) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_not_empty_scan_start_at_given_time(self): + """Scan not empty: starting time known and achievable""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertTrue(msInfo.onTheFly) + self.assertEqual(msInfo.startEpoch, startTime) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_too_fast(self): + """Servo not enough fast for accomplishing the scan in total_time""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute from now + self.scan.total_time = 5000000 # 0.5 seconds + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def test_checkScan_out_of_range(self): + """The scan goes out of the servo position limits""" + startTime = 0 + self.scan.range = 1000 # 1 meter + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def test_checkScan_start_time_too_close_to_now(self): + """Starting time too close to the current time""" + startTime = getTimeStamp().value + 1*10**6 # Start in 0.1 second from now + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def isAssertScan(self, startTime): + self.assertFalse(self.boss.isScanning()) + self.assertTrue(self.boss.isScanActive()) + # Assertions to verify right after startTime + self.waitUntilTime(startTime) + self.assertTrue(self.boss.isScanning()) + self.assertTrue(self.boss.isScanActive()) + self.assertAlmostEqual( + self.boss.getCentralScanPosition(), + self.centerScan, + delta=0.1) + # Wait untill the scan finishes (one second after the scan) + targetTime = startTime + self.scan.total_time + 1*10**7 + self.waitUntilTime(targetTime) + startPos = self.boss.getAxesPosition(startTime)[self.idx] + endPos = self.boss.getAxesPosition(targetTime)[self.idx] + self.assertTrue(self.boss.isScanActive()) + self.assertFalse(self.boss.isScanning()) + self.assertAlmostEqual(startPos + self.scan.range, endPos, delta=0.1) + + def getSRTPosition(self, conf_code, servo_name, elevation=45): + """Return the servo position related to the elevation. + + Parameters: + - conf_code: value returned by getActualSetup() (CCB, CCB_ASACTIVE,...) + - servo_name: SRP, GFR, M3R, PFP + - elevation: the antenna elevation, in degrees + """ + dal = ACSCorba.cdb() + dao = dal.get_DAO_Servant('alma/MINORSERVO/Boss') + body = dao.get_field_data(conf_code) + configurations = body.strip().split('@') + servos_conf = {} + for conf in configurations: + if conf: + name, value = conf.split(':') + servos_conf[name.strip()] = value.strip() + + # Example of servo_conf: + # >>> servos_conf['PFP'] + # 'RY(mm)=(-25.75); TX(mm)=(458); TZ(mm)=(-46.2);' + srp_conf = servos_conf[servo_name] + srp_items = [item.strip() for item in srp_conf.split(';')] + srp_axes = [] + for item in srp_items: + if '=' in item: + name, value = item.split('=') + srp_axes.append(value.strip()) + + # Example of srp_axes: + # >>> srp_axes + # ['(-25.75)', '(458)', '(-46.2)'] + position = [] + for axis in srp_axes: + axis = axis.lstrip('(') + axis = axis.rstrip(')') + # At this point, axis is something like '-0.23, 0.01, 3.2' + coeffs = [float(item) for item in axis.split(',')] + value = 0 + for idx, coeff in enumerate(coeffs): + value += coeff * elevation**idx + # Value: -25.75*elevation**0 + 485*elevation**1 -46.2*elevation**2 + position.append(value) + return position + + def getMEDPosition(self, conf_code, servo_name="", elevation=45): + """Return the servo position related to the elevation for MED + radiotelescope. + + Parameters: + - conf_code: value returned by getActualSetup() (CCC, KKC,...) + - servo_name: "" not use at Med + - elevation: the antenna elevation, in degrees + """ + from xml.dom.minidom import parseString + dal = ACSCorba.cdb() + dao = dal.get_DAO('alma/DataBlock/MinorServoParameters') + root = parseString(dao).documentElement + position = [] + coefficients = [] + for minorservo in root.getElementsByTagName("MinorServo"): + for code in minorservo.getElementsByTagName("code"): + if code.firstChild.data == conf_code: + if minorservo.getElementsByTagName("primary")[0].firstChild.data == "1": + yp_string_poly = minorservo.getElementsByTagName("YPaxis")[0].firstChild.data + coefficients.append(map(float,yp_string_poly.split(",")[3:])) + zp_string_poly = minorservo.getElementsByTagName("ZPaxis")[0].firstChild.data + coefficients.append(map(float,zp_string_poly.split(",")[3:])) + else: + x_string_poly = minorservo.getElementsByTagName("Xaxis")[0].firstChild.data + coefficients.append(map(float,x_string_poly.split(",")[3:])) + y_string_poly = minorservo.getElementsByTagName("Yaxis")[0].firstChild.data + coefficients.append(map(float,y_string_poly.split(",")[3:])) + z_string_poly = minorservo.getElementsByTagName("Zaxis")[0].firstChild.data + coefficients.append(map(float,z_string_poly.split(",")[3:])) + tx_string_poly = minorservo.getElementsByTagName("THETAXaxis")[0].firstChild.data + coefficients.append(map(float,tx_string_poly.split(",")[3:])) + ty_string_poly = minorservo.getElementsByTagName("THETAYaxis")[0].firstChild.data + coefficients.append(map(float,ty_string_poly.split(",")[3:])) + for coefficient in coefficients: + axis_position = 0 + for exp, coeff in enumerate(coefficient): + axis_position += (elevation)**(exp) * coeff + position.append(axis_position) + return position + + +class ScanInterfaceTest(ScanBaseTest): + """Test the interface of startScan() and closeScan()""" + + def test_checkScan_not_empty_system_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + try: + with self.assertRaises(MinorServoErrorsEx): + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + except: + with self.assertRaises(MinorServoErrorsEx): + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + + def _test_checkScan_empty_scan_system_not_ready(self): + """Do nothing in case of empty scan and system NOT ready""" + self.scan.is_empty_scan = True + self.assertFalse(self.boss.isReady()) + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_closeScan_scan_not_active(self): + """Do nothing in case no scan is active""" + try: + self.boss.closeScan() + except: + self.boss.closeScan() + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main(verbosity=2, failfast=True) # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(ScanTest, 'srt-mscu-sim') + simulator.run(ScanInterfaceTest, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py new file mode 100644 index 000000000..b9cf28096 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py @@ -0,0 +1,56 @@ +from __future__ import with_statement + +import os +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSetASConfiguration(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_right_flag(self): + """Set the AS configuration properly""" + self.boss.setASConfiguration('on') + self.assertTrue(self.boss.isASConfiguration()) + + def test_wrong_flag(self): + """Raise a MinorServoErrorsEx in case of wrong code""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.setASConfiguration('foo') + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSetASConfiguration, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py new file mode 100644 index 000000000..8f24da6d3 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py @@ -0,0 +1,56 @@ +from __future__ import with_statement + +import os +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSetElevationTracking(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_right_flag(self): + """Set the elevation tracking properly""" + self.boss.setElevationTracking('on') + self.assertTrue(self.boss.isElevationTrackingEn()) + + def test_wrong_flag(self): + """Raise a MinorServoErrorsEx in case of wrong code""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.setElevationTracking('foo') + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSetElevationTracking, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py new file mode 100644 index 000000000..e25314614 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py @@ -0,0 +1,95 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSystemOffset(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + self.axis_code = "SRP_TX" if self.telescope == "SRT" else "X" + + def tearDown(self): + #self.boss.clearSystemOffset(self.axis_code) + self.boss.setSystemOffset(self.axis_code, 0) # TODO + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + with self.assertRaises(MinorServoErrorsEx): + self.boss.setSystemOffset(self.axis_code + "WRONG", 0) + + def test_get_offset(self): + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + target_offset = 5.0 + self.boss.setSystemOffset(self.axis_code, target_offset) + offset = self.boss.getSystemOffset()[0] # SRP_TX and X both have index 0 + self.assertAlmostEqual(offset, target_offset, delta=0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSystemOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py new file mode 100644 index 000000000..269c44ce6 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + + +__author__ = "Marco Buttu " + + +class TestUserOffset(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + self.axis_code = "SRP_TX" if self.telescope == "SRT" else "X" + + def tearDown(self): + # self.boss.clearUserOffset(self.axis_code) + self.boss.setUserOffset(self.axis_code, 0) # TODO + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + with self.assertRaises(MinorServoErrorsEx): + self.boss.setUserOffset(self.axis_code + "WRONG", 0) + + def test_get_offset(self): + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + target_offset = 5.0 + self.boss.setUserOffset(self.axis_code, target_offset) + offset = self.boss.getUserOffset()[0] # SRP_TX and X both have index 0 + self.assertAlmostEqual(offset, target_offset, delta=0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestUserOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp b/SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp new file mode 100644 index 000000000..59cb6295f --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp @@ -0,0 +1,6 @@ +#include "gtest/gtest.h" + +TEST(FakeTest, Success){ + EXPECT_EQ(1, 1); +} + diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index ba0e1fb6c..1c5ee5be8 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -146,7 +146,7 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ if(args.find("OUTPUT") == args.end()) throw std::invalid_argument(std::string("Missing OUTPUT value!")); - else if(args.find("TIMESTAMP") == args.end()) + else if(std::get(args["OUTPUT"]) == "GOOD" && args.find("TIMESTAMP") == args.end()) throw std::invalid_argument(std::string("Missing TIMESTAMP value!")); } catch(const std::invalid_argument& e) diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd new file mode 100644 index 000000000..73b8de58c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd new file mode 100644 index 000000000..7b8fb9fe6 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd new file mode 100644 index 000000000..7dc0034ef --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd new file mode 100644 index 000000000..accb3d172 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd new file mode 100644 index 000000000..3b88dbbba --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h new file mode 100644 index 000000000..dd4c3a799 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -0,0 +1,213 @@ +#ifndef _MSDEVIOS_H +#define _MSDEVIOS_H + +/**********************************************************/ +/* Giuseppe Carboni 20/09/2023 */ +/**********************************************************/ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include "SRTMinorServoCommandLibrary.h" + + +struct SRTMinorServoDevIOInfo +{ + IRA::CSecureArea* secure_area; + std::string prefix = ""; + std::string property_name; + std::vector property_fields; +}; + + +/** +i * This template class is derived from DevIO and it is used by the almost all attributes of the SRT Minor Servos components. + * The associeted property can be selected at construction time and cannot be changed anymore. + * @author Giuseppe Carboni , + */ +template class MSDevIO : public DevIO +{ +public: + /** + * Constructor + * @param data pointer to a SecureArea that protects a SRTMinorServoAnswerMap object. + * @param property_info an std::pair containing the name of the property as shown in the Object Explorer and the fields to read from the SRTMinorServoAnswerMap + */ + MSDevIO(SRTMinorServoDevIOInfo property_info) + { + // The following expression will produce an error at compile time if the T class type is not one of the following + static_assert( + std::disjunction< + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same + >::value, + "Not accepted MSDevIO type!" + ); + + m_secure_area = property_info.secure_area; + m_prefix = property_info.prefix; + m_property_name = property_info.property_name; + m_property_fields = property_info.property_fields; + } + + /** + * Destructor + */ + ~MSDevIO() + { + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @arg \c ComponentErrors::Timeout + * @arg \c AntennaErrors::Connection + * @arg \c ComponentErrors::SocketError + * @param timestamp epoch when the operation completes + */ + T read(ACS::Time& timestamp) + { + if(m_secure_area) + { + IRA::CSecAreaResourceWrapper data = m_secure_area->Get(); + + try + { + if constexpr(std::is_same::value) + { + unsigned int value = std::get(data->at(m_prefix + m_property_fields[0])); + m_value = (value == 1) ? true : false; + } + else if constexpr(std::is_same::value) + { + auto object = data->at(m_prefix + m_property_fields[0]); + if(object.index() == 0) + { + m_value = double(std::get(object)); + } + else if(object.index() == 1) + { + m_value = std::get(object); + } + } + else if constexpr(std::is_same::value) + { + auto object = data->at(m_prefix + m_property_fields[0]); + if(object.index() == 0) + { + m_value = std::to_string(std::get(object)).c_str(); + } + else if(object.index() == 1) + { + m_value = std::to_string(std::get(object)).c_str(); + } + else + { + m_value = std::get(object).c_str(); + } + } + else if constexpr(std::is_same::value) + { + m_value.length(m_property_fields.size()); + + for(size_t i = 0; i < m_property_fields.size(); i++) + { + m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + } + } + else if constexpr(std::is_same::value) + { + m_value.length(m_property_fields.size()); + + for(size_t i = 0; i < m_property_fields.size(); i++) + { + m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + } + } + else if constexpr(std::is_same::value) + { + int value = std::get(data->at(m_prefix + m_property_fields[0])); + if(value > 20) + { + //BWG + value -= 11; + } + else if(value > 10) + { + //Gregorian + value -= 9; + } + + m_value = MinorServo::SRTMinorServoFocalConfiguration(value+1); + } + else if constexpr(std::is_same::value) + { + m_value = MinorServo::SRTMinorServoControlStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); + } + else if constexpr(std::is_same::value) + { + m_value = MinorServo::SRTMinorServoGregorianCoverStatus(std::get(data->at(m_prefix + m_property_fields[0]))); + } + else if constexpr(std::is_same::value) + { + m_value = MinorServo::SRTMinorServoCabinetStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); + } + else if constexpr(std::is_same::value) + { + m_value = MinorServo::SRTMinorServoOperativeMode(std::get(data->at(m_prefix + m_property_fields[0])) / 10); + } + else + { + std::cout << "Unknown type" << std::endl; + } + } + catch(ACSErr::ACSbaseExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, dummy, ex, "MSDevIO::read()"); + dummy.setPropertyName(m_property_name.c_str()); + dummy.setReason("Property could not be read"); + throw dummy; + } + } + timestamp = getTimeStamp(); //completion time + return m_value; + } + + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const T& value, ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + return; + } + +private: + IRA::CSecureArea* m_secure_area; + T m_value; + std::string m_prefix; + std::string m_property_name; + std::vector m_property_fields; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h new file mode 100644 index 000000000..bae147497 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -0,0 +1,78 @@ +#ifndef __SRTMINORSERVOBOSSCORE_H__ +#define __SRTMINORSERVOBOSSCORE_H__ + +/** + * SRTMinorServoBossCore.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ManagementErrors.h" +#include "MinorServoErrors.h" +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" +#include "SRTMinorServoBossImpl.h" +#include "SRTMinorServoSetupThread.h" +#include "SRTMinorServoParkThread.h" + +class SRTMinorServoBossImpl; +class SRTMinorServoSetupThread; +class SRTMinorServoParkThread; + +using SRTMinorServoFocalConfigurationsTable = boost::bimap; + + +class SRTMinorServoBossCore +{ +friend class SRTMinorServoBossImpl; +friend class SRTMinorServoStatusThread; +friend class SRTMinorServoSetupThread; +friend class SRTMinorServoParkThread; + +public: + SRTMinorServoBossCore(SRTMinorServoBossImpl* component); + virtual ~SRTMinorServoBossCore(); + +private: + void setup(std::string configuration); + void park(); + void status(); + bool checkControl(); + + SRTMinorServoSocketConfiguration* m_socket_configuration; + SRTMinorServoSocket* m_socket; + + SRTMinorServoSetupThread* m_setup_thread; + SRTMinorServoParkThread* m_park_thread; + + SRTMinorServoAnswerMap m_status; + + SRTMinorServoFocalConfigurationsTable m_focal_configurations_table; + + IRA::CSecureArea* m_status_secure_area; + + MinorServo::SRTMinorServoFocalConfiguration m_requested_configuration; + MinorServo::SRTMinorServoFocalConfiguration m_current_configuration; + + MinorServo::SRTGenericMinorServo_var m_GFR; + MinorServo::SRTProgramTrackMinorServo_var m_SRP; + + MinorServo::SRTMinorServoBossStatus m_boss_status; + + SRTMinorServoBossImpl* m_component; + + bool m_ready; + + std::vector m_servos; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h new file mode 100644 index 000000000..7aca8cafa --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -0,0 +1,93 @@ +#ifndef __SRTMINORSERVOBOSSIMPL_H__ +#define __SRTMINORSERVOBOSSIMPL_H__ + +/** + * SRTMinorServoBossImpl.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ManagementErrors.h" +#include "MinorServoErrors.h" +#include "SRTMinorServoBossCore.h" +#include "SRTMinorServoStatusThread.h" +#include "MSDevIOs.h" + +#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTMinorServoBossImpl::PROPERTYNAME()\ +{ \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + +// Forward classes definitions +class SRTMinorServoBossCore; +class SRTMinorServoStatusThread; + +class SRTMinorServoBossImpl: public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTMinorServoBoss +{ +friend class SRTMinorServoBossCore; +public: + // Constructor and destructor + SRTMinorServoBossImpl(const ACE_CString&, maci::ContainerServices*); + virtual ~SRTMinorServoBossImpl(); + + // Characteristic component methods + virtual void initialize(); + virtual void execute(); + virtual void cleanUp(); + virtual void aboutToAbort(); + + // Parser methods + virtual void setup(const char*); + virtual void park(); + virtual void setElevationTracking(const char*); + virtual void setASConfiguration(const char*); + virtual void setOffsets(const char*, const double&); + virtual void clearOffsets(); + + // MinorServoBoss interface methods + virtual CORBA::Boolean checkScan(const ACS::Time, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&, MinorServo::TRunTimeParameters_out); + virtual void startScan(ACS::Time&, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&); + virtual void closeScan(ACS::Time&); + + CORBA::Boolean command(const char*, CORBA::String_out); + + // Properties methods + virtual MinorServo::ROSRTMinorServoFocalConfiguration_ptr current_configuration(); + virtual ACS::ROboolean_ptr simulation_enabled(); + virtual ACS::ROdouble_ptr plc_time(); + virtual ACS::ROstring_ptr plc_version(); + virtual MinorServo::ROSRTMinorServoControlStatus_ptr control(); + virtual ACS::ROboolean_ptr power(); + virtual ACS::ROboolean_ptr emergency(); + virtual MinorServo::ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); + virtual ACS::ROdouble_ptr last_executed_command(); +private: + SRTMinorServoBossCore* m_core; + SRTMinorServoStatusThread* m_status_thread; + SimpleParser::CParser *m_parser; + + // Properties pointers + baci::SmartPropertyPointer > m_current_configuration_ptr; + baci::SmartPropertyPointer m_simulation_enabled_ptr; + baci::SmartPropertyPointer m_plc_time_ptr; + baci::SmartPropertyPointer m_plc_version_ptr; + baci::SmartPropertyPointer > m_control_ptr; + baci::SmartPropertyPointer m_power_ptr; + baci::SmartPropertyPointer m_emergency_ptr; + baci::SmartPropertyPointer > m_gregorian_cover_ptr; + baci::SmartPropertyPointer m_last_executed_command_ptr; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h new file mode 100644 index 000000000..b3910c5ea --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -0,0 +1,142 @@ +#ifndef __SRTMINORSERVOIMPL_H__ +#define __SRTMINORSERVOIMPL_H__ + +/** + * SRTMinorServoImpl.h + * 21/06/2023 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ManagementErrors.h" +#include "MinorServoErrors.h" +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" + +#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTBaseMinorServoImpl::PROPERTYNAME()\ +{ \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + +using SRTMinorServoLookupTable = std::map >; + + +class SRTBaseMinorServoImpl: public baci::CharacteristicComponentImpl +{ +public: + SRTBaseMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + virtual ~SRTBaseMinorServoImpl(); + + virtual void initialize(); + virtual void execute(); + virtual void cleanUp(); + virtual void aboutToAbort(); + + virtual void status(); + virtual void stow(CORBA::Long stow_position = 1); + virtual void stop(); + virtual void preset(const ACS::doubleSeq& coordinates); + virtual void offset(const ACS::doubleSeq& offsets); + virtual void setup(const char* configuration_name); + + virtual ACS::ROboolean_ptr enabled(); + virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + virtual ACS::ROboolean_ptr block(); + virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode(); + virtual ACS::RObooleanSeq_ptr axes_enabled(); + virtual ACS::ROdoubleSeq_ptr physical_positions(); + virtual ACS::ROdoubleSeq_ptr virtual_positions(); + virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + +protected: + unsigned int m_physical_axes, m_virtual_axes; + SRTMinorServoSocket* m_socket; + std::string m_servo_name; + +private: + SRTMinorServoSocketConfiguration* m_socket_configuration; + + SRTMinorServoAnswerMap m_status; + IRA::CSecureArea* m_status_securearea; + + std::vector m_virtual_axes_names; + SRTMinorServoLookupTable m_current_lookup_table; + + baci::SmartPropertyPointer m_enabled_ptr; + baci::SmartPropertyPointer > m_drive_cabinet_status_ptr; + baci::SmartPropertyPointer m_block_ptr; + baci::SmartPropertyPointer > m_operative_mode_ptr; + baci::SmartPropertyPointer m_axes_enabled_ptr; + baci::SmartPropertyPointer m_physical_positions_ptr; + baci::SmartPropertyPointer m_virtual_positions_ptr; + baci::SmartPropertyPointer m_virtual_offsets_ptr; + + std::vector getPropertiesTable(std::string properties_name); + SRTMinorServoLookupTable getLookupTable(std::string configuration_name); + + void checkErrors(); +}; + + +class SRTGenericMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTGenericMinorServo +{ +public: + SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + ~SRTGenericMinorServoImpl(); + + void status() { SRTBaseMinorServoImpl::status(); }; + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; + void stop() { SRTBaseMinorServoImpl::stop(); }; + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; + void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; + void setup(const char* configuration_name) { SRTBaseMinorServoImpl::setup(configuration_name); }; + + virtual ACS::ROboolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; + virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; + virtual ACS::ROboolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; + virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; + virtual ACS::RObooleanSeq_ptr axes_enabled() { return SRTBaseMinorServoImpl::axes_enabled(); }; + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; +}; + +class SRTProgramTrackMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTProgramTrackMinorServo +{ +public: + SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + ~SRTProgramTrackMinorServoImpl(); + + void status() { SRTBaseMinorServoImpl::status(); }; + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; + void stop() { SRTBaseMinorServoImpl::stop(); }; + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; + void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; + void setup(const char* configuration_name) { SRTBaseMinorServoImpl::setup(configuration_name); }; + + void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, CORBA::Double start_time, const ACS::doubleSeq& coordinates); + + virtual ACS::ROboolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; + virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; + virtual ACS::ROboolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; + virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; + virtual ACS::RObooleanSeq_ptr axes_enabled() { return SRTBaseMinorServoImpl::axes_enabled(); }; + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h new file mode 100644 index 000000000..bfdd81105 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -0,0 +1,68 @@ +#ifndef _SRTMINORSERVOPARKTHREAD_H_ +#define _SRTMINORSERVOPARKTHREAD_H_ + +/*************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMinorServoParkThread.h */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ +/*************************************************************************************/ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoBossCore.h" + +#define PARK_TIMEOUT 60 + +class SRTMinorServoBossCore; + + +/** + * This class implements a parking thread. This thread is in charge of checking the status of the minor servos parking procedure +*/ +class SRTMinorServoParkThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoParkThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void run(); + +private: + std::string m_thread_name; + SRTMinorServoBossCore* m_core; +}; + +#endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h new file mode 100644 index 000000000..157a41c5d --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -0,0 +1,68 @@ +#ifndef _SRTMINORSERVOSETUPTHREAD_H_ +#define _SRTMINORSERVOSETUPTHREAD_H_ + +/*************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMinorServoSetupThread.h */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ +/*************************************************************************************/ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoBossCore.h" + +#define SETUP_TIMEOUT 60 + +class SRTMinorServoBossCore; + + +/** + * This class implements a setup thread. This thread is in charge of checking the status of the minor servos setup procedure +*/ +class SRTMinorServoSetupThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoSetupThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void run(); + +private: + std::string m_thread_name; + SRTMinorServoBossCore* m_core; +}; + +#endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index e00f63cb7..716260101 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -7,12 +7,19 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include +#include "SuppressWarnings.h" #include +#include #include +#include +#include #include "SRTMinorServoCommandLibrary.h" + #define TIMEOUT 0.1 +#define CONFIG_DOMAIN "alma/" +#define CONFIG_DIRNAME "/MINORSERVO/Socket" + using namespace IRA; @@ -48,7 +55,7 @@ public: * @param command the command to be sent over the socket * @return the received answer to the given command */ - SRTMinorServoAnswerMap sendCommand(std::string command); + SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); /** * Copy constructor operator disabled by default @@ -117,4 +124,24 @@ private: IRA::CError m_error; }; + +class SRTMinorServoSocketConfiguration +{ +public: + static SRTMinorServoSocketConfiguration& getInstance(maci::ContainerServices* containerServices); + + SRTMinorServoSocketConfiguration(SRTMinorServoSocketConfiguration const&) = delete; + void operator=(SRTMinorServoSocketConfiguration const&) = delete; + + std::string m_ip_address; + int m_port; + double m_timeout; + +private: + SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices); + ~SRTMinorServoSocketConfiguration(); + + inline static SRTMinorServoSocketConfiguration* m_instance = nullptr; +}; + #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h new file mode 100644 index 000000000..f88870faa --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -0,0 +1,65 @@ +#ifndef _SRTMINORSERVOSTATUSTHREAD_H_ +#define _SRTMINORSERVOSTATUSTHREAD_H_ + +/*************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMinorServoStatusThread.h */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ +/*************************************************************************************/ + +#include "SuppressWarnings.h" +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoBossCore.h" + +class SRTMinorServoBossCore; + + +/** + * This class implements a status thread. This thread is in charge of checking the status of +*/ +class SRTMinorServoStatusThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoStatusThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +private: + std::string m_thread_name; + SRTMinorServoBossCore* m_core; + double m_sleep_time; +}; + +#endif /*_SRTMINORSERVOSTATUSTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h new file mode 100644 index 000000000..1421fd156 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h @@ -0,0 +1,12 @@ +#ifndef __SUPPRESSWARNINGS_H__ +#define __SUPPRESSWARNINGS_H__ + +#include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wdeprecated-declarations") +C11_IGNORE_WARNING("-Wmisleading-indentation") +C11_IGNORE_WARNING("-Wcatch-value=") +C11_IGNORE_WARNING_POP +#include + +#endif diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index 6cca032de..39ea58207 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -11,16 +11,34 @@ EXECUTABLES_L = # On-Line Database Files # ---------------------- -CDB_SCHEMAS = +CDB_SCHEMAS = SRTMinorServoBoss SRTMinorServo SRTMinorServoSocket SRTMinorServoProperties SRTMinorServoLookupTable # ---------------------------- # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoSocket +LIBRARIES = SRTMinorServoSocket SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl SRTMinorServoSocket_OBJECTS = SRTMinorServoSocket -SRTMinorServoSocket_CFLAGS = -std=c++17 SRTMinorServoSocket_LIBS = IRALibrary ComponentErrors SRTMinorServoCommandLibrary +SRTMinorServoSocket_CFLAGS = -std=c++17 + +SRTMinorServoBossImpl_OBJECTS = SRTMinorServoStatusThread SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoBossCore SRTMinorServoBossImpl +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket ParserErrors DiscosVersion +SRTMinorServoBossImpl_CFLAGS = -std=c++17 +SRTMinorServoBossCore_CFLAGS = -std=c++17 +SRTMinorServoStatusThread_CFLAGS = -std=c++17 +SRTMinorServoSetupThread_CFLAGS = -std=c++17 +SRTMinorServoParkThread_CFLAGS = -std=c++17 + +SRTGenericMinorServoImpl_OBJECTS = SRTGenericMinorServoImpl SRTBaseMinorServoImpl +SRTGenericMinorServoImpl_LIBS = SRTBaseMinorServoImpl IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion +SRTGenericMinorServoImpl_CFLAGS = -std=c++17 + +SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl +SRTProgramTrackMinorServoImpl_LIBS = SRTBaseMinorServoImpl IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion +SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 + +SRTBaseMinorServoImpl_CFLAGS = -std=c++17 # ---------------------------------------------------------------------- diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp new file mode 100644 index 000000000..d9440e71b --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -0,0 +1,318 @@ +#include "SRTMinorServoImpl.h" + +using namespace maci; + +SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : + CharacteristicComponentImpl(componentName, containerServices), + m_enabled_ptr(this), + m_drive_cabinet_status_ptr(this), + m_block_ptr(this), + m_operative_mode_ptr(this), + m_axes_enabled_ptr(this), + m_physical_positions_ptr(this), + m_virtual_positions_ptr(this), + m_virtual_offsets_ptr(this) +{ + std::string component_name(componentName.c_str()); + m_servo_name = component_name.substr(component_name.rfind('/') + 1); + + AUTO_TRACE(m_servo_name + "::SRTBaseMinorServoImpl()"); +} + +SRTBaseMinorServoImpl::~SRTBaseMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTBaseMinorServoImpl()"); +} + +void SRTBaseMinorServoImpl::initialize() +{ + AUTO_TRACE(m_servo_name + "::initialize()"); + + if(!IRA::CIRATools::getDBValue(getContainerServices(), "physical_axes", m_physical_axes)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, (m_servo_name + "::initialize()").c_str()); + exImpl.setFieldName("physical_axes"); + throw exImpl; + } + if(!IRA::CIRATools::getDBValue(getContainerServices(), "virtual_axes", m_virtual_axes)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, (m_servo_name + "::initialize()").c_str()); + exImpl.setFieldName("virtual_axes"); + throw exImpl; + } + + m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(getContainerServices()); + m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); + + m_status = SRTMinorServoAnswerMap(); + m_socket->sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); + m_status_securearea = new IRA::CSecureArea(&m_status); + + try + { + std::string component_name = getContainerServices()->getName().c_str(); + + SRTMinorServoDevIOInfo dev_io_info; + dev_io_info.prefix = m_servo_name + "_"; + dev_io_info.secure_area = m_status_securearea; + + dev_io_info.property_name = "enabled"; + dev_io_info.property_fields = std::vector{ "ENABLED" }; + m_enabled_ptr = new baci::ROboolean((component_name + ":enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "drive_cabinet_status"; + dev_io_info.property_fields = std::vector{ "STATUS" }; + m_drive_cabinet_status_ptr = new ROEnumImpl((component_name + ":drive_cabinet_status").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "block"; + dev_io_info.property_fields = std::vector{ "BLOCK" }; + m_block_ptr = new baci::ROboolean((component_name + ":block").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "operative_mode"; + dev_io_info.property_fields = std::vector{ "OPERATIVE_MODE" }; + m_operative_mode_ptr = new ROEnumImpl((component_name + ":operative_mode").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "axes_enabled"; + dev_io_info.property_fields = getPropertiesTable("axes_enabled"); + if(dev_io_info.property_fields.size() != m_physical_axes) + { + // Wrong length for axes_enabled property + } + m_axes_enabled_ptr = new baci::RObooleanSeq((component_name + ":axes_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "physical_positions"; + dev_io_info.property_fields = getPropertiesTable("physical_positions"); + if(dev_io_info.property_fields.size() != m_physical_axes) + { + // Wrong length for physical_positions property + } + m_physical_positions_ptr = new baci::ROdoubleSeq((component_name + ":physical_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + m_virtual_axes_names = getPropertiesTable("virtual_positions"); + dev_io_info.property_name = "virtual_positions"; + dev_io_info.property_fields = m_virtual_axes_names; + if(m_virtual_axes_names.size() != m_virtual_axes) + { + // Wrong length for virtual_axes property + } + m_virtual_positions_ptr = new baci::ROdoubleSeq((component_name + ":virtual_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "virtual_offsets"; + dev_io_info.property_fields = getPropertiesTable("virtual_offsets"); + if(dev_io_info.property_fields.size() != m_virtual_axes) + { + // Wrong length for virtual_offsets property + } + m_virtual_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_offsets").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + } + catch(std::bad_alloc& ex) + { + _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl, std::string(m_servo_name + "::initialize()").c_str()); + } +} + +void SRTBaseMinorServoImpl::execute() +{ + AUTO_TRACE(m_servo_name + "::execute()"); +} + +void SRTBaseMinorServoImpl::cleanUp() +{ + AUTO_TRACE(m_servo_name + "::cleanUp()"); +} + +void SRTBaseMinorServoImpl::aboutToAbort() +{ + AUTO_TRACE(m_servo_name + "::aboutToAbort()"); +} + +void SRTBaseMinorServoImpl::status() +{ + AUTO_TRACE(m_servo_name + "::status()"); + + IRA::CSecAreaResourceWrapper area = m_status_securearea->Get(); + m_socket->sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), *area); +} + +void SRTBaseMinorServoImpl::stow(CORBA::Long stow_position) +{ + AUTO_TRACE(m_servo_name + "::stow()"); + checkErrors(); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::stow(m_servo_name, (unsigned int)stow_position)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::StowErrorExImpl, std::string(m_servo_name + "::stow()").c_str()); + } +} + +void SRTBaseMinorServoImpl::stop() +{ + AUTO_TRACE(m_servo_name + "::stop()"); + checkErrors(); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::stop(m_servo_name)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, std::string(m_servo_name + "::stop()").c_str()); + } +} + +void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) +{ + AUTO_TRACE(m_servo_name + "::preset()"); + checkErrors(); + + if(virtual_coordinates.length() != m_virtual_axes) + { + //Wrong number of virtual_coordinates + } + else if(m_current_lookup_table.empty()) + { + // Empty lookup table, cannot execute + } + + std::vector coords(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, coords)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::PositioningErrorExImpl, std::string(m_servo_name + "::preset()").c_str()); + } +} + +void SRTBaseMinorServoImpl::offset(const ACS::doubleSeq& virtual_offsets) +{ + AUTO_TRACE(m_servo_name + "::offset()"); + checkErrors(); + + if(virtual_offsets.length() != m_virtual_axes) + { + //Wrong number of virtual_offsets + } + + std::vector offsets(virtual_offsets.get_buffer(), virtual_offsets.get_buffer() + virtual_offsets.length()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::OffsetErrorExImpl, std::string(m_servo_name + "::offset()").c_str()); + } +} + +void SRTBaseMinorServoImpl::setup(const char* configuration_name) +{ + m_current_lookup_table = getLookupTable(std::string(configuration_name)); +} + +std::vector SRTBaseMinorServoImpl::getPropertiesTable(std::string properties_name) +{ + AUTO_TRACE(m_servo_name + "::getPropertiesTable()"); + + std::vector properties; + + IRA::CDBTable table(getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field property_name", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, dummy, error); + dummy.setCode(error.getErrorCode()); + dummy.setDescription((const char *)error.getDescription()); + throw dummy; + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + properties.push_back(std::string(table["property_name"]->asString())); + } + table.closeTable(); + + return properties; +} + +SRTMinorServoLookupTable SRTBaseMinorServoImpl::getLookupTable(std::string configuration_name) +{ + AUTO_TRACE(m_servo_name + "::getLookupTable()"); + + IRA::CDBTable table(getContainerServices(), configuration_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "axis", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field axis", 0); + } + if(!table.addField(error, "coefficients", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field coefficients", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, dummy, error); + dummy.setCode(error.getErrorCode()); + dummy.setDescription((const char *)error.getDescription()); + throw dummy; + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + + SRTMinorServoLookupTable lookup_table; + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + std::string axis = std::string(table["axis"]->asString()); + + std::vector coefficients; + + std::string coefficient_str; + std::stringstream stream(std::string(table["coefficients"]->asString())); + + while(std::getline(stream, coefficient_str, ',')) + { + coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + } + + lookup_table[axis] = coefficients; + } + table.closeTable(); + + return lookup_table; +} + +void SRTBaseMinorServoImpl::checkErrors() +{ + ACSErr::Completion_var comp; + if(block()->get_sync(comp.out()) || drive_cabinet_status()->get_sync(comp.out()) == MinorServo::DRIVE_CABINET_ERROR) + { + _THROW_EXCPT(MinorServoErrors::StatusErrorExImpl, std::string(m_servo_name + "::checkErrors()").c_str()); + } +} + +GET_PROPERTY_REFERENCE(ACS::ROboolean, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoCabinetStatus, m_drive_cabinet_status_ptr, drive_cabinet_status); +GET_PROPERTY_REFERENCE(ACS::ROboolean, m_block_ptr, block); +GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoOperativeMode, m_operative_mode_ptr, operative_mode); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, m_axes_enabled_ptr, axes_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_positions_ptr, virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_offsets_ptr, virtual_offsets); diff --git a/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp new file mode 100644 index 000000000..1fe27bfc1 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp @@ -0,0 +1,15 @@ +#include "SRTMinorServoImpl.h" + +using namespace maci; + +SRTGenericMinorServoImpl::SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : SRTBaseMinorServoImpl(componentName, containerServices) +{ + AUTO_TRACE(m_servo_name + "::SRTGenericMinorServoImpl()"); +} + +SRTGenericMinorServoImpl::~SRTGenericMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTGenericMinorServoImpl()"); +} + +MACI_DLL_SUPPORT_FUNCTIONS(SRTGenericMinorServoImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp new file mode 100644 index 000000000..d832853ce --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -0,0 +1,213 @@ +#include "SRTMinorServoBossCore.h" + +using namespace maci; + +SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl* component) +{ + AUTO_TRACE("SRTMinorServoBossCore::SRTMinorServoBossCore()"); + + m_boss_status = MinorServo::BOSS_STATUS_UNCONFIGURED; + + m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + m_requested_configuration = MinorServo::CONFIGURATION_UNKNOWN; + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Primario", MinorServo::CONFIGURATION_PRIMARY)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano1", MinorServo::CONFIGURATION_GREGORIAN1)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano2", MinorServo::CONFIGURATION_GREGORIAN2)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano3", MinorServo::CONFIGURATION_GREGORIAN3)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano4", MinorServo::CONFIGURATION_GREGORIAN4)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano5", MinorServo::CONFIGURATION_GREGORIAN5)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano6", MinorServo::CONFIGURATION_GREGORIAN6)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano7", MinorServo::CONFIGURATION_GREGORIAN7)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano8", MinorServo::CONFIGURATION_GREGORIAN8)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG1", MinorServo::CONFIGURATION_BWG1)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG2", MinorServo::CONFIGURATION_BWG2)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG3", MinorServo::CONFIGURATION_BWG3)); + m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG4", MinorServo::CONFIGURATION_BWG4)); + + m_component = component; + + m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(m_component->getContainerServices()); + m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); + + m_status = SRTMinorServoAnswerMap(); + m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); + m_status_secure_area = new IRA::CSecureArea(&m_status); + + m_GFR = m_component->getContainerServices()->getComponent("MINORSERVO/GFR"); + m_SRP = m_component->getContainerServices()->getComponent("MINORSERVO/SRP"); + + m_servos.push_back((MinorServo::SRTBaseMinorServo_ptr)m_GFR); + m_servos.push_back((MinorServo::SRTBaseMinorServo_ptr)m_SRP); + + m_setup_thread = NULL; + m_park_thread = NULL; + + m_ready = false; +} + +SRTMinorServoBossCore::~SRTMinorServoBossCore() +{ + AUTO_TRACE("SRTMinorServoBossCore::~SRTMinorServoBossCore()"); + + if(m_setup_thread != NULL) + { + m_setup_thread->suspend(); + m_setup_thread->terminate(); + m_component->getContainerServices()->getThreadManager()->destroy(m_setup_thread); + } + if(m_park_thread != NULL) + { + m_park_thread->suspend(); + m_park_thread->terminate(); + m_component->getContainerServices()->getThreadManager()->destroy(m_park_thread); + } +} + +void SRTMinorServoBossCore::setup(std::string configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::setup()"); + + ACSErr::Completion_var comp; + + if(!checkControl() || m_component->emergency()->get_sync(comp.out())) + { + // Minor servos are controlled by VBrain or there is an emergency button pressed somewhere + // I raise OperationNotPermitted since there is no other, more fitting error + _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, "SRTMinorServoBossCore::setup()"); + } + + MinorServo::SRTMinorServoFocalConfiguration requested_configuration; + + try + { + requested_configuration = m_focal_configurations_table.left.at(configuration); + } + catch(std::out_of_range& ex) // Unknown configuration + { + _THROW_EXCPT(MinorServoErrors::ConfigurationErrorExImpl, "SRTMinorServoBossCore::setup()"); + } + + // Exit if commanded configuration is already in place + if(requested_configuration == m_current_configuration && (m_boss_status == MinorServo::BOSS_STATUS_CONFIGURED || m_boss_status == MinorServo::BOSS_STATUS_SETUP_IN_PROGRESS)) + { + return; + } + + m_requested_configuration = requested_configuration; + + // Stop the setup and park threads if running + if(m_setup_thread != NULL) + { + m_setup_thread->suspend(); + m_setup_thread->terminate(); + } + if(m_park_thread != NULL) + { + m_park_thread->suspend(); + m_park_thread->terminate(); + } + + m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + m_boss_status = MinorServo::BOSS_STATUS_SETUP_IN_PROGRESS; + + // Send the STOP command to each servo + for(auto& servo : m_servos) + { + servo->stop(); + } + + // Start the setup thread + if(m_setup_thread != NULL) + { + m_setup_thread->restart(); + } + else + { + try + { + m_setup_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoBossCoreSetupThread", m_component->m_core); + } + catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::setup()"); + } + + m_setup_thread->resume(); + } +} + +void SRTMinorServoBossCore::park() +{ + AUTO_TRACE("SRTMinorServoBossCore::park()"); + + ACSErr::Completion_var comp; + + if(!checkControl() || m_component->emergency()->get_sync(comp.out())) + { + // Minor servos are controlled by VBrain or there is an emergency button pressed somewhere + // I raise OperationNotPermitted since there is no other, more fitting error + _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, "SRTMinorServoBossCore::setup()"); + } + + m_requested_configuration = MinorServos::CONFIGURATION_PARK; + + // Stop the setup and park threads if running + if(m_setup_thread != NULL) + { + m_setup_thread->suspend(); + m_setup_thread->terminate(); + } + if(m_park_thread != NULL) + { + m_park_thread->suspend(); + m_park_thread->terminate(); + } + + m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + m_boss_status = MinorServo::BOSS_STATUS_PARK_IN_PROGRESS; + + // Send the STOW command to the gregorian cover + if(std::get(m_socket->sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2))["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::SetupErrorExImpl, "SRTMinorServoBossCore::park()"); + } + + // Send the STOP command to each servo + for(auto& servo : m_servos) + { + servo->stop(); + } + + // Start the park thread + if(m_park_thread != NULL) + { + m_park_thread->restart(); + } + else + { + try + { + m_park_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoBossCoreParkThread", m_component->m_core); + } + catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::park()"); + } + + m_park_thread->resume(); + } +} + +void SRTMinorServoBossCore::status() +{ + AUTO_TRACE("SRTMinorServoBossCore::status()"); + + IRA::CSecAreaResourceWrapper status = m_status_secure_area->Get(); + m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); +} + +bool SRTMinorServoBossCore::checkControl() +{ + ACSErr::Completion_var comp; + return m_component->control()->get_sync(comp.out()) == MinorServo::CONTROL_DISCOS ? true : false; +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp new file mode 100644 index 000000000..18aa0cf50 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -0,0 +1,250 @@ +#include "SRTMinorServoBossImpl.h" + +using namespace maci; +using namespace SimpleParser; + +SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : + CharacteristicComponentImpl(componentName, containerServices), + m_core(NULL), + m_parser(NULL), + m_current_configuration_ptr(this), + m_simulation_enabled_ptr(this), + m_plc_time_ptr(this), + m_plc_version_ptr(this), + m_control_ptr(this), + m_power_ptr(this), + m_emergency_ptr(this), + m_gregorian_cover_ptr(this), + m_last_executed_command_ptr(this) +{ + AUTO_TRACE("SRTMinorServoBossImpl::SRTMinorServoBossImpl()"); +} + +SRTMinorServoBossImpl::~SRTMinorServoBossImpl() +{ + AUTO_TRACE("SRTMinorServoBossImpl::~SRTMinorServoBossImpl()"); + + if(m_parser != NULL) + { + delete m_parser; + } + if(m_core != NULL) + { + delete m_core; + } +} + +void SRTMinorServoBossImpl::initialize() +{ + AUTO_TRACE("SRTMinorServoBossImpl::initialize()"); + + m_core = new SRTMinorServoBossCore(this); + + try + { + std::string component_name = getContainerServices()->getName().c_str(); + + SRTMinorServoDevIOInfo dev_io_info; + dev_io_info.secure_area = m_core->m_status_secure_area; + + dev_io_info.property_name = "current_configuration"; + dev_io_info.property_fields = std::vector{ "CURRENT_CONFIG" }; + m_current_configuration_ptr = new ROEnumImpl((component_name + ":current_configuration").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "simulation_enabled"; + dev_io_info.property_fields = std::vector{ "SIMULATION_ENABLED" }; + m_simulation_enabled_ptr = new baci::ROboolean((component_name + ":simulation_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "plc_time"; + dev_io_info.property_fields = std::vector{ "PLC_TIME" }; + m_plc_time_ptr = new baci::ROdouble((component_name + ":plc_time").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "plc_version"; + dev_io_info.property_fields = std::vector{ "PLC_VERSION" }; + m_plc_version_ptr = new baci::ROstring((component_name + ":plc_version").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "control"; + dev_io_info.property_fields = std::vector{ "CONTROL" }; + m_control_ptr = new ROEnumImpl((component_name + ":control").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "power"; + dev_io_info.property_fields = std::vector{ "POWER" }; + m_power_ptr = new baci::ROboolean((component_name + ":power").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "emergency"; + dev_io_info.property_fields = std::vector{ "EMERGENCY" }; + m_emergency_ptr = new baci::ROboolean((component_name + ":emergency").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "gregorian_cover"; + dev_io_info.property_fields = std::vector{ "GREGORIAN_CAP" }; + m_gregorian_cover_ptr = new ROEnumImpl((component_name + ":gregorian_cover").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + + dev_io_info.property_name = "last_executed_command"; + dev_io_info.property_fields = std::vector{ "LAST_EXECUTED_COMMAND" }; + m_last_executed_command_ptr = new baci::ROdouble((component_name + ":last_executed_command").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + } + catch(std::bad_alloc& ex) + { + _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl, "SRTMinorServoBossImpl::initialize()"); + } + + m_parser = new SimpleParser::CParser(this, 10); + + m_parser->add("servoSetup", new function1 >(this, &SRTMinorServoBossImpl::setup), 1); + m_parser->add("servoPark", new function0(this, &SRTMinorServoBossImpl::park), 0); + m_parser->add("setServoElevationTracking", new function1 >(this, &SRTMinorServoBossImpl::setElevationTracking), 1); + m_parser->add("setServoASConfiguration", new function1 >(this, &SRTMinorServoBossImpl::setASConfiguration), 1); + m_parser->add("setServoOffset", new function2, I >(this, &SRTMinorServoBossImpl::setOffsets), 2); + m_parser->add("clearServoOffsets", new function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); + + //m_GFR = getContainerServices()->getComponent("MINORSERVO/GFR"); + //m_SRP = getContainerServices()->getComponent("MINORSERVO/SRP"); + + try + { + double status_thread_period; + if(!IRA::CIRATools::getDBValue(getContainerServices(), "status_thread_period", status_thread_period)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoBossImpl::initialize()"); + exImpl.setFieldName("status_thread_period"); + throw exImpl; + } + m_status_thread = getContainerServices()->getThreadManager()->create("SRTMinorServoBossImplStatusThread", m_core); + m_status_thread->setSleepTime(status_thread_period * 10000000); + m_status_thread->resume(); + } + catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::initialize()"); + } + catch(...) + { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl, "SRTMinorServoBossImpl::initialize()"); + } +} + +void SRTMinorServoBossImpl::execute() +{ + AUTO_TRACE("SRTMinorServoBossImpl::execute()"); +} + +void SRTMinorServoBossImpl::cleanUp() +{ + AUTO_TRACE("SRTMinorServoBossImpl::cleanUp()"); + stopPropertiesMonitoring(); + + if(m_status_thread != NULL) + { + m_status_thread->suspend(); + m_status_thread->terminate(); + } + + CharacteristicComponentImpl::cleanUp(); +} + +void SRTMinorServoBossImpl::aboutToAbort() +{ + AUTO_TRACE("SRTMinorServoBossImpl::aboutToAbort()"); + stopPropertiesMonitoring(); + + if(m_status_thread != NULL) + { + m_status_thread->suspend(); + m_status_thread->terminate(); + } + + CharacteristicComponentImpl::aboutToAbort(); +} + +void SRTMinorServoBossImpl::setup(const char* configuration) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setup()"); + m_core->setup(std::string(configuration)); +} + +void SRTMinorServoBossImpl::park() +{ + AUTO_TRACE("SRTMinorServoBossImpl::park()"); + m_core->park(); +} + +void SRTMinorServoBossImpl::setElevationTracking(const char* value) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setElevationTracking()"); +} + +void SRTMinorServoBossImpl::setASConfiguration(const char* value) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setASConfiguration()"); +} + +void SRTMinorServoBossImpl::setOffsets(const char* axis_code, const double& offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setOffset()"); +} + +void SRTMinorServoBossImpl::clearOffsets() +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); + // Loop through servos and clear their offsets +} + +CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time startingTime, const MinorServo::MinorServoScan &scan, const Antenna::TRunTimeParameters &antennaInfo, MinorServo::TRunTimeParameters_out msParameters) +{ + return true; +} + +void SRTMinorServoBossImpl::startScan(ACS::Time &startingTime, const MinorServo::MinorServoScan &scan, const Antenna::TRunTimeParameters &antennaInfo) +{ +} + +void SRTMinorServoBossImpl::closeScan(ACS::Time &timeToStop) +{ +} + +CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out answer) +{ + AUTO_TRACE("SRTMinorServoBossImpl::command()"); + + IRA::CString out; + bool res; + try + { + m_parser->run(cmd, out); + res = true; + } + catch(ParserErrors::ParserErrorsExImpl& ex) + { + res = false; + } + catch(ManagementErrors::ConfigurationErrorExImpl& ex) + { + ex.log(LM_ERROR); + res = false; + } + catch(ACSErr::ACSbaseExImpl& ex) + { + ex.log(LM_ERROR); + res = false; + } + catch(...) + { + ACS_SHORT_LOG((LM_WARNING, "SRTMinorServoBoss::command(): unknown exception.")); + res = false; + } + answer = CORBA::string_dup((const char *)out); + return res; +} + +GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoFocalConfiguration, m_current_configuration_ptr, current_configuration); +GET_PROPERTY_REFERENCE(ACS::ROboolean, m_simulation_enabled_ptr, simulation_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdouble, m_plc_time_ptr, plc_time); +GET_PROPERTY_REFERENCE(ACS::ROstring, m_plc_version_ptr, plc_version); +GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoControlStatus, m_control_ptr, control); +GET_PROPERTY_REFERENCE(ACS::ROboolean, m_power_ptr, power); +GET_PROPERTY_REFERENCE(ACS::ROboolean, m_emergency_ptr, emergency); +GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoGregorianCoverStatus, m_gregorian_cover_ptr, gregorian_cover); +GET_PROPERTY_REFERENCE(ACS::ROdouble, m_last_executed_command_ptr, last_executed_command); + +#include +MACI_DLL_SUPPORT_FUNCTIONS(SRTMinorServoBossImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp new file mode 100644 index 000000000..ab252745f --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -0,0 +1,59 @@ +#include "SRTMinorServoParkThread.h" + +SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): + ACS::Thread(name, responseTime, sleepTime), + m_core(core) +{ + m_thread_name = std::string(name.c_str()); + AUTO_TRACE(m_thread_name + "::SRTMinorServoParkThread()"); +} + +SRTMinorServoParkThread::~SRTMinorServoParkThread() +{ + AUTO_TRACE(m_thread_name + "::~SRTMinorServoParkThread()"); +} + +void SRTMinorServoParkThread::onStart() +{ + AUTO_TRACE(m_thread_name + "::onStart()"); +} + +void SRTMinorServoParkThread::onStop() +{ + AUTO_TRACE(m_thread_name + "::onStop()"); +} + +void SRTMinorServoParkThread::run() +{ + AUTO_TRACE(m_thread_name + "::run()"); + ACSErr::Completion_var comp; + double start_time = CIRATools::getUNIXEpoch(); + + while(true) + { + // First we check if the gregorian cover has closed + bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == MinorServo::COVER_STATUS_CLOSED ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is STOP + if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool + { + ACSErr::Completion_var comp; + return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + })) + { + break; + } + + if(CIRATools::getUNIXEpoch() - start_time >= PARK_TIMEOUT) + { + m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; + m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + return; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + m_core->m_current_configuration = MinorServo::CONFIGURATION_PARK; + m_core->m_boss_status = MinorServo::BOSS_STATUS_CONFIGURED; +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp new file mode 100644 index 000000000..23a912897 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -0,0 +1,111 @@ +#include "SRTMinorServoSetupThread.h" + +SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): + ACS::Thread(name, responseTime, sleepTime), + m_core(core) +{ + m_thread_name = std::string(name.c_str()); + AUTO_TRACE(m_thread_name + "::SRTMinorServoSetupThread()"); +} + +SRTMinorServoSetupThread::~SRTMinorServoSetupThread() +{ + AUTO_TRACE(m_thread_name + "::~SRTMinorServoSetupThread()"); +} + +void SRTMinorServoSetupThread::onStart() +{ + AUTO_TRACE(m_thread_name + "::onStart()"); +} + +void SRTMinorServoSetupThread::onStop() +{ + AUTO_TRACE(m_thread_name + "::onStop()"); +} + +void SRTMinorServoSetupThread::run() +{ + AUTO_TRACE(m_thread_name + "::run()"); + double start_time = CIRATools::getUNIXEpoch(); + std::string configuration_name = m_core->m_focal_configurations_table.right.at(m_core->m_requested_configuration); + MinorServo::SRTMinorServoGregorianCoverStatus gregorian_cover_position = m_core->m_requested_configuration == MinorServo::CONFIGURATION_PRIMARY ? MinorServo::COVER_STATUS_CLOSED : MinorServo::COVER_STATUS_OPEN; + ACSErr::Completion_var comp; + + // Check if all the servos stopped + while(!std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool + { + ACSErr::Completion_var comp; + return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + })) + { + if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) + { + m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; + m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + return; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + // Send the SETUP command + if(std::get(m_core->m_socket->sendCommand(SRTMinorServoCommandLibrary::setup(configuration_name))["OUTPUT"]) != "GOOD") + { + _THROW_EXCPT(MinorServoErrors::SetupErrorExImpl, "SRTMinorServoBossCore::setup()"); + } + + // Wait for the system to show the commanded configuration + while(m_core->m_component->current_configuration()->get_sync(comp.out()) != m_core->m_current_configuration) + { + if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) + { + m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; + m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + return; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + // Wait for the whole system to reach the desired configuration + while(true) + { + // First we check the status of the gregorian cover + bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == gregorian_cover_position ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is SETUP + if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool + { + ACSErr::Completion_var comp; + return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_SETUP ? true : false; + })) + { + break; + } + + if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) + { + m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; + m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + return; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + if(m_core->m_component->current_configuration()->get_sync(comp.out()) != m_core->m_requested_configuration) + { + m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; + m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; + return; + } + + // Finally load the servos coefficients + for(auto& servo : m_core->m_servos) + { + servo->setup(configuration_name.c_str()); + } + + m_core->m_current_configuration = m_requested_configuration; + m_core->m_boss_status = MinorServo::BOSS_STATUS_CONFIGURED; +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp index a66fa5e0a..2bb4529fb 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp @@ -1,5 +1,4 @@ #include "SRTMinorServoSocket.h" -#include std::mutex SRTMinorServoSocket::c_mutex; @@ -84,7 +83,7 @@ SRTMinorServoSocket::~SRTMinorServoSocket() Close(m_error); } -SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) +SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) { std::lock_guard guard(m_mutex); @@ -107,7 +106,6 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) Close(m_error); ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); exImpl.addData("Reason", "Timeout when sending command."); - std::cout << "Timeout sending command" << std::endl; throw exImpl; } } @@ -131,10 +129,64 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command) Close(m_error); ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); exImpl.addData("Reason", "Timeout when receiving answer."); - std::cout << "Timeout receiving answer" << std::endl; throw exImpl; } } + SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); + if(map) + { + map->get() = map_answer; + } + + return map_answer; +} + +SRTMinorServoSocketConfiguration& SRTMinorServoSocketConfiguration::getInstance(maci::ContainerServices* containerServices) +{ + if(m_instance == nullptr) + { + m_instance = new SRTMinorServoSocketConfiguration(containerServices); + } + + return *m_instance; +} + +SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices) +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + + IRA::CString _ip_address; + if(!IRA::CIRATools::getDBValue(containerServices, "IPAddress", _ip_address, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); + exImpl.setFieldName("IPAddress"); + throw exImpl; + } + m_ip_address = (std::string)_ip_address; + + DWORD port; + if(!IRA::CIRATools::getDBValue(containerServices, "Port", port, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); + exImpl.setFieldName("Port"); + throw exImpl; + } + else + { + m_port = port; + } + + if(!IRA::CIRATools::getDBValue(containerServices, "SocketTimeout", m_timeout, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); + exImpl.setFieldName("SocketTimeout"); + throw exImpl; + } +} + +SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration() +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration()"); - return SRTMinorServoCommandLibrary::parseAnswer(answer); + delete m_instance; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp new file mode 100644 index 000000000..34931063c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -0,0 +1,47 @@ +#include "SRTMinorServoStatusThread.h" + +SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): + ACS::Thread(name, responseTime, sleepTime), + m_core(core) +{ + m_thread_name = std::string(name.c_str()); + AUTO_TRACE(m_thread_name + "::SRTMinorServoStatusThread()"); +} + +SRTMinorServoStatusThread::~SRTMinorServoStatusThread() +{ + AUTO_TRACE(m_thread_name + "::~SRTMinorServoStatusThread()"); +} + +void SRTMinorServoStatusThread::onStart() +{ + AUTO_TRACE(m_thread_name + "::onStart()"); + m_sleep_time = this->getSleepTime(); +} + +void SRTMinorServoStatusThread::onStop() +{ + AUTO_TRACE(m_thread_name + "::onStop()"); +} + +void SRTMinorServoStatusThread::runLoop() +{ + AUTO_TRACE(m_thread_name + "::runLoop()"); + + TIMEVALUE now; + IRA::CIRATools::getTime(now); + ACS::Time time = now.value().value; + ACS::Time next = time + m_sleep_time; + + m_core->status(); + + for(auto& servo : m_core->m_servos) + { + servo->status(); + } + + IRA::CIRATools::getTime(now); + time = now.value().value; + ACS::TimeInterval sleep_time = next - time; + this->setSleepTime(std::max(long(sleep_time), long(0))); +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp new file mode 100644 index 000000000..4a24df7cd --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -0,0 +1,34 @@ +#include "SRTMinorServoImpl.h" + +using namespace maci; + +SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : SRTBaseMinorServoImpl(componentName, containerServices) +{ + AUTO_TRACE(m_servo_name + "::SRTProgramTrackMinorServoImpl()"); +} + +SRTProgramTrackMinorServoImpl::~SRTProgramTrackMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTProgramTrackMinorServoImpl()"); +} + +void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, CORBA::Double start_time, const ACS::doubleSeq& virtual_coordinates) +{ + AUTO_TRACE("SRTProgramTrackMinorServoImpl::programTrack()"); + + if(virtual_coordinates.length() != m_virtual_axes) + { + //Wrong number of virtual_coordinates + } + + std::vector coords(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coords, start_time)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + std::cout << "Cannot execute programTrack" << std::endl; + } +} + +MACI_DLL_SUPPORT_FUNCTIONS(SRTProgramTrackMinorServoImpl) -- GitLab From 2630ae611c5e5e168ce2a0dcf7185cbecef5d136 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 29 Nov 2023 09:34:03 +0100 Subject: [PATCH 044/150] Skarab component (#819) * implementing new Skarab component * adapted to skarab component * skarab components updates * skarab components updates --------- Co-authored-by: Carlo Migoni --- .../BackendsInterface/idl/Skarab.idl | 138 ++ .../Interfaces/BackendsInterface/src/Makefile | 3 +- .../Skarab/config/CDB/schemas/Skarab.xsd | 134 ++ .../Skarab/config/CDB/schemas/SkarabSetup.xsd | 141 ++ Common/Servers/Skarab/include/CommandLine.h | 793 +++++++ Common/Servers/Skarab/include/Common.h | 52 + Common/Servers/Skarab/include/Configuration.h | 197 ++ Common/Servers/Skarab/include/ControlThread.h | 74 + .../Servers/Skarab/include/DevIOAttenuation.h | 99 + .../Servers/Skarab/include/DevIOBandWidth.h | 94 + Common/Servers/Skarab/include/DevIOBins.h | 95 + Common/Servers/Skarab/include/DevIOBusy.h | 100 + Common/Servers/Skarab/include/DevIOFeed.h | 94 + .../Servers/Skarab/include/DevIOFrequency.h | 95 + .../Skarab/include/DevIOInputSection.h | 95 + .../Skarab/include/DevIOInputsNumber.h | 97 + .../Servers/Skarab/include/DevIOIntegration.h | 97 + .../Skarab/include/DevIOPolarization.h | 95 + .../Servers/Skarab/include/DevIOSampleRate.h | 94 + .../Skarab/include/DevIOSectionsNumber.h | 97 + Common/Servers/Skarab/include/DevIOStatus.h | 97 + Common/Servers/Skarab/include/DevIOTime.h | 96 + Common/Servers/Skarab/include/DevIOTsys.h | 96 + Common/Servers/Skarab/include/Protocol.h | 345 +++ Common/Servers/Skarab/include/SenderThread.h | 171 ++ Common/Servers/Skarab/include/SkarabImpl.h | 503 ++++ Common/Servers/Skarab/src/CommandLine.cpp | 2093 +++++++++++++++++ Common/Servers/Skarab/src/Configuration.cpp | 224 ++ Common/Servers/Skarab/src/ControlThread.cpp | 43 + Common/Servers/Skarab/src/Makefile | 215 ++ Common/Servers/Skarab/src/Protocol.cpp | 596 +++++ Common/Servers/Skarab/src/SenderThread.cpp | 358 +++ Common/Servers/Skarab/src/SkarabImpl.cpp | 846 +++++++ .../Servers/Skarab/src/_send_backend_command | 37 + .../Components/BACKENDS/Skarab/Skarab.xml | 17 + .../SkarabContainer/SkarabContainer.xml | 30 + Medicina/CDB/alma/BACKENDS/Skarab/Skarab.xml | 45 + Medicina/CDB/alma/DataBlock/Skarab/Skarab.xml | 158 ++ 38 files changed, 8653 insertions(+), 1 deletion(-) create mode 100644 Common/Interfaces/BackendsInterface/idl/Skarab.idl create mode 100644 Common/Servers/Skarab/config/CDB/schemas/Skarab.xsd create mode 100644 Common/Servers/Skarab/config/CDB/schemas/SkarabSetup.xsd create mode 100644 Common/Servers/Skarab/include/CommandLine.h create mode 100644 Common/Servers/Skarab/include/Common.h create mode 100644 Common/Servers/Skarab/include/Configuration.h create mode 100644 Common/Servers/Skarab/include/ControlThread.h create mode 100644 Common/Servers/Skarab/include/DevIOAttenuation.h create mode 100644 Common/Servers/Skarab/include/DevIOBandWidth.h create mode 100644 Common/Servers/Skarab/include/DevIOBins.h create mode 100644 Common/Servers/Skarab/include/DevIOBusy.h create mode 100644 Common/Servers/Skarab/include/DevIOFeed.h create mode 100644 Common/Servers/Skarab/include/DevIOFrequency.h create mode 100644 Common/Servers/Skarab/include/DevIOInputSection.h create mode 100644 Common/Servers/Skarab/include/DevIOInputsNumber.h create mode 100644 Common/Servers/Skarab/include/DevIOIntegration.h create mode 100644 Common/Servers/Skarab/include/DevIOPolarization.h create mode 100644 Common/Servers/Skarab/include/DevIOSampleRate.h create mode 100644 Common/Servers/Skarab/include/DevIOSectionsNumber.h create mode 100644 Common/Servers/Skarab/include/DevIOStatus.h create mode 100644 Common/Servers/Skarab/include/DevIOTime.h create mode 100644 Common/Servers/Skarab/include/DevIOTsys.h create mode 100644 Common/Servers/Skarab/include/Protocol.h create mode 100644 Common/Servers/Skarab/include/SenderThread.h create mode 100644 Common/Servers/Skarab/include/SkarabImpl.h create mode 100644 Common/Servers/Skarab/src/CommandLine.cpp create mode 100644 Common/Servers/Skarab/src/Configuration.cpp create mode 100644 Common/Servers/Skarab/src/ControlThread.cpp create mode 100644 Common/Servers/Skarab/src/Makefile create mode 100644 Common/Servers/Skarab/src/Protocol.cpp create mode 100644 Common/Servers/Skarab/src/SenderThread.cpp create mode 100644 Common/Servers/Skarab/src/SkarabImpl.cpp create mode 100755 Common/Servers/Skarab/src/_send_backend_command create mode 100644 Medicina/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml create mode 100644 Medicina/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml create mode 100644 Medicina/CDB/alma/BACKENDS/Skarab/Skarab.xml create mode 100644 Medicina/CDB/alma/DataBlock/Skarab/Skarab.xml diff --git a/Common/Interfaces/BackendsInterface/idl/Skarab.idl b/Common/Interfaces/BackendsInterface/idl/Skarab.idl new file mode 100644 index 000000000..929a04b94 --- /dev/null +++ b/Common/Interfaces/BackendsInterface/idl/Skarab.idl @@ -0,0 +1,138 @@ +/* ******************************************************************************************* */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: Skarab.idl,v 1.1 2011-03-14 14:54:11 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Carlo Migoni (migoni@oa-cagliari.inaf.it) 12/05/2015 Creation */ + + +#ifndef _SKARAB_IDL_ +#define _SKARAB_IDL_ + +#include +#include +#include "GenericBackend.idl" + +#pragma prefix "alma" + +module Backends { + + /** + * The Skarab is a digital backend. bla bla bla + *
+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
FeedCarier boardBackend channel
2L1Ch0
2R2Ch1
3L3Ch2
3R4Ch3
4L5Ch4
4R6Ch5
5L7Ch6
5R8Ch7
6L9Ch8
6R10Ch9
0L11Ch10
0R12Ch11
1L13Ch12
1R14Ch13
+ * With such a cabling in order to configure the input coming from the multi feed central beam the inputs 10 and 11 must be configured. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ * @copybrief GenericBackend::time + * Since the multi feed total power backend is based on a FPGA that raturns the time with the precision of the second, the reported + * time has the same precision. + * @copybrief GenericBackend::frequency + * The backend has a fixed IF start frequecy which is 100 MHz, up to the bandwidth. The correct sky frequency can be set by changing + * the receivers local oscillator. + * @copybrief GenericBackend::bandWidth + * The backend provides 4 bandwidths: 2000MHz,1330MHz,825MHz,330MHz. The retunerd sequence is 14 position long, + * one for each if section. A zero means that the value if not configured yet. + * @copybrief GenericBackend::attenuation + * The values reported here correspond to the analog inputs. The attenuation range goes from 0 to 15. + * @copybrief GenericBackend::inputsNumber + * This value is hard coded and corresponds to the number of inputs of the backend. + * @copybrief GenericBackend::sampleRate + * This value is times in a second that the total power is acquired by the backend. The maximum value is 0.001 Mhz corresponding + * to a period of 1 millisecond. + * @copybrief GenericBackend::bins + * This value is fixed to 1 and cannot be changed. + * @copybrief GenericBackend::integration + * In this implementation the integration time is realized by the component using a very simple operation. Since the sample rate + * for this backend is somehow an integration time ( a sample rate of 4 Hz for example means that the total power counts are + * summed for 0.25 second) every sample is devided by the integration (seconds) and by the sample rate (Hz). Let's give a simple + * example, let's suppose 4Hz of sample rate(K) and 3 seconds of integration(M). That means that the backend will produce an output + * every 3 seconds, that output is the average of 12 samples (4 for each of the 3 seconds): + * \f$ U=\sum_{j=1}^M \sum_{i=1}^K \frac{s_{ij}}{MK} \f$. + * For better results this value should be a multiple of the sample period. + * @copybrief GenericBackend::polarization + * This values cannot be changed since they are fixed by hardware. The even inputs are connected to left polarization, the odd are + * right polarization. + * @copybrief GenericBackend::status + * The bits have the following meaning: + * @arg \c 0 if set the backend time is not properly synchronized (error) + * @arg \c 1 if set the backend is busy and cannot accept any command + * @arg \c 2 if set the backend is in tranfer mode but the transfer is suspended + * @arg \c 3 if set the backend is sampling + * @arg \c 4 set if the command line is not properly working (error) + * @arg \c 5 set if the data lineis not properly working (error) + * @copybrief GenericBackend::setTime() + * In this implementation only the fpga clock is set. The resolution is of one second. + * @copybrief GenericBackend::setSection() + * Frequency, polarization, feed and bins parameters are ignored since they could not be changed. So the user should provide a negative value + * for them, otherwise the component will post a warning log message. Since the backend is not capable of different sample rates, + * the given sampleRate is set for all the inputs. + * @copybrief GenericBackend::sendHeader() + * In this implementation the preparation for the data transfer takes some seconds. + * @copybrief GenericBackend::sendData() + * The call to this method must respect the backend latency time, if not the execution i suspended util that time is matched. + * The component must be suspended (transfer job started but data are not sent) in order for this function to complete succesfully. + * @copybrief GenericBackend::sendStop() + * The component must be active (not suspended) in order for this function to complete succefully. + * @copybrief GenericBackend::getTpi() + * Since the backend is an integrator the user has to take into account that any change will affect the integration after the change. So for example if the cal diode is fired it is wise to + * wait twice the integration time in order for the diode contribution to be fully measured. + * In case a negative is provided as argument the integration set for the 'fast' mode (setIntegration()) is used. + * @copybrief GenericBackend::getZero() + * Since this measure requires an input signal switching the backend is forced to wait two times the integration to allow the + * new signal level to stabilize. + */ + interface Skarab : GenericBackend { + + /** + * This method can be called to activate or disactivate the switching of the calibration noise diode. The mode the switching is done is controlled + * by the parameter and by the sampleRate attribute. If the component is busy it is not allowed to call this method. This method is + * only available if the connected receiver support it. + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param interleave this parmater controls the switching frequency of the calibration diode. If it is zero (default) the diode is not + * switched (always turned off). if a one is given the backend will produce one sample (using the sampleRate) + * with the mark switecehd off and one with the mark switched on. A two means two sample with the mark switched off and + * one with the mark switched on.....and so on. A negative will not change the value of the parameter. + */ + // void activateNoiseCalibrationSwitching(in long interleave) raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This method can be used to initialize the backend. Since this hardware can be connected to various receiver some parameter must be set before + * any further use. This parameter will stay fixed until a new initilization is issued. At start up a default initialization is commanded but can be + * changed at any time. If the component is busy it is not allowed to call this method. + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param configuration this string must contain the sequence of character that identifies the configuration that must be loaded. If the sequence is not + * known an excpetion is thrown + */ + + void initialize(in string configuration) raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + void getConfiguration(out string configuration); + + void getCommProtVersion(out string version); + }; + +}; + +#endif diff --git a/Common/Interfaces/BackendsInterface/src/Makefile b/Common/Interfaces/BackendsInterface/src/Makefile index 4d83ba566..a794bbbbb 100644 --- a/Common/Interfaces/BackendsInterface/src/Makefile +++ b/Common/Interfaces/BackendsInterface/src/Makefile @@ -33,7 +33,7 @@ CDB_SCHEMAS = GenericBackend DigitalXCorrelator Holography CalMuxTable # # IDL Files and flags # -IDL_FILES = GenericBackend BackendsBoss TotalPower NoiseGenerator DigitalXCorrelator Holography DBBC DFBInterface Sardara CalDiodeController CalMux +IDL_FILES = GenericBackend BackendsBoss TotalPower NoiseGenerator DigitalXCorrelator Holography DBBC DFBInterface Sardara CalDiodeController CalMux Skarab IDL_TAO_FLAGS = USER_IDL = @@ -49,6 +49,7 @@ HolographyStubs_LIBS = baciStubs GenericBackendStubs DBBCStubs_LIBS = baciStubs GenericBackendStubs DFBInterfaceStubs_LIBS = baciStubs GenericBackendStubs SardaraStubs_LIBS = baciStubs GenericBackendStubs +SkarabStubs_LIBS = baciStubs GenericBackendStubs CalDiodeControllerStubs_LIBS = baciStubs ComponentErrorsStubs CalMuxStubs_LIBS = baciStubs ComponentErrorsStubs CalDiodeControllerStubs diff --git a/Common/Servers/Skarab/config/CDB/schemas/Skarab.xsd b/Common/Servers/Skarab/config/CDB/schemas/Skarab.xsd new file mode 100644 index 000000000..f6e5b67cc --- /dev/null +++ b/Common/Servers/Skarab/config/CDB/schemas/Skarab.xsd @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Servers/Skarab/config/CDB/schemas/SkarabSetup.xsd b/Common/Servers/Skarab/config/CDB/schemas/SkarabSetup.xsd new file mode 100644 index 000000000..d492a9a9b --- /dev/null +++ b/Common/Servers/Skarab/config/CDB/schemas/SkarabSetup.xsd @@ -0,0 +1,141 @@ + + + + + + + + + + + + boolean true value + + + + + boolean flase value + + + + + + + + selects which port has to be selected for the present confuguration + + + + + the backend will selects input from primary focus + + + + + the backend will selects input from Beam Wave Guide focus + + + + + the backend will selects input from Gregorian focus + + + + + + + + + + + + + + + + identifier of the configuration + + + + + The number of sections exported for the present configuration + + + + + true if the calibration mark switching could be used + + + + + selects from which port the RF inputs has to be taken for the present configuration, if more than one value is provided the inputs + are configured on sinble board basis. The numbero of enties shoudl be less than the numebr of installed boards. The board not directly + involved in the configuration (i.e stated on the section_boards section) will be configured with 0 attenuation andd full bandwidth + + + + + number of beams of the receiver attached to the backend + + + + + this set the default bandwidth of the RF input + + + + + this sets the default attenuation of all the RF input + + + + + blank separated lists of boards implementing the section + + + + + for each section indicates which polarizations the section is processing, blank separated list + + + + + for each sections indicates which is the linked feed + + + + + for each section, given the feed, indicates which is the linked IF + + + + + number of bins of the configuration backend + + + + + + + + + + + + + + diff --git a/Common/Servers/Skarab/include/CommandLine.h b/Common/Servers/Skarab/include/CommandLine.h new file mode 100644 index 000000000..0afdf2768 --- /dev/null +++ b/Common/Servers/Skarab/include/CommandLine.h @@ -0,0 +1,793 @@ +#ifndef _COMMANDLINE_H_ +#define _COMMANDLINE_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Common.h" +//#include "Protocol.h" +#include "Configuration.h" + +using namespace maci; +using namespace DiscosBackend; +using namespace std; + +/** + * This class is inherited from the IRA::CSocket class. It takes charge of setting the configuration to the backend. + * if the remote side disconnects or a problem affects the communication line, this class try to reconnect to the backend + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia + *
+*/ +class CCommandLine: public CSocket +{ +friend class CSenderThread; +public: + enum TLineStatus { + NOTCNTD, /*!< Socket is not connected, no operation available */ + CNTDING, /*!< Connection is in progress, no operation available */ + CNTD /*!< Socket is connected and ready, line is ready */ + }; + /** + * Constructor. + */ + CCommandLine(ContainerServices *service); + /** + * Destructor + */ + virtual ~CCommandLine(); + + /** + * This member function is used to enstablish and configure the communication channel. + * The first connection is performed in blocking mode(if it fails the component fails to load), the the socket is + * trasformed in non-blocking mode. + * This must be the first call before using any other function of this class. + * @param config pointer to the component configuration data structure + * @throw ComponentErrors::SocketError + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImpl + * @throw BackendsErrors::NakExImpl + */ + void Init(CConfiguration *config) throw (ComponentErrors::SocketErrorExImpl, + ComponentErrors::ValidationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::CDBAccessExImpl); + + /** + * Call this function to get the number of inputs + * In this implementation the inputs number is the same of the number of section (SIMPLE_SECTION) + */ + //inline void getInputsNumber(long &in) const { in=m_sectionsNumber; } + inline void getInputsNumber(long &in) const { in=m_inputsNumber; } + + /** + * Call this function to get the milliseconds of integration time + */ + void getIntegration(long &integr) const { integr=m_integration; + /*resultingSampleRate(m_integration,m_commonSampleRate,integr)*/; + } + + /** + * Call this function in order to get the start frequency value for each section. + */ + void getFrequency(ACS::doubleSeq& freq) const; + void getFrequencyAttr(ACS::doubleSeq& freq) const; + + /** + * Call this function in order to get the sample rate for each section. + */ + void getSampleRate(ACS::doubleSeq& sr) const; + + /** + * Call this function in order to get the number of bins for each section. + */ + void getBins(ACS::longSeq& bins) const; + + /** + * Call this function in order to get the polarization for each section. + */ + void getPolarization(ACS::longSeq& pol) const; + + /** + * Call this function in order to get the component status back + */ + void getBackendStatus(DWORD& status); + + /** + * Call this function in order to get the feed connected to each section. + */ + void getFeed(ACS::longSeq& feed) const; + void getFeedAttr(ACS::longSeq& feed) const; + + /** + * Call this function in order to get the IF connected to each input. + */ + void getIFs(ACS::longSeq& ifs) const; + + /** + * Call this function in order to know which section an input is attached to. + */ + void getInputSection(ACS::longSeq& inpSection) const; + void getInputSectionAttr(ACS::longSeq& inpSection) const; + + /** + * Call this function in order to get the last measure of the system temperature. + */ + void getTsys(ACS::doubleSeq& tsys) const; + + /** + * Call this function in order to get the last measure of the Kelvin/Counts ratio. + */ + void getKCRatio(ACS::doubleSeq& ratio) const; + + /** + * Call this function to know if the baceknd is busy or not. This function is remapped on the BUSY field of the backed status + */ + bool getIsBusy() const { return (m_backendStatus & (1 << BUSY)); } + + /** + * Call this function in order to get the attenuation values for each input. + * @param att this is a sequence of double values that correspond to the attenuation for each analog input. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::ConnectionExImp + */ + void getAttenuation(ACS::doubleSeq& att) throw (ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl); + + void getAttenuationAttr(ACS::doubleSeq& att) throw (ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl); + /** + * Call this function in order to get the current band width of each input. + * @param bw this is a sequence of double values that correspond to the bandwidth of each analog input. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::ConnectionExImp + */ + void getBandWidth(ACS::doubleSeq& bw) throw (ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl); + void getBandWidthAttr(ACS::doubleSeq& bw) const; + + /** + * Call this function in order to get the time clock reported by the backend. + * @param tt backend time, as numebr of 100 ns from 1582-10-15 00:00:00 + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::ConnectionExImp + */ + void getTime(ACS::Time& tt) throw (ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl); + + /** + * Call this function in order to set the time of the backend FPGA. The time will be set according to the local computer + * time. + @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::BackendBusyExImpl + */ + void setTime() throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl); + + /** + * This function is called by the control thread in order to check the beackend clock matches with the host computer clock. In the two times do not + * match a log file in sent and the TIME_SYNC flag is set. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::MalformedAnswerExImpl + */ + void checkTime() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::MalformedAnswerExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl); + + /** + * This method starts the calibration diode switching. + * @throw BackendsErrors::BackendBusyExImpl + * @thorw ,ComponentErrors::NotAllowedExImpl + * @param interleave this will control the switcing mode. An integer positive(N) will command the backend to produce N samples + * when the calibration diode is turned off and then one with the calibration diode turned on. A zero disable the switching + * (default), whilst a negative will not change the current configuration + */ + void activateCalSwitching(const long& interleave) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::NotAllowedExImpl); + + /** + * This function must be called in order to change the integration time + * @throw (BackendsErrors::BackendBusyExImpl + * @param integration new integration time in milliseconds. A negative value has no effect. + */ + void setIntegration(const long& integration) throw (BackendsErrors::BackendBusyExImpl, ComponentErrors::ValueOutofRangeExImpl); + + /** + * This methos will changes the current value of the m_enabled array. + * @throw BackendsErrors::BackendBusyExImpl + * @param en new values sequence for the m_enabled elements. A value grater than zero correspond to a true, + * a zero match to a false, while a negative will keep the things unchanged. + */ + void setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl); + + /** + * This function can be called in order to load an initial setup for the backend. Some parameter are fixed and cannot be changed during normal + * operation. In order for this call to suceed the backend must be ready and not busy with other operation. This operation will also reset all configuration + * to the defaults. + * @throw BackendsErrors::BackendBusyExImpl + * @throw BackendsErrors::ConfigurationErrorExImpl + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImpl + * @throw ComponentErrors::SocketErrorExImpl + * @throw BackendsErrors::NakExImpl + * @param conf identifier of the configuration to be loaded + */ + void setup(const char *conf) throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConfigurationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl); + + void setTargetFileName(const char *conf); + + void sendTargetFileName() throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl); + + /** + * This function can be used to set up an input of the backend. The input is identified by its numeric value. If a configuration + * parameter is negative the current value is not changed. Since the backend hardware does not support different sample rates + * the last commanded sample rate is considered also for all other inputs. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw ComponentErrors::ValueOutOfRangeExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw BackendErrors::BackendBusyExImpl + * @param inputId identifier of the input. If negative all the inputs are configured in one shot, otherwise + * it must be between 0 and the number of inputs. + * @param freq initial frequency of the input filter. This parameter is ignored. It is expected a negative, otherwise a warning message is logged. + * @param bw bandwidth of the filter in MHz. . + * @param feed feed identifier, this parameter is ignored. It is expected a negative, otherwise a warning message is logged. + * @param pol polarization of the input, this is fixed by hardware and could not be changed so it is ignored. It is expected a negative, otherwise a warning message is logged. + * @param sr new sample rate, the maximum allowed value is 0.001 MHz. + * @param bins number of bins of the input, it can only be 1, so it is ignored. It is expected a negative, otherwise a warning message is logged. + */ + void setConfiguration(const long& inputId,const double& freq,const double& bw,const long& feed,const long& pol, const double& sr,const long& bins) throw ( + ComponentErrors::ValidationErrorExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::ValueOutofRangeExImpl, + BackendsErrors::BackendBusyExImpl); + + /** + * This function will start an acquisition job. The job will be created suspended and requires an explicit + * resum in order to begin the data flow. The backend will just connect to a specific socket. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendErrors::BackendBusyExImpl + */ + void startDataAcquisition() throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConnectionExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl); + + /** + * This function will stop the current acquisition job. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw ComponentErrors::NotAllowedExImpl + */ + void stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); + + /** + * This function will stop the current acquisition job without caring about the component or the backend status + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw ComponentErrors::NotAllowedExImpl + */ + void stopDataAcquisitionForced() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl); + + /** + * This function will resume an acquisition job. This function will also check if the backend latency time is respected. + * if the time between the invocation of this method and startDataAcquisition is lesser than the latency the execution + * is suspended for the required time. If the component is not suspended an exception is thrown. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw ComponentErrors::NotAllowedExImpl + * @param startT epoch at which the acquisition is supposed to start + * @return the epoch of the real expected start time. + */ + ACS::Time resumeDataAcquisition(const ACS::Time& startT) throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl); + + /** + * This function will suspend the data acquisition job. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImpl + * @throw BackendsErrors::NakExImpl + * @throw ComponentErrors::NotAllowedExImpl + */ + void suspendDataAcquisition() throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl); + + /** + * Called to get a single measure of the total power for each in channel. The measure is done by the slow mode of the backend + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::BackendBusyExImpl + * @param tpi this is a sequence (allocated by the caller) of at least N positions, where N is the number of channels. Each element + * of the vector cointains the total power of the corresponding channel. + * @param zero if true the returned measure refers to a backend configuration in which the signal is coming from the 50 Ohm input. In that + * case the answer is delayed by an ammount of time that allows the signal to settled down. + */ + void getSample(ACS::doubleSeq& tpi,bool zero) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + + /** + * This a wrapper function of the getSample() method. In this case the sample correspond th the total power measurment in each channel. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::BackendBusyExImpl + * @param tpi this is a sequence (allocated by the caller) of at least N positions, where N is the number of channels. Each element + * of the vector cointains the total power of the corresponding channel. + */ + void getTpi(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + + + void getRms(ACS::doubleSeq& rms) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + + /** + * This a wrapper function of the getSample() method. In this case the sample correspond the power measurment in each channel with full attenuation. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::BackendBusyExImpl + * @param tpi this is a sequence (allocated by the caller) of at least N positions, where N is the number of channels. Each element + * of the vector cointains the total power of the corresponding channel. + */ + void getZero(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + + + /** + * Called to get the TPI measure when the attenuators are all in. Differently from getSample() it will return the counts returned + * by the backend for the configured sample rate. The measure also is not normalized for the integration time. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + * @throw BackendsErrors::MalformedAnswerExImpl + * @throw BackendsErrors::BackendBusyExImpl + * @param tpi array that contains for each element the tpi value for any input channel. + */ + void getZeroTPI(DWORD *tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl); + + /** + * Called to configure the attenuation level for each input of the backend. + * @throw BackendsErrors::BackendBusyExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + * @throw BackendsErrors::NakExImpl, + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImpl + * @param identifier of the input. + * @param attenuation new input level. It must lay between 0 and 15. A negative will keep the previous value; + */ + void setAttenuation(const long&inputId, const double& attenuation) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl); + + /** + * Called to configure a range where compute a Tsys. + * @throw BackendsErrors::BackendBusyExImpl + * @throw ComponentErrors::ValidationErrorExImpl + * @throw ComponentErrors::ValueOutofRangeExImpl + * @throw BackendsErrors::NakExImpl, + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImpl + * @param starting frequency + * @param bandwidth range; + */ + void setTsysRange(const double& freq, const double& bw) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl); + + /** + * Called by the component to fill the Backends::TMainHeader with the proper informations. + * @param bkd the stucture that contains the required information. + */ + void fillMainHeader(Backends::TMainHeader& bkd); + + /** + * Called to fill the sequence of the Backends:channelHeader with the proper information. Only the enabled channel + * are reported. + * @param chHr pointer to a (caller allocated) vector that will contains the information section by section + * @param size size of the input vector, used to avoid to exceed the vector limits + */ + void fillChannelHeader(Backends::TSectionHeader *chHr,const long& size); + + /** + * Called by the implementation of the interface to inform the component of the last tsys measurement and the Kelvin/counts ratio. + * @param tsys sequence of doubles with the tsys for each input. + * @param ration ratio between Kelvin and counts as determined during the last tsys measurement + */ + void saveTsys(const ACS::doubleSeq& tsys,const ACS::doubleSeq& ratio); + + /** + * return the array that contains the mapping of sections over boards. + */ + long *boardsMapping() { return m_boards; } + + long sectionNumber() { return m_sectionsNumber; } + + /** + * Computes the resulting integration time considering the sample rate and the integration time. + * @param integration current integration time (msec) + * @param sr current sample rate (MHz) + * @param result integration time resulting from the two parameters + * @return true if the resulting integration has to be rounded to match the two input parameters + */ + static bool resultingSampleRate(const long& integration,const double& sr,long& result); + + //int getConfiguration(char* configuration); + void getConfiguration(char* configuration); + + int getCommProtVersion(CORBA::String_out version); + + IRA::CString m_targetFileName; + +protected: + /** + * Automatically called by the framework as a result of a connection request. See super-class for more details. + * @param ErrorCode connection operation result, zero means operation is succesful. + */ + void onConnect(int ErrorCode); + /** + * Automatically called by the framework if the connection doesn't happens before the allotted time expires. See super-class for more details. + * @param EventMask event that timeouted. + */ + void onTimeout(WORD EventMask); + +private: + + ContainerServices* m_services; + Backends::TotalPower_var m_totalPower; + //Receivers::GenericIFDistributor_var m_ifDistributor; + + /** + * List the fields of the backend status + */ + enum TstatusFields { + TIME_SYNC=0, /*!< backend time not sync */ + BUSY=1, /*!< backend is busy(transfer job initiated) and cannot accept other commands */ + SUSPEND=2, /*!< backend data flow is suspended */ + SAMPLING=3, /*!< backend is recording */ + CMDLINERROR=4, /*!< error in the command line */ + DATALINERROR=5 /*!< error in the data line */ + }; + /** Connection status */ + TLineStatus m_status; + /**This flag indicates if the socket has timedout */ + bool m_bTimedout; + bool m_reiniting; + /** It contains error information */ + CError m_Error; + /** Component configuration data */ + CConfiguration *m_configuration; + /** This is the epoch of the last update from the backend */ + TIMEVALUE m_lastUpdate; + /** + * This mark the stat time fo the acquisition, used to check if the + * real transfer respect the backend initialization latency + */ + TIMEVALUE m_acquisitionStartEpoch; + /** + * attenuator value for each backend input + */ + double m_attenuation[MAX_SECTION_NUMBER]; + /** + * bandwidth value for each backend input + */ + double m_bandWidth[MAX_SECTION_NUMBER]; + /** + * frequency value for each backend input + */ + double m_frequency[MAX_SECTION_NUMBER]; + /** + * the sample rate associated to each input + */ + double m_sampleRate[MAX_SECTION_NUMBER]; + /** + * The sample rate currently configured in the backend, given as sample period in milliseconds + */ + long m_currentSampleRate; + /** + * Since the backend is not capable to have different sample rate this is used for common + */ + double m_commonSampleRate; + /** + * allows to link a section to its proper board number + */ + long m_boards[MAX_SECTION_NUMBER]; + + /** + * Allows to link a board number to its section + */ + long m_sections[MAX_BOARDS_NUMBER]; + /** + * the polarization of each backend input + */ + Backends::TPolarization m_polarization[MAX_SECTION_NUMBER]; + /** + * the number of bins that each input will deliver + */ + long m_bins[MAX_SECTION_NUMBER]; + /** + * input type for each backend section + */ + //CProtocol::TInputs m_input[MAX_SECTION_NUMBER]; + /** + * Indicates if the input is enabled or not. A disabled input will not produce output data + */ + bool m_enabled[MAX_SECTION_NUMBER]; + /** + * indicates the feed number the input is connected to. Configuration dependent + */ + long m_feedNumber[MAX_SECTION_NUMBER]; + /** + * Indicates the if number (relative to the feed) the input is attached to. + */ + long m_ifNumber[MAX_SECTION_NUMBER]; + /** + * indicates which section the input belongs to. + */ + long m_inputSection[MAX_SECTION_NUMBER]; + /** + * input type for the initial configuration + */ + //CProtocol::TInputs m_defaultInput[MAX_BOARDS_NUMBER]; + WORD m_defaultInputSize; + /** + * That's the clock of the backend. Is has the precision of one second + */ + TIMEVALUE m_backendTime; + /** + * This is a pattern variable that soters the status of the component + */ + DWORD m_backendStatus; + /** + * millisecond of integration + */ + long m_integration; + /** + * reports for the number of inputs, for this implementation it happens that number of inputs is equal to the number of sections. + */ + long m_sectionsNumber; + + /** + * reports the number of beams (in the current configuration) that the backend deal with + */ + long m_beams; + + /** + * if true indicates that the connected receiver supports the fast calibration mark switching. It can only be changed + * by selecting a configuration (@sa initializeConfiguration() + */ + bool m_calSwitchingEnabled; + + /** + * reports the size of the samples in the current configuration + */ + long m_sampleSize; + /** + * Represents the period of the cal diode switching, expressed as multiple of the sample period. + * 0 means the switching is disable, 1 means that the cal diode is switched every sample period + */ + long m_calPeriod; + /** + * The configuration of the integration time when a tpi measure is done is required the first time this measure is done and every time the integration time changes. It is also required + * when the backend has started and completed an acquisition job. This flag keep track of when the initialization must be done (true). + */ + bool m_setTpiIntegration; + /** + * Name of the host that run the component + */ + IRA::CString m_hostName; + /** + * IP address of the host that run the component + */ + IRA::CString m_hostAddress; + + /** + * It stores the last available tsys measurement + */ + double m_tsys[MAX_SECTION_NUMBER]; + + /** + * It stores the last available ration Kelvin/counts + */ + double m_KCratio[MAX_SECTION_NUMBER]; + + /** + * It stores the last available total power measurement + */ + //double m_tpi[MAX_SECTION_NUMBER]; + + /** + * It stores the last measure of zero TPI + */ + double m_tpiZero[MAX_SECTION_NUMBER]; + + long m_inputsNumber; + + double m_filter; + + double m_TsysRange_freq; + double m_TsysRange_bw; + + /** + * Pointer to the configuration table, every record of the table stores a possible backend setup. + */ + IRA::CDBTable * m_configTable; + + /** + * This function will upload the default configuration into the backend. This method should be called at the component startup + * in order prevent the inconsistent status of the backend when it not configured yet. The deafult configuration is BWG, 8db + * and 2000Mhz bandwidth. The integration time is also loaded. + * @throw ComponentErrors::SocketErrorExImpl + * @arg \c ComponentErrors::IRALibraryResource + * @throw ComponentErrors::TimeoutExImpl + * @throw BackendsErrors::ConnectionExImp + * @throw BackendsErrors::NakExImpl + */ + void setDefaultConfiguration(const IRA::CString & config) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl); + + /** + * This method is called to set up the component in order to get the desired configuration. Defaults and + * hard coded values are set according to the configuration. + * @param config name of the configuration to be loaded + * @return false if the configuration name is not coded or known + */ + bool initializeConfiguration(const IRA::CString & config) throw (ComponentErrors::CDBAccessExImpl); + + /** + * Check if the connection is still up and ready. If a previuos call timed out it will check the status of the connection. + * Insted if the connection is off it will try a reconnect. In both case the return value is false. + * @return true if the connection is ok + */ + bool checkConnection(); + + /** + * Sets the antenna status. + * @param sta the new antenna status. + */ + void setStatus(TLineStatus sta); + + /** + * @return the current line status + */ + inline const TLineStatus& getStatus() const { return m_status; } + + /** + * This member function is called to send a command to the backend + * @param Msg ponter to the byte buffer that contains the message + * @param Len length of the buffer + * @return SUCCESS if the buffer was sent correctly, WOULDBLOCK if the send would block, FAIL and the m_Error member is set accordingly. + */ + OperationResult sendBuffer(char *Msg,WORD Len); + + /** + * This member function is called to receive a buffer. if it realizes that the remote side disconnected it sets the member m_Status + * to NOTCNTD. + * @param Msg ponter to the byte buffer that will contain the answer + * @param Len length of the buffer, that means the exact number of bytes that can be read + * @return the number of bytes read, 0 if the connection fell down, FAIL in case of error and the m_Error member is set accordingly, + * WOULDBLOCK if the timeout expires + */ + int receiveBuffer(char *Msg,WORD Len); + + /** + * This private member function is used to send a command to the connected device. It waits for the answer. + * @param Buff pointer to the buffer that contains the message to send to the device, on exit it will cointains the aswer. + * @param inLen lenght of the input buffer. + * @param outBuff pointer to the buffer that contains the message from the other side as answer to the sent message. + * @return a positive number if the command was correctly received by the other side, else -1 in case of error, -2 if the timeout expires + */ + int sendCommand(char *inBuff,const WORD& inLen,char *outBuff); + + /** + * Sends a message to the backend and return the message reply. + * @throws BackendProtocolError + */ + Message sendBackendCommand(Message request); + + /** + * This function is used to keep update the properties. At every request it checks if the last update is enough recent (update time not expired), + * if not it takes charge of collecting new data. + * @return a number greater than zero if the operation is succesfully, else FAIL in case of error, WOULDBLOCK if the timeout expires, + * 0 if the remoteside disconnected or -100 is the answer of the backend is malformed + */ + //int getConfiguration(char* configuration); + + /** + * This function will set the status bit corresponding to the given field + */ + inline void setStatusField(TstatusFields field) { m_backendStatus |= 1 << field; } + + /** + * This function will unset (cleared) the status bit corresponding to the given field + */ + inline void clearStatusField(TstatusFields field) { m_backendStatus &= ~(1 << field); } + + bool m_SKARAB_1; + bool m_SKARAB_1S; + bool m_SKARAB_2; + bool m_SKARAB_2S; + bool m_SKARAB_3; + bool m_SKARAB_3S; + bool m_SKARAB_4; + bool m_SKARAB_4S; + bool m_SKARAB_5; + bool m_SKARAB_5S; + + bool m_stationSRT; + bool m_stationMED; + + bool m_SkarabInitialized; + + bool m_stokes; + +}; + +#endif /*_COMMANDLINE_H_*/ diff --git a/Common/Servers/Skarab/include/Common.h b/Common/Servers/Skarab/include/Common.h new file mode 100644 index 000000000..a7803b39a --- /dev/null +++ b/Common/Servers/Skarab/include/Common.h @@ -0,0 +1,52 @@ +#ifndef _COMMON_H_ +#define _COMMON_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +// if define the data are not sent to the bulk data transfer but printed to the screen. For production version it must be +// commented out +//#define BKD_DEBUG + +// some hard coded, hardware dependant constants +#define STARTFREQUENCY 0.0 // this is the start frequency of all IF inputs +#define MIN_FREQUENCY 0.0 // min frequency of all IF inputs +#define MAX_FREQUENCY 1500.0 // max frequency of all IF inputs +#define BINSNUMBER 1000 +#define SAMPLETYPE float +#define SAMPLESIZE sizeof(SAMPLETYPE) // + +#define SENDBUFFERSIZE 512 +#define RECBUFFERSIZE 512 +#define DATABUFFERSIZE 64000 +#define MAX_SECTION_NUMBER 14 +#define MAX_BOARDS_NUMBER 14 + +#define DEFAULT_SAMPLE_RATE 3000.0 //one sample every 40 milliseconds +//#define DEFAULT_SAMPLE_RATE 0.001 //one sample every 1 milliseconds +#define DEFAULT_INTEGRATION 40 // milliseconds of integration +#define MIN_INTEGRATION 5 // milliseconds of integration +#define MAX_INTEGRATION 1000 // milliseconds of integration +#define DEFAULT_DIODE_SWITCH_PERIOD 0 // the cal diode is not switched + +#define MAX_BAND_WIDTH 2300.0 +#define MIN_BAND_WIDTH 0.0 + +#define MAX_ATTENUATION 15.0 +#define MIN_ATTENUATION 0.0 + +#define MAX_BINS 65536 +#define MIN_BINS 1024 + +#define MAX_SAMPLE_RATE 4600.0 // MHz + +#define FLOW_NUMBER 1 +#endif /*COMMON_H_*/ diff --git a/Common/Servers/Skarab/include/Configuration.h b/Common/Servers/Skarab/include/Configuration.h new file mode 100644 index 000000000..7315fcb53 --- /dev/null +++ b/Common/Servers/Skarab/include/Configuration.h @@ -0,0 +1,197 @@ +#ifndef _CONFIGURATION_H_ +#define _CONFIGURATION_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + +#include +#include +#include +#include +#include "Protocol.h" +#include "Common.h" + +using namespace IRA; + +/** + * This class implements the component configurator. The data inside this class are initialized at the startup from the + * configuration database and then are used (read) inside the component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia + *
+ */ +class CConfiguration { +public: + typedef struct { + IRA::CString setupID; + long sections; + bool calSwitchEnabled; + CProtocol::TInputs inputPort[MAX_SECTION_NUMBER]; + WORD inputPorts; + long beams; + long section_boards[MAX_SECTION_NUMBER]; + Backends::TPolarization polarizations[MAX_SECTION_NUMBER]; + long feed[MAX_SECTION_NUMBER]; + long ifs[MAX_SECTION_NUMBER]; + double bandWidth; + double attenuation; + long bins; + } TBackendSetup; + + /** + * Constructor + */ + CConfiguration(); + + /** + * Destructor + */ + ~CConfiguration(); + /** + * This member function is used to configure component by reading the configuration parameter from the CDB. + * This must be the first call before using any other function of this class. + * @throw CDBAccess + * @throw MemoryAllocation + * @throw IRALibraryResource + * @param Services pointer to the container services object + */ + void init(maci::ContainerServices *Services) throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl,ComponentErrors::IRALibraryResourceExImpl); + + /** + * @return the port number + */ + inline const WORD& getPort() const { return m_wPort; } + + /** + * @return the TCP/IP address of the listening server + */ + inline const IRA::CString getAddress() const {return m_sAddress; } + + /** + * @return the timeout when receiving from the command socket(in microseconds) + */ + inline const DWORD getCommandLineTimeout() const { return m_dwCommandLineTimeout; } + + /** + * @return the timeout in microseconds when trying to reconnect to the backend + */ + inline const DWORD getConnectTimeout() const { return m_dwConnectTimeout; } + + /** + * @return the time in microseconds that is taken between two property refreshes + */ + inline const DWORD getPropertyRefreshTime() const { return m_dwPropertyRefreshTime; } + + /** + * @return the name of the configuration that the backend have to implement + */ + inline const IRA::CString getConfiguration() const { return m_sConfig; } + + /** + * @return the number of microseconds that the log filter will cache a log message + */ + inline DWORD getRepetitionCacheTime() const { return m_dwRepetitionCacheTime; } + + /** + * @return the number of microseconds that the log filter will take as expiration time for a log message + */ + inline DWORD getRepetitionExpireTime() const { return m_dwRepetitionExpireTime; } + + /** + * @return the number of microseconds that the backend will take after a command issue to sent the first data + */ + inline DWORD getDataLatency() const { return m_dwDataLatency; } + + /** + * @return the port number for the data line + */ + inline const WORD& getDataPort() const { return m_wDataPort; } + + /** + * @return the sleep time of the sender thread in microseconds + */ + inline const DWORD& getSenderSleepTime() const { return m_dwSenderSleepTime; } + + /** + * @return the response time of the sender thread in microseconds + */ + inline const DWORD& getSenderResponseTime() const { return m_dwSenderResponseTime; } + + /** + * @return the sleep time of the control thread in microseconds + */ + inline const DWORD& getControlSleepTime() const { return m_dwControlSleepTime; } + + /** + * @return the response time of the control thread in microseconds + */ + inline const DWORD& getControlResponseTime() const { return m_dwControlResponseTime; } + + /** + * @return the time tollerance in microsenconds. + */ + inline const DWORD& getTimeTollerance() const { return m_dwTimeTollerance; } + + /** + * @return the server address for the data transfer (it should be the address of the machine, running this component + */ + inline const IRA::CString& getDataIPAddress() const { return m_sDataAddress; } + + /** + * @return the number of boards installed ion the backend + */ + inline const DWORD& getBoardsNumber() const { return m_dwBoardsNumber; } + + /** + * @return the size of data packet from the backend in bytes + */ + inline const DWORD getDataBufferSize() const { return m_dwDataBufferSize; } + + /** + * This function returns the setups of the backend given the setup ID. + * @param setupID setup identifier or mnemonic + * @param setup structure containing the setup parameters. + * @return true if the setup is present, false if not present or the configuration from the CDB is not correct + */ + bool getSetupFromID(const IRA::CString setupID,TBackendSetup& setup) throw (ComponentErrors::CDBAccessExImpl); + +private: + WORD m_wPort; + IRA::CString m_sAddress; + DWORD m_dwCommandLineTimeout; + DWORD m_dwConnectTimeout; + DWORD m_dwPropertyRefreshTime; + IRA::CString m_sConfig; + DWORD m_dwRepetitionCacheTime; + DWORD m_dwRepetitionExpireTime; + WORD m_wDataPort; + IRA::CString m_sDataAddress; + DWORD m_dwDataLatency; + DWORD m_dwSenderSleepTime; + DWORD m_dwSenderResponseTime; + DWORD m_dwTimeTollerance; + DWORD m_dwControlSleepTime; + DWORD m_dwControlResponseTime; + DWORD m_dwBoardsNumber; + DWORD m_dwDataBufferSize; + /** + * This is the table used to load from the CDB the backend configurations + */ + IRA::CDBTable* m_configurationTable; + /* + * Parse the inputs string in order to extract and check the inputs port configuration for each board + * @param conf input string + * @param inputPort resulting port configuration + * @param size dimension of the inputPort array + */ + bool getInputPorts(const IRA::CString& conf,CProtocol::TInputs* inputPort,WORD& size); +}; + +#endif /*CONFIGURATION_H_*/ diff --git a/Common/Servers/Skarab/include/ControlThread.h b/Common/Servers/Skarab/include/ControlThread.h new file mode 100644 index 000000000..e18d26f8e --- /dev/null +++ b/Common/Servers/Skarab/include/ControlThread.h @@ -0,0 +1,74 @@ +#ifndef CONTROLTHREAD_H_ +#define CONTROLTHREAD_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + +#include +#include +#include "CommandLine.h" + +/** + * This class inheriths from the ACS thread base class. It allows to run separate thread that performs a continuos check of the backend status + * even if no client is connected + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia + *
+ */ +class CControlThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param parameter pointer to the object that is the thread running argument + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + CControlThread(const ACE_CString& name,CSecureArea *parameter, + const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, + const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~CControlThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. The method is executed in a loop until the thread is alive. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +protected: + CSecureArea* m_pData; +}; + + + + + + + + + + +#endif /*CONTROLTHREAD_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOAttenuation.h b/Common/Servers/Skarab/include/DevIOAttenuation.h new file mode 100644 index 000000000..0128058a1 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOAttenuation.h @@ -0,0 +1,99 @@ +#ifndef _DEVIOATTENUATION_H_ +#define _DEVIOATTENUATION_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the attenuation property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOAttenuation : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOAttenuation(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOAttenuation::DevIOAttenuation()"); + } + + /** + * Destructor + */ + ~DevIOAttenuation() + { + ACS_TRACE("DevIOAttenuation::~DevIOAttenuation()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOAttenuation::initializeValue()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + //line->getAttenuationAttr(m_val); + line->getAttenuation(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOAttenuation::read()"); + dummy.setPropertyName("attenuation"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::doubleSeq m_val; + //CLogGuard m_logGuard; +}; + + + + + +#endif /*DEVIOATTENUATION_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOBandWidth.h b/Common/Servers/Skarab/include/DevIOBandWidth.h new file mode 100644 index 000000000..c5f246e01 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOBandWidth.h @@ -0,0 +1,94 @@ +#ifndef _DEVIOBANDWIDTH_H_ +#define _DEVIOBANDWIDTH_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the bandWidth property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOBandWidth : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOBandWidth(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOBandWidth::DevIOBandWidth()"); + } + + /** + * Destructor + */ + ~DevIOBandWidth() + { + ACS_TRACE("DevIOBandWidth::~DevIOBandWidth()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOBandWidth::initializeValue()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getBandWidthAttr(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOBandWidth::read()"); + dummy.setPropertyName("bandWidth"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::doubleSeq m_val; + //CLogGuard m_logGuard; +}; + +#endif /*_DEVIOBANDWIDTH_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOBins.h b/Common/Servers/Skarab/include/DevIOBins.h new file mode 100644 index 000000000..88848a970 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOBins.h @@ -0,0 +1,95 @@ +#ifndef _DEVIOBINS_H_ +#define _DEVIOBINS_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the bins property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOBins : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOBins(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOBins::DevIOBins()"); + } + + /** + * Destructor + */ + ~DevIOBins() + { + ACS_TRACE("DevIOBins::~DevIOBins()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOBins::DevIOBins()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::longSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getBins(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOBins::read()"); + dummy.setPropertyName("Bins"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::longSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::longSeq m_val; + //CLogGuard m_logGuard; +}; + + + +#endif /*_DEVIOBINS_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOBusy.h b/Common/Servers/Skarab/include/DevIOBusy.h new file mode 100644 index 000000000..a60bc5831 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOBusy.h @@ -0,0 +1,100 @@ +#ifndef _DEVIOBUSY_H_ +#define _DEVIOBUSY_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the busy property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOBusy : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOBusy(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOBusy::DevIOBusy()"); + } + + /** + * Destructor + */ + ~DevIOBusy() + { + ACS_TRACE("DevIOBusy::~DevIOBusy()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOBusy::initializaValue()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + Management::TBoolean read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + if (line->getIsBusy()) { + m_val=Management::MNG_TRUE; + } + else { + m_val=Management::MNG_FALSE; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOBusy::read()"); + dummy.setPropertyName("busy"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const Management::TBoolean& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + Management::TBoolean m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOBUSY_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOFeed.h b/Common/Servers/Skarab/include/DevIOFeed.h new file mode 100644 index 000000000..3a1345d71 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOFeed.h @@ -0,0 +1,94 @@ +#ifndef DEVIOFEED_H_ +#define DEVIOFEED_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the feed property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOFeed : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that protects the command line socket. This object must be already initialized and configured. + */ + DevIOFeed(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOFeed::DevIOFeed()"); + } + + /** + * Destructor + */ + ~DevIOFeed() + { + ACS_TRACE("DevIOFeed::~DevIOFeed()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOFeed::DevIOFeed()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::longSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getFeedAttr(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOFeed::read()"); + dummy.setPropertyName("feed"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::longSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::longSeq m_val; + //CLogGuard m_logGuard; +}; + +#endif /*DEVIOFEED_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOFrequency.h b/Common/Servers/Skarab/include/DevIOFrequency.h new file mode 100644 index 000000000..b0e7201fa --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOFrequency.h @@ -0,0 +1,95 @@ +#ifndef _DEVIOFREQUENCY_H_ +#define _DEVIOFREQUENCY_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the frequency property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOFrequency : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOFrequency(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOFrequency::DevIOFrequency()"); + } + + /** + * Destructor + */ + ~DevIOFrequency() + { + ACS_TRACE("DevIOFrequency::~DevIOFrequency()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOFrequency::DevIOFrequency()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyErrorketError + * @param timestamp epoch when the operation completes + */ + ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getFrequencyAttr(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOFrequency::read()"); + dummy.setPropertyName("frequency"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::doubleSeq m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOFREQUENCY_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOInputSection.h b/Common/Servers/Skarab/include/DevIOInputSection.h new file mode 100644 index 000000000..e31db4beb --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOInputSection.h @@ -0,0 +1,95 @@ +#ifndef DEVIOINPUTSECTION_H_ +#define DEVIOINPUTSECTION_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the InputSection property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOInputSection : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that protects the command line socket. This object must be already initialized and configured. + */ + DevIOInputSection(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOInputSection::DevIOInputSection()"); + } + + /** + * Destructor + */ + ~DevIOInputSection() + { + ACS_TRACE("DevIOInputSection::~DevIOInputSection()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOInputSection::DevIOInputSection()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::longSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + //line->getInputSectionAttr(m_val); + line->getInputSection(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOInputSection::read()"); + dummy.setPropertyName("inputSection"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::longSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::longSeq m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*DEVIOINPUTSECTION_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOInputsNumber.h b/Common/Servers/Skarab/include/DevIOInputsNumber.h new file mode 100644 index 000000000..33bb5e672 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOInputsNumber.h @@ -0,0 +1,97 @@ +#ifndef _DEVIOINPUTSNUMBER_H_ +#define _DEVIOINPUTSNUMBER_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the inputsNumber property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOInputsNumber : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOInputsNumber(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOInputsNumber::DevIOInputsNumber()"); + } + + /** + * Destructor + */ + ~DevIOInputsNumber() + { + ACS_TRACE("DevIOInputsNumber::~DevIOInputsNumber()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOInputsNumber::DevIOInputsNumber()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + CORBA::Long read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + long val; + line->getInputsNumber(val); + m_val=(CORBA::Long)val; + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOInputsNumber::read()"); + dummy.setPropertyName("inputsNumber"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const CORBA::Long& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + CORBA::Long m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOINPUTSNUMBER_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOIntegration.h b/Common/Servers/Skarab/include/DevIOIntegration.h new file mode 100644 index 000000000..8e5f18490 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOIntegration.h @@ -0,0 +1,97 @@ +#ifndef _DEVIOINTEGRATION_H_ +#define _DEVIOINTEGRATION_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the integration property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOIntegration : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOIntegration(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOIntegration::DevIOIntegration()"); + } + + /** + * Destructor + */ + ~DevIOIntegration() + { + ACS_TRACE("DevIOIntegration::~DevIOIntegration()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOIntegration::initializaValue()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + CORBA::Long read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + long val; + line->getIntegration(val); + m_val=(CORBA::Long)val; + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOIntegration::read()"); + dummy.setPropertyName("integration"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const CORBA::Long& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + CORBA::Long m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOINTEGRATION_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOPolarization.h b/Common/Servers/Skarab/include/DevIOPolarization.h new file mode 100644 index 000000000..0f9a3509b --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOPolarization.h @@ -0,0 +1,95 @@ +#ifndef _DEVIOPOLARIZATION_H_ +#define _DEVIOPOLARIZATION_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the polarization property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOPolarization : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOPolarization(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOPolarization::DevIOPolarization()"); + } + + /** + * Destructor + */ + ~DevIOPolarization() + { + ACS_TRACE("DevIOPolarization::~DevIOPolarization()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOPolarization::DevIOPolarization()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyErrorr + * @param timestamp epoch when the operation completes + */ + ACS::longSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getPolarization(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOPolarization::read()"); + dummy.setPropertyName("polarization"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::longSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::longSeq m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOPOLARIZATION_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOSampleRate.h b/Common/Servers/Skarab/include/DevIOSampleRate.h new file mode 100644 index 000000000..b80471edd --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOSampleRate.h @@ -0,0 +1,94 @@ +#ifndef _DEVIOSAMPLERATE_H_ +#define _DEVIOSAMPLERATE_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the sampleRate property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOSampleRate : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOSampleRate(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOSampleRate::DevIOSampleRate()"); + } + + /** + * Destructor + */ + ~DevIOSampleRate() + { + ACS_TRACE("DevIOSampleRate::~DevIOSampleRate()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOSampleRate::DevIOSampleRate()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getSampleRate(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOSampleRate::read()"); + dummy.setPropertyName("sampleRate"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::doubleSeq m_val; + //CLogGuard m_logGuard; +}; + +#endif /*DEVIOSAMPLERATE_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOSectionsNumber.h b/Common/Servers/Skarab/include/DevIOSectionsNumber.h new file mode 100644 index 000000000..04477d1b0 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOSectionsNumber.h @@ -0,0 +1,97 @@ +#ifndef _DEVIOSECTIONSNUMBER_H_ +#define _DEVIOSECTIONSNUMBER_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the sectionsNumber property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOSectionsNumber : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that protects the command line socket. This object must be already initialized and configured. + */ + DevIOSectionsNumber(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOSectionsNumber::DevIOSectionsNumber()"); + } + + /** + * Destructor + */ + ~DevIOSectionsNumber() + { + ACS_TRACE("DevIOSectionsNumber::~DevIOSectionsNumber()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOSectionsNumber::DevIOSectionsNumber()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + CORBA::Long read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + long val; + line->getInputsNumber(val); + m_val=(CORBA::Long)val; + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOSectionsNumber::read()"); + dummy.setPropertyName("sectionsNumber"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const CORBA::Long& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + CORBA::Long m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOINPUTSNUMBER_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOStatus.h b/Common/Servers/Skarab/include/DevIOStatus.h new file mode 100644 index 000000000..7499ee4c8 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOStatus.h @@ -0,0 +1,97 @@ +#ifndef _DEVIOSTATUS_H_ +#define _DEVIOSTATUS_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the status property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOStatus : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOStatus(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOStatus::DevIOStatus()"); + } + + /** + * Destructor + */ + ~DevIOStatus() + { + ACS_TRACE("DevIOStatus::~DevIOStatus()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOStatus::DevIOStatus()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::pattern read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + DWORD ptrn; + line->getBackendStatus(ptrn); + //m_val=(ACS::pattern)ptrn; + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOStatus::read()"); + dummy.setPropertyName("status"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::pattern& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::pattern m_val; + //CLogGuard m_logGuard; +}; + + +#endif /*_DEVIOSTATUS_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOTime.h b/Common/Servers/Skarab/include/DevIOTime.h new file mode 100644 index 000000000..519cdd7c7 --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOTime.h @@ -0,0 +1,96 @@ +#ifndef _DEVIOTIME_H_ +#define _DEVIOTIME_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the time property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOTime : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOTime(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOTime::DevIOTime()"); + } + + /** + * Destructor + */ + ~DevIOTime() + { + ACS_TRACE("DevIOTime::~DevIOTime()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOTime::DevIOTime()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + CORBA::ULongLong read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + ACS::Time time; + line->getTime(time); + m_val=(CORBA::ULongLong)time; + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOTime::read()"); + dummy.setPropertyName("time"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const CORBA::ULongLong& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + CORBA::ULongLong m_val; + //CLogGuard m_logGuard; +}; + +#endif /*_DEVIOTIME_H_*/ diff --git a/Common/Servers/Skarab/include/DevIOTsys.h b/Common/Servers/Skarab/include/DevIOTsys.h new file mode 100644 index 000000000..03e8687ed --- /dev/null +++ b/Common/Servers/Skarab/include/DevIOTsys.h @@ -0,0 +1,96 @@ +#ifndef DEVIOTSYS_H_ +#define DEVIOTSYS_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include +#include "CommandLine.h" + +using namespace IRA; + +/** + * This class is derived from template DevIO and it is used by the systemTemperature property of the TotalPower + * component. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia +*/ +class DevIOTsys : public DevIO +{ +public: + + /** + * Constructor + * @param Link pointer to a SecureArea that proctects a the command line socket. This object must be already initialized and configured. + */ + DevIOTsys(CSecureArea* Link) : m_pLink(Link) + { + AUTO_TRACE("DevIOTsys::DevIOTsys()"); + } + + /** + * Destructor + */ + ~DevIOTsys() + { + ACS_TRACE("DevIOTsys::~DevIOTsys()"); + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + AUTO_TRACE("DevIOTsys::initializeValue()"); + return false; + } + + /** + * Used to read the property value. + * @throw ComponentErrors::PropertyError + * @param timestamp epoch when the operation completes + */ + ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + // get the CommandLine ....... + CSecAreaResourceWrapper line=m_pLink->Get(); + try { + line->getTsys(m_val); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl,dummy,E,"DevIOTsys::read()"); + dummy.setPropertyName("systemTemperature"); + dummy.setReason("Property could not be read"); + //_IRA_LOGGUARD_LOG_EXCEPTION(m_logGuard,dummy,LM_DEBUG); + throw dummy; + } + timestamp=getTimeStamp(); //complition time + return m_val; + } + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + timestamp=getTimeStamp(); + return; + } + +private: + CSecureArea* m_pLink; + ACS::doubleSeq m_val; + //CLogGuard m_logGuard; +}; + + + +#endif /*DEVIOTSYS_H_*/ diff --git a/Common/Servers/Skarab/include/Protocol.h b/Common/Servers/Skarab/include/Protocol.h new file mode 100644 index 000000000..ea9fe586d --- /dev/null +++ b/Common/Servers/Skarab/include/Protocol.h @@ -0,0 +1,345 @@ +#ifndef _PROTOCOL_H_ +#define _PROTOCOL_H_ + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $Id: Protocol.h,v 1.2 2011-05-12 14:14:31 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(aorlati@ira.inaf.it) 13/11/2008 Creation */ + +#include + +#define PROT_TERMINATOR_CH '\n' +#define PROT_TERMINATOR "\n" +#define PROT_SEPARATOR_CH ' ' +#define PROT_SEPARATOR " " +#define PROT_SEPARATOR_COMMA "," +#define PROT_GET_CONF "?" +#define PROT_GET_TPI "!" +#define PROT_GET_TPI_STR "!get-tpi" +#define PROT_SET_CONF_BROAD "I" +#define PROT_SET_CONF "A" +#define PROT_SET_TIME "T" +#define PROT_START_ACQ "X" +#define PROT_CHECK_TIME "E" +#define PROT_AUTO_GAIN "G" +#define PROT_STOP_ACQ "stop" +#define PROT_RESUME_ACQ "resume" +#define PROT_SUSPEND_ACQ "pause" +#define PROT_SET_ZERO "Z" +#define PROT_SET_SAMPLE_RATE "S" +#define PROT_GET_SAMPLE "R" + +#define PROT_ACK "ack" +#define PROT_OK "ok" + +//#define PROT_PACKET_LENGTH 64 +//#define PROT_TOTAL_DEVICES 14 + +using namespace IRA; + +class CProtocol { +public: + /** + * This enum enlists the pssoble configurations that can be done to set the source of the backend input signal. + */ + enum TInputs { + PRIMARY, + BWG, + GREGORIAN, + OHM50 + }; + + /** + * Prepare a buffer to be sent to the backend in order to request the backend configuration + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD askBackendConfiguration(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order to configure all the inputs in one shot. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param input allows to set up the input type + * @param att allow to indicate the attenuation level + * @param bw allows to set up the bandwidth + * @return the length of the message + */ + static WORD setConfiguration_broadcast(char *sBuff,const TInputs& input,const double &att,const double& bw); + + /** + * Prepare a buffer to be sent to the backend in order to configure one input at a time. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param id numerical identifier of the section + * @param input allows to set up the input type + * @param att allow to indicate the attenuation level + * @param bw allows to set up the bandwidth + * @param boards gives the mapping of section over boards, if null the mapping is flat: section 0 on board 0 and so on.... + * @return the length of the message + */ + static WORD setConfiguration(char *sBuff,long id,const TInputs& input,const double &att,const double& bw,long *boards=NULL); + + /** + * Prepare a buffer to be sent to the backend in order to sync the time. The time is taken from the clock of the host machine. + * Since the message to the backend must arrive between 300th and 700th milliseconds of each second, if the current time + * does not lie in that window, this method could suspend execution for the required amount of time. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD setBackendTime(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order th check the time synchronization. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD checkBackendTime(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order to start the data acquisition. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param sampleRate this is the rate used by the backend to sample the total power + * @param cal this parameter gives the number of normal sample to have a sample with the noise call on. + * @param port port number of the socket that will wait for the data + * @param address TCP/IP address of the machine that waits for the data. + * @return the length of the message + */ + static WORD startAcquisition(char *sBuff,const double& sampleRate,const long& cal,const WORD& port,const IRA::CString& address); + + /** + * Prepare a buffer to be sent to the backend in order to resume a data acquisition + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD resumeAcquisition(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order to suspend the data acquisition + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD suspendAcquisition(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order to stop the data acquisition. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @return the length of the message + */ + static WORD stopAcquisition(char *sBuff); + + /** + * Prepare a buffer to be sent to the backend in order to command the zero RF input or restore the normal input. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param activate if true the mode zero input is activated, otherwise false will go back to the normal input mode + * @return the length of the message + */ + static WORD setZeroInput(char *sBuff,bool activate); + + /** + * Prepare a buffer to be sent to the backend in order to issue the AGC functionality. This functionality will equalize all the inputs level + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param channels number of channels that will be passed through the functionality + * @param level given in counts, is the point where the channels level is brought to. + */ + static WORD AutoGainControl(char *sBuff,const WORD& channels,const WORD& level); + + /** + * Prepare a buffer to be sent to the backend in order to set the sample rate that is used for the slow mode. The slow mode + * can be used to get a single tpi measure, so this value has nothing to to with the sampleRate set by the startAcquisition() + * procedure. Also in that case the sample rate can be interpreted as an integration time. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + * @param integrationTime the integration time in milliseconds. + * @return the length of the message + */ + static WORD setIntegrationTime(char *sBuff,const long& integrationTime); + + /** + * Prepare a buffer ti be sent to the backend in order to get from the backend a tpi measure using the slow mode. The sample + * rate used is set by the call to setSampleRate. + * @param sBuff pointer to the buffer that contains the message. the buffer must be allocated by the caller. + */ + static WORD getSample(char *sBuff); + + /** + * Decodes the answer of the backend when asked about its configuration. The vectors must already allocated. + * @param rBuff buffer that contains the backend answer + * @param inputsNumber this is to inform the function about how many section are expected (size of output arrays) + * @param boardNumber number of installed boards, this dimensions the size of the answer from the backend + * @param att this vector reports the attenuation values for each of the backend inputs (db) + * @param bw this vector reports the band width for each of the backend inputs (Mhz) + * @param in this vector reports about which analog source the input is connected to. + * @param tm reports the current time of the backend FPGA. + * @param currentSR reports the sample rate currently used in the backend (milliseconds) + *@param boards gives the mapping of section over boards, if null the mapping is flat: section 0 on board 0 and so on.... + * @return true if the answer is correct and could be parsed + */ + static bool decodeBackendConfiguration(const char *rBuff,const long& sectionNumber,const DWORD& boardsNumber,double *att,double *bw,TInputs *in,TIMEVALUE& tm,long& currentSR,long * boards); + + /** + * Decodes the answer of the backend after it has been commanded a new time. + * @param rBuff buffer that contains the backend answer + * @param res this parameter can be used to check if the backend has properly synchronized its clock. True in that case. + * @return true if the answer is correct and could be parsed. + */ + static bool decodeBackendTime(const char *rBuff,bool& res); + + static bool status(char *rBuff,double ×tamp, char *statusCode, bool &acquiring); + + static bool setConfiguration(const char *rBuff); + + /** + * Decodes the answer of the backend after it has been commanded a check time operations. + * @param rBuff buffer that contains the backend answer + * @param res this parameter can be used to check if the backend is properly synchronized. True in that case. + * @return true if the aswer is correct and could be parsed regularly. + */ + static bool checkBackendTime(const char * rBuff,const long threshold,bool& res); + + /** + * Check if the backend answer is an acknowledge or not + * @param rBuff backend answer + * @return true if the backend acknowledges + */ + static bool isAck(const char *rBuff); + + /** + * This method is used to decode the data contained in the backend data packet. + * @param buff pointer to the buffer that contains the data + * @param sampleRate current value of the sample rate, used by the backend to sample the data + * @param prevStatus stores the status of the previous sample + * @param prevCounter stores the numeral counter of the previous sample + * @param tm date and time mark of the data (returned) + * @param counter sample counter + * @param flag this is a bit pattern that reports some information about the data + * @param data this will contain the real data can be found. The size is given b sectionNumber + *@param boards gives the mapping of section over boards, if null the mapping is flat: section 0 on board 0 and so on.... + */ + static void decodeData(BYTE *buff,const double& sampleRate,const WORD& prevStatus,const WORD& prevCounter, + TIMEVALUE& tm,WORD& counter,WORD& flag,DWORD *data,const long& sectionNumber,long *boards=NULL); + + /** + * This method is used to decode the data coming from the backend when asked for slow mode acquisition + * @param buff pointer to the buffer that contains the data + * @param data this will point to an array of elements (must be allocated by the caller) that contains the total power measure of + * each section the size is given by the sectionNumber argument + * @param boardsNumber the number of installed boards + * @param sectionNumber number of supported section, the size of the data array + * @param boards map a section into a board (its size is sectionNumber), if null the mapping is flat: section 0 on board 0 and so on.... + * @return true if the backend answer could be decoded, false otherwise. + */ + static bool decodeData(const char* rBuff,DWORD *data,const DWORD& boardsNumber,const long& sectionNumber,long *boards=NULL); + + /** + * This function takes in input the backend flag (given together with the data and check if the data packet is taken when the + * cal diode is off + * @param flag backend flag, bit pattern + * @return true if the data refers to normal measurement + */ + static bool isTpi(const WORD& flag); + + /** + * This function takes in input the backend flag (given together with the data and check if the data packet is taken when the + * cal diode is on + * @param flag backend flag, bit pattern + * @return true if the data refers to calibration diode on measurement + */ + static bool isCal(const WORD& flag); + + /** + * This function checks if the current backend sample is the beginning of a new stream by comparing the previous sample status + * and counter to the current sample counter. + * @param previousStatus stores the status of the previous sample + * @param previousCounter stores the numeral counter of the previous sample + * @param currentCounter stores the current sample counter + * @return true if the sample is the first of a new stream + */ + static bool isNewStream(const WORD& previousStatus,const WORD& previousCounter,const WORD& currentCounter); + +private: + + /** + * Swap the 32 bits word coming from the backend into a standard little endian word. + * @param pointer to the 32 bits word + */ + static void swap(DWORD* word); + + + /** + * This method is used to convert the time as given by the backend FPGA(string) into a full ACS timestamp. + * @param str string that containes the time of the backend FPGA (given as number of seconds from 01/10/1970) + * @param tm decoded time corresponding to the one given with first parameter + * @return false in case of errors + */ + static bool decodeFPGATime(const IRA::CString& str,TIMEVALUE& tm); + + /** + * This method is used to convert the time as given by the backend FPGA into a full ACS timestamp. + * @param clock number of seconds from 01/10/1970 + * @param sampleRate the sampling rate of the backend, each sample is spaced (in time) by the inverse of that number + * @param counter sample counter inside each second of acquisition, one indicates the first sample + * @param tm decoded time corresponding to the one given with first parameter + * @return false in case of errors + */ + static bool decodeFPGATime(const DWORD& clock,const double& sampleRate,const WORD& counter,TIMEVALUE& tm); + + /** + * This method can be used to translate the backend answer regarding the attenuation level to its corresponding + * double value (db) + * @param str string that contains the attenuation level + * @param val corresponding attenuation level + * @return false if the translation could not be performed + */ + static bool decodeAttenuationLevel(const IRA::CString& str,double& val); + + /** + * This method is used to encode an attenuation level, given in db, into the backend representation + * @param att double value that represent the attenuation + * @return a string that contains the backend representation of the given attenuation + */ + static IRA::CString encodeAttenuationLevel(const double& att); + + /** + * This method can be used to translate the backend answer regarding the current input source to its corresponding + * symbolic value. + * @param str string that contains the backend answerl + * @param vall corresponding input + * @return false if the translation could not be performed + */ + static bool decodeInput(const IRA::CString& str,TInputs& val); + + /** + * This method is used to encode an inputs type into the backend representation + * @param in input code to be translated + * @return a string that contains the backend representation of the given input + */ + static IRA::CString encodeInput(const TInputs& in); + + /** + * This method can be used to translate the backend answer regarding the configured bandWidth to its corresponding + * double value (MHz) + * @param str string that contains the band width information + * @param val corresponding attenuation level + * @return false if the translation could not be performed + */ + static bool decodeBandWidth(const IRA::CString& str,double& val); + + /** + * This method is used to encode bandwidth value in MHz into the backend representation + * @param in bw double value to be translated + * @return a string that contains the backend representation of the given badn width + */ + static IRA::CString encodeBandWidth(const double& bw); + + /** + * This method returns the ACS timestamp relative to the backend reference time (01/01/1970) + * @param tm the first day of January 1970 as ACS timestamp. + */ + static void getReferenceTime(TIMEVALUE& tm); + +}; + + +#endif /*_PROTOCOL_H_*/ diff --git a/Common/Servers/Skarab/include/SenderThread.h b/Common/Servers/Skarab/include/SenderThread.h new file mode 100644 index 000000000..e342a84e0 --- /dev/null +++ b/Common/Servers/Skarab/include/SenderThread.h @@ -0,0 +1,171 @@ +#ifndef _SENDERTHREAD_H_ +#define _SENDERTHREAD_H_ +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#include +#include + +/** + * This class implements a working thread. This thread is in charge of reading the data from the backend, doing a pre processing and then + * publishing them into the ACS bulk data channel. +*/ +class CSenderThread : public ACS::Thread +{ +public: + struct TSenderParameter { + SkarabImpl *sender; + IRA::CSecureArea *command; + CConfiguration *configuration; + //IRA::CSocket *dataLine; + }; + struct TTransferParameter { + long channels; /*!< number of channels involved */ + long integration; /* *m_commandLine; + CConfiguration *m_configuration; + bool m_isConnected; + IRA::CSocket m_backendSock; + BYTE *m_inputBuffer; + BYTE *m_tempBuffer; + DWORD m_tempBufferPointer; + DWORD *m_zeroBuffer; + TTransferParameter m_dataHeader; + WORD m_previousStatus; + WORD m_previousCounter; + TIMEVALUE m_startTime; + //bool m_immediateStart; + TSampleRecord m_tpi; //data regarding the normal data + TSampleRecord m_cal; // data regarding the calibration diode on data + TIMEVALUE m_lastReceiveEpoch; + bool m_stop; + bool m_go; + bool m_sending; + /* It stores the conversion factor from counts to Kelvin for each of the inputs */ + ACS::doubleSeq m_KCountsRatio; + /** + * This method is called by the thread in order to process and ship the data + */ + void processData(DWORD dataSize,const long& sectionNumber,long *boards); + + /** + * it clears of the temporary data related to one integration + */ + void clearIntegration(TSampleRecord& samp); + + /** + * This function will set up thread data structure in order to start data receiving from the backend + */ + void initTransfer(); + + /** + * Performs computation over each sample before transfering it toword the network + */ + void computeSample(TSampleRecord& samp,TIMEVALUE& sampleTime,DWORD *data,bool isCal); + +}; + +#endif /*_SENDERTHREAD_H_*/ diff --git a/Common/Servers/Skarab/include/SkarabImpl.h b/Common/Servers/Skarab/include/SkarabImpl.h new file mode 100644 index 000000000..afba54519 --- /dev/null +++ b/Common/Servers/Skarab/include/SkarabImpl.h @@ -0,0 +1,503 @@ +#ifndef _SKARABIMPL_H_ +#define _SKARABIMPL_H_ + +/* ************************************************************************************************************ */ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMistralImpl.h,v 1.1 2023-01-09 14:15:07 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Carlo Migoni(carlo.migoni@inaf.it) 16/03/2023 Creation */ +/* Carlo Migoni(carlo.migoni@inaf.it) */ + + +#ifndef __cplusplus +#error This is a C++ include file and cannot be used from plain C +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CommandLine.h" +#include "ControlThread.h" + + +namespace SimpleParser { +class PolarizationToString { +public: + char *valToStr(const long& val) { + char *c=new char[16]; + if (val==Backends::BKND_LCP) { + strcpy(c,"LEFT"); + } + else if (val==Backends::BKND_RCP) { + strcpy(c,"RIGHT"); + } + else { + strcpy(c,"FULL"); + } + return c; + } + + long strToVal(const char* str) { + IRA::CString strVal(str); + strVal.MakeUpper(); + if (strVal=="LEFT") { + return (long)Backends::BKND_LCP; + } + else if (strVal=="RIGHT") { + return (long)Backends::BKND_RCP; + } + else if (strVal=="FULL") { + return (long)Backends::BKND_FULL_STOKES; + } + else { + return strVal.ToLong(); + } + } +}; + +}; + +using namespace ACSBulkDataError; +using namespace baci; + +/** + * @mainpage Skarab backend component documentation + * @date 12/02/2013 + * @version 1.61.0 + * @author Carlo Migoni + * @remarks Last compiled under ACS 8.0.2 + * @remarks compiler version is 3.4.6 +*/ + +class CSenderThread; + +/** + * This class implements the Backends::Skarab CORBA interface. + * All exceptions that comes from the run-time interation with clients are at logged with LM_DEBUG priority. + * @todo an implementation of configure() must be done yet. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia + * @todo I could be necessary to plan a stopTime in sendStop in order to be more precise on stop time. The backend hardware never + * stops to send data and the data flux control (toward bulk data receviver) handled by the component itself. + *
+ */ +class SkarabImpl: public virtual BulkDataSenderDefaultImpl, public virtual POA_Backends::Skarab +{ +public: + /** + * Constructor. + * @param CompName component's name. This is also the name that will be used to find the configuration data for the component in the Configuration Database. + * @param containerServices pointer to the class that exposes all services offered by container + */ + SkarabImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices); + + /** + * Destructor. + */ + virtual ~SkarabImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ACSErr::ACSbaseExImpl + */ + virtual void initialize() throw (ACSErr::ACSbaseExImpl); + + /** + * Called after initialize() to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL + * @throw ACSErr::ACSbaseExImpl + */ + virtual void execute() throw (ACSErr::ACSbaseExImpl); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + virtual void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. This function tries to free all resources even though there is no + * warranty that the function is completely executed before the component is destroyed. + */ + virtual void aboutToAbort(); + + /** + * It is used to start the data transfer (e.g. send parameters to the receiver) + * @throw CORBA::SystemException + * @throw BackendsErrors::BackendsErrorsEx + * @arg \c BackendsErrors::TXErrorEx + * @throw ComponentErrors::ComponentErrorsEx + * @arg \c ComponentErrors::UnexpectedEx + */ + virtual void sendHeader() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, ComponentErrors::ComponentErrorsEx); + + /** + * Starts effectively to send the bulk of data to the receiver. The invocation of this method is forced to be far enough to the invocation + * of sendHeader (in order to respect the backend data channel latency). In order for this call to succeed, the component must be + * in CCommandLine::TstatusFields::SUSPEND mode. + * @throw CORBA::SystemException + * @throw BackendsErrors::BackendsErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + * @arg \c ComponentErrors::UnexpectedEx + * @param startTime represent the exact time that the acquisition should start. Of course this has effect only if the call + * to that method arrives reasonably before the given time. + */ + virtual void sendData(ACS::Time startTime) throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx); + + /** + * It suspend the data transfer. If the backend must not be in suspend mode. + * @throw CORBA::SystemException + * @throw BackendsErrors::BackendsErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + * @arg \c ComponentErrors::UnexpectedEx + */ + virtual void sendStop() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx); + + /** + * This immediately terminates the transfer job (previously begun by the call to sendHeader()). + * @throw CORBA::SystemException + * @throw BackendsErrors::BackendsErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + virtual void terminate() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx); + + /** + * This method will configure an input channel of the backend. The input is identified by a numeric identifier. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param input identifier of the input to be configured. it must be in the correct range (from 0 to inputsNumber) + * otherwise an exception is raisen. + * @param freq new freqency value for the input. This value represents the start frequency of the input filter(Mhz). In this + * implementation it is ignored, so a negative should be given. + * @param bw new bandWidth value in MHz. if a value of the sequence is negative the bandwidth of the corresponding + * input is unchanged. If the value is not legal an exception is thrown. + * @param feed identifier of the feed + * @param pol this value ask the input to send data for one polarization or for all Stokes parameters. Possible values are + * BKND_LCP, BKND_RCP or BKND_FULL_STOKE or a negative to keep the current value. In this implementation the component expects only a negative + * because is not possble to change this parameter. On the contrary a warning log message is posted. + * @param sr new sample rate value (Mhz). In this implementation represents the frequency of the sampling of the total power + * A negative keeps the previous value unchanged. Since the backend does not support different sample rates, + * the current one is used also for all other inputs. + * @param bins number of bins produced for each input. This value is significant for spectrometers. For that implementation + * this value is ignored since it must be always 1. If this is not the case a warning messagge is logged. + */ + virtual void setSection(CORBA::Long input,CORBA::Double freq,CORBA::Double bw,CORBA::Long feed,CORBA::Long pol,CORBA::Double sr,CORBA::Long bins) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * @deprecated This method will configure all the input channels of the backend in one shot. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param freq new freqency value for the input. This value represents the start frequency of the input filter(Mhz). In this + * implementation it is ignored, so a negative should be given. + * @param bw new bandWidth value in MHz. if a value of the sequence is negative the bandwidth of the corresponding + * input is unchanged. If the value is not legal an exception is thrown. + * @param feed identifier of the feed + * @param pol this value ask the input to send data for one polarization or for all Stokes parameters. Possible values are + * BKND_LCP, BKND_RCP or BKND_FULL_STOKE. In this implementation this parameter is ignored because this backend is a + * simple total power. + * @param sr new sample rate value (Mhz). In this implementation represents the frequency of the sampling of the total power + * A negative keeps the previous value unchanged. Since the backend does not support different sample rates, + * the current one is used also for all other inputs. + * @param bins number of bins produced for each input. This value is significant for spectrometers. For that implementation + * this value is ignored since it must be always 1. + */ + //virtual void setAllSections(CORBA::Double freq,CORBA::Double bw,CORBA::Long feed,Backends::TPolarization pol,CORBA::Double sr,CORBA::Long bins) throw (CORBA::SystemException, + // ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This method enables or disables the data streaming of the inputs. if a input is disable the input is not sampled and the + * data are not sent to the network. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param enable this must be a sequence of exactly inputsNumber elements. The inputs are enabled (default) if + * the corresponding value is positive. A negative value disables the input, whilst a zero keep the current configuration. + */ + virtual void enableChannels(const ACS::longSeq& enable) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * Sets the current integration time. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @thorw BackendsErrors::BackendsErrorsEx + * @param integration new integration value in milliseconds. A zero disables this feature, whilst a negative has not effect. + */ + virtual void setIntegration(CORBA::Long Integration) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This method allows the client to interface the component by sending text commands. The command is parsed and executed according the + * defined command syntax and grammar. This method is required to implement the Management::CommandInterpreter interface. + * @throw CORBA::SystemException + * @param cmd string contains the string that will be executed + * @param answer the string that reports the command execution results or in case, errors messages + * @return true if the command was executed correctly + */ + virtual CORBA::Boolean command(const char *cmd,CORBA::String_out answer) throw (CORBA::SystemException); + + virtual void getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException); + + virtual void getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException); + + /** + * This method is related to the implementation of the genericBackend interface + */ + virtual void setTargetFileName (const char * fileName) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * Call this function to set the current time (from the local computer) into the backend. + * @thorw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @arg \c ComponentErrors::Timeout + * @arg \c BackendsErrors::Connection + * @arg \c ComponentErrors::SocketError + */ + virtual void setTime() throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx); + + /** + * This function will control the calibration diode switching. + * @thorw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param interleave this parmater controls the switching frequency of the calibration diode. If it is zero (default) the diode is not + * switched (always turned off). if a one is given the backend will produce one sample (using the sampleRate) + * with the mark switecehd off and one with the mark switched on. A two means two sample with the mark switched off and + * one with the mark switched on.....and so on. A negative will not change the value of the parameter. + */ + virtual void activateNoiseCalibrationSwitching(CORBA::Long interleave) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This function will initialized the parameters that must be fixed before any other operation can be carried on. Some possible configuration + * are available according the given receiver connected to the backend. + * @thorw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param configuration identifier of the required initialization + */ + virtual void initialize(const char * configuration) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * Call this function in order to get a total power measure for each input channel. + * @thorw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param integration it represents the integration time (milliseconds) the backend will use to do the measure. + * If zero the default value of 1 second is used. A negative will forse the backend to adopt the value set by a call + * to (setIntegration()). + * @return a sequence of double values that reports for each backend the total power measured during the integration time. + * The caller must take care of freeing it. + */ + virtual ACS::doubleSeq * getTpi () throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + virtual ACS::doubleSeq * getRms () throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * Call this function in order to get a total power measure for each input channel. The measure is done when the inputs are directly + * connected to the 50 Ohm. + * @thorw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param integration it represents the integration time (milliseconds) the backend will use to do the measure. + * If zero the default value of 1 second is used. A negative will forse the backend to adopt the value set by a call + * to (setIntegration()). + * @return a sequence of double values that reports for each backend the total power measured during the integration time. + * The caller must take care of freeing it. + */ + virtual ACS::doubleSeq * getZero (/*CORBA::Long integration*/) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This method is used to inform the component about the proper conversion factor between Kelvin and counts. This value is used for the tsys computation during + * the sampling. If this method is never issued the default value of 1 will be used for all the channels. + * @throw CORBA::SystemException + * @param ratio this is the sequence of required values one for each channel. + */ + virtual void setKelvinCountsRatio(const ACS::doubleSeq& ratio,const ACS::doubleSeq& tsys) throw (CORBA::SystemException); + + /** + * This method is used to tune the attenuation level of each of the virtual input of the system. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param input is the identifier number of the input that we want to configure. + * @param att new attenuation level, It could be in the range 0-15. A negative will keep the previous value. + */ + virtual void setAttenuation(CORBA::Long input,CORBA::Double att) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * In order to get the inputs definition in just one call. The returned argument contains the configuration sequentially, the first element corresponds to the first input and so on. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param freq given in MHz is the initial frequency of input band + * @param bandwidth given in MHz is the band width of the input + * @param feed dives the feed number the input belongs to + * @param ifNumber given the feed it select the feed channel to which the input is connected to. Plaese notice this parameter has nothing to do with the polarization of the section. + * @return the number of inputs, in other words is the lenght of the returned sequences + */ + virtual CORBA::Long getInputs(ACS::doubleSeq_out freq,ACS::doubleSeq_out bandWidth,ACS::longSeq_out feed,ACS::longSeq_out ifNumber) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * Returns a reference to the time property Implementation of IDL interface. + * @return pointer to read-only unsigned long long property time + */ + virtual ACS::ROuLongLong_ptr time() throw (CORBA::SystemException); + + /** + * Returns a reference to the backendName property Implementation of IDL interface. + * @return pointer to read-only string property backendName + */ + virtual ACS::ROstring_ptr backendName() throw (CORBA::SystemException); + + /** + * Returns a reference to the bandWidth property implementation of the IDL interface. + * @return pointer to read-only double sequence property bandWidth + */ + virtual ACS::ROdoubleSeq_ptr bandWidth() throw (CORBA::SystemException); + + /** + * Returns a reference to the frequency property implementation of the IDL interface. + * @return pointer to read-only double sequence property frequency + */ + virtual ACS::ROdoubleSeq_ptr frequency() throw (CORBA::SystemException); + + /** + * Returns a reference to the sampleRate property implementation of the IDL interface. + * @return pointer to read-only double sequence property sampleRate + */ + virtual ACS::ROdoubleSeq_ptr sampleRate() throw (CORBA::SystemException); + + /** + * Returns a reference to the attenuation property implementation of the IDL interface. + * @return pointer to read-only double sequence property attenuation + */ + virtual ACS::ROdoubleSeq_ptr attenuation() throw (CORBA::SystemException); + + /** + * Returns a reference to the polarization property implementation of the IDL interface. + * @return pointer to read-only long sequence property polarization + */ + virtual ACS::ROlongSeq_ptr polarization() throw (CORBA::SystemException); + + /** + * Returns a reference to the bins property Implementation of IDL interface. + * @return pointer to read-only long property binsNumber + */ + virtual ACS::ROlongSeq_ptr bins() throw (CORBA::SystemException); + + /** + * Returns a reference to the feed property Implementation of IDL interface. + * @return pointer to read-only long sequence property feed + */ + virtual ACS::ROlongSeq_ptr feed() throw (CORBA::SystemException); + + /** + * Returns a reference to the inputsNumber property Implementation of IDL interface. + * @return pointer to read-only long property inputsNumber + */ + virtual ACS::ROlong_ptr inputsNumber() throw (CORBA::SystemException); + + /** + * Returns a reference to the systemTemperature property implementation of the IDL interface. + * @return pointer to read-only double sequence property systemTemperature + */ + virtual ACS::ROdoubleSeq_ptr systemTemperature() throw (CORBA::SystemException); + + /** + * Returns a reference to the integration property Implementation of IDL interface. + * @return pointer to read-only long property integration + */ + virtual ACS::ROlong_ptr integration() throw (CORBA::SystemException); + + /** + * Returns a reference to the sectionsNumber property Implementation of IDL interface. + * @return pointer to read-only long property sectionsNumber + */ + virtual ACS::ROlong_ptr sectionsNumber() throw (CORBA::SystemException); + + /** + * Returns a reference to the inputSection property Implementation of IDL interface. + * @return pointer to read-only long property inputSection + */ + virtual ACS::ROlongSeq_ptr inputSection() throw (CORBA::SystemException); + + + /** + * Returns a reference to the status implementation of IDL interface. + * @return pointer to read-only pattern property status + */ + virtual ACS::ROpattern_ptr status() throw (CORBA::SystemException); + + /** + * Returns a reference to the busy implementation of IDL interface. + * @return pointer to read-only long property busy + */ + virtual Management::ROTBoolean_ptr busy() throw (CORBA::SystemException); + +protected: + virtual void startSend() throw (CORBA::SystemException, AVStartSendErrorEx) { }; + + virtual void paceData() throw (CORBA::SystemException, AVPaceDataErrorEx) { }; + + virtual void stopSend() throw (CORBA::SystemException, AVStopSendErrorEx) { }; + +private: + SmartPropertyPointer m_ptime; + SmartPropertyPointer m_pbackendName; + SmartPropertyPointer m_pbandWidth; + SmartPropertyPointer m_pfrequency; + SmartPropertyPointer m_psampleRate; + SmartPropertyPointer m_pattenuation; + SmartPropertyPointer m_ppolarization; + SmartPropertyPointer m_pbins; + SmartPropertyPointer m_pinputsNumber; + SmartPropertyPointer m_pintegration; + SmartPropertyPointer m_pstatus; + SmartPropertyPointer< ROEnumImpl > m_pbusy; + SmartPropertyPointer m_pfeed; + SmartPropertyPointer m_ptsys; + SmartPropertyPointer m_psectionsNumber; + SmartPropertyPointer m_pinputSection; + /** This is the socket that allows to send requests to the backends throught its command line*/ + CSecureArea *m_commandLine; + CConfiguration m_configuration; + CSenderThread *m_senderThread; + CControlThread *m_controlThread; + //IRA::CSocket m_dataLine; + bool m_initialized; + SimpleParser::CParser * m_parser; + + void deleteAll(); +}; + +#endif /*SkarabImpl_H_*/ diff --git a/Common/Servers/Skarab/src/CommandLine.cpp b/Common/Servers/Skarab/src/CommandLine.cpp new file mode 100644 index 000000000..eaedc4212 --- /dev/null +++ b/Common/Servers/Skarab/src/CommandLine.cpp @@ -0,0 +1,2093 @@ +// $Id: CommandLine.cpp,v 1.3 2011-05-12 14:14:31 c.migoni Exp $ + +#include +#include "CommandLine.h" +/****************************************************************************************************************************/ +#include +/****************************************************************************************************************************/ + +#define _CHECK_ERRORS(ROUTINE) \ + else if (res==FAIL) { \ + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); \ + dummy.setCode(m_Error.getErrorCode()); \ + dummy.setDescription((const char*)m_Error.getDescription()); \ + m_Error.Reset(); \ + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,ROUTINE); \ + } \ + else if (res==WOULDBLOCK) { \ + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,ROUTINE); \ + } \ + else if (res==DECODE_ERROR) { \ + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,ROUTINE); \ + } \ + else { \ + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,ROUTINE); \ + } + +#define DECODE_ERROR -100 + +_IRA_LOGFILTER_IMPORT; + +CCommandLine::CCommandLine(ContainerServices *service): CSocket(), + m_services(service) +{ + AUTO_TRACE("CCommandLine::CCommandLine()"); + m_bTimedout=false; + m_reiniting=false; + ACS::Time init=0; + m_lastUpdate.value(init); + m_Error.Reset(); + m_configuration=NULL; + m_backendStatus=0; + setStatus(NOTCNTD); + m_setTpiIntegration=true; + m_stationSRT=false; + m_stationMED=false; + m_sectionsNumber=0; + m_inputsNumber=0; + m_stokes=false; + m_TsysRange_freq=0.0; + m_TsysRange_bw=0.0; + m_SKARAB_1=false; + m_SKARAB_1S=false; + m_SKARAB_2=false; + m_SKARAB_2S=false; + m_SKARAB_3=false; + m_SKARAB_3S=false; + m_SKARAB_4=false; + m_SKARAB_4S=false; + m_SKARAB_5=false; + m_SKARAB_5S=false; + + m_SkarabInitialized=false; +} + +CCommandLine::~CCommandLine() +{ + AUTO_TRACE("CCommandLine::~CCommandLine()"); + m_Error.Reset(); + // if the backend is transferring data...make a try to inform the backend before closing the connection + /*if (getIsBusy()) { + WORD len; + char sBuff[SENDBUFFERSIZE]; + len=CProtocol::stopAcquisition(sBuff); // get the buffer + sendBuffer(sBuff,len); + }*/ + Close(m_Error); +} + +void CCommandLine::Init(CConfiguration *config) throw (ComponentErrors::SocketErrorExImpl, + ComponentErrors::ValidationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl) +{ + int res; + //WORD len; + //char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + + AUTO_TRACE("CCommandLine::Init()"); + m_configuration=config; + /*if (!initializeConfiguration(m_configuration->getConfiguration())) { // throw (ComponentErrors::CDBAccessExImpl) + IRA::CString msg; + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::Init()"); + msg.Format("the requested configuration %s is not known",(const char *)m_configuration->getConfiguration()); + impl.setReason((const char *)msg); + throw impl; + }*/ + // this will create the socket in blocking mode..... + if (Create(m_Error,STREAM)==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + // the first time, perform a blocking connection.... + if (Connect(m_Error,m_configuration->getAddress(),m_configuration->getPort())==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + else { + setStatus(CNTD); + } + // set socket send buffer!!!! + int Val=SENDBUFFERSIZE; + if (setSockOption(m_Error,SO_SNDBUF,&Val,sizeof(int))==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + // set socket in non-blocking mode. + if (setSockMode(m_Error,NONBLOCKING)==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + + /* After the first connection, the server send the protocol version string */ + res=receiveBuffer(rBuff,RECBUFFERSIZE); + //printf("connect = %s\n", rBuff); + + m_totalPower = Backends::TotalPower::_nil(); + try { + m_totalPower = m_services->getComponent("BACKENDS/TotalPower"); + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); + Impl.setComponentName("BACKENDS/TotalPower"); + throw Impl; + } + + /*m_ifDistributor = Receivers::GenericIFDistributor::_nil(); + try { + m_ifDistributor = m_services->getComponent("RECEIVERS/SRTIFDistributor"); + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); + Impl.setComponentName("RECEIVERS/SRTIFDistributor"); + throw Impl; + }*/ + + char *Station; + IRA::CString cStation; + Station = getenv ("STATION"); + cStation = IRA::CString (Station); + if((cStation.Compare("SRT")==0)) + m_stationSRT = true; + if((cStation.Compare("Medicina")==0)) + m_stationMED = true; + + /*try { + setup (m_configuration->getConfiguration()); + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::Init()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZATION ERROR")); + } + + //Waits a bit so that everything can settle down + IRA::CIRATools::Wait(0,200000);*/ +} + +void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::stopDataAcquisition()"); + /*****************************************************************/ + // since both suspend and stop data acquisition are mapped into Command::stop message to the backend + // It happens (@ the end of a scan) that the backend receives two Command::stop messages. Even if this is not + // an issue for the backend, this leads to an unwanted behviour of the control software. The thrown exception, infact, + // leads to skip the first subscan of the next scan. Temporarly workround if to catch the exception here. A debug messages is sent. + /*****************************************************************/ + try { + Message reply = sendBackendCommand(Command::stop()); + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_DEBUG,"backend error while issuing a stop ascquisition")); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_STOPPED")); + clearStatusField(CCommandLine::BUSY); // unsets the component status to busy + clearStatusField(CCommandLine::SUSPEND); // unsets the component status to transfer job suspended...... +} + +void CCommandLine::stopDataAcquisitionForced() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl) +{ +} + + +void CCommandLine::startDataAcquisition() throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConnectionExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl) +{ + AUTO_TRACE("CCommandLine::startDataAcquisition()"); + /* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::startDataAcquisition()"); + throw impl; + }*/ + //Message reply = sendBackendCommand(Command::start()); + ACS_LOG(LM_FULL_INFO,"CCommandLine::startDataAcquisition()",(LM_NOTICE,"ACQUISTION_STARTED")); + setStatusField(CCommandLine::BUSY); // sets the component status to busy + setStatusField(CCommandLine::SUSPEND); // sets the component status to transfer job suspended...... +} + +ACS::Time CCommandLine::resumeDataAcquisition(const ACS::Time& startT) throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) +{ + TIMEVALUE now; + TIMEVALUE epoch; + long waitSec,waitMicro; + DDWORD diff; + ACS::Time expectedTime; + AUTO_TRACE("CCommandLine::resumeDataAcquisition()"); + /*if ( !(m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::resumeDataAcquisition()"); + impl.setReason("transfer job cannot be resumed in present configuration"); + throw impl; + }*/ + // check that the backend latency in preparing the data transfer is respected...... + if (startT==0) { // immediate start + IRA::CIRATools::getTime(epoch); //...so take the present time + } + else { + epoch.value(startT); + IRA::CIRATools::getTime(now); + if (startT<=now.value().value) { + ACS_LOG(LM_FULL_INFO,"TotalPowerImpl::sendData()",(LM_WARNING,"START_TIME_ALREADY_ELAPSED")); + } + } + diff=IRA::CIRATools::timeDifference(epoch,m_acquisitionStartEpoch); + if (diffgetDataLatency()) { //wait until the latency time is elapsed...... + double waitTime; + waitMicro=m_configuration->getDataLatency()-diff; + waitTime=((double)waitMicro/1000000.0); + waitSec=(long)waitTime; + waitMicro%=1000000; + ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_WARNING,"BACKEND_LATENCY_NOT_MATCHED,WAITING %3.2lf usec",waitTime)); + IRA::CIRATools::Wait(waitSec,waitMicro); + expectedTime=m_acquisitionStartEpoch.value().value+m_configuration->getDataLatency()*10; + } + else { + expectedTime=epoch.value().value; + } + Message request = Command::start(); + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_RESUMED")); + clearStatusField(SUSPEND); + } + return expectedTime; +} + +void CCommandLine::suspendDataAcquisition() throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::suspendDataAcquisition()"); + /*if ((m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { //not suspended....running + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::suspendDataAcquisition()"); + impl.setReason("transfer job cannot be suspended in present configuration"); + throw impl; + }*/ + Message request = Command::stop(); + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::suspendDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_SUSPENDED")); + setStatusField(SUSPEND); + } +} + +void CCommandLine::setAttenuation(const long&inputId, const double& attenuation) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) +{ + AUTO_TRACE("CCommandLine::setAttenuation()"); + double newAtt; + + if ((inputId < 0 ) || (inputId >= MAX_SECTION_NUMBER)) { + /*//if (inputId>=m_sectionsNumber) { + if (inputId>m_inputsNumber) { // TBC !!! + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setReason("the input identifier is out of range"); + throw impl; + } + } + else {*/ + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setReason("the input identifier is out of range"); + throw impl; + } + if (attenuation>=0) { // // the user ask for a new value + if (attenuationMAX_ATTENUATION) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setValueName("attenuation"); + impl.setValueLimit(MAX_ATTENUATION); + throw impl; + } + m_attenuation[inputId]=attenuation; + try { + m_totalPower->setAttenuation(inputId, attenuation); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setAttenuation()",(LM_NOTICE,"TOTALPOWER_ATTENUATION INPUT=%ld,ATTENUATION=%lf",inputId,attenuation)); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); + impl.log(LM_ERROR); + } + } + else { + newAtt=m_attenuation[inputId]; + } + +} + +void CCommandLine::setTsysRange(const double& freq, const double& bw) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) +{ + AUTO_TRACE("CCommandLine::setTsysRange()"); + m_TsysRange_freq = freq; + m_TsysRange_bw = bw; + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTsysRange()",(LM_NOTICE,"TSYS RANGE FREQUENCY = %lf, BANDWIDTH = %lf",m_TsysRange_freq,m_TsysRange_bw)); + +} + +void CCommandLine::setConfiguration(const long& inputId,const double& freq,const double& bw,const long& feed,const long& pol, const double& sr,const long& bins) throw ( + ComponentErrors::ValidationErrorExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::ValueOutofRangeExImpl, + BackendsErrors::BackendBusyExImpl) +{ + AUTO_TRACE("CCommandLine::setConfiguration()"); + double newBW,newSR,newFreq; + long newBins, newFeed, newPol; + double filter; + +/* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setConfiguration()"); + throw impl; + }*/ + if (inputId>=0) { //check the section id is in valid ranges + //if (inputId>=m_sectionsNumber) { + if (inputId>m_sectionsNumber) { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } + } + else { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } + if (bw>=0) { // the user ask for a new value + if (bwMAX_BAND_WIDTH) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bandWidth"); + impl.setValueLimit(MAX_BAND_WIDTH); + throw impl; + } + newBW=bw; + } + else { // else keep the present value + newBW=m_bandWidth[inputId]; + } + if (sr>=0) {// the user ask for a new value + if ((sr > MAX_SAMPLE_RATE) || (sr != 2*newBW)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("sampleRate"); + impl.setValueLimit(MAX_SAMPLE_RATE); + throw impl; + } + newSR=sr; + } + else { + newSR=m_sampleRate[inputId]; + } + + if (freq >= 0) { // the user ask for a new value + if (freq >= MIN_FREQUENCY && freq <= MAX_FREQUENCY) { + newFreq = freq; + } + else { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("freq"); + throw impl; + } + } + else + newFreq = m_frequency[inputId]; + + if (feed >= 0) { // the user ask for a new value + if (feed != 0) { // BUT for the moment is it possible to use ONLY feed 0 + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("feed"); + throw impl; + } + newFeed = feed; + } + else + newFeed = m_feedNumber[inputId]; + + if (pol >= 0) { // the user ask for a new value + if ((pol == 0) || (pol == 1)) { // LCP or RCP + newPol = pol; + } + if (pol == 2) { // FULL STOKES + newPol = pol; + } + if (pol >= 3) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("pol"); + throw impl; + } + newPol = pol; + } + else + newPol = m_polarization[inputId]; + + + if (bins>=0) { // the user ask for a new value + if (bins < MIN_BINS || bins > MAX_BINS) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bins"); + /*if (bins != MIN_BINS) + impl.setValue(MIN_BINS); + if (bins != MAX_BINS) + impl.setValue(MAX_BINS);*/ + throw impl; + } + newBins=bins; + } + else + newBins = m_bins[inputId]; + + if (m_stationSRT == true) { + try { + Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); + Message reply = sendBackendCommand(request); + if (reply.is_success_reply()) { + for (int j=0;jsetSection(2*inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(2*inputId+1,-1, filter, -1, -1, -1, -1); + } + else if (m_SK01S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK02S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+3,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+4,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK03S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+5,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+6,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK04S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+7,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+8,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK05S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+9,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+10,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK06S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+11,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+12,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK01==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK02==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK03==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId+4,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK04==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId+6,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK01==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId+8,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK06==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId+10,-1, filter, -1, -1, -1, -1); + } + } + else + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); + }*/ + /*if ((m_SL00==true || m_SL00S==true) && m_stationSRT == true) { + try { + if (newBW==128.00) { + m_ifDistributor->setup("BW-NARROW"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-NARROW")); + } + if (newBW==420.00) { + m_ifDistributor->setup("BW-MEDIUM"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-MEDIUM")); + } + if (newBW==500.00) { + m_ifDistributor->setup("BW-WIDE"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-WIDE")); + } + if (newBW==512.00) { + m_ifDistributor->setup("BW-UNFILTERED"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-UNFILTERED")); + } + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); + impl.log(LM_ERROR); + } + }*/ + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); + } + } + if (m_stationMED == true) { + try { + Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); + Message reply = sendBackendCommand(request); + if (reply.is_success_reply()) { + for (int j=0;jsetSection(2*inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(2*inputId+1,-1, filter, -1, -1, -1, -1); + } + else if (m_SK01S==true) { + if (inputId == 0) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + } + if (inputId == 1) { + m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); + m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); + } + } + else if (m_SK01==true) { + if (inputId == 0 || inputId == 1) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + if (inputId == 2 || inputId == 3) { + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + } + else + m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); + }*/ + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); + } + } +} + +void CCommandLine::getZeroTPI(DWORD *tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl) +{ + /*AUTO_TRACE("CCommandLine::getZeroTPI()"); + int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + long integration; + bool busy=getIsBusy(); + long waitTime=0; + if (busy) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::getZeroTPI()"); + throw impl; + } + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + integration=(long)round(1.0/ (m_commonSampleRate*1000.0)); + //res=getConfiguration(); // refresh the m_currentSampleRate.......... + if (res>0) { // load OK + // do nothing + } + _CHECK_ERRORS("CommandLine::getZeroTPI()"); + //if the requested integration is not equal to the current sample rate (given is milliseconds as a sample period) + // or the integration time must be forced...and the backend is not busy. Then set the correct sample rate.... + if ((integration!=m_currentSampleRate) || (m_setTpiIntegration)) { + len=CProtocol::setIntegrationTime(sBuff,integration); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + m_setTpiIntegration=false; + waitTime=1000000+integration*2000; // //wait time in microseconds...we should wait 2 seconds plus twice the integration time (which is given in milliseconds). + } + // connect the backend to the 50ohm + len=CProtocol::setZeroInput(sBuff,true); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + waitTime+=integration*2000; + if (waitTime>0) IRA::CIRATools::Wait(waitTime); + // now read the total power + len=CProtocol::getSample(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::decodeData(rBuff,tpi,m_configuration->getBoardsNumber(),m_sectionsNumber,m_boards)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::getZeroTPI()"); + } + for (int j=0;j0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + }*/ +} + +void CCommandLine::getTpi(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl, + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) +{ + getSample(tpi,false); +} + +void CCommandLine::getZero(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl, + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) +{ + getSample(tpi,true); +} + +void CCommandLine::getSample(ACS::doubleSeq& tpi,bool zero) throw (ComponentErrors::TimeoutExImpl, + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) +{ + AUTO_TRACE("CCommandLine::getSample()"); + try { + Message reply = sendBackendCommand(Command::getTpi()); + if(reply.is_success_reply()){ + tpi.length(m_inputsNumber/*m_sectionsNumber*/); + for (int j=0;j(j); + //if (zero) m_tpiZero[j]=tpi[j]/(double)m_integration; // in case of tpiZero we store it...... + if (zero) + m_tpiZero[j]=tpi[j]=0.0; // in case of tpiZero we store it...... + } + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::getTpi()",(LM_NOTICE,"BACKEND_SKARAB_GET-TPI ERROR")); + } +} + +void CCommandLine::getRms(ACS::doubleSeq& rms) throw (ComponentErrors::TimeoutExImpl, + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) +{ + AUTO_TRACE("CCommandLine::getRms()"); + try { + Message reply = sendBackendCommand(Command::getRms()); + if(reply.is_success_reply()){ + rms.length(m_inputsNumber/*m_sectionsNumber*/); + for (int j=0;j(j); + } + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::getRms()",(LM_NOTICE,"BACKEND_SKARAB_GET-RMS ERROR")); + } +} + +void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::setDefaultConfiguration()"); + //if (m_stationSRT==true) { + if (config.Compare("SKARAB_1")==0 || config.Compare("SKARAB_2")==0 || config.Compare("SKARAB_3")==0 || config.Compare("SKARAB_4")==0 || config.Compare("SKARAB_5")==0) { + //m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + //m_SK77=true; + //m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SKARAB_1S")==0 || config.Compare("SKARAB_2S")==0 || config.Compare("SKARAB_3S")==0 || config.Compare("SKARAB_4S")==0 || config.Compare("SKARAB_5S")==0) { + //m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_stokes=true; + //m_SK77=true; + //m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false;// + } + /*if (config.Compare("SK00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK00=true; + m_SK77=m_SK03=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK03S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK01")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK01=true; + m_SK77=m_SK00=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK02")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK02=true; + m_SK77=m_SK00=m_SK01=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK03")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK03=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK04")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK04=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK05")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK05=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK06")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK06=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SC00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SC00=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SL00")==0) { + m_filter = 2300.0; + m_inputsNumber=m_sectionsNumber; + m_SL00=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + if (m_stationSRT == true) { + m_ifDistributor->setup("BW-UNFILTERED"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); + } + } + if (config.Compare("SP00")==0) { + m_filter = 730.0; + m_inputsNumber=m_sectionsNumber; + m_SP00=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK77S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK77S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK00S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK01S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK01S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK02S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK02S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK03S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK03S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK04S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK04S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK05S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK05S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK06S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK06S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SC00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SC00S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SL00S")==0) { + m_filter = 2300.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SL00S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SP00S=false; + if (m_stationSRT == true) { + m_ifDistributor->setup("BW-UNFILTERED"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); + } + } + if (config.Compare("SP00S")==0) { + m_filter = 730.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SP00S=true; + m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=false; + }*/ + //} + /*if (m_stationMED==true) { + if (config.Compare("SK01")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK01=true; + m_SK00=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK00=true; + m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SCC00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SCC00=true; + m_SK00=m_SK01=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCH00=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SCH00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SCH00=true; + m_SK00=m_SK01=m_SL00=m_SP00=m_SCC00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SL00")==0) { + m_filter = 2300.0; + m_inputsNumber=m_sectionsNumber; + m_SL00=true; + m_SK00=m_SK01=m_SCC00=m_SP00=m_SCH00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SP00")==0) { + m_filter = 730.0; + m_inputsNumber=m_sectionsNumber; + m_SP00=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK00S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SK01S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SK01S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SCC00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SCC00S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCH00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SCH00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SCH00S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SL00S=m_SP00S=false; + } + if (config.Compare("SL00S")==0) { + m_filter = 2300.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SL00S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SP00S=false; + if (m_stationSRT == true) { + m_ifDistributor->setup("BW-UNFILTERED"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); + } + } + if (config.Compare("SP00S")==0) { + m_filter = 730.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SP00S=true; + m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=false; + } + }*/ +} + +void CCommandLine::setTargetFileName(const char *conf) +{ + m_targetFileName = (const char*)conf; +} + +void CCommandLine::sendTargetFileName() throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl) +{ + AUTO_TRACE("CCommandLine::sendTargetFileName()"); + int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + // I do not check for backend busy because this is a call done at the initialization and never repeated + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); + } + strcpy (sBuff,"?set-filename,"); + strcat (sBuff,(const char*)m_targetFileName); + strcat (sBuff,"\r\n"); + len = strlen (sBuff); + + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + //printf("set-filename = %s\n",rBuff); + } + if (res>0) { // operation was ok. + //if (!CProtocol::setConfiguration(rBuff)) { + // _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::setTargetFileName()"); + //} + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendTargetFileName()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendTargetFileName()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::sendTargetFileName()",(LM_NOTICE,"targetFileName SENT")); +} + +void CCommandLine::setup(const char *conf) throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConfigurationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::setup()"); + + /* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setup()"); + throw impl; + }*/ + + if (!initializeConfiguration(conf)) { + _EXCPT(BackendsErrors::ConfigurationErrorExImpl,impl,"CCommandLine::setup()"); + throw impl; + } + try { + Message request = Command::setConfiguration(string((const char*)conf)); + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) { + setDefaultConfiguration(conf); + /*for (int i=0;isetSection(i,-1, m_filter, -1, -1, -1, -1); + } + if (i == 2 || i == 3) { + m_totalPower->setSection(i+2,-1, m_filter, -1, -1, -1, -1); + } + } + if (m_SK03S==true || m_SK03==true) { + if (i == 0 || i == 1) { + m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + } + if (i == 2 || i == 3) { + m_totalPower->setSection(i+4,-1, m_filter, -1, -1, -1, -1); + } + } + if (m_SK04S==true || m_SK04==true) { + if (i == 0 || i == 1) { + m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + } + if (i == 2 || i == 3) { + m_totalPower->setSection(i+6,-1, m_filter, -1, -1, -1, -1); + } + } + if (m_SK05S==true || m_SK03==true) { + if (i == 0 || i == 1) { + m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + } + if (i == 2 || i == 3) { + m_totalPower->setSection(i+8,-1, m_filter, -1, -1, -1, -1); + } + } + else if (m_SK06S==true || m_SK06==true) { + if (i == 0 || i == 1) { + m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + } + if (i == 2 || i == 3) { + m_totalPower->setSection(i+10,-1, m_filter, -1, -1, -1, -1); + } + } + else + m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %d,FILTER=%lf",i,m_filter)); + }*/ + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZED, CONFIGURATION: %s",conf)); + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZATION ERROR, CONFIGURATION: %s",conf)); + } +} + +void CCommandLine::checkTime() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::MalformedAnswerExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl) +{ + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + } + /*Message request = Command::time(); + Message reply = sendBackendCommand(request); + string _time = reply.get_argument(0); + if(reply.is_success_reply()) + strcpy(time, _time.c_str()); + return _time.length();*/ + + /*char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + WORD len; + int res; + ///the check of th ebusy status is not done because this time chek must be performed also during sampling. + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + } + len=CProtocol::checkBackendTime(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + bool sync; + if (!CProtocol::checkBackendTime(rBuff,m_configuration->getTimeTollerance(),sync)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::checkTime()"); + } else if (!sync) { + _IRA_LOGFILTER_LOG(LM_WARNING,"CCommandLine::checkTime()","BACKEND_CLOCK_NOT_SYNCHRONIZED"); + setStatusField(TIME_SYNC); + } + else { + clearStatusField(TIME_SYNC); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::checkTime()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::checkTime()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + }*/ +} + +void CCommandLine::setTime() throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl) +{ + AUTO_TRACE("CCommandLine::setTime()"); + //int res; + //WORD len; + //char sBuff[SENDBUFFERSIZE]; + //char rBuff[RECBUFFERSIZE]; +/* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); + throw impl; + }*/ + /*len=CProtocol::setBackendTime(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + bool sync; + if (!CProtocol::decodeBackendTime(rBuff,sync)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::setTime()"); + setStatusField(TIME_SYNC); + } else if (!sync) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_WARNING,"CLOCK_NOT_SYNCHRONIZED")); + setStatusField(TIME_SYNC); + } + else { + clearStatusField(TIME_SYNC); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_NOTICE,"TIME_IS_SYNCHRONIZED")); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::setTime()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::setTime()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); + } + */ +} + +void CCommandLine::activateCalSwitching(const long& interleave) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::NotAllowedExImpl) +{ + AUTO_TRACE("CCommandLine::activateCalSwitching()"); + /*int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE];*/ + if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); + throw impl; + } + /*if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); + }*/ + Message request = Command::calOn(interleave); + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()){ + // TBD + } + if (!m_calSwitchingEnabled) { + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::activateCalSwitching()"); + throw impl; + } + if (interleave>=0) { + m_calPeriod=interleave; + if (m_calPeriod>0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_ON")); + } + else { + ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_OFF")); + } + } +} + +void CCommandLine::setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl) +{ + int bound; + if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setEnabled()"); + throw impl; + } + if ((long)en.length()>=m_sectionsNumber) { + bound=m_sectionsNumber; + } + else { + bound=en.length(); + } + for (int i=0;i0) m_enabled[i]=true; + else if (en[i]==0) m_enabled[i]=false; + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::setEnabled()",(LM_NOTICE,"CHANGED_ENABLED_CHANNEL")); +} + +void CCommandLine::setIntegration(const long& integration) throw (BackendsErrors::BackendBusyExImpl, ComponentErrors::ValueOutofRangeExImpl) +{ + AUTO_TRACE("CCommandLine::setIntegration()"); + /*if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setIntegration()"); + throw impl; + }*/ + m_integration = integration; + if (m_integration>=MIN_INTEGRATION && m_integration <= MAX_INTEGRATION) { + Message request = Command::setIntegration(integration); + Message reply = sendBackendCommand(request); + if (reply.is_success_reply()) { + // TBD + ACS_LOG(LM_FULL_INFO,"CCommandLine::setIntegration()",(LM_NOTICE,"INTEGRATION is now %ld (millisec)",m_integration)); + } + } + else { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setIntegration()"); + impl.setValueName("integration"); + throw impl; + } +} + +void CCommandLine::getAttenuation(ACS::doubleSeq& att) throw (ComponentErrors::SocketErrorExImpl, + ComponentErrors::TimeoutExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl) +{ + AUTO_TRACE("CCommandLine::getAttenuation()"); + att.length(m_inputsNumber); + for (int i=0;i(2); + //strcpy(status, _status.c_str()); + status=atof(_status.c_str()); + if (status == 0) + clearStatusField(BUSY); + if (status == 1) + setStatusField(BUSY); + + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::getBackendStatus()",(LM_NOTICE,"BACKEND_SKARAB_GET_STATUS_ERROR")); + } + //return _status.length(); + return status; +} + +void CCommandLine::getSampleRate(ACS::doubleSeq& sr) const +{ + sr.length(m_sectionsNumber); + for (int i=0;i(0); + day=seconds/86400; + seconds%=86400; + hour=seconds/3600; + seconds%=3600; + minute=seconds/60; + second=seconds % 60; + bkndTime.day(day); + bkndTime.hour(hour); + bkndTime.minute(minute); + bkndTime.second(second); + tm.reset(); + tm.normalize(true); + tm.year(1970); + tm.month(1); + tm.day(1); + tm+=bkndTime.value(); + tt=tm.value().value; + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::getTime()",(LM_NOTICE,"BACKEND_SKARAB_GET_TIME_ERROR")); + } +} + +void CCommandLine::fillMainHeader(Backends::TMainHeader& bkd) +{ + bkd.sections=m_sectionsNumber; + bkd.beams=m_beams; + //resultingSampleRate(m_integration,m_commonSampleRate,intTime); + //bkd.integration=intTime; + bkd.integration=m_integration; + bkd.sampleSize=m_sampleSize; + bkd.noData=true; +} + +void CCommandLine::fillChannelHeader(Backends::TSectionHeader *chHr,const long& size) +{ + long index=0; + for (int i=0;i0.0) || ((temp-accumulations)<0.0)) { + res=true; + } + result=(long)round((accumulations/(sr*1000))); + return res; +} + +// Protected Methods + +void CCommandLine::onConnect(int ErrorCode) +{ + CError Tmp; + if (getStatus()==CNTDING) { // if the line is connecting....... + if (ErrorCode==0) { + if (EventSelect(Tmp,E_CONNECT,false)==SUCCESS) { + setStatus(CNTD); + CSocket::setStatus(IRA::CSocket::READY); // force the socket status to be ready..... + try { + //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... + } + catch (ACSErr::ACSbaseExImpl& ex) { + + } + clearStatusField(BUSY); + m_reiniting=true; // ask to the datasocket to accept connection again + ACS_LOG(LM_FULL_INFO,"CCommandLine::onConnect()",(LM_NOTICE,"SOCKET_RECONNECTED")); + } + } + else { + setStatus(NOTCNTD); + ACS_DEBUG_PARAM("CCommandLine::onConnect()","Reconnection failed, exit code is %d",ErrorCode); + } + } +} + +void CCommandLine::onTimeout(WORD EventMask) +{ + if ((EventMask&E_CONNECT)==E_CONNECT) { + ACS_DEBUG("CCommandLine::onTimeout()","Reconnection timed-out, keep trying...."); + } +} + +// private methods + +IRA::CSocket::OperationResult CCommandLine::sendBuffer(char *Msg,WORD Len) +{ + int NWrite; + int BytesSent; + BytesSent=0; + while (BytesSentm_configuration->getCommandLineTimeout()) { + m_bTimedout=true; + return WOULDBLOCK; + } + else { + CIRATools::Wait(0,20000); + continue; + } + } + else if (res==FAIL) { + setStatus(NOTCNTD); + CString app; + app.Format("SOCKET_DISCONNECTED - %s",(const char *)m_Error.getFullDescription()); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()",(const char*)app); + return res; + } + else if (res==0) { + setStatus(NOTCNTD); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()","SOCKET_DISCONNECTED - remote side shutdown"); + return res; + } + else { + if (inCh!=PROT_TERMINATOR_CH) { + Msg[nRead]=inCh; + nRead++; + } + else { + Msg[nRead]=0; + return nRead; + } + } + } +} + +int CCommandLine::sendCommand(char *inBuff,const WORD& inLen,char *outBuff) +{ + OperationResult Res; + if ((Res=sendBuffer(inBuff,inLen))==SUCCESS) { + int bytes=receiveBuffer(outBuff,RECBUFFERSIZE); + return bytes; + } + else { // send fails....m_Error already set by sendBuffer + return Res; + } +} + +Message +CCommandLine::sendBackendCommand(Message request) +{ + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); + } + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + strcpy (sBuff,request.toString(true).c_str()); + int len = strlen (sBuff); + int res = 0; + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + clearStatusField(CCommandLine::BUSY); + setStatusField(SUSPEND); + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendBackendCommand()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendBackendCommand()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); + } + Message reply(string(rBuff, res), true); + try { + reply.validate(); + } + catch (BackendProtocolError& bpe) { + //TODO: somehow the reply is not valid + //we cannot proceed we need to throw an exception + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"sendBackendCommand()"); + } + if(!(reply.is_valid_reply_for(request))) + { + //TODO: this answer is not valid for this request, throw exception + _THROW_EXCPT(BackendsErrors::ReplyNotValidExImpl,"sendBackendCommand()"); + } + if(!(reply.is_success_reply())) + { + //TODO: the reply has a FAIL o INVALID code, this must be + //managed + _EXCPT(BackendsErrors::BackendFailExImpl,impl,"sendBackendCommand()"); + //impl.setReason("transfer job cannot be resumed in present configuration"); + impl.setReason(reply.get_argument(0).c_str()); + throw impl; + } + return reply; +} + +//int CCommandLine::getConfiguration(char* configuration) +void CCommandLine::getConfiguration(char* configuration) +{ + Message request = Command::getConfiguration(); + try { + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) + { + strcpy(configuration, reply.get_argument(0).c_str()); + } + } + catch (...) { + + } +} + +int CCommandLine::getCommProtVersion(CORBA::String_out version) +{ + Message request = Command::version(); + Message reply = sendBackendCommand(request); + string _version = reply.get_argument(0); + if(reply.is_success_reply()) + strcpy(version, _version.c_str()); + return _version.length(); +} + +bool CCommandLine::checkConnection() +{ + CError Tmp; + char sBuffer[RECBUFFERSIZE]; + int rBytes; + if (m_bTimedout) { // if a previous time out happend....try if the buffer has still to be received + rBytes=receiveBuffer(sBuffer,RECBUFFERSIZE); + if (rBytes==WOULDBLOCK) { // if the operation would have block again.....declare the disconnection + setStatus(NOTCNTD); // another timeout! something has happend + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::checkConnection()","SOCKET_DISCONNECTED - timeout expired"); + } + else if (rBytes==FAIL) { + // Nothing to do, this error will be handled below.... + } + else if (rBytes==0) { + // Nothing to do, this error will be handled below.... + } + else { + m_bTimedout=false; // timeout recovered + } + } + if (getStatus()==CNTD) { + return true; + } + else if (getStatus()==CNTDING) { + return false; + } + else { // socket is not connected.... + // try to close the socket, if it is already closed : never known.... + Close(Tmp); + Tmp.Reset(); + m_bTimedout=false; + // this will create the socket in blocking mode..... + if (Create(Tmp,STREAM)==SUCCESS) { + // Put the socket in non-blocking mode, registers the onconnect event....and allow some seconds to complete! + if (EventSelect(Tmp,E_CONNECT,true,m_configuration->getConnectTimeout())==SUCCESS) { + OperationResult Res; + ACS_DEBUG("CCommandLine::checkConnection()","Trying to reconnect"); + Res=Connect(Tmp,m_configuration->getAddress(),m_configuration->getPort()); + if (Res==WOULDBLOCK) { + setStatus(CNTDING); + } + else if (Res==SUCCESS) { + setStatus(CNTD); + try { + //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... + } + catch (ACSErr::ACSbaseExImpl& ex) { + + } + clearStatusField(BUSY); + m_reiniting=true; + ACS_LOG(LM_FULL_INFO,"CCommandLine::checkConnection()",(LM_NOTICE,"SOCKET_RECONNECTED")); //we do not want to filter this info so no logfilter..... + return true; + } + } + } + return false; + } +} + +bool CCommandLine::initializeConfiguration(const IRA::CString & config) throw (ComponentErrors::CDBAccessExImpl) +{ + int i; + CConfiguration::TBackendSetup setup; + if (m_configuration->getSetupFromID(config,setup)) { // throw (ComponentErrors::CDBAccessExImpl) + m_sectionsNumber=setup.sections; + for (WORD k=0;kcloseTable(); + delete m_configurationTable; + } +} + +bool CConfiguration::getInputPorts(const IRA::CString& conf,CProtocol::TInputs* inputPort,WORD& size) +{ + int start=0; + IRA::CString ret; + size=0; + while (IRA::CIRATools::getNextToken(conf,start,' ',ret)) { + if (size>=MAX_BOARDS_NUMBER) return false; + if (ret=="PRIMARY") { + inputPort[size]=CProtocol::PRIMARY; + } + else if (ret=="BWG") { + inputPort[size]=CProtocol::BWG; + } + else if (ret=="GREGORIAN") { // GREGORIAN + inputPort[size]=CProtocol::GREGORIAN; + } + else { + return false; + } + size++; + } + if ((size!=1) && (size!=m_dwBoardsNumber)) return false; // the size of inputs vector should be 1 or equal to the number of boards + if ((size==1)) { // if the provided list of input ports is one element, i'll fill everything up to the maximum number of boards + for (WORD k=1;kFirst(); + for (int i=0;irecordCount();i++) { + CString id((*m_configurationTable)["configurationID"]->asString()); + if (setupID==id) { + done=true; + break; + } + m_configurationTable->Next(); + } + if (done) { + setup.setupID=(*m_configurationTable)["configurationID"]->asString(); + setup.sections=(*m_configurationTable)["sections"]->asLongLong(); + if (setup.sections>MAX_SECTION_NUMBER) { + return false; + } + if ((*m_configurationTable)["calSwitchingEnabled"]->asString()=="TRUE") { + setup.calSwitchEnabled=true; + } + else { + setup.calSwitchEnabled=false; + } + inputPorts=(*m_configurationTable)["inputPort"]->asString(); + if (!getInputPorts(inputPorts,setup.inputPort,setup.inputPorts)) { + _EXCPT(ComponentErrors::CDBAccessExImpl,impl,""); + impl.setFieldName("Configuration.inputPort"); + throw impl; + } + setup.beams=(*m_configurationTable)["beams"]->asLongLong(); + setup.bandWidth=(*m_configurationTable)["bandWidth"]->asDouble(); + setup.attenuation=(*m_configurationTable)["attenuation"]->asDouble(); + int start_si=0,start_pol=0,start_feed=0,start_ifs=0; + IRA::CString section_boards((*m_configurationTable)["section_boards"]->asString()); + IRA::CString polarizations((*m_configurationTable)["polarizations"]->asString()); + IRA::CString feed((*m_configurationTable)["feed"]->asString()); + IRA::CString ifs((*m_configurationTable)["IF"]->asString()); + IRA::CString ret; + for(int i=0;i=(long)m_dwBoardsNumber) || (setup.section_boards[i]<0)) return false; + if (!IRA::CIRATools::getNextToken(polarizations,start_pol,' ',ret)) return false; + if (ret=="L") { + setup.polarizations[i]=Backends::BKND_LCP; + } + else if (ret=="R") { + setup.polarizations[i]=Backends::BKND_RCP; + } + else { + setup.polarizations[i]=Backends::BKND_FULL_STOKES; + } + //printf("setup.pol = %d\n", setup.polarizations[i]); + if (!IRA::CIRATools::getNextToken(feed,start_feed,' ',ret)) return false; + setup.feed[i]=ret.ToLong(); + if (!IRA::CIRATools::getNextToken(ifs,start_ifs,' ',ret)) return false; + setup.ifs[i]=ret.ToLong(); + ACS_LOG(LM_FULL_INFO,"CConfiguration::getSetupFromID()",(LM_DEBUG,"Sections: %d - Board: %d - Polarization: %d - Feed: %d - Ifs: %d",i,setup.section_boards[i],setup.polarizations[i],setup.feed[i],setup.ifs[i])); + } + setup.bins=(*m_configurationTable)["bins"]->asLongLong(); + return true; + } + else { + return false; + } +} + +void CConfiguration::init(maci::ContainerServices *Services) throw (ComponentErrors::CDBAccessExImpl,ComponentErrors::MemoryAllocationExImpl,ComponentErrors::IRALibraryResourceExImpl) +{ + _GET_STRING_ATTRIBUTE("IPAddress","TCP/IP address is: ",m_sAddress); + _GET_DWORD_ATTRIBUTE("Port","Port is: ",m_wPort); + _GET_DWORD_ATTRIBUTE("CommandLineTimeout","Time out of the command line is (uSec): ",m_dwCommandLineTimeout); + _GET_DWORD_ATTRIBUTE("ConnectTimeout","Time out of the command line connection is (uSec): ",m_dwConnectTimeout); + _GET_DWORD_ATTRIBUTE("PropertyRefreshTime","The property refresh time is (microseconds): ",m_dwPropertyRefreshTime); + _GET_STRING_ATTRIBUTE("Configuration","Backend configuration is: ",m_sConfig); + _GET_DWORD_ATTRIBUTE("TimeTollerance","The time tollerance is (microseconds): ",m_dwTimeTollerance); + _GET_DWORD_ATTRIBUTE("RepetitionCacheTime","Log repetition filter cache time (uSec)",m_dwRepetitionCacheTime); + _GET_DWORD_ATTRIBUTE("RepetitionExpireTime","Log repetition filter expire time (uSec)",m_dwRepetitionExpireTime); + _GET_DWORD_ATTRIBUTE("DataPort","Port of data line is: ",m_wDataPort); + _GET_STRING_ATTRIBUTE("DataIPAddress","Data line TCP/IP address is: ", m_sDataAddress); + _GET_DWORD_ATTRIBUTE("DataLatency","The latency of the backend data line is (uSec)",m_dwDataLatency); + _GET_DWORD_ATTRIBUTE("SenderSleepTime","The sender thread sleep time is (uSec)",m_dwSenderSleepTime); + _GET_DWORD_ATTRIBUTE("SenderResponseTime","The sender thread response time is (uSec)",m_dwSenderResponseTime); + _GET_DWORD_ATTRIBUTE("ControlSleepTime","The control thread sleep time is (uSec)",m_dwControlSleepTime); + _GET_DWORD_ATTRIBUTE("ControlResponseTime","The control thread response time is (uSec)",m_dwControlResponseTime); + _GET_DWORD_ATTRIBUTE("BoardsNumber","The number of installed boards is ",m_dwBoardsNumber); + _GET_DWORD_ATTRIBUTE("DataBufferSize","Size of data packet is (bytes)",m_dwDataBufferSize); + + if (m_dwBoardsNumber>MAX_BOARDS_NUMBER) m_dwBoardsNumber=MAX_BOARDS_NUMBER; + + // read the configurations + IRA::CError error; + try { + m_configurationTable=(CDBTable *)new CDBTable(Services,"Configuration","DataBlock/Skarab"); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); + throw dummy; + } + error.Reset(); + if (!m_configurationTable->addField(error,"configurationID", CDataField::STRING)) { + error.setExtra("Error adding field configurationID", 0); + } + else if (!m_configurationTable->addField(error,"sections",CDataField::LONGLONG)) { + error.setExtra("Error adding field sections", 0); + } + else if (!m_configurationTable->addField(error,"calSwitchingEnabled",CDataField::STRING)) { + error.setExtra("Error adding field calSwitchingEnabled", 0); + } + else if (!m_configurationTable->addField(error,"inputPort", CDataField::STRING)) { + error.setExtra("Error adding field inputPort", 0); + } + else if (!m_configurationTable->addField(error,"beams", CDataField::LONGLONG)) { + error.setExtra("Error adding field beams", 0); + } + else if (!m_configurationTable->addField(error,"bandWidth",CDataField::DOUBLE)) { + error.setExtra("Error adding field bandWidth", 0); + } + else if (!m_configurationTable->addField(error,"attenuation",CDataField::DOUBLE)) { + error.setExtra("Error adding field attenuation", 0); + } + else if (!m_configurationTable->addField(error,"section_boards", CDataField::STRING)) { + error.setExtra("Error adding field sections_inputs", 0); + } + else if (!m_configurationTable->addField(error,"polarizations", CDataField::STRING)) { + error.setExtra("Error adding field polarizations", 0); + } + else if (!m_configurationTable->addField(error,"feed",CDataField::STRING)) { + error.setExtra("Error adding field feed", 0); + } + else if (!m_configurationTable->addField(error,"IF",CDataField::STRING)) { + error.setExtra("Error adding field IF", 0); + } + else if (!m_configurationTable->addField(error,"bins", CDataField::LONGLONG)) { + error.setExtra("Error adding field bins", 0); + } + if (!error.isNoError()) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,error); + dummy.setCode(error.getErrorCode()); + dummy.setDescription((const char*)error.getDescription()); + throw dummy; + } + if (!m_configurationTable->openTable(error)) { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); + throw dummy; + } + +} + diff --git a/Common/Servers/Skarab/src/ControlThread.cpp b/Common/Servers/Skarab/src/ControlThread.cpp new file mode 100644 index 000000000..a954c6504 --- /dev/null +++ b/Common/Servers/Skarab/src/ControlThread.cpp @@ -0,0 +1,43 @@ +// $Id: ControlThread.cpp,v 1.1 2011-03-14 14:15:07 c.migoni Exp $ + +#include "ControlThread.h" +#include + +_IRA_LOGFILTER_IMPORT; + + +CControlThread::CControlThread(const ACE_CString& name,CSecureArea *parameter,const ACS::TimeInterval& responseTime, + const ACS::TimeInterval& sleepTime) : ACS::Thread(name,responseTime,sleepTime) + { + AUTO_TRACE("CControlThread::CControlThread()"); + m_pData=parameter; +} + + CControlThread::~CControlThread() + { + AUTO_TRACE("CControlThread::~CControlThread()"); + } + + void CControlThread::onStart() + { + AUTO_TRACE("CControlThread::onStart()"); + } + + void CControlThread::onStop() + { + AUTO_TRACE("CControlThread::onStop()"); + } + + void CControlThread::runLoop() + { + IRA::CSecAreaResourceWrapper line=m_pData->Get(); + try { + //line->checkTime(); + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl,_dummy,E,"CControlThread::runLoop()"); + _dummy.setReason("Could not check time synchronization"); + _IRA_LOGFILTER_LOG_EXCEPTION(_dummy,LM_ERROR); + } +} + diff --git a/Common/Servers/Skarab/src/Makefile b/Common/Servers/Skarab/src/Makefile new file mode 100644 index 000000000..931948bd8 --- /dev/null +++ b/Common/Servers/Skarab/src/Makefile @@ -0,0 +1,215 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1 2011-03-14 14:15:07 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 11/09/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +MAKE_PDF = ON + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lstdc++ + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# +# +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = SkarabImpl +LIBRARIES_L = + +SkarabImpl_OBJECTS = SkarabImpl Configuration CommandLine SenderThread ControlThread Protocol +SkarabImpl_LIBS = IRALibrary GenericBackendStubs SkarabStubs TotalPowerStubs ManagmentDefinitionsStubs ReceiversDefinitionsStubs BackendsDefinitionsStubs bulkDataStubs bulkDataSenderStubs GenericIFDistributorStubs\ + bulkDataReceiverStubs ACSBulkDataError ComponentErrors BackendsErrors ParserErrors ManagementErrors \ + DiscosBackendProtocolLib DiscosVersion + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = _send_backend_command +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = Skarab SkarabSetup + +# +# IDL Files and flags +# +IDL_FILES = +IDL_TAO_FLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod 700 $(INTROOT)/bin/_send_backend_command + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Servers/Skarab/src/Protocol.cpp b/Common/Servers/Skarab/src/Protocol.cpp new file mode 100644 index 000000000..78c24d200 --- /dev/null +++ b/Common/Servers/Skarab/src/Protocol.cpp @@ -0,0 +1,596 @@ + +#include "Protocol.h" +#include "Common.h" + +WORD CProtocol::setConfiguration_broadcast(char *sBuff,const TInputs& input,const double &att,const double& bw) +{ + strcpy(sBuff,PROT_SET_CONF_BROAD); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeInput(input)); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeAttenuationLevel(att)); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeBandWidth(bw)); + strcat(sBuff,PROT_TERMINATOR); + return strlen (sBuff); +} + +WORD CProtocol::setConfiguration(char *sBuff,long id,const TInputs& input,const double &att,const double& bw,long *boards) +{ + char tempBuff[128]; + strcpy(sBuff,PROT_SET_CONF); + strcat(sBuff,PROT_SEPARATOR); + if (boards==NULL) { + sprintf(tempBuff,"%ld",id+1); //the inner enumeration goes from 0 to SECTIONNUMBER-1, + // in the backend goes from 1 to BOARDNUMBER + } + else { + sprintf(tempBuff,"%ld",boards[id]+1); //the inner enumeration goes from 0 to SECTIONNUMBER-1, + } + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeInput(input)); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeAttenuationLevel(att)); + strcat(sBuff,PROT_SEPARATOR); + strcat(sBuff,(const char *)encodeBandWidth(bw)); + strcat(sBuff,PROT_TERMINATOR); + return strlen (sBuff); +} + +WORD CProtocol::askBackendConfiguration(char *sBuff) +{ + strcpy(sBuff,PROT_GET_CONF); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + +WORD CProtocol::checkBackendTime(char *sBuff) +{ + TIMEVALUE now,tm; + TIMEDIFFERENCE diff; + long long seconds; + char tempBuff[128]; + strcpy(sBuff,PROT_CHECK_TIME); + strcat(sBuff,PROT_SEPARATOR); + getReferenceTime(tm); + IRA::CIRATools::getTime(now); + diff.value(now.difference(tm.value())); + seconds=diff.day()*86400+diff.hour()*3600+diff.minute()*60+diff.second(); + sprintf(tempBuff,"%lld%c%ld",seconds,PROT_SEPARATOR_CH,(long)diff.microSecond()); + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + +WORD CProtocol::setBackendTime(char *sBuff) +{ + TIMEVALUE now,tm; + TIMEDIFFERENCE diff; + long micro; + long long seconds; + char tempBuff[128]; + strcpy(sBuff,PROT_SET_TIME); + strcat(sBuff,PROT_SEPARATOR); + getReferenceTime(tm); + IRA::CIRATools::getTime(now); + micro=now.microSecond(); + if (micro<300000) { + micro=(400000-micro); // take 1 more tens of second. + IRA::CIRATools::Wait(0,micro); + IRA::CIRATools::getTime(now); + } + else if (micro>700000) { + micro=1400000-micro; // take 1 more tens of second. + IRA::CIRATools::Wait(0,micro); + IRA::CIRATools::getTime(now); + } + diff.value(now.difference(tm.value())); + seconds=diff.day()*86400+diff.hour()*3600+diff.minute()*60+diff.second(); + sprintf(tempBuff,"%lld%c%ld",seconds,PROT_SEPARATOR_CH,(long)diff.microSecond()); + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + + WORD CProtocol::startAcquisition(char *sBuff,const double& sampleRate,const long& cal,const WORD& port,const IRA::CString& address) + { + double sR; + char tempBuff[200]; + strcpy(sBuff, PROT_START_ACQ); + strcat(sBuff,PROT_SEPARATOR); + sR=sampleRate*1000.0; //sample rate in KHz + sR=1/sR; // sample rate given in milliseconds (sample period) + sprintf(tempBuff,"%ld%c%ld%c%hd%c%s%c%hd",(long)round(sR),PROT_SEPARATOR_CH,cal,PROT_SEPARATOR_CH, + 0,PROT_SEPARATOR_CH,(const char*)address,PROT_SEPARATOR_CH,port); + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); + } + + WORD CProtocol::setIntegrationTime(char *sBuff,const long& integrationTime) + { + char tempBuff[200]; + strcpy(sBuff, PROT_SET_SAMPLE_RATE); + strcat(sBuff,PROT_SEPARATOR); + sprintf(tempBuff,"%ld%c",integrationTime,PROT_SEPARATOR_CH); + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); + } + +WORD CProtocol::AutoGainControl(char *sBuff,const WORD& channels,const WORD& level) +{ + char tempBuff[200]; + strcpy(sBuff,PROT_AUTO_GAIN); + strcat(sBuff,PROT_SEPARATOR); + sprintf(tempBuff,"%d%c%d%c",channels,PROT_SEPARATOR_CH,level,PROT_SEPARATOR_CH); + strcat(sBuff,tempBuff); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + +WORD CProtocol::getSample(char *sBuff) +{ + strcpy(sBuff,PROT_GET_SAMPLE); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + + WORD CProtocol::resumeAcquisition(char *sBuff) + { + strcpy(sBuff,PROT_RESUME_ACQ); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); + } + + WORD CProtocol::stopAcquisition(char *sBuff) +{ + strcpy(sBuff,PROT_STOP_ACQ); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + +WORD CProtocol::setZeroInput(char *sBuff,bool activate) +{ + strcpy(sBuff,PROT_SET_ZERO); + strcat(sBuff,PROT_SEPARATOR); + if (activate) strcat(sBuff,"1"); + else strcat(sBuff,"0"); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); +} + + WORD CProtocol::suspendAcquisition(char *sBuff) + { + strcpy(sBuff,PROT_SUSPEND_ACQ); + strcat(sBuff,PROT_TERMINATOR); + return strlen(sBuff); + } + +void CProtocol::swap(DWORD* word) + { + DWORD p; + p=((*word)<<16)|((*word)>>16); + *word=p; + } + +bool CProtocol::status(char *rBuff,double ×tamp, char *statusCode, bool &acquiring) +{ + +} + +bool CProtocol::setConfiguration(const char *rBuff) +{ + IRA::CString str(rBuff); + IRA::CString ret; + int start=0; + + // get !set-configuration string + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_COMMA,ret)) { + return false; + } + // get !set-configuration string + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_COMMA,ret)) { + return false; + } + +} + +bool CProtocol::decodeBackendConfiguration(const char *rBuff,const long& sectionNumber,const DWORD& boardsNumber,double *att,double *bw,TInputs *in,TIMEVALUE& tm,long& currentSR,long * boards) +{ + IRA::CString str(rBuff); + IRA::CString ret; + int start=0; + double boardBw[MAX_BOARDS_NUMBER],boardAtt[MAX_BOARDS_NUMBER]; + TInputs boardIn[MAX_BOARDS_NUMBER]; + // get fox cpu time (seconds)...not used yet + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + // get fox cpu time (microseconds)...not used yet + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + // get FPGA time ...just seconds are reported + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + else { + if (!decodeFPGATime(ret,tm)) { + return false; + } + } + // get the sample rate in millisecs....... + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + else { + currentSR=ret.ToLong(); + } + // get the cal diode cycle period (multiple of the sample rate). + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + else { + } + // get the zero cycle period (multiple of the caldiode cycle) + if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_CH,ret)) { + return false; + } + else { + } + for (DWORD i=0;ithreshold) && (hostMicro<(1000000-threshold))) { //if the time check request has been issued around the middle of a second... + if ((hostSec!=foxSec) && (hostSec!=fpgaSec)) { + res=false; + } + } + else { + if (hostSec>foxSec) { + micro=(hostSec-foxSec)*1000000; + micro+=(hostMicro-foxMicro); + } + else if (foxSec>hostSec) { + micro=(foxSec-hostSec)*1000000; + micro+=(foxMicro-hostMicro); + } + else { + micro=ABS(hostMicro,foxMicro); + } + if (micro>threshold) { + res=false; + } + } + } + return true; +} + +bool CProtocol::isAck(const char *rBuff) +{ + return (strcmp(rBuff,PROT_ACK)==0); +} + +bool CProtocol::isTpi(const WORD& flag) +{ + return (((flag & 0x30) >> 4)==0); +} + +bool CProtocol::isCal(const WORD& flag) +{ + return (((flag & 0x30) >> 4)==1); +} + +bool CProtocol::isNewStream(const WORD& previousStatus,const WORD& previousCounter,const WORD& currentCounter) +{ + if (previousStatus==0) { + return true; + } + else if (ABS(previousCounter,currentCounter)>1) { + if ((previousCounter==65535) && (currentCounter==0)) { + return false; + } + else return true; + } + else return false; +} + +bool CProtocol::decodeData(const char *rBuff,DWORD *data,const DWORD& boardsNumber,const long& sectionNumber,long *boards) +{ + IRA::CString str(rBuff); + IRA::CString ret; + int start=0; + DWORD boardOutput[MAX_BOARDS_NUMBER]; + + printf("outtpi = %s\n",rBuff); + + // get fox cpu time (seconds)...not used yet + if (!CIRATools::getNextToken(str,start,PROT_GET_TPI_STR,ret)) { + printf("uno\n"); + return false; + } + // get sample counter....it should be always zero + //if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_COMMA,ret)) { + // printf("due\n"); + // return false; + //} + // get sample flag.....not used for this purpose + //if (!CIRATools::getNextToken(str,start,PROT_OK,ret)) { + // printf("tre\n"); + // return false; + //} + //if (!CIRATools::getNextToken(str,start,PROT_SEPARATOR_COMMA,ret)) { + // return false; + //} + //for (DWORD j=0;j + +_IRA_LOGFILTER_IMPORT; + +CSenderThread::CSenderThread(const ACE_CString& name,TSenderParameter *par, + const ACS::TimeInterval& responseTime,const ACS::TimeInterval& sleepTime) : ACS::Thread(name,responseTime,sleepTime) +{ + AUTO_TRACE("CSenderThread::CSenderThread()"); + m_sender=par->sender; + m_commandLine=par->command; + m_configuration=par->configuration; + //m_dataLine=par->dataLine; + m_isConnected=false; + m_inputBuffer=new BYTE[DATABUFFERSIZE]; + m_tempBuffer=new BYTE[DATABUFFERSIZE*2]; + m_tempBufferPointer=0; + m_zeroBuffer=new DWORD[MAX_SECTION_NUMBER]; + m_KCountsRatio.length(MAX_SECTION_NUMBER); + for (int i=0;i cmd=m_commandLine->Get(); + if (cmd->m_reiniting) { + cmd->m_reiniting=false; + closeSocket(); + cmd->clearStatusField(CCommandLine::DATALINERROR); + cmd->clearStatusField(CCommandLine::SAMPLING); + return; + } + cmd.Release(); + /* DO NOTHING + //the thread starts to listen to the socket for incoming connections to + if (!m_isConnected) { + res=m_dataLine->Accept(err,m_backendSock); + if (res==IRA::CSocket::WOULDBLOCK) { + // do nothing...exit the run loop until the next iteration + } + else if (res==IRA::CSocket::FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,err); + dummy.setCode(err.getErrorCode()); + dummy.setDescription((const char*)err.getDescription()); + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + line->setStatusField(CCommandLine::DATALINERROR); + _IRA_LOGFILTER_LOG_EXCEPTION(dummy,LM_WARNING); //log as warn because this is the thread and no client is aware of that + } + else { + m_isConnected=true; // the conneciton has been enstablished + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + line->clearStatusField(CCommandLine::DATALINERROR); + ACS_LOG(LM_FULL_INFO,"CCSenderThread::runLoop()",(LM_INFO,"BACKEND_CONNECTED_TO_DATA_LINE")); + initTransfer(); + } + } + else { //already connected...then try a new data reception + res=m_backendSock.Receive(err,m_inputBuffer,DATABUFFERSIZE); + if (res==0) { // backend disconnected...propably as a consequence of a terminate data transmission command. + // gets the access to the + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + line->clearStatusField(CCommandLine::DATALINERROR); + line->clearStatusField(CCommandLine::SAMPLING); + closeSocket(); + ACS_LOG(LM_FULL_INFO,"CCSenderThread::runLoop()",(LM_INFO,"DISCONNECTED")); + } + else if (res==IRA::CSocket::FAIL) { //error during receive !!!! + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,err); + dummy.setCode(err.getErrorCode()); + dummy.setDescription((const char*)err.getDescription()); + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + line->setStatusField(CCommandLine::DATALINERROR); + _IRA_LOGFILTER_LOG_EXCEPTION(dummy,LM_WARNING); + } + else if (res==IRA::CSocket::WOULDBLOCK) { //nothing to read + TIMEVALUE now; + IRA::CIRATools::getTime(now); + if (IRA::CIRATools::timeDifference(now,m_lastReceiveEpoch)>2000000) { // if the last data reception is more than two seconds old + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + line->clearStatusField(CCommandLine::SAMPLING); + } + } + else { // receive was ok and res is the number of bytes that are read + + long *boards; + long sectionNumber; + IRA::CIRATools::getTime(m_lastReceiveEpoch); + IRA::CSecAreaResourceWrapper line=m_commandLine->Get(); + boards=line->boardsMapping(); + sectionNumber=line->sectionNumber(); + line->setStatusField(CCommandLine::SAMPLING); + line->clearStatusField(CCommandLine::DATALINERROR); + line->getKCRatio(m_KCountsRatio); // get the K/C ratio + //processData((DWORD)res,sectionNumber,boards); + processData(1,sectionNumber,boards); + //} + //} + if (m_stop) { // we were asked to stop the data transfer..... + m_go=false; + m_stop=false; + try { + #ifndef BKD_DEBUG + if (m_sending) { + m_sender->getSender()->stopSend(FLOW_NUMBER); + } + #endif + m_sending=false; + } + catch (AVStopSendErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"CSenderThread::runLoop()"); + impl.setDetails("stop message could not be sent"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CSenderThread::runLoop()"); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + } + */ +} + +void CSenderThread::saveDataHeader(Backends::TMainHeader* mH,Backends::TSectionHeader* cH) +{ + m_dataHeader.channels=mH->sections; + m_dataHeader.integration=mH->integration; + for (int j=0;jsampleSize; + //m_dataHeader.normalization=round(m_dataHeader.sampleRate*double(m_dataHeader.integration*1000)); // integration from milli to microseconds + m_dataHeader.normalization=(1.0/m_dataHeader.sampleRate)/1000.0; +} + +void CSenderThread::saveStartTime(const ACS::Time& time) +{ + /*if (time!=0) {*/ + m_startTime.value(time); + /*m_immediateStart=false; + } + else { + m_immediateStart=true; + }*/ +} + +/*void CSenderThread::setKelvinCountsRatio(const ACS::doubleSeq& ratio) +{ + for (unsigned i=0;igetDataBufferSize()<=m_tempBufferPointer) { + printf("after while\n"); + currentPointer=m_tempBuffer+bufferCounter; + CProtocol::decodeData(currentPointer,m_dataHeader.sampleRate,m_previousStatus,m_previousCounter,sampleTime,counter,status,data,sectionNumber,boards); + bufferCounter+=m_configuration->getDataBufferSize(); + if (!CProtocol::isNewStream(m_previousStatus,m_previousCounter,counter)) { //the first sample is discarded + printf("before if m_startTime\n"); + if (m_startTime<=sampleTime.value()) || (m_immediateStart)) { //if the start time is elapsed than start processing + printf("after if m_startTime\n"); + for (int i=0;im_zeroBuffer[i]) { + data[i]-=m_zeroBuffer[i]; + } + else { + data[i]=0; + } + } + if (CProtocol::isCal(m_previousStatus)) { // the sample is a calibration diode on + computeSample(m_cal,sampleTime,data,true); + } + if (CProtocol::isTpi(m_previousStatus)) { // the sample is a normal tpi measure + computeSample(m_tpi,sampleTime,data,false); + } + } + } + else { + clearIntegration(m_tpi); + clearIntegration(m_cal); + ACS_LOG(LM_FULL_INFO,"CCSenderThread::processData()",(LM_INFO,"STREAM_STARTED")); + } + m_previousStatus=status; // the current status refers to the next sample + m_previousCounter=counter; + } + if (bufferCounter>0) { + m_tempBufferPointer-=bufferCounter; + memcpy(m_tempBuffer,m_tempBuffer+bufferCounter,m_tempBufferPointer); + } + */ +} + +void CSenderThread::initTransfer() +{ + clearIntegration(m_tpi); + clearIntegration(m_cal); + m_previousStatus=0; + m_previousCounter=0; +} + +void CSenderThread::clearIntegration(TSampleRecord& samp) +{ + samp.started=false; + for (int i=0;igetSender()->sendData(FLOW_NUMBER,(const char *)&buffer, + // sizeof(Backends::TDumpHeader)+buffer.hd.dumpSize); + //m_sender->getSender()->sendData(FLOW_NUMBER,(const char *)&hd,sizeof(Backends::TDumpHeader)); + //m_sender->getSender()->sendData(FLOW_NUMBER,(const char *)sample,hd.dumpSize); + //if (!m_stop) { + if (m_go) { + printf("m_go\n"); + m_sender->getSender()->sendData(FLOW_NUMBER,&buffer); + m_sending=true; + } + else { + } + //m_sender->getSender()->sendData(FLOW_NUMBER,(const char *)sample,hd.dumpSize); + } + catch (AVSendFrameErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"CSenderThread::computeSample()"); + impl.setDetails("raw data could not be sent"); + //impl.log(); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CSenderThread::computeSample()"); + //throw impl.getComponentErrorsEx(); + _IRA_LOGFILTER_LOG_EXCEPTION(impl,LM_ERROR); + } + #else + if (m_go) { + printf("Time: %d-%d, %02d:%02d:%02d.%d Size: %d Cal: %d\n ",samp.start.year(),samp.start.dayOfYear(),samp.start.hour(), + samp.start.minute(),samp.start.second(),samp.start.microSecond(),hd.dumpSize,hd.calOn); + for (int y=0;y +#include +#include +#include "Common.h" +#include "DevIOAttenuation.h" +#include "DevIOBandWidth.h" +#include "DevIOTime.h" +#include "DevIOFrequency.h" +#include "DevIOPolarization.h" +#include "DevIOInputsNumber.h" +#include "DevIOSampleRate.h" +#include "DevIOBins.h" +#include "DevIOIntegration.h" +#include "DevIOStatus.h" +#include "DevIOBusy.h" +#include "DevIOFeed.h" +#include "DevIOTsys.h" +#include "DevIOInputSection.h" +#include "DevIOSectionsNumber.h" +#include "SenderThread.h" + +static char *rcsId="@(#) $Id: SkarabImpl.cpp,v 1.1 2011-03-14 14:15:07 c.migoni Exp $"; +static void *use_rcsId = ((void)&use_rcsId,(void *) &rcsId); + +using namespace SimpleParser; + +_IRA_LOGFILTER_DECLARE; + +SkarabImpl::SkarabImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices) : + BulkDataSenderDefaultImpl(CompName,containerServices), + m_ptime(this), + m_pbackendName(this), + m_pbandWidth(this), + m_pfrequency(this), + m_psampleRate(this), + m_pattenuation(this), + m_ppolarization(this), + m_pbins(this), + m_pinputsNumber(this), + m_pintegration(this), + m_pstatus(this), + m_pbusy(this), + m_pfeed(this), + m_ptsys(this), + m_psectionsNumber(this), + m_pinputSection(this) +{ + AUTO_TRACE("SkarabImpl::SkarabImpl"); + m_initialized=false; + m_senderThread=NULL; + m_controlThread=NULL; +} + +SkarabImpl::~SkarabImpl() +{ + AUTO_TRACE("SkarabImpl::~SkarabImpl()"); + // if the initialization failed...clear everything as well. + // otherwise it is called by the cleanUp procedure. + if (!m_initialized) deleteAll(); +} + +void SkarabImpl::initialize() throw (ACSErr::ACSbaseExImpl) +{ + CError Err; + CSenderThread::TSenderParameter threadPar; + CCommandLine* line; + //IRA::CString hostName,hostAddress; + AUTO_TRACE("SkarabImpl::initialize()"); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZING")); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"READING_CONFIGURATION")); + // could throw an ComponentErrors::CDBAccessExImpl exception + m_configuration.init(getContainerServices()); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"CONFIGURATION_OK")); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"INITIALIIZING_COMMUNICATION_LINES")); + _IRA_LOGFILTER_ACTIVATE(m_configuration.getRepetitionCacheTime(),m_configuration.getRepetitionExpireTime()); + try { + line=new CCommandLine(getContainerServices()); + m_commandLine=new CSecureArea(line); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); + throw dummy; + } + try { + m_ptime=new ROuLongLong(getContainerServices()->getName()+":time",getComponent(), + new DevIOTime(m_commandLine),true); + m_pbackendName=new ROstring(getContainerServices()->getName()+":backendName",getComponent()); + m_pbandWidth=new ROdoubleSeq(getContainerServices()->getName()+":bandWidth",getComponent(), + new DevIOBandWidth(m_commandLine),true); + m_pfrequency=new ROdoubleSeq(getContainerServices()->getName()+":frequency",getComponent(), + new DevIOFrequency(m_commandLine),true); + m_psampleRate=new ROdoubleSeq(getContainerServices()->getName()+":sampleRate",getComponent(), + new DevIOSampleRate(m_commandLine),true); + m_pattenuation=new ROdoubleSeq(getContainerServices()->getName()+":attenuation",getComponent(), + new DevIOAttenuation(m_commandLine),true); + m_ppolarization=new ROlongSeq(getContainerServices()->getName()+":polarization",getComponent(), + new DevIOPolarization(m_commandLine),true); + m_pinputsNumber=new ROlong(getContainerServices()->getName()+":inputsNumber",getComponent(), + new DevIOInputsNumber(m_commandLine),true); + m_pbins=new ROlongSeq(getContainerServices()->getName()+":bins",getComponent(), + new DevIOBins(m_commandLine),true); + m_pintegration=new ROlong(getContainerServices()->getName()+":integration",getComponent(), + new DevIOIntegration(m_commandLine),false); + m_pstatus=new ROpattern(getContainerServices()->getName()+":status",getComponent(), + new DevIOStatus(m_commandLine),true); + m_pbusy=new ROEnumImpl + (getContainerServices()->getName()+":busy",getComponent(), new DevIOBusy(m_commandLine),true); + m_pfeed=new ROlongSeq(getContainerServices()->getName()+":feed",getComponent(),new DevIOFeed(m_commandLine),true); + m_ptsys=new ROdoubleSeq(getContainerServices()->getName()+":systemTemperature",getComponent(),new DevIOTsys(m_commandLine),true); + m_psectionsNumber=new ROlong(getContainerServices()->getName()+":sectionsNumber",getComponent(), + new DevIOSectionsNumber(m_commandLine),true); + m_pinputSection=new ROlongSeq(getContainerServices()->getName()+":inputSection",getComponent(),new DevIOInputSection(m_commandLine),true); + m_parser=new CParser(line,10); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); + throw dummy; + } + // command parser configuration + m_parser->add("integration",new function1 >(line,&CCommandLine::setIntegration),1); + m_parser->add("calSwitch",new function1 >(line,&CCommandLine::activateCalSwitching),1 ); + m_parser->add("setSection", new function7,I,I,I,I >,I,I > + (line,&CCommandLine::setConfiguration),7 ); + m_parser->add("setAttenuation", new function2,I >(line,&CCommandLine::setAttenuation),2 ); + m_parser->add("enable",new function1 >(line,&CCommandLine::setEnabled),1 ); + m_parser->add("getIntegration",new function1 >(line,&CCommandLine::getIntegration),0 ); + m_parser->add("getFrequency",new function1 >(line,&CCommandLine::getFrequency),0 ); + m_parser->add("getSampleRate",new function1 >(line,&CCommandLine::getSampleRate),0 ); + m_parser->add("getBins",new function1 >(line,&CCommandLine::getBins),0 ); + m_parser->add("getPolarization",new function1 >(line,&CCommandLine::getPolarization),0 ); + m_parser->add("getBandWidth",new function1 >(line,&CCommandLine::getBandWidth),0 ); + m_parser->add("getAttenuation",new function1 >(line,&CCommandLine::getAttenuation),0 ); + m_parser->add("getTpi",new function1 >(line,&CCommandLine::getTpi),0 ); + m_parser->add("getZero",new function1 >(line,&CCommandLine::getZero),0 ); + m_parser->add("getTime",new function1 >(line,&CCommandLine::getTime),0 ); + m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); + m_parser->add("getRms",new function1 >(line,&CCommandLine::getRms),0 ); + + threadPar.sender=this; + threadPar.command=m_commandLine; + threadPar.configuration=&m_configuration; + //threadPar.dataLine=&m_dataLine; + try { + CSenderThread::TSenderParameter *temp=&threadPar; + m_senderThread=getContainerServices()->getThreadManager()->create ( + "DATAPUSHER",temp,m_configuration.getSenderResponseTime()*10,m_configuration.getSenderSleepTime()*10); + m_controlThread=getContainerServices()->getThreadManager()->create * > ( + "SUPERVISOR",m_commandLine,m_configuration.getControlResponseTime()*10,m_configuration.getControlSleepTime()*10); + } + catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SkarabImpl::initialize()"); + throw _dummy; + } + catch (...) { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SkarabImpl::initialize()"); + } + m_initialized=true; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZED")); +} + +void SkarabImpl::execute() throw (ACSErr::ACSbaseExImpl) +{ + AUTO_TRACE("SkarabImpl::execute()"); + ACS::Time time; + IRA::CError error; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"BACKEND_INITIAL_CONFIGURATION")); + try { + //sets the property defaults....some of them cannot be changed any more (hardware dependent) + m_pbackendName->getDevIO()->write(getComponent()->getName(),time); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::InitializationProblemExImpl,impl,ex,"SkarabImpl::execute()"); + throw impl; + } + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"SOCKET_CONNECTING")); + try { + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"HARDWARE_INITIALIZATION")); + line->Init(&m_configuration); // this could throw an ACS exception..... + //line->setTime(); // this could throw ACS exceptions.... + } + catch (ACSErr::ACSbaseExImpl& ex) { + deleteAll(); + throw ex; + } + //resume the threads + //m_senderThread->resume(); + //m_controlThread->resume(); + try { + startPropertiesMonitoring(); + } + catch (acsthreadErrType::CanNotStartThreadExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); + deleteAll(); + throw __dummy; + } + catch (ACSErrTypeCommon::NullPointerExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); + deleteAll(); + throw __dummy; + } + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"COMPSTATE_OPERATIONAL")); +} + +void SkarabImpl::deleteAll() +{ + IRA::CError err; + if (m_initialized) { + if (m_senderThread!=NULL) { + m_senderThread->suspend(); + } + if (m_controlThread!=NULL) { + m_controlThread->suspend(); + } + if (m_commandLine) { + delete m_commandLine; + m_commandLine=NULL; + } + if (m_senderThread!=NULL) { + getContainerServices()->getThreadManager()->destroy(m_senderThread); + m_senderThread=NULL; + } + if (m_controlThread!=NULL) { + getContainerServices()->getThreadManager()->destroy(m_controlThread); + m_senderThread=NULL; + } + if (m_parser) { + delete m_parser; + m_parser=NULL; + } + // need to be closed before the thread that makes use of it + // m_dataLine.Close(err); + // ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"DATA_LINE_CLOSED")); + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"LOGS_FLUSHED")); + m_initialized=false; + } +} + +void SkarabImpl::cleanUp() +{ + AUTO_TRACE("SkarabImpl::cleanUp()"); + stopPropertiesMonitoring(); + deleteAll(); + CharacteristicComponentImpl::cleanUp(); +} + +void SkarabImpl::aboutToAbort() +{ + AUTO_TRACE("SkarabImpl::aboutToAbort()"); + deleteAll(); +} + +void SkarabImpl::sendHeader() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) +{ + AUTO_TRACE("SkarabImpl::sendHeader()"); + Backends::TMainHeader header; + Backends::TSectionHeader chHeader[MAX_SECTION_NUMBER]; + //DWORD tpi[MAX_SECTION_NUMBER]; + CSecAreaResourceWrapper line=m_commandLine->Get(); + line->fillMainHeader(header); + line->fillChannelHeader(chHeader,MAX_SECTION_NUMBER); + /*try { + line->setTime(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + */ + + char buffer[sizeof(Backends::TMainHeader)+header.sections*sizeof(Backends::TSectionHeader)]; + + memcpy(buffer,(void *)&header,sizeof(Backends::TMainHeader)); + memcpy(buffer+sizeof(Backends::TMainHeader),(void *)chHeader,header.sections*sizeof(Backends::TSectionHeader)); + + #ifndef BKD_DEBUG + try { + getSender()->startSend(FLOW_NUMBER,(const char*)buffer, + sizeof(Backends::TMainHeader)+header.sections*sizeof(Backends::TSectionHeader)); + } + catch (AVStartSendErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendHeader()"); + impl.setDetails("main header could not be sent"); + impl.log(LM_DEBUG); + throw impl.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendHeader()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } + #else + /*printf("Sects: %d beams: %d integration: %d sampleSize: %d\n",header.sections,header.beams, + header.integration,header.sampleSize); + for(int h=0;hsaveDataHeader(&header,chHeader); + // measure the zero tpi + #ifndef BKD_DEBUG + /*try { + //line->getZeroTPI(tpi); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + }*/ + #else + //for(int i=0;isaveZero(tpi); + // start the job for the backend..... + try { + line->startDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::terminate() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) +{ + AUTO_TRACE("SkarabImpl::terminate()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->stopDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::terminate()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::sendData(ACS::Time startTime) throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) +{ + + AUTO_TRACE("SkarabImpl::sendData()"); + + TIMEVALUE now; + ACS::Time expectedStartTime; + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + expectedStartTime=line->resumeDataAcquisition(startTime); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendData()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + // if the resume succeeds....than set the start time accordingly. + //I explicitly release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock + line.Release(); + m_senderThread->saveStartTime(expectedStartTime); + //m_senderThread->resumeTransfer(); +} + +void SkarabImpl::sendStop() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) +{ + + AUTO_TRACE("SkarabImpl::sendStop()"); + + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->suspendDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + //I explicity release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock + //line.Release(); + //m_senderThread->suspendTransfer(); + + try { + getSender()->stopSend(FLOW_NUMBER); + } + catch (AVStopSendErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendStop()"); + impl.setDetails("stop message could not be sent"); + throw impl.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendStop()"); + throw impl.getComponentErrorsEx(); + } + + try { + line->sendTargetFileName(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::setSection(CORBA::Long input,CORBA::Double freq,CORBA::Double bw,CORBA::Long feed,CORBA::Long pol,CORBA::Double sr,CORBA::Long bins) throw ( + CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setSection()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setConfiguration(input,freq,bw,feed,pol,sr,bins); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setSection()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::setTargetFileName (const char * fileName) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setTargetFileName()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + + line->setTargetFileName(fileName); +} + +ACS::doubleSeq *SkarabImpl::getRms() throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::getRms()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var rms=new ACS::doubleSeq; + try { + line->getRms(rms); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getRms()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return rms._retn(); +} + +ACS::doubleSeq *SkarabImpl::getTpi() throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::getTpi()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var tpi=new ACS::doubleSeq; + try { + line->getSample(tpi,false); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getTpi()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return tpi._retn(); +} + +ACS::doubleSeq * SkarabImpl::getZero () throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::getZero()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var tpi=new ACS::doubleSeq; + //TODO: how many sections???? + //tpi->length(2); + try { + line->getSample(tpi,true); + //tpi[0]=0.0; + //tpi[1]=0.0; + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getZero()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return tpi._retn(); +} + +void SkarabImpl::setKelvinCountsRatio(const ACS::doubleSeq& ratio, const ACS::doubleSeq& tsys) throw (CORBA::SystemException) +{ + AUTO_TRACE("SkarabImpl::setKelvinCountsRatio()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + line->saveTsys(tsys,ratio); + //if (m_senderThread) { + //m_senderThread->setKelvinCountsRatio(ratio); + //ACS_LOG(LM_FULL_INFO,"SkarabImpl::setKelvinCountsRatio()",(LM_INFO,"KELVIN_COUNTS_CONVERSION_FACTOR_SET")); + //} +} + +void SkarabImpl::enableChannels(const ACS::longSeq& enable) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::enableChannels()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setEnabled(enable); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::enableChannels()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::setTime() throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setTime()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setTime(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTime()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::setAttenuation(CORBA::Long input,CORBA::Double att) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setAttenutation()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setAttenuation(input,att); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setAttenutation()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +CORBA::Long SkarabImpl::getInputs(ACS::doubleSeq_out freq,ACS::doubleSeq_out bandWidth,ACS::longSeq_out feed,ACS::longSeq_out ifNumber) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + long inputs; + ACS::longSeq pol; + AUTO_TRACE("SkarabImpl::getInputs()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + //no need to take care of freeing allocated memory in case of exception because there are no except........ + freq=new ACS::doubleSeq; + bandWidth=new ACS::doubleSeq; + feed=new ACS::longSeq; + ifNumber=new ACS::longSeq; + line->getFeed(*feed); + line->getFrequency(*freq); + line->getInputsNumber(inputs); + line->getBandWidth(*bandWidth); + line->getIFs(*ifNumber); + return inputs; +} + + +void SkarabImpl::activateNoiseCalibrationSwitching(CORBA::Long interleave) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::activateNoiseCalibrationSwitching()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->activateCalSwitching(interleave); // NOT YET AVAILABLE + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::activateNoiseCalibrationSwitching()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::initialize(const char * configuration) throw (CORBA::SystemException, + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::initialize()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setup(configuration); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::initialize()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::setIntegration(CORBA::Long Integration) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setIntegration()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setIntegration(Integration); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setIntegration()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException) +{ + AUTO_TRACE("SkarabImpl::getIntegration()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->getConfiguration(configuration); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getConfiguration()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException) +{ + AUTO_TRACE("SkarabImpl::getCommProtVersion()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->getCommProtVersion(version); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getCommProtVersion()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +CORBA::Boolean SkarabImpl::command(const char *cmd,CORBA::String_out answer) throw (CORBA::SystemException) +{ + AUTO_TRACE("SkarabImpl::command()"); + IRA::CString out; + bool res; + // this is a cheat....it forces the acquisition of the mutex before the parser. It works only because the parser has no async behaviour configured + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + m_parser->run(cmd,out); + res=true; + } + catch (ParserErrors::ParserErrorsExImpl &ex) { + res=false; + } + catch (ACSErr::ACSbaseExImpl& ex) { + ex.log(LM_ERROR); // the errors resulting from the execution are logged here as stated in the documentation of CommandInterpreter interface, while the parser errors are never logged. + res=false; + } + answer=CORBA::string_dup((const char *)out); + return res; +} + +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROuLongLong,m_ptime,time); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROstring,m_pbackendName,backendName); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROdoubleSeq,m_pbandWidth,bandWidth); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROdoubleSeq,m_pfrequency,frequency); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROdoubleSeq,m_psampleRate,sampleRate); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROdoubleSeq,m_pattenuation,attenuation); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlongSeq,m_ppolarization,polarization); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlongSeq,m_pbins,bins); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlong,m_pinputsNumber,inputsNumber); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlong,m_pintegration,integration); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROpattern,m_pstatus,status); +_PROPERTY_REFERENCE_CPP(SkarabImpl,Management::ROTBoolean,m_pbusy,busy); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlongSeq,m_pfeed,feed); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROdoubleSeq,m_ptsys,systemTemperature); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlong,m_psectionsNumber,sectionsNumber); +_PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROlongSeq,m_pinputSection,inputSection); + +/* --------------- [ MACI DLL support functions ] -----------------*/ +#include +MACI_DLL_SUPPORT_FUNCTIONS(SkarabImpl) diff --git a/Common/Servers/Skarab/src/_send_backend_command b/Common/Servers/Skarab/src/_send_backend_command new file mode 100755 index 000000000..0a791b013 --- /dev/null +++ b/Common/Servers/Skarab/src/_send_backend_command @@ -0,0 +1,37 @@ +#!/bin/bash + +#initialize default values +COMMAND=convert-data #this is for convenience +SERVER=192.168.200.216 #roach backend at SRT +PORT=10000 + +#parsing command line arguments +while getopts "c:s:p:h" opt; do + case "$opt" in + s) + SERVER=$OPTARG + ;; + p) + PORT=$OPTARG + ;; + c) + COMMAND=$OPTARG + ;; + h) + echo "Usage: + _send_backend_command [-c command] [-s SERVER.IP] [-p PORT] [-h] + + defaults: COMMAND convert-data + SERVER 192.168.200.216 + PORT 10000 + + A list of protocol commands and a description of the protocol can be found at: + http://discos.readthedocs.org/en/latest/developer/protocols/backends.html" + exit 0 + ;; + esac +done + +#executing +{ echo "?$COMMAND"; sleep 1; echo ""; echo "quit"; } | telnet $SERVER $PORT >/dev/null + diff --git a/Medicina/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml b/Medicina/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..80b544670 --- /dev/null +++ b/Medicina/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,17 @@ + + + diff --git a/Medicina/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml b/Medicina/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml new file mode 100644 index 000000000..2b6f79973 --- /dev/null +++ b/Medicina/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/Medicina/CDB/alma/BACKENDS/Skarab/Skarab.xml b/Medicina/CDB/alma/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..e7d02a72c --- /dev/null +++ b/Medicina/CDB/alma/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,45 @@ + + + + diff --git a/Medicina/CDB/alma/DataBlock/Skarab/Skarab.xml b/Medicina/CDB/alma/DataBlock/Skarab/Skarab.xml new file mode 100644 index 000000000..ab460fb64 --- /dev/null +++ b/Medicina/CDB/alma/DataBlock/Skarab/Skarab.xml @@ -0,0 +1,158 @@ + + + + + + SKARAB_1 + 2 + TRUE + GREGORIAN + 1 + 1400.0 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 2048 + + + + SKARAB_1S + 2 + TRUE + GREGORIAN + 1 + 1400.0 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 2048 + + + + SKARAB_2 + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 32768 + + + + SKARAB_2S + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 32768 + + + + SKARAB_3 + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 65536 + + + + SKARAB_3S + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 65536 + + + + SKARAB_4 + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 32768 + + + + SKARAB_4S + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 32768 + + + + SKARAB_5 + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 65536 + + + + SKARAB_5S + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 65536 + + + -- GitLab From f1b99657214596e86ab5c109b52087f739fdd5e8 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 29 Nov 2023 09:41:04 +0100 Subject: [PATCH 045/150] Fix #814, updated C-low receiver CDB configuration (#818) --- .../DataBlock/PointingModel/PointingModel.xml | 34 +++++++++++++++++++ .../NormalModeSetup/NormalModeSetup.xml | 2 +- .../alma/DataBlock/TotalPower/TotalPower.xml | 14 ++++++++ .../StationProcedures/StationProcedures.xml | 5 +++ .../CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml | 2 +- .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 6 ++-- 6 files changed, 58 insertions(+), 5 deletions(-) diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index c1aaaf5e5..b1cf45978 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -139,5 +139,39 @@ 0 0.0000000000 0 0.0000000000 + + CCG + 90.0 + 1 -2.2881932258 + 0 0.0 + 1 -0.0040601296 + 1 0.0014384996 + 1 -0.0003379379 + 1 -0.0015144897 + 1 0.2964673936 + 1 -0.1382924467 + 0 0.0 + 0 0.0 + 1 -0.0023407035 + 0 0 + 1 0.0002931280 + 1 -0.0004088043 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml index 44e1e2e0a..195fc2d65 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml @@ -21,5 +21,5 @@ DefaultLO="4100.0 4100.0" FixedLO2="4100.0 4100.0" LOMin="4100.0 4100.0" - LOMax="4100.0 4100.0" + LOMax="5400.0 5400.0" /> diff --git a/SRT/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml b/SRT/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml index 8966b1ad5..20bc44029 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml @@ -61,6 +61,20 @@ 0 1 + + CCG + 2 + TRUE + PRIMARY + 10 + 730 + 1 + 0 1 + L R + 0 0 + 0 1 + + PPP 2 diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index b6d47acd7..39b02cfa4 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -20,8 +20,13 @@ receiversSetup=CCG + antennaSetup=CCG chooseBackend=TotalPower + initialize=CCG + device=0 calOff + restFrequency=0 + azelOffsets=0d,0d diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml b/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml index 4c3814682..64089db15 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml @@ -2,7 +2,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - IP="192.168.200.128" PORT="5025"> + IP="192.168.200.118" PORT="5025"> diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index 939faecf2..9fa31b2ee 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -8,16 +8,16 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DewarIPAddress="192.168.60.51" + DewarIPAddress="192.168.200.188" DewarPort="5002" - LNAIPAddress="192.168.60.50" + LNAIPAddress="192.168.200.189" LNAPort="5002" WatchDogResponseTime="400000" WatchDogSleepTime="500000" LNASamplingTime="250000" RepetitionCacheTime="7000000" RepetitionExpireTime="10000000" - LocalOscillatorInstance="RECEIVERS/LO_CBAND" + LocalOscillatorInstance="RECEIVERS/LO_KBAND" > -- GitLab From c5e191b5c4c1a9424ec80882ad10fdf8f3857e98 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 1 Jan 2024 22:46:53 +0000 Subject: [PATCH 046/150] Fixed missing declaration --- .../SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h index 2019c0f1b..8f02a34c8 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h @@ -169,6 +169,8 @@ public: void setProfile (const ActiveSurface::TASProfile& profile) throw (ComponentErrors::ComponentErrorsExImpl); + void asSetLUT(const char* newlut); + private: std::map m_error_strings; ContainerServices* m_services; -- GitLab From d14a3a8b08815da719307d3cfec217500c895522 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 2 Jan 2024 00:21:34 +0000 Subject: [PATCH 047/150] Some updates --- .../include/MinorServoBossTextClient.h | 4 +- .../MinorServoBossTextClient/src/Makefile | 3 + .../src/MinorServoBossTextClient.cpp | 2 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 5 +- .../MACI/Components/MINORSERVO/PFP/PFP.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/GFR.xml | 14 - .../GFR/LookupTables/LookupTables.xml | 44 +- .../MinorServo/GFR/Properties/Properties.xml | 4 +- .../M3R/LookupTables/LookupTables.xml | 23 +- .../MinorServo/M3R/Properties/Properties.xml | 4 +- .../PFP/LookupTables/LookupTables.xml | 33 ++ .../MinorServo/PFP/Properties/Properties.xml | 10 +- .../SRP/LookupTables/LookupTables.xml | 203 ++++--- .../MinorServo/SRP/Properties/Properties.xml | 12 +- SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- SRT/CDB/alma/MINORSERVO/Boss/Boss.xml | 15 +- SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 9 +- SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 9 +- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 9 +- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 9 +- .../SRTMinorServoInterface/idl/.gitignore | 1 + .../idl/SRTMinorServo.idl | 48 +- .../idl/SRTMinorServoBoss.idl | 52 +- .../idl/SRTMinorServoCommon.idl | 131 ----- .../idl/SRTMinorServoCommon.midl | 19 +- .../SRTMinorServoInterface/src/Makefile | 7 +- .../app-defaults/simulationStartup.xml | 11 +- .../config/CDB/schemas/SRTMinorServo.xsd | 17 +- .../config/CDB/schemas/SRTMinorServoBoss.xsd | 30 +- .../CDB/schemas/SRTMinorServoLookupTable.xsd | 34 +- .../CDB/schemas/SRTMinorServoProperties.xsd | 2 +- SRT/Servers/SRTMinorServo/include/Common.h | 73 +++ SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 314 ++++++++--- .../include/SRTMinorServoBossCore.h | 67 ++- .../include/SRTMinorServoBossImpl.h | 79 ++- .../SRTMinorServo/include/SRTMinorServoImpl.h | 137 +++-- .../include/SRTMinorServoParkThread.h | 10 +- .../include/SRTMinorServoSetupThread.h | 12 +- .../include/SRTMinorServoSocket.h | 2 +- .../include/SRTMinorServoStatusThread.h | 2 +- .../include/SRTMinorServoTrackingThread.h | 78 +++ SRT/Servers/SRTMinorServo/src/Makefile | 10 +- .../src/SRTBaseMinorServoImpl.cpp | 415 +++++++++++--- .../src/SRTMinorServoBossCore.cpp | 526 +++++++++++++++--- .../src/SRTMinorServoBossImpl.cpp | 317 ++++++++++- .../src/SRTMinorServoParkThread.cpp | 79 ++- .../src/SRTMinorServoSetupThread.cpp | 154 ++--- .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 60 +- .../src/SRTMinorServoStatusThread.cpp | 2 +- .../src/SRTMinorServoTrackingThread.cpp | 159 ++++++ .../src/SRTProgramTrackMinorServoImpl.cpp | 12 +- 51 files changed, 2385 insertions(+), 893 deletions(-) delete mode 100644 SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore delete mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl create mode 100644 SRT/Servers/SRTMinorServo/include/Common.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp diff --git a/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h index 97cdc5198..3656b750c 100644 --- a/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h +++ b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h @@ -78,10 +78,12 @@ /* define name and component interface */ /* ********************************** */ #define COMPONENT_NAME "MINORSERVO/Boss" /* the name of the instantiation of the component */ -#define COMPONENT_INTERFACE_TPYE "IDL:alma/MinorServo/MinorServoBoss:1.0" /* the type of the interface */ #define COMPONENT_IDL_MODULE MinorServo /* the IDL module that contains the component interface */ #define COMPONENT_IDL_INTERFACE MinorServoBoss /* the IDL interface of the component */ #define COMPONENT_SMARTPOINTER MinorServoBoss_var /* the component type */ +#ifndef COMPONENT_INTERFACE_TPYE + #define COMPONENT_INTERFACE_TPYE "IDL:alma/MinorServo/MinorServoBoss:1.0" +#endif /* ********************************** */ /* define user input command style */ diff --git a/Common/Clients/MinorServoBossTextClient/src/Makefile b/Common/Clients/MinorServoBossTextClient/src/Makefile index 39d35e743..246fd626e 100644 --- a/Common/Clients/MinorServoBossTextClient/src/Makefile +++ b/Common/Clients/MinorServoBossTextClient/src/Makefile @@ -69,6 +69,9 @@ _tui_MinorServoBossTextClient_LIBS = MinorServoBossStubs IRALibrary Managme TextWindowLibrary ClientErrors ComponentErrors ManagementErrors MinorServoErrors AntennaDefinitionsStubs \ MinorServoDefinitionsStubs +ifeq ($(STATION),SRT) + MinorServoBossTextClient_CFLAGS = -DCOMPONENT_INTERFACE_TPYE="\"IDL:alma/MinorServo/SRTMinorServoBoss:1.0\"" +endif SCRIPTS = minorservoBossTui diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp index 9f490e5ba..c90158e95 100644 --- a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -289,7 +289,7 @@ int main(int argc, char *argv[]) { status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); - _TW_SET_COMPONENT(motionInfo_field,18,3,23,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(motionInfo_field,18,3,30,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); /* ****************************************************************** */ _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); diff --git a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 8a01ba209..94efe94c9 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="M3R" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" Default="true" - /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index d75a83d75..a5801b66d 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -6,9 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="PFP" - Code="WPServoImpl" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" Default="true" diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml deleted file mode 100644 index 6e6b16d10..000000000 --- a/SRT/CDB/MACI/Components/MINORSERVO/SRP/GFR.xml +++ /dev/null @@ -1,14 +0,0 @@ - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml index 715f7031c..d0275a194 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -10,33 +10,23 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - - ROTATION + ROTATION -88.70659 + ROTATION -88.70659 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION -51.821170 + ROTATION -51.821170 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml index 0c087d882..c6ae42675 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -10,8 +10,8 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - CLOCKWISE_ENABLED - COUNTERCLOCKWISE_ENABLED + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED CLOCKWISE COUNTERCLOCKWISE diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml index ce0cb0857..fccec0b0f 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -10,24 +10,9 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 - - ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml index 0c087d882..c6ae42675 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -10,8 +10,8 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - CLOCKWISE_ENABLED - COUNTERCLOCKWISE_ENABLED + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED CLOCKWISE COUNTERCLOCKWISE diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..086b3785b --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml @@ -0,0 +1,33 @@ + + + + + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml index 0dd96f036..b720bbf40 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -10,11 +10,11 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - X_ENABLED - Z_MASTER_ENABLED - Z_SLAVE_ENABLED - THETA_MASTER_ENABLED - THETA_SLAVE_ENABLED + X_ENABLED + Z_MASTER_ENABLED + Z_SLAVE_ENABLED + THETA_MASTER_ENABLED + THETA_SLAVE_ENABLED ELONG_X ELONG_Z_MASTER diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml index 3c2c8cfcb..6869a5c77 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -10,97 +10,116 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - - TX -1.5 - TY 28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ 9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX -0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY -0.03611111111111111 - RZ 0 - - - TX -1.5 - TY 28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ 9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX -0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY -0.03611111111111111 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - TX 0 - - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 - - TX 0 - TY 0 - TZ 0 - RX 0 - RY 0 - RZ 0 + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml index 896b0e8c4..963812767 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -10,12 +10,12 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - Z1_ENABLED - Z2_ENABLED - Z3_ENABLED - Y1_ENABLED - Y2_ENABLED - X1_ENABLED + Z1_ENABLED + Z2_ENABLED + Z3_ENABLED + Y1_ENABLED + Y2_ENABLED + X1_ENABLED ELONG_Z1 ELONG_Z2 diff --git a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 4c835f64c..d11bb9411 100644 --- a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -23,7 +23,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" ActiveSurfaceBossInterface="IDL:alma/ActiveSurface/SRTActiveSurfaceBoss:1.0" CustomLoggerInterface="IDL:alma/Management/CustomLogger:1.0" WeatherStationInstance="IDL:alma/Weather/GenericWeatherStation:1.0" diff --git a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml index 4d647f16c..fe264a507 100644 --- a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -9,7 +9,20 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - status_thread_period="0.05"> + status_thread_period="0.05" + active_surface_configuration="ON" + elevation_tracking_enabled="ON"> + + + + + + + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index c7bd27cbb..e542e0eb7 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -14,9 +14,14 @@ - + + - + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index c7bd27cbb..e542e0eb7 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -14,9 +14,14 @@ - + + - + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index fd8362d3f..72c2ede30 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -14,9 +14,14 @@ - + + - + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index 5dea1dfd2..a70473464 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -14,9 +14,14 @@ - + + - + + + + + diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore b/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore new file mode 100644 index 000000000..981c93f21 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore @@ -0,0 +1 @@ +SRTMinorServoCommon.idl diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 29972eb8e..3d91e7e34 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -9,7 +9,6 @@ #ifndef __SRTMINORSERVO_IDL__ #define __SRTMINORSERVO_IDL__ -#include #include "SRTMinorServoCommon.idl" #pragma prefix "alma" @@ -18,33 +17,36 @@ module MinorServo { interface SRTBaseMinorServo : ACS::CharacteristicComponent { - readonly attribute ACS::ROboolean enabled; - + readonly attribute Management::ROTBoolean enabled; readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; - - readonly attribute ACS::ROboolean block; - + readonly attribute Management::ROTBoolean block; readonly attribute ROSRTMinorServoOperativeMode operative_mode; - - readonly attribute ACS::RObooleanSeq axes_enabled; - + readonly attribute ACS::RObooleanSeq physical_axes_enabled; readonly attribute ACS::ROdoubleSeq physical_positions; - + readonly attribute ACS::ROlong virtual_axes; readonly attribute ACS::ROdoubleSeq virtual_positions; - readonly attribute ACS::ROdoubleSeq virtual_offsets; + readonly attribute ACS::ROdoubleSeq virtual_user_offsets; + readonly attribute ACS::ROdoubleSeq virtual_system_offsets; + readonly attribute Management::ROTBoolean in_use; + readonly attribute ACS::ROstring current_setup; + + void status() raises (ComponentErrors::ComponentErrorsEx); + void stow(in long stow_position) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void stop() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void preset(in ACS::doubleSeq coordinates) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void offset(in ACS::doubleSeq offsets) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + ACS::doubleSeq getUserOffsets(); + void setUserOffset(in string axis_name, in double offset) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void clearUserOffsets() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + ACS::doubleSeq getSystemOffsets(); + void setSystemOffset(in string axis_name, in double offset) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void clearSystemOffsets() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + + void setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + void getAxesInfo(out ACS::stringSeq axes_names, out ACS::stringSeq axes_units) raises (ComponentErrors::ComponentErrorsEx); + ACS::doubleSeq calcCoordinates(in double elevation); - void status(); - - void stow(in long stow_position); - - void stop(); - - void preset(in ACS::doubleSeq coordinates); - - void offset(in ACS::doubleSeq offsets); - - void setup(in string configuration); }; interface SRTGenericMinorServo : SRTBaseMinorServo @@ -53,7 +55,7 @@ module MinorServo interface SRTProgramTrackMinorServo : SRTBaseMinorServo { - void programTrack(in long trajectory_id, in long point_id, in double start_time, in ACS::doubleSeq coordinates); + void programTrack(in long trajectory_id, in long point_id, in double start_time, in ACS::doubleSeq coordinates) raises (ComponentErrors::ComponentErrorsEx); }; }; diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl index 0eeb13b74..7bb3d8efc 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -8,66 +8,26 @@ #ifndef __SRTMINORSERVOBOSS_IDL__ #define __SRTMINORSERVOBOSS_IDL__ -#include -#include -#include -#include -#include "MinorServoDefinitions.idl" +#include #include "SRTMinorServoCommon.idl" #pragma prefix "alma" module MinorServo { - interface SRTMinorServoBoss: ACS::CharacteristicComponent + interface SRTMinorServoBoss: MinorServoBoss { readonly attribute ROSRTMinorServoFocalConfiguration current_configuration; - readonly attribute ACS::ROboolean simulation_enabled; + readonly attribute Management::ROTBoolean simulation_enabled; readonly attribute ACS::ROdouble plc_time; readonly attribute ACS::ROstring plc_version; readonly attribute ROSRTMinorServoControlStatus control; - readonly attribute ACS::ROboolean power; - readonly attribute ACS::ROboolean emergency; + readonly attribute Management::ROTBoolean power; + readonly attribute Management::ROTBoolean emergency; readonly attribute ROSRTMinorServoGregorianCoverStatus gregorian_cover; readonly attribute ACS::ROdouble last_executed_command; - void setElevationTracking(in string value) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); - void setASConfiguration(in string value) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); - - /** - * Starts the scan of one axis of the MinorServo target. - * - * @param starting_time the time the scan will start or 0 if the scan is required to start immediately - * @param scan structure containing the description of the scan to be executed - * @param antennaInfo auxiliary information from the antenna - * - */ - void startScan(inout ACS::Time starting_time, in MinorServoScan scan, in Antenna::TRunTimeParameters antennaInfo) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); - - /** - * Closes the current scan and force the minor servo system to its normal behaviour - * @param timeToStop stores the expected epoch in which the scan will be stopped (closed). It could be zero meaning the - * scan will be closed immediately - * @throw ComponentErrors::ComponentErrorsEx - * @throw ReceiversErrors::ReceiversErrorsEx - */ - void closeScan(out ACS::Time timeToStop) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); - - /** - * Checks if it is possible to execute a scan along a given axis - * - * @param starting_time the time the scan will start or 0 if the scan is required to start immediately - * @param scan structure containing the description of the scan to be executed - * @param antennaInfo auxiliary information from the antenna - * @param runTime auxiliary information computed at run time by the subsystem - */ - boolean checkScan(in ACS::Time starting_time, in MinorServoScan scan, in Antenna::TRunTimeParameters antennaInfo, out TRunTimeParameters runtime) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); - - /** - * Setup all the minor servos to the given configuration - * @param configuration a string representing the given configuration - */ - void setup(in string configuration) raises (MinorServoErrors::MinorServoErrorsEx); + void preset(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); }; }; diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl deleted file mode 100644 index 924fb3996..000000000 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.idl +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************** $Id: JacPrep,v 1.13 2010/01/04 15:34:48 gchiozzi Exp $ -* DO NOT EDIT -* Automatically generated from ../idl/SRTMinorServoCommon.midl -* on Mon Nov 27 14:03:33 2023 -*******************************************************************************/ -#ifndef _SRTMinorServoCommon_midl_ -#define _SRTMinorServoCommon_midl_ -#ifndef _ACS_PREPROCESSED_ -#define _ACS_PREPROCESSED_ -#endif -#include -#include - - - - - - - -#pragma prefix "alma" - -module MinorServo -{ - enum SRTMinorServoFocalConfiguration - { - CONFIGURATION_UNKNOWN, - CONFIGURATION_PARK, - CONFIGURATION_PRIMARY, - CONFIGURATION_GREGORIAN1, - CONFIGURATION_GREGORIAN2, - CONFIGURATION_GREGORIAN3, - CONFIGURATION_GREGORIAN4, - CONFIGURATION_GREGORIAN5, - CONFIGURATION_GREGORIAN6, - CONFIGURATION_GREGORIAN7, - CONFIGURATION_GREGORIAN8, - CONFIGURATION_BWG1, - CONFIGURATION_BWG2, - CONFIGURATION_BWG3, - CONFIGURATION_BWG4 - }; - - - typedef sequence SRTMinorServoFocalConfigurationSeq; interface CBSRTMinorServoFocalConfiguration : ACS::Callback { oneway void working(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoFocalConfiguration SRTMinorServoFocalConfigurationCB; interface AlarmSRTMinorServoFocalConfiguration : ACS::Callback { oneway void alarm_raised(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoFocalConfiguration value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoFocalConfiguration SRTMinorServoFocalConfigurationAlarm; interface PSRTMinorServoFocalConfiguration: ACS::TypelessProperty { SRTMinorServoFocalConfiguration get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoFocalConfigurationSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoFocalConfiguration default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoFocalConfigurationSeq allStates; }; - interface ROSRTMinorServoFocalConfiguration: PSRTMinorServoFocalConfiguration{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoFocalConfigurationSeq alarm_on; readonly attribute SRTMinorServoFocalConfigurationSeq alarm_off; }; - interface RWSRTMinorServoFocalConfiguration: PSRTMinorServoFocalConfiguration { ACSErr::Completion set_sync(in SRTMinorServoFocalConfiguration value); void set_async(in SRTMinorServoFocalConfiguration value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoFocalConfiguration value);}; - - - enum SRTMinorServoControlStatus - { - CONTROL_DISCOS, - CONTROL_VBRAIN - }; - - - typedef sequence SRTMinorServoControlStatusSeq; interface CBSRTMinorServoControlStatus : ACS::Callback { oneway void working(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoControlStatus SRTMinorServoControlStatusCB; interface AlarmSRTMinorServoControlStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoControlStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoControlStatus SRTMinorServoControlStatusAlarm; interface PSRTMinorServoControlStatus: ACS::TypelessProperty { SRTMinorServoControlStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoControlStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoControlStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoControlStatusSeq allStates; }; - interface ROSRTMinorServoControlStatus: PSRTMinorServoControlStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoControlStatusSeq alarm_on; readonly attribute SRTMinorServoControlStatusSeq alarm_off; }; - interface RWSRTMinorServoControlStatus: PSRTMinorServoControlStatus { ACSErr::Completion set_sync(in SRTMinorServoControlStatus value); void set_async(in SRTMinorServoControlStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoControlStatus value);}; - - - enum SRTMinorServoGregorianCoverStatus - { - COVER_STATUS_UNKNOWN, - COVER_STATUS_OPEN, - COVER_STATUS_CLOSED - }; - - - typedef sequence SRTMinorServoGregorianCoverStatusSeq; interface CBSRTMinorServoGregorianCoverStatus : ACS::Callback { oneway void working(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoGregorianCoverStatus SRTMinorServoGregorianCoverStatusCB; interface AlarmSRTMinorServoGregorianCoverStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoGregorianCoverStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoGregorianCoverStatus SRTMinorServoGregorianCoverStatusAlarm; interface PSRTMinorServoGregorianCoverStatus: ACS::TypelessProperty { SRTMinorServoGregorianCoverStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoGregorianCoverStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoGregorianCoverStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoGregorianCoverStatusSeq allStates; }; - interface ROSRTMinorServoGregorianCoverStatus: PSRTMinorServoGregorianCoverStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoGregorianCoverStatusSeq alarm_on; readonly attribute SRTMinorServoGregorianCoverStatusSeq alarm_off; }; - interface RWSRTMinorServoGregorianCoverStatus: PSRTMinorServoGregorianCoverStatus { ACSErr::Completion set_sync(in SRTMinorServoGregorianCoverStatus value); void set_async(in SRTMinorServoGregorianCoverStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoGregorianCoverStatus value);}; - - - enum SRTMinorServoCabinetStatus - { - DRIVE_CABINET_OK, - DRIVE_CABINET_WARNING, - DRIVE_CABINET_ERROR - }; - - - typedef sequence SRTMinorServoCabinetStatusSeq; interface CBSRTMinorServoCabinetStatus : ACS::Callback { oneway void working(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoCabinetStatus SRTMinorServoCabinetStatusCB; interface AlarmSRTMinorServoCabinetStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoCabinetStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoCabinetStatus SRTMinorServoCabinetStatusAlarm; interface PSRTMinorServoCabinetStatus: ACS::TypelessProperty { SRTMinorServoCabinetStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoCabinetStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoCabinetStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoCabinetStatusSeq allStates; }; - interface ROSRTMinorServoCabinetStatus: PSRTMinorServoCabinetStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoCabinetStatusSeq alarm_on; readonly attribute SRTMinorServoCabinetStatusSeq alarm_off; }; - interface RWSRTMinorServoCabinetStatus: PSRTMinorServoCabinetStatus { ACSErr::Completion set_sync(in SRTMinorServoCabinetStatus value); void set_async(in SRTMinorServoCabinetStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoCabinetStatus value);}; - - - enum SRTMinorServoOperativeMode - { - OPERATIVE_MODE_UNKNOWN, - OPERATIVE_MODE_SETUP, - OPERATIVE_MODE_STOW, - OPERATIVE_MODE_STOP, - OPERATIVE_MODE_PRESET, - OPERATIVE_MODE_PROGRAMTRACK - }; - - - typedef sequence SRTMinorServoOperativeModeSeq; interface CBSRTMinorServoOperativeMode : ACS::Callback { oneway void working(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoOperativeMode SRTMinorServoOperativeModeCB; interface AlarmSRTMinorServoOperativeMode : ACS::Callback { oneway void alarm_raised(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoOperativeMode value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoOperativeMode SRTMinorServoOperativeModeAlarm; interface PSRTMinorServoOperativeMode: ACS::TypelessProperty { SRTMinorServoOperativeMode get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoOperativeModeSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoOperativeMode default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoOperativeModeSeq allStates; }; - interface ROSRTMinorServoOperativeMode: PSRTMinorServoOperativeMode{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoOperativeModeSeq alarm_on; readonly attribute SRTMinorServoOperativeModeSeq alarm_off; }; - interface RWSRTMinorServoOperativeMode: PSRTMinorServoOperativeMode { ACSErr::Completion set_sync(in SRTMinorServoOperativeMode value); void set_async(in SRTMinorServoOperativeMode value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoOperativeMode value);}; - - - enum SRTMinorServoBossStatus - { - BOSS_STATUS_UNCONFIGURED, - BOSS_STATUS_SETUP_IN_PROGRESS, - BOSS_STATUS_PARK_IN_PROGRESS, - BOSS_STATUS_ERROR, - BOSS_STATUS_CONFIGURED - }; - - - typedef sequence SRTMinorServoBossStatusSeq; interface CBSRTMinorServoBossStatus : ACS::Callback { oneway void working(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void done(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; -typedef CBSRTMinorServoBossStatus SRTMinorServoBossStatusCB; interface AlarmSRTMinorServoBossStatus : ACS::Callback { oneway void alarm_raised(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); oneway void alarm_cleared(in SRTMinorServoBossStatus value, in ACSErr::Completion c, in ACS::CBDescOut desc); }; - typedef AlarmSRTMinorServoBossStatus SRTMinorServoBossStatusAlarm; interface PSRTMinorServoBossStatus: ACS::TypelessProperty { SRTMinorServoBossStatus get_sync(out ACSErr::Completion c); void get_async(in ACS::CBpattern cb, in ACS::CBDescIn desc); long get_history(in long n_last_values, out SRTMinorServoBossStatusSeq vs, out ACS::TimeSeq ts); ACS::Monitorpattern create_monitor(in ACS::CBpattern cb, in ACS::CBDescIn desc); ACS::Monitor create_postponed_monitor (in ACS::Time start_time, in ACS::CBpattern cb, in ACS::CBDescIn desc); readonly attribute ACS::TimeInterval default_timer_trigger; readonly attribute ACS::TimeInterval min_timer_trigger; readonly attribute SRTMinorServoBossStatus default_value; readonly attribute ACS::stringSeq statesDescription; readonly attribute ACS::ConditionSeq condition; readonly attribute SRTMinorServoBossStatusSeq allStates; }; - interface ROSRTMinorServoBossStatus: PSRTMinorServoBossStatus{ ACS::Subscription new_subscription_AlarmEnum(in ACS::Alarmpattern cb, in ACS::CBDescIn desc); readonly attribute SRTMinorServoBossStatusSeq alarm_on; readonly attribute SRTMinorServoBossStatusSeq alarm_off; }; - interface RWSRTMinorServoBossStatus: PSRTMinorServoBossStatus { ACSErr::Completion set_sync(in SRTMinorServoBossStatus value); void set_async(in SRTMinorServoBossStatus value, in ACS::CBvoid cb, in ACS::CBDescIn desc); void set_nonblocking(in SRTMinorServoBossStatus value);}; - -}; - -#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 01ab82321..342b25b8b 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -6,6 +6,10 @@ #include #include +#include +#include +#include +#include #pragma prefix "alma" @@ -70,15 +74,16 @@ module MinorServo ACS_ENUM(SRTMinorServoOperativeMode); - enum SRTMinorServoBossStatus + enum SRTMinorServoMotionStatus { - BOSS_STATUS_UNCONFIGURED, - BOSS_STATUS_SETUP_IN_PROGRESS, - BOSS_STATUS_PARK_IN_PROGRESS, - BOSS_STATUS_ERROR, - BOSS_STATUS_CONFIGURED + MOTION_STATUS_UNCONFIGURED, + MOTION_STATUS_CONFIGURING, + MOTION_STATUS_PARK, + MOTION_STATUS_ERROR, + MOTION_STATUS_CONFIGURED, + MOTION_STATUS_TRACKING }; - ACS_ENUM(SRTMinorServoBossStatus); + ACS_ENUM(SRTMinorServoMotionStatus); }; #endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile index c9465cced..9cac56365 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile +++ b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile @@ -26,10 +26,9 @@ CSOURCENAMES = \ # IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTMinorServoCommon -SRTMinorServoCommonStubs_LIBS = baciStubs -SRTMinorServoStubs_LIBS = baciStubs SRTMinorServoCommonStubs -SRTMinorServoBossStubs_LIBS = baciStubs SRTMinorServoCommonStubs ComponentErrorsStubs \ - MinorServoErrorsStubs AntennaDefinitionsStubs MinorServoDefinitionsStubs +SRTMinorServoCommonStubs_LIBS = baciStubs ManagmentDefinitionsStubs MinorServoDefinitionsStubs ComponentErrorsStubs MinorServoErrorsStubs +SRTMinorServoStubs_LIBS = SRTMinorServoCommonStubs +SRTMinorServoBossStubs_LIBS = SRTMinorServoCommonStubs MinorServoBossStubs # # INCLUDE STANDARDS diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index 2fb1a7429..ca305c532 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -14,7 +14,7 @@ - + @@ -118,15 +118,6 @@ MASTERHOST discos - - MinorServoBossContainer - cpp - - true - 0 - MASTERHOST - discos - MinorServoContainer cpp diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index 73b8de58c..47490c9cb 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -9,7 +9,7 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xi="http://www.w3.org/2001/XInclude" - xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" + xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> @@ -22,7 +22,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -41,14 +41,19 @@ - + - + - + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd index 7b8fb9fe6..2484bce95 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -8,7 +8,7 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xi="http://www.w3.org/2001/XInclude" - xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" + xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> @@ -21,8 +21,7 @@ - + @@ -32,7 +31,7 @@ - + @@ -42,7 +41,7 @@ - + @@ -51,17 +50,30 @@ + + + + + + + + + + + - + - - + + - + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd index 7dc0034ef..858936df2 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd @@ -23,19 +23,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd index accb3d172..46c9f8a9e 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd @@ -22,7 +22,7 @@ - + diff --git a/SRT/Servers/SRTMinorServo/include/Common.h b/SRT/Servers/SRTMinorServo/include/Common.h new file mode 100644 index 000000000..6453273e9 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/Common.h @@ -0,0 +1,73 @@ +#ifndef __SRTMINORSERVOCOMMON_H__ +#define __SRTMINORSERVOCOMMON_H__ + +#include "SuppressWarnings.h" +#include +#include +#include + + +namespace MinorServo +{ + // The second value of the pair indicates whether the configuration has a ASACTIVE double configuration + using DiscosConfigurationNameTableType = std::map >; + const DiscosConfigurationNameTableType DiscosConfigurationNameTable = + { + {"LLP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, + {"PPP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, + {"PLP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, + {"HHP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, + {"XKP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, + {"CCG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN1, true )}, + {"KKG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN2, true )}, + {"WWG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN3, true )}, + {"QQG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN4, true )}, + {"TRI", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN5, true )}, + {"MISTRAL", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN6, true )}, + {"CCB", std::make_pair(MinorServo::CONFIGURATION_BWG1, true )}, + {"XB", std::make_pair(MinorServo::CONFIGURATION_BWG3, true )}, + }; + + using LDOConfigurationNameTableType = boost::bimap; + const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of< LDOConfigurationNameTableType::relation > + (MinorServo::CONFIGURATION_PRIMARY, "Primario") + (MinorServo::CONFIGURATION_GREGORIAN1, "Gregoriano 1") + (MinorServo::CONFIGURATION_GREGORIAN2, "Gregoriano 2") + (MinorServo::CONFIGURATION_GREGORIAN3, "Gregoriano 3") + (MinorServo::CONFIGURATION_GREGORIAN4, "Gregoriano 4") + (MinorServo::CONFIGURATION_GREGORIAN5, "Gregoriano 5") + (MinorServo::CONFIGURATION_GREGORIAN6, "Gregoriano 6") + (MinorServo::CONFIGURATION_GREGORIAN7, "Gregoriano 7") + (MinorServo::CONFIGURATION_GREGORIAN8, "Gregoriano 8") + (MinorServo::CONFIGURATION_BWG1, "BWG1") + (MinorServo::CONFIGURATION_BWG2, "BWG2") + (MinorServo::CONFIGURATION_BWG3, "BWG3") + (MinorServo::CONFIGURATION_BWG4, "BWG4"); + + using LDOConfigurationIDTableType = boost::bimap; + const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of< LDOConfigurationIDTableType::relation > + (MinorServo::CONFIGURATION_UNKNOWN, 0) + (MinorServo::CONFIGURATION_PRIMARY, 1) + (MinorServo::CONFIGURATION_GREGORIAN1, 11) + (MinorServo::CONFIGURATION_GREGORIAN2, 12) + (MinorServo::CONFIGURATION_GREGORIAN3, 13) + (MinorServo::CONFIGURATION_GREGORIAN4, 14) + (MinorServo::CONFIGURATION_GREGORIAN5, 15) + (MinorServo::CONFIGURATION_GREGORIAN6, 16) + (MinorServo::CONFIGURATION_GREGORIAN7, 17) + (MinorServo::CONFIGURATION_GREGORIAN8, 18) + (MinorServo::CONFIGURATION_BWG1, 21) + (MinorServo::CONFIGURATION_BWG2, 22) + (MinorServo::CONFIGURATION_BWG3, 23) + (MinorServo::CONFIGURATION_BWG4, 24); + + const std::vector ServoOrder = + { + "PFP", + "SRP", + "GFR", + "M3R", + }; +} + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index dd4c3a799..4f6be5359 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -5,7 +5,7 @@ /* Giuseppe Carboni 20/09/2023 */ /**********************************************************/ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include @@ -25,7 +25,7 @@ struct SRTMinorServoDevIOInfo /** -i * This template class is derived from DevIO and it is used by the almost all attributes of the SRT Minor Servos components. + * This template class is derived from DevIO and it is used by the almost all attributes of the SRT Minor Servos components. * The associeted property can be selected at construction time and cannot be changed anymore. * @author Giuseppe Carboni , */ @@ -42,7 +42,7 @@ public: // The following expression will produce an error at compile time if the T class type is not one of the following static_assert( std::disjunction< - std::is_same, + std::is_same, std::is_same, std::is_same, std::is_same, @@ -80,115 +80,128 @@ public: /** * Used to read the property value. * @throw ComponentErrors::PropertyError - * @arg \c ComponentErrors::Timeout - * @arg \c AntennaErrors::Connection - * @arg \c ComponentErrors::SocketError * @param timestamp epoch when the operation completes */ T read(ACS::Time& timestamp) { - if(m_secure_area) + try { - IRA::CSecAreaResourceWrapper data = m_secure_area->Get(); - - try + if(m_secure_area) { - if constexpr(std::is_same::value) - { - unsigned int value = std::get(data->at(m_prefix + m_property_fields[0])); - m_value = (value == 1) ? true : false; - } - else if constexpr(std::is_same::value) + IRA::CSecAreaResourceWrapper data = m_secure_area->Get(); + + try { - auto object = data->at(m_prefix + m_property_fields[0]); - if(object.index() == 0) + if constexpr(std::is_same::value) { - m_value = double(std::get(object)); + unsigned int value = std::get(data->at(m_prefix + m_property_fields[0])); + m_value = (value == 1) ? Management::MNG_TRUE : Management::MNG_FALSE; } - else if(object.index() == 1) + else if constexpr(std::is_same::value) { - m_value = std::get(object); + auto object = data->at(m_prefix + m_property_fields[0]); + if(object.index() == 0) + { + m_value = double(std::get(object)); + } + else if(object.index() == 1) + { + m_value = std::get(object); + } } - } - else if constexpr(std::is_same::value) - { - auto object = data->at(m_prefix + m_property_fields[0]); - if(object.index() == 0) + else if constexpr(std::is_same::value) { - m_value = std::to_string(std::get(object)).c_str(); + auto object = data->at(m_prefix + m_property_fields[0]); + if(object.index() == 0) + { + m_value = std::to_string(std::get(object)).c_str(); + } + else if(object.index() == 1) + { + m_value = std::to_string(std::get(object)).c_str(); + } + else + { + m_value = std::get(object).c_str(); + } } - else if(object.index() == 1) + else if constexpr(std::is_same::value) { - m_value = std::to_string(std::get(object)).c_str(); + m_value.length(m_property_fields.size()); + + for(size_t i = 0; i < m_property_fields.size(); i++) + { + m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + } } - else + else if constexpr(std::is_same::value) { - m_value = std::get(object).c_str(); - } - } - else if constexpr(std::is_same::value) - { - m_value.length(m_property_fields.size()); + m_value.length(m_property_fields.size()); - for(size_t i = 0; i < m_property_fields.size(); i++) + for(size_t i = 0; i < m_property_fields.size(); i++) + { + m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + } + } + else if constexpr(std::is_same::value) { - m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + int value = std::get(data->at(m_prefix + m_property_fields[0])); + m_value = MinorServo::LDOConfigurationIDTable.right.at(value); } - } - else if constexpr(std::is_same::value) - { - m_value.length(m_property_fields.size()); - - for(size_t i = 0; i < m_property_fields.size(); i++) + else if constexpr(std::is_same::value) { - m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + m_value = MinorServo::SRTMinorServoControlStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); } - } - else if constexpr(std::is_same::value) - { - int value = std::get(data->at(m_prefix + m_property_fields[0])); - if(value > 20) + else if constexpr(std::is_same::value) { - //BWG - value -= 11; + m_value = MinorServo::SRTMinorServoGregorianCoverStatus(std::get(data->at(m_prefix + m_property_fields[0]))); } - else if(value > 10) + else if constexpr(std::is_same::value) { - //Gregorian - value -= 9; + m_value = MinorServo::SRTMinorServoCabinetStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); + } + else if constexpr(std::is_same::value) + { + m_value = MinorServo::SRTMinorServoOperativeMode(std::get(data->at(m_prefix + m_property_fields[0])) / 10); + } + else + { + // This should never happen thanks to the static_assert in the constructor + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Unknown property type!"); + throw impl; } - - m_value = MinorServo::SRTMinorServoFocalConfiguration(value+1); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoControlStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoGregorianCoverStatus(std::get(data->at(m_prefix + m_property_fields[0]))); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoCabinetStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); } - else if constexpr(std::is_same::value) + catch(std::out_of_range& ex) { - m_value = MinorServo::SRTMinorServoOperativeMode(std::get(data->at(m_prefix + m_property_fields[0])) / 10); + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Property is missing from the map!"); } - else + catch(std::bad_variant_access& ex) { - std::cout << "Unknown type" << std::endl; + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Attempt to access the property with the wrong type!"); } } - catch(ACSErr::ACSbaseExImpl& ex) + else { - _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, dummy, ex, "MSDevIO::read()"); - dummy.setPropertyName(m_property_name.c_str()); - dummy.setReason("Property could not be read"); - throw dummy; + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("SecureArea not ready!"); + throw impl; } } + catch(ACSErr::ACSbaseExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Property could not be read!"); + throw impl; + } + timestamp = getTimeStamp(); //completion time return m_value; } @@ -210,4 +223,149 @@ private: std::vector m_property_fields; }; + +template class MSGenericDevIO : public DevIO +{ +public: + MSGenericDevIO(A* value) + { + // The following expression will produce an error at compile time if the T class type is not one of the following + static_assert( + std::disjunction< + std::is_same, + std::is_same, + std::is_same, + std::is_same, + std::is_same + >::value, + "Not accepted MSDevIO type!" + ); + + // The following expressions will produce an error at compile time if the provided A argument class type is not recognized + static_assert( + std::disjunction< + std::negation >, + std::conjunction< + std::is_same, + std::disjunction< + std::is_same, + std::is_same > + > + > + >::value, + "Not accepted argument type!" + ); + + static_assert( + std::disjunction< + std::negation >, + std::conjunction< + std::is_same, + std::is_same > + > + >::value, + "Not accepted argument type!" + ); + + m_value = value; + } + + /** + * Destructor + */ + ~MSGenericDevIO() + { + } + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + return false; + } + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes + */ + C read(ACS::Time& timestamp) + { + timestamp = getTimeStamp(); //completion time + + if constexpr(std::is_same >::value) // Motion status + { + std::string motion_status; + + switch(*m_value) + { + case MinorServo::MOTION_STATUS_UNCONFIGURED: + { + motion_status = "Not configured"; + break; + } + case MinorServo::MOTION_STATUS_CONFIGURING: + { + motion_status = "Configuring..."; + break; + } + case MinorServo::MOTION_STATUS_PARK: + { + motion_status = "Parked"; + break; + } + case MinorServo::MOTION_STATUS_ERROR: + { + motion_status = "Error"; + break; + } + case MinorServo::MOTION_STATUS_CONFIGURED: + { + motion_status = "Elevation Track Mode Disabled"; + break; + } + case MinorServo::MOTION_STATUS_TRACKING: + { + motion_status = "Elevation Track Mode"; + break; + } + } + + return motion_status.c_str(); + } + else if constexpr(std::is_same::value) + { + return m_value->c_str(); + } + else if constexpr(std::is_same::value) + { + ACS::doubleSeq_var sequence = new ACS::doubleSeq; + sequence->length(m_value->size()); + + for(size_t i = 0; i < m_value->size(); i++) + { + sequence[i] = m_value->operator[](i); + } + + return sequence; + } + else + { + return *m_value; + } + } + + /** + * It writes values into controller. Unused because the properties are read-only. + */ + void write(const C& value, ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + return; + } + +private: + A* m_value; +}; + #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index bae147497..0801e2123 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include "ManagementErrors.h" #include "MinorServoErrors.h" #include "SRTMinorServoSocket.h" @@ -23,12 +23,12 @@ #include "SRTMinorServoBossImpl.h" #include "SRTMinorServoSetupThread.h" #include "SRTMinorServoParkThread.h" +#include "SRTMinorServoTrackingThread.h" class SRTMinorServoBossImpl; class SRTMinorServoSetupThread; class SRTMinorServoParkThread; - -using SRTMinorServoFocalConfigurationsTable = boost::bimap; +class SRTMinorServoTrackingThread; class SRTMinorServoBossCore @@ -37,6 +37,7 @@ friend class SRTMinorServoBossImpl; friend class SRTMinorServoStatusThread; friend class SRTMinorServoSetupThread; friend class SRTMinorServoParkThread; +friend class SRTMinorServoTrackingThread; public: SRTMinorServoBossCore(SRTMinorServoBossImpl* component); @@ -46,33 +47,55 @@ private: void setup(std::string configuration); void park(); void status(); - bool checkControl(); + void checkControl(); + void checkEmergency(); + void setElevationTracking(std::string configuration); + void setASConfiguration(std::string configuration); + void preset(double elevation); + + void clearUserOffsets(std::string servo_name); + void setUserOffset(std::string servo_axis_name, double offset); + std::vector getUserOffsets(); + void clearSystemOffsets(std::string servo_name); + void setSystemOffset(std::string servo_axis_name, double offset); + std::vector getSystemOffsets(); + + void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + + bool checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters); + void startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + void closeScan(ACS::Time& close_time); + + SRTMinorServoBossImpl* m_component; SRTMinorServoSocketConfiguration* m_socket_configuration; SRTMinorServoSocket* m_socket; SRTMinorServoSetupThread* m_setup_thread; SRTMinorServoParkThread* m_park_thread; - - SRTMinorServoAnswerMap m_status; - - SRTMinorServoFocalConfigurationsTable m_focal_configurations_table; + SRTMinorServoTrackingThread* m_tracking_thread; IRA::CSecureArea* m_status_secure_area; + SRTMinorServoAnswerMap m_status; - MinorServo::SRTMinorServoFocalConfiguration m_requested_configuration; - MinorServo::SRTMinorServoFocalConfiguration m_current_configuration; - - MinorServo::SRTGenericMinorServo_var m_GFR; - MinorServo::SRTProgramTrackMinorServo_var m_SRP; - - MinorServo::SRTMinorServoBossStatus m_boss_status; - - SRTMinorServoBossImpl* m_component; - - bool m_ready; - - std::vector m_servos; + std::map m_servos; + std::map m_tracking_servos; + + std::atomic m_motion_status; + std::string m_commanded_setup; + std::atomic m_commanded_configuration; + std::atomic m_current_configuration; + + std::atomic m_subsystem_status; + std::string m_actual_setup; + std::atomic m_ready; + std::atomic m_starting; + std::atomic m_as_configuration; + std::atomic m_elevation_tracking; + std::atomic m_elevation_tracking_enabled; + std::atomic m_scan_active; + std::atomic m_scanning; + std::atomic m_tracking; }; #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index 7aca8cafa..fa9a5fd13 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -6,15 +6,14 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include -#include #include #include #include -#include +#include #include #include #include "ManagementErrors.h" @@ -23,11 +22,11 @@ #include "SRTMinorServoStatusThread.h" #include "MSDevIOs.h" -#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTMinorServoBossImpl::PROPERTYNAME()\ +#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTMinorServoBossImpl::PROPERTYNAME() \ { \ - if (PROPERTY==0) return TYPE::_nil(); \ - TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ - return tmp._retn(); \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ } // Forward classes definitions @@ -51,41 +50,87 @@ public: // Parser methods virtual void setup(const char*); virtual void park(); - virtual void setElevationTracking(const char*); - virtual void setASConfiguration(const char*); - virtual void setOffsets(const char*, const double&); + virtual void setElevationTracking(const char* elevation_tracking); + virtual void setASConfiguration(const char* as_configuration); + virtual void setOffsets(const char* axis_name, const double& offset); virtual void clearOffsets(); + CORBA::Boolean command(const char*, CORBA::String_out); // MinorServoBoss interface methods + virtual CORBA::Boolean isElevationTrackingEn(); + virtual CORBA::Boolean isElevationTracking(); + virtual CORBA::Boolean isTracking(); + virtual CORBA::Boolean isStarting(); + virtual CORBA::Boolean isASConfiguration(); + virtual CORBA::Boolean isParking(); + virtual CORBA::Boolean isReady(); + virtual CORBA::Boolean isScanning(); + virtual CORBA::Boolean isScanActive(); + virtual char * getActualSetup(); + virtual char * getCommandedSetup(); + virtual CORBA::Double getCentralScanPosition(); + virtual void clearUserOffset(const char* servo_name); + virtual void setUserOffset(const char* servo_axis_name, CORBA::Double offset); + virtual ACS::doubleSeq* getUserOffset(); + virtual void clearSystemOffset(const char* servo_name); + virtual void setSystemOffset(const char* servo_axis_name, CORBA::Double offset); + virtual ACS::doubleSeq* getSystemOffset(); + virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + virtual char* getScanAxis(); + virtual ACS::doubleSeq* getAxesPosition(ACS::Time); + virtual CORBA::Boolean checkScan(const ACS::Time, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&, MinorServo::TRunTimeParameters_out); virtual void startScan(ACS::Time&, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&); virtual void closeScan(ACS::Time&); - CORBA::Boolean command(const char*, CORBA::String_out); + virtual void preset(double elevation); // Properties methods + virtual Management::ROTSystemStatus_ptr status(); + virtual Management::ROTBoolean_ptr ready(); + virtual ACS::ROstring_ptr actualSetup(); + virtual ACS::ROstring_ptr motionInfo(); + virtual Management::ROTBoolean_ptr starting(); + virtual Management::ROTBoolean_ptr asConfiguration(); + virtual Management::ROTBoolean_ptr elevationTrack(); + virtual Management::ROTBoolean_ptr scanActive(); + virtual Management::ROTBoolean_ptr scanning(); + virtual Management::ROTBoolean_ptr tracking(); + virtual MinorServo::ROSRTMinorServoFocalConfiguration_ptr current_configuration(); - virtual ACS::ROboolean_ptr simulation_enabled(); + virtual Management::ROTBoolean_ptr simulation_enabled(); virtual ACS::ROdouble_ptr plc_time(); virtual ACS::ROstring_ptr plc_version(); virtual MinorServo::ROSRTMinorServoControlStatus_ptr control(); - virtual ACS::ROboolean_ptr power(); - virtual ACS::ROboolean_ptr emergency(); + virtual Management::ROTBoolean_ptr power(); + virtual Management::ROTBoolean_ptr emergency(); virtual MinorServo::ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); virtual ACS::ROdouble_ptr last_executed_command(); + private: SRTMinorServoBossCore* m_core; SRTMinorServoStatusThread* m_status_thread; SimpleParser::CParser *m_parser; // Properties pointers + baci::SmartPropertyPointer > m_status_ptr; + baci::SmartPropertyPointer > m_ready_ptr; + baci::SmartPropertyPointer m_actual_setup_ptr; + baci::SmartPropertyPointer m_motion_info_ptr; + baci::SmartPropertyPointer > m_starting_ptr; + baci::SmartPropertyPointer > m_as_configuration_ptr; + baci::SmartPropertyPointer > m_elevation_tracking_ptr; + baci::SmartPropertyPointer > m_scan_active_ptr; + baci::SmartPropertyPointer > m_scanning_ptr; + baci::SmartPropertyPointer > m_tracking_ptr; + baci::SmartPropertyPointer > m_current_configuration_ptr; - baci::SmartPropertyPointer m_simulation_enabled_ptr; + baci::SmartPropertyPointer > m_simulation_enabled_ptr; baci::SmartPropertyPointer m_plc_time_ptr; baci::SmartPropertyPointer m_plc_version_ptr; baci::SmartPropertyPointer > m_control_ptr; - baci::SmartPropertyPointer m_power_ptr; - baci::SmartPropertyPointer m_emergency_ptr; + baci::SmartPropertyPointer > m_power_ptr; + baci::SmartPropertyPointer > m_emergency_ptr; baci::SmartPropertyPointer > m_gregorian_cover_ptr; baci::SmartPropertyPointer m_last_executed_command_ptr; }; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index b3910c5ea..679e33440 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -7,18 +7,19 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include #include #include -#include #include #include +#include #include #include #include +#include #include "ManagementErrors.h" #include "MinorServoErrors.h" #include "SRTMinorServoSocket.h" @@ -50,19 +51,33 @@ public: virtual void stop(); virtual void preset(const ACS::doubleSeq& coordinates); virtual void offset(const ACS::doubleSeq& offsets); - virtual void setup(const char* configuration_name); - - virtual ACS::ROboolean_ptr enabled(); + virtual void setup(const char* configuration_name = ""); + virtual ACS::doubleSeq* calcCoordinates(double elevation); + + virtual ACS::doubleSeq* getUserOffsets(); + virtual void setUserOffset(const char* axis_name, CORBA::Double offset); + virtual void clearUserOffsets(); + virtual ACS::doubleSeq* getSystemOffsets(); + virtual void setSystemOffset(const char* axis_name, CORBA::Double offset); + virtual void clearSystemOffsets(); + virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + + virtual Management::ROTBoolean_ptr enabled(); virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); - virtual ACS::ROboolean_ptr block(); + virtual Management::ROTBoolean_ptr block(); virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode(); - virtual ACS::RObooleanSeq_ptr axes_enabled(); + virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); virtual ACS::ROdoubleSeq_ptr physical_positions(); + virtual ACS::ROlong_ptr virtual_axes(); virtual ACS::ROdoubleSeq_ptr virtual_positions(); virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets(); + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets(); + virtual Management::ROTBoolean_ptr in_use(); + virtual ACS::ROstring_ptr current_setup(); protected: - unsigned int m_physical_axes, m_virtual_axes; + std::atomic m_physical_axes, m_virtual_axes; SRTMinorServoSocket* m_socket; std::string m_servo_name; @@ -72,21 +87,31 @@ private: SRTMinorServoAnswerMap m_status; IRA::CSecureArea* m_status_securearea; + std::vector m_user_offsets; + std::vector m_system_offsets; + std::vector m_virtual_axes_names; + std::vector m_virtual_axes_units; SRTMinorServoLookupTable m_current_lookup_table; - baci::SmartPropertyPointer m_enabled_ptr; + std::atomic m_in_use; + std::string m_current_setup; + + baci::SmartPropertyPointer > m_enabled_ptr; baci::SmartPropertyPointer > m_drive_cabinet_status_ptr; - baci::SmartPropertyPointer m_block_ptr; + baci::SmartPropertyPointer > m_block_ptr; baci::SmartPropertyPointer > m_operative_mode_ptr; - baci::SmartPropertyPointer m_axes_enabled_ptr; + baci::SmartPropertyPointer m_physical_axes_enabled_ptr; baci::SmartPropertyPointer m_physical_positions_ptr; + baci::SmartPropertyPointer m_virtual_axes_ptr; baci::SmartPropertyPointer m_virtual_positions_ptr; baci::SmartPropertyPointer m_virtual_offsets_ptr; + baci::SmartPropertyPointer m_virtual_user_offsets_ptr; + baci::SmartPropertyPointer m_virtual_system_offsets_ptr; + baci::SmartPropertyPointer > m_in_use_ptr; + baci::SmartPropertyPointer m_current_setup_ptr; - std::vector getPropertiesTable(std::string properties_name); - SRTMinorServoLookupTable getLookupTable(std::string configuration_name); - + std::vector getPropertiesTable(const std::string& properties_name); void checkErrors(); }; @@ -97,21 +122,34 @@ public: SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); ~SRTGenericMinorServoImpl(); - void status() { SRTBaseMinorServoImpl::status(); }; - void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; - void stop() { SRTBaseMinorServoImpl::stop(); }; - void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; - void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; - void setup(const char* configuration_name) { SRTBaseMinorServoImpl::setup(configuration_name); }; - - virtual ACS::ROboolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; - virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; - virtual ACS::ROboolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; - virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; - virtual ACS::RObooleanSeq_ptr axes_enabled() { return SRTBaseMinorServoImpl::axes_enabled(); }; - virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; + void status() { SRTBaseMinorServoImpl::status(); }; + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; + void stop() { SRTBaseMinorServoImpl::stop(); }; + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; + void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; + void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); }; + virtual ACS::doubleSeq* calcCoordinates(double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }; + virtual ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }; + virtual void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }; + virtual void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }; + virtual ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }; + virtual void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }; + virtual void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }; + virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) { SRTBaseMinorServoImpl::getAxesInfo(axes_names, axes_units); }; + + virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; + virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; + virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; + virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; + virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }; + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; + virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }; + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }; + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }; + virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }; + virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); }; }; class SRTProgramTrackMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTProgramTrackMinorServo @@ -120,23 +158,36 @@ public: SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); ~SRTProgramTrackMinorServoImpl(); - void status() { SRTBaseMinorServoImpl::status(); }; - void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; - void stop() { SRTBaseMinorServoImpl::stop(); }; - void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; - void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; - void setup(const char* configuration_name) { SRTBaseMinorServoImpl::setup(configuration_name); }; + void status() { SRTBaseMinorServoImpl::status(); }; + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; + void stop() { SRTBaseMinorServoImpl::stop(); }; + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; + void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; + void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); }; + virtual ACS::doubleSeq* calcCoordinates(double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }; + virtual ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }; + virtual void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }; + virtual void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }; + virtual ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }; + virtual void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }; + virtual void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }; + virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) { SRTBaseMinorServoImpl::getAxesInfo(axes_names, axes_units); }; void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, CORBA::Double start_time, const ACS::doubleSeq& coordinates); - virtual ACS::ROboolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; - virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; - virtual ACS::ROboolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; - virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; - virtual ACS::RObooleanSeq_ptr axes_enabled() { return SRTBaseMinorServoImpl::axes_enabled(); }; - virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; + virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; + virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; + virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; + virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; + virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }; + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; + virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }; + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }; + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }; + virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }; + virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); }; }; #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h index bfdd81105..2add0a420 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -11,13 +11,10 @@ /* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ /*************************************************************************************/ -#include "SuppressWarnings.h" +#include "Common.h" #include -#include -#include #include #include -#include "SRTMinorServoSocket.h" #include "SRTMinorServoBossCore.h" #define PARK_TIMEOUT 60 @@ -58,11 +55,14 @@ public: * This method overrides the thread implementation class. * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ - virtual void run(); + virtual void runLoop(); private: std::string m_thread_name; SRTMinorServoBossCore* m_core; + + unsigned int m_status; + double m_start_time; }; #endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h index 157a41c5d..476bdace8 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -11,13 +11,10 @@ /* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ /*************************************************************************************/ -#include "SuppressWarnings.h" +#include "Common.h" #include -#include -#include #include #include -#include "SRTMinorServoSocket.h" #include "SRTMinorServoBossCore.h" #define SETUP_TIMEOUT 60 @@ -58,11 +55,16 @@ public: * This method overrides the thread implementation class. * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ - virtual void run(); + virtual void runLoop(); private: std::string m_thread_name; SRTMinorServoBossCore* m_core; + + unsigned int m_status; + double m_start_time; + std::string m_LDO_configuration; + MinorServo::SRTMinorServoGregorianCoverStatus m_gregorian_cover_position; }; #endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h index 716260101..a25366e05 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h @@ -7,7 +7,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h index f88870faa..546d9e603 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -11,7 +11,7 @@ /* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ /*************************************************************************************/ -#include "SuppressWarnings.h" +#include "Common.h" #include #include #include diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h new file mode 100644 index 000000000..02a79f468 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h @@ -0,0 +1,78 @@ +#ifndef _SRTMINORSERVOTRACKINGTHREAD_H_ +#define _SRTMINORSERVOTRACKINGTHREAD_H_ + +/*************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTMinorServoTrackingThread.h */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 30/12/2023 Creation */ +/*************************************************************************************/ + +#include "Common.h" +#include +#include +#include +#include "SRTMinorServoBossCore.h" +#include +#include +#include + +_IRA_LOGFILTER_IMPORT; + + +#define TRACKING_FUTURE_TIME 2 //2 seconds +#define TRACKING_TIMEGAP 0.2 //200 milliseconds + +class SRTMinorServoBossCore; + + +/** + * This class implements a tracking thread. This thread is in charge of positioning the minor servos in time. +*/ +class SRTMinorServoTrackingThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoTrackingThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +private: + double getElevation(double time); + void resetTracking(); + + std::string m_thread_name; + SRTMinorServoBossCore* m_core; + Antenna::AntennaBoss_var m_antennaBoss; + unsigned int m_point_id, m_trajectory_id; + double m_point_time; +}; + +#endif /*_SRTMINORSERVOTRACKINGTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index 39ea58207..d32729457 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -22,20 +22,22 @@ SRTMinorServoSocket_OBJECTS = SRTMinorServoSocket SRTMinorServoSocket_LIBS = IRALibrary ComponentErrors SRTMinorServoCommandLibrary SRTMinorServoSocket_CFLAGS = -std=c++17 -SRTMinorServoBossImpl_OBJECTS = SRTMinorServoStatusThread SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoBossCore SRTMinorServoBossImpl -SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket ParserErrors DiscosVersion +SRTMinorServoBossImpl_OBJECTS = SRTMinorServoStatusThread SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoBossCore SRTMinorServoBossImpl +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocket ParserErrors DiscosVersion SRTMinorServoBossImpl_CFLAGS = -std=c++17 SRTMinorServoBossCore_CFLAGS = -std=c++17 SRTMinorServoStatusThread_CFLAGS = -std=c++17 SRTMinorServoSetupThread_CFLAGS = -std=c++17 SRTMinorServoParkThread_CFLAGS = -std=c++17 +SRTMinorServoTrackingThread_CFLAGS = -std=c++17 +SRTMinorServoTrackingThread_LIBS = IRALibrary SRTGenericMinorServoImpl_OBJECTS = SRTGenericMinorServoImpl SRTBaseMinorServoImpl -SRTGenericMinorServoImpl_LIBS = SRTBaseMinorServoImpl IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion +SRTGenericMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion SRTGenericMinorServoImpl_CFLAGS = -std=c++17 SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl -SRTProgramTrackMinorServoImpl_LIBS = SRTBaseMinorServoImpl IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion +SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 SRTBaseMinorServoImpl_CFLAGS = -std=c++17 diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index d9440e71b..50ac89407 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -8,10 +8,15 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString &componentName, m m_drive_cabinet_status_ptr(this), m_block_ptr(this), m_operative_mode_ptr(this), - m_axes_enabled_ptr(this), + m_physical_axes_enabled_ptr(this), m_physical_positions_ptr(this), + m_virtual_axes_ptr(this), m_virtual_positions_ptr(this), - m_virtual_offsets_ptr(this) + m_virtual_offsets_ptr(this), + m_virtual_user_offsets_ptr(this), + m_virtual_system_offsets_ptr(this), + m_in_use_ptr(this), + m_current_setup_ptr(this) { std::string component_name(componentName.c_str()); m_servo_name = component_name.substr(component_name.rfind('/') + 1); @@ -28,18 +33,25 @@ void SRTBaseMinorServoImpl::initialize() { AUTO_TRACE(m_servo_name + "::initialize()"); - if(!IRA::CIRATools::getDBValue(getContainerServices(), "physical_axes", m_physical_axes)) + unsigned int tempvar; + if(!IRA::CIRATools::getDBValue(getContainerServices(), "physical_axes", tempvar)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, (m_servo_name + "::initialize()").c_str()); - exImpl.setFieldName("physical_axes"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setFieldName("physical_axes"); + throw impl; } - if(!IRA::CIRATools::getDBValue(getContainerServices(), "virtual_axes", m_virtual_axes)) + m_physical_axes = tempvar; + if(!IRA::CIRATools::getDBValue(getContainerServices(), "virtual_axes", tempvar)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, (m_servo_name + "::initialize()").c_str()); - exImpl.setFieldName("virtual_axes"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setFieldName("virtual_axes"); + throw impl; } + m_virtual_axes = tempvar; + + // Initialize offsets + m_user_offsets = std::vector(m_virtual_axes, 0.0); + m_system_offsets = std::vector(m_virtual_axes, 0.0); m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(getContainerServices()); m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); @@ -58,7 +70,7 @@ void SRTBaseMinorServoImpl::initialize() dev_io_info.property_name = "enabled"; dev_io_info.property_fields = std::vector{ "ENABLED" }; - m_enabled_ptr = new baci::ROboolean((component_name + ":enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_enabled_ptr = new ROEnumImpl((component_name + ":enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "drive_cabinet_status"; dev_io_info.property_fields = std::vector{ "STATUS" }; @@ -66,34 +78,64 @@ void SRTBaseMinorServoImpl::initialize() dev_io_info.property_name = "block"; dev_io_info.property_fields = std::vector{ "BLOCK" }; - m_block_ptr = new baci::ROboolean((component_name + ":block").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_block_ptr = new ROEnumImpl((component_name + ":block").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "operative_mode"; dev_io_info.property_fields = std::vector{ "OPERATIVE_MODE" }; m_operative_mode_ptr = new ROEnumImpl((component_name + ":operative_mode").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - dev_io_info.property_name = "axes_enabled"; - dev_io_info.property_fields = getPropertiesTable("axes_enabled"); + dev_io_info.property_name = "physical_axes_enabled"; + dev_io_info.property_fields = getPropertiesTable("physical_axes_enabled"); if(dev_io_info.property_fields.size() != m_physical_axes) { - // Wrong length for axes_enabled property + // Wrong length for physical_axes_enabled property + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setValueName(dev_io_info.property_name.c_str()); + impl.setValueLimit(m_physical_axes); + throw impl; } - m_axes_enabled_ptr = new baci::RObooleanSeq((component_name + ":axes_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_physical_axes_enabled_ptr = new baci::RObooleanSeq((component_name + ":physical_axes_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "physical_positions"; dev_io_info.property_fields = getPropertiesTable("physical_positions"); if(dev_io_info.property_fields.size() != m_physical_axes) { // Wrong length for physical_positions property + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setValueName(dev_io_info.property_name.c_str()); + impl.setValueLimit(m_physical_axes); + throw impl; } m_physical_positions_ptr = new baci::ROdoubleSeq((component_name + ":physical_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_virtual_axes_ptr = new baci::ROlong((component_name + ":virtual_axes").c_str(), getComponent(), new MSGenericDevIO >(&m_virtual_axes), true); + m_virtual_axes_names = getPropertiesTable("virtual_positions"); + for(const std::string& axis_name : m_virtual_axes_names) + { + if(axis_name.at(0) == 'T') + { + m_virtual_axes_units.push_back("mm"); + } + else if(axis_name.at(0) == 'R') + { + m_virtual_axes_units.push_back("degrees"); + } + else + { + m_virtual_axes_units.push_back("unknown"); + } + } + dev_io_info.property_name = "virtual_positions"; dev_io_info.property_fields = m_virtual_axes_names; if(m_virtual_axes_names.size() != m_virtual_axes) { // Wrong length for virtual_axes property + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setValueName(dev_io_info.property_name.c_str()); + impl.setValueLimit(m_virtual_axes); + throw impl; } m_virtual_positions_ptr = new baci::ROdoubleSeq((component_name + ":virtual_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); @@ -102,13 +144,25 @@ void SRTBaseMinorServoImpl::initialize() if(dev_io_info.property_fields.size() != m_virtual_axes) { // Wrong length for virtual_offsets property + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); + impl.setValueName(dev_io_info.property_name.c_str()); + impl.setValueLimit(m_virtual_axes); + throw impl; } m_virtual_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_offsets").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_user_offsets").c_str(), getComponent(), new MSGenericDevIO >(&m_user_offsets), true); + m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_system_offsets").c_str(), getComponent(), new MSGenericDevIO >(&m_system_offsets), true); + + m_in_use_ptr = new ROEnumImpl((component_name + ":in_use").c_str(), getComponent(), new MSGenericDevIO >(&m_in_use), true); + m_current_setup_ptr = new baci::ROstring((component_name + ":current_setup").c_str(), getComponent(), new MSGenericDevIO(&m_current_setup), true); } catch(std::bad_alloc& ex) { _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl, std::string(m_servo_name + "::initialize()").c_str()); } + + m_current_setup = ""; + m_in_use = Management::MNG_FALSE; } void SRTBaseMinorServoImpl::execute() @@ -143,7 +197,9 @@ void SRTBaseMinorServoImpl::stow(CORBA::Long stow_position) if(std::get(answer["OUTPUT"]) != "GOOD") { - _THROW_EXCPT(MinorServoErrors::StowErrorExImpl, std::string(m_servo_name + "::stow()").c_str()); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::stow()").c_str()); + impl.setReason("Received NAK in response to a STOW command!"); + throw impl; } } @@ -156,7 +212,9 @@ void SRTBaseMinorServoImpl::stop() if(std::get(answer["OUTPUT"]) != "GOOD") { - _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, std::string(m_servo_name + "::stop()").c_str()); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::stop()").c_str()); + impl.setReason("Received NAK in response to a STOP command!"); + throw impl; } } @@ -167,11 +225,9 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) if(virtual_coordinates.length() != m_virtual_axes) { - //Wrong number of virtual_coordinates - } - else if(m_current_lookup_table.empty()) - { - // Empty lookup table, cannot execute + _EXCPT(MinorServoErrors::PositioningErrorExImpl, impl, (m_servo_name + "::preset()").c_str()); + impl.addData("Reason", "Wrong number of values for this servo system!"); + throw impl; } std::vector coords(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); @@ -180,7 +236,9 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) if(std::get(answer["OUTPUT"]) != "GOOD") { - _THROW_EXCPT(MinorServoErrors::PositioningErrorExImpl, std::string(m_servo_name + "::preset()").c_str()); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::preset()").c_str()); + impl.setReason("Received NAK in response to a PRESET command!"); + throw impl; } } @@ -191,7 +249,9 @@ void SRTBaseMinorServoImpl::offset(const ACS::doubleSeq& virtual_offsets) if(virtual_offsets.length() != m_virtual_axes) { - //Wrong number of virtual_offsets + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::offset()").c_str()); + impl.addData("Reason", "Wrong number of values for this servo system!"); + throw impl; } std::vector offsets(virtual_offsets.get_buffer(), virtual_offsets.get_buffer() + virtual_offsets.length()); @@ -200,57 +260,176 @@ void SRTBaseMinorServoImpl::offset(const ACS::doubleSeq& virtual_offsets) if(std::get(answer["OUTPUT"]) != "GOOD") { - _THROW_EXCPT(MinorServoErrors::OffsetErrorExImpl, std::string(m_servo_name + "::offset()").c_str()); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::offset()").c_str()); + impl.setReason("Received NAK in response to an OFFSET command!"); + throw impl; } } -void SRTBaseMinorServoImpl::setup(const char* configuration_name) +ACS::doubleSeq* SRTBaseMinorServoImpl::getUserOffsets() { - m_current_lookup_table = getLookupTable(std::string(configuration_name)); + AUTO_TRACE(m_servo_name + "::getUserOffsets()"); + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(m_user_offsets.size()); + for(size_t i = 0; i < m_user_offsets.size(); i++) + { + offsets[i] = m_user_offsets[i]; + } + return offsets._retn(); } -std::vector SRTBaseMinorServoImpl::getPropertiesTable(std::string properties_name) +void SRTBaseMinorServoImpl::setUserOffset(const char* axis_name, CORBA::Double offset) { - AUTO_TRACE(m_servo_name + "::getPropertiesTable()"); + AUTO_TRACE(m_servo_name + "::setUserOffset()"); + checkErrors(); - std::vector properties; - - IRA::CDBTable table(getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); - IRA::CError error; - error.Reset(); + std::string axis(axis_name); + std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); - if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + if(axis == "RZ" && m_virtual_axes == 1) { - error.setExtra("Error adding field property_name", 0); + axis = "ROTATION"; } - if(!error.isNoError()) + + unsigned int index = std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis) - m_virtual_axes_names.begin(); + + try { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, dummy, error); - dummy.setCode(error.getErrorCode()); - dummy.setDescription((const char *)error.getDescription()); - throw dummy; + m_user_offsets.at(index) = (double)offset; } - if(!table.openTable(error)) + catch(std::out_of_range const& ex) { - _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); - throw dummy; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::setUserOffset()").c_str()); + impl.addData("Reason", ("Unknown axis '" + axis + "'!").c_str()); + throw impl; } - table.First(); - for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + // Update the offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + + if(std::get(answer["OUTPUT"]) != "GOOD") { - properties.push_back(std::string(table["property_name"]->asString())); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::setUserOffset()").c_str()); + impl.setReason("Received NAK in response to an OFFSET command!"); + throw impl; } - table.closeTable(); +} - return properties; +void SRTBaseMinorServoImpl::clearUserOffsets() +{ + AUTO_TRACE(m_servo_name + "::clearUserOffsets()"); + checkErrors(); + + m_user_offsets = std::vector(m_virtual_axes, 0.0); + + // Update the offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::clearUserOffset()").c_str()); + impl.setReason("Received NAK in response to an OFFSET command!"); + throw impl; + } +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::getSystemOffsets() +{ + AUTO_TRACE(m_servo_name + "::getSystemOffsets()"); + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(m_system_offsets.size()); + for(size_t i = 0; i < m_system_offsets.size(); i++) + { + offsets[i] = m_system_offsets[i]; + } + return offsets._retn(); +} + +void SRTBaseMinorServoImpl::setSystemOffset(const char* axis_name, CORBA::Double offset) +{ + AUTO_TRACE(m_servo_name + "::setSystemOffset()"); + checkErrors(); + + std::string axis(axis_name); + std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); + + if(axis == "RZ" && m_virtual_axes == 1) + { + axis = "ROTATION"; + } + + unsigned int index = std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis) - m_virtual_axes_names.begin(); + + try + { + m_system_offsets.at(index) = (double)offset; + } + catch(std::out_of_range const& ex) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::setSystemOffset()").c_str()); + impl.addData("Reason", ("Unknown axis '" + axis + "'!").c_str()); + throw impl; + } + + // Update the offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::setSystemOffset()").c_str()); + impl.setReason("Received NAK in response to an OFFSET command!"); + throw impl; + } } -SRTMinorServoLookupTable SRTBaseMinorServoImpl::getLookupTable(std::string configuration_name) +void SRTBaseMinorServoImpl::clearSystemOffsets() { - AUTO_TRACE(m_servo_name + "::getLookupTable()"); + AUTO_TRACE(m_servo_name + "::clearSystemOffsets()"); + checkErrors(); + + m_system_offsets = std::vector(m_virtual_axes, 0.0); + + // Update the offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); - IRA::CDBTable table(getContainerServices(), configuration_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + if(std::get(answer["OUTPUT"]) != "GOOD") + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::clearSystemOffset()").c_str()); + impl.setReason("Received NAK in response to an OFFSET command!"); + throw impl; + } +} + +void SRTBaseMinorServoImpl::setup(const char* configuration_name) +{ + AUTO_TRACE(m_servo_name + "::setup()"); + m_in_use = Management::MNG_FALSE; + m_current_lookup_table.clear(); + + m_current_setup = ""; + std::string setup_name(configuration_name); + std::transform(setup_name.begin(), setup_name.end(), setup_name.begin(), ::toupper); + + if(setup_name.empty()) + { + return; + } + + IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); IRA::CError error; error.Reset(); @@ -264,19 +443,17 @@ SRTMinorServoLookupTable SRTBaseMinorServoImpl::getLookupTable(std::string confi } if(!error.isNoError()) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, dummy, error); - dummy.setCode(error.getErrorCode()); - dummy.setDescription((const char *)error.getDescription()); - throw dummy; + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, impl, error); + impl.setCode(error.getErrorCode()); + impl.setDescription((const char *)error.getDescription()); + throw impl; } if(!table.openTable(error)) { - _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, dummy, error); - throw dummy; + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, impl, error); + throw impl; } - SRTMinorServoLookupTable lookup_table; - table.First(); for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) { @@ -292,27 +469,129 @@ SRTMinorServoLookupTable SRTBaseMinorServoImpl::getLookupTable(std::string confi coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); } - lookup_table[axis] = coefficients; + m_current_lookup_table[axis] = coefficients; + } + table.closeTable(); + + if(m_current_lookup_table.size() > 0) + { + m_current_setup = setup_name; + clearUserOffsets(); + clearSystemOffsets(); + m_in_use = Management::MNG_TRUE; + } +} + +void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +{ + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesInfo()"); + + ACS::stringSeq_var axes_names_var = new ACS::stringSeq; + ACS::stringSeq_var axes_units_var = new ACS::stringSeq; + axes_names_var->length(m_virtual_axes); + axes_units_var->length(m_virtual_axes); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + axes_names_var[i] = m_virtual_axes_names[i].c_str(); + axes_units_var[i] = m_virtual_axes_units[i].c_str(); + } + + axes_names = axes_names_var._retn(); + axes_units = axes_units_var._retn(); +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) +{ + AUTO_TRACE(m_servo_name + "::calcCoordinates()"); + + if(m_in_use == Management::MNG_TRUE) + { + ACS::doubleSeq_var coordinates = new ACS::doubleSeq; + coordinates->length(m_virtual_axes); + + for(size_t axis = 0; axis < m_virtual_axes; axis++) + { + std::vector coefficients = m_current_lookup_table.at(m_virtual_axes_names[axis]); + + double coordinate = 0; + + for(size_t index = 0; index < coefficients.size(); index++) + { + coordinate += coefficients[index] * pow(elevation, index); + } + + coordinates[axis] = coordinate; + } + + return coordinates._retn(); + } + else + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, (m_servo_name + "::calcCoordinates()").c_str()); + impl.setReason("Unable to calculate the coordinates since the servo system has not been configured yet!"); + throw impl; + } +} + +std::vector SRTBaseMinorServoImpl::getPropertiesTable(const std::string& properties_name) +{ + AUTO_TRACE(m_servo_name + "::getPropertiesTable()"); + + std::vector properties; + + IRA::CDBTable table(getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field property_name", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, impl, error); + impl.setCode(error.getErrorCode()); + impl.setDescription((const char *)error.getDescription()); + throw impl; + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, impl, error); + throw impl; + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + properties.push_back(std::string(table["property_name"]->asString())); } table.closeTable(); - return lookup_table; + return properties; } void SRTBaseMinorServoImpl::checkErrors() { ACSErr::Completion_var comp; - if(block()->get_sync(comp.out()) || drive_cabinet_status()->get_sync(comp.out()) == MinorServo::DRIVE_CABINET_ERROR) + if(block()->get_sync(comp.out()) == Management::MNG_TRUE || drive_cabinet_status()->get_sync(comp.out()) == MinorServo::DRIVE_CABINET_ERROR) { - _THROW_EXCPT(MinorServoErrors::StatusErrorExImpl, std::string(m_servo_name + "::checkErrors()").c_str()); + _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, (m_servo_name + "::checkErrors()").c_str()); + impl.setReason("Servo system blocked or drive cabinet error!"); + throw impl; } } -GET_PROPERTY_REFERENCE(ACS::ROboolean, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_enabled_ptr, enabled); GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoCabinetStatus, m_drive_cabinet_status_ptr, drive_cabinet_status); -GET_PROPERTY_REFERENCE(ACS::ROboolean, m_block_ptr, block); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_block_ptr, block); GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoOperativeMode, m_operative_mode_ptr, operative_mode); -GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, m_axes_enabled_ptr, axes_enabled); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, m_physical_axes_enabled_ptr, physical_axes_enabled); GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROlong, m_virtual_axes_ptr, virtual_axes); GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_positions_ptr, virtual_positions); GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_offsets_ptr, virtual_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_user_offsets_ptr, virtual_user_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_system_offsets_ptr, virtual_system_offsets); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_in_use_ptr, in_use); +GET_PROPERTY_REFERENCE(ACS::ROstring, m_current_setup_ptr, current_setup) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index d832853ce..a824d15c7 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -6,26 +6,23 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl* component) { AUTO_TRACE("SRTMinorServoBossCore::SRTMinorServoBossCore()"); - m_boss_status = MinorServo::BOSS_STATUS_UNCONFIGURED; - - m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - m_requested_configuration = MinorServo::CONFIGURATION_UNKNOWN; - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Primario", MinorServo::CONFIGURATION_PRIMARY)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano1", MinorServo::CONFIGURATION_GREGORIAN1)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano2", MinorServo::CONFIGURATION_GREGORIAN2)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano3", MinorServo::CONFIGURATION_GREGORIAN3)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano4", MinorServo::CONFIGURATION_GREGORIAN4)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano5", MinorServo::CONFIGURATION_GREGORIAN5)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano6", MinorServo::CONFIGURATION_GREGORIAN6)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano7", MinorServo::CONFIGURATION_GREGORIAN7)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("Gregoriano8", MinorServo::CONFIGURATION_GREGORIAN8)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG1", MinorServo::CONFIGURATION_BWG1)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG2", MinorServo::CONFIGURATION_BWG2)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG3", MinorServo::CONFIGURATION_BWG3)); - m_focal_configurations_table.insert(SRTMinorServoFocalConfigurationsTable::value_type("BWG4", MinorServo::CONFIGURATION_BWG4)); - m_component = component; + m_motion_status = MinorServo::MOTION_STATUS_UNCONFIGURED; + m_actual_setup = "Unknown"; + m_commanded_setup = "Unknown"; + m_commanded_configuration = MinorServo::CONFIGURATION_UNKNOWN; + + m_subsystem_status = Management::MNG_WARNING; + m_ready = Management::MNG_FALSE; + m_starting = Management::MNG_FALSE; + m_as_configuration = Management::MNG_FALSE; + m_elevation_tracking = Management::MNG_FALSE; + m_elevation_tracking_enabled = Management::MNG_FALSE; + m_scan_active = Management::MNG_FALSE; + m_scanning = Management::MNG_FALSE; + m_tracking = Management::MNG_FALSE; + m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(m_component->getContainerServices()); m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); @@ -33,16 +30,17 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl* component) m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); m_status_secure_area = new IRA::CSecureArea(&m_status); - m_GFR = m_component->getContainerServices()->getComponent("MINORSERVO/GFR"); - m_SRP = m_component->getContainerServices()->getComponent("MINORSERVO/SRP"); - - m_servos.push_back((MinorServo::SRTBaseMinorServo_ptr)m_GFR); - m_servos.push_back((MinorServo::SRTBaseMinorServo_ptr)m_SRP); + // Retrieve the minor servos components + m_tracking_servos["PFP"] = m_component->getContainerServices()->getComponent("MINORSERVO/PFP"); + m_tracking_servos["SRP"] = m_component->getContainerServices()->getComponent("MINORSERVO/SRP"); + m_servos["PFP"] = (MinorServo::SRTBaseMinorServo_ptr)m_tracking_servos["PFP"]; + m_servos["SRP"] = (MinorServo::SRTBaseMinorServo_ptr)m_tracking_servos["SRP"]; + m_servos["GFR"] = (MinorServo::SRTBaseMinorServo_ptr)m_component->getContainerServices()->getComponent("MINORSERVO/GFR"); + m_servos["M3R"] = (MinorServo::SRTBaseMinorServo_ptr)m_component->getContainerServices()->getComponent("MINORSERVO/M3R"); m_setup_thread = NULL; m_park_thread = NULL; - - m_ready = false; + m_tracking_thread = NULL; } SRTMinorServoBossCore::~SRTMinorServoBossCore() @@ -61,57 +59,76 @@ SRTMinorServoBossCore::~SRTMinorServoBossCore() m_park_thread->terminate(); m_component->getContainerServices()->getThreadManager()->destroy(m_park_thread); } + if(m_tracking_thread != NULL) + { + m_tracking_thread->suspend(); + m_tracking_thread->terminate(); + m_component->getContainerServices()->getThreadManager()->destroy(m_tracking_thread); + } } -void SRTMinorServoBossCore::setup(std::string configuration) +void SRTMinorServoBossCore::setup(std::string commanded_setup) { AUTO_TRACE("SRTMinorServoBossCore::setup()"); - ACSErr::Completion_var comp; + checkControl(); + checkEmergency(); - if(!checkControl() || m_component->emergency()->get_sync(comp.out())) - { - // Minor servos are controlled by VBrain or there is an emergency button pressed somewhere - // I raise OperationNotPermitted since there is no other, more fitting error - _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, "SRTMinorServoBossCore::setup()"); - } + std::transform(commanded_setup.begin(), commanded_setup.end(), commanded_setup.begin(), ::toupper); - MinorServo::SRTMinorServoFocalConfiguration requested_configuration; + std::pair cmd_configuration; + MinorServo::SRTMinorServoFocalConfiguration commanded_configuration; try { - requested_configuration = m_focal_configurations_table.left.at(configuration); + cmd_configuration = MinorServo::DiscosConfigurationNameTable.at(commanded_setup); + commanded_configuration = cmd_configuration.first; + if(m_as_configuration == Management::MNG_TRUE && cmd_configuration.second) + { + commanded_setup += "_ASACTIVE"; + } } catch(std::out_of_range& ex) // Unknown configuration { - _THROW_EXCPT(MinorServoErrors::ConfigurationErrorExImpl, "SRTMinorServoBossCore::setup()"); + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setup()"); + throw impl; } - // Exit if commanded configuration is already in place - if(requested_configuration == m_current_configuration && (m_boss_status == MinorServo::BOSS_STATUS_CONFIGURED || m_boss_status == MinorServo::BOSS_STATUS_SETUP_IN_PROGRESS)) + // Exit if commanded setup is already in place or is about to be + if(commanded_configuration == m_commanded_configuration && commanded_setup == m_commanded_setup) { - return; + if(m_motion_status == MinorServo::MOTION_STATUS_CONFIGURING || m_motion_status == MinorServo::MOTION_STATUS_CONFIGURED || m_motion_status == MinorServo::MOTION_STATUS_TRACKING) + { + return; + } } - m_requested_configuration = requested_configuration; + m_commanded_configuration = commanded_configuration; + m_commanded_setup = commanded_setup; // Stop the setup and park threads if running - if(m_setup_thread != NULL) + if(m_setup_thread != NULL && m_setup_thread->isAlive()) { - m_setup_thread->suspend(); - m_setup_thread->terminate(); + m_setup_thread->setStopped(); } - if(m_park_thread != NULL) + if(m_park_thread != NULL && m_park_thread->isAlive()) { - m_park_thread->suspend(); - m_park_thread->terminate(); + m_park_thread->setStopped(); + } + if(m_tracking_thread != NULL && m_tracking_thread->isAlive()) + { + m_tracking_thread->setStopped(); } - m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - m_boss_status = MinorServo::BOSS_STATUS_SETUP_IN_PROGRESS; + m_actual_setup = ""; + m_ready = Management::MNG_FALSE; + m_starting = Management::MNG_TRUE; + m_tracking = Management::MNG_FALSE; + m_motion_status = MinorServo::MOTION_STATUS_CONFIGURING; + m_subsystem_status = Management::MNG_WARNING; // Send the STOP command to each servo - for(auto& servo : m_servos) + for(const auto& [name, servo] : m_servos) { servo->stop(); } @@ -129,7 +146,12 @@ void SRTMinorServoBossCore::setup(std::string configuration) } catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) { - _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::setup()"); + m_starting = Management::MNG_FALSE; + m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_subsystem_status = Management::MNG_FAILURE; + _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::setup()"); + impl.setThreadName("SRTMinorServoSetupThread"); + throw impl; } m_setup_thread->resume(); @@ -140,40 +162,54 @@ void SRTMinorServoBossCore::park() { AUTO_TRACE("SRTMinorServoBossCore::park()"); - ACSErr::Completion_var comp; + checkControl(); + checkEmergency(); - if(!checkControl() || m_component->emergency()->get_sync(comp.out())) + // Exit if the system is already parked or is about to be + if(m_commanded_configuration == MinorServo::CONFIGURATION_PARK) { - // Minor servos are controlled by VBrain or there is an emergency button pressed somewhere - // I raise OperationNotPermitted since there is no other, more fitting error - _THROW_EXCPT(MinorServoErrors::OperationNotPermittedExImpl, "SRTMinorServoBossCore::setup()"); + if(m_motion_status == MinorServo::MOTION_STATUS_CONFIGURING || m_motion_status == MinorServo::MOTION_STATUS_PARK) + { + return; + } } - m_requested_configuration = MinorServos::CONFIGURATION_PARK; + m_commanded_configuration = MinorServo::CONFIGURATION_PARK; + m_commanded_setup = "Park"; // Stop the setup and park threads if running - if(m_setup_thread != NULL) + if(m_setup_thread != NULL && m_setup_thread->isAlive()) { - m_setup_thread->suspend(); - m_setup_thread->terminate(); + m_setup_thread->setStopped(); } - if(m_park_thread != NULL) + if(m_park_thread != NULL && m_park_thread->isAlive()) { - m_park_thread->suspend(); - m_park_thread->terminate(); + m_park_thread->setStopped(); + } + if(m_tracking_thread != NULL && m_tracking_thread->isAlive()) + { + m_tracking_thread->setStopped(); } - m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - m_boss_status = MinorServo::BOSS_STATUS_PARK_IN_PROGRESS; + m_actual_setup = ""; + m_ready = Management::MNG_FALSE; + m_starting = Management::MNG_TRUE; + m_tracking = Management::MNG_FALSE; + m_motion_status = MinorServo::MOTION_STATUS_CONFIGURING; + m_subsystem_status = Management::MNG_WARNING; // Send the STOW command to the gregorian cover if(std::get(m_socket->sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2))["OUTPUT"]) != "GOOD") { - _THROW_EXCPT(MinorServoErrors::SetupErrorExImpl, "SRTMinorServoBossCore::park()"); + m_starting = Management::MNG_FALSE; + m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_subsystem_status = Management::MNG_FAILURE; + _EXCPT(MinorServoErrors::SetupErrorExImpl, impl, "SRTMinorServoBossCore::park()"); + throw impl; } // Send the STOP command to each servo - for(auto& servo : m_servos) + for(const auto& [name, servo] : m_servos) { servo->stop(); } @@ -191,13 +227,65 @@ void SRTMinorServoBossCore::park() } catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) { - _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::park()"); + m_starting = Management::MNG_FALSE; + m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_subsystem_status = Management::MNG_FAILURE; + _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::park()"); + impl.setThreadName("SRTMinorServoParkThread"); + throw impl; } m_park_thread->resume(); } } +void SRTMinorServoBossCore::setElevationTracking(std::string configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::setElevationTracking()"); + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration == "ON") + { + m_elevation_tracking_enabled = Management::MNG_TRUE; + } + else if(configuration == "OFF") + { + m_elevation_tracking_enabled = Management::MNG_FALSE; + } + else + { + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setElevationTracking()"); + throw impl; + } +} + +void SRTMinorServoBossCore::setASConfiguration(std::string configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::setASConfiguration()"); + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration == "ON") + { + m_as_configuration = Management::MNG_TRUE; + } + else if(configuration == "OFF") + { + m_as_configuration = Management::MNG_FALSE; + } + else + { + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setASConfiguration()"); + throw impl; + } + + // Should reload the correct setup if the system was already configured + if(!m_actual_setup.empty()) + { + configuration = m_actual_setup.substr(0, m_actual_setup.find("_")); + setup(configuration); + } +} + void SRTMinorServoBossCore::status() { AUTO_TRACE("SRTMinorServoBossCore::status()"); @@ -206,8 +294,308 @@ void SRTMinorServoBossCore::status() m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); } -bool SRTMinorServoBossCore::checkControl() +void SRTMinorServoBossCore::preset(double elevation) // Elevation is expressed in degrees { + AUTO_TRACE("SRTMinorServoBossCore::preset()"); + + checkControl(); + checkEmergency(); + + if(m_ready == Management::MNG_FALSE) + { + _EXCPT(MinorServoErrors::PositioningErrorExImpl, impl, "SRTMinorServoBossCore::preset()"); + throw impl; + } + ACSErr::Completion_var comp; - return m_component->control()->get_sync(comp.out()) == MinorServo::CONTROL_DISCOS ? true : false; + + for(const auto& [name, servo] : m_servos) + { + std::vector coordinates; + + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->preset(*servo->calcCoordinates(elevation)); + } + } +} + +void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) +{ + AUTO_TRACE("SRTMinorServoBossCore::clearUserOffsets()"); + + checkControl(); + checkEmergency(); + + std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + + try + { + m_servos.at(servo_name)->clearUserOffsets(); + } + catch(std::out_of_range& ex) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::clearUserOffsets()"); + throw impl; + } +} + +void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double offset) +{ + AUTO_TRACE("SRTMinorServoBossCore::setUserOffset()"); + + checkControl(); + checkEmergency(); + + std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); + + std::stringstream ss(servo_axis_name); + std::string servo_name, axis_name; + std::getline(ss, servo_name, '_'); + ss >> axis_name; + + try + { + m_servos.at(servo_name)->setUserOffset(axis_name.c_str(), offset); + } + catch(std::out_of_range& ex) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::setUserOffsets()"); + throw impl; + } +} + +std::vector SRTMinorServoBossCore::getUserOffsets() +{ + AUTO_TRACE("SRTMinorServoBossCore::getUserOffsets()"); + + std::vector user_offsets; + + ACSErr::Completion_var comp; + for(const auto& servo_name : MinorServo::ServoOrder) + { + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + ACS::doubleSeq* servo_offsets = servo->getUserOffsets(); + std::vector offsets(servo_offsets->get_buffer(), servo_offsets->get_buffer() + servo_offsets->length()); + user_offsets.insert(user_offsets.end(), offsets.begin(), offsets.end()); + } + } + + return user_offsets; +} + +void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) +{ + AUTO_TRACE("SRTMinorServoBossCore::clearSystemOffsets()"); + + checkControl(); + checkEmergency(); + + std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + + try + { + m_servos.at(servo_name)->clearSystemOffsets(); + } + catch(std::out_of_range& ex) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::clearSystemOffsets()"); + throw impl; + } +} + +void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double offset) +{ + AUTO_TRACE("SRTMinorServoBossCore::setSystemOffset()"); + + checkControl(); + checkEmergency(); + + std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); + + std::stringstream ss(servo_axis_name); + std::string servo_name, axis_name; + std::getline(ss, servo_name, '_'); + ss >> axis_name; + + try + { + m_servos.at(servo_name)->setSystemOffset(axis_name.c_str(), offset); + } + catch(std::out_of_range& ex) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::setSystemOffsets()"); + throw impl; + } +} + +std::vector SRTMinorServoBossCore::getSystemOffsets() +{ + AUTO_TRACE("SRTMinorServoBossCore::getSystemOffsets()"); + + std::vector system_offsets; + + ACSErr::Completion_var comp; + for(const auto& servo_name : MinorServo::ServoOrder) + { + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + ACS::doubleSeq* servo_offsets = servo->getSystemOffsets(); + std::vector offsets(servo_offsets->get_buffer(), servo_offsets->get_buffer() + servo_offsets->length()); + system_offsets.insert(system_offsets.end(), offsets.begin(), offsets.end()); + } + } + + return system_offsets; +} + +void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +{ + AUTO_TRACE("SRTMinorServoBossCore::getAxesInfo()"); + + std::vector axes_names_vector, axes_units_vector; + + unsigned int length = 0; + ACS::stringSeq_var axes_names_var = new ACS::stringSeq; + ACS::stringSeq_var axes_units_var = new ACS::stringSeq; + + ACSErr::Completion_var comp; + for(const auto& servo_name : MinorServo::ServoOrder) + { + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + ACS::stringSeq_var servo_axes_names; + ACS::stringSeq_var servo_axes_units; + servo->getAxesInfo(servo_axes_names, servo_axes_units); + + unsigned int index = length; + unsigned int servo_length = (unsigned int)servo->virtual_axes()->get_sync(comp.out()); + length += servo_length; + axes_names_var->length(length); + axes_units_var->length(length); + + for(size_t i = 0; i < servo_length; i++, index++) + { + axes_names_var[index] = std::string(servo_name + "_" + (const char*)servo_axes_names[i]).c_str(); + axes_units_var[index] = servo_axes_units[i]; + } + } + } + + axes_names = axes_names_var._retn(); + axes_units = axes_units_var._retn(); +} + +bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters) +{ + AUTO_TRACE("SRTMinorServoBossCore::checkScan()"); + + checkControl(); + checkEmergency(); + + std::cout << "checkScan" << std::endl << std::endl; + std::cout << "now: " << CIRATools::getUNIXEpoch() << std::endl; + + std::cout << "Scan info:" << std::endl; + std::cout << "start time: " << CIRATools::ACSTime2UNIXEpoch(start_time) << std::endl; + std::cout << "empty: " << std::boolalpha << scan_info.is_empty_scan << std::endl; + std::cout << "span: " << scan_info.range << std::endl; + std::cout << "total time: " << (int)scan_info.total_time << std::endl; + std::cout << "axis code: " << std::string(scan_info.axis_code) << std::endl << std::endl; + + std::cout << "Antenna info:" << std::endl; + std::cout << "target name: " << std::string(antenna_info.targetName) << std::endl; + std::cout << "azimuth: " << antenna_info.azimuth << std::endl; + std::cout << "elevation: " << antenna_info.elevation << std::endl; + std::cout << "right ascension: " << antenna_info.rightAscension << std::endl; + std::cout << "declination: " << antenna_info.declination << std::endl; + std::cout << "start time: " << CIRATools::ACSTime2UNIXEpoch(antenna_info.startEpoch) << std::endl; + std::cout << "on the fly: " << std::boolalpha << antenna_info.onTheFly << std::endl; + std::cout << "slewing time: " << antenna_info.slewingTime << std::endl; + std::cout << "azimuth section: " << antenna_info.section << std::endl; + std::cout << "scan axis: " << antenna_info.axis << std::endl; + std::cout << "stop time: " << CIRATools::ACSTime2UNIXEpoch(antenna_info.timeToStop) << std::endl; + + MinorServo::TRunTimeParameters_var ms_param_var = new MinorServo::TRunTimeParameters; + ms_param_var->onTheFly = false; + ms_param_var->startEpoch = 0; + ms_param_var->centerScan = 0; + ms_param_var->scanAxis = CORBA::string_dup(""); + ms_param_var->timeToStop = 0; + ms_parameters = ms_param_var._retn(); + + if(scan_info.is_empty_scan && m_ready == Management::MNG_FALSE) + { + return true; + } + + return true; +} + +void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +{ + AUTO_TRACE("SRTMinorServoBossCore::startScan()"); + + checkControl(); + checkEmergency(); + + std::cout << "startScan" << std::endl; + + // Start the tracking thread + if(m_tracking_thread != NULL) + { + m_tracking_thread->restart(); + } + else + { + try + { + m_tracking_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoTrackingThread", m_component->m_core); + } + catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + m_subsystem_status = Management::MNG_FAILURE; + _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::startScan()"); + impl.setThreadName("SRTMinorServoTrackingThread"); + throw impl; + } + + m_tracking_thread->resume(); + } +} + +void SRTMinorServoBossCore::closeScan(ACS::Time& close_time) +{ + AUTO_TRACE("SRTMinorServoBossCore::closeScan()"); + + checkControl(); + checkEmergency(); + + std::cout << "closeScan" << std::endl; +} + +void SRTMinorServoBossCore::checkControl() +{ + ACSErr::Completion_var comp; + if(m_component->control()->get_sync(comp.out()) != MinorServo::CONTROL_DISCOS) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, "SRTMinorServoBossCore::checkControl()"); + impl.setReason("MinorServo system is not controlled by DISCOS!"); + throw impl; + } +} + +void SRTMinorServoBossCore::checkEmergency() +{ + ACSErr::Completion_var comp; + if(m_component->emergency()->get_sync(comp.out()) == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, "SRTMinorServoBossCore::checkEmergency()"); + impl.setReason("MinorServo system in emergency status!"); + throw impl; + } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 18aa0cf50..2725aec94 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -3,10 +3,22 @@ using namespace maci; using namespace SimpleParser; +_IRA_LOGFILTER_DECLARE; + SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : CharacteristicComponentImpl(componentName, containerServices), m_core(NULL), m_parser(NULL), + m_status_ptr(this), + m_ready_ptr(this), + m_actual_setup_ptr(this), + m_motion_info_ptr(this), + m_starting_ptr(this), + m_as_configuration_ptr(this), + m_elevation_tracking_ptr(this), + m_scan_active_ptr(this), + m_scanning_ptr(this), + m_tracking_ptr(this), m_current_configuration_ptr(this), m_simulation_enabled_ptr(this), m_plc_time_ptr(this), @@ -37,13 +49,80 @@ SRTMinorServoBossImpl::~SRTMinorServoBossImpl() void SRTMinorServoBossImpl::initialize() { AUTO_TRACE("SRTMinorServoBossImpl::initialize()"); + _IRA_LOGFILTER_ACTIVATE(200000000, 500000000); m_core = new SRTMinorServoBossCore(this); + IRA::CString string_buffer; + if(!IRA::CIRATools::getDBValue(getContainerServices(), "active_surface_configuration", string_buffer)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setFieldName("active_surface_configuration"); + throw impl; + } + else + { + std::string active_surface_configuration(string_buffer); + + if(active_surface_configuration == "ON") + { + m_core->m_as_configuration = Management::MNG_TRUE; + } + else if(active_surface_configuration == "OFF") + { + m_core->m_as_configuration = Management::MNG_FALSE; + } + else + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setFieldName("active_surface_configuration"); + impl.addData("Reason", "Value should be 'ON' or 'OFF'"); + throw impl; + } + } + + if(!IRA::CIRATools::getDBValue(getContainerServices(), "elevation_tracking_enabled", string_buffer)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setFieldName("elevation_tracking_enabled"); + throw impl; + } + else + { + std::string elevation_tracking_enabled(string_buffer); + + if(elevation_tracking_enabled == "ON") + { + m_core->m_elevation_tracking_enabled = Management::MNG_TRUE; + } + else if(elevation_tracking_enabled == "OFF") + { + m_core->m_elevation_tracking_enabled = Management::MNG_FALSE; + } + else + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setFieldName("elevation_tracking_enabled"); + impl.addData("Reason", "Value should be 'ON' or 'OFF'"); + throw impl; + } + } + try { std::string component_name = getContainerServices()->getName().c_str(); + m_status_ptr = new ROEnumImpl((component_name + ":status").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_subsystem_status), true); + m_ready_ptr = new ROEnumImpl((component_name + ":ready").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_ready), true); + m_actual_setup_ptr = new baci::ROstring((component_name + ":actualSetup").c_str(), getComponent(), new MSGenericDevIO(&m_core->m_actual_setup), true); + m_motion_info_ptr = new baci::ROstring((component_name + ":motionInfo").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_motion_status), true); + m_starting_ptr = new ROEnumImpl((component_name + ":starting").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_starting), true); + m_as_configuration_ptr = new ROEnumImpl((component_name + ":asConfiguration").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_as_configuration), true); + m_elevation_tracking_ptr = new ROEnumImpl((component_name + ":elevationTrack").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_elevation_tracking_enabled), true); + m_scan_active_ptr = new ROEnumImpl((component_name + ":scanActive").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_scan_active), true); + m_scanning_ptr = new ROEnumImpl((component_name + ":scanning").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_scanning), true); + m_tracking_ptr = new ROEnumImpl((component_name + ":tracking").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_tracking), true); + SRTMinorServoDevIOInfo dev_io_info; dev_io_info.secure_area = m_core->m_status_secure_area; @@ -53,7 +132,7 @@ void SRTMinorServoBossImpl::initialize() dev_io_info.property_name = "simulation_enabled"; dev_io_info.property_fields = std::vector{ "SIMULATION_ENABLED" }; - m_simulation_enabled_ptr = new baci::ROboolean((component_name + ":simulation_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_simulation_enabled_ptr = new ROEnumImpl((component_name + ":simulation_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "plc_time"; dev_io_info.property_fields = std::vector{ "PLC_TIME" }; @@ -69,11 +148,11 @@ void SRTMinorServoBossImpl::initialize() dev_io_info.property_name = "power"; dev_io_info.property_fields = std::vector{ "POWER" }; - m_power_ptr = new baci::ROboolean((component_name + ":power").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_power_ptr = new ROEnumImpl((component_name + ":power").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "emergency"; dev_io_info.property_fields = std::vector{ "EMERGENCY" }; - m_emergency_ptr = new baci::ROboolean((component_name + ":emergency").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_emergency_ptr = new ROEnumImpl((component_name + ":emergency").c_str(), getComponent(), new MSDevIO(dev_io_info), true); dev_io_info.property_name = "gregorian_cover"; dev_io_info.property_fields = std::vector{ "GREGORIAN_CAP" }; @@ -97,29 +176,30 @@ void SRTMinorServoBossImpl::initialize() m_parser->add("setServoOffset", new function2, I >(this, &SRTMinorServoBossImpl::setOffsets), 2); m_parser->add("clearServoOffsets", new function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); - //m_GFR = getContainerServices()->getComponent("MINORSERVO/GFR"); - //m_SRP = getContainerServices()->getComponent("MINORSERVO/SRP"); - try { double status_thread_period; if(!IRA::CIRATools::getDBValue(getContainerServices(), "status_thread_period", status_thread_period)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoBossImpl::initialize()"); - exImpl.setFieldName("status_thread_period"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setFieldName("status_thread_period"); + throw impl; } - m_status_thread = getContainerServices()->getThreadManager()->create("SRTMinorServoBossImplStatusThread", m_core); + m_status_thread = getContainerServices()->getThreadManager()->create("SRTMinorServoStatusThread", m_core); m_status_thread->setSleepTime(status_thread_period * 10000000); m_status_thread->resume(); } catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) { - _THROW_EXCPT(ComponentErrors::ThreadErrorExImpl, "SRTMinorServoBossImpl::initialize()"); + _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.setThreadName("SRTMinorServoStatusThread"); + throw impl; } catch(...) { - _THROW_EXCPT(ComponentErrors::UnexpectedExImpl, "SRTMinorServoBossImpl::initialize()"); + _EXCPT(ComponentErrors::UnexpectedExImpl, impl, "SRTMinorServoBossImpl::initialize()"); + impl.addData("Reason", "Encountered an unexpected error when starting the SRTMinorServoStatusThread!"); + throw impl; } } @@ -139,6 +219,8 @@ void SRTMinorServoBossImpl::cleanUp() m_status_thread->terminate(); } + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::cleanUp(); } @@ -153,6 +235,8 @@ void SRTMinorServoBossImpl::aboutToAbort() m_status_thread->terminate(); } + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::aboutToAbort(); } @@ -168,14 +252,173 @@ void SRTMinorServoBossImpl::park() m_core->park(); } -void SRTMinorServoBossImpl::setElevationTracking(const char* value) +CORBA::Boolean SRTMinorServoBossImpl::isElevationTrackingEn() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isElevationTrackingEn()"); + return m_core->m_elevation_tracking_enabled == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isElevationTracking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isElevationTracking()"); + return m_core->m_elevation_tracking == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isTracking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isTracking()"); + return m_core->m_tracking == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isStarting() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isStarting()"); + return m_core->m_starting == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isASConfiguration() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isASConfiguration()"); + return m_core->m_as_configuration == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isParking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isParking()"); + return (m_core->m_starting == Management::MNG_TRUE && m_core->m_commanded_configuration == MinorServo::CONFIGURATION_PARK); +} + +CORBA::Boolean SRTMinorServoBossImpl::isReady() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isReady()"); + return m_core->m_ready == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isScanning() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isScanning()"); + return m_core->m_scanning == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isScanActive() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isScanActive()"); + return m_core->m_scan_active == Management::MNG_TRUE ? true : false; +} + +char* SRTMinorServoBossImpl::getActualSetup() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getActualSetup()"); + return CORBA::string_dup(m_core->m_actual_setup.c_str()); +} + +char* SRTMinorServoBossImpl::getCommandedSetup() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getCommandedSetup()"); + return CORBA::string_dup(m_core->m_commanded_setup.c_str()); +} + +CORBA::Double SRTMinorServoBossImpl::getCentralScanPosition() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getCentralScanPosition()"); + return 0.0; +} + +void SRTMinorServoBossImpl::clearUserOffset(const char* servo_name) +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearUserOffset()"); + m_core->clearUserOffsets(std::string(servo_name)); +} + +void SRTMinorServoBossImpl::setUserOffset(const char* servo_axis_name, CORBA::Double offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setUserOffset()"); + m_core->setUserOffset(std::string(servo_axis_name), (double)offset); +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getUserOffset() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getUserOffset()"); + + std::vector userOffsets = m_core->getUserOffsets(); + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(userOffsets.size()); + for(size_t i = 0; i < userOffsets.size(); i++) + { + offsets[i] = userOffsets[i]; + } + return offsets._retn(); +} + +void SRTMinorServoBossImpl::clearSystemOffset(const char* servo_name) +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearSystemOffset()"); + m_core->clearSystemOffsets(std::string(servo_name)); +} + +void SRTMinorServoBossImpl::setSystemOffset(const char* servo_axis_name, CORBA::Double offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setSystemOffset()"); + m_core->setSystemOffset(std::string(servo_axis_name), (double)offset); +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getSystemOffset() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getSystemOffset()"); + + std::vector systemOffsets = m_core->getSystemOffsets(); + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(systemOffsets.size()); + for(size_t i = 0; i < systemOffsets.size(); i++) + { + offsets[i] = systemOffsets[i]; + } + return offsets._retn(); +} + +void SRTMinorServoBossImpl::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +{ + AUTO_TRACE("SRTMinorServoBossImpl::getAxesInfo()"); + m_core->getAxesInfo(axes_names, axes_units); +} + +char* SRTMinorServoBossImpl::getScanAxis() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getScanAxis()"); + + if(isScanActive()) + { + return CORBA::string_dup(""); + } + else + { + return CORBA::string_dup(""); + } +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getAxesPosition(ACS::Time) +{ + AUTO_TRACE("SRTMinorServoBossImpl::getAxesPosition()"); + + ACS::doubleSeq_var positions = new ACS::doubleSeq; + positions->length(3); + for(size_t i = 0; i < 3; i++) + { + positions[i] = 0; + } + return positions._retn(); +} + +void SRTMinorServoBossImpl::setElevationTracking(const char* configuration) { AUTO_TRACE("SRTMinorServoBossImpl::setElevationTracking()"); + m_core->setElevationTracking(std::string(configuration)); } -void SRTMinorServoBossImpl::setASConfiguration(const char* value) +void SRTMinorServoBossImpl::setASConfiguration(const char* configuration) { AUTO_TRACE("SRTMinorServoBossImpl::setASConfiguration()"); + m_core->setASConfiguration(std::string(configuration)); } void SRTMinorServoBossImpl::setOffsets(const char* axis_code, const double& offset) @@ -186,20 +429,37 @@ void SRTMinorServoBossImpl::setOffsets(const char* axis_code, const double& offs void SRTMinorServoBossImpl::clearOffsets() { AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); - // Loop through servos and clear their offsets + + for(const auto& [name, servo] : m_core->m_servos) + { + m_core->clearUserOffsets(name); + // Not sure about the following + //m_core->clearSystemOffsets(name); + } +} + +CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters) +{ + AUTO_TRACE("SRTMinorServoBossImpl::checkScan()"); + return m_core->checkScan(start_time, scan_info, antenna_info, ms_parameters); } -CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time startingTime, const MinorServo::MinorServoScan &scan, const Antenna::TRunTimeParameters &antennaInfo, MinorServo::TRunTimeParameters_out msParameters) +void SRTMinorServoBossImpl::startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) { - return true; + AUTO_TRACE("SRTMinorServoBossImpl::startScan()"); + m_core->startScan(start_time, scan_info, antenna_info); } -void SRTMinorServoBossImpl::startScan(ACS::Time &startingTime, const MinorServo::MinorServoScan &scan, const Antenna::TRunTimeParameters &antennaInfo) +void SRTMinorServoBossImpl::closeScan(ACS::Time& close_time) { + AUTO_TRACE("SRTMinorServoBossImpl::closeScan()"); + m_core->closeScan(close_time); } -void SRTMinorServoBossImpl::closeScan(ACS::Time &timeToStop) +void SRTMinorServoBossImpl::preset(double elevation) { + AUTO_TRACE("SRTMinorServoBossImpl::preset()"); + m_core->preset(elevation); } CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out answer) @@ -229,20 +489,31 @@ CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out } catch(...) { - ACS_SHORT_LOG((LM_WARNING, "SRTMinorServoBoss::command(): unknown exception.")); + ACS_SHORT_LOG((LM_WARNING, "SRTMinorServoBossImpl::command(): unknown exception.")); res = false; } answer = CORBA::string_dup((const char *)out); return res; } +GET_PROPERTY_REFERENCE(Management::ROTSystemStatus, m_status_ptr, status) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_ready_ptr, ready) +GET_PROPERTY_REFERENCE(ACS::ROstring, m_actual_setup_ptr, actualSetup) +GET_PROPERTY_REFERENCE(ACS::ROstring, m_motion_info_ptr, motionInfo) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_starting_ptr, starting) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_as_configuration_ptr, asConfiguration) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_elevation_tracking_ptr, elevationTrack) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_scan_active_ptr, scanActive) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_scanning_ptr, scanning) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_tracking_ptr, tracking) + GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoFocalConfiguration, m_current_configuration_ptr, current_configuration); -GET_PROPERTY_REFERENCE(ACS::ROboolean, m_simulation_enabled_ptr, simulation_enabled); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_simulation_enabled_ptr, simulation_enabled); GET_PROPERTY_REFERENCE(ACS::ROdouble, m_plc_time_ptr, plc_time); GET_PROPERTY_REFERENCE(ACS::ROstring, m_plc_version_ptr, plc_version); GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoControlStatus, m_control_ptr, control); -GET_PROPERTY_REFERENCE(ACS::ROboolean, m_power_ptr, power); -GET_PROPERTY_REFERENCE(ACS::ROboolean, m_emergency_ptr, emergency); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_power_ptr, power); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_emergency_ptr, emergency); GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoGregorianCoverStatus, m_gregorian_cover_ptr, gregorian_cover); GET_PROPERTY_REFERENCE(ACS::ROdouble, m_last_executed_command_ptr, last_executed_command); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index ab252745f..747c59c93 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -16,6 +16,10 @@ SRTMinorServoParkThread::~SRTMinorServoParkThread() void SRTMinorServoParkThread::onStart() { AUTO_TRACE(m_thread_name + "::onStart()"); + this->setSleepTime(500000); // 50 milliseconds + m_start_time = CIRATools::getUNIXEpoch(); + + m_status = 0; } void SRTMinorServoParkThread::onStop() @@ -23,37 +27,66 @@ void SRTMinorServoParkThread::onStop() AUTO_TRACE(m_thread_name + "::onStop()"); } -void SRTMinorServoParkThread::run() +void SRTMinorServoParkThread::runLoop() { - AUTO_TRACE(m_thread_name + "::run()"); - ACSErr::Completion_var comp; - double start_time = CIRATools::getUNIXEpoch(); + AUTO_TRACE(m_thread_name + "::runLoop()"); + + try + { + m_core->checkControl(); + m_core->checkEmergency(); + } + catch(MinorServoErrors::StatusErrorExImpl& ex) + { + ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + this->setStopped(); + return; + } - while(true) + if(CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) { - // First we check if the gregorian cover has closed - bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == MinorServo::COVER_STATUS_CLOSED ? true : false; + m_core->m_starting = Management::MNG_FALSE; + m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_core->m_subsystem_status = Management::MNG_FAILURE; + ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, "Timeout while performing a park operation.")); + this->setStopped(); + } - // Then we cycle through all the servos and make sure their operative mode is STOP - if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool - { - ACSErr::Completion_var comp; - return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; - })) + ACSErr::Completion_var comp; + + switch(m_status) + { + case 0: { + // First we check if the gregorian cover has closed + bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == MinorServo::COVER_STATUS_CLOSED ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is STOP + if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + })) + { + m_status = 1; + } + break; } - - if(CIRATools::getUNIXEpoch() - start_time >= PARK_TIMEOUT) + case 1: { - m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; - m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - return; - } + for(const auto& [name, servo] : m_core->m_servos) + { + servo->setup(""); + } - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } + m_core->m_actual_setup = m_core->m_commanded_setup; + m_core->m_starting = Management::MNG_FALSE; - m_core->m_current_configuration = MinorServo::CONFIGURATION_PARK; - m_core->m_boss_status = MinorServo::BOSS_STATUS_CONFIGURED; + m_core->m_subsystem_status = Management::MNG_OK; + m_core->m_motion_status = MinorServo::MOTION_STATUS_PARK; + this->setStopped(); + break; + } + } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 23a912897..21fc71927 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -16,6 +16,13 @@ SRTMinorServoSetupThread::~SRTMinorServoSetupThread() void SRTMinorServoSetupThread::onStart() { AUTO_TRACE(m_thread_name + "::onStart()"); + this->setSleepTime(500000); // 50 milliseconds + m_start_time = CIRATools::getUNIXEpoch(); + + MinorServo::SRTMinorServoFocalConfiguration commanded_configuration = m_core->m_commanded_configuration; + m_LDO_configuration = MinorServo::LDOConfigurationNameTable.left.at(commanded_configuration); + m_gregorian_cover_position = commanded_configuration == MinorServo::CONFIGURATION_PRIMARY ? MinorServo::COVER_STATUS_CLOSED : MinorServo::COVER_STATUS_OPEN; + m_status = 0; } void SRTMinorServoSetupThread::onStop() @@ -23,89 +30,106 @@ void SRTMinorServoSetupThread::onStop() AUTO_TRACE(m_thread_name + "::onStop()"); } -void SRTMinorServoSetupThread::run() +void SRTMinorServoSetupThread::runLoop() { - AUTO_TRACE(m_thread_name + "::run()"); - double start_time = CIRATools::getUNIXEpoch(); - std::string configuration_name = m_core->m_focal_configurations_table.right.at(m_core->m_requested_configuration); - MinorServo::SRTMinorServoGregorianCoverStatus gregorian_cover_position = m_core->m_requested_configuration == MinorServo::CONFIGURATION_PRIMARY ? MinorServo::COVER_STATUS_CLOSED : MinorServo::COVER_STATUS_OPEN; - ACSErr::Completion_var comp; + AUTO_TRACE(m_thread_name + "::runLoop()"); - // Check if all the servos stopped - while(!std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool - { - ACSErr::Completion_var comp; - return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; - })) + try { - if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) - { - m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; - m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - return; - } - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); + m_core->checkControl(); + m_core->checkEmergency(); } - - // Send the SETUP command - if(std::get(m_core->m_socket->sendCommand(SRTMinorServoCommandLibrary::setup(configuration_name))["OUTPUT"]) != "GOOD") + catch(MinorServoErrors::StatusErrorExImpl& ex) { - _THROW_EXCPT(MinorServoErrors::SetupErrorExImpl, "SRTMinorServoBossCore::setup()"); + ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + this->setStopped(); + return; } - // Wait for the system to show the commanded configuration - while(m_core->m_component->current_configuration()->get_sync(comp.out()) != m_core->m_current_configuration) + if(CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) { - if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) - { - m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; - m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - return; - } - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); + m_core->m_starting = Management::MNG_FALSE; + m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_core->m_subsystem_status = Management::MNG_FAILURE; + ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, "Timeout while performing a setup operation.")); + this->setStopped(); } - // Wait for the whole system to reach the desired configuration - while(true) + ACSErr::Completion_var comp; + + switch(m_status) { - // First we check the status of the gregorian cover - bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == gregorian_cover_position ? true : false; + case 0: // Check if all the servos stopped + { + if(std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + })) + { + // Move to phase 1 + m_status = 1; + } - // Then we cycle through all the servos and make sure their operative mode is SETUP - if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const MinorServo::SRTBaseMinorServo_ptr& servo) -> bool + break; + } + case 1: // Send the SETUP command { - ACSErr::Completion_var comp; - return servo->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_SETUP ? true : false; - })) + if(std::get(m_core->m_socket->sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration))["OUTPUT"]) != "GOOD") + { + m_core->m_starting = Management::MNG_FALSE; + m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; + m_core->m_subsystem_status = Management::MNG_FAILURE; + this->setStopped(); + } + else + { + m_status = 2; + } + + break; + } + case 2: // Wait for the system to show the commanded configuration { + if(m_core->m_component->current_configuration()->get_sync(comp.out()) == m_core->m_commanded_configuration) + { + m_status = 3; + } + break; } + case 3: // Wait for the whole system to reach the desired configuration + { + // First we check the status of the gregorian cover + bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is SETUP + if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_SETUP ? true : false; + })) + { + m_status = 4; + } - if(CIRATools::getUNIXEpoch() - start_time >= SETUP_TIMEOUT) + break; + } + case 4: // Finally load the servos coefficients { - m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; - m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - return; + m_core->m_actual_setup = m_core->m_commanded_setup; + + for(const auto& [name, servo] : m_core->m_servos) + { + servo->setup(m_core->m_actual_setup.c_str()); + } + + m_core->m_starting = Management::MNG_FALSE; + m_core->m_ready = Management::MNG_TRUE; + m_core->m_subsystem_status = Management::MNG_OK; + m_core->m_motion_status = m_core->m_elevation_tracking_enabled == Management::MNG_TRUE ? MinorServo::MOTION_STATUS_TRACKING : MinorServo::MOTION_STATUS_CONFIGURED; + this->setStopped(); + break; } - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); } - - if(m_core->m_component->current_configuration()->get_sync(comp.out()) != m_core->m_requested_configuration) - { - m_core->m_boss_status = MinorServo::BOSS_STATUS_ERROR; - m_core->m_current_configuration = MinorServo::CONFIGURATION_UNKNOWN; - return; - } - - // Finally load the servos coefficients - for(auto& servo : m_core->m_servos) - { - servo->setup(configuration_name.c_str()); - } - - m_core->m_current_configuration = m_requested_configuration; - m_core->m_boss_status = MinorServo::BOSS_STATUS_CONFIGURED; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp index 2bb4529fb..d68f74ed6 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp @@ -10,9 +10,9 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, in { if(m_instance->m_address != ip_address && m_instance->m_port != port) { - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::getInstance(std::string, int)"); - exImpl.addData("Reason", "Socket already open on '" + m_instance->m_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); + impl.addData("Reason", "Socket already open on '" + m_instance->m_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object."); + throw impl; } } else @@ -28,9 +28,9 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance() if(m_instance == nullptr) { - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::getInstance()"); - exImpl.addData("Reason", "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); + impl.addData("Reason", "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + throw impl; } return *m_instance; } @@ -49,27 +49,27 @@ SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, doubl if(Create(m_error, STREAM) == FAIL) { Close(m_error); - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); - exImpl.addData("Reason", "Cannot create the socket."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.addData("Reason", "Cannot create the socket."); + throw impl; } if(Connect(m_error, ip_address.c_str(), port) == FAIL) { m_socket_status = TOUT; Close(m_error); - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); - exImpl.addData("Reason", "Cannot connect the socket."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.addData("Reason", "Cannot connect the socket."); + throw impl; } if(setSockMode(m_error, NONBLOCKING) != SUCCESS) { m_socket_status = NOTRDY; Close(m_error); - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::SRTMinorServoSocket()"); - exImpl.addData("Reason", "Cannot set the socket to non-blocking."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.addData("Reason", "Cannot set the socket to non-blocking."); + throw impl; } m_address = ip_address; @@ -104,9 +104,9 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std { m_socket_status = TOUT; Close(m_error); - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); - exImpl.addData("Reason", "Timeout when sending command."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.addData("Reason", "Timeout when sending command."); + throw impl; } } @@ -127,9 +127,9 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std { m_socket_status = TOUT; Close(m_error); - ComponentErrors::SocketErrorExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocket::sendCommand()"); - exImpl.addData("Reason", "Timeout when receiving answer."); - throw exImpl; + _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.addData("Reason", "Timeout when receiving answer."); + throw impl; } } SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); @@ -158,18 +158,18 @@ SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::Contain IRA::CString _ip_address; if(!IRA::CIRATools::getDBValue(containerServices, "IPAddress", _ip_address, CONFIG_DOMAIN, CONFIG_DIRNAME)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); - exImpl.setFieldName("IPAddress"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("IPAddress"); + throw impl; } m_ip_address = (std::string)_ip_address; DWORD port; if(!IRA::CIRATools::getDBValue(containerServices, "Port", port, CONFIG_DOMAIN, CONFIG_DIRNAME)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); - exImpl.setFieldName("Port"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("Port"); + throw impl; } else { @@ -178,9 +178,9 @@ SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::Contain if(!IRA::CIRATools::getDBValue(containerServices, "SocketTimeout", m_timeout, CONFIG_DOMAIN, CONFIG_DIRNAME)) { - ComponentErrors::CDBAccessExImpl exImpl(__FILE__, __LINE__, "SRTMinorServoSocketConfiguration()"); - exImpl.setFieldName("SocketTimeout"); - throw exImpl; + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("SocketTimeout"); + throw impl; } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp index 34931063c..6c734306d 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -35,7 +35,7 @@ void SRTMinorServoStatusThread::runLoop() m_core->status(); - for(auto& servo : m_core->m_servos) + for(const auto& [name, servo] : m_core->m_servos) { servo->status(); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp new file mode 100644 index 000000000..179800db3 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -0,0 +1,159 @@ +#include "SRTMinorServoTrackingThread.h" + +SRTMinorServoTrackingThread::SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): + ACS::Thread(name, responseTime, sleepTime), + m_core(core) +{ + m_thread_name = std::string(name.c_str()); + AUTO_TRACE(m_thread_name + "::SRTMinorServoTrackingThread()"); +} + +SRTMinorServoTrackingThread::~SRTMinorServoTrackingThread() +{ + AUTO_TRACE(m_thread_name + "::~SRTMinorServoTrackingThread()"); +} + +void SRTMinorServoTrackingThread::onStart() +{ + AUTO_TRACE(m_thread_name + "::onStart()"); + resetTracking(); + m_antennaBoss = Antenna::AntennaBoss::_nil(); +} + +void SRTMinorServoTrackingThread::onStop() +{ + AUTO_TRACE(m_thread_name + "::onStop()"); +} + +void SRTMinorServoTrackingThread::runLoop() +{ + AUTO_TRACE(m_thread_name + "::runLoop()"); + + try + { + m_core->checkControl(); + m_core->checkEmergency(); + } + catch(MinorServoErrors::StatusErrorExImpl& ex) + { + ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + this->setStopped(); + return; + } + + if(m_core->m_elevation_tracking_enabled == Management::MNG_FALSE) + { + // We get here if the tracking was disabled while already tracking, we stop + this->setStopped(); + return; + } + + if(m_core->m_motion_status != MinorServo::MOTION_STATUS_TRACKING || m_core->m_subsystem_status != Management::MNG_OK) + { + // System is not ready or configured for tracking, reset the tracking + resetTracking(); + return; + } + + if(CORBA::is_nil(m_antennaBoss)) + { + try + { + m_antennaBoss = m_core->m_component->getContainerServices()->getComponent("ANTENNA/Boss"); + } + catch(maciErrType::CannotGetComponentExImpl& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoTrackingThread::runLoop()", "cannot get the AntennaBoss component!"); + resetTracking(); + return; + } + } + + if(m_point_id == 0) + { + m_point_time = CIRATools::getUNIXEpoch() + TRACKING_FUTURE_TIME; + m_trajectory_id = int(m_point_time); + } + else + { + if(std::all_of(m_core->m_tracking_servos.begin(), m_core->m_tracking_servos.end(), [this](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_PROGRAMTRACK ? true : false; + if(!return_value) + { + _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str()); + } + return return_value; + } + else + { + return true; + } + })) + { + m_core->m_tracking = Management::MNG_TRUE; + } + else + { + resetTracking(); + return; + } + } + + ACSErr::Completion_var comp; + + bool tracking_error = false; + + for(const auto& [servo_name, servo] : m_core->m_tracking_servos) + { + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_id == 0 ? m_point_time : 0, *servo->calcCoordinates(getElevation(m_point_time))); + } + catch(MinorServoErrors::CommunicationErrorExImpl& ex) + { + _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo_name + ": received NAK while sending the tracking point!").c_str()); + tracking_error = true; + } + catch(ComponentErrors::SocketErrorEx& ex) + { + _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo_name + ": error encountered while sending the tracking point!").c_str()); + tracking_error = true; + } + } + } + + if(tracking_error) + { + resetTracking(); + return; + } + + m_point_id++; + m_point_time += TRACKING_TIMEGAP; + + unsigned long time_to_sleep = ((m_point_time - TRACKING_FUTURE_TIME) - CIRATools::getUNIXEpoch()) * 10000000; + this->setSleepTime(time_to_sleep); +} + +void SRTMinorServoTrackingThread::resetTracking() +{ + this->setSleepTime(500000); // 50 milliseconds + m_point_id = 0; + m_point_time = 0; + m_core->m_tracking = Management::MNG_FALSE; +} + +double SRTMinorServoTrackingThread::getElevation(double time) +{ + AUTO_TRACE(m_thread_name + "::getElevation()"); + + double azimuth, elevation; + m_antennaBoss->getRawCoordinates(CIRATools::UNIXEpoch2ACSTime(time), azimuth, elevation); + return elevation * DR2D; +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index 4a24df7cd..4f07f339d 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -18,16 +18,20 @@ void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORB if(virtual_coordinates.length() != m_virtual_axes) { - //Wrong number of virtual_coordinates + _EXCPT(MinorServoErrors::TrackingErrorExImpl, impl, (m_servo_name + "::programTrack()").c_str()); + impl.addData("Reason", "Wrong number of values for this servo system!"); + throw impl; } - std::vector coords(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coords, start_time)); + SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coordinates, start_time)); if(std::get(answer["OUTPUT"]) != "GOOD") { - std::cout << "Cannot execute programTrack" << std::endl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::programTrack()").c_str()); + impl.setReason("Received NAK in response to a PRESET command!"); + throw impl; } } -- GitLab From eec1ab5f4d420a8027091b336d790b24109ca832 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 3 Jan 2024 14:03:09 +0000 Subject: [PATCH 048/150] Added setTsysRange to Skarab The setTsysRange method is only present in the centos_7_compatibility branch for the moment, so the Skarab component was missing the method since it was ported from the master branch only lately --- Common/Servers/Skarab/include/SkarabImpl.h | 10 ++++++++++ Common/Servers/Skarab/src/SkarabImpl.cpp | 23 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/Common/Servers/Skarab/include/SkarabImpl.h b/Common/Servers/Skarab/include/SkarabImpl.h index afba54519..6a0ddb6f5 100644 --- a/Common/Servers/Skarab/include/SkarabImpl.h +++ b/Common/Servers/Skarab/include/SkarabImpl.h @@ -352,6 +352,16 @@ public: * @param att new attenuation level, It could be in the range 0-15. A negative will keep the previous value. */ virtual void setAttenuation(CORBA::Long input,CORBA::Double att) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + /** + * This method is used to set a range in the bandwith of the backend where calculate the Tsys. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @throw BackendsErrors::BackendsErrorsEx + * @param freq starting frequency. + * @param bw bandwidth interval. + */ + virtual void setTsysRange(CORBA::Double freq,CORBA::Double bw) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); /** * In order to get the inputs definition in just one call. The returned argument contains the configuration sequentially, the first element corresponds to the first input and so on. diff --git a/Common/Servers/Skarab/src/SkarabImpl.cpp b/Common/Servers/Skarab/src/SkarabImpl.cpp index 95ca7ec9c..d015b2b03 100644 --- a/Common/Servers/Skarab/src/SkarabImpl.cpp +++ b/Common/Servers/Skarab/src/SkarabImpl.cpp @@ -138,6 +138,7 @@ void SkarabImpl::initialize() throw (ACSErr::ACSbaseExImpl) m_parser->add("getTime",new function1 >(line,&CCommandLine::getTime),0 ); m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); m_parser->add("getRms",new function1 >(line,&CCommandLine::getRms),0 ); + m_parser->add("setTsysRange", new function2,I >(line,&CCommandLine::setTsysRange),2 ); threadPar.sender=this; threadPar.command=m_commandLine; @@ -668,6 +669,28 @@ void SkarabImpl::setAttenuation(CORBA::Long input,CORBA::Double att) throw (CORB } } +void SkarabImpl::setTsysRange(CORBA::Double freq,CORBA::Double bw) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) +{ + AUTO_TRACE("SkarabImpl::setTsysRange()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setTsysRange(freq,bw); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTsysRange()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + CORBA::Long SkarabImpl::getInputs(ACS::doubleSeq_out freq,ACS::doubleSeq_out bandWidth,ACS::longSeq_out feed,ACS::longSeq_out ifNumber) throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { -- GitLab From 2b9fbb6257362815539f7c5a91be7d57437ce02a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 15 Jan 2024 12:31:29 +0100 Subject: [PATCH 049/150] Fix #827, SRT CDB now points to "extraData" (#828) It does not point to "auxiliary" anymore --- SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 32d8ca7d9..2fde0991d 100644 --- a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SchedDir="/discos-archive/schedules/" DataDir="/discos-archive/data/" - SystemDataDir="/discos-archive/auxiliary/" + SystemDataDir="/discos-archive/extraData/" LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index b41203b74..3b8c89f50 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SchedDir="/discos-archive/schedules/" DataDir="/discos-archive/data/" - SystemDataDir="/discos-archive/auxiliary/" + SystemDataDir="/discos-archive/extraData/" LogDir="/discos-archive/logs/" ScheduleReportPath="" ScheduleBackuptPath="" -- GitLab From d1263fceb2da4cf077601d1566326c8079ce177a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 24 Jan 2024 13:31:35 +0000 Subject: [PATCH 050/150] Updated CDB and schemas --- .../GFR/LookupTables/LookupTables.xml | 16 ++++++------ SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 14 ++++++++--- SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 14 ++++++++--- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 19 +++++++++++--- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 18 ++++++++++--- SRT/CDB/alma/MINORSERVO/Socket/Socket.xml | 4 +-- .../config/CDB/schemas/SRTMinorServo.xsd | 25 +++++++++++++++++-- ...d => SRTMinorServoSocketConfiguration.xsd} | 8 +++--- 8 files changed, 86 insertions(+), 32 deletions(-) rename SRT/Servers/SRTMinorServo/config/CDB/schemas/{SRTMinorServoSocket.xsd => SRTMinorServoSocketConfiguration.xsd} (81%) diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml index d0275a194..00e681dfa 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -12,14 +12,14 @@ ROTATION -88.70659 ROTATION -88.70659 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 + ROTATION -159.8899 + ROTATION -159.8899 + ROTATION 90.971610 + ROTATION 90.971610 + ROTATION 162.771 + ROTATION 162.771 + ROTATION 55.373967 + ROTATION 55.373967 ROTATION -51.821170 ROTATION -51.821170 diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index e542e0eb7..75f01dc18 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -2,26 +2,32 @@ - + virtual_axes="1" + max_speed="3.5" + acceleration="2" + min_range="-166" + max_range="168.5"> + - + + - + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index e542e0eb7..83ebde14b 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -2,26 +2,32 @@ - + virtual_axes="1" + max_speed="3.14" + acceleration="1.57" + min_range="-165" + max_range="165"> + - + + - + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 72c2ede30..cb8ba9221 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -2,26 +2,37 @@ - + virtual_axes="3" + max_speed="1, 1, 1" + acceleration="1, 1, 1" + min_range="0, 0, 0" + max_range="0, 0, 0"> + + - + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index a70473464..f625964b3 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -2,26 +2,36 @@ - + virtual_axes="6" + max_speed="4, 4, 4, 0.38, 0.38, 0.38" + acceleration="8, 8, 8, 0.76, 0.76, 0.76" + min_range="-50, -110, -50, -0.25, -0.25, -0.25" + max_range="50, 110, 50, 0.25, 0.25, 0.25"> + - + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml index 69aceac45..b1de61c19 100644 --- a/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml +++ b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -3,8 +3,8 @@ Giuseppe Carboni, giuseppe.carboni@inaf.it --> - - + @@ -45,9 +45,11 @@ + + @@ -57,10 +59,29 @@ + + + + - + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd similarity index 81% rename from SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd rename to SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd index 3b88dbbba..b37cfaedd 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocket.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd @@ -3,9 +3,9 @@ Giuseppe Carboni, giuseppe.carboni@inaf.it --> - + @@ -27,6 +27,6 @@ - + -- GitLab From ad1396357e62673cc5dc229c53deab969fb23eb5 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 25 Jan 2024 14:48:48 +0000 Subject: [PATCH 051/150] Updated SRTMinorServoLibraries --- .../include/PySRTMinorServoCommandLibrary.h | 129 ++++----- .../include/SRTMinorServoAnswerMap.h | 232 +++++++++++++++++ .../include/SRTMinorServoCommandLibrary.h | 128 ++++----- .../include/SRTMinorServoSocket.h | 215 +++++++++++++++ .../SRTMinorServoLibrary/src/Makefile | 11 +- .../src/PySRTMinorServoCommandLibrary.cpp | 4 +- .../src/SRTMinorServoCommandLibrary.cpp | 32 ++- .../src/SRTMinorServoSocket.cpp | 245 ++++++++++++++++++ .../SRTMinorServoLibrary/tests/Makefile | 22 +- ...pp => SRTMinorServoCommandLibraryTest.cpp} | 32 +-- .../tests/SRTMinorServoSocketTest.cpp | 179 +++++++++++++ .../tests/pyunit/__init__.py | 9 +- 12 files changed, 1071 insertions(+), 167 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp rename SRT/Libraries/SRTMinorServoLibrary/tests/{unittest.cpp => SRTMinorServoCommandLibraryTest.cpp} (85%) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h index ee32b5877..dc719e6b6 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h @@ -11,71 +11,74 @@ #include "SRTMinorServoCommandLibrary.h" -/** - * SRT Minor Servo Command Library Python Wrapper - * - * This class wraps the SRTMinorServoCommandLibrary with boost_python in order to grant access to its static functions via Python - */ -class PySRTMinorServoCommandLibrary : public SRTMinorServoCommandLibrary +namespace MinorServo { -public: - /* - * Builds the command used to move a single servo to a given set of coordinates - * This is an overload of the original SRTMinorServoCommandLibrary::preset function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector - * @param servo_id the ID of the single servo to be moved - * @param coordinates a Python list containing the N coordinates to be sent to the servo - * @return the composed message + /** + * SRT Minor Servo Command Library Python Wrapper + * + * This class wraps the SRTMinorServoCommandLibrary with boost_python in order to grant access to its static functions via Python */ - static std::string preset(std::string servo_id, boost::python::list& coordinates); + class PySRTMinorServoCommandLibrary : public SRTMinorServoCommandLibrary + { + public: + /* + * Builds the command used to move a single servo to a given set of coordinates + * This is an overload of the original SRTMinorServoCommandLibrary::preset function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string preset(std::string servo_id, boost::python::list& coordinates); - /* - * Builds the command used to provide a single tracking set of coordinates to a single servo - * This is an overload of the original SRTMinorServoCommandLibrary::programTrack function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector - * @param servo_id the ID of the single servo to send the command to - * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to - * @param point_id the ID number of the given set of coordinates inside the trajectory - * @param coordinates a Python list containing the N coordinates the servo have to move to at the given time - * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory - * @return the composed message - */ - static std::string programTrack(std::string servo_id, unsigned int trajectory_id, unsigned int point_id, boost::python::list& coordinates, double start_time=-1); + /* + * Builds the command used to provide a single tracking set of coordinates to a single servo + * This is an overload of the original SRTMinorServoCommandLibrary::programTrack function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a Python list containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory + * @return the composed message + */ + static std::string programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, boost::python::list& coordinates, double start_time=-1); - /* - * Builds the command used to provide a set of offsets to a given servo - * This is an overload of the original SRTMinorServoCommandLibrary::offset function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector - * @param servo_id the ID of the single servo to be moved - * @param coordinates a Python list containing the N coordinates to be sent to the servo - * @return the composed message - */ - static std::string offset(std::string servo_id, boost::python::list& coordinates); + /* + * Builds the command used to provide a set of offsets to a given servo + * This is an overload of the original SRTMinorServoCommandLibrary::offset function + * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string offset(std::string servo_id, boost::python::list& coordinates); - /* - * Parses the received answer by splitting it and synamically populating a std::map - * This is an overload of the original SRTMinorServoCommandLibrary::parseAnswer function - * An overload was needed in order to replace the original std::map object with a boost::python::dict - * @param answer the string containing the answer received from the VBrain proxy - * @return a Python dictionary containing the answer splitted into keys and values. The keys are always strings, the values can either be int, double or strings. - */ - static boost::python::dict parseAnswer(std::string answer); + /* + * Parses the received answer by splitting it and synamically populating a std::map + * This is an overload of the original SRTMinorServoCommandLibrary::parseAnswer function + * An overload was needed in order to replace the original std::map object with a boost::python::dict + * @param answer the string containing the answer received from the VBrain proxy + * @return a Python dictionary containing the answer splitted into keys and values. The keys are always strings, the values can either be int, double or strings. + */ + static boost::python::dict parseAnswer(std::string answer); -private: - /* - * Converts the given Python list into a C++ std::vector object - * @param py_list the given Python list to be converted - * @return the composed C++ std::vector containing doubles - */ - static std::vector pylist2cppvector(boost::python::list& py_list); -}; + private: + /* + * Converts the given Python list into a C++ std::vector object + * @param py_list the given Python list to be converted + * @return the composed C++ std::vector containing doubles + */ + static std::vector pylist2cppvector(boost::python::list& py_list); + }; +} /* * The following 3 lines of code allow the overloaded functions to ignore the optional parameter and use the default one defined in the original SRTMinorServoCommandLibrary header file */ -BOOST_PYTHON_FUNCTION_OVERLOADS(status, PySRTMinorServoCommandLibrary::status, 0, 1) -BOOST_PYTHON_FUNCTION_OVERLOADS(stow, PySRTMinorServoCommandLibrary::stow, 1, 2) -BOOST_PYTHON_FUNCTION_OVERLOADS(programTrack, PySRTMinorServoCommandLibrary::programTrack, 4, 5) +BOOST_PYTHON_FUNCTION_OVERLOADS(status, MinorServo::PySRTMinorServoCommandLibrary::status, 0, 1) +BOOST_PYTHON_FUNCTION_OVERLOADS(stow, MinorServo::PySRTMinorServoCommandLibrary::stow, 1, 2) +BOOST_PYTHON_FUNCTION_OVERLOADS(programTrack, MinorServo::PySRTMinorServoCommandLibrary::programTrack, 4, 5) /* * Python module definition. Since the original SRTMinorServoCommandLibrary only contains static functions, we write the Python module with static functions only, omitting the class @@ -83,13 +86,13 @@ BOOST_PYTHON_FUNCTION_OVERLOADS(programTrack, PySRTMinorServoCommandLibrary::pro BOOST_PYTHON_MODULE(libPySRTMinorServoCommandLibrary) { using namespace boost::python; - def("status", &PySRTMinorServoCommandLibrary::status, status(arg("servo_id") = "")); - def("setup", &PySRTMinorServoCommandLibrary::setup); - def("stow", &PySRTMinorServoCommandLibrary::stow, stow(arg("stow_position") = 1)); - def("stop", &PySRTMinorServoCommandLibrary::stop); - def("preset", &PySRTMinorServoCommandLibrary::preset); - def("programTrack", &PySRTMinorServoCommandLibrary::programTrack, programTrack(arg("start_time") = -1)); - def("offset", &PySRTMinorServoCommandLibrary::offset); - def("parseAnswer", &PySRTMinorServoCommandLibrary::parseAnswer); + def("status", &MinorServo::PySRTMinorServoCommandLibrary::status, status(arg("servo_id") = "")); + def("setup", &MinorServo::PySRTMinorServoCommandLibrary::setup); + def("stow", &MinorServo::PySRTMinorServoCommandLibrary::stow, stow(arg("stow_position") = 1)); + def("stop", &MinorServo::PySRTMinorServoCommandLibrary::stop); + def("preset", &MinorServo::PySRTMinorServoCommandLibrary::preset); + def("programTrack", &MinorServo::PySRTMinorServoCommandLibrary::programTrack, programTrack(arg("start_time") = -1)); + def("offset", &MinorServo::PySRTMinorServoCommandLibrary::offset); + def("parseAnswer", &MinorServo::PySRTMinorServoCommandLibrary::parseAnswer); } #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h new file mode 100644 index 000000000..83bef228d --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h @@ -0,0 +1,232 @@ +#ifndef _SRTMINORSERVOANSWERMAP_H +#define _SRTMINORSERVOANSWERMAP_H + +#include +#include +#include +#include +#include +#include +#include + +#include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wunused-function") + +static std::ostream& operator<<(std::ostream& out, const std::variant& value) +{ + std::visit([&out](const auto& val) { out << val; }, value); + return out; +} + +C11_IGNORE_WARNING_POP + + +namespace MinorServo +{ + /** + * The following templates are useful if you want to check if a given type for the SRTMinorServoAnswerMap is accepted + */ + template + struct is_string : public std::disjunction>, std::is_same>, std::is_same>> {}; + + template + inline constexpr bool is_string_v = is_string::value; + + template + struct is_known : public std::disjunction>, is_string>> {}; + + template + inline constexpr bool is_known_v = is_known::value; + + class SRTMinorServoAnswerMap : private std::map> + { + /** + * This class privately extends the type std::map>. + * It is therefore an std::map which can hold different types of values, such as long, double and str::string, in the same container. + * It is used to store the answers received from the SRTMinorServo Leonardo system. + * This design was critical since all the received values have heterogeneous keys and values. + * With this object, the SRTMinorServoSocket can correctly retrieve and store all the received values without having to know the keys or types a priori. + */ + + /* + * Declare this class as friend since it will have to iterate through the inner map + */ + friend class PySRTMinorServoCommandLibrary; + public: + /** + * Use the same clear method of the parent class + */ + using std::map>::clear; + + /** + * Default constructor, initialize the std::map object and the synchronization mutex + */ + SRTMinorServoAnswerMap() : std::map>(), m_mutex() {} + + /** + * Initialize the std::map with the content of another SRTMinorServoAnswerMap, initialize the mutex, lock both objects + * @param other the SRTMinorServoAnswerMap with which the content of the current object will be initialized + */ + SRTMinorServoAnswerMap(const SRTMinorServoAnswerMap& other) : m_mutex() + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + /** + * Assignment operator. It lock both the current object and the assigned one's mutexes + * @param other the SRTMinorServoAnswerMap which values have to be stored in the current object + */ + SRTMinorServoAnswerMap& operator=(const SRTMinorServoAnswerMap& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + return *this; + } + + /** + * Equality operator, only check the std::map and avoid comparing the mutexes, which will obviously be different + * @param other the SRTMinorServoAnswerMap object to compare the current object with + */ + bool operator==(const SRTMinorServoAnswerMap& other) const + { + return static_cast>&>(*this) == static_cast>&>(other); + } + + /** + * get method. It must be used with a template parameter, in order for the SRTMinorServoAnswerMap to be able to retrieve the correct type of object for the given key. + * The method will automatically convert the retrieved long, double or std::string to the given template type. + * @param T the type (i.e.: int, long, double, char*) of the object to be retrieved. It can be anything derived from integral, floating point or string values. + * @param key the key assigned to the value you want to retrieve + * @return the value associated to given key 'key', returned as template type 'T', if possible. Be aware that some casts (i.e.: long to int, double to float) will lose precision and/or overflow + * @throw std::bad_variant_access when retrieving the stored value by asking the wrong type (i.e.: stored type is a double but T is char*) + * @throw std::runtime_error when attempting to retrieve a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + T get(const std::string& key) const + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::shared_lock lock(m_mutex); + + if constexpr(std::is_integral_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(std::is_floating_point_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(is_string_v) + { + return (T)std::get(this->at(key)).c_str(); + } + } + + /** + * put method. The template parameter is automatically deducted from the 'value' argument. Stores the given 'value' associated with key 'key' + * @param key the key associated to the stored value 'value' + * @param value the value we are storing with the given key 'key' + * @throw std::runtime_error when attempting to store a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + void put(const std::string& key, const T& value) + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::unique_lock lock(m_mutex); + + if constexpr(std::is_integral_v) + { + this->operator[](key) = long(value); + } + else if constexpr(std::is_floating_point_v) + { + this->operator[](key) = double(value); + } + else if constexpr(is_string_v) + { + this->operator[](key) = std::string(value); + } + } + + /** + * This method checks whether the container holds a value for the given key 'key' + * @param key the key for the value we want to check if it's present in the container + * @return true if the value is present in the container, false otherwise + */ + bool contains(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->find(key) != this->end(); + } + + /** + * This methods returns the std::variant type index for the value associated to the given key 'key' + * @param key the key for the value we want to retrieve the type index + * @throw std::out_of_range if the key is not found in the object + * @return 0 for long, 1 for double, 2 for std::string + */ + unsigned int index(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->at(key).index(); + } + + /** + * This method checks whether the contained answer to a command sent to the SRTMinorServo system was positive or not + * @return true if the command was correctly accepted, false if the command was not accepted or the 'OUTPUT' key was not found (unlikely scenario) + */ + const bool checkOutput() const + { + std::shared_lock lock(m_mutex); + try + { + if(this->get("OUTPUT") == "GOOD") + { + return true; + } + } + catch(std::out_of_range& ex) + { + // Key not found + } + + return false; + } + + /** + * This method retrieves the ACS::Time associated with the received answer map. It converts the value from UNIX Epoch (double) to ACS::Time + * @return the ACS::Time associated with the answer map + */ + const ACS::Time getTimestamp() const + { + std::shared_lock lock(m_mutex); + return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); + } + + private: + /** + * Shared mutex to control read and write accesses. Multiple reading access are permitted and will only block writing access. Writing access will block all accesses + */ + mutable std::shared_mutex m_mutex; + }; +} + + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 8649d5c0c..d6d21dd70 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -7,85 +7,89 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ +#include "SRTMinorServoAnswerMap.h" #include #include #include #include + #define CLOSER std::string("\r\n") -using SRTMinorServoAnswerMap = std::map >; -/** - * SRT Minor Servo Command Library - * - * This class features static functions used to build commands to be sent to the PON minor servo control unit of the Sardinia Radio Telescope - */ -class SRTMinorServoCommandLibrary +namespace MinorServo { -public: /** - * Builds the command used to ask the status of the MSCU or, eventually, a single servo - * @param servo_id the ID string of the eventual single servo to retrieve the status - * @return the composed message + * SRT Minor Servo Command Library + * + * This class features static functions used to build commands to be sent to the PON minor servo control unit of the Sardinia Radio Telescope */ - static std::string status(std::string servo_id = ""); + class SRTMinorServoCommandLibrary + { + public: + /** + * Builds the command used to ask the status of the MSCU or, eventually, a single servo + * @param servo_id the ID string of the eventual single servo to retrieve the status. Send no servo_id argument to retrieve the general status of the system + * @return the composed message + */ + static std::string status(std::string servo_id = ""); - /** - * Builds the command used to configure the telescope for an observation - * @param configuration the desired observing configuration - * @return the composed message - */ - static std::string setup(std::string configuration); + /** + * Builds the command used to configure the telescope for a specific focal path + * @param configuration the desired focal path to command to the minor servo systems + * @return the composed message + */ + static std::string setup(std::string configuration); - /* - * Builds the command used to stow a single servo system to a given stow position - * @param servo_id the ID string of the single servo to be stowed - * @param stow_position the position to which the servo have to stow to - * @return the composed message - */ - static std::string stow(std::string servo_id, unsigned int stow_position = 1); + /* + * Builds the command used to stow a single servo system to a given stow position + * @param servo_id the ID string of the single servo to be stowed + * @param stow_position the position to which the servo have to stow to + * @return the composed message + */ + static std::string stow(std::string servo_id, unsigned int stow_position = 1); - /* - * Builds the command used to stop a single servo system - * @param servo_id the ID string of the single servo to be stopped - * @return the composed message - */ - static std::string stop(std::string servo_id); + /* + * Builds the command used to stop a single servo system + * @param servo_id the ID string of the single servo to be stopped + * @return the composed message + */ + static std::string stop(std::string servo_id); - /* - * Builds the command used to move a single servo to a given set of coordinates - * @param servo_id the ID string of the single servo to be moved - * @param coordinates a vector containing the N coordinates to be sent to the servo - * @return the composed message - */ - static std::string preset(std::string servo_id, std::vector coordinates); + /* + * Builds the command used to move a single servo to a given set of virtual coordinates + * @param servo_id the ID string of the single servo to be moved + * @param coordinates a vector containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string preset(std::string servo_id, std::vector coordinates); - /* - * Builds the command used to provide a single tracking set of coordinates to a single servo - * @param servo_id the ID string of the single servo to send the command to - * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to - * @param point_id the ID number of the given set of coordinates inside the trajectory - * @param coordinates a vector containing the N coordinates the servo have to move to at the given time - * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory - * @return the composed message - */ - static std::string programTrack(std::string servo_id, long unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time = 0); + /* + * Builds the command used to provide a single tracking point of virtual coordinates to a single servo + * @param servo_id the ID string of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a vector containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX Epoch of the starting instant of the trajectory + * @return the composed message + */ + static std::string programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, std::vector coordinates, double start_time = 0); - /* - * Builds the command used to send a set of offset coordinates - * @param servo_id the ID string of the single servo to send the offsets to - * @param coordinates a vector containing the N offsets to be added the servo coordinates - * @return the composed message - */ - static std::string offset(std::string servo_id, std::vector coordinates); + /* + * Builds the command used to send a set of virtual offsets to a single servo + * @param servo_id the ID string of the single servo to send the offsets to + * @param coordinates a vector containing the N offsets to be added the servo coordinates + * @return the composed message + */ + static std::string offset(std::string servo_id, std::vector coordinates); - /* - * Parses the received answer by splitting it and synamically populating a std::map - * @param answer the string containing the answer received from the VBrain proxy - * @return a std::map (dictionary) containing the answer splitted into keys and values. The keys are always std::string, the values can either be int, double or std::string. - */ - static SRTMinorServoAnswerMap parseAnswer(std::string answer); -}; + /* + * Parses the received answer by splitting it and dynamically populating a SRTMinorServoAnswerMap object + * @param answer the string containing the answer received from the VBrain proxy + * @return a SRTMinorServoAnswerMap dictionary containing the answer splitted into keys and values. The keys are always std::string, the values can either be long, double or std::string. + */ + static SRTMinorServoAnswerMap parseAnswer(std::string answer); + }; +} #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h new file mode 100644 index 000000000..48056718f --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h @@ -0,0 +1,215 @@ +#ifndef __SRTMINORSERVOSOCKET_H__ +#define __SRTMINORSERVOSOCKET_H__ + +/** + * SRTMinorServoSocket.h + * 2023/02/23 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include +#include +#include "SRTMinorServoCommandLibrary.h" + + +#define SOCKET_TIMEOUT 0.1 +#define CONFIG_DOMAIN "alma/" +#define CONFIG_DIRNAME "/MINORSERVO/Socket" + + +class SRTMinorServoSocketTest; +class SRPProgramTrackTest; +class DerotatorProgramTrackTest; +class CombinedProgramTrackTest; +class ReadStatusOnlyTest; + + +namespace MinorServo +{ + class SRTMinorServoSocket: public IRA::CSocket + { + /** + * This class implements a singleton socket. The singleton pattern was necessary to provide each servo system component communication capabilities with the Leonardo system. + * As long as all the said components run on the same container this will only be instanced once. + */ + + /** + * Declare the testing classes as friend classes in order for them to have access to destroyInstance for testing purposes + */ + friend class ::SRTMinorServoSocketTest; + friend class ::SRPProgramTrackTest; + friend class ::DerotatorProgramTrackTest; + friend class ::CombinedProgramTrackTest; + friend class ::ReadStatusOnlyTest; + + public: + /** + * Calls the constructor and returns the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed + * @throw MinorServoErrors::CommunicationErrorExImpl when the user calls this method a second time with different IP address and port arguments + * @return the singleton socket instance, eventually connected to the given IP address and port, by reference + */ + static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT); + + /** + * Returns the previously generated singleton socket instance + * @throw MinorServoErrors::CommunicationErrorExImpl when the user calls this method when the instance has not been generated yet + * @return the singleton socket instance, by reference + */ + static SRTMinorServoSocket& getInstance(); + + /** + * Sends a command on the socket and returns the received answer, if any + * @param command the command to be sent over the socket + * @param map, optional SRTMinorServoAnswerMap object. If provided, the 'map' argument content gets updated with the newly received answer + * @throw MinorServoErrors::CommunicationErrorExImpl when the operation of sending or receiving fails unexpectedly + * @return the received answer to the given command + */ + SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); + + /** + * Copy constructor operator disabled by default + */ + SRTMinorServoSocket(SRTMinorServoSocket const&) = delete; + + /** + * Copy assignment operator disabled by default + */ + void operator=(SRTMinorServoSocket const&) = delete; + + /** + * Method to check if socket is connected + * @return true if the socket is connected, false otherwise + */ + const bool isConnected() const; + + private: + /** + * Constructor method. Generates the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed + */ + SRTMinorServoSocket(std::string ip_address, int port, double timeout); + + /** + * Destructor method. Closes the socket upon destruction + */ + ~SRTMinorServoSocket(); + + /** + * Force the destruction of the singleton socket object. Only used in tests + */ + static void destroyInstance(); + + /** + * Connection function. It gets called every time the socket gets disconnected + * throw MinorServoErrors::CommunicationErrorExImpl when the connection attempt fails + */ + void connect(); + + /** + * Instance of the socket. By default it gets initialized to a null pointer + */ + inline static SRTMinorServoSocket* m_instance = nullptr; + + /** + * IP address and port of the socket. Being object members their values only exist when a singleton socket object is created correctly + */ + std::string m_ip_address; + int m_port; + + /** + * Timeout for communication operations + */ + double m_timeout; + + /** + * Mutex object used to syncronize communications and prevent collisions between multiple threads + */ + std::mutex m_mutex; + + /** + * Library mutex, used only to synchronize the getInstance methods + */ + static std::mutex c_mutex; + + /** + * Socket status enumerator + */ + enum socket_status + { + NOTREADY, + TIMEOUT, + READY + } m_socket_status; + + /** + * Socket error variable. This stores an error condition in case it arises + */ + IRA::CError m_error; + }; + + + class SRTMinorServoSocketConfiguration + { + /** + * This class implements a singleton socket configuration object. The singleton pattern was necessary to provide each servo system component access to the singleton socket parameters. + * As long as all the said components run on the same container this will only be instanced once. + * The first component to instantiate the singleton configuration will also instantiate the socket, opening communications. + */ + public: + /** + * Calls the constructor and returns the singleton socket configuration instance + * @param containerServices, the container services necessary to read the configuration from the CDB + * @return the singleton socket configuration instance + */ + static SRTMinorServoSocketConfiguration& getInstance(maci::ContainerServices* containerServices); + + /** + * Copy constructor operator disabled by default + */ + SRTMinorServoSocketConfiguration(SRTMinorServoSocketConfiguration const&) = delete; + + /** + * Copy assignment operator disabled by default + */ + void operator=(SRTMinorServoSocketConfiguration const&) = delete; + + /** + * IP address and port of the socket configuration + */ + std::string m_ip_address; + int m_port; + + /** + * Timeout for communication operations + */ + double m_timeout; + + private: + /** + * Constructor method + * @param containerServices, the container services necessary to read the configuration from the CDB + * @return the socket configuration object + */ + SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices); + + /** + * Destructor method + */ + ~SRTMinorServoSocketConfiguration(); + + /** + * Instance of the socket configuration object. By default it gets initialized to a null pointer + */ + inline static SRTMinorServoSocketConfiguration* m_instance = nullptr; + }; +} + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 2a1367b96..f9034eb01 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -54,21 +54,24 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h +INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary PySRTMinorServoCommandLibrary +LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary PySRTMinorServoCommandLibrary LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -SRTMinorServoCommandLibrary_LIBS = +SRTMinorServoCommandLibrary_LIBS = pthread IRALibrary PySRTMinorServoCommandLibrary_OBJECTS = PySRTMinorServoCommandLibrary PySRTMinorServoCommandLibrary_CFLAGS = -std=c++17 PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python3 +SRTMinorServoSocketLibrary_OBJECTS = SRTMinorServoSocket +SRTMinorServoSocketLibrary_LIBS = IRALibrary ComponentErrors MinorServoErrors SRTMinorServoCommandLibrary +SRTMinorServoSocket_CFLAGS = -std=c++17 # # @@ -95,7 +98,7 @@ PY_SCRIPTS_L = PY_MODULES = PY_MODULES_L = -PY_PACKAGES = SRTMinorServoCommandLibrary +PY_PACKAGES = #SRTMinorServoCommandLibrary PY_PACKAGES_L = pppppp_MODULES = diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp index ed66a79ba..ac0a61534 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -1,11 +1,13 @@ #include "PySRTMinorServoCommandLibrary.h" +using namespace MinorServo; + std::string PySRTMinorServoCommandLibrary::preset(std::string servo_id, boost::python::list& coordinates) { return SRTMinorServoCommandLibrary::preset(servo_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates)); } -std::string PySRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned int trajectory_id, unsigned int point_id, boost::python::list& coordinates, double start_time) +std::string PySRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, boost::python::list& coordinates, double start_time) { return SRTMinorServoCommandLibrary::programTrack(servo_id, trajectory_id, point_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates), start_time); } diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index 1c5ee5be8..36c784843 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -9,6 +9,8 @@ #include #include "SRTMinorServoCommandLibrary.h" +using namespace MinorServo; + std::string SRTMinorServoCommandLibrary::status(std::string servo_id) { std::stringstream command; @@ -54,7 +56,7 @@ std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vecto return command.str(); } -std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, long unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time) +std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, std::vector coordinates, double start_time) { std::stringstream command; command << "PROGRAMTRACK=" << servo_id << "," << trajectory_id << "," << point_id << ","; @@ -114,8 +116,10 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ // No value, could be the timestamp if(value.empty()) { - if(args.find("TIMESTAMP") != args.end()) // Timestamp already found, some other value is missing + if(args.contains("TIMESTAMP")) // Timestamp already found, some other value is missing + { throw std::invalid_argument(std::string("Missing key for value " + value)); + } value = key; key = "TIMESTAMP"; @@ -124,32 +128,42 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answ if(key == "OUTPUT") { if(value != "GOOD" && value != "BAD") + { throw std::invalid_argument(std::string("Unrecognized OUTPUT value: " + value)); + } - args[key] = value; + args.put(key, value); } else if(key == "TIMESTAMP") { size_t last_char; - args[key] = std::stod(value, &last_char); + args.put(key, std::stod(value, &last_char)); if(last_char != value.size()) + { throw std::invalid_argument(std::string("Wrong TIMESTAMP value: " + value)); + } } else { size_t last_char; - args[key] = std::stol(value, &last_char); + args.put(key, std::stol(value, &last_char)); if(last_char != value.size()) - args[key] = std::stod(value); + { + args.put(key, std::stod(value)); + } } } - if(args.find("OUTPUT") == args.end()) + if(!args.contains("OUTPUT")) + { throw std::invalid_argument(std::string("Missing OUTPUT value!")); - else if(std::get(args["OUTPUT"]) == "GOOD" && args.find("TIMESTAMP") == args.end()) + } + else if(args.checkOutput() && !args.contains("TIMESTAMP")) + { throw std::invalid_argument(std::string("Missing TIMESTAMP value!")); + } } - catch(const std::invalid_argument& e) + catch(const std::invalid_argument& ex) { // If we are not able to convert any of the values to the correct type, // or if OUTPUT and/or TIMESTAMP is missing, we send back an empty dictionary. diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp new file mode 100644 index 000000000..c5cc76fbf --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -0,0 +1,245 @@ +#include "SRTMinorServoSocket.h" + +using namespace MinorServo; + +std::mutex SRTMinorServoSocket::c_mutex; + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port, double timeout) +{ + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + + if(m_instance != nullptr) + { + if(m_instance->m_ip_address != ip_address || m_instance->m_port != port) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); + impl.setReason(("Socket already open on '" + m_instance->m_ip_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + throw impl; + } + } + else + { + m_instance = new SRTMinorServoSocket(ip_address, port, timeout); + } + return *m_instance; +} + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance() +{ + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + + if(m_instance == nullptr) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); + impl.setReason("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + throw impl; + } + return *m_instance; +} + +void SRTMinorServoSocket::destroyInstance() +{ + if(m_instance != nullptr) + { + delete m_instance; + m_instance = nullptr; + } +} + +SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, double timeout) : m_ip_address(ip_address), m_port(port), m_timeout(timeout), m_socket_status(NOTREADY) +{ + try + { + connect(); + } + catch(...) + { + // Not yet connected, we catch the exception in order to go on + } +} + +SRTMinorServoSocket::~SRTMinorServoSocket() +{ + std::lock_guard guard(m_mutex); + Close(m_error); +} + +void SRTMinorServoSocket::connect() +{ + if(isConnected()) + { + return; + } + + std::lock_guard guard(m_mutex); + + Close(m_error); + m_error.Reset(); + if(Create(m_error, STREAM) == FAIL) + { + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot create the socket."); + throw impl; + } + + if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot connect the socket."); + throw impl; + } + + if(setSockMode(m_error, NONBLOCKING) != SUCCESS) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot set the socket to non-blocking."); + throw impl; + } + + m_socket_status = READY; +} + +const bool SRTMinorServoSocket::isConnected() const +{ + return m_socket_status == READY ? true : false; +} + +SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) +{ + connect(); + + std::lock_guard guard(m_mutex); + + double start_time = IRA::CIRATools::getUNIXEpoch(); + size_t sent_bytes = 0; + + while(sent_bytes < command.size()) + { + size_t sent_now; + + try + { + sent_now = Send(m_error, command.substr(sent_bytes, command.size() - sent_bytes).c_str(), command.size() - sent_bytes); + sent_bytes += sent_now; + } + catch(...) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); + impl.setReason("Something went wrong while sending some bytes."); + throw impl; + } + + if(sent_now > 0) + { + // Reset the timer + start_time = IRA::CIRATools::getUNIXEpoch(); + } + else if(IRA::CIRATools::getUNIXEpoch() - start_time >= m_timeout) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.setReason("Timeout when sending command."); + throw impl; + } + } + + start_time = IRA::CIRATools::getUNIXEpoch(); + std::string answer; + + while(answer.size() < 2 || !(answer.rfind(CLOSER) == answer.size() - CLOSER.size())) + { + char buf; + try + { + if(Receive(m_error, &buf, 1) == 1) + { + answer += buf; + + // Reset the timer + start_time = IRA::CIRATools::getUNIXEpoch(); + } + else if(IRA::CIRATools::getUNIXEpoch() - start_time >= m_timeout) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.setReason("Timeout when receiving answer."); + throw impl; + } + } + catch(...) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); + impl.setReason("Something went wrong while receiving some bytes."); + throw impl; + } + } + + SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); + if(map) + { + map->get() = map_answer; + } + + return map_answer; +} + +SRTMinorServoSocketConfiguration& SRTMinorServoSocketConfiguration::getInstance(maci::ContainerServices* containerServices) +{ + if(m_instance == nullptr) + { + m_instance = new SRTMinorServoSocketConfiguration(containerServices); + } + + return *m_instance; +} + +SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices) +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + + IRA::CString _ip_address; + if(!IRA::CIRATools::getDBValue(containerServices, "IPAddress", _ip_address, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("IPAddress"); + throw impl.getComponentErrorsEx(); + } + m_ip_address = (std::string)_ip_address; + + DWORD port; + if(!IRA::CIRATools::getDBValue(containerServices, "Port", port, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("Port"); + throw impl.getComponentErrorsEx(); + } + else + { + m_port = port; + } + + if(!IRA::CIRATools::getDBValue(containerServices, "SocketTimeout", m_timeout, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("SocketTimeout"); + throw impl.getComponentErrorsEx(); + } +} + +SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration() +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration()"); + + delete m_instance; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile index 1af134e84..1e8380bf7 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile @@ -11,14 +11,20 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: # # EXECTUABLES_L = unittest -# unittest_OBJECTS = unittest -# unittest_LIBS = $(GTEST_LIBS) - -EXECUTABLES_L = unittest -unittest_OBJECTS = unittest -unittest_CFLAGS = -std=c++17 -unittest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary -unittest_LDFLAGS = -lstdc++ -lpthread +# SRTMinorServoCommandLibraryTest_OBJECTS = unittest +# SRTMinorServoCommandLibraryTest_LIBS = $(GTEST_LIBS) + +EXECUTABLES_L = SRTMinorServoCommandLibraryTest SRTMinorServoSocketTest + +SRTMinorServoCommandLibraryTest_OBJECTS = SRTMinorServoCommandLibraryTest +SRTMinorServoCommandLibraryTest_CFLAGS = -std=c++17 +SRTMinorServoCommandLibraryTest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary +SRTMinorServoCommandLibraryTest_LDFLAGS = -lstdc++ -lpthread + +SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest +SRTMinorServoSocketTest_CFLAGS = -std=c++17 +SRTMinorServoSocketTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary +SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread # END OF CUSTOMIZATION # do not edit below this line diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp similarity index 85% rename from SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp rename to SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp index 4b54b64bc..1447613f7 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/unittest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp @@ -2,7 +2,7 @@ #include #include "SRTMinorServoCommandLibrary.h" -using namespace IRA; +using namespace MinorServo; TEST(SRTMinorServoCommandLibraryTest, status) { @@ -33,7 +33,7 @@ TEST(SRTMinorServoCommandLibraryTest, preset) TEST(SRTMinorServoCommandLibraryTest, programTrack) { - double start_time = CIRATools::getUNIXEpoch() + 3; + double start_time = IRA::CIRATools::getUNIXEpoch() + 3; unsigned long int trajectory_id = (unsigned long int)start_time; std::stringstream expected_answer; expected_answer << std::fixed << std::setprecision(6); @@ -58,24 +58,26 @@ TEST(SRTMinorServoCommandLibraryTest, parseAnswer) // Minimal correct answer std::string answer = "OUTPUT:GOOD,1665743366.654321\r\n"; SRTMinorServoAnswerMap args; - args["OUTPUT"] = "GOOD"; - args["TIMESTAMP"] = 1665743366.654321; + args.put("OUTPUT", "GOOD"); + args.put("TIMESTAMP", 1665743366.654321); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + EXPECT_EQ(args.getTimestamp(), 138850361666543210); + // Complete correct answer answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; args.clear(); - args["OUTPUT"] = "GOOD"; - args["TIMESTAMP"] = 1665743366.123456; - args["CURRENT_CONFIG"] = (long)21; - args["SIMULATION_ENABLED"] = (long)34; - args["PLC_TIME"] = (long)78; - args["PLC_VERSION"] = (long)69; - args["CONTROL"] = (long)14; - args["POWER"] = (long)38; - args["EMERGENCY"] = (long)69; - args["ENABLED"] = (long)51; - args["OPERATIVE_MODE"] = (long)94; + args.put("OUTPUT", "GOOD"); + args.put("TIMESTAMP", 1665743366.123456); + args.put("CURRENT_CONFIG", 21); + args.put("SIMULATION_ENABLED", 34); + args.put("PLC_TIME", 78); + args.put("PLC_VERSION", 69); + args.put("CONTROL", 14); + args.put("POWER", 38); + args.put("EMERGENCY", 69); + args.put("ENABLED", 51); + args.put("OPERATIVE_MODE", 94); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); // Missing timestamp diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp new file mode 100644 index 000000000..742459c1e --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp @@ -0,0 +1,179 @@ +/* These tests require a running simulator and were designed * + * to test the thread-safeness and singleton design pattern of the * + * SRTMinorServoSocket class. */ +#include "gtest/gtest.h" +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 + + +using namespace MinorServo; + + +class SRTMinorServoSocketTest : public ::testing::Test +{ +protected: + std::vector commands; + std::vector threads; + + void SetUp() override + { + // The following commands yield an articulated answer in return + commands.push_back(SRTMinorServoCommandLibrary::status()); + commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); + commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + } +}; + +// This test passes the already created instance to some threads +TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + if(!socket.isConnected()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + } + + for(auto command : this->commands) + { + this->threads.push_back(std::thread([command, &socket]() + { + auto args = socket.sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_TRUE(args.checkOutput()); + })); + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); +} + +// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it +TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) +{ + std::string error = ""; + + for(auto command : this->commands) + { + std::mutex mutex; + + this->threads.push_back(std::thread([command, &error, &mutex]() + { + try + { + auto args = SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_TRUE(args.checkOutput()); + } + catch(MinorServoErrors::CommunicationErrorExImpl& ex) + { + std::lock_guard guard(mutex); + + if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + { + error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; + } + else + { + error = "Unexpected failure."; + } + } + })); + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); + + if(error != "") + { + FAIL() << error << std::endl; + } +} + +// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails +TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) +{ + try + { + // First let's open the socket with the chosen ADDRESS and PORT + SRTMinorServoSocket::getInstance(ADDRESS, PORT); + + // Let's try to instance another socket on a different port + SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); + } + catch(MinorServoErrors::CommunicationErrorExImpl& ex) + { + if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(ex.getReason(), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + } + } +} + +// This test tries to retrieve an instance which has not been generated yet, failing +TEST_F(SRTMinorServoSocketTest, try_open_without_args) +{ + try + { + SRTMinorServoSocket::getInstance(); + } + catch(MinorServoErrors::CommunicationErrorExImpl& ex) + { + if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(ex.getReason(), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); + } + } +} + +// This test tries to generate an instance using a pair of address and port on which the socket fails to open +TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) +{ + try + { + // The exception is raised only if the given port is wrong + SRTMinorServoSocket::getInstance(ADDRESS, 0); + } + catch(MinorServoErrors::CommunicationErrorExImpl& ex) + { + // Check if we got the correct exception + EXPECT_EQ(ex.getReason(), std::string("Cannot connect the socket.").c_str()); + } +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py index 03d61b9a7..4993c068e 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py @@ -37,23 +37,22 @@ class TestPySRTMinorServoCommandLibrary(unittest.TestCase): def test_preset(self): command = SRTMinorServoCommandLibrary.preset('PFP', [0.1, 1.1, 2.1]) - expected_command = 'PRESET=PFP,0.1,1.1,2.1\r\n' + expected_command = 'PRESET=PFP,0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) def test_programTrack(self): now = time.time() command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0.1, 1.1, 2.1], now) - now = int(now * 1000) - expected_command = 'PROGRAMTRACK=PFP,0,0,%d,0.1,1.1,2.1\r\n' % now + expected_command = f'PROGRAMTRACK=PFP,0,0,{now},0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) for i in range(1, 10): command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, i, [0.1, 1.1, 2.1]) - expected_command = 'PROGRAMTRACK=PFP,0,%d,*,0.1,1.1,2.1\r\n' % i + expected_command = f'PROGRAMTRACK=PFP,0,{i},*,0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) def test_offset(self): command = SRTMinorServoCommandLibrary.offset('PFP', [0.1, 1.1, 2.1]) - expected_command = 'OFFSET=PFP,0.1,1.1,2.1\r\n' + expected_command = 'OFFSET=PFP,0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) def test_parseAnswer(self): -- GitLab From efbfaa7e8872c1924b0217a2da7aed433840c1ad Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 26 Jan 2024 13:38:37 +0000 Subject: [PATCH 052/150] Updated SRTMinorServoSocket and tests --- .../idl/SRTMinorServoCommon.midl | 33 +++++++--- .../include/SRTMinorServoSocket.h | 52 +++++++-------- .../include/SRTMinorServoTestingSocket.h | 65 +++++++++++++++++++ .../SRTMinorServoLibrary/src/Makefile | 2 +- .../src/SRTMinorServoSocket.cpp | 37 ++++++----- .../tests/SRTMinorServoSocketTest.cpp | 19 +++--- 6 files changed, 142 insertions(+), 66 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 342b25b8b..841b46537 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -15,6 +15,9 @@ module MinorServo { + /** + * Enumerator which indicates a Leonardo minor servo configuration + */ enum SRTMinorServoFocalConfiguration { CONFIGURATION_UNKNOWN, @@ -33,35 +36,43 @@ module MinorServo CONFIGURATION_BWG3, CONFIGURATION_BWG4 }; - ACS_ENUM(SRTMinorServoFocalConfiguration); + /** + * Enumerator which indicates the status of the control for the Leonardo minor servo system + */ enum SRTMinorServoControlStatus { CONTROL_DISCOS, CONTROL_VBRAIN }; - ACS_ENUM(SRTMinorServoControlStatus); + /** + * Enumerator which indicates the position of the gregorian cover + */ enum SRTMinorServoGregorianCoverStatus { COVER_STATUS_UNKNOWN, COVER_STATUS_OPEN, COVER_STATUS_CLOSED }; - ACS_ENUM(SRTMinorServoGregorianCoverStatus); + /** + * Enumerator which indicates the status of a servo drive cabinet + */ enum SRTMinorServoCabinetStatus { DRIVE_CABINET_OK, DRIVE_CABINET_WARNING, DRIVE_CABINET_ERROR }; - ACS_ENUM(SRTMinorServoCabinetStatus); + /** + * Enumerator which indicates the operating mode of a single servo + */ enum SRTMinorServoOperativeMode { OPERATIVE_MODE_UNKNOWN, @@ -71,19 +82,21 @@ module MinorServo OPERATIVE_MODE_PRESET, OPERATIVE_MODE_PROGRAMTRACK }; - ACS_ENUM(SRTMinorServoOperativeMode); + /** + * Enumerator which indicates the type of movement made by the whole system (i.e.: performing setup, parking, tracking...) + */ enum SRTMinorServoMotionStatus { MOTION_STATUS_UNCONFIGURED, - MOTION_STATUS_CONFIGURING, - MOTION_STATUS_PARK, - MOTION_STATUS_ERROR, + MOTION_STATUS_STARTING, MOTION_STATUS_CONFIGURED, - MOTION_STATUS_TRACKING + MOTION_STATUS_TRACKING, + MOTION_STATUS_PARKING, + MOTION_STATUS_PARKED, + MOTION_STATUS_ERROR }; - ACS_ENUM(SRTMinorServoMotionStatus); }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h index 48056718f..7689ab1b3 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h @@ -14,51 +14,40 @@ #include #include "SRTMinorServoCommandLibrary.h" - #define SOCKET_TIMEOUT 0.1 #define CONFIG_DOMAIN "alma/" #define CONFIG_DIRNAME "/MINORSERVO/Socket" - -class SRTMinorServoSocketTest; -class SRPProgramTrackTest; -class DerotatorProgramTrackTest; -class CombinedProgramTrackTest; -class ReadStatusOnlyTest; - - namespace MinorServo { + /** + * Testing class forward declaration. + * The declaration of this class can be found in the SRTMinorServoTestingSocket.h header file. + * Instructions on how to use this for testing purposes can be found there as well. + */ + class SRTMinorServoTestingSocket; + class SRTMinorServoSocket: public IRA::CSocket { /** * This class implements a singleton socket. The singleton pattern was necessary to provide each servo system component communication capabilities with the Leonardo system. * As long as all the said components run on the same container this will only be instanced once. */ - - /** - * Declare the testing classes as friend classes in order for them to have access to destroyInstance for testing purposes - */ - friend class ::SRTMinorServoSocketTest; - friend class ::SRPProgramTrackTest; - friend class ::DerotatorProgramTrackTest; - friend class ::CombinedProgramTrackTest; - friend class ::ReadStatusOnlyTest; - public: /** * Calls the constructor and returns the singleton socket instance * @param ip_address the IP address to which the socket will connect * @param port the port to which the socket will connect * @param timeout the timeout, in seconds, for the communication to be considered failed - * @throw MinorServoErrors::CommunicationErrorExImpl when the user calls this method a second time with different IP address and port arguments + * @throw MinorServoErrors::MinorServoErrorsEx when the user calls this method a second time with different IP address and port arguments (non testing mode) + * @throw MinorServoErrors::CommunicationErrorExImpl (testing mode) * @return the singleton socket instance, eventually connected to the given IP address and port, by reference */ static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT); /** * Returns the previously generated singleton socket instance - * @throw MinorServoErrors::CommunicationErrorExImpl when the user calls this method when the instance has not been generated yet + * @throw MinorServoErrors::MinorServoErrorsExImpl when the user calls this method when the instance has not been generated yet * @return the singleton socket instance, by reference */ static SRTMinorServoSocket& getInstance(); @@ -67,7 +56,8 @@ namespace MinorServo * Sends a command on the socket and returns the received answer, if any * @param command the command to be sent over the socket * @param map, optional SRTMinorServoAnswerMap object. If provided, the 'map' argument content gets updated with the newly received answer - * @throw MinorServoErrors::CommunicationErrorExImpl when the operation of sending or receiving fails unexpectedly + * @throw MinorServoErrors::MinorServoErrorsEx when the operation of sending or receiving fails unexpectedly (non testing mode) + * @throw MinorServoErrors::CommunicationErrorExImpl (testing mode) * @return the received answer to the given command */ SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); @@ -89,6 +79,11 @@ namespace MinorServo const bool isConnected() const; private: + /** + * Declare the testing class as friend class in order for it to have access to private members for testing purposes + */ + friend class SRTMinorServoTestingSocket; + /** * Constructor method. Generates the singleton socket instance * @param ip_address the IP address to which the socket will connect @@ -102,14 +97,10 @@ namespace MinorServo */ ~SRTMinorServoSocket(); - /** - * Force the destruction of the singleton socket object. Only used in tests - */ - static void destroyInstance(); - /** * Connection function. It gets called every time the socket gets disconnected - * throw MinorServoErrors::CommunicationErrorExImpl when the connection attempt fails + * throw MinorServoErrors::MinorServoErrorsEx when the connection attempt fails (non testing mode) + * throw MinorServoErrors::CommunicationErrorExImpl (testing mode) */ void connect(); @@ -139,6 +130,11 @@ namespace MinorServo */ static std::mutex c_mutex; + /** + * Boolean indicating whether we are testing the socket or not + */ + inline static bool c_testing = false; + /** * Socket status enumerator */ diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h new file mode 100644 index 000000000..1fc5b236f --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h @@ -0,0 +1,65 @@ +#include "SRTMinorServoSocket.h" + +namespace MinorServo +{ + class SRTMinorServoTestingSocket: public SRTMinorServoSocket + { + /** + * This class is a friend class of SRTMinorServoSocket. It can be used for testing purposes without altering the behavior of the original class. + * Instructions on how to use this class inside tests: + * 1) Declare the test class with a forward declaration + * 2) Define the FRIEND_CLASS_DECLARATION macro + * 3) Include this header file + * 4) Finally implement the test class + * Example: + * + * ... + * class TestClass; + * #define FRIEND_CLASS_DECLARATION friend class ::TestClass; + * #include "SRTMinorServoTestingSocket.h" + * + * class TestClass : public ::testing::Test + * { + * ... + */ + + /** + * This is a macro that each test file will have to define prior to including this header file. + * It can be a single or multiple lines each one containing a friend class declaration. + */ + FRIEND_CLASS_DECLARATION; + public: + /** + * Ovverride of the original SRTMinorServoSocket getInstance methods. Before doing anything, they set the c_testing variable of the original class to true. + * This changes how the exceptions are thrown. + * In non testing purposes, exceptions are thrown as MinorServoErrorsEx + * In testing purposes, exceptions are thrown as they are (ExImpl) + * This change in behavior allow for better testing and debugging purposes, while still allowing the socket to throw the base MinorServoErrorsEx when not used in testing purposes. + * This allow us to avoid catching exceptions in the component, since MinorServoErrorsEx are already captured by CORBA + */ + static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT) + { + SRTMinorServoSocket::c_testing = true; + return SRTMinorServoSocket::getInstance(ip_address, port, timeout); + } + static SRTMinorServoSocket& getInstance() + { + SRTMinorServoSocket::c_testing = true; + return SRTMinorServoSocket::getInstance(); + } + + /** + * This method explicitly destroys the singleton socket instance. + * Each test in the same test file is executed under the same process, therefore a singleton instance that does not get destroyed will still exist in the next executed tests. + * We want to test a new instance of the socket every time, therefore the existence of this method is critical. + */ + static void destroyInstance() + { + if(SRTMinorServoSocket::m_instance != nullptr) + { + delete SRTMinorServoSocket::m_instance; + SRTMinorServoSocket::m_instance = nullptr; + } + } + }; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index f9034eb01..d8b66463f 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -54,7 +54,7 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h +INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h #hexlib.h # # Libraries (public and local) diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index c5cc76fbf..04854326d 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -1,5 +1,15 @@ #include "SRTMinorServoSocket.h" +#define THROW \ +if(c_testing) \ +{ \ + throw impl; \ +} \ +else \ +{ \ + throw impl.getMinorServoErrorsEx(); \ +} + using namespace MinorServo; std::mutex SRTMinorServoSocket::c_mutex; @@ -14,7 +24,7 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, in { _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); impl.setReason(("Socket already open on '" + m_instance->m_ip_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); - throw impl; + THROW; } } else @@ -32,20 +42,11 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance() { _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); impl.setReason("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); - throw impl; + THROW; } return *m_instance; } -void SRTMinorServoSocket::destroyInstance() -{ - if(m_instance != nullptr) - { - delete m_instance; - m_instance = nullptr; - } -} - SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, double timeout) : m_ip_address(ip_address), m_port(port), m_timeout(timeout), m_socket_status(NOTREADY) { try @@ -80,7 +81,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot create the socket."); - throw impl; + THROW; } if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) @@ -89,7 +90,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot connect the socket."); - throw impl; + THROW; } if(setSockMode(m_error, NONBLOCKING) != SUCCESS) @@ -98,7 +99,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot set the socket to non-blocking."); - throw impl; + THROW; } m_socket_status = READY; @@ -133,7 +134,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); impl.setReason("Something went wrong while sending some bytes."); - throw impl; + THROW; } if(sent_now > 0) @@ -147,7 +148,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); impl.setReason("Timeout when sending command."); - throw impl; + THROW; } } @@ -172,7 +173,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); impl.setReason("Timeout when receiving answer."); - throw impl; + THROW; } } catch(...) @@ -181,7 +182,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); impl.setReason("Something went wrong while receiving some bytes."); - throw impl; + THROW; } } diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp index 742459c1e..8943dcf87 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp @@ -4,7 +4,6 @@ #include "gtest/gtest.h" #include #include -#include "SRTMinorServoSocket.h" #include "SRTMinorServoCommandLibrary.h" // This address and port are the ones set in the simulator @@ -13,10 +12,12 @@ #define ADDRESS std::string("127.0.0.1") #define PORT 12800 +class SRTMinorServoSocketTest; +#define FRIEND_CLASS_DECLARATION friend class ::SRTMinorServoSocketTest; +#include "SRTMinorServoTestingSocket.h" using namespace MinorServo; - class SRTMinorServoSocketTest : public ::testing::Test { protected: @@ -39,14 +40,14 @@ protected: void TearDown() override { - SRTMinorServoSocket::destroyInstance(); + SRTMinorServoTestingSocket::destroyInstance(); } }; // This test passes the already created instance to some threads TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT); if(!socket.isConnected()) { @@ -83,7 +84,7 @@ TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) { try { - auto args = SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command); + auto args = SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT).sendCommand(command); // By testing if the command was received correctly we also test if the socket is working properly // and if the answer was received correctly without being interleaved with the answer from another thread EXPECT_TRUE(args.checkOutput()); @@ -121,10 +122,10 @@ TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) try { // First let's open the socket with the chosen ADDRESS and PORT - SRTMinorServoSocket::getInstance(ADDRESS, PORT); + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT); // Let's try to instance another socket on a different port - SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT + 1); } catch(MinorServoErrors::CommunicationErrorExImpl& ex) { @@ -146,7 +147,7 @@ TEST_F(SRTMinorServoSocketTest, try_open_without_args) { try { - SRTMinorServoSocket::getInstance(); + SRTMinorServoTestingSocket::getInstance(); } catch(MinorServoErrors::CommunicationErrorExImpl& ex) { @@ -169,7 +170,7 @@ TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) try { // The exception is raised only if the given port is wrong - SRTMinorServoSocket::getInstance(ADDRESS, 0); + SRTMinorServoTestingSocket::getInstance(ADDRESS, 0); } catch(MinorServoErrors::CommunicationErrorExImpl& ex) { -- GitLab From 56ced070e4da5e9914a2e2753d9259f15c5568c0 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 26 Jan 2024 18:05:09 +0000 Subject: [PATCH 053/150] Commented new interfaces --- .../idl/SRTMinorServo.idl | 242 ++++++++++++++++-- .../idl/SRTMinorServoBoss.idl | 53 +++- 2 files changed, 272 insertions(+), 23 deletions(-) diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 3d91e7e34..844677d91 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -1,61 +1,263 @@ +#ifndef __SRTMINORSERVO_IDL__ +#define __SRTMINORSERVO_IDL__ /***************************************************************\ * Authors: * Giuseppe Carboni * * Created: Mon Mar 06 12:30:00 CEST 2023 - * Last Modified: Mon Mar 06 12:30:00 CEST 2023 \***************************************************************/ -#ifndef __SRTMINORSERVO_IDL__ -#define __SRTMINORSERVO_IDL__ - #include "SRTMinorServoCommon.idl" #pragma prefix "alma" module MinorServo { + /** + * This IDL interface describes the CORBA interface of a common SRTMinorServo component. + * This is simply the base interface from which the SRTGenericMinorServo and SRTProgramTrackMinorServo interfaces inherit. + */ interface SRTBaseMinorServo : ACS::CharacteristicComponent { + /** + * This property tells if all the servo axes are enabled + */ readonly attribute Management::ROTBoolean enabled; + + /** + * This property tells the status of the servo drive cabinet + */ readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; + + /** + * This property tells if the servo is in blocked state and cannot move + */ readonly attribute Management::ROTBoolean block; + + /** + * This property returns the current operative mode of the servo + */ readonly attribute ROSRTMinorServoOperativeMode operative_mode; + + /** + * This property returns the sequence of statuses of the servo physical axes + */ readonly attribute ACS::RObooleanSeq physical_axes_enabled; + + /** + * This property returns the sequence of current positions of the physical axes of the servo + */ readonly attribute ACS::ROdoubleSeq physical_positions; + + /** + * This property returns the number of virtual axes of the servo + */ readonly attribute ACS::ROlong virtual_axes; + + /** + * This property returns the current plain positions of the virtual axes of the servo + * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets + */ + readonly attribute ACS::ROdoubleSeq plain_virtual_positions; + + /** + * This property returns the current positions of the virtual axes of the servo + * The positions returned by this property equals to the plain virtual positions minus the offsets + */ readonly attribute ACS::ROdoubleSeq virtual_positions; + + /** + * This property returns the current offsets of the virtual axes of the servo + * The offset values are the sum of user and system offsets + */ readonly attribute ACS::ROdoubleSeq virtual_offsets; + + /** + * This property returns the current user offsets of the virtual axes of the servo + */ readonly attribute ACS::ROdoubleSeq virtual_user_offsets; + + /** + * This property returns the current system offsets of the virtual axes of the servo + */ readonly attribute ACS::ROdoubleSeq virtual_system_offsets; + + /** + * This property indicates whether the servo is in use in the current configuration + */ readonly attribute Management::ROTBoolean in_use; + + /** + * This property returns the configuration of the servo. Each configuration has different positioning coefficients + */ readonly attribute ACS::ROstring current_setup; - void status() raises (ComponentErrors::ComponentErrorsEx); - void stow(in long stow_position) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void stop() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void preset(in ACS::doubleSeq coordinates) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void offset(in ACS::doubleSeq offsets) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + /** + * This method asks the PLC the status for the corresponding servo + * @return true if the servo is not in an error state, false otherwise + */ + boolean status(); + + /** + * This method commands a STOW operation to the servo + * @param stow_position the index of the position we want the servo to stow to + * @throw MinorServo::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + */ + void stow(in long stow_position) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method commands a STOP operation to the servo + * @throw MinorServo::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + */ + void stop() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method commands a PRESET operation to the servo + * @param coordinates, a sequence of double + * @throw MinorServo::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted + */ + void preset(in ACS::doubleSeq coordinates) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method loads from the CDB the positioning coefficients related to the given configuration + * @param configuration the string representing the name of the table from which the coefficients will be loaded + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration + */ + void setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx); + + /** + * This method calculates the servo coordinates for a given elevation + * @param elevation the elevation to use for the coordinates calculation, expressed in degrees + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculalation + * @return the calculated coordinates as a sequence of doubles + */ + ACS::doubleSeq calcCoordinates(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the user offsets of the servo + * @return the user offsets as a sequence of doubles + */ ACS::doubleSeq getUserOffsets(); - void setUserOffset(in string axis_name, in double offset) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void clearUserOffsets() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); + + /** + * This method sets the user offset of the servo for a given axis + * @param axis_name a string corresponding to the axis we want to set the offset for + * @param offset the absolute user offset value for the given servo axis + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted + */ + void setUserOffset(in string axis_name, in double offset) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method sets the user offsets to zero for all the servo axes + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void clearUserOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the system offsets of the servo + * @return the system offsets as a sequence of doubles + */ ACS::doubleSeq getSystemOffsets(); - void setSystemOffset(in string axis_name, in double offset) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void clearSystemOffsets() raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx, MinorServoErrors::MinorServoErrorsEx); - void getAxesInfo(out ACS::stringSeq axes_names, out ACS::stringSeq axes_units) raises (ComponentErrors::ComponentErrorsEx); - ACS::doubleSeq calcCoordinates(in double elevation); + /** + * This method sets the system offset of the servo for a given axis + * @param axis_name a string corresponding to the axis we want to set the offset for + * @param offset the absolute system offset value for the given servo axis + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted + */ + void setSystemOffset(in string axis_name, in double offset) raises (MinorServoErrors::MinorServoErrorsEx); - }; + /** + * This method sets the system offsets to zero for all the servo axes + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void clearSystemOffsets() raises (MinorServoErrors::MinorServoErrorsEx); - interface SRTGenericMinorServo : SRTBaseMinorServo - { + /** + * This method returns in the two parameters passed as reference, the names and the units of measure of the axes of the servo, respectively + * @param axes_names the sequence of strings containing the names of the virtual axes of the servo + * @param axes_units the sequence of strings containing the units of measure of each virtual axis of the servo + */ + void getAxesInfo(out ACS::stringSeq axes_names, out ACS::stringSeq axes_units); + + /** + * This method returns the positions of all the axes of the servo for a given time + * @param acs_time the ACS::Time for which we want to retrieve the servo positions + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty + * @return a sequence of doubles containing the positions of the servo for the given time + */ + ACS::doubleSeq getAxesPositions(in ACS::Time acs_time) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the time it would take for the servo to get from a starting position to a destination position + * An empty starting position means the function will calculate the travel time from the current position, taking into account the current speed as well + * To account for the current speed, it is sufficient to call the method in this way: + * getTravelTime(ACS::doubleSeq(), ); + * @param starting_position the sequence of starting axes positions or an empty sequence + * @param destination_position the sequence of destination axes positions, mandatory + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + ACS::TimeInterval getTravelTime(in ACS::doubleSeq starting_position, in ACS::doubleSeq destination_position); + + /** + * This method returns the minimum and maximun ranges for all the servo axes in the given sequence passed by reference + * @param min_ranges the minimum range of the servo axes + * @param max_ranges the maximum range of the servo axes + */ + void getAxesRanges(out ACS::doubleSeq min_ranges, out ACS::doubleSeq max_ranges); }; + /** + * This IDL interface describes the CORBA interface of a generic SRTMinorServo component. + * This interface is derived from the SRTBaseMinorServo and it is empty. + * It's sole purpose is to generate the POA_MinorServo::SRTGenericMinorServo class needed for the components. + */ + interface SRTGenericMinorServo : SRTBaseMinorServo {}; + + /** + * This IDL interface describes the CORBA interface of a ProgramTrack-capable SRTMinorServo component. + * It extends the SRTBaseMinorServo interface with some more attributes and methods described below. + */ interface SRTProgramTrackMinorServo : SRTBaseMinorServo { - void programTrack(in long trajectory_id, in long point_id, in double start_time, in ACS::doubleSeq coordinates) raises (ComponentErrors::ComponentErrorsEx); + /** + * This property indicates whether the servo system is tracking the given trajectory + */ + readonly attribute Management::ROTBoolean tracking; + + /** + * This property indicates the ID of the trajectory. It always corresponds to starting time of the trajectory, expressed as the UNIX Epoch * 1000 (long) + */ + readonly attribute ACS::ROlong trajectory_id; + + /** + * This property indicates the total number of points loaded into the current trajectory + */ + readonly attribute ACS::ROlong total_trajectory_points; + + /** + * This property indicates the number of points of the current trajectory which remain to be tracked + */ + readonly attribute ACS::ROlong remaining_trajectory_points; + + /** + * This method loads a set of coordinates that have to be tracked by the servo system + * @param trajectory_id the ID of the trajectory to which the current point belongs + * @param point_id the ID of the point inside the current trajectory. It must be a consecutive number for the servo system to acknowledge + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the servo system and the points after are spaced by 0.2 seconds from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param coordinates the coordinates to track at the given time + * @throw MinorServoErrorsEx when the length of the coordinates sequence does not match the number of virtual axis of the servo system, + * when there has been a communication error or when the command was not accepted + */ + void programTrack(in long trajectory_id, in long point_id, in ACS::Time point_time, in ACS::doubleSeq coordinates); }; }; diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl index 7bb3d8efc..e7a42686f 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -1,3 +1,5 @@ +#ifndef __SRTMINORSERVOBOSS_IDL__ +#define __SRTMINORSERVOBOSS_IDL__ /***************************************************************\ * Authors: * Giuseppe Carboni @@ -5,8 +7,6 @@ * Created: Mon Mar 06 12:30:00 CEST 2023 * Last Modified: Mon Mar 06 12:30:00 CEST 2023 \***************************************************************/ -#ifndef __SRTMINORSERVOBOSS_IDL__ -#define __SRTMINORSERVOBOSS_IDL__ #include #include "SRTMinorServoCommon.idl" @@ -17,17 +17,64 @@ module MinorServo { interface SRTMinorServoBoss: MinorServoBoss { + /** + * Current configuration of the Leonardo minor servo system + */ readonly attribute ROSRTMinorServoFocalConfiguration current_configuration; + + /** + * Boolean indicating whether the system is in simulation mode or not + */ readonly attribute Management::ROTBoolean simulation_enabled; + + /** + * UNIX Epoch of the Leonardo minor servo system PLC machine + */ readonly attribute ACS::ROdouble plc_time; + + /** + * Version of the software on the PLC machine + */ readonly attribute ACS::ROstring plc_version; + + /** + * Enumeration indicating whether the system is controlled by VBrain or DISCOS + */ readonly attribute ROSRTMinorServoControlStatus control; + + /** + * Boolean indicating whether all the axes are powered or not + */ readonly attribute Management::ROTBoolean power; + + /** + * Boolean indicating whether the system entered an emergency status + */ readonly attribute Management::ROTBoolean emergency; + + /** + * Position of the gregorian cover + */ readonly attribute ROSRTMinorServoGregorianCoverStatus gregorian_cover; + + /** + * UNIX Epoch of the last executed command (STATUS commands are not shown here) + */ readonly attribute ACS::ROdouble last_executed_command; - void preset(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx, ComponentErrors::ComponentErrorsEx); + /** + * This command sets all the minor servos involved in the current focal configuration to their position calculated from the elevation argument + * @param elevation, the elevation the minor servos should use to calculate their position + * @throw MinorServoErrors::MinorServoErrorsEx + */ + void preset(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This command opens or closes the gregorian cover + * @param value, the desired gregorian cover position, accepted values are 'open', 'OPEN', 'closed' or 'CLOSED' + * @throw MinorServoErrors::MinorServoErrorsEx + */ + void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); }; }; -- GitLab From a9c8ff273d72876902628ac97c2c788d54cbd449 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 5 Feb 2024 21:06:37 +0000 Subject: [PATCH 054/150] Updated CDB schemas and configurations --- .../DataBlock/MinorServo/GFR/Properties/Properties.xml | 2 ++ .../DataBlock/MinorServo/M3R/Properties/Properties.xml | 2 ++ .../DataBlock/MinorServo/PFP/Properties/Properties.xml | 4 ++++ .../DataBlock/MinorServo/SRP/Properties/Properties.xml | 7 +++++++ SRT/CDB/alma/MINORSERVO/Boss/Boss.xml | 2 +- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 4 ++-- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 3 ++- .../SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd | 2 +- .../SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd | 2 +- .../config/CDB/schemas/SRTMinorServoProperties.xsd | 1 + 10 files changed, 23 insertions(+), 6 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml index c6ae42675..d68395104 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -18,5 +18,7 @@ ROTATION + degree + OFFSET diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml index c6ae42675..d68395104 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -18,5 +18,7 @@ ROTATION + degree + OFFSET diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml index b720bbf40..688491e30 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -26,6 +26,10 @@ TZ RTHETA + mm + mm + degree + OFFSET_TX OFFSET_TZ OFFSET_RTHETA diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml index 963812767..165d5198f 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -31,6 +31,13 @@ RY RZ + mm + mm + mm + degree + degree + degree + OFFSET_TX OFFSET_TY OFFSET_TZ diff --git a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml index fe264a507..4dab29cf9 100644 --- a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -13,6 +13,7 @@ active_surface_configuration="ON" elevation_tracking_enabled="ON"> + @@ -23,7 +24,6 @@ - diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index cb8ba9221..064ca71d1 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -12,8 +12,8 @@ max_speed="1, 1, 1" acceleration="1, 1, 1" min_range="0, 0, 0" - max_range="0, 0, 0"> - + max_range="0, 0, 0" + tracking_delta="1, 1, 1"> diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index f625964b3..fcb93eec9 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -12,7 +12,8 @@ max_speed="4, 4, 4, 0.38, 0.38, 0.38" acceleration="8, 8, 8, 0.76, 0.76, 0.76" min_range="-50, -110, -50, -0.25, -0.25, -0.25" - max_range="50, 110, 50, 0.25, 0.25, 0.25"> + max_range="50, 110, 50, 0.25, 0.25, 0.25" + tracking_delta="1, 1, 1, 1, 1, 1"> diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index 198b9eeb2..e2477b42c 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -76,7 +76,7 @@ - + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd index 2484bce95..2d87a89a5 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -50,6 +50,7 @@ + @@ -60,7 +61,6 @@ - diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd index 46c9f8a9e..e1f7c7a52 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd @@ -25,6 +25,7 @@ + -- GitLab From ba9e2a758edb49215b3f78b2cb908e76edb8c751 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 5 Feb 2024 21:09:05 +0000 Subject: [PATCH 055/150] Updated SRTMinorServo interfaces --- .../SRTMinorServoInterface/idl/SRTMinorServoBoss.idl | 5 +++++ .../SRTMinorServoInterface/idl/SRTMinorServoCommon.midl | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl index e7a42686f..ae5c1138b 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -17,6 +17,11 @@ module MinorServo { interface SRTMinorServoBoss: MinorServoBoss { + /** + * Boolean indicating whether the component is connected to the Leonardo Minor Servo system + */ + readonly attribute Management::ROTBoolean connected; + /** * Current configuration of the Leonardo minor servo system */ diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 841b46537..6addf4c0d 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -54,8 +54,8 @@ module MinorServo enum SRTMinorServoGregorianCoverStatus { COVER_STATUS_UNKNOWN, - COVER_STATUS_OPEN, - COVER_STATUS_CLOSED + COVER_STATUS_CLOSED, + COVER_STATUS_OPEN }; ACS_ENUM(SRTMinorServoGregorianCoverStatus); -- GitLab From 4cbe905d2ad4f4c80120f217975116f192d5803f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 5 Feb 2024 21:16:58 +0000 Subject: [PATCH 056/150] Updated SRT MinorServo Libraries and tests --- .../include/SRTMinorServoAnswerMap.h | 34 +--- .../include/SRTMinorServoSocket.h | 16 +- .../include/SRTMinorServoTestingSocket.h | 40 ----- .../include/SRTMinorServoUtils.h | 149 ++++++++++++++++++ .../SRTMinorServoLibrary/src/Makefile | 8 +- .../src/SRTMinorServoSocket.cpp | 28 ++-- .../SRTMinorServoLibrary/tests/Makefile | 4 +- .../tests/SRTMinorServoSocketTest.cpp | 86 ++++++---- 8 files changed, 229 insertions(+), 136 deletions(-) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h index 83bef228d..c196676ee 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h @@ -3,42 +3,14 @@ #include #include -#include -#include #include #include #include - -#include -C11_IGNORE_WARNING_PUSH -C11_IGNORE_WARNING("-Wunused-function") - -static std::ostream& operator<<(std::ostream& out, const std::variant& value) -{ - std::visit([&out](const auto& val) { out << val; }, value); - return out; -} - -C11_IGNORE_WARNING_POP +#include "SRTMinorServoUtils.h" namespace MinorServo { - /** - * The following templates are useful if you want to check if a given type for the SRTMinorServoAnswerMap is accepted - */ - template - struct is_string : public std::disjunction>, std::is_same>, std::is_same>> {}; - - template - inline constexpr bool is_string_v = is_string::value; - - template - struct is_known : public std::disjunction>, is_string>> {}; - - template - inline constexpr bool is_known_v = is_known::value; - class SRTMinorServoAnswerMap : private std::map> { /** @@ -114,7 +86,7 @@ namespace MinorServo template T get(const std::string& key) const { - if constexpr(std::negation_v>) + if constexpr(std::negation_v>) { throw std::runtime_error("Unsupported type."); } @@ -144,7 +116,7 @@ namespace MinorServo template void put(const std::string& key, const T& value) { - if constexpr(std::negation_v>) + if constexpr(std::negation_v>) { throw std::runtime_error("Unsupported type."); } diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h index 7689ab1b3..4d2174cd6 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h @@ -23,7 +23,7 @@ namespace MinorServo /** * Testing class forward declaration. * The declaration of this class can be found in the SRTMinorServoTestingSocket.h header file. - * Instructions on how to use this for testing purposes can be found there as well. + * A developer must use this class for testing purposes if he needs to destroy the singleton socket instance as well. */ class SRTMinorServoTestingSocket; @@ -39,8 +39,7 @@ namespace MinorServo * @param ip_address the IP address to which the socket will connect * @param port the port to which the socket will connect * @param timeout the timeout, in seconds, for the communication to be considered failed - * @throw MinorServoErrors::MinorServoErrorsEx when the user calls this method a second time with different IP address and port arguments (non testing mode) - * @throw MinorServoErrors::CommunicationErrorExImpl (testing mode) + * @throw MinorServoErrors::MinorServoErrorsEx when the user calls this method a second time with different IP address and port arguments * @return the singleton socket instance, eventually connected to the given IP address and port, by reference */ static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT); @@ -56,8 +55,7 @@ namespace MinorServo * Sends a command on the socket and returns the received answer, if any * @param command the command to be sent over the socket * @param map, optional SRTMinorServoAnswerMap object. If provided, the 'map' argument content gets updated with the newly received answer - * @throw MinorServoErrors::MinorServoErrorsEx when the operation of sending or receiving fails unexpectedly (non testing mode) - * @throw MinorServoErrors::CommunicationErrorExImpl (testing mode) + * @throw MinorServoErrors::MinorServoErrorsEx when the operation of sending or receiving fails unexpectedly * @return the received answer to the given command */ SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); @@ -99,8 +97,7 @@ namespace MinorServo /** * Connection function. It gets called every time the socket gets disconnected - * throw MinorServoErrors::MinorServoErrorsEx when the connection attempt fails (non testing mode) - * throw MinorServoErrors::CommunicationErrorExImpl (testing mode) + * throw MinorServoErrors::MinorServoErrorsEx when the connection attempt fails */ void connect(); @@ -130,11 +127,6 @@ namespace MinorServo */ static std::mutex c_mutex; - /** - * Boolean indicating whether we are testing the socket or not - */ - inline static bool c_testing = false; - /** * Socket status enumerator */ diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h index 1fc5b236f..da33e9dd9 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h @@ -6,48 +6,8 @@ namespace MinorServo { /** * This class is a friend class of SRTMinorServoSocket. It can be used for testing purposes without altering the behavior of the original class. - * Instructions on how to use this class inside tests: - * 1) Declare the test class with a forward declaration - * 2) Define the FRIEND_CLASS_DECLARATION macro - * 3) Include this header file - * 4) Finally implement the test class - * Example: - * - * ... - * class TestClass; - * #define FRIEND_CLASS_DECLARATION friend class ::TestClass; - * #include "SRTMinorServoTestingSocket.h" - * - * class TestClass : public ::testing::Test - * { - * ... */ - - /** - * This is a macro that each test file will have to define prior to including this header file. - * It can be a single or multiple lines each one containing a friend class declaration. - */ - FRIEND_CLASS_DECLARATION; public: - /** - * Ovverride of the original SRTMinorServoSocket getInstance methods. Before doing anything, they set the c_testing variable of the original class to true. - * This changes how the exceptions are thrown. - * In non testing purposes, exceptions are thrown as MinorServoErrorsEx - * In testing purposes, exceptions are thrown as they are (ExImpl) - * This change in behavior allow for better testing and debugging purposes, while still allowing the socket to throw the base MinorServoErrorsEx when not used in testing purposes. - * This allow us to avoid catching exceptions in the component, since MinorServoErrorsEx are already captured by CORBA - */ - static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT) - { - SRTMinorServoSocket::c_testing = true; - return SRTMinorServoSocket::getInstance(ip_address, port, timeout); - } - static SRTMinorServoSocket& getInstance() - { - SRTMinorServoSocket::c_testing = true; - return SRTMinorServoSocket::getInstance(); - } - /** * This method explicitly destroys the singleton socket instance. * Each test in the same test file is executed under the same process, therefore a singleton instance that does not get destroyed will still exist in the next executed tests. diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h new file mode 100644 index 000000000..f3ff3be96 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h @@ -0,0 +1,149 @@ +#ifndef _SRTMINORSERVOUTILS_H +#define _SRTMINORSERVOUTILS_H +#include +#include +#include +#include +#include + +/** + * The following templates are useful if you want to check if a given type for the SRTMinorServoAnswerMap is accepted + */ +template +struct is_atomic { static constexpr bool value = false; }; + +template +struct is_atomic> { static constexpr bool value = true; }; + +template +inline constexpr bool is_atomic_v = is_atomic::value; + +template +struct is_any : public std::disjunction...> {}; + +template +inline constexpr bool is_any_v = (std::is_same_v || ...); + +template +struct is_string : public std::disjunction, char*, const char*, std::string>> {}; + +template +inline constexpr bool is_string_v = is_string::value; + +template +struct is_known : public std::disjunction>, is_string>> {}; + +template +inline constexpr bool is_known_v = is_known::value; + +template , std::is_same>>>> +struct DB_type +{ + using type = std::conditional_t, std::is_same>>, IRA::CString, std::conditional_t, long, double>>; +}; + +template +T getCDBValue(maci::ContainerServices* container_services, const std::string& field, const std::string& component="") +{ + return getCDBValue(container_services, field.c_str(), component.c_str()); +} + +template +T getCDBValue(maci::ContainerServices* container_services, const char* field, const char* component="") +{ + using C = typename DB_type::type; + + C temp; + if(IRA::CIRATools::getDBValue(container_services, field, temp, "alma/", component)) + { + if constexpr(std::is_same_v>) + { + std::vector values; + std::istringstream iss(std::string(temp).c_str()); + std::string token; + while(std::getline(iss, token, ',')) + { + double value; + try + { + value = std::stod(token); + } + catch(std::invalid_argument& ia) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setFieldName(field); + throw ex.getComponentErrorsEx(); + } + catch(std::out_of_range& oor) + { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setValueName(field); + ex.setValueLimit(token.find('-') == std::string::npos ? std::numeric_limits::max() : std::numeric_limits::min()); + throw ex.getComponentErrorsEx(); + } + + values.push_back(value); + } + return values; + } + else if constexpr(std::is_same_v) + { + return (T)std::string(temp).c_str(); + } + else + { + return T(temp); + } + } + else + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setFieldName(field); + throw ex.getComponentErrorsEx(); // Maybe throw the plain ex + } +} + +const char* getReasonFromEx(const auto& ex) +{ + std::string reason = "Unknown reason"; + + for(auto [name, value] : ex.errorTrace.data) + { + if(strcmp(name, "Reason") == 0) + { + reason = value; + break; + } + } + + return reason.c_str(); +} + +const char* getErrorFromEx(const auto& ex) +{ + std::string error(ex.errorTrace.routine); + + for(auto [name, value] : ex.errorTrace.data) + { + if(strcmp(name, "Reason") == 0) + { + error += ": " + std::string(value); + break; + } + } + + return error.c_str(); +} + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wunused-function") + +static std::ostream& operator<<(std::ostream& out, const std::variant& value) +{ + std::visit([&out](const auto& val) { out << val; }, value); + return out; +} + +C11_IGNORE_WARNING_POP + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index d8b66463f..26d07014c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -54,7 +54,7 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h #hexlib.h +INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h SRTMinorServoUtils.h #hexlib.h # # Libraries (public and local) @@ -64,14 +64,14 @@ LIBRARIES_L = SRTMinorServoLibrary_OBJECTS = hexlib SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary -SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 +SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -fconcepts SRTMinorServoCommandLibrary_LIBS = pthread IRALibrary PySRTMinorServoCommandLibrary_OBJECTS = PySRTMinorServoCommandLibrary -PySRTMinorServoCommandLibrary_CFLAGS = -std=c++17 +PySRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -fconcepts PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python3 SRTMinorServoSocketLibrary_OBJECTS = SRTMinorServoSocket SRTMinorServoSocketLibrary_LIBS = IRALibrary ComponentErrors MinorServoErrors SRTMinorServoCommandLibrary -SRTMinorServoSocket_CFLAGS = -std=c++17 +SRTMinorServoSocket_CFLAGS = -std=c++17 -fconcepts # # diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index 04854326d..d0e3405ef 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -1,15 +1,5 @@ #include "SRTMinorServoSocket.h" -#define THROW \ -if(c_testing) \ -{ \ - throw impl; \ -} \ -else \ -{ \ - throw impl.getMinorServoErrorsEx(); \ -} - using namespace MinorServo; std::mutex SRTMinorServoSocket::c_mutex; @@ -24,7 +14,7 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, in { _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); impl.setReason(("Socket already open on '" + m_instance->m_ip_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); - THROW; + throw impl.getMinorServoErrorsEx(); } } else @@ -42,7 +32,7 @@ SRTMinorServoSocket& SRTMinorServoSocket::getInstance() { _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); impl.setReason("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); - THROW; + throw impl.getMinorServoErrorsEx(); } return *m_instance; } @@ -81,7 +71,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot create the socket."); - THROW; + throw impl.getMinorServoErrorsEx(); } if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) @@ -90,7 +80,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot connect the socket."); - THROW; + throw impl.getMinorServoErrorsEx(); } if(setSockMode(m_error, NONBLOCKING) != SUCCESS) @@ -99,7 +89,7 @@ void SRTMinorServoSocket::connect() Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); impl.setReason("Cannot set the socket to non-blocking."); - THROW; + throw impl.getMinorServoErrorsEx(); } m_socket_status = READY; @@ -134,7 +124,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); impl.setReason("Something went wrong while sending some bytes."); - THROW; + throw impl.getMinorServoErrorsEx(); } if(sent_now > 0) @@ -148,7 +138,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); impl.setReason("Timeout when sending command."); - THROW; + throw impl.getMinorServoErrorsEx(); } } @@ -173,7 +163,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); impl.setReason("Timeout when receiving answer."); - THROW; + throw impl.getMinorServoErrorsEx(); } } catch(...) @@ -182,7 +172,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); impl.setReason("Something went wrong while receiving some bytes."); - THROW; + throw impl.getMinorServoErrorsEx(); } } diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile index 1e8380bf7..517c0d13a 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile @@ -17,12 +17,12 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) EXECUTABLES_L = SRTMinorServoCommandLibraryTest SRTMinorServoSocketTest SRTMinorServoCommandLibraryTest_OBJECTS = SRTMinorServoCommandLibraryTest -SRTMinorServoCommandLibraryTest_CFLAGS = -std=c++17 +SRTMinorServoCommandLibraryTest_CFLAGS = -std=c++17 -fconcepts SRTMinorServoCommandLibraryTest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary SRTMinorServoCommandLibraryTest_LDFLAGS = -lstdc++ -lpthread SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest -SRTMinorServoSocketTest_CFLAGS = -std=c++17 +SRTMinorServoSocketTest_CFLAGS = -std=c++17 -fconcepts SRTMinorServoSocketTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp index 8943dcf87..7de92d0c1 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp @@ -4,7 +4,9 @@ #include "gtest/gtest.h" #include #include +#include "SRTMinorServoUtils.h" #include "SRTMinorServoCommandLibrary.h" +#include "SRTMinorServoTestingSocket.h" // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: @@ -12,10 +14,6 @@ #define ADDRESS std::string("127.0.0.1") #define PORT 12800 -class SRTMinorServoSocketTest; -#define FRIEND_CLASS_DECLARATION friend class ::SRTMinorServoSocketTest; -#include "SRTMinorServoTestingSocket.h" - using namespace MinorServo; class SRTMinorServoSocketTest : public ::testing::Test @@ -51,7 +49,7 @@ TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) if(!socket.isConnected()) { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; } for(auto command : this->commands) @@ -89,18 +87,23 @@ TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) // and if the answer was received correctly without being interleaved with the answer from another thread EXPECT_TRUE(args.checkOutput()); } - catch(MinorServoErrors::CommunicationErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { std::lock_guard guard(mutex); - if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + try { - error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; + if(std::string(getReasonFromEx(ex)) == "Cannot connect the socket.") + { + error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } } - else + catch(...) { - error = "Unexpected failure."; } + + error = "Unexpected failure."; } })); } @@ -112,7 +115,7 @@ TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) if(error != "") { - FAIL() << error << std::endl; + FAIL() << error; } } @@ -127,17 +130,26 @@ TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) // Let's try to instance another socket on a different port SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT + 1); } - catch(MinorServoErrors::CommunicationErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + try { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - return; + std::string reason(getReasonFromEx(ex)); + + if(reason == "Cannot connect the socket.") + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(reason, "Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object."); + } } - else + catch(...) { - // Check if we got the correct exception - EXPECT_EQ(ex.getReason(), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + FAIL() << "Unexpected failure."; } } } @@ -149,17 +161,26 @@ TEST_F(SRTMinorServoSocketTest, try_open_without_args) { SRTMinorServoTestingSocket::getInstance(); } - catch(MinorServoErrors::CommunicationErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - if(ex.getReason() == std::string("Cannot connect the socket.").c_str()) + try { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - return; + std::string reason(getReasonFromEx(ex)); + + if(reason == "Cannot connect the socket.") + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(reason, "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + } } - else + catch(...) { - // Check if we got the correct exception - EXPECT_EQ(ex.getReason(), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); + FAIL() << "Unexpected failure."; } } } @@ -172,9 +193,18 @@ TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) // The exception is raised only if the given port is wrong SRTMinorServoTestingSocket::getInstance(ADDRESS, 0); } - catch(MinorServoErrors::CommunicationErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - // Check if we got the correct exception - EXPECT_EQ(ex.getReason(), std::string("Cannot connect the socket.").c_str()); + try + { + std::string reason(getReasonFromEx(ex)); + + // Check if we got the correct exception + EXPECT_EQ(reason, "Cannot connect the socket."); + } + catch(...) + { + FAIL() << "Unexpected failure."; + } } } -- GitLab From f6070e0e312893858a4b6f0314f1fb9916a90eb6 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 6 Feb 2024 11:42:24 +0000 Subject: [PATCH 057/150] Updates for CLow and SRT Active Surface --- .../RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml | 2 +- .../SRT5GHzReceiver/Synthesizer/Synthesizer.xml | 4 ++-- .../include/SRTActiveSurfaceBossCore.h | 6 +++--- .../src/SRTActiveSurfaceBossCore.cpp | 14 ++++++-------- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index a5c080c2a..8fc0f3bb6 100644 --- a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -9,7 +9,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="5GHzReceiver" - Code="SRT7GHzImpl" + Code="SRT5GHzImpl" Type="IDL:alma/Receivers/SRT5GHz:1.0" Container="SRT5GHzContainer" KeepAliveTime="-1" diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml index 892a6cf1f..b336a520a 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml @@ -5,6 +5,6 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -8200.06 +8200.016 - \ No newline at end of file + diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h index 8f02a34c8..89494afae 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h @@ -35,8 +35,8 @@ #define lastUSD 1116 #define LOOPTIME 100000 // 0,10 sec #define CDBPATH std::string(getenv("ACS_CDB")) + "/CDB/" -#define USDTABLE (CDBPATH + "alma/AS/tab_convUSD.txt").c_str() -#define USDTABLECORRECTIONS (CDBPATH + "alma/AS/act_rev02.txt").c_str() +#define USDTABLE CDBPATH + "alma/AS/tab_convUSD.txt" +#define USDTABLECORRECTIONS CDBPATH + "alma/AS/act_rev02.txt" #define MM2HSTEP 350 //(10500 HSTEP / 30 MM) #define MM2STEP 1400 //(42000 STEP / 30 MM) #define WARNINGUSDPERCENT 0.95 @@ -228,7 +228,7 @@ private: bool m_newlut; - const char* m_lut; + std::string m_lut; }; #endif /*SRTACTIVESURFACEBOSSCORE_H_*/ diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp index 1e5be0b37..a63fa676f 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp @@ -67,8 +67,8 @@ void CSRTActiveSurfaceBossCore::execute() throw (ComponentErrors::CouldntGetComp char * value2; //s_usdTable = getenv ("ACS_CDB"); - //strcat(s_usdTable,USDTABLE); - value2 = USDTABLE; + //strcat(s_usdTable,USDTABLE.c_str()); + value2 = USDTABLE.c_str(); //ifstream usdTable(s_usdTable); ifstream usdTable(value2); if(!usdTable) @@ -78,7 +78,7 @@ void CSRTActiveSurfaceBossCore::execute() throw (ComponentErrors::CouldntGetComp exit(-1); } - value = USDTABLECORRECTIONS; + value = USDTABLECORRECTIONS.c_str(); ifstream usdCorrections (value); if(!usdCorrections) { @@ -1360,7 +1360,7 @@ void CSRTActiveSurfaceBossCore::workingActiveSurface() throw (ComponentErrors::C void CSRTActiveSurfaceBossCore::asSetLUT(const char *newlut) { - m_lut= (CDBPATH + "alma/AS/" + newlut).c_str(); + m_lut = std::string(CDBPATH + "alma/AS/" + newlut); m_newlut = true; } @@ -1377,12 +1377,10 @@ void CSRTActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& newP if(all_sectors) // USD tables has not been loaded yet { - ifstream usdCorrections (m_lut); - //ifstream usdCorrections (USDTABLECORRECTIONS); + ifstream usdCorrections(m_lut); if(!usdCorrections) { - ACS_SHORT_LOG ((LM_INFO, "File %s not found", m_lut)); - //ACS_SHORT_LOG ((LM_INFO, "File %s not found", USDTABLECORRECTIONS)); + ACS_SHORT_LOG ((LM_INFO, "File %s not found", m_lut.c_str())); exit(-1); } actuatorsCorrections.length(NPOSITIONS); -- GitLab From a90a727477800136cab1c6c9dcde86d6c1f5a8ca Mon Sep 17 00:00:00 2001 From: Andrea Orlati Date: Fri, 9 Feb 2024 12:15:23 +0100 Subject: [PATCH 058/150] =?UTF-8?q?fix=20issue=20#820:=20handled=20the=20e?= =?UTF-8?q?rror=20risen=20when=20trying=20to=20connect=20to=20the=E2=80=A6?= =?UTF-8?q?=20(#821)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix issue #820: handled the error risen when trying to connect to the LNA board and commented out all the code trying to get data from the board. Now the LNA bias parameters are zeros. Also get rid of the old K band derotator. * SRT5GHzReceiver with CLOW LO * SRT5GHz test configuration patched * fix issue #820: handled (got rid) of an error coused by the lan control board replacement that could affect the setup process of the receiver * Update .gitignore .vscode extension * Fix #820, upd. ReceiversLibrary and K band component --------- Co-authored-by: Andrea Orlati Co-authored-by: Giuseppe Carboni Co-authored-by: Sergio Poppi I will merge this now, if anything wrong may arise in the future, we will fix it --- .gitignore | 1 + .../IRALibrary/include/MicroControllerBoard.h | 1 + .../IRALibrary/include/ReceiverControl.h | 12 +- Common/Libraries/IRALibrary/src/Makefile | 6 +- .../IRALibrary/src/MicroControllerBoard.cpp | 45 +- .../IRALibrary/src/ReceiverControl.cpp | 54 -- .../IRALibrary/src/TestCommandRXBoard.cpp | 572 ++++++++++++++++++ .../IRALibrary/src/TestReceiverControl.cpp | 2 +- .../src/MFKBandBaseCore.cpp | 10 +- .../Components/RECEIVERS/LO_CLOW/LO_CLOW.xml | 18 + .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 18 + .../SRTKBandDerotator/SRTKBandDerotator.xml | 16 - .../DerotatorContainer/DerotatorContainer.xml | 35 -- .../SRT5GHzContainer/SRT5GHzContainer.xml} | 4 +- SRT/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml | 11 + .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 187 ++++++ .../SRTKBandDerotator/SRTKBandDerotator.xml | 51 -- .../SRTKBandMFReceiver/SRTKBandMFReceiver.xml | 4 +- .../Components/RECEIVERS/LO_CLOW/LO_CLOW.xml | 18 + .../SRTKBandDerotator/SRTKBandDerotator.xml | 17 - .../CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml | 11 + .../CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml | 2 +- .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 2 +- .../SRTKBandDerotator/SRTKBandDerotator.xml | 51 -- .../SRTKBandMFReceiver/SRTKBandMFReceiver.xml | 6 +- .../SRTScripts/app-defaults/discosStartup.xml | 9 - .../include/DevIOLNAControls.h | 7 +- SRT/Servers/SRTKBandMFReceiver/src/Makefile | 15 +- .../SRTKBandMFReceiver/src/MonitorThread.cpp | 9 +- .../src/SRTKBandMFReceiverImpl.cpp | 8 +- 31 files changed, 921 insertions(+), 283 deletions(-) create mode 100644 Common/Libraries/IRALibrary/src/TestCommandRXBoard.cpp create mode 100644 SRT/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml create mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml delete mode 100644 SRT/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml rename SRT/{Configuration/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml => CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml} (90%) create mode 100644 SRT/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml create mode 100644 SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml delete mode 100644 SRT/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml create mode 100644 SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml delete mode 100644 SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml create mode 100644 SRT/Configuration/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml delete mode 100644 SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml diff --git a/.gitignore b/.gitignore index 8061be08c..12abadff6 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,4 @@ SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUI.h SRT/Clients/SRTActiveSurfaceGUIClient/src/moc_SRTActiveSurfaceCore.cpp SRT/Clients/SRTActiveSurfaceGUIClient/src/moc_SRTActiveSurfaceGUIui.cpp SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.idl +.vscode/settings.json diff --git a/Common/Libraries/IRALibrary/include/MicroControllerBoard.h b/Common/Libraries/IRALibrary/include/MicroControllerBoard.h index aed54f79b..fa69bda2b 100644 --- a/Common/Libraries/IRALibrary/include/MicroControllerBoard.h +++ b/Common/Libraries/IRALibrary/include/MicroControllerBoard.h @@ -124,6 +124,7 @@ private: const DWORD m_timeout; const BYTE m_master_address; const BYTE m_slave_address; + bool m_connected; IRA::CSocket *m_socket; unsigned long long m_id; BYTE m_command_type; diff --git a/Common/Libraries/IRALibrary/include/ReceiverControl.h b/Common/Libraries/IRALibrary/include/ReceiverControl.h index 08024c0b3..7cc825483 100644 --- a/Common/Libraries/IRALibrary/include/ReceiverControl.h +++ b/Common/Libraries/IRALibrary/include/ReceiverControl.h @@ -667,8 +667,8 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number_sd=MCB_PORT_NUMBER_13, const BYTE port_number_vlbi=MCB_PORT_NUMBER_14, - const BYTE value_sd=0x00, - const BYTE value_vlbi=0x01 + const BYTE value_sd=0x01, + const BYTE value_vlbi=0x00 ); @@ -682,7 +682,7 @@ public: bool isSingleDishModeOn( const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, - const BYTE port_number=MCB_PORT_NUMBER_29 + const BYTE port_number=MCB_PORT_NUMBER_13 ); @@ -704,8 +704,8 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number_vlbi=MCB_PORT_NUMBER_14, const BYTE port_number_sd=MCB_PORT_NUMBER_13, - const BYTE value_vlbi=0x00, - const BYTE value_sd=0x01 + const BYTE value_vlbi=0x01, + const BYTE value_sd=0x00 ); @@ -719,7 +719,7 @@ public: bool isVLBIModeOn( const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, - const BYTE port_number=MCB_PORT_NUMBER_30 + const BYTE port_number=MCB_PORT_NUMBER_14 ); diff --git a/Common/Libraries/IRALibrary/src/Makefile b/Common/Libraries/IRALibrary/src/Makefile index 8c9fa9012..2c8de3054 100644 --- a/Common/Libraries/IRALibrary/src/Makefile +++ b/Common/Libraries/IRALibrary/src/Makefile @@ -53,7 +53,7 @@ PY_SCRIPTS = EXECUTABLES = EXECUTABLES_L = Test1 Test2 TestDBTable TestTypes TestMicroControllerBoard TestReceiverControl TestLogDike TestTimeTaggedCircularArray \ - TestFlux TestTimer TestRounding + TestFlux TestTimer TestRounding TestCommandRXBoard # # @@ -75,6 +75,10 @@ TestMicroControllerBoard_LIBS = IRALibrary TestReceiverControl_OBJECTS = TestReceiverControl TestReceiverControl_LIBS = IRALibrary +TestCommandRXBoard_OBJECTS = TestCommandRXBoard +TestCommandRXBoard_LIBS = IRALibrary + + TestLogDike_OBJECTS = TestDike TestLogDike_LIBS = IRALibrary ClientErrors diff --git a/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp b/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp index e74c82817..cc88984ed 100644 --- a/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp +++ b/Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp @@ -7,7 +7,7 @@ MicroControllerBoard::MicroControllerBoard( const BYTE master_address, const BYTE slave_address, const DWORD timeout) : m_IP(IP), m_port(port), m_timeout(timeout), m_master_address(master_address), - m_slave_address(slave_address), + m_slave_address(slave_address), m_connected(false), m_socket(NULL), m_id(0), m_command_type(0x00) { try { @@ -17,9 +17,11 @@ MicroControllerBoard::MicroControllerBoard( catch (std::bad_alloc& ex) { throw MicroControllerBoardEx("Memory allocation error"); } - - if(m_socket->Create(m_Error, CSocket::STREAM) == CSocket::FAIL) - throw MicroControllerBoardEx("Error creating socket"); + if (strcmp(m_IP.c_str(),"")!=0) { + if(m_socket->Create(m_Error, CSocket::STREAM) == CSocket::FAIL) throw MicroControllerBoardEx("Error creating socket"); + } else { + m_connected=false; + } } MicroControllerBoard::~MicroControllerBoard() { @@ -31,12 +33,13 @@ MicroControllerBoard::~MicroControllerBoard() { void MicroControllerBoard::openConnection(void) { - + if (strcmp(m_IP.c_str(),"")==0) return; if (m_socket->Connect(m_Error, m_IP.c_str(), m_port) == CSocket::FAIL) { closeConnection(); throw MicroControllerBoardEx(std::string("Error connecting to ") + m_IP + ":" + any2string(m_port)); } else { + m_connected=true; if(m_socket->setSockMode(m_Error, CSocket::BLOCKINGTIMEO, m_timeout) != CSocket::SUCCESS) { closeConnection(); throw MicroControllerBoardEx("Error configuring socket"); @@ -48,8 +51,9 @@ CSocket::SocketStatus MicroControllerBoard::getConnectionStatus(void) { return(m void MicroControllerBoard::closeConnection(void) { pthread_mutex_lock(&m_socket_mutex); - if(m_socket != NULL && m_socket->getStatus()) { + if(m_socket != NULL && m_socket->getStatus() && m_connected) { m_socket->Close(m_Error); + m_connected=false; if(!m_Error.isNoError()) std::cerr << "An error occured closing the socket" << endl; @@ -60,13 +64,15 @@ void MicroControllerBoard::closeConnection(void) { } std::vector MicroControllerBoard::receive(void) { - pthread_mutex_lock(&m_socket_mutex); + BYTE msg[MCB_BUFF_LIMIT] = {0x00}; bool is_short_cmd = false, has_data_cmd = false; BYTE sh_command = 0x00; // Shifted command (command_type - MCB_CMD_TYPE_EXTENDED) std::vector data, clean_data; - std::ostringstream msg_stream; + std::ostringstream msg_stream; + if (!m_connected) throw MicroControllerBoardEx("Board connection disabled"); + pthread_mutex_lock(&m_socket_mutex); // Receive the response one byte at once try { for(size_t j = 0; j < MCB_HT_COUNTER; j++) { @@ -77,8 +83,10 @@ std::vector MicroControllerBoard::receive(void) { continue; } } - if(msg[0] != MCB_CMD_STX) - throw MicroControllerBoardEx("No answer header received"); + if(msg[0] != MCB_CMD_STX) { + throw MicroControllerBoardEx("No answer header received"); + } + else { m_answer.clear(); m_answer.push_back(msg[0]); @@ -125,8 +133,9 @@ std::vector MicroControllerBoard::receive(void) { has_data_cmd = false; } - if(msg[MCB_BASE_ANSWER_LENGTH]) - throw MicroControllerBoardEx("An error occurs. Error code: " + any2string(int(msg[MCB_BASE_ANSWER_LENGTH]))); + if(msg[MCB_BASE_ANSWER_LENGTH]) { + throw MicroControllerBoardEx("An error occurs. Error code: " + any2string(int(msg[MCB_BASE_ANSWER_LENGTH]))); + } // If the answer should have data and there aren't any errors, then continue the reception if(has_data_cmd) { @@ -138,8 +147,10 @@ std::vector MicroControllerBoard::receive(void) { msg_stream << msg[MCB_BASE_ANSWER_LENGTH]; m_answer.push_back(msg[MCB_BASE_ANSWER_LENGTH]); } - else - throw MicroControllerBoardEx("Error: data length not received."); + else { + pthread_mutex_unlock(&m_socket_mutex); + throw MicroControllerBoardEx("Error: data length not received."); + } // Get the parameters for(int i=MCB_BASE_ANSWER_LENGTH + 1; i < MCB_BASE_ANSWER_LENGTH + 1 + int(msg[MCB_BASE_ANSWER_LENGTH]); i++) { @@ -173,8 +184,9 @@ std::vector MicroControllerBoard::receive(void) { break; } while(counter < MCB_HT_COUNTER); - if(msg[idx] != MCB_CMD_ETX) - throw MicroControllerBoardEx("Answer terminator not found."); + if(msg[idx] != MCB_CMD_ETX) { + throw MicroControllerBoardEx("Answer terminator not found."); + } } pthread_mutex_unlock(&m_socket_mutex); @@ -231,6 +243,7 @@ std::vector MicroControllerBoard::receive(void) { } void MicroControllerBoard::send(const BYTE command, std::vector parameters) { + if (!m_connected) throw MicroControllerBoardEx("Board connection disabled"); pthread_mutex_lock(&m_socket_mutex); try { if(command >= MCB_CMD_TYPE_MIN_EXT && command <= MCB_CMD_TYPE_MAX_ABB) { diff --git a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp index b08ae03ab..b758adc08 100644 --- a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp +++ b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp @@ -889,20 +889,6 @@ void ReceiverControl::setSingleDishMode( port_number_vlbi, value_vlbi ); - - // Turn OFF the single dish mode on port number 13 - makeRequest( - m_dewar_board_ptr, // Pointer to the dewar board - MCB_CMD_SET_DATA, // Command to send - 4, // Number of parameters - data_type, - port_type, - port_number_sd, - !value_sd - ); - - // Now the bits 13 and 14 are set to 1 - // We need to set the bit 13 to 0, wait a bit and set it to 1 usleep(3 * SETMODE_SLEEP_TIME); // Turn ON the single dish mode on port number 13 @@ -915,21 +901,7 @@ void ReceiverControl::setSingleDishMode( port_number_sd, value_sd ); - - usleep(3 * SETMODE_SLEEP_TIME); - // Turn OFF the single dish mode on port number 13 - makeRequest( - m_dewar_board_ptr, // Pointer to the dewar board - MCB_CMD_SET_DATA, // Command to send - 4, // Number of parameters - data_type, - port_type, - port_number_sd, - !value_sd - ); pthread_mutex_unlock(&m_dewar_mutex); - - // Now the bits 13 and 14 are set, respectively, to 0 and 1 } catch(MicroControllerBoardEx& ex) { pthread_mutex_unlock(&m_dewar_mutex); @@ -989,19 +961,6 @@ void ReceiverControl::setVLBIMode( port_number_sd, value_sd ); - // Turn OFF the VLBI mode on port number 14 - makeRequest( - m_dewar_board_ptr, // Pointer to the dewar board - MCB_CMD_SET_DATA, // Command to send - 4, // Number of parameters - data_type, - port_type, - port_number_vlbi, - !value_vlbi - ); - - // Now the bits 13 and 14 are set to 1 - // We need to set the bit 13 to 1, wait a bit and set again it to 0 usleep(3 * SETMODE_SLEEP_TIME); @@ -1015,20 +974,7 @@ void ReceiverControl::setVLBIMode( port_number_vlbi, value_vlbi ); - - usleep(3 * SETMODE_SLEEP_TIME); - // Turn OFF the VLBI mode on port number 14 - makeRequest( - m_dewar_board_ptr, // Pointer to the dewar board - MCB_CMD_SET_DATA, // Command to send - 4, // Number of parameters - data_type, - port_type, - port_number_vlbi, - !value_vlbi - ); pthread_mutex_unlock(&m_dewar_mutex); - } catch(MicroControllerBoardEx& ex) { pthread_mutex_unlock(&m_dewar_mutex); diff --git a/Common/Libraries/IRALibrary/src/TestCommandRXBoard.cpp b/Common/Libraries/IRALibrary/src/TestCommandRXBoard.cpp new file mode 100644 index 000000000..77ce4885b --- /dev/null +++ b/Common/Libraries/IRALibrary/src/TestCommandRXBoard.cpp @@ -0,0 +1,572 @@ +#include "ReceiverControl.h" +#include +#include + + +using namespace IRA; + +template +std::string any2string(T i) { + std::ostringstream buffer; + buffer << i; + return buffer.str(); +} + +/************************ CONVERSION FUNCTIONS **************************/ +// Convert the voltage value of the vacuum to mbar +double voltage2mbar(double voltage) { return(pow(10, 1.5 * voltage - 12)); } + +// Convert the voltage value of the temperatures to Kelvin (Sensor LAKE SHORE) +double voltage2Kelvin(double voltage) +{ + return voltage < 1.12 ? \ + (660.549422889947 * pow(voltage, 6)) - (2552.334255456860 * pow(voltage, 5)) + (3742.529989384570 * pow(voltage, 4)) \ + - (2672.656926956470 * pow(voltage, 3)) + (947.905578508975 * pow(voltage, 2)) - 558.351002849576 * voltage + 519.607622398508 \ + : \ + (865.747519105672 * pow(voltage, 6)) - (7271.931957100480 * pow(voltage, 5)) + (24930.666241800500 * pow(voltage, 4)) \ + - (44623.988512320400 * pow(voltage, 3)) + (43962.922216886600 * pow(voltage, 2)) - 22642.245121997700 * voltage + 4808.631312836750; +} + +// Convert the voltage value of the temperatures to Celsius (Sensor B57703-10K) +double voltage2Celsius(double voltage) +{ return -5.9931 * pow(voltage, 5) + 40.392 * pow(voltage, 4) - 115.41 * pow(voltage, 3) + 174.67 * pow(voltage, 2) - 174.23 * voltage + 112.79; } + + +// Convert the ID voltage value to the mA value +double currentConverter(double voltage) { return(10 * voltage); } + +// Convert the VD and VG voltage values using a right scale factor +double voltageConverter(double voltage) { return(voltage); } + + + + +/************************** END CONVERSIONS ****************************/ + + +int main(int argc, char *argv[]) +{ + if(argc != 5) { + cerr << "\nWrong number of parameters. "; + cerr << "Usage:\n\tTestReceiverControl dewar_IP dewar_port LNA_IP LNA_port\n" << endl; + // cerr << "Usage:\n\tTestReceiverControl dewar_IP dewar_port LNA_IP LNA_port, SW_IP SW_port\n" << endl; + return 1; + } + + std::string dewar_IP = std::string(argv[1]); + unsigned int dewar_port = atoi(argv[2]); + std::string lna_IP = std::string(argv[3]); + unsigned int lna_port = atoi(argv[4]); + // std::string switch_IP = std::string(argv[5]); + // unsigned int switch_port = atoi(argv[6]); + unsigned short feeds = 7; + std::vector data; + std::string input; + + + + + // Test the constructor + try { + cout << "\nConnecting to the boards (LNA and deward)..." << endl; + ReceiverControl rc = ReceiverControl( + dewar_IP, + dewar_port, + lna_IP, + lna_port, + 250000, + feeds, + "", + 0, + 0x7C, + 0x7F, + 0x7C, + 0x7D, + 0x7C, + 0x01, + false + ); + cout << "Connection" << " done!" << endl << endl; + + + while (true){ + + + std::cout << "Command:>"; + std::cin >> input ; + if (input=="calOn"){ + std::cout <<"calOn" <::iterator liter = (svalues.left_channel).begin(); + // std::vector::iterator lend = (svalues.left_channel).end(); + // for(int idx=0; liter != lend; liter++, idx++) + // cout << "Item " << idx << ": " << *liter << endl; + // cout << "\tRight channel:\n"; + // std::vector::iterator riter = (svalues.right_channel).begin(); + // std::vector::iterator rend = (svalues.right_channel).end(); + // for(int idx = 0; riter != rend; riter++, idx++) + // cout << "Item " << idx << ": " << *riter << endl; + // cout << "Done!\n" << endl; + + // // Test the isCalibrationOn() + // cout << "Test isCalibrationOn() with a reliable communication" << endl; + // cout << "Is the noise mark generator ON? " << (rc.isCalibrationOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumSensorOff() + // cout << "Test setVacuumSensorOff() with a reliable communication" << endl; + // rc.setVacuumSensorOff(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumSensorOn() + // cout << "Test isVacuumSensorOn() with a reliable communication" << endl; + // cout << "Is the vacuum sensor ON? " << (rc.isVacuumSensorOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumSensorOn() + // cout << "Test setVacuumSensorOn() with a reliable communication" << endl; + // rc.setVacuumSensorOn(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumSensorOn() + // cout << "Test isVacuumSensorOn() with a reliable communication" << endl; + // cout << "Is the vacuum sensor ON? " << (rc.isVacuumSensorOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumPumpOff() + // cout << "Test setVacuumPumpOff() with a reliable communication" << endl; + // rc.setVacuumPumpOff(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumPumpOn() + // cout << "Test isVacuumPumpOn() with a reliable communication" << endl; + // cout << "Is the vacuum pump ON? " << (rc.isVacuumPumpOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumPumpOn() + // cout << "Test setVacuumPumpOn() with a reliable communication" << endl; + // rc.setVacuumPumpOn(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumPumpOn() + // cout << "Test isVacuumPumpOn() with a reliable communication" << endl; + // cout << "Is the vacuum pump ON? " << (rc.isVacuumPumpOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the hasVacuumPumpFault() + // cout << "Test hasVacuumPumpFault() with a reliable communication" << endl; + // cout << "Has the vacuum pump a fault? " << (rc.hasVacuumPumpFault() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumValveOff() + // cout << "Test setVacuumValveOff() with a reliable communication" << endl; + // rc.setVacuumValveOff(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumValveOn() + // cout << "Test isVacuumValveOn() with a reliable communication" << endl; + // cout << "Is the vacuum valve ON? " << (rc.isVacuumValveOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setVacuumValveOn() + // cout << "Test setVacuumValveOn() with a reliable communication" << endl; + // rc.setVacuumValveOn(); + // cout << "Done!\n" << endl; + + // // Test the isVacuumValveOn() + // cout << "Test isVacuumValveOn() with a reliable communication" << endl; + // cout << "Is the vacuum valve ON? " << (rc.isVacuumValveOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + + // // Test the selectLO1() + // cout << "Test selectLO1() with a reliable communication" << endl; + // rc.selectLO1(); + // cout << "Done!\n" << endl; + + // // Test the isLO1Selected() + // cout << "Test isLO1Selected() with a reliable communication" << endl; + // cout << "Is the LO1 selected? " << (rc.isLO1Selected() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the isLO2Selected() + // cout << "Test isLO2Selected() with a reliable communication" << endl; + // cout << "Is the LO2 selected? " << (rc.isLO2Selected() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the selectLO2() + // cout << "Test selectLO2() with a reliable communication" << endl; + // rc.selectLO2(); + // cout << "Done!\n" << endl; + + // // Test the isLO2Selected() + // cout << "Test isLO2Selected() with a reliable communication" << endl; + // cout << "Is the LO2 selected? " << (rc.isLO2Selected() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the isLO1Selected() + // cout << "Test isLO1Selected() with a reliable communication" << endl; + // cout << "Is the LO1 selected? " << (rc.isLO1Selected() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the isLO2Locked() + // cout << "Test isLO2Locked() with a reliable communication" << endl; + // cout << "Is the LO2 locked? " << (rc.isLO2Locked() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the setSingleDishMode() + // cout << "Test setSingleDishMode() with a reliable communication" << endl; + // rc.setSingleDishMode(); + // cout << "Done!\n" << endl; + + // // Test the isSingleDishModeOn() + // cout << "Test isSingleDishModeOn() with a reliable communication" << endl; + // cout << "Is the single dish mode active? " << (rc.isSingleDishModeOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + // // Test the isVLBIModeOn() + cout << "Test isVLBIModeOn() with a reliable communication" << endl; + cout << "Is the VLBI mode active? " << (rc.isVLBIModeOn() == true ? "yes" : "no") << endl; + cout << "Done!\n" << endl; + + // // Test the setVLBIMode() + cout << "Test setVLBIMode() with a reliable communication" << endl; + rc.setVLBIMode(); + cout << "Done!\n" << endl; + + // Test the isVLBIModeOn() + cout << "Test isVLBIModeOn() with a reliable communication" << endl; + cout << "Is the VLBI mode active? " << (rc.isVLBIModeOn() == true ? "yes" : "no") << endl; + cout << "Done!\n" << endl; + + // // Test the isSingleDishModeOn() + cout << "Test isSingleDishModeOn() with a reliable communication" << endl; + cout << "Is the single dish mode active? " << (rc.isSingleDishModeOn() == true ? "yes" : "no") << endl; + cout << "Done!\n" << endl; + // + // // Test the setSingleDishMode() + cout << "Test setSingleDishMode() with a reliable communication" << endl; + rc.setSingleDishMode(); + cout << "Done!\n" << endl; + + // // Test the isSingleDishModeOn() + cout << "Test isSingleDishModeOn() with a reliable communication" << endl; + cout << "Is the single dish mode active? " << (rc.isSingleDishModeOn() == true ? "yes" : "no") << endl; + cout << "Done!\n" << endl; + + // // Test the isVLBIModeOn() + // cout << "Test isVLBIModeOn() with a reliable communication" << endl; + // cout << "Is the VLBI mode active? " << (rc.isVLBIModeOn() == true ? "yes" : "no") << endl; + // cout << "Done!\n" << endl; + + + + // // Test the isLNABoardConnectionOK() + // cout << "Test isLNABoardConnectionOK() with a reliable communication" << endl; + /* cout << "Is the connection to the LNA board OK? " << \ + (rc.isLNABoardConnectionOK() == true ? "yes" : "no") << endl; */ + // cout << "Done!\n" << endl; + + // // Test the isDewarBoardConnectionOK() + // cout << "Test isDewarBoardConnectionOK() with a reliable communication" << endl; + /* cout << "Is the connection to the dewar board OK? " << \ + (rc.isDewarBoardConnectionOK() == true ? "yes" : "no") << endl;*/ + // cout << "Done!\n" << endl; + + // // Test closeConnection() + // cout << "Test closeConnection() with a reliable communication" << endl; + // rc.closeConnection(); + // cout << "Done!\n" << endl; + + // // Test the isLNABoardConnectionOK() + // cout << "Test isLNABoardConnectionOK() with a reliable communication" << endl; + /* cout << "Is the connection to the LNA board OK? " << \ + (rc.isLNABoardConnectionOK() == true ? "yes" : "no") << endl; */ + // cout << "Done!\n" << endl; + + // // Test the isDewarBoardConnectionOK() + // cout << "Test isDewarBoardConnectionOK() with a reliable communication" << endl; + /* cout << "Is the connection to the dewar board OK? " << \ + (rc.isDewarBoardConnectionOK() == true ? "yes" : "no") << endl;*/ + // cout << "Done!\n" << endl; + + // try { + // // Test the vacuum() voltage value, without conversion + // cout << "Test vacuum()" << endl; + // cout << "Vacuum value before conversion [Volt]: " << rc.vacuum() << endl; + // cout << "Done!\n" << endl; + // } + // catch(ReceiverControlEx& ex) { + // cout << ex.what() << endl; + // } + + // try { + // // Test fetValues() + // cout << "Test fetValues() with a reliable communication" << endl; + // values = rc.fetValues(0, 4, currentConverter, voltageConverter); + // cout << "LNA left values of feed 0, stage 4: (VDL=" << values.VDL << ", IDL=" << values.IDL; + // cout << ", VGL=" << values.VGL << ")" << endl; + // cout << "LNA right values of feed 0, stage 4: (VDR=" << values.VDR << ", IDR=" << values.IDR; + // cout << ", VGR=" << values.VGR << ")" << endl; + // cout << endl; + // values = rc.fetValues(1, 2, currentConverter); + // cout << "LNA left values of feed 1, stage 2: (VDL=" << values.VDL << ", IDL=" << values.IDL; + // cout << ", VGL=" << values.VGL << ")" << endl; + // cout << "LNA right values of feed 1, stage 2: (VDR=" << values.VDR << ", IDR=" << values.IDR; + // cout << ", VGR=" << values.VGR << ")" << endl; + // cout << "Done!\n" << endl; + // } + // catch(ReceiverControlEx& ex) { + // cout << ex.what() << endl; + // } + + // // Test openConnection() + // cout << "Test openConnection() with a reliable communication" << endl; + // rc.openConnection(); + // cout << "Done!\n" << endl; + + // // Test the cryoTemperature(1) + // cout << "Test cryoTemperature(1) with a reliable communication" << endl; + // cout << "First Cryogenic Temperature value: " << rc.cryoTemperature(1, voltage2Kelvin) << endl; + // cout << "Done!\n" << endl; + + // // Test the vacuum() voltage value, without conversion + // cout << "Test vacuum()" << endl; + // cout << "Vacuum value before conversion [Volt]: " << rc.vacuum() << endl; + // cout << "Done!\n" << endl; + + // // Test the vacuum() + // cout << "Test vacuum() with a reliable communication" << endl; + // cout << "Vacuum value: " << rc.vacuum(voltage2mbar) << endl; + // cout << "Done!\n" << endl; + + // cout << "Test rc.setColdLoadPath() with a reliable communication" << endl; + // rc.setColdLoadPath(); + } + catch(ReceiverControlEx& ex) { + cout << ex.what() << endl; + return 1; + } + + + return 0; +} diff --git a/Common/Libraries/IRALibrary/src/TestReceiverControl.cpp b/Common/Libraries/IRALibrary/src/TestReceiverControl.cpp index 2c902b764..6baff3fce 100644 --- a/Common/Libraries/IRALibrary/src/TestReceiverControl.cpp +++ b/Common/Libraries/IRALibrary/src/TestReceiverControl.cpp @@ -74,7 +74,7 @@ int main(int argc, char *argv[]) "", 0, 0x7C, - 0x01, + 0x7F, 0x7C, 0x7D, 0x7C, diff --git a/Common/Servers/MFKBandBaseReceiver/src/MFKBandBaseCore.cpp b/Common/Servers/MFKBandBaseReceiver/src/MFKBandBaseCore.cpp index 2fe7bd7c0..4a130627a 100644 --- a/Common/Servers/MFKBandBaseReceiver/src/MFKBandBaseCore.cpp +++ b/Common/Servers/MFKBandBaseReceiver/src/MFKBandBaseCore.cpp @@ -170,9 +170,13 @@ void CComponentCore::activate() throw ( m_calDiode=false; guard.release(); - lnaOn(); // Throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) - //externalCalOff(); - + try { + lnaOn(); // Throw (ReceiversErrors::NoRemoteControlErrorExImpl,ReceiversErrors::ReceiverControlBoardErrorExImpl) + //externalCalOff(); + } + catch (ReceiversErrors::ReceiversErrorsExImpl& E) { + ACS_LOG(LM_FULL_INFO,"CComponentCore::activate()",(LM_WARNING,"LNA control board is showing some issues")); + } bool answer; try { answer=m_control->isRemoteOn(); diff --git a/SRT/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml b/SRT/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml new file mode 100644 index 000000000..34e2d4a3e --- /dev/null +++ b/SRT/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml @@ -0,0 +1,18 @@ + + + diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml new file mode 100644 index 000000000..b17f717e8 --- /dev/null +++ b/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -0,0 +1,18 @@ + + + diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml deleted file mode 100644 index 8b0aeea16..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/SRT/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml b/SRT/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml deleted file mode 100644 index 3179cbaf5..000000000 --- a/SRT/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/Configuration/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml b/SRT/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml similarity index 90% rename from SRT/Configuration/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml rename to SRT/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml index ff357dce1..3ea1b6d4d 100644 --- a/SRT/Configuration/CDB/MACI/Containers/DerotatorContainer/DerotatorContainer.xml +++ b/SRT/CDB/MACI/Containers/SRT5GHzContainer/SRT5GHzContainer.xml @@ -3,16 +3,18 @@ * Author Infos * ============ * Name: Marco Buttu + * E-mail: mbuttu@oa-cagliari.inaf.it + * Personal Web: http://www.pypeople.com/ --> diff --git a/SRT/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml b/SRT/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml new file mode 100644 index 000000000..328f4f5e5 --- /dev/null +++ b/SRT/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml new file mode 100644 index 000000000..0e1d3c572 --- /dev/null +++ b/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml b/SRT/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml deleted file mode 100644 index c964759ea..000000000 --- a/SRT/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/SRT/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml b/SRT/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml index 8fed9e44c..4d3e9b896 100644 --- a/SRT/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml +++ b/SRT/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml @@ -17,8 +17,8 @@ monitoringThreadStackSize="4096" DewarIPAddress="127.0.0.1" DewarPort="12902" - LNAIPAddress="127.0.0.1" - LNAPort="12903" + LNAIPAddress="" + LNAPort="0" WatchDogResponseTime="10000000" WatchDogSleepTime="10000000" LNASamplingTime="250000" diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml new file mode 100644 index 000000000..7c8b82341 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_CLOW/LO_CLOW.xml @@ -0,0 +1,18 @@ + + + diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml deleted file mode 100644 index be31bee19..000000000 --- a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml index b098cecce..4f67761f9 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ - + diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml b/SRT/Configuration/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml new file mode 100644 index 000000000..64089db15 --- /dev/null +++ b/SRT/Configuration/CDB/alma/RECEIVERS/LO_CLOW/LO_CLOW.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml b/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml index 64089db15..d625c04e3 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/LO_KBAND/LO_KBAND.xml @@ -2,7 +2,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - IP="192.168.200.118" PORT="5025"> + IP="192.168.200.119" PORT="5025"> diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index 9fa31b2ee..0ba1c50cc 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -17,7 +17,7 @@ LNASamplingTime="250000" RepetitionCacheTime="7000000" RepetitionExpireTime="10000000" - LocalOscillatorInstance="RECEIVERS/LO_KBAND" + LocalOscillatorInstance="RECEIVERS/LO_CLOW" > diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml b/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml deleted file mode 100644 index 4286fcc68..000000000 --- a/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandDerotator/SRTKBandDerotator.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml b/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml index fe148b119..bc61c671e 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/SRTKBandMFReceiver/SRTKBandMFReceiver.xml @@ -15,10 +15,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" actionThreadStackSize="2048" monitoringThreadStackSize="4096" - DewarIPAddress="192.168.200.131" + DewarIPAddress="192.168.200.110" DewarPort="5002" - LNAIPAddress="192.168.200.130" - LNAPort="5002" + LNAIPAddress="" + LNAPort="0" WatchDogResponseTime="10000000" WatchDogSleepTime="10000000" LNASamplingTime="250000" diff --git a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml index 0b0581971..fe407ec9b 100644 --- a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml @@ -46,15 +46,6 @@ MASTERHOST discos - - DerotatorContainer - cpp - - true - 0 - MASTERHOST - discos - DerotatorPositionerContainer py diff --git a/SRT/Servers/SRTKBandMFReceiver/include/DevIOLNAControls.h b/SRT/Servers/SRTKBandMFReceiver/include/DevIOLNAControls.h index c5b562a86..2ae867eed 100644 --- a/SRT/Servers/SRTKBandMFReceiver/include/DevIOLNAControls.h +++ b/SRT/Servers/SRTKBandMFReceiver/include/DevIOLNAControls.h @@ -61,8 +61,10 @@ public: */ ACS::doubleSeq read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) { - // In pCore I need a method to get the vector of values (An extension, so I can ereditate from ComponentCore) - m_val=m_pCore->getStageValues(m_control, m_ifs, m_stage); + // In pCore I need a method to get the vector of values (An extension, so I can ereditate from ComponentCore) + /* commented out in order to cope with the LNA control board substitution */ + // under this configuration the default value should be used so no alarms are triggered + //m_val=m_pCore->getStageValues(m_control, m_ifs, m_stage); timestamp=getTimeStamp(); // Completion time return m_val; } @@ -71,6 +73,7 @@ public: */ void write(const ACS::doubleSeq& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) { + m_val=value; timestamp=getTimeStamp(); return; } diff --git a/SRT/Servers/SRTKBandMFReceiver/src/Makefile b/SRT/Servers/SRTKBandMFReceiver/src/Makefile index 3608dc455..ca0ed1f42 100644 --- a/SRT/Servers/SRTKBandMFReceiver/src/Makefile +++ b/SRT/Servers/SRTKBandMFReceiver/src/Makefile @@ -56,7 +56,9 @@ INCLUDES = # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTKBandMFReceiverImpl SRTKBandDerotatorImpl +# KBand Derotator decomissioned +#LIBRARIES = SRTKBandMFReceiverImpl SRTKBandDerotatorImpl +LIBRARIES = SRTKBandMFReceiverImpl LIBRARIES_L = # @@ -66,9 +68,10 @@ SRTKBandMFReceiverImpl_LIBS = IRALibrary ComponentErrors ManagementErrors Receiv GenericReceiverStubs SRTKBandMFStubs MFKBandCore\ LocalOscillatorInterfaceStubs ReceiversDefinitionsStubs ManagmentDefinitionsStubs -SRTKBandDerotatorImpl_OBJECTS = SRTKBandDerotatorImpl sensorSocket icdSocket StatusUpdater -SRTKBandDerotatorImpl_LIBS = GenericDerotatorStubs SRTKBandDerotatorStubs IRALibrary ComponentErrors DerotatorErrors \ - ManagmentDefinitionsStubs ManagementErrors MFKBandCore +# KBand Derotator decomissioned +#SRTKBandDerotatorImpl_OBJECTS = SRTKBandDerotatorImpl sensorSocket icdSocket StatusUpdater +#SRTKBandDerotatorImpl_LIBS = GenericDerotatorStubs SRTKBandDerotatorStubs IRALibrary ComponentErrors DerotatorErrors \ +# ManagmentDefinitionsStubs ManagementErrors MFKBandCore # # Scripts (public and local) @@ -114,7 +117,9 @@ tttlll_OBJECTS = # # Configuration Database Files # ---------------------------- -CDB_SCHEMAS = SRTKBandMFReceiver SRTKBandDerotator +# KBand Derotator decomissioned +# CDB_SCHEMAS = SRTKBandMFReceiver SRTKBandDerotator +CDB_SCHEMAS = SRTKBandMFReceiver # # IDL Files and flags diff --git a/SRT/Servers/SRTKBandMFReceiver/src/MonitorThread.cpp b/SRT/Servers/SRTKBandMFReceiver/src/MonitorThread.cpp index 7ad8c6924..14e5ef2be 100644 --- a/SRT/Servers/SRTKBandMFReceiver/src/MonitorThread.cpp +++ b/SRT/Servers/SRTKBandMFReceiver/src/MonitorThread.cpp @@ -71,7 +71,8 @@ void CMonitorThread::onStart() } case LNA_VD: { try { - m_core->updateVdLNAControls(); + // commented out in order to cope with the LNA control board substitution + //m_core->updateVdLNAControls(); } catch (ACSErr::ACSbaseExImpl& ex) { _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl, impl, ex, "CMonitorThread::runLoop"); @@ -82,7 +83,8 @@ void CMonitorThread::onStart() } case LNA_ID: { try { - m_core->updateIdLNAControls(); + // commented out in order to cope with the LNA control board substitution + //m_core->updateIdLNAControls(); } catch (ACSErr::ACSbaseExImpl& ex) { _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl, impl, ex, "CMonitorThread::runLoop"); @@ -93,7 +95,8 @@ void CMonitorThread::onStart() } case LNA_VG: { try { - m_core->updateVgLNAControls(); + // commented out in order to cope with the LNA control board substitution + //m_core->updateVgLNAControls(); } catch (ACSErr::ACSbaseExImpl& ex) { _ADD_BACKTRACE(ComponentErrors::WatchDogErrorExImpl, impl, ex, "CMonitorThread::runLoop"); diff --git a/SRT/Servers/SRTKBandMFReceiver/src/SRTKBandMFReceiverImpl.cpp b/SRT/Servers/SRTKBandMFReceiver/src/SRTKBandMFReceiverImpl.cpp index 9e72ae665..12899fe1b 100644 --- a/SRT/Servers/SRTKBandMFReceiver/src/SRTKBandMFReceiverImpl.cpp +++ b/SRT/Servers/SRTKBandMFReceiver/src/SRTKBandMFReceiverImpl.cpp @@ -531,8 +531,6 @@ void SRTKBandMFReceiverImpl::getIFOutput( } - - CORBA::Long SRTKBandMFReceiverImpl::getFeeds( ACS::doubleSeq_out X, ACS::doubleSeq_out Y, @@ -612,7 +610,8 @@ void SRTKBandMFReceiverImpl::turnLNAsOn() throw ( ) { try { - m_core.lnaOn(); + // commented out in order to cope with the LNA control board substitution + //m_core.lnaOn(); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { ex.log(LM_DEBUG); @@ -637,7 +636,8 @@ void SRTKBandMFReceiverImpl::turnLNAsOff() throw ( ) { try { - m_core.lnaOff(); + // commented out in order to cope with the LNA control board substitution + //m_core.lnaOff(); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { ex.log(LM_DEBUG); -- GitLab From 0e108ea5d15fd1f78e0df689e77c31c5c1ec9c5f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 12 Feb 2024 19:25:24 +0100 Subject: [PATCH 059/150] Updated SRT test CDB --- SRT/CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../SRTScripts/app-defaults/simulationStartup.xml | 11 +---------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml index b098cecce..4f67761f9 100644 --- a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ - + diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index 2fb1a7429..3a6e4fd0b 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -14,7 +14,7 @@ - + @@ -46,15 +46,6 @@ MASTERHOST discos - - DerotatorContainer - py - - true - 0 - MASTERHOST - discos - DerotatorPositionerContainer py -- GitLab From 833b087cc83302979c8537579240f36b8eb0ac79 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 01:02:15 +0000 Subject: [PATCH 060/150] Commented new SRT minor servo files. Commented pretty much every file. I will perform some more tests with the simulators before tweaking the system to be used with the current Leonardo minor servo system status. --- .../idl/SRTMinorServo.idl | 11 +- .../include/SRTMinorServoAnswerMap.h | 2 +- SRT/Servers/SRTMinorServo/include/Common.h | 73 - SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 743 +++++---- .../include/SRTMinorServoBossCore.h | 374 ++++- .../include/SRTMinorServoBossImpl.h | 510 +++++- .../include/SRTMinorServoCommon.h | 110 ++ .../include/SRTMinorServoContainers.h | 328 ++++ .../SRTMinorServo/include/SRTMinorServoImpl.h | 750 +++++++-- .../include/SRTMinorServoParkThread.h | 60 +- .../include/SRTMinorServoScanThread.h | 96 ++ .../include/SRTMinorServoSetupThread.h | 71 +- .../include/SRTMinorServoSocket.h | 147 -- .../include/SRTMinorServoStatusThread.h | 71 +- .../include/SRTMinorServoTrackingThread.h | 87 +- .../SRTMinorServo/include/SuppressWarnings.h | 11 +- SRT/Servers/SRTMinorServo/src/Makefile | 44 +- .../src/SRTBaseMinorServoImpl.cpp | 871 +++++++---- .../src/SRTGenericMinorServoImpl.cpp | 2 - .../src/SRTMinorServoBossCore.cpp | 1365 +++++++++++++---- .../src/SRTMinorServoBossImpl.cpp | 446 ++---- .../src/SRTMinorServoParkThread.cpp | 57 +- .../src/SRTMinorServoScanThread.cpp | 247 +++ .../src/SRTMinorServoSetupThread.cpp | 193 ++- .../SRTMinorServo/src/SRTMinorServoSocket.cpp | 192 --- .../src/SRTMinorServoStatusThread.cpp | 82 +- .../src/SRTMinorServoTrackingThread.cpp | 144 +- .../src/SRTProgramTrackMinorServoImpl.cpp | 145 +- 28 files changed, 5081 insertions(+), 2151 deletions(-) delete mode 100644 SRT/Servers/SRTMinorServo/include/Common.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h delete mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp delete mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 844677d91..fecbb9d28 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -94,27 +94,28 @@ module MinorServo /** * This method asks the PLC the status for the corresponding servo + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware * @return true if the servo is not in an error state, false otherwise */ - boolean status(); + boolean status() raises (MinorServoErrors::MinorServoErrorsEx); /** * This method commands a STOW operation to the servo * @param stow_position the index of the position we want the servo to stow to - * @throw MinorServo::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted */ void stow(in long stow_position) raises (MinorServoErrors::MinorServoErrorsEx); /** * This method commands a STOP operation to the servo - * @throw MinorServo::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted */ void stop() raises (MinorServoErrors::MinorServoErrorsEx); /** * This method commands a PRESET operation to the servo * @param coordinates, a sequence of double - * @throw MinorServo::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, * if the resulting position summing the offsets would go outside the accepted range of the servo, * if there has been a communication error or if the command was not accepted */ @@ -130,7 +131,7 @@ module MinorServo /** * This method calculates the servo coordinates for a given elevation * @param elevation the elevation to use for the coordinates calculation, expressed in degrees - * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculalation + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation * @return the calculated coordinates as a sequence of doubles */ ACS::doubleSeq calcCoordinates(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx); diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h index c196676ee..4c111db94 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h @@ -11,7 +11,7 @@ namespace MinorServo { - class SRTMinorServoAnswerMap : private std::map> + class SRTMinorServoAnswerMap : private std::map> { /** * This class privately extends the type std::map>. diff --git a/SRT/Servers/SRTMinorServo/include/Common.h b/SRT/Servers/SRTMinorServo/include/Common.h deleted file mode 100644 index 6453273e9..000000000 --- a/SRT/Servers/SRTMinorServo/include/Common.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef __SRTMINORSERVOCOMMON_H__ -#define __SRTMINORSERVOCOMMON_H__ - -#include "SuppressWarnings.h" -#include -#include -#include - - -namespace MinorServo -{ - // The second value of the pair indicates whether the configuration has a ASACTIVE double configuration - using DiscosConfigurationNameTableType = std::map >; - const DiscosConfigurationNameTableType DiscosConfigurationNameTable = - { - {"LLP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, - {"PPP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, - {"PLP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, - {"HHP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, - {"XKP", std::make_pair(MinorServo::CONFIGURATION_PRIMARY, false)}, - {"CCG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN1, true )}, - {"KKG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN2, true )}, - {"WWG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN3, true )}, - {"QQG", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN4, true )}, - {"TRI", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN5, true )}, - {"MISTRAL", std::make_pair(MinorServo::CONFIGURATION_GREGORIAN6, true )}, - {"CCB", std::make_pair(MinorServo::CONFIGURATION_BWG1, true )}, - {"XB", std::make_pair(MinorServo::CONFIGURATION_BWG3, true )}, - }; - - using LDOConfigurationNameTableType = boost::bimap; - const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of< LDOConfigurationNameTableType::relation > - (MinorServo::CONFIGURATION_PRIMARY, "Primario") - (MinorServo::CONFIGURATION_GREGORIAN1, "Gregoriano 1") - (MinorServo::CONFIGURATION_GREGORIAN2, "Gregoriano 2") - (MinorServo::CONFIGURATION_GREGORIAN3, "Gregoriano 3") - (MinorServo::CONFIGURATION_GREGORIAN4, "Gregoriano 4") - (MinorServo::CONFIGURATION_GREGORIAN5, "Gregoriano 5") - (MinorServo::CONFIGURATION_GREGORIAN6, "Gregoriano 6") - (MinorServo::CONFIGURATION_GREGORIAN7, "Gregoriano 7") - (MinorServo::CONFIGURATION_GREGORIAN8, "Gregoriano 8") - (MinorServo::CONFIGURATION_BWG1, "BWG1") - (MinorServo::CONFIGURATION_BWG2, "BWG2") - (MinorServo::CONFIGURATION_BWG3, "BWG3") - (MinorServo::CONFIGURATION_BWG4, "BWG4"); - - using LDOConfigurationIDTableType = boost::bimap; - const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of< LDOConfigurationIDTableType::relation > - (MinorServo::CONFIGURATION_UNKNOWN, 0) - (MinorServo::CONFIGURATION_PRIMARY, 1) - (MinorServo::CONFIGURATION_GREGORIAN1, 11) - (MinorServo::CONFIGURATION_GREGORIAN2, 12) - (MinorServo::CONFIGURATION_GREGORIAN3, 13) - (MinorServo::CONFIGURATION_GREGORIAN4, 14) - (MinorServo::CONFIGURATION_GREGORIAN5, 15) - (MinorServo::CONFIGURATION_GREGORIAN6, 16) - (MinorServo::CONFIGURATION_GREGORIAN7, 17) - (MinorServo::CONFIGURATION_GREGORIAN8, 18) - (MinorServo::CONFIGURATION_BWG1, 21) - (MinorServo::CONFIGURATION_BWG2, 22) - (MinorServo::CONFIGURATION_BWG3, 23) - (MinorServo::CONFIGURATION_BWG4, 24); - - const std::vector ServoOrder = - { - "PFP", - "SRP", - "GFR", - "M3R", - }; -} - -#endif diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index 4f6be5359..a554c6357 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -1,371 +1,520 @@ #ifndef _MSDEVIOS_H #define _MSDEVIOS_H -/**********************************************************/ -/* Giuseppe Carboni 20/09/2023 */ -/**********************************************************/ +/** + * MSDevIO.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ -#include "Common.h" +#include "SRTMinorServoCommon.h" #include #include -#include -#include #include #include -#include "SRTMinorServoCommandLibrary.h" +#include "SRTMinorServoAnswerMap.h" -struct SRTMinorServoDevIOInfo -{ - IRA::CSecureArea* secure_area; - std::string prefix = ""; - std::string property_name; - std::vector property_fields; -}; - - -/** - * This template class is derived from DevIO and it is used by the almost all attributes of the SRT Minor Servos components. - * The associeted property can be selected at construction time and cannot be changed anymore. - * @author Giuseppe Carboni , - */ -template class MSDevIO : public DevIO +namespace MinorServo { -public: /** - * Constructor - * @param data pointer to a SecureArea that protects a SRTMinorServoAnswerMap object. - * @param property_info an std::pair containing the name of the property as shown in the Object Explorer and the fields to read from the SRTMinorServoAnswerMap - */ - MSDevIO(SRTMinorServoDevIOInfo property_info) + * This class acts as a base class for all the SRTMinorServo DevIOs. + */ + template class MSBaseDevIO : public DevIO { - // The following expression will produce an error at compile time if the T class type is not one of the following - static_assert( - std::disjunction< - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same - >::value, - "Not accepted MSDevIO type!" - ); - - m_secure_area = property_info.secure_area; - m_prefix = property_info.prefix; - m_property_name = property_info.property_name; - m_property_fields = property_info.property_fields; - } + public: + /** + * Destructor. + */ + ~MSBaseDevIO() + { + } - /** - * Destructor - */ - ~MSDevIO() - { - } + /** + * Used to read the property value. + * This is pure virtual and has to be implemented in the derived DevIOs. + * @throw ComponentErrors::PropertyError. + * @param timestamp epoch when the operation completes. + */ + virtual T read(ACS::Time& timestamp); + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + return false; + } - /** - * @return true to initialize the property with default value from CDB. - */ - bool initializeValue() - { - return false; - } + /** + * It writes values into controller. Unused because all the properties are read-only. + */ + void write(const T& value, ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + return; + } + }; /** - * Used to read the property value. - * @throw ComponentErrors::PropertyError - * @param timestamp epoch when the operation completes - */ - T read(ACS::Time& timestamp) + * This class is used to read the status of the motion of the minor servo system. + */ + class MSMotionInfoDevIO : public MSBaseDevIO { - try + public: + /** + * Constructor. + * @param motion_status the atomic status of the motion of the minor servo system. + * @param answer_map the SRTMinorServoAnswerMap containing the status of the system. It is used to read the position of the gregorian cover. + */ + MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoAnswerMap& answer_map) : m_motion_status(motion_status), m_answer_map(answer_map) {} + + /** + * Returns the property value. + * @param timestamp epoch when the operation completes. + * @return a string containing the information about the motion status of the minor servo system. + */ + ACE_CString read(ACS::Time& timestamp) { - if(m_secure_area) - { - IRA::CSecAreaResourceWrapper data = m_secure_area->Get(); + std::string motion_status; + SRTMinorServoAnswerMap answer_map = m_answer_map; - try + switch(m_motion_status.load()) + { + case MOTION_STATUS_UNCONFIGURED: { - if constexpr(std::is_same::value) - { - unsigned int value = std::get(data->at(m_prefix + m_property_fields[0])); - m_value = (value == 1) ? Management::MNG_TRUE : Management::MNG_FALSE; - } - else if constexpr(std::is_same::value) + motion_status = "Unknown"; + break; + } + case MOTION_STATUS_STARTING: + { + motion_status = "Setup in progress..."; + break; + } + case MOTION_STATUS_CONFIGURED: + { + motion_status = "Elevation Track Mode Disabled"; + break; + } + case MOTION_STATUS_TRACKING: + { + motion_status = "Elevation Track Mode"; + break; + } + case MOTION_STATUS_PARKING: + { + motion_status = "Parking..."; + break; + } + case MOTION_STATUS_PARKED: + { + motion_status = "Parked"; + + try { - auto object = data->at(m_prefix + m_property_fields[0]); - if(object.index() == 0) + // If I can read the status of the gregorian cover I will notify the user about it on the GUI + SRTMinorServoGregorianCoverStatus cover_status = SRTMinorServoGregorianCoverStatus(answer_map.get("GREGORIAN_CAP")); + + if(cover_status == COVER_STATUS_OPEN) { - m_value = double(std::get(object)); + motion_status += ", gregorian cover open"; } - else if(object.index() == 1) + else if(cover_status == COVER_STATUS_CLOSED) { - m_value = std::get(object); + motion_status += ", gregorian cover closed"; } } - else if constexpr(std::is_same::value) + catch(...) { - auto object = data->at(m_prefix + m_property_fields[0]); - if(object.index() == 0) + // If I can't, it doesn't matter + } + + break; + } + case MOTION_STATUS_ERROR: + { + motion_status = "Error"; + break; + } + } + + return motion_status.c_str(); + } + private: + /** + * Reference to the motion status object of the Boss. + */ + const std::atomic& m_motion_status; + + /** + * Reference to the SRTMinorServoAnswerMap object of the Boss. + */ + const SRTMinorServoAnswerMap& m_answer_map; + }; + + /** + * This class is used to read the virtual positions of a minor servo system. It is specialized this way in order to sum the plain virtual positions and the offsets. + */ + class MSVirtualPositionsDevIO : public MSBaseDevIO + { + public: + /** + * Constructor. + * @param servo_name the name of the minor servo system the property belongs to. + * @param virtual_positions_fields the name of the virtual positions fields inside the SRTMinorServoAnswerMap object. + * @param virtual_offsets_fields the name of the virtual offsets fields inside the SRTMinorServoAnswerMap object. + * @param answer_map the SRTMinorServoAnswerMap object containing the status of the minor servo system. + */ + MSVirtualPositionsDevIO(const std::string& servo_name, std::vector virtual_positions_fields, std::vector virtual_offsets_fields, const SRTMinorServoAnswerMap& answer_map) : + m_virtual_positions_fields([&]() + { + std::transform(virtual_positions_fields.begin(), virtual_positions_fields.end(), virtual_positions_fields.begin(), [servo_name](const std::string& field) + { + return servo_name + "_" + field; + }); + return virtual_positions_fields; + }()), + m_virtual_offsets_fields([&]() + { + std::transform(virtual_offsets_fields.begin(), virtual_offsets_fields.end(), virtual_offsets_fields.begin(), [servo_name](const std::string& field) + { + return servo_name + "_" + field; + }); + return virtual_offsets_fields; + }()), + m_answer_map(answer_map) + { + } + + /** + * Returns the property value. + * @param timestamp epoch when the operation completes. + * @return a sequence of double containing the virtual positions taking the virtual offsets into account. + */ + ACS::doubleSeq read(ACS::Time& timestamp) + { + SRTMinorServoAnswerMap answer_map = m_answer_map; + + ACS::doubleSeq sequence; + + try + { + sequence.length(m_virtual_positions_fields.size()); + + for(size_t i = 0; i < m_virtual_positions_fields.size(); i++) + { + sequence[i] = answer_map.get(m_virtual_positions_fields[i]) - answer_map.get(m_virtual_offsets_fields[i]); + } + } + catch(std::out_of_range& ex) + { + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSVirtualPositionsDevIO::read()"); + impl.setPropertyName("virtual_positions"); + impl.setReason("Property is missing from the map!"); + throw impl; + } + catch(std::bad_variant_access& ex) + { + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSVirtualPositionsDevIO::read()"); + impl.setPropertyName("virtual_positions"); + impl.setReason("Attempt to access the property with the wrong variant type!"); + throw impl; + } + catch(ACSErr::ACSbaseExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSVirtualPositionsDevIO::read()"); + impl.setPropertyName("virtual_positions"); + impl.setReason("Property could not be read!"); + throw impl; + } + + timestamp = getTimeStamp(); //completion time + return sequence; + } + + private: + /** + * The virtual positions fields names. + */ + const std::vector m_virtual_positions_fields; + + /** + * The virtual offsets fields names. + */ + const std::vector m_virtual_offsets_fields; + + /** + * The SRTMinorServoAnswerMap containing the status of the minor servo system. + */ + const SRTMinorServoAnswerMap& m_answer_map; + }; + + /** + * This template class is used to retrieve values from a SRTMinorServoAnswerMap and provide them as properties. + * The templates is specialized for the types listed right below and compilation will fail if the developer attempts to use it for an unknown MSDevIO type. + */ + template >> + class MSAnswerMapDevIO : public MSBaseDevIO + { + public: + /** + * Single property-field, no servo-name constructor. + * @param property_name the name of the property, used when raising exceptions. + * @param property_field the field name of the property as it appears inside the SRTMinorServoAnswerMap. + * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. + */ + MSAnswerMapDevIO(const std::string& property_name, const std::string& property_field, const SRTMinorServoAnswerMap& answer_map) : + MSAnswerMapDevIO(property_name, std::vector{ property_field }, answer_map) {} + + /** + * Multiple property-fields, no servo-name constructor. + * @param property_name the name of the property, used when raising exceptions. + * @param property_fields the field names of the property as they appear inside the SRTMinorServoAnswerMap. + * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. + */ + MSAnswerMapDevIO(const std::string& property_name, const std::vector& property_fields, const SRTMinorServoAnswerMap& answer_map) : + m_property_name(property_name), + m_property_fields(property_fields), + m_answer_map(answer_map) {} + + /** + * Single property-field, with servo-name constructor. + * @param servo_name the name of the minor servo system the property belongs to. Used as prefix for the property_field argument. + * @param property_name the name of the property, used when raising exceptions. + * @param property_field the field name of the property as it appears inside the SRTMinorServoAnswerMap. + * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. + */ + MSAnswerMapDevIO(const std::string& servo_name, const std::string& property_name, const std::string& property_field, const SRTMinorServoAnswerMap& answer_map) : + MSAnswerMapDevIO(servo_name, property_name, std::vector{ property_field }, answer_map) {} + + /** + * Multiple property-fields, with servo-name constructor. + * @param servo_name the name of the minor servo system the property belongs to. Used as prefix for the property_fields argument. + * @param property_name the name of the property, used when raising exceptions. + * @param property_fields the field names of the property as they appear inside the SRTMinorServoAnswerMap. + * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. + */ + MSAnswerMapDevIO(const std::string& servo_name, const std::string& property_name, std::vector property_fields, const SRTMinorServoAnswerMap& answer_map) : + m_property_name(property_name), + m_property_fields([&]() + { + std::transform(property_fields.begin(), property_fields.end(), property_fields.begin(), [servo_name](const std::string& field) + { + return servo_name + "_" + field; + }); + return property_fields; + }()), + m_answer_map(answer_map) {} + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes. + * @throw ComponentErrors::PropertyError. + * @return the property value as read from the SRTMinorServoAnswerMap object reference. + */ + T read(ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + + // Copy the answer map by value. This will ensure all the elements for any sequence belong to the same reading from PLC. + SRTMinorServoAnswerMap answer_map = m_answer_map; + + try + { + if constexpr(std::is_same_v) + { + return (answer_map.get(m_property_fields[0]) == 1) ? Management::MNG_TRUE : Management::MNG_FALSE; + } + else if constexpr(std::is_same_v) + { + unsigned int index = answer_map.index(m_property_fields[0]); + + switch(index) + { + case 0: { - m_value = std::to_string(std::get(object)).c_str(); + return (double)answer_map.get(m_property_fields[0]); } - else if(object.index() == 1) + case 1: { - m_value = std::to_string(std::get(object)).c_str(); + return answer_map.get(m_property_fields[0]); } - else + default: { - m_value = std::get(object).c_str(); + throw std::bad_variant_access(); } } - else if constexpr(std::is_same::value) - { - m_value.length(m_property_fields.size()); + } + else if constexpr(std::is_same_v) + { + unsigned int index = answer_map.index(m_property_fields[0]); - for(size_t i = 0; i < m_property_fields.size(); i++) + switch(index) + { + case 0: { - m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + return std::to_string(answer_map.get(m_property_fields[0])).c_str(); } - } - else if constexpr(std::is_same::value) - { - m_value.length(m_property_fields.size()); - - for(size_t i = 0; i < m_property_fields.size(); i++) + case 1: { - m_value[i] = std::get(data->at(m_prefix + m_property_fields[i])); + return std::to_string(answer_map.get(m_property_fields[0])).c_str(); + } + default: + { + return answer_map.get(m_property_fields[0]).c_str(); } } - else if constexpr(std::is_same::value) - { - int value = std::get(data->at(m_prefix + m_property_fields[0])); - m_value = MinorServo::LDOConfigurationIDTable.right.at(value); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoControlStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoGregorianCoverStatus(std::get(data->at(m_prefix + m_property_fields[0]))); - } - else if constexpr(std::is_same::value) - { - m_value = MinorServo::SRTMinorServoCabinetStatus(std::get(data->at(m_prefix + m_property_fields[0])) - 1); - } - else if constexpr(std::is_same::value) + } + else if constexpr(std::is_same_v) + { + ACS::booleanSeq value; + value.length(m_property_fields.size()); + + for(size_t i = 0; i < m_property_fields.size(); i++) { - m_value = MinorServo::SRTMinorServoOperativeMode(std::get(data->at(m_prefix + m_property_fields[0])) / 10); + value[i] = answer_map.get(m_property_fields[i]); } - else + return value; + } + else if constexpr(std::is_same_v) + { + ACS::doubleSeq value; + value.length(m_property_fields.size()); + + for(size_t i = 0; i < m_property_fields.size(); i++) { - // This should never happen thanks to the static_assert in the constructor - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); - impl.setPropertyName(m_property_name.c_str()); - impl.setReason("Unknown property type!"); - throw impl; + value[i] = answer_map.get(m_property_fields[i]); } + return value; } - catch(std::out_of_range& ex) + else if constexpr(std::is_same_v) { - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); - impl.setPropertyName(m_property_name.c_str()); - impl.setReason("Property is missing from the map!"); + return LDOConfigurationIDTable.right.at(answer_map.get(m_property_fields[0])); } - catch(std::bad_variant_access& ex) + else if constexpr(std::is_same_v) { - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); - impl.setPropertyName(m_property_name.c_str()); - impl.setReason("Attempt to access the property with the wrong type!"); + return SRTMinorServoControlStatus(answer_map.get(m_property_fields[0]) - 1); + } + else if constexpr(std::is_same_v) + { + return SRTMinorServoGregorianCoverStatus(answer_map.get(m_property_fields[0])); + } + else if constexpr(std::is_same_v) + { + return SRTMinorServoCabinetStatus(answer_map.get(m_property_fields[0]) - 1); + } + else if constexpr(std::is_same_v) + { + return SRTMinorServoOperativeMode(answer_map.get(m_property_fields[0]) / 10); } } - else + catch(std::out_of_range& ex) { - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSDevIO::read()"); + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSAnswerMapDevIO::read()"); impl.setPropertyName(m_property_name.c_str()); - impl.setReason("SecureArea not ready!"); + impl.setReason("Property is missing from the map!"); + throw impl; + } + catch(std::bad_variant_access& ex) + { + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSAnswerMapDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Attempt to access the property with the wrong variant type!"); + throw impl; + } + catch(ACSErr::ACSbaseExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSAnswerMapDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Property could not be read!"); throw impl; } } - catch(ACSErr::ACSbaseExImpl& ex) - { - _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSDevIO::read()"); - impl.setPropertyName(m_property_name.c_str()); - impl.setReason("Property could not be read!"); - throw impl; - } - - timestamp = getTimeStamp(); //completion time - return m_value; - } - - /** - * It writes values into controller. Unused because the properties are read-only. - */ - void write(const T& value, ACS::Time& timestamp) - { - timestamp = getTimeStamp(); - return; - } -private: - IRA::CSecureArea* m_secure_area; - T m_value; - std::string m_prefix; - std::string m_property_name; - std::vector m_property_fields; -}; + private: + /** + * The name of the property, used when raising exceptions. + */ + const std::string m_property_name; + /** + * The field names of the property as they appear on the SRTMinorServoAnswerMap. + */ + const std::vector m_property_fields; -template class MSGenericDevIO : public DevIO -{ -public: - MSGenericDevIO(A* value) - { - // The following expression will produce an error at compile time if the T class type is not one of the following - static_assert( - std::disjunction< - std::is_same, - std::is_same, - std::is_same, - std::is_same, - std::is_same - >::value, - "Not accepted MSDevIO type!" - ); - - // The following expressions will produce an error at compile time if the provided A argument class type is not recognized - static_assert( - std::disjunction< - std::negation >, - std::conjunction< - std::is_same, - std::disjunction< - std::is_same, - std::is_same > - > - > - >::value, - "Not accepted argument type!" - ); - - static_assert( - std::disjunction< - std::negation >, - std::conjunction< - std::is_same, - std::is_same > - > - >::value, - "Not accepted argument type!" - ); - - m_value = value; - } + /** + * The reference to the SRTMinorServoAnswerMap in whichthe readings from the PLC appear. + */ + const SRTMinorServoAnswerMap& m_answer_map; + }; /** - * Destructor - */ - ~MSGenericDevIO() - { - } - - /** - * @return true to initialize the property with default value from CDB. - */ - bool initializeValue() - { - return false; - } - - /** - * Used to read the property value. - * @param timestamp epoch when the operation completes - */ - C read(ACS::Time& timestamp) + * This template class represents a generic Minor Servo DevIO. + * It accepts 2 types, the DevIO type (the return type) and the type of the object reference which stores the original value to be returned by the read method. + * The templates is specialized for the combinations of types listed right below and the compilation will fail if the developer attempts to use it with any other types combination. + */ + template || (std::is_same_v && std::is_same_v>) + >> + class MSGenericDevIO : public MSBaseDevIO { - timestamp = getTimeStamp(); //completion time - - if constexpr(std::is_same >::value) // Motion status + public: + /** + * Default constructor. + * @param value a constant reference to the object from which the DevIO will read the value to be returned as property. + */ + MSGenericDevIO(const A& value) : m_value(value) {} + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes. + * @return the property value read from the original referenced object. + */ + C read(ACS::Time& timestamp) { - std::string motion_status; + timestamp = getTimeStamp(); //completion time - switch(*m_value) + if constexpr(std::is_same_v) { - case MinorServo::MOTION_STATUS_UNCONFIGURED: - { - motion_status = "Not configured"; - break; - } - case MinorServo::MOTION_STATUS_CONFIGURING: - { - motion_status = "Configuring..."; - break; - } - case MinorServo::MOTION_STATUS_PARK: - { - motion_status = "Parked"; - break; - } - case MinorServo::MOTION_STATUS_ERROR: - { - motion_status = "Error"; - break; - } - case MinorServo::MOTION_STATUS_CONFIGURED: - { - motion_status = "Elevation Track Mode Disabled"; - break; - } - case MinorServo::MOTION_STATUS_TRACKING: - { - motion_status = "Elevation Track Mode"; - break; - } + return m_value.c_str(); } + else if constexpr(std::is_same_v) + { + ACS::doubleSeq_var sequence = new ACS::doubleSeq; + sequence->length(m_value.size()); - return motion_status.c_str(); - } - else if constexpr(std::is_same::value) - { - return m_value->c_str(); - } - else if constexpr(std::is_same::value) - { - ACS::doubleSeq_var sequence = new ACS::doubleSeq; - sequence->length(m_value->size()); + for(size_t i = 0; i < m_value.size(); i++) + { + sequence[i] = m_value.operator[](i); + } - for(size_t i = 0; i < m_value->size(); i++) + return sequence; + } + else if constexpr(is_atomic_v) { - sequence[i] = m_value->operator[](i); + return m_value.load(); + } + else + { + return m_value; } - - return sequence; - } - else - { - return *m_value; } - } - - /** - * It writes values into controller. Unused because the properties are read-only. - */ - void write(const C& value, ACS::Time& timestamp) - { - timestamp = getTimeStamp(); - return; - } -private: - A* m_value; -}; + /** + * The reference to the object containing the value to be returned as property. + */ + const A& m_value; + }; +} #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index 0801e2123..b64e65ed6 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "Common.h" +#include "SRTMinorServoCommon.h" #include #include #include @@ -15,87 +15,407 @@ #include #include #include +#include #include -#include "ManagementErrors.h" -#include "MinorServoErrors.h" +#include +#include +#include +#include +#include +#include +#include #include "SRTMinorServoSocket.h" #include "MSDevIOs.h" #include "SRTMinorServoBossImpl.h" +#include "SRTMinorServoStatusThread.h" #include "SRTMinorServoSetupThread.h" #include "SRTMinorServoParkThread.h" #include "SRTMinorServoTrackingThread.h" +#include "SRTMinorServoScanThread.h" +#include "SRTMinorServoContainers.h" + + +_IRA_LOGFILTER_IMPORT; + +using namespace MinorServo; class SRTMinorServoBossImpl; +class SRTMinorServoStatusThread; class SRTMinorServoSetupThread; class SRTMinorServoParkThread; class SRTMinorServoTrackingThread; +class SRTMinorServoScanThread; +/** + * This class implements the core functionalities for the SRTMinorServoBoss. It is constructed during the SRTMinorServoBossImpl component's construction. + * It handles all the threads and the procedures necessary for the minor servo system to work properly. + */ class SRTMinorServoBossCore { -friend class SRTMinorServoBossImpl; -friend class SRTMinorServoStatusThread; -friend class SRTMinorServoSetupThread; -friend class SRTMinorServoParkThread; -friend class SRTMinorServoTrackingThread; + /** + * These classes needs full access to the SRTMinorServoBossCore object methods and attributes in order for the system to work properly. + */ + friend class SRTMinorServoBossImpl; + friend class SRTMinorServoStatusThread; + friend class SRTMinorServoSetupThread; + friend class SRTMinorServoParkThread; + friend class SRTMinorServoTrackingThread; + friend class SRTMinorServoScanThread; public: - SRTMinorServoBossCore(SRTMinorServoBossImpl* component); + /** + * Constructor. + * @param component a reference to the component object. Used in order to access the properties. + * @throw ComponentErrors::ComponentErrorsEx when reading configurations from the CDB. + */ + SRTMinorServoBossCore(SRTMinorServoBossImpl& component); + + /** + * Destructor. + */ virtual ~SRTMinorServoBossCore(); private: + /** + * Reads the overall status from the hardware. + * @return true when the status is OK, false otherwise. + */ + bool status(); + + /** + * Performs a setup procedure. + * @param configuration a mnemonic code identifying the desired configuration. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while performing the setup procedure or if checkLineStatus throws. + */ void setup(std::string configuration); + + /** + * Performs a park procedure. + * @throw ManagementErrors::ParkingErrorEx when something went wrong while performing the park procedure or if checkLineStatus throws. + */ void park(); - void status(); - void checkControl(); - void checkEmergency(); + + /** + * Enables or disables the elevation tracking. + * @param configuration the desired elevation tracking configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ void setElevationTracking(std::string configuration); + + /** + * Enables or disables the use of ASACTIVE configurations. + * @param configuration the desired active surface configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ void setASConfiguration(std::string configuration); + + /** + * Opens or closes the gregorian cover. + * @param position the desired position for the gregorian cover, allowed values are 'open', 'OPEN', 'closed' or 'CLOSED'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded position is unknown, when the system is not parked or parking, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + void setGregorianCoverPosition(std::string position); + + /** + * Configures the whole minor servo system to a desired position. + * @param elevation the elevation to use for all the minor servo positions calculation. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system was not configured yet, + * when a single minor servo component raises an error or when checkLineStatus throws. + */ void preset(double elevation); + /** + * Resets the given servo user offsets to 0. + * @param servo_name the name of the minor servo the user offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ void clearUserOffsets(std::string servo_name); - void setUserOffset(std::string servo_axis_name, double offset); - std::vector getUserOffsets(); + + /** + * Sets the given axis' user offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + void setUserOffset(std::string servo_axis_name, double offset, bool log = false); + + /** + * Retrieves all the current user offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes user offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + ACS::doubleSeq* getUserOffsets(); + + /** + * Resets the given servo system offsets to 0. + * @param servo_name the name of the minor servo the system offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ void clearSystemOffsets(std::string servo_name); + + /** + * Sets the given axis' system offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired system offset to be loaded for the given axis. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ void setSystemOffset(std::string servo_axis_name, double offset); - std::vector getSystemOffsets(); - void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + /** + * Retrieves all the current system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes system offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + ACS::doubleSeq* getSystemOffsets(); + + /** + * Retrieves all the current axes names and units of measure. + * @param axes_names_out a reference to the sequence in which the method will put all the axes names. + * @param axes_units_out a reference to the sequence in which the method will put all the axes units of measure. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + */ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out); + + /** + * Retrieves all the axes positions for a given epoch. + * @param acs_time the ACS::Time the user wants to retrieve all the axes positions for. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return an ACS::doubleSeq containing all the axes positions for the given time. + */ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time); + + /** + * This method performs the calculations necessary to check if a scan can be performed starting from the given parameters. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the given parameters or when the scan could not be performed for any reason. + * @return a SRTMinorServoScan object containing the parameters for a feasible scan. + */ + SRTMinorServoScan checkScanFeasibility(const ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); - bool checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters); - void startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + /** + * This method checks if a scan with the given parameters is feasible by calling the checkScanFeasibility method. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @param ms_parameters a reference to the object containing the calculated parameters for the requested scan. + * @return true if the requested scan is feasible, false otherwise. + */ + bool checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters); + + /** + * This method commands the start of a scan to the minor servo system. It calls the checkScanFeasibility method again to be sure the scan can actually be performed, updating the starting time. + * @param start_time a reference to the ACS::Time object. This value will be written by this method and it will represent the earliest time the minor servo system can perform the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status, with the given parameters or when the scan could not be performed for any reason. + */ + void startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + + /** + * Requests a stop for the ongoing scan. + * @param close_time the closing time for the ongoing scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status. + */ void closeScan(ACS::Time& close_time); - SRTMinorServoBossImpl* m_component; + /** + * Retrieve the antenna elevation from the AntennaBoss component for the given ACS::Time. + * @param acs_time the ACS::Time we want to know the antenna elevation for. + * @throw ComponentErrors::ComponentErrorsEx when the AntennaBoss component could not be retrieved. + * @return the antenna elevation for the given time, expressed in degrees. + */ + double getElevation(const ACS::Time& acs_time); + + /** + * Checks if the socket is connected, if the Leonardo minor servo system is currently controlled by DISCOS and if it is not in emergency status. + * @throw MinorServoErrors::MinorServoErrorsEx when any of the above is false. + */ + void checkLineStatus(); + + /** + * Method that creates and starts an ACS thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS thread object to be eventually created and started. + * @param sleep_time the optional thread sleep time, defaults to 0, meaning that this value will be ignored and internally the thread sleep time will be set to the default sleep time. + */ + template >> + void startThread(T*& thread, const ACS::TimeInterval& sleep_time = 0); + + /** + * Method that stops an ACS thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS thread object to be stopped. + */ + template >> + void stopThread(T*& thread); + + /** + * Method that destroys an ACS Thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS Thread object to be destroyed. + */ + template >> + void destroyThread(T*& thread); - SRTMinorServoSocketConfiguration* m_socket_configuration; - SRTMinorServoSocket* m_socket; + /** + * Method that sets all the necessary variable to signal a failure of the minor servo system. + */ + void setFailure(); + /** + * Method used to retrieve a configuration value from the CDB. + * @param configuration the name of the value to be read from the CDB. + */ + Management::TBoolean getCDBConfiguration(std::string configuration); + + /** + * Reference to the component object. + */ + SRTMinorServoBossImpl& m_component; + + /** + * Pointer to the status thread. + */ + SRTMinorServoStatusThread* m_status_thread; + + /** + * Pointer to the setup thread. + */ SRTMinorServoSetupThread* m_setup_thread; + + /** + * Pointer to the park thread. + */ SRTMinorServoParkThread* m_park_thread; + + /** + * Pointer to the tracking thread. + */ SRTMinorServoTrackingThread* m_tracking_thread; - IRA::CSecureArea* m_status_secure_area; + /** + * Pointer to the scan thread. + */ + SRTMinorServoScanThread* m_scan_thread; + + /** + * Pointer to the AntennaBoss component. + */ + Antenna::AntennaBoss_var m_antennaBoss; + + /** + * SRTMinorServoAnswerMap object containing the status read from the PLC. + */ SRTMinorServoAnswerMap m_status; - std::map m_servos; - std::map m_tracking_servos; + /** + * Enumeration indicating the status of the motion of the minor servo system. + */ + std::atomic m_motion_status; - std::atomic m_motion_status; + /** + * String containing the commanded focal configuration. + */ std::string m_commanded_setup; - std::atomic m_commanded_configuration; - std::atomic m_current_configuration; + /** + * Enumeration containing the commanded focal configuration. + */ + std::atomic m_commanded_configuration; + + /** + * Enumeration containing the status of the subsystem. + */ std::atomic m_subsystem_status; + + /** + * String containing the current focal configuration name. + */ std::string m_actual_setup; + + /** + * Boolean indicating whether the system is ready or not. + */ std::atomic m_ready; + + /** + * Boolean indicating whether the system is performing a setup procedure or not. + */ std::atomic m_starting; + + /** + * Boolean indicating whether the system is using ASACTIVE configurations or not. + */ std::atomic m_as_configuration; + + /** + * Boolean indicating whether the system is currently tracking the elevation. + */ std::atomic m_elevation_tracking; + + /** + * Boolean indicating whether the tracking of the elevation is enabled. + */ std::atomic m_elevation_tracking_enabled; + + /** + * Boolean indicating whether the system can perform scans or not. + */ std::atomic m_scan_active; + + /** + * Boolean indicating whether the system is scanning or not. + */ std::atomic m_scanning; + + /** + * Boolean indicating whether the system is tracking or not. + */ std::atomic m_tracking; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; + + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; + + /** + * Boolean indicating whether the socket is connected or not. + */ + std::atomic m_socket_connected; + + /** + * Map containing all the servos in the minor servo system. + */ + const std::map m_servos; + + /** + * Map containing all the tracking servos in the minor servo system. + */ + const std::map m_tracking_servos; + + /** + * Current scan parameters. + */ + SRTMinorServoScan m_current_scan; + + /** + * Last scan parameters. + */ + SRTMinorServoScan m_last_scan; }; #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index fa9a5fd13..6f15aafac 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "Common.h" +#include "SRTMinorServoCommon.h" #include #include #include @@ -16,122 +16,532 @@ #include #include #include -#include "ManagementErrors.h" #include "MinorServoErrors.h" #include "SRTMinorServoBossCore.h" #include "SRTMinorServoStatusThread.h" +#include "SRTMinorServoUtils.h" #include "MSDevIOs.h" -#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTMinorServoBossImpl::PROPERTYNAME() \ -{ \ - if (PROPERTY==0) return TYPE::_nil(); \ - TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ - return tmp._retn(); \ -} +using namespace MinorServo; // Forward classes definitions class SRTMinorServoBossCore; class SRTMinorServoStatusThread; -class SRTMinorServoBossImpl: public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTMinorServoBoss +class SRTMinorServoBossImpl : public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTMinorServoBoss { -friend class SRTMinorServoBossCore; + friend class SRTMinorServoBossCore; public: - // Constructor and destructor - SRTMinorServoBossImpl(const ACE_CString&, maci::ContainerServices*); + /** + * Constructor. + * @param component_name the name of the component. + * @param container_services the ACS container services. + */ + SRTMinorServoBossImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ virtual ~SRTMinorServoBossImpl(); - // Characteristic component methods + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ virtual void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ virtual void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ virtual void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ virtual void aboutToAbort(); - // Parser methods - virtual void setup(const char*); + /** + * Performs a setup procedure. + * @param configuration a mnemonic code identifying the desired configuration. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while calling the SRTMinorServoBossCore method implementation. + */ + virtual void setup(const char* configuration); + + /** + * Performs a park procedure. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while calling the SRTMinorServoBossCore method implementation. + */ virtual void park(); - virtual void setElevationTracking(const char* elevation_tracking); - virtual void setASConfiguration(const char* as_configuration); - virtual void setOffsets(const char* axis_name, const double& offset); - virtual void clearOffsets(); - CORBA::Boolean command(const char*, CORBA::String_out); - // MinorServoBoss interface methods + /** + * Method that tells if the elevation tracking is enabled. + * @return a CORBA::Boolean indicating if the elevation tracking is enabled or not. + */ virtual CORBA::Boolean isElevationTrackingEn(); + + /** + * Method that tells if the elevation is being tracked. + * @return a CORBA::Boolean indicating if the system is currently tracking the elevation or not. + */ virtual CORBA::Boolean isElevationTracking(); + + /** + * Method that tells if the system is currently tracking the commanded position. + * @return a CORBA::Boolean indicating if the system is currently tracking below the given error threshold or not. + */ virtual CORBA::Boolean isTracking(); + + /** + * Method that tells if the system is currently performing a setup procedure. + * @return a CORBA::Boolean indicating if the system is currently performing a setup procedure or not. + */ virtual CORBA::Boolean isStarting(); + + /** + * Method that tells if the system is using ASACTIVE lookup tables or not. + * @return a CORBA::Boolean indicating if the system is configured to use ASACTIVE lookup tables or not. + */ virtual CORBA::Boolean isASConfiguration(); + + /** + * Method that tells if the system is currently performing a parking procedure. + * @return a CORBA::Boolean indicating if the system is currently performing a parking procedure or not. + */ virtual CORBA::Boolean isParking(); + + /** + * Method that tells if the system was configured correctly. + * @return a CORBA::Boolean indicating if the system is ready to be moved or not. + */ virtual CORBA::Boolean isReady(); + + /** + * Method that tells if the system is currently performing a scan. + * @return a CORBA::Boolean indicating if the system is currently performing a scan or not. + */ virtual CORBA::Boolean isScanning(); + + /** + * Method that tells if the system can currently perform a scan or not. + * @return a CORBA::Boolean indicating if the system can perform a scan or not. + */ virtual CORBA::Boolean isScanActive(); - virtual char * getActualSetup(); - virtual char * getCommandedSetup(); + + /** + * Returns the name of the current focal configuration. + * @return a string containing the current focal configuration name. + */ + virtual char* getActualSetup(); + + /** + * Returns the name of the commanded focal configuration. + * @return a string containing the commanded focal configuration name. + */ + virtual char* getCommandedSetup(); + + /** + * Returns the central position for the axis involved in the current or last scan. + * @return a CORBA::Double containing the central position for the current scan axis. + * @throw MinorServoErrors::MinorServoErrorsEx when no scan has been performed yet. + */ virtual CORBA::Double getCentralScanPosition(); + + /** + * Clears the user defined offsets from all the minor servos. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void clearOffsets(); + + /** + * Resets the given servo user offsets to 0. + * @param servo_name the name of the minor servo the user offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ virtual void clearUserOffset(const char* servo_name); + + /** + * Sets the given axis' user offset. CORBA IDL implementation. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ virtual void setUserOffset(const char* servo_axis_name, CORBA::Double offset); + + /** + * Sets the given axis' user offset. SimpleParser implementation. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void setUserOffset(const char* servo_axis_name, const double& offset); + + /** + * Retrieves all the current user offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes user offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ virtual ACS::doubleSeq* getUserOffset(); + + /** + * Resets the given servo system offsets to 0. + * @param servo_name the name of the minor servo the system offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ virtual void clearSystemOffset(const char* servo_name); + + /** + * Sets the given axis' system offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired system offset to be loaded for the given axis. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ virtual void setSystemOffset(const char* servo_axis_name, CORBA::Double offset); + + /** + * Retrieves all the current system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes system offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ virtual ACS::doubleSeq* getSystemOffset(); + + /** + * Retrieves all the current axes names and units of measure. + * @param axes_names_out a reference to the sequence in which the method will put all the axes names. + * @param axes_units_out a reference to the sequence in which the method will put all the axes units of measure. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + */ virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + + /** + * Gets the axis involved in the currently or last executed scan. + * @return a string containing the servo name and the axis name, connected by a _ character. + */ virtual char* getScanAxis(); - virtual ACS::doubleSeq* getAxesPosition(ACS::Time); - virtual CORBA::Boolean checkScan(const ACS::Time, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&, MinorServo::TRunTimeParameters_out); - virtual void startScan(ACS::Time&, const MinorServo::MinorServoScan&, const Antenna::TRunTimeParameters&); - virtual void closeScan(ACS::Time&); + /** + * Retrieves all the axes positions for a given epoch. + * @param acs_time the ACS::Time the user wants to retrieve all the axes positions for. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return an ACS::doubleSeq containing all the axes positions for the given time. + */ + virtual ACS::doubleSeq* getAxesPosition(ACS::Time acs_time); + /** + * Enables or disables the elevation tracking. + * @param configuration the desired elevation tracking configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + virtual void setElevationTracking(const char* elevation_tracking); + + /** + * Enables or disables the use of ASACTIVE configurations. + * @param configuration the desired active surface configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + virtual void setASConfiguration(const char* as_configuration); + + /** + * Opens or closes the gregorian cover. + * @param position the desired position for the gregorian cover, allowed values are 'open', 'OPEN', 'closed' or 'CLOSED'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded position is unknown, when the system is not parked or parking, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + virtual void setGregorianCoverPosition(const char* position); + + /** + * This method checks if a scan with the given parameters is feasible. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @param ms_parameters a reference to the object containing the calculated parameters for the requested scan. + * @return true if the requested scan is feasible, false otherwise. + */ + virtual CORBA::Boolean checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters); + + /** + * This method commands the start of a scan to the minor servo system. + * @param start_time a reference to the ACS::Time object. This value will be written by this method and it will represent the earliest time the minor servo system can perform the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status, with the given parameters or when the scan could not be performed for any reason. + */ + virtual void startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + + /** + * Requests a stop for the ongoing scan. + * @param close_time the closing time for the ongoing scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status. + */ + virtual void closeScan(ACS::Time& close_time); + + /** + * Configures the whole minor servo system to a desired position. + * @param elevation the elevation to use for all the minor servo positions calculation. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system was not configured yet, + * when a single minor servo component raises an error or when checkLineStatus throws. + */ virtual void preset(double elevation); - // Properties methods + /** + * Parser method. It executes the desired command. + */ + virtual CORBA::Boolean command(const char*, CORBA::String_out); + + /** + * Returns a reference to the status property implementation of the IDL interface. + * @return pointer to read-only TSystemStatus property status. + */ virtual Management::ROTSystemStatus_ptr status(); + + /** + * Returns a reference to the ready property implementation of the IDL interface. + * @return pointer to read-only TBoolean property ready. + */ virtual Management::ROTBoolean_ptr ready(); + + /** + * Returns a reference to the actualSetup property implementation of the IDL interface. + * @return pointer to read-only string property actualSetup. + */ virtual ACS::ROstring_ptr actualSetup(); + + /** + * Returns a reference to the motionInfo property implementation of the IDL interface. + * @return pointer to read-only string property motionInfo. + */ virtual ACS::ROstring_ptr motionInfo(); + + /** + * Returns a reference to the starting property implementation of the IDL interface. + * @return pointer to read-only TBoolean property starting. + */ virtual Management::ROTBoolean_ptr starting(); + + /** + * Returns a reference to the asConfiguration property implementation of the IDL interface. + * @return pointer to read-only TBoolean property asConfiguration. + */ virtual Management::ROTBoolean_ptr asConfiguration(); + + /** + * Returns a reference to the elevationTrack property implementation of the IDL interface. + * @return pointer to read-only TBoolean property elevationTrack. + */ virtual Management::ROTBoolean_ptr elevationTrack(); + + /** + * Returns a reference to the scanActive property implementation of the IDL interface. + * @return pointer to read-only TBoolean property scanActive. + */ virtual Management::ROTBoolean_ptr scanActive(); + + /** + * Returns a reference to the scanning property implementation of the IDL interface. + * @return pointer to read-only TBoolean property scanning. + */ virtual Management::ROTBoolean_ptr scanning(); + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to read-only TBoolean property tracking. + */ virtual Management::ROTBoolean_ptr tracking(); - virtual MinorServo::ROSRTMinorServoFocalConfiguration_ptr current_configuration(); + /** + * Returns a reference to the connected property implementation of the IDL interface. + * @return pointer to read-only TBoolean property connected. + */ + virtual Management::ROTBoolean_ptr connected(); + + /** + * Returns a reference to the current_configuration property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoFocalConfiguration property current_configuration. + */ + virtual ROSRTMinorServoFocalConfiguration_ptr current_configuration(); + + /** + * Returns a reference to the simulation_enabled property implementation of the IDL interface. + * @return pointer to read-only TBoolean property simulation_enabled. + */ virtual Management::ROTBoolean_ptr simulation_enabled(); + + /** + * Returns a reference to the plc_time property implementation of the IDL interface. + * @return pointer to read-only double property plc_time. + */ virtual ACS::ROdouble_ptr plc_time(); + + /** + * Returns a reference to the plc_version property implementation of the IDL interface. + * @return pointer to read-only string property plc_version. + */ virtual ACS::ROstring_ptr plc_version(); - virtual MinorServo::ROSRTMinorServoControlStatus_ptr control(); + + /** + * Returns a reference to the control property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoControlStatus property control. + */ + virtual ROSRTMinorServoControlStatus_ptr control(); + + /** + * Returns a reference to the power property implementation of the IDL interface. + * @return pointer to read-only TBoolean property power. + */ virtual Management::ROTBoolean_ptr power(); + + /** + * Returns a reference to the emergency property implementation of the IDL interface. + * @return pointer to read-only TBoolean property emergency. + */ virtual Management::ROTBoolean_ptr emergency(); - virtual MinorServo::ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); + + /** + * Returns a reference to the gregorian_cover property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoGregorianCoverStatus property gregorian_cover. + */ + virtual ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); + + /** + * Returns a reference to the last_executed_command property implementation of the IDL interface. + * @return pointer to read-only double property last_executed_command. + */ virtual ACS::ROdouble_ptr last_executed_command(); private: - SRTMinorServoBossCore* m_core; - SRTMinorServoStatusThread* m_status_thread; - SimpleParser::CParser *m_parser; + /** + * Component name. + */ + const std::string m_component_name; + + /** + * SRTMinorServoBossCore object pointer. No delete is needed since it is handled by the shared_ptr logic. + */ + const std::shared_ptr m_core_ptr; + + /** + * SRTMinorServoBossCore object reference. + */ + SRTMinorServoBossCore& m_core; + + /** + * Command line parser object. + */ + SimpleParser::CParser m_parser; - // Properties pointers - baci::SmartPropertyPointer > m_status_ptr; - baci::SmartPropertyPointer > m_ready_ptr; + /** + * Pointer to the connected property. + */ + baci::SmartPropertyPointer> m_connected_ptr; + + /** + * Pointer to the status property. + */ + baci::SmartPropertyPointer> m_status_ptr; + + /** + * Pointer to the ready property. + */ + baci::SmartPropertyPointer> m_ready_ptr; + + /** + * Pointer to the actual_setup property. + */ baci::SmartPropertyPointer m_actual_setup_ptr; + + /** + * Pointer to the motion_info property. + */ baci::SmartPropertyPointer m_motion_info_ptr; - baci::SmartPropertyPointer > m_starting_ptr; - baci::SmartPropertyPointer > m_as_configuration_ptr; - baci::SmartPropertyPointer > m_elevation_tracking_ptr; - baci::SmartPropertyPointer > m_scan_active_ptr; - baci::SmartPropertyPointer > m_scanning_ptr; - baci::SmartPropertyPointer > m_tracking_ptr; - - baci::SmartPropertyPointer > m_current_configuration_ptr; - baci::SmartPropertyPointer > m_simulation_enabled_ptr; + + /** + * Pointer to the starting property. + */ + baci::SmartPropertyPointer> m_starting_ptr; + + /** + * Pointer to the as_configuration property. + */ + baci::SmartPropertyPointer> m_as_configuration_ptr; + + /** + * Pointer to the elevation_tracking property. + */ + baci::SmartPropertyPointer> m_elevation_tracking_ptr; + + /** + * Pointer to the scan_active property. + */ + baci::SmartPropertyPointer> m_scan_active_ptr; + + /** + * Pointer to the scanning property. + */ + baci::SmartPropertyPointer> m_scanning_ptr; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer> m_tracking_ptr; + + /** + * Pointer to the current_configuration property. + */ + baci::SmartPropertyPointer> m_current_configuration_ptr; + + /** + * Pointer to the simulation_enabled property. + */ + baci::SmartPropertyPointer> m_simulation_enabled_ptr; + + /** + * Pointer to the plc_time property. + */ baci::SmartPropertyPointer m_plc_time_ptr; + + /** + * Pointer to the plc_version property. + */ baci::SmartPropertyPointer m_plc_version_ptr; - baci::SmartPropertyPointer > m_control_ptr; - baci::SmartPropertyPointer > m_power_ptr; - baci::SmartPropertyPointer > m_emergency_ptr; - baci::SmartPropertyPointer > m_gregorian_cover_ptr; + + /** + * Pointer to the control property. + */ + baci::SmartPropertyPointer> m_control_ptr; + + /** + * Pointer to the power property. + */ + baci::SmartPropertyPointer> m_power_ptr; + + /** + * Pointer to the emergency property. + */ + baci::SmartPropertyPointer> m_emergency_ptr; + + /** + * Pointer to the gregorian_cover property. + */ + baci::SmartPropertyPointer> m_gregorian_cover_ptr; + + /** + * Pointer to the last_executed_command property. + */ baci::SmartPropertyPointer m_last_executed_command_ptr; }; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h new file mode 100644 index 000000000..77248b543 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -0,0 +1,110 @@ +#ifndef __SRTMINORSERVOCOMMON_H__ +#define __SRTMINORSERVOCOMMON_H__ + +/** + * SRTMinorServoCommon.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include + +/** + * programTrack constants. The first indicates the time between two consecutive points, the second indicates the time we send each point in advance. + */ +#define PROGRAM_TRACK_TIMEGAP 2000000 //200 milliseconds +#define PROGRAM_TRACK_FUTURE_TIME 4000000 //400 milliseconds + +/** + * Macro used to link the properties pointers to their methods. + */ +#define GET_PROPERTY_REFERENCE(TYPE, CLASSNAME, PROPERTY, PROPERTYNAME) TYPE##_ptr CLASSNAME::PROPERTYNAME()\ +{ \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + + +namespace MinorServo +{ + /** + * This dictionary contains information regarding the possibile focal configurations. + * The key indicates the configuration as known by DISCOS. + * The value is a pair, the first element of the pair is the DISCOS enumeration for the relative Leonardo configuration, + * the second element of the pair indicates whether the configuration has a ASACTIVE twin configuraiton. + */ + using DiscosConfigurationNameTableType = std::map>; + const DiscosConfigurationNameTableType DiscosConfigurationNameTable = + { + {"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, + {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, + {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, + {"QQG", std::make_pair(CONFIGURATION_GREGORIAN4, true )}, + {"TRI", std::make_pair(CONFIGURATION_GREGORIAN5, true )}, + {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, + {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, + {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, + }; + + /** + * This dictionary contains the Leonardo focal configurations DISCOS enumerations, alongside their name inside the Leonardo minor servo system. + */ + using LDOConfigurationNameTableType = boost::bimap; + const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of + (CONFIGURATION_PRIMARY, "Primario") + (CONFIGURATION_GREGORIAN1, "Gregoriano 1") + (CONFIGURATION_GREGORIAN2, "Gregoriano 2") + (CONFIGURATION_GREGORIAN3, "Gregoriano 3") + (CONFIGURATION_GREGORIAN4, "Gregoriano 4") + (CONFIGURATION_GREGORIAN5, "Gregoriano 5") + (CONFIGURATION_GREGORIAN6, "Gregoriano 6") + (CONFIGURATION_GREGORIAN7, "Gregoriano 7") + (CONFIGURATION_GREGORIAN8, "Gregoriano 8") + (CONFIGURATION_BWG1, "BWG1") + (CONFIGURATION_BWG2, "BWG2") + (CONFIGURATION_BWG3, "BWG3") + (CONFIGURATION_BWG4, "BWG4"); + + /** + * This dictionary containes the Leonardo focal configurations DISCOS enumerations, alongside their ID counterpart as read from the Leonardo minor servo system proxy. + */ + using LDOConfigurationIDTableType = boost::bimap; + const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of + (CONFIGURATION_UNKNOWN, 0) + (CONFIGURATION_PRIMARY, 1) + (CONFIGURATION_GREGORIAN1, 11) + (CONFIGURATION_GREGORIAN2, 12) + (CONFIGURATION_GREGORIAN3, 13) + (CONFIGURATION_GREGORIAN4, 14) + (CONFIGURATION_GREGORIAN5, 15) + (CONFIGURATION_GREGORIAN6, 16) + (CONFIGURATION_GREGORIAN7, 17) + (CONFIGURATION_GREGORIAN8, 18) + (CONFIGURATION_BWG1, 21) + (CONFIGURATION_BWG2, 22) + (CONFIGURATION_BWG3, 23) + (CONFIGURATION_BWG4, 24); + + /** + * This is a simple list indicating the order of the minor servo components. + */ + const std::vector ServoOrder = + { + "PFP", + "SRP", + "GFR", + "M3R" + }; +} + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h new file mode 100644 index 000000000..1dad210f9 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h @@ -0,0 +1,328 @@ +#ifndef __SRTMINORSERVOCONTAINERS_H__ +#define __SRTMINORSERVOCONTAINERS_H__ + +/** + * SRTMinorServoContainers.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include + + +namespace MinorServo +{ + /** + * Object used to store some info regarding a scan. + */ + struct SRTMinorServoScan + { + /** + * Name of the servo involved in the scan. + */ + std::string servo_name = ""; + + /** + * Name of the axis involved in the scan. + */ + std::string axis_name = ""; + + /** + * Index of the axis involved in the scan. + */ + size_t axis_index = 0; + + /** + * Range of the scan. + */ + double scan_range = 0; + + /** + * Starting time of the scan. + */ + ACS::Time start_time = 0; + + /** + * Closing time of the scan. + */ + ACS::Time close_time = 0; + + /** + * Duration of the scan. + */ + ACS::TimeInterval scan_duration = 0; + + /** + * Central position of the scan axis. + */ + double central_position = 0; + + /** + * Starting elevation for the scan. + */ + double starting_elevation = 0; + }; + + using SRTMinorServoLookupTable = std::map>; + + /** + * This class implements a queue of time tagged positions. it extends a simple std::map with some specific methods. + */ + class SRTMinorServoPositionsQueue : private std::map> + { + public: + /** + * Default constructor. Used only for lazy initialization. + */ + SRTMinorServoPositionsQueue() : std::map>(), m_queue_size(0), m_vector_size(0), m_mutex() {} + + /** + * Constructor with queue size as parameter. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + */ + SRTMinorServoPositionsQueue(size_t queue_size) : std::map>(), m_queue_size(queue_size), m_vector_size(0), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + } + + /** + * Constructor with queue size and vector size as parameters. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + * @param vector_size the length of the vectors that this object will store. Once set it cannot be changed. This assures we are always dealing with the same number of virtual axes. + */ + SRTMinorServoPositionsQueue(size_t queue_size, size_t vector_size) : std::map>(), m_queue_size(queue_size), m_vector_size(vector_size), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + vectorLazyInit(vector_size); + } + + /** + * Custom assignment operator. It locks both the current object and the passed one with a mutex in order for the assignment operation to be thread safe. + * @param other the other SRTMinorServoPositionsQueue we are assigning its value to the current object. + * @return the newly populated SRTMinorServoPositionsQueue object. + */ + SRTMinorServoPositionsQueue& operator=(const SRTMinorServoPositionsQueue& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + m_queue_size = other.m_queue_size; + m_vector_size = other.m_vector_size; + std::map>::operator=(other); + } + + return *this; + } + + /** + * Put method, with initializer list argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::initializer_list& values) + { + put(key, std::vector(values)); + } + + /** + * Put method, with ACS::doubleSeq argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const ACS::doubleSeq& values) + { + put(key, std::vector(values.get_buffer(), values.get_buffer() + values.length())); + } + + /** + * Put method, with std::vector argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::vector& values) + { + std::unique_lock lock(m_mutex); + + vectorLazyInit(values.size()); + queueLazyInit(m_queue_size); + if(std::map>::size() == m_queue_size) + { + // Remove the oldest one + this->erase(this->begin()); + } + this->emplace(std::make_pair(key, values)); + } + + /** + * Get method. It retrieves a set of coordinates from a given ACS::Time, giving back the time as well. + * @param key the time the user wants to retrieve the related coordinates. + * @param exact a boolean indicating whether the user wants to interpolate (false) or not (true). + * @throw std::logic_error when the queue is empty. + * @throw std::out_of_range when the exact point was not found in the queue. + * @return a std::pair containing the ACS::Time as first element and the set of coordinates as second element. + */ + std::pair> get(ACS::Time key, bool exact = false) + { + std::shared_lock lock(m_mutex); + + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + + if(const SRTMinorServoPositionsQueue::iterator point = this->find(key); point != this->end()) + { + return *point; + } + else if(exact) + { + // Exact point not found, we throw an exception + throw std::out_of_range("Exact point not found!"); + } + else + { + // Key not found, should check outside the boundaries or interpolate + if(key <= this->begin()->first) + { + // Aksed for a timestamp older than the earliest point in the queue + return *this->cbegin(); + } + else if(key >= this->rbegin()->first) + { + // Asked for a timestamp newer than the latest point in the queue + return *this->crbegin(); + } + else + { + std::vector positions(m_vector_size, 0.0); + SRTMinorServoPositionsQueue::iterator p0, p1; + p1 = this->lower_bound(key); + p0 = p1; + p0--; + + // Calculate the linear fit for each position + double fraction = (key - p0->first) / (p1->first - p0->first); + + for(size_t i = 0; i < m_vector_size; i++) + { + positions[i] = p0->second[i] + fraction * (p1->second[i] - p0->second[i]); + } + + return std::make_pair(key, (const std::vector)positions); + } + } + } + + /** + * Size method thread safe override. + * @return the number of elements in the queue. + */ + size_t size() const + { + std::shared_lock lock(m_mutex); + return std::map>::size(); + } + + /** + * Clear method, thread safe. It empties the queue. + */ + void clear() + { + std::unique_lock lock(m_mutex); + std::map>::clear(); + } + + /** + * This method returns the number of points having a higher tag time than the one passed as argument. + * @param t the time threshold. This method counts and returns the number of points having a higher time than this value. + * @throw std::logic_error when the queue is empty. + * @return the number of points having a higher time than the given one. + */ + size_t getRemainingPoints(ACS::Time t) + { + std::shared_lock lock(m_mutex); + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + return std::distance(this->lower_bound(t), this->end()); + } + + private: + /** + * This method gets called by the constructors for the lazy intialization of the queue size value. + * @param queue_size the desired maximum queue size. + * @throw std::length_error when the desired queue size is equal to 0 or when it is greater than the maximum size that can be currently allocated. + */ + void queueLazyInit(size_t queue_size) + { + if(m_queue_size == 0) + { + if(queue_size == 0) + { + // The maximum queue size was not set yet + throw std::length_error("Queue length cannot be 0."); + } + else if(queue_size > this->max_size()) + { + // The requested size is greater than the maximum possible queue size + throw std::length_error("Queue length cannot exceed " + std::to_string(this->max_size()) + "."); + } + else + { + m_queue_size = queue_size; + } + } + } + + /** + * This method gets called by the constructors for the lazy initialization of the vector size value. + * @param vector_size the desired length of the vector containing the set of points. + * @throw std::length_error when the desired vector size is equal to 0 or when it is longer than 6. We don't have more than 6 axes, so we hard cap this value to 6. + * It also throws this when the user tries to insert a vector with different lenght then the already defined one. This ensures all stored vecors are of equal length. + */ + void vectorLazyInit(size_t vector_size) + { + if(vector_size == 0) + { + throw std::length_error("Vector length cannot be 0."); + } + else if(vector_size > 6) + { + // Hard cap to 6, we don't need more + throw std::length_error("Vector length cannot be longer than 6."); + } + else if(m_vector_size == 0) + { + m_vector_size = vector_size; + } + else if(m_vector_size != vector_size) + { + throw std::length_error("New vector length does not match the initial one."); + } + } + + /** + * The maximum size of the queue. + */ + size_t m_queue_size; + + /** + * The desired length of the vectors stored by this object. + */ + size_t m_vector_size; + + /** + * The shared mutex used for access synchronization. + */ + mutable std::shared_mutex m_mutex; + }; +} + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index 679e33440..a09cb6409 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -3,11 +3,10 @@ /** * SRTMinorServoImpl.h - * 21/06/2023 * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "Common.h" +#include "SRTMinorServoCommon.h" #include #include #include @@ -24,170 +23,701 @@ #include "MinorServoErrors.h" #include "SRTMinorServoSocket.h" #include "MSDevIOs.h" +#include "SRTMinorServoContainers.h" -#define GET_PROPERTY_REFERENCE(TYPE,PROPERTY,PROPERTYNAME) TYPE##_ptr SRTBaseMinorServoImpl::PROPERTYNAME()\ -{ \ - if (PROPERTY==0) return TYPE::_nil(); \ - TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ - return tmp._retn(); \ -} -using SRTMinorServoLookupTable = std::map >; +using namespace MinorServo; - -class SRTBaseMinorServoImpl: public baci::CharacteristicComponentImpl +/** + * This class implements the base ACS::CharacteristicComponent CORBA interface for a SRTMinorServo component. + * It is inherited by the other classes declared below. + */ +class SRTBaseMinorServoImpl : public baci::CharacteristicComponentImpl { public: - SRTBaseMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTBaseMinorServoImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ virtual ~SRTBaseMinorServoImpl(); - virtual void initialize(); - virtual void execute(); - virtual void cleanUp(); - virtual void aboutToAbort(); - - virtual void status(); - virtual void stow(CORBA::Long stow_position = 1); - virtual void stop(); - virtual void preset(const ACS::doubleSeq& coordinates); - virtual void offset(const ACS::doubleSeq& offsets); - virtual void setup(const char* configuration_name = ""); - virtual ACS::doubleSeq* calcCoordinates(double elevation); - - virtual ACS::doubleSeq* getUserOffsets(); - virtual void setUserOffset(const char* axis_name, CORBA::Double offset); - virtual void clearUserOffsets(); - virtual ACS::doubleSeq* getSystemOffsets(); - virtual void setSystemOffset(const char* axis_name, CORBA::Double offset); - virtual void clearSystemOffsets(); - virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ + void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ + void aboutToAbort(); + + /** + * Asks the hardware the status of the servo system and updates the component properties. + * @return true if the communication succeeded, false otherwise. + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware. + */ + bool status(); + + /** + * Asks the servo system to perform a STOW operation. + * @param stow_position the position to get stowed into. + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted. + */ + void stow(CORBA::Long stow_position = 1); + + /** + * Asks the servo system to perform a STOP operation. + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted. + */ + void stop(); + + /** + * Asks the servo system to perform a PRESET operation. + * @param coordinates the sequence of coordinates to get into position to, the sequence length must be equal to the number of virtual axes of the servo system. + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted. + */ + void preset(const ACS::doubleSeq& coordinates); + + /** + * Asks the servo system to load the commanded configuration table. + * @param configuration_name the configuration the servo system should assume. + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. + */ + void setup(const char* configuration_name = ""); + + /** + * Asks the component to calculate the servo system position starting from the given elevation. + * @param elevation the elevation we want to use to calculate and retrieve the servo system coordinates, expressed in degrees. + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation. + * @return a pointer to the double sequence object containing the calculated coordinates of the servo system. + */ + ACS::doubleSeq* calcCoordinates(CORBA::Double elevation); + + /** + * Asks the component the virtual axes user offsets. + * @return a pointer to the double sequence object containing the current virtual axes user offsets of the servo system. + */ + ACS::doubleSeq* getUserOffsets(); + /** + * Load a single virtual axis user offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired user offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis_name is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + void setUserOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes user offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void clearUserOffsets(); + + /** + * Asks the component the virtual axes system offsets. + * @return a pointer to the double sequence object containing the current virtual axes system offsets of the servo system. + */ + ACS::doubleSeq* getSystemOffsets(); + + /** + * Load a single virtual axis system offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired system offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + void setSystemOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes system offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void clearSystemOffsets(); + + /** + * Returns the name and the unit of each virtual axes of the servo system, as reference arguments. + * @param axes_names_out a string sequence object containing the names of the virtual axes of the servo system. + * @param axes_units_out a string sequence object containing the units of the virtual axes of the servo system. + */ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out); + + /** + * Returns the virtual axes positions to where the servo system was at the given time acs_time. + * @param acs_time the epoch we want to retrieve the axes virtual positions of the servo system. + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty. + * @return a pointer to the double sequence object containing the virtual axes positions at the given epoch. + */ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time); + + /** + * Returns the maximum travel time to get from a starting position to a destination position. + * @param start a double sequence containing the starting position. If the provided sequence is empty, the current axes positions are used for the calculation. + * @param dest a double sequence containing the destination position. + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + ACS::TimeInterval getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest); + + /** + * Returns the minimum and maximum range of the virtual axes of the servo system, as reference arguments. + * @param min_ranges_out a double sequence object containing the minimum ranges of the virtual axes of the servo system. + * @param max_ranges_out a double sequence object containing the maximum ranges of the virtual axes of the servo system. + */ + void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out); + + /** + * Returns a reference to the enabled property implementation of the IDL interface. + * @return pointer to read-only boolean property enabled. + */ virtual Management::ROTBoolean_ptr enabled(); - virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + + /** + * Returns a reference to the drive_cabinet_status property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. + */ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + + /** + * Returns a reference to the block property implementation of the IDL interface. + * @return pointer to read-only boolean property block. + */ virtual Management::ROTBoolean_ptr block(); - virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode(); + + /** + * Returns a reference to the operative_mode property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. + */ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode(); + + /** + * Returns a reference to the physical_axes_enabled property implementation of the IDL interface. + * @return pointer to read-only boolean sequence property physical_axes_enabled. + */ virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); + + /** + * Returns a reference to the physical_positions property implementation of the IDL interface. + * @return pointer to read-only boolean sequence property physical_positions. + */ virtual ACS::ROdoubleSeq_ptr physical_positions(); + + /** + * Returns a reference to the virtual_axes property implementation of the IDL interface. + * @return pointer to read-only long property virtual_axes. + */ virtual ACS::ROlong_ptr virtual_axes(); + + /** + * Returns a reference to the plain_virtual_positions property implementation of the IDL interface. + * @return pointer to read-only double sequence property plain_virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions(); + + /** + * Returns a reference to the virtual_positions property implementation of the IDL interface. + * @return pointer to read-only double sequence property virtual_positions. + */ virtual ACS::ROdoubleSeq_ptr virtual_positions(); + + /** + * Returns a reference to the virtual_offsets property implementation of the IDL interface. + * @return pointer to read-only double sequence property virtual_offsets. + */ virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + + /** + * Returns a reference to the virtual_user_offsets property implementation of the IDL interface. + * @return pointer to read-only double sequence property virtual_user_offsets. + */ virtual ACS::ROdoubleSeq_ptr virtual_user_offsets(); + + /** + * Returns a reference to the virtual_system_offsets property implementation of the IDL interface. + * @return pointer to read-only double sequence property virtual_system_offsets. + */ virtual ACS::ROdoubleSeq_ptr virtual_system_offsets(); + + /** + * Returns a reference to the in_use property implementation of the IDL interface. + * @return pointer to read-only boolean property in_use. + */ virtual Management::ROTBoolean_ptr in_use(); + + /** + * Returns a reference to the current_setup property implementation of the IDL interface. + * @return pointer to read-only string property current_setup. + */ virtual ACS::ROstring_ptr current_setup(); protected: - std::atomic m_physical_axes, m_virtual_axes; - SRTMinorServoSocket* m_socket; - std::string m_servo_name; + /** + * Checks if the socket is connected and if the minor servo system is in a good state. + * @throw MinorServoErrors::MinorServoErrorsEx when the socket is not connected or when the minor servo system is blocked or the drive cabinet is in error state. + */ + void checkLineStatus(); + + /** + * Static function used to retrieve some constants from the component CDB xml schema. + * @param object the instance of this class, used inside the function logic. + * @param constant the name of the constants we want to retrieve from the CDB. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB or when it has a non meaningful value. + * @return a vector of doubles containing the retrieved constants, its length is the same as the number of virtual axes of the servo system. + */ + static std::vector getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant); private: - SRTMinorServoSocketConfiguration* m_socket_configuration; + /** + * Resets both the user and the system offsets to 0. This is needed since the Leonardo servo system only tracks a single set of offsets. + * If we lose track of the offsets inside DISCOS (when restarting this component, for example), we need to reset the offsets in order to track them again. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void resetOffsets(); + /** + * Static function used to retrieve a table from the CDB DataBlock directory. Used inside the initialization list. + * @param object the instance of this class, used inside the function logic. + * @param properties_name the name of the block to retrieve as written inside the DataBlock file. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB. + * @return a vector of strings containing the retrieved table fields. + */ + static std::vector getPropertiesTable(SRTBaseMinorServoImpl& object, const std::string& properties_name); + + /** + * Attributes. + * Keep the same order for the initialization list. + */ +protected: + /** + * Name of the component. + */ + const std::string m_component_name; + + /** + * Name of the servo system. + */ + const std::string m_servo_name; + + /** + * Dictionary containing the last status retrieved form the servo system. + */ SRTMinorServoAnswerMap m_status; - IRA::CSecureArea* m_status_securearea; + /** + * Number of virtual axes of the servo system. + */ + const size_t m_virtual_axes; +private: + + /** + * Number of physical axes of the servo system. + */ + const size_t m_physical_axes; + + /** + * Name of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_names; + + /** + * Units of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_units; +protected: + + /** + * Queue of positions assumed by the servo system in time. + */ + SRTMinorServoPositionsQueue m_positions_queue; + + /** + * Minimum ranges of the axes of the servo system. + */ + const std::vector m_min; + + /** + * Maximum ranges of the axes of the servo system. + */ + const std::vector m_max; +private: + /** + * Maximum speeds of the axes of the servo system. + */ + const std::vector m_m_s; + + /** + * Accelerations of the axes of the servo system. + */ + const std::vector m_a; + + /** + * Times to perform a full acceleration ramp from 0 to maximum speed, for each axis. + */ + const std::vector m_r_t; + + /** + * Distances covered by a full acceleration ramp from 0 to maximum speed, for each axis. + */ + const std::vector m_r_d; + + /** + * Current speed of the axes of the servo system. + */ + std::vector m_c_s; + + /** + * Commanded user offsets for each axis of the servo system. + */ std::vector m_user_offsets; - std::vector m_system_offsets; - std::vector m_virtual_axes_names; - std::vector m_virtual_axes_units; - SRTMinorServoLookupTable m_current_lookup_table; + /** + * Commanded system offsets for each axis of the servo system. + */ + std::vector m_system_offsets; + /** + * Boolean indicating whether the servo system is used in the current focal configuration. + */ std::atomic m_in_use; + + /** + * Current active setup name. + */ std::string m_current_setup; - baci::SmartPropertyPointer > m_enabled_ptr; - baci::SmartPropertyPointer > m_drive_cabinet_status_ptr; - baci::SmartPropertyPointer > m_block_ptr; - baci::SmartPropertyPointer > m_operative_mode_ptr; + /** + * Pointer to the enabled property. + */ + baci::SmartPropertyPointer> m_enabled_ptr; + + /** + * Pointer to the drive_cabinet_status property. + */ + baci::SmartPropertyPointer> m_drive_cabinet_status_ptr; + + /** + * Pointer to the block property. + */ + baci::SmartPropertyPointer> m_block_ptr; + + /** + * Pointer to the operative_mode property. + */ + baci::SmartPropertyPointer> m_operative_mode_ptr; + + /** + * Pointer to the physical_axes_enabled property. + */ baci::SmartPropertyPointer m_physical_axes_enabled_ptr; + + /** + * Pointer to the physical_positions property. + */ baci::SmartPropertyPointer m_physical_positions_ptr; + + /** + * Pointer to the virtual_axes property. + */ baci::SmartPropertyPointer m_virtual_axes_ptr; + + /** + * Pointer to the plain_virtual_positions property. + */ + baci::SmartPropertyPointer m_plain_virtual_positions_ptr; + + /** + * Pointer to the virtual_positions property. + */ baci::SmartPropertyPointer m_virtual_positions_ptr; + + /** + * Pointer to the virtual_offsets property. + */ baci::SmartPropertyPointer m_virtual_offsets_ptr; + + /** + * Pointer to the virtual_user_offsets property. + */ baci::SmartPropertyPointer m_virtual_user_offsets_ptr; + + /** + * Pointer to the virtual_system_offsets property. + */ baci::SmartPropertyPointer m_virtual_system_offsets_ptr; - baci::SmartPropertyPointer > m_in_use_ptr; + + /** + * Pointer to the in_use property. + */ + baci::SmartPropertyPointer> m_in_use_ptr; + + /** + * Pointer to the current_setup property. + */ baci::SmartPropertyPointer m_current_setup_ptr; - std::vector getPropertiesTable(const std::string& properties_name); - void checkErrors(); + /** + * Table containing the coefficients for the positions calculations. + */ + SRTMinorServoLookupTable m_current_lookup_table; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; +protected: + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; }; +/** + * MACRO definition of child classes methods. + * This simplifies the declaration since these methods' implementations are the same for both SRTGenericMinorServo and SRTProgramTrackMinorServo classes. + * This was necessary since these are pure virtual methods in POA_MinorServo::SRTGenericMinorServo and POA_MinorServo::SRTProgramTrackMinorServo, + * and even if they are inherited from the SRTBaseMinorServo class they are not seen by the compiler and they must be declared inside the respective classes. + * Take a look to the SRTBaseMinorServoImpl class for more information for each of these methods. + */ +#define METHODS_DECLARATION \ + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }\ + void stop() { SRTBaseMinorServoImpl::stop(); }\ + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }\ + ACS::doubleSeq* calcCoordinates(CORBA::Double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }\ + ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }\ + void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }\ + void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }\ + ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }\ + void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }\ + void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }\ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { SRTBaseMinorServoImpl::getAxesInfo(axes_names_out, axes_units_out); }\ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time) { return SRTBaseMinorServoImpl::getAxesPositions(acs_time); }\ + long getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest) { return SRTBaseMinorServoImpl::getTravelTime(start, dest); }\ + void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) { SRTBaseMinorServoImpl::getAxesRanges(min_ranges_out, max_ranges_out); } + +/** + * MACRO definition of child classes properties methods. + * This simplifies the declaration since these properties' methods implementations are the same for both SRTGenericMinorServo and SRTProgramTrackMinorServo classes. + * This was necessary since these are pure virtual methods in POA_MinorServo::SRTGenericMinorServo and POA_MinorServo::SRTProgramTrackMinorServo, + * and even if they are inherited from the SRTBaseMinorServo class they are not seen by the compiler and they must be declared inside the respective classes. + * Take a look to the SRTBaseMinorServoImpl class for more information for each of these properties methods. + */ +#define PROPERTIES_DECLARATION \ + virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }\ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }\ + virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }\ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }\ + virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }\ + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }\ + virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }\ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions() { return SRTBaseMinorServoImpl::plain_virtual_positions(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }\ + virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }\ + virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); } +/** + * This class implements the SRTGenericMinorServoImpl CORBA interface for a generic SRTMinorServo component. + * It inherits from the SRTBaseMinorServoImpl class. + * A SRTGenericMinorServo component does not need to implement any tracking feature. + */ class SRTGenericMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTGenericMinorServo { public: - SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + /** + * Constructor + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + */ + SRTGenericMinorServoImpl(const ACE_CString &component_name, maci::ContainerServices *container_services); + + /** + * Destructor. + */ ~SRTGenericMinorServoImpl(); - void status() { SRTBaseMinorServoImpl::status(); }; - void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; - void stop() { SRTBaseMinorServoImpl::stop(); }; - void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; - void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; - void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); }; - virtual ACS::doubleSeq* calcCoordinates(double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }; - virtual ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }; - virtual void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }; - virtual void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }; - virtual ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }; - virtual void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }; - virtual void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }; - virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) { SRTBaseMinorServoImpl::getAxesInfo(axes_names, axes_units); }; - - virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; - virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; - virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; - virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; - virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }; - virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; - virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }; - virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; - virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }; - virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }; - virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }; - virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); }; + /** + * Status method definition. It simply calls and returns the SRTBaseMinorServoImpl method. + */ + bool status() { return SRTBaseMinorServoImpl::status(); } + + /** + * Setup method definition. It simply calls the SRTBaseMinorServoImpl method. + */ + void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); } + + /** + * Declaration of all the other inherited methods. + */ + METHODS_DECLARATION; + + /** + * Declaration of all the other inherited properties methods. + */ + PROPERTIES_DECLARATION; }; +/** + * This class implements the SRTProgramTrackMinorServoImpl CORBA interface for a tracking-capable SRTMinorServo component. + * It inherits from the SRTBaseMinorServoImpl class. + * A SRTProgramTrackMinorServo component is capable of commanding a trajectory to track to its related minor servo system. + */ class SRTProgramTrackMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTProgramTrackMinorServo { public: - SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices); + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTProgramTrackMinorServoImpl(const ACE_CString &component_name, maci::ContainerServices *container_services); + + /** + * Destructor. + */ ~SRTProgramTrackMinorServoImpl(); - void status() { SRTBaseMinorServoImpl::status(); }; - void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }; - void stop() { SRTBaseMinorServoImpl::stop(); }; - void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }; - void offset(const ACS::doubleSeq& offsets) { SRTBaseMinorServoImpl::offset(offsets); }; - void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); }; - virtual ACS::doubleSeq* calcCoordinates(double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }; - virtual ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }; - virtual void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }; - virtual void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }; - virtual ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }; - virtual void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }; - virtual void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }; - virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) { SRTBaseMinorServoImpl::getAxesInfo(axes_names, axes_units); }; - - void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, CORBA::Double start_time, const ACS::doubleSeq& coordinates); - - virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }; - virtual MinorServo::ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }; - virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }; - virtual MinorServo::ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }; - virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }; - virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }; - virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }; - virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }; - virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }; - virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }; - virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }; - virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }; - virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); }; + /** + * Overloaded initialize method. It calls the SRTBaseMinorServoImpl initialize method and performs some other initialization routines. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Overloaded status method. It calls the SRTBaseMinorServoImpl status method and performs some other routines. + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware. + */ + bool status(); + + /** + * Overloaded setup method. It calls the SRTBaseMinorServoImpl status method and performs some other routines. + * @param configuration_name the configuration the servo system should assume. + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. + */ + void setup(const char* configuration_name = ""); + + /** + * Declaration of all the other inherited methods. + */ + METHODS_DECLARATION; + + /** + * Loads a set of tracking coordinates to the minor servo system. + * @param trajectory_id the ID of the trajectory. This defaults to UNIX Epoch * 1000 (milliseconds precision) of the starting time of the trajectory. + * @param point_id the ID of the point inside the current trajectory. + * @param point_time the timestamp associated with the given set of tracking coordinates. + * @coordinates the given set of tracking coordinates. + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted. + */ + void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& coordinates); + + /** + * Declaration of all the other inherited properties methods. + */ + PROPERTIES_DECLARATION; + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to read-only boolean property tracking. + */ + virtual Management::ROTBoolean_ptr tracking(); + + /** + * Returns a reference to the trajectory_id property implementation of the IDL interface. + * @return pointer to read-only long property trajectory_id. + */ + virtual ACS::ROlong_ptr trajectory_id(); + + /** + * Returns a reference to the total_trajectory_points property implementation of the IDL interface. + * @return pointer to read-only long property total_trajectory_points. + */ + virtual ACS::ROlong_ptr total_trajectory_points(); + + /** + * Returns a reference to the remaining_trajectory_points property implementation of the IDL interface. + * @return pointer to read-only long property remaining_trajectory_points. + */ + virtual ACS::ROlong_ptr remaining_trajectory_points(); + +private: + /** + * Queue of positions to be assumed by the servo system when tracking a trajectory. + */ + SRTMinorServoPositionsQueue m_tracking_queue; + + /** + * Tracking delta values for all minor servo system virtual axes. + */ + const std::vector m_tracking_delta; + + /** + * Indicates if the servo system is tracking or not. It is tracking when the position error is lower than the tracking delta for all the virtual axes. + */ + std::atomic m_tracking; + + /** + * Current trajectory ID. + */ + std::atomic m_trajectory_id; + + /** + * Total trajectory points of the current trajectory. + */ + std::atomic m_total_trajectory_points; + + /** + * Remaining trajectory points of the current trajectory. + */ + std::atomic m_remaining_trajectory_points; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer> m_tracking_ptr; + + /** + * Pointer to the trajectory_id property. + */ + baci::SmartPropertyPointer m_trajectory_id_ptr; + + /** + * Pointer to the total_trajectory_points property. + */ + baci::SmartPropertyPointer m_total_trajectory_points_ptr; + + /** + * Pointer to the remaining_trajectory_points property. + */ + baci::SmartPropertyPointer m_remaining_trajectory_points_ptr; }; #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h index 2add0a420..ea428d36b 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -1,49 +1,45 @@ #ifndef _SRTMINORSERVOPARKTHREAD_H_ #define _SRTMINORSERVOPARKTHREAD_H_ -/*************************************************************************************/ -/* OAC Osservatorio Astronomico di Cagliari */ -/* $Id: SRTMinorServoParkThread.h */ -/* */ -/* This code is under GNU General Public Licence (GPL). */ -/* */ -/* Who When What */ -/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ -/*************************************************************************************/ +/** + * SRTMinorServoParkThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ -#include "Common.h" -#include +#include "SRTMinorServoCommon.h" #include #include #include "SRTMinorServoBossCore.h" +// TODO: fine-tune this with the real hardware. The correct procedure can easily exceed this timeout, it should be increased accordingly. #define PARK_TIMEOUT 60 class SRTMinorServoBossCore; /** - * This class implements a parking thread. This thread is in charge of checking the status of the minor servos parking procedure -*/ + * This class implements a parking thread. This thread is in charge of checking the status of the minor servos parking procedure. + */ class SRTMinorServoParkThread : public ACS::Thread { public: /** - * Constructor(). + * Constructor. * @param name thread name - * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. - * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + * @param core a reference to the SRTMinorServoBossCore object. + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. */ - SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); /** * Destructor. - */ + */ ~SRTMinorServoParkThread(); - /** + /** * This method is executed once when the thread starts. - */ + */ virtual void onStart(); /** @@ -51,17 +47,31 @@ public: */ virtual void onStop(); - /** - * This method overrides the thread implementation class. - * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ virtual void runLoop(); + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoParkThread"; + private: - std::string m_thread_name; - SRTMinorServoBossCore* m_core; + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + /** + * The current status of the finite-state machine. + */ unsigned int m_status; + + /** + * The starting time of the park procedure. Used to check if we ran out of time. + */ double m_start_time; }; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h new file mode 100644 index 000000000..0a00a84b0 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h @@ -0,0 +1,96 @@ +#ifndef _SRTMINORSERVOSCANTHREAD_H_ +#define _SRTMINORSERVOSCANTHREAD_H_ + +/** + * SRTMinorServoScanThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SRTMinorServoCommon.h" +#include +#include +#include "SRTMinorServoBossCore.h" +#include "SRTMinorServoContainers.h" + + +class SRTMinorServoBossCore; + + +/** + * This class implements a scan thread. This thread is in charge of positioning the minor servos during a scan operation. + */ +class SRTMinorServoScanThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoScanThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoScanThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoScanThread"; + +private: + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current trajectory ID. + */ + unsigned int m_trajectory_id; + + /** + * The current trajectory point ID. + */ + unsigned int m_point_id; + + /** + * The current trajectory point time. + */ + ACS::Time m_point_time; + + /** + * Boolean which indicates if the scan thread exited with an error or not. + */ + bool m_error; + + /** + * The queue of offsets to be added to the original tracking coordinates. + */ + MinorServo::SRTMinorServoPositionsQueue m_scan_offsets; + + /** + * The coordinates to which the minor servo involved in the scan was positioned before starting the scan itself. + */ + ACS::doubleSeq m_starting_coordinates; +}; + +#endif /*_SRTMINORSERVOSCANTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h index 476bdace8..3413fc565 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -1,49 +1,44 @@ #ifndef _SRTMINORSERVOSETUPTHREAD_H_ #define _SRTMINORSERVOSETUPTHREAD_H_ -/*************************************************************************************/ -/* OAC Osservatorio Astronomico di Cagliari */ -/* $Id: SRTMinorServoSetupThread.h */ -/* */ -/* This code is under GNU General Public Licence (GPL). */ -/* */ -/* Who When What */ -/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ -/*************************************************************************************/ - -#include "Common.h" -#include +/** + * SRTMinorServoSetupThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SRTMinorServoCommon.h" #include #include #include "SRTMinorServoBossCore.h" +// TODO: fine-tune this with the real hardware. The correct procedure can easily exceed this timeout, it should be increased accordingly. #define SETUP_TIMEOUT 60 class SRTMinorServoBossCore; /** - * This class implements a setup thread. This thread is in charge of checking the status of the minor servos setup procedure -*/ + * This class implements a setup thread. This thread is in charge of checking the status of the minor servos setup procedure. + */ class SRTMinorServoSetupThread : public ACS::Thread { public: /** - * Constructor(). + * Constructor. * @param name thread name - * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. - * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. - */ - SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); /** * Destructor. - */ + */ ~SRTMinorServoSetupThread(); - /** + /** * This method is executed once when the thread starts. - */ + */ virtual void onStart(); /** @@ -51,19 +46,41 @@ public: */ virtual void onStop(); - /** - * This method overrides the thread implementation class. - * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ virtual void runLoop(); + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoSetupThread"; + private: - std::string m_thread_name; - SRTMinorServoBossCore* m_core; + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + /** + * The current status of the finite-state machine. + */ unsigned int m_status; + + /** + * The starting time of the park procedure. Used to check if we ran out of time. + */ double m_start_time; + + /** + * The requested Leonardo minor servo focal configuration. + */ std::string m_LDO_configuration; + + /** + * The gregorian cover position to be reached for the requested focal configuration. + */ MinorServo::SRTMinorServoGregorianCoverStatus m_gregorian_cover_position; }; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h deleted file mode 100644 index a25366e05..000000000 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSocket.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef __SRTMINORSERVOSOCKET_H__ -#define __SRTMINORSERVOSOCKET_H__ - -/** - * SRTMinorServoSocket.h - * 2023/02/23 - * Giuseppe Carboni (giuseppe.carboni@inaf.it) - */ - -#include "Common.h" -#include -#include -#include -#include -#include -#include "SRTMinorServoCommandLibrary.h" - - -#define TIMEOUT 0.1 -#define CONFIG_DOMAIN "alma/" -#define CONFIG_DIRNAME "/MINORSERVO/Socket" - - -using namespace IRA; - -class SRTMinorServoSocket: public IRA::CSocket -{ -// Declare the SRTMinorServoSocketTest class as friend in order for it to have access to destroyInstance for testing purposes -friend class SRTMinorServoSocketTest; -friend class SRPProgramTrackTest; -friend class DerotatorProgramTrackTest; -friend class CombinedProgramTrackTest; -friend class ReadStatusOnlyTest; - -public: - /** - * Calls the constructor and returns the singleton socket instance - * @param ip_address the IP address to which the socket will connect - * @param port the port to which the socket will connect - * @param timeout the timeout, in seconds, for the communication to be considered failed - * @return the singleton socket instance, connected to the given IP address and port, by reference - * @throw ComponentErrors::SocketErrorExImpl when the user calls this method a second time with different IP address and port arguments - */ - static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=TIMEOUT); - - /** - * Returns the previously generated singleton socket instance - * @return the singleton socket instance, by reference - * @throw ComponentErrors::SocketErrorExImpl when the user calls this method when the instance has not been generated yet - */ - static SRTMinorServoSocket& getInstance(); - - /** - * Sends a command on the socket and returns the received answer, if any - * @param command the command to be sent over the socket - * @return the received answer to the given command - */ - SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); - - /** - * Copy constructor operator disabled by default - */ - SRTMinorServoSocket(SRTMinorServoSocket const&) = delete; - - /** - * Copy assignment operator disabled by default - */ - void operator=(SRTMinorServoSocket const&) = delete; - -protected: - /* - * Force the destruction of the singleton socket object. Only used in tests - */ - static void destroyInstance(); - -private: - /* - * Constructor method. Generates the singleton socket instance - * @param ip_address the IP address to which the socket will connect - * @param port the port to which the socket will connect - * @param timeout the timeout, in seconds, for the communication to be considered failed - */ - SRTMinorServoSocket(std::string ip_address, int port, double timeout); - - /* - * Destructor method. Closes the socket upon destruction - */ - ~SRTMinorServoSocket(); - - /* - * Instance of the socket. By default it gets initialized to a null pointer - */ - inline static SRTMinorServoSocket* m_instance = nullptr; - - /* - * IP address and port of the socket. Being object members their values only exist when a singleton socket object is created correctly - */ - std::string m_address; - int m_port; - - /* - * Timeout for communication operations - */ - double m_timeout; - - /* - * Mutex object used to syncronize communications and prevent collisions between multiple threads - */ - std::mutex m_mutex; - - /* - * Library mutex, used only to synchronize the getInstance methods - */ - static std::mutex c_mutex; - - /* - * Socket status enumerator - */ - enum socket_status { READY, NOTRDY, BROKEN, TOUT, BUSY } m_socket_status; - - /* - * Socket error variable. This stores an error condition in case it arises - */ - IRA::CError m_error; -}; - - -class SRTMinorServoSocketConfiguration -{ -public: - static SRTMinorServoSocketConfiguration& getInstance(maci::ContainerServices* containerServices); - - SRTMinorServoSocketConfiguration(SRTMinorServoSocketConfiguration const&) = delete; - void operator=(SRTMinorServoSocketConfiguration const&) = delete; - - std::string m_ip_address; - int m_port; - double m_timeout; - -private: - SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices); - ~SRTMinorServoSocketConfiguration(); - - inline static SRTMinorServoSocketConfiguration* m_instance = nullptr; -}; - -#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h index 546d9e603..b5e55b96a 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -1,48 +1,43 @@ #ifndef _SRTMINORSERVOSTATUSTHREAD_H_ #define _SRTMINORSERVOSTATUSTHREAD_H_ -/*************************************************************************************/ -/* OAC Osservatorio Astronomico di Cagliari */ -/* $Id: SRTMinorServoStatusThread.h */ -/* */ -/* This code is under GNU General Public Licence (GPL). */ -/* */ -/* Who When What */ -/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 14/09/2023 Creation */ -/*************************************************************************************/ +/** + * SRTMinorServoStatusThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ -#include "Common.h" -#include +#include "SRTMinorServoCommon.h" #include #include #include "SRTMinorServoSocket.h" #include "SRTMinorServoBossCore.h" +#include class SRTMinorServoBossCore; /** - * This class implements a status thread. This thread is in charge of checking the status of -*/ + * This class implements a status thread. This thread is in charge of updating the status of the minor servo components. + */ class SRTMinorServoStatusThread : public ACS::Thread { public: /** - * Constructor(). + * Constructor. * @param name thread name - * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. - * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. - */ - SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); /** * Destructor. - */ + */ ~SRTMinorServoStatusThread(); - /** + /** * This method is executed once when the thread starts. - */ + */ virtual void onStart(); /** @@ -50,16 +45,38 @@ public: */ virtual void onStop(); - /** - * This method overrides the thread implementation class. - * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ virtual void runLoop(); + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoStatusThread"; + private: - std::string m_thread_name; - SRTMinorServoBossCore* m_core; - double m_sleep_time; + /** + * Method that publishes the status onto the ACS notification channel. + */ + void publish(); + + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The sleeping time of the thread. + * The thread should be cycling at a constant rate, therefore the inner sleeping time is always updated taking into account this and the thread execution time. + */ + ACS::TimeInterval m_sleep_time; + + /** + * The ACS notification channel simple supplier object. + */ + nc::SimpleSupplier* m_notification_channel; }; #endif /*_SRTMINORSERVOSTATUSTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h index 02a79f468..9684e0153 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h @@ -1,56 +1,42 @@ #ifndef _SRTMINORSERVOTRACKINGTHREAD_H_ #define _SRTMINORSERVOTRACKINGTHREAD_H_ -/*************************************************************************************/ -/* OAC Osservatorio Astronomico di Cagliari */ -/* $Id: SRTMinorServoTrackingThread.h */ -/* */ -/* This code is under GNU General Public Licence (GPL). */ -/* */ -/* Who When What */ -/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 30/12/2023 Creation */ -/*************************************************************************************/ - -#include "Common.h" -#include +/** + * SRTMinorServoTrackingThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SRTMinorServoCommon.h" #include #include #include "SRTMinorServoBossCore.h" -#include -#include -#include - -_IRA_LOGFILTER_IMPORT; - -#define TRACKING_FUTURE_TIME 2 //2 seconds -#define TRACKING_TIMEGAP 0.2 //200 milliseconds class SRTMinorServoBossCore; /** * This class implements a tracking thread. This thread is in charge of positioning the minor servos in time. -*/ + */ class SRTMinorServoTrackingThread : public ACS::Thread { public: /** - * Constructor(). + * Constructor. * @param name thread name - * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. - * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. - */ - SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); /** * Destructor. - */ + */ ~SRTMinorServoTrackingThread(); - /** + /** * This method is executed once when the thread starts. - */ + */ virtual void onStart(); /** @@ -58,21 +44,42 @@ public: */ virtual void onStop(); - /** - * This method overrides the thread implementation class. - * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. */ virtual void runLoop(); + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoTrackingThread"; + private: - double getElevation(double time); - void resetTracking(); - - std::string m_thread_name; - SRTMinorServoBossCore* m_core; - Antenna::AntennaBoss_var m_antennaBoss; - unsigned int m_point_id, m_trajectory_id; - double m_point_time; + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current trajectory ID. + */ + unsigned int m_trajectory_id; + + /** + * The current trajectory point ID. + */ + unsigned int m_point_id; + + /** + * The current trajectory point time. + */ + ACS::Time m_point_time; + + /** + * Boolean which indicates if the tracking thread exited with an error or not. + */ + bool m_error; }; #endif /*_SRTMINORSERVOTRACKINGTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h index 1421fd156..0dc0dd252 100644 --- a/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h +++ b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h @@ -1,12 +1,13 @@ #ifndef __SUPPRESSWARNINGS_H__ #define __SUPPRESSWARNINGS_H__ +/** + * SuppressWarnings.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + #include C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wsequence-point") C11_IGNORE_WARNING("-Wdeprecated-declarations") -C11_IGNORE_WARNING("-Wmisleading-indentation") -C11_IGNORE_WARNING("-Wcatch-value=") -C11_IGNORE_WARNING_POP -#include - #endif diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index d32729457..c11de1645 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -9,38 +9,36 @@ EXECUTABLES = EXECUTABLES_L = +PY_SCRIPTS = #_cover + # On-Line Database Files # ---------------------- -CDB_SCHEMAS = SRTMinorServoBoss SRTMinorServo SRTMinorServoSocket SRTMinorServoProperties SRTMinorServoLookupTable +CDB_SCHEMAS = SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoProperties SRTMinorServoLookupTable # ---------------------------- # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoSocket SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl - -SRTMinorServoSocket_OBJECTS = SRTMinorServoSocket -SRTMinorServoSocket_LIBS = IRALibrary ComponentErrors SRTMinorServoCommandLibrary -SRTMinorServoSocket_CFLAGS = -std=c++17 - -SRTMinorServoBossImpl_OBJECTS = SRTMinorServoStatusThread SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoBossCore SRTMinorServoBossImpl -SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocket ParserErrors DiscosVersion -SRTMinorServoBossImpl_CFLAGS = -std=c++17 -SRTMinorServoBossCore_CFLAGS = -std=c++17 -SRTMinorServoStatusThread_CFLAGS = -std=c++17 -SRTMinorServoSetupThread_CFLAGS = -std=c++17 -SRTMinorServoParkThread_CFLAGS = -std=c++17 -SRTMinorServoTrackingThread_CFLAGS = -std=c++17 -SRTMinorServoTrackingThread_LIBS = IRALibrary +LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl -SRTGenericMinorServoImpl_OBJECTS = SRTGenericMinorServoImpl SRTBaseMinorServoImpl -SRTGenericMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion -SRTGenericMinorServoImpl_CFLAGS = -std=c++17 +USER_CFLAGS = -SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl -SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocket DiscosVersion -SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 +SRTMinorServoBossImpl_OBJECTS = SRTMinorServoBossCore SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoScanThread SRTMinorServoBossImpl SRTMinorServoStatusThread +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc +SRTMinorServoBossImpl_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoBossCore_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoStatusThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoSetupThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoParkThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoTrackingThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoScanThread_CFLAGS = -std=c++17 -fconcepts -SRTBaseMinorServoImpl_CFLAGS = -std=c++17 +SRTBaseMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTGenericMinorServoImpl_OBJECTS = SRTGenericMinorServoImpl SRTBaseMinorServoImpl +SRTGenericMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion +SRTGenericMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl +SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion +SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 -fconcepts # ---------------------------------------------------------------------- diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 50ac89407..81c92b42a 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -1,9 +1,28 @@ #include "SRTMinorServoImpl.h" -using namespace maci; - -SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : - CharacteristicComponentImpl(componentName, containerServices), +using namespace MinorServo; + +SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, maci::ContainerServices* container_services): + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_servo_name(std::string(strchr(component_name.c_str(), '/') + 1)), + m_status(), + m_virtual_axes(getCDBValue(container_services, "virtual_axes")), + m_physical_axes(getCDBValue(container_services, "physical_axes")), + m_virtual_axes_names(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_positions")), + m_virtual_axes_units(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), + m_min(SRTBaseMinorServoImpl::getMotionConstant(*this, "min_range")), + m_max(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_range")), + m_m_s(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_speed")), + m_a(SRTBaseMinorServoImpl::getMotionConstant(*this, "acceleration")), + m_r_t(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_times")), + m_r_d(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_distances")), + m_c_s(m_virtual_axes, 0.0), + m_user_offsets(m_virtual_axes, 0.0), + m_system_offsets(m_virtual_axes, 0.0), + m_in_use(Management::MNG_FALSE), + m_current_setup(""), m_enabled_ptr(this), m_drive_cabinet_status_ptr(this), m_block_ptr(this), @@ -11,16 +30,17 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString &componentName, m m_physical_axes_enabled_ptr(this), m_physical_positions_ptr(this), m_virtual_axes_ptr(this), + m_plain_virtual_positions_ptr(this), m_virtual_positions_ptr(this), m_virtual_offsets_ptr(this), m_virtual_user_offsets_ptr(this), m_virtual_system_offsets_ptr(this), m_in_use_ptr(this), - m_current_setup_ptr(this) + m_current_setup_ptr(this), + m_current_lookup_table(), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) { - std::string component_name(componentName.c_str()); - m_servo_name = component_name.substr(component_name.rfind('/') + 1); - AUTO_TRACE(m_servo_name + "::SRTBaseMinorServoImpl()"); } @@ -33,136 +53,55 @@ void SRTBaseMinorServoImpl::initialize() { AUTO_TRACE(m_servo_name + "::initialize()"); - unsigned int tempvar; - if(!IRA::CIRATools::getDBValue(getContainerServices(), "physical_axes", tempvar)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setFieldName("physical_axes"); - throw impl; - } - m_physical_axes = tempvar; - if(!IRA::CIRATools::getDBValue(getContainerServices(), "virtual_axes", tempvar)) + try { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setFieldName("virtual_axes"); - throw impl; - } - m_virtual_axes = tempvar; - - // Initialize offsets - m_user_offsets = std::vector(m_virtual_axes, 0.0); - m_system_offsets = std::vector(m_virtual_axes, 0.0); - - m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(getContainerServices()); - m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); - - m_status = SRTMinorServoAnswerMap(); - m_socket->sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); - m_status_securearea = new IRA::CSecureArea(&m_status); - + m_enabled_ptr = new ROEnumImpl((m_component_name + ":enabled").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "enabled", "ENABLED", m_status), true); + m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "drive_cabinet_status", "STATUS", m_status), true); + m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "block", "BLOCK", m_status), true); + m_operative_mode_ptr = new ROEnumImpl((m_component_name + ":operative_mode").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "operative_mode", "OPERATIVE_MODE", m_status), true); + m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "physical_axes_enabled", SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_axes_enabled"), m_status), true); + m_physical_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":physical_positions").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "physical_positions", SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_positions"), m_status), true); + m_virtual_axes_ptr = new baci::ROlong((m_component_name + ":virtual_axes").c_str(), getComponent(), + new MSGenericDevIO(m_virtual_axes), true); + m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "virtual_positions", m_virtual_axes_names, m_status), true); + std::vector virtual_offsets = SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets"); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), + new MSVirtualPositionsDevIO(m_servo_name, m_virtual_axes_names, virtual_offsets, m_status), true); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), + new MSAnswerMapDevIO(m_servo_name, "virtual_offsets", virtual_offsets, m_status), true); + m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_user_offsets").c_str(), getComponent(), + new MSGenericDevIO>(m_user_offsets), true); + m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_system_offsets").c_str(), getComponent(), + new MSGenericDevIO>(m_system_offsets), true); + m_in_use_ptr = new ROEnumImpl((m_component_name + ":in_use").c_str(), getComponent(), + new MSGenericDevIO>(m_in_use), true); + m_current_setup_ptr = new baci::ROstring((m_component_name + ":current_setup").c_str(), getComponent(), + new MSGenericDevIO(m_current_setup), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + // Try to read the current status of the servo try { - std::string component_name = getContainerServices()->getName().c_str(); - - SRTMinorServoDevIOInfo dev_io_info; - dev_io_info.prefix = m_servo_name + "_"; - dev_io_info.secure_area = m_status_securearea; - - dev_io_info.property_name = "enabled"; - dev_io_info.property_fields = std::vector{ "ENABLED" }; - m_enabled_ptr = new ROEnumImpl((component_name + ":enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "drive_cabinet_status"; - dev_io_info.property_fields = std::vector{ "STATUS" }; - m_drive_cabinet_status_ptr = new ROEnumImpl((component_name + ":drive_cabinet_status").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "block"; - dev_io_info.property_fields = std::vector{ "BLOCK" }; - m_block_ptr = new ROEnumImpl((component_name + ":block").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "operative_mode"; - dev_io_info.property_fields = std::vector{ "OPERATIVE_MODE" }; - m_operative_mode_ptr = new ROEnumImpl((component_name + ":operative_mode").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "physical_axes_enabled"; - dev_io_info.property_fields = getPropertiesTable("physical_axes_enabled"); - if(dev_io_info.property_fields.size() != m_physical_axes) - { - // Wrong length for physical_axes_enabled property - _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setValueName(dev_io_info.property_name.c_str()); - impl.setValueLimit(m_physical_axes); - throw impl; - } - m_physical_axes_enabled_ptr = new baci::RObooleanSeq((component_name + ":physical_axes_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "physical_positions"; - dev_io_info.property_fields = getPropertiesTable("physical_positions"); - if(dev_io_info.property_fields.size() != m_physical_axes) - { - // Wrong length for physical_positions property - _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setValueName(dev_io_info.property_name.c_str()); - impl.setValueLimit(m_physical_axes); - throw impl; - } - m_physical_positions_ptr = new baci::ROdoubleSeq((component_name + ":physical_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - m_virtual_axes_ptr = new baci::ROlong((component_name + ":virtual_axes").c_str(), getComponent(), new MSGenericDevIO >(&m_virtual_axes), true); - - m_virtual_axes_names = getPropertiesTable("virtual_positions"); - for(const std::string& axis_name : m_virtual_axes_names) - { - if(axis_name.at(0) == 'T') - { - m_virtual_axes_units.push_back("mm"); - } - else if(axis_name.at(0) == 'R') - { - m_virtual_axes_units.push_back("degrees"); - } - else - { - m_virtual_axes_units.push_back("unknown"); - } - } - - dev_io_info.property_name = "virtual_positions"; - dev_io_info.property_fields = m_virtual_axes_names; - if(m_virtual_axes_names.size() != m_virtual_axes) - { - // Wrong length for virtual_axes property - _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setValueName(dev_io_info.property_name.c_str()); - impl.setValueLimit(m_virtual_axes); - throw impl; - } - m_virtual_positions_ptr = new baci::ROdoubleSeq((component_name + ":virtual_positions").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "virtual_offsets"; - dev_io_info.property_fields = getPropertiesTable("virtual_offsets"); - if(dev_io_info.property_fields.size() != m_virtual_axes) - { - // Wrong length for virtual_offsets property - _EXCPT(ComponentErrors::ValueOutofRangeExImpl, impl, (m_servo_name + "::initialize()").c_str()); - impl.setValueName(dev_io_info.property_name.c_str()); - impl.setValueLimit(m_virtual_axes); - throw impl; - } - m_virtual_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_offsets").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_user_offsets").c_str(), getComponent(), new MSGenericDevIO >(&m_user_offsets), true); - m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((component_name + ":virtual_system_offsets").c_str(), getComponent(), new MSGenericDevIO >(&m_system_offsets), true); - - m_in_use_ptr = new ROEnumImpl((component_name + ":in_use").c_str(), getComponent(), new MSGenericDevIO >(&m_in_use), true); - m_current_setup_ptr = new baci::ROstring((component_name + ":current_setup").c_str(), getComponent(), new MSGenericDevIO(&m_current_setup), true); + status(); } - catch(std::bad_alloc& ex) + catch(...) { - _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl, std::string(m_servo_name + "::initialize()").c_str()); + // This block is necessary since the socket might not be connected yet. If the Leonardo system is not reachable the status(); call will fail, but we want to instantiate the component anyway + // A non connected socket will try to connect every time a new command is sent, therefore the status thread will establish the connection as soon as possible. } - - m_current_setup = ""; - m_in_use = Management::MNG_FALSE; } void SRTBaseMinorServoImpl::execute() @@ -180,89 +119,218 @@ void SRTBaseMinorServoImpl::aboutToAbort() AUTO_TRACE(m_servo_name + "::aboutToAbort()"); } -void SRTBaseMinorServoImpl::status() +/////////////////// PUBLIC methods +bool SRTBaseMinorServoImpl::status() { AUTO_TRACE(m_servo_name + "::status()"); - IRA::CSecAreaResourceWrapper area = m_status_securearea->Get(); - m_socket->sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), *area); + // We don't check if the socket is connected here since a status command will try to reconnect it automatically + try + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); + + // We need to call this here since we might just have established the connection, therefore we might not know how the Leonardo offsets are split between user and system + // This might eventually throw MinorServoErrorsEx + resetOffsets(); + + ACSErr::Completion_var comp; + ACS::doubleSeq current_point = *virtual_positions()->get_sync(comp.out()); + + // Calculate the current speed of the axes + try + { + std::pair> previous_point = m_positions_queue.get(m_status.getTimestamp()); + for(size_t i = 0; i < m_virtual_axes; i++) + { + m_c_s[i] = (current_point[i] - previous_point.second[i]) * ((double(m_status.getTimestamp() - previous_point.first)) / 10000000); + } + } + catch(...) + { + // Empty queue, first reading, skip the speed calculation + } + + m_positions_queue.put(m_status.getTimestamp(), current_point); + } + catch(...) + { + return false; + } + + return true; } void SRTBaseMinorServoImpl::stow(CORBA::Long stow_position) { AUTO_TRACE(m_servo_name + "::stow()"); - checkErrors(); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::stow(m_servo_name, (unsigned int)stow_position)); + checkLineStatus(); - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow(m_servo_name, (unsigned int)stow_position)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::stow()").c_str()); - impl.setReason("Received NAK in response to a STOW command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stow()").c_str()); + ex.setReason("Received NAK in response to a STOW command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } void SRTBaseMinorServoImpl::stop() { AUTO_TRACE(m_servo_name + "::stop()"); - checkErrors(); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::stop(m_servo_name)); + checkLineStatus(); - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stop(m_servo_name)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::stop()").c_str()); - impl.setReason("Received NAK in response to a STOP command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stop()").c_str()); + ex.setReason("Received NAK in response to a STOP command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) { AUTO_TRACE(m_servo_name + "::preset()"); - checkErrors(); + + checkLineStatus(); if(virtual_coordinates.length() != m_virtual_axes) { - _EXCPT(MinorServoErrors::PositioningErrorExImpl, impl, (m_servo_name + "::preset()").c_str()); - impl.addData("Reason", "Wrong number of values for this servo system!"); - throw impl; + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.addData("Reason", "Wrong number of values for this servo system."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - std::vector coords(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, coords)); + // Read the current servo offsets + ACSErr::Completion_var comp; + ACS::doubleSeq offsets = *virtual_offsets()->get_sync(comp.out()); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + if(coordinates[i] + offsets[i] < m_min[i] || coordinates[i] + offsets[i] > m_max[i]) + { + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.addData("Reason", "Resulting position out of range, check the offsets."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, coordinates)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::preset()").c_str()); - impl.setReason("Received NAK in response to a PRESET command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.setReason("Received NAK in response to a PRESET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } -void SRTBaseMinorServoImpl::offset(const ACS::doubleSeq& virtual_offsets) +void SRTBaseMinorServoImpl::setup(const char* configuration_name) { - AUTO_TRACE(m_servo_name + "::offset()"); - checkErrors(); + AUTO_TRACE(m_servo_name + "::setup()"); + m_in_use.store(Management::MNG_FALSE); + m_current_lookup_table.clear(); - if(virtual_offsets.length() != m_virtual_axes) + m_current_setup = ""; + std::string setup_name(configuration_name); + std::transform(setup_name.begin(), setup_name.end(), setup_name.begin(), ::toupper); + + if(setup_name.empty()) + { + return; + } + + IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "axis", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field axis", 0); + } + if(!table.addField(error, "coefficients", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field coefficients", 0); + } + if(!error.isNoError()) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::offset()").c_str()); - impl.addData("Reason", "Wrong number of values for this servo system!"); - throw impl; + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + std::string axis = std::string(table["axis"]->asString()); - std::vector offsets(virtual_offsets.get_buffer(), virtual_offsets.get_buffer() + virtual_offsets.length()); + std::vector coefficients; - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + std::string coefficient_str; + std::stringstream stream(std::string(table["coefficients"]->asString())); - if(std::get(answer["OUTPUT"]) != "GOOD") + while(std::getline(stream, coefficient_str, ',')) + { + coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + } + + m_current_lookup_table[axis] = coefficients; + } + table.closeTable(); + + if(m_current_lookup_table.size() > 0) + { + m_current_setup = setup_name; + clearUserOffsets(); + clearSystemOffsets(); + m_in_use.store(Management::MNG_TRUE); + } +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) +{ + AUTO_TRACE(m_servo_name + "::calcCoordinates()"); + + if(m_in_use.load() == Management::MNG_TRUE) + { + ACS::doubleSeq_var coordinates = new ACS::doubleSeq; + coordinates->length(m_virtual_axes); + + for(size_t axis = 0; axis < m_virtual_axes; axis++) + { + std::vector coefficients = m_current_lookup_table.at(m_virtual_axes_names[axis]); + + double coordinate = 0; + + for(size_t index = 0; index < coefficients.size(); index++) + { + coordinate += coefficients[index] * pow(elevation, index); + } + + coordinates[axis] = coordinate; + } + + return coordinates._retn(); + } + else { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::offset()").c_str()); - impl.setReason("Received NAK in response to an OFFSET command!"); - throw impl; + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::calcCoordinates()").c_str()); + ex.setReason("Unable to calculate the coordinates since the servo system has not been configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } @@ -272,17 +340,15 @@ ACS::doubleSeq* SRTBaseMinorServoImpl::getUserOffsets() ACS::doubleSeq_var offsets = new ACS::doubleSeq; offsets->length(m_user_offsets.size()); - for(size_t i = 0; i < m_user_offsets.size(); i++) - { - offsets[i] = m_user_offsets[i]; - } + std::copy(m_user_offsets.begin(), m_user_offsets.end(), offsets->begin()); return offsets._retn(); } void SRTBaseMinorServoImpl::setUserOffset(const char* axis_name, CORBA::Double offset) { AUTO_TRACE(m_servo_name + "::setUserOffset()"); - checkErrors(); + + checkLineStatus(); std::string axis(axis_name); std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); @@ -292,51 +358,57 @@ void SRTBaseMinorServoImpl::setUserOffset(const char* axis_name, CORBA::Double o axis = "ROTATION"; } - unsigned int index = std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis) - m_virtual_axes_names.begin(); + unsigned int index = std::distance(m_virtual_axes_names.begin(), std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis)); - try + if(index == m_virtual_axes) { - m_user_offsets.at(index) = (double)offset; - } - catch(std::out_of_range const& ex) - { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::setUserOffset()").c_str()); - impl.addData("Reason", ("Unknown axis '" + axis + "'!").c_str()); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", ("Unknown axis '" + axis + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - // Update the offsets + // Calculate the new offsets std::vector offsets(m_virtual_axes, 0); std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + offsets[index] = m_system_offsets[index] + offset; - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + if(offsets[index] < m_min[index] || offsets[index] > m_max[index]) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", "Sum of user and system offsets out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::setUserOffset()").c_str()); - impl.setReason("Received NAK in response to an OFFSET command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } + + m_user_offsets[index] = offset; } void SRTBaseMinorServoImpl::clearUserOffsets() { AUTO_TRACE(m_servo_name + "::clearUserOffsets()"); - checkErrors(); + + checkLineStatus(); m_user_offsets = std::vector(m_virtual_axes, 0.0); - // Update the offsets std::vector offsets(m_virtual_axes, 0); std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); - - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::clearUserOffset()").c_str()); - impl.setReason("Received NAK in response to an OFFSET command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearUserOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } @@ -346,17 +418,15 @@ ACS::doubleSeq* SRTBaseMinorServoImpl::getSystemOffsets() ACS::doubleSeq_var offsets = new ACS::doubleSeq; offsets->length(m_system_offsets.size()); - for(size_t i = 0; i < m_system_offsets.size(); i++) - { - offsets[i] = m_system_offsets[i]; - } + std::copy(m_system_offsets.begin(), m_system_offsets.end(), offsets->begin()); return offsets._retn(); } void SRTBaseMinorServoImpl::setSystemOffset(const char* axis_name, CORBA::Double offset) { AUTO_TRACE(m_servo_name + "::setSystemOffset()"); - checkErrors(); + + checkLineStatus(); std::string axis(axis_name); std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); @@ -366,37 +436,45 @@ void SRTBaseMinorServoImpl::setSystemOffset(const char* axis_name, CORBA::Double axis = "ROTATION"; } - unsigned int index = std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis) - m_virtual_axes_names.begin(); + unsigned int index = std::distance(m_virtual_axes_names.begin(), std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis)); - try + if(index == m_virtual_axes) { - m_system_offsets.at(index) = (double)offset; - } - catch(std::out_of_range const& ex) - { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, (m_servo_name + "::setSystemOffset()").c_str()); - impl.addData("Reason", ("Unknown axis '" + axis + "'!").c_str()); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setSystemOffset()").c_str()); + ex.addData("Reason", ("Unknown axis '" + axis + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - // Update the offsets + // Calculate the new offsets std::vector offsets(m_virtual_axes, 0); std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + offsets[index] = m_user_offsets[index] + offset; - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); + if(offsets[index] < m_min[index] || offsets[index] > m_max[index]) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", "Sum of user and system offsets out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::setSystemOffset()").c_str()); - impl.setReason("Received NAK in response to an OFFSET command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setSystemOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } + + m_system_offsets[index] = offset; } void SRTBaseMinorServoImpl::clearSystemOffsets() { AUTO_TRACE(m_servo_name + "::clearSystemOffsets()"); - checkErrors(); + + checkLineStatus(); m_system_offsets = std::vector(m_virtual_axes, 0.0); @@ -404,143 +482,263 @@ void SRTBaseMinorServoImpl::clearSystemOffsets() std::vector offsets(m_virtual_axes, 0); std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)); - - if(std::get(answer["OUTPUT"]) != "GOOD") + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::clearSystemOffset()").c_str()); - impl.setReason("Received NAK in response to an OFFSET command!"); - throw impl; + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearSystemOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } -void SRTBaseMinorServoImpl::setup(const char* configuration_name) +void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { - AUTO_TRACE(m_servo_name + "::setup()"); - m_in_use = Management::MNG_FALSE; - m_current_lookup_table.clear(); + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesInfo()"); - m_current_setup = ""; - std::string setup_name(configuration_name); - std::transform(setup_name.begin(), setup_name.end(), setup_name.begin(), ::toupper); + ACS::stringSeq_var axes_names = new ACS::stringSeq; + ACS::stringSeq_var axes_units = new ACS::stringSeq; + axes_names->length(m_virtual_axes); + axes_units->length(m_virtual_axes); - if(setup_name.empty()) + for(size_t i = 0; i < m_virtual_axes; i++) { - return; + axes_names[i] = (m_servo_name + "_" + m_virtual_axes_names[i] == "ROTATION" ? "RZ" : m_virtual_axes_names[i]).c_str(); + axes_units[i] = m_virtual_axes_units[i].c_str(); } - IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); - IRA::CError error; - error.Reset(); + axes_names_out = axes_names._retn(); + axes_units_out = axes_units._retn(); +} - if(!table.addField(error, "axis", IRA::CDataField::STRING)) +ACS::doubleSeq* SRTBaseMinorServoImpl::getAxesPositions(ACS::Time acs_time) +{ + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesPositions()"); + + try { - error.setExtra("Error adding field axis", 0); + std::vector p = m_positions_queue.get(acs_time).second; + + ACS::doubleSeq_var positions = new ACS::doubleSeq; + positions->length(m_virtual_axes); + std::copy(p.begin(), p.end(), positions->begin()); + return positions._retn(); } - if(!table.addField(error, "coefficients", IRA::CDataField::STRING)) + catch(std::logic_error& le) { - error.setExtra("Error adding field coefficients", 0); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::getAxesPositions()").c_str()); + ex.setReason("Positions history is empty!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - if(!error.isNoError()) +} + +ACS::TimeInterval SRTBaseMinorServoImpl::getTravelTime(const ACS::doubleSeq& _s_p, const ACS::doubleSeq& d_p) +{ + AUTO_TRACE(m_servo_name + "::getTravelTime()"); + + std::vector c_s = m_c_s; // Current speed + + ACS::doubleSeq s_p(_s_p); + + // No starting coordinates, it means we have to start from the current position taking into account the current speed + if(_s_p.length() == 0) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, impl, error); - impl.setCode(error.getErrorCode()); - impl.setDescription((const char *)error.getDescription()); - throw impl; + ACSErr::Completion_var comp; + s_p = *virtual_positions()->get_sync(comp.out()); } - if(!table.openTable(error)) + else if(_s_p.length() != m_virtual_axes) { - _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, impl, error); - throw impl; + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "getTravelTime()").c_str()); + ex.setReason("Wrong number of axes for starting_position."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + if(d_p.length() != m_virtual_axes) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "getTravelTime()").c_str()); + ex.setReason("Wrong number of axes for destination_position."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - table.First(); - for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + // d = delta/distance + std::vector d(m_virtual_axes); + for(size_t i = 0; i < m_virtual_axes; i++) { - std::string axis = std::string(table["axis"]->asString()); + d[i] = d_p[i] - s_p[i]; - std::vector coefficients; + // If we sent a starting position, we are just checking the maximum time to get from the start to the desired position + // We take into account the worst case scenario for the speed, we assume we are moving away from the desired position at maximum speed for each axis + if(_s_p.length() != 0) + { + c_s[i] = m_m_s[i] * (d[i] < 0 ? 1 : (d[i] > 0 ? -1 : 0)); + } + } - std::string coefficient_str; - std::stringstream stream(std::string(table["coefficients"]->asString())); + double total_time = 0; - while(std::getline(stream, coefficient_str, ',')) + // Calculate the distance and time taken to get to the maximum speed towards the desired position + for(size_t i = 0; i < m_virtual_axes; i++) + { + double inversion_time = 0; + double inversion_distance = 0; + + // We are moving away from our desired position, this is the only case in which we need a deceleration ramp before even starting to move towards our destination + if(std::signbit(c_s[i]) != std::signbit(d[i]) && c_s[i] != 0) { - coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + inversion_time = std::abs(c_s[i]) / m_a[i]; + inversion_distance = std::abs(c_s[i]) * inversion_time + 0.5 * m_a[i] * std::pow(inversion_time, 2); + // In this case, we can calculate the next acceleration ramp using a starting speed of 0 + c_s = std::vector(c_s.size(), 0.0); } - m_current_lookup_table[axis] = coefficients; - } - table.closeTable(); + double accel_ramp_time = (m_m_s[i] - std::abs(c_s[i])) / m_a[i]; + double accel_ramp_distance = std::abs(c_s[i]) * accel_ramp_time + 0.5 * m_a[i] * std::pow(accel_ramp_time, 2); - if(m_current_lookup_table.size() > 0) - { - m_current_setup = setup_name; - clearUserOffsets(); - clearSystemOffsets(); - m_in_use = Management::MNG_TRUE; + // Total time = eventual inversion time + calculated acceleration ramp time + full deceleration time + linear movement time + // Linear movement time = linear movement distance / maximum speed + // Linear movement distance = distance + eventual inversion distance - acceleration ramp distance - full deceleration ramp distance + double t = inversion_time + accel_ramp_time + m_r_t[i] + (std::abs(d[i]) + inversion_distance - accel_ramp_distance - m_r_d[i]) / m_m_s[i]; + + total_time = std::max(total_time, t); + + // This does not take into account any dead time but: + // we're going to use this only for PROGRAMTRACK purposes and + // in PROGRAMTRACK mode the SRP servos move faster than the nominal max_speed + // i.e., IIRC, the max physical speed should be around 12mm/s instead of 4mm/s + // Therefore we might not need to add any guard time } + + return ACS::TimeInterval(total_time * 10000000); } -void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +void SRTBaseMinorServoImpl::getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) { - AUTO_TRACE("SRTBaseMinorServoImpl::getAxesInfo()"); - - ACS::stringSeq_var axes_names_var = new ACS::stringSeq; - ACS::stringSeq_var axes_units_var = new ACS::stringSeq; - axes_names_var->length(m_virtual_axes); - axes_units_var->length(m_virtual_axes); + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesRanges()"); + + ACS::doubleSeq_var min_ranges = new ACS::doubleSeq; + ACS::doubleSeq_var max_ranges = new ACS::doubleSeq; + min_ranges->length(m_virtual_axes); + max_ranges->length(m_virtual_axes); + std::copy(m_min.begin(), m_min.end(), min_ranges->begin()); + std::copy(m_max.begin(), m_max.end(), max_ranges->begin()); + min_ranges_out = min_ranges._retn(); + max_ranges_out = max_ranges._retn(); +} - for(size_t i = 0; i < m_virtual_axes; i++) +/////////////////// PROTECTED methods +void SRTBaseMinorServoImpl::checkLineStatus() +{ + if(!m_socket.isConnected()) { - axes_names_var[i] = m_virtual_axes_names[i].c_str(); - axes_units_var[i] = m_virtual_axes_units[i].c_str(); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "checkLineStatus()").c_str()); + ex.setReason("Socket not connected."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - axes_names = axes_names_var._retn(); - axes_units = axes_units_var._retn(); + ACSErr::Completion_var comp; + if(block()->get_sync(comp.out()) == Management::MNG_TRUE || drive_cabinet_status()->get_sync(comp.out()) == DRIVE_CABINET_ERROR) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); + ex.setReason("Servo system blocked or drive cabinet error."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } -ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) +std::vector SRTBaseMinorServoImpl::getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant) { - AUTO_TRACE(m_servo_name + "::calcCoordinates()"); + AUTO_STATIC_TRACE(object.m_servo_name + "::getMotionConstant()"); - if(m_in_use == Management::MNG_TRUE) - { - ACS::doubleSeq_var coordinates = new ACS::doubleSeq; - coordinates->length(m_virtual_axes); + std::vector values; - for(size_t axis = 0; axis < m_virtual_axes; axis++) + if(constant == "max_speed" || constant == "acceleration") + { + values = getCDBValue>(object.getContainerServices(), constant.c_str()); + if(values.size() != object.m_virtual_axes) { - std::vector coefficients = m_current_lookup_table.at(m_virtual_axes_names[axis]); + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setFieldName(constant.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + else if(std::any_of(values.begin(), values.end(), [](double value) + { + return value == 0.0; + })) + { + _EXCPT(ComponentErrors::NotAllowedExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setReason(("A" + constant == "acceleration" ? "n " : " " + constant + " equals to 0 is not allowed.").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + } + else if(constant == "min_range" || constant == "max_range" || constant == "tracking_delta") + { + values = getCDBValue>(object.getContainerServices(), constant.c_str()); + if(values.size() != object.m_virtual_axes) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setFieldName(constant.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + } + else if(constant == "ramp_times") // Acceleration ramp times, 0 to max_speed and vice versa + { + values = std::vector(object.m_virtual_axes); + std::transform(object.m_m_s.begin(), object.m_m_s.end(), object.m_a.begin(), values.begin(), std::divides()); + } + else if(constant == "ramp_distances") // Acceleration ramp distances, 0 to max_speed and vice versa + { + values = std::vector(object.m_virtual_axes); + std::transform(object.m_r_t.begin(), object.m_r_t.end(), object.m_a.begin(), values.begin(), [](double acceleration_ramp_time, double acceleration) + { + return 0.5 * acceleration * std::pow(acceleration_ramp_time, 2); + }); + } - double coordinate = 0; + return values; +} - for(size_t index = 0; index < coefficients.size(); index++) - { - coordinate += coefficients[index] * pow(elevation, index); - } +/////////////////// PRIVATE methods +void SRTBaseMinorServoImpl::resetOffsets() +{ + AUTO_TRACE(m_servo_name + "::resetOffsets()"); - coordinates[axis] = coordinate; - } + // Sum the user and system DISCOS offsets to check whether they correspond to the Leonardo offsets + std::vector DISCOS_offsets(m_virtual_axes, 0.0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); - return coordinates._retn(); - } - else + // Read the Leonardo offsets + ACSErr::Completion_var comp; + ACS::doubleSeq sequence = *virtual_offsets()->get_sync(comp.out()); + std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); + + // Check if the offsets correspond or not + if(!std::equal(DISCOS_offsets.begin(), DISCOS_offsets.end(), LEONARDO_offsets.begin())) { - _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, (m_servo_name + "::calcCoordinates()").c_str()); - impl.setReason("Unable to calculate the coordinates since the servo system has not been configured yet!"); - throw impl; + // Offsets do not correspond, should reset them by sending a offset command + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, DISCOS_offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::resetOffsets()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, m_servo_name + "::resetOffsets()", (LM_INFO, "Offsets discrepancy, reset")); } } -std::vector SRTBaseMinorServoImpl::getPropertiesTable(const std::string& properties_name) +std::vector SRTBaseMinorServoImpl::getPropertiesTable(SRTBaseMinorServoImpl& object, const std::string& properties_name) { - AUTO_TRACE(m_servo_name + "::getPropertiesTable()"); + AUTO_STATIC_TRACE(object.m_servo_name + "::getPropertiesTable()"); std::vector properties; - IRA::CDBTable table(getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CDBTable table(object.getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + object.m_servo_name).c_str()); IRA::CError error; error.Reset(); @@ -550,15 +748,18 @@ std::vector SRTBaseMinorServoImpl::getPropertiesTable(const std::st } if(!error.isNoError()) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, impl, error); - impl.setCode(error.getErrorCode()); - impl.setDescription((const char *)error.getDescription()); - throw impl; + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } if(!table.openTable(error)) { - _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, impl, error); - throw impl; + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } table.First(); @@ -568,30 +769,40 @@ std::vector SRTBaseMinorServoImpl::getPropertiesTable(const std::st } table.closeTable(); - return properties; -} + size_t expected_size = 0; -void SRTBaseMinorServoImpl::checkErrors() -{ - ACSErr::Completion_var comp; - if(block()->get_sync(comp.out()) == Management::MNG_TRUE || drive_cabinet_status()->get_sync(comp.out()) == MinorServo::DRIVE_CABINET_ERROR) + if(properties_name.find("virtual_") == 0) { - _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, (m_servo_name + "::checkErrors()").c_str()); - impl.setReason("Servo system blocked or drive cabinet error!"); - throw impl; + expected_size = object.m_virtual_axes; } + else if(properties_name.find("physical_") == 0) + { + expected_size = object.m_physical_axes; + } + + if(expected_size == 0 || properties.size() != expected_size) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::initialize()").c_str()); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return properties; } -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_enabled_ptr, enabled); -GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoCabinetStatus, m_drive_cabinet_status_ptr, drive_cabinet_status); -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_block_ptr, block); -GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoOperativeMode, m_operative_mode_ptr, operative_mode); -GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, m_physical_axes_enabled_ptr, physical_axes_enabled); -GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_physical_positions_ptr, physical_positions); -GET_PROPERTY_REFERENCE(ACS::ROlong, m_virtual_axes_ptr, virtual_axes); -GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_positions_ptr, virtual_positions); -GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_offsets_ptr, virtual_offsets); -GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_user_offsets_ptr, virtual_user_offsets); -GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, m_virtual_system_offsets_ptr, virtual_system_offsets); -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_in_use_ptr, in_use); -GET_PROPERTY_REFERENCE(ACS::ROstring, m_current_setup_ptr, current_setup) + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(ROSRTMinorServoCabinetStatus, SRTBaseMinorServoImpl, m_drive_cabinet_status_ptr, drive_cabinet_status); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_block_ptr, block); +GET_PROPERTY_REFERENCE(ROSRTMinorServoOperativeMode, SRTBaseMinorServoImpl, m_operative_mode_ptr, operative_mode); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, SRTBaseMinorServoImpl, m_physical_axes_enabled_ptr, physical_axes_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTBaseMinorServoImpl, m_virtual_axes_ptr, virtual_axes); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_plain_virtual_positions_ptr, plain_virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_positions_ptr, virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_offsets_ptr, virtual_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_user_offsets_ptr, virtual_user_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_system_offsets_ptr, virtual_system_offsets); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_in_use_ptr, in_use); +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTBaseMinorServoImpl, m_current_setup_ptr, current_setup); diff --git a/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp index 1fe27bfc1..1b3dad9ec 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp @@ -1,7 +1,5 @@ #include "SRTMinorServoImpl.h" -using namespace maci; - SRTGenericMinorServoImpl::SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : SRTBaseMinorServoImpl(componentName, containerServices) { AUTO_TRACE(m_servo_name + "::SRTGenericMinorServoImpl()"); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index a824d15c7..efda46e6b 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -1,160 +1,266 @@ #include "SRTMinorServoBossCore.h" -using namespace maci; - -SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl* component) +using namespace MinorServo; + +SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : + m_component(component), + m_status_thread(nullptr), + m_setup_thread(nullptr), + m_park_thread(nullptr), + m_tracking_thread(nullptr), + m_scan_thread(nullptr), + m_antennaBoss(Antenna::AntennaBoss::_nil()), + m_status(), + m_motion_status(MOTION_STATUS_UNCONFIGURED), + m_commanded_setup("Unknown"), + m_commanded_configuration(CONFIGURATION_UNKNOWN), + m_subsystem_status(Management::MNG_WARNING), + m_actual_setup("Unknown"), + m_ready(Management::MNG_FALSE), + m_starting(Management::MNG_FALSE), + m_as_configuration(getCDBConfiguration("active_surface_configuration")), + m_elevation_tracking(Management::MNG_FALSE), + m_elevation_tracking_enabled(getCDBConfiguration("elevation_tracking_enabled")), + m_scan_active(Management::MNG_FALSE), + m_scanning(Management::MNG_FALSE), + m_tracking(Management::MNG_FALSE), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(m_component.getContainerServices())), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)), + m_socket_connected(m_socket.isConnected() ? Management::MNG_TRUE : Management::MNG_FALSE), + m_servos{ + { "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") }, + { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") }, + { "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } + }, + m_tracking_servos{ + { "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } + } { AUTO_TRACE("SRTMinorServoBossCore::SRTMinorServoBossCore()"); - m_component = component; - - m_motion_status = MinorServo::MOTION_STATUS_UNCONFIGURED; - m_actual_setup = "Unknown"; - m_commanded_setup = "Unknown"; - m_commanded_configuration = MinorServo::CONFIGURATION_UNKNOWN; - - m_subsystem_status = Management::MNG_WARNING; - m_ready = Management::MNG_FALSE; - m_starting = Management::MNG_FALSE; - m_as_configuration = Management::MNG_FALSE; - m_elevation_tracking = Management::MNG_FALSE; - m_elevation_tracking_enabled = Management::MNG_FALSE; - m_scan_active = Management::MNG_FALSE; - m_scanning = Management::MNG_FALSE; - m_tracking = Management::MNG_FALSE; - - m_socket_configuration = &SRTMinorServoSocketConfiguration::getInstance(m_component->getContainerServices()); - m_socket = &SRTMinorServoSocket::getInstance(m_socket_configuration->m_ip_address, m_socket_configuration->m_port, m_socket_configuration->m_timeout); - - m_status = SRTMinorServoAnswerMap(); - m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); - m_status_secure_area = new IRA::CSecureArea(&m_status); - - // Retrieve the minor servos components - m_tracking_servos["PFP"] = m_component->getContainerServices()->getComponent("MINORSERVO/PFP"); - m_tracking_servos["SRP"] = m_component->getContainerServices()->getComponent("MINORSERVO/SRP"); - m_servos["PFP"] = (MinorServo::SRTBaseMinorServo_ptr)m_tracking_servos["PFP"]; - m_servos["SRP"] = (MinorServo::SRTBaseMinorServo_ptr)m_tracking_servos["SRP"]; - m_servos["GFR"] = (MinorServo::SRTBaseMinorServo_ptr)m_component->getContainerServices()->getComponent("MINORSERVO/GFR"); - m_servos["M3R"] = (MinorServo::SRTBaseMinorServo_ptr)m_component->getContainerServices()->getComponent("MINORSERVO/M3R"); - - m_setup_thread = NULL; - m_park_thread = NULL; - m_tracking_thread = NULL; + startThread(m_status_thread, (ACS::TimeInterval)(getCDBValue(m_component.getContainerServices(), "status_thread_period") * 10000000)); } SRTMinorServoBossCore::~SRTMinorServoBossCore() { AUTO_TRACE("SRTMinorServoBossCore::~SRTMinorServoBossCore()"); - if(m_setup_thread != NULL) + destroyThread(m_setup_thread); + destroyThread(m_park_thread); + destroyThread(m_tracking_thread); + destroyThread(m_scan_thread); + destroyThread(m_status_thread); +} + +bool SRTMinorServoBossCore::status() +{ + AUTO_TRACE("SRTMinorServoBossCore::status()"); + + try + { + // Attempt communication anyway + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(), m_status); + + if(m_socket_connected.load() == Management::MNG_FALSE) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_INFO, "Socket connected.")); + m_socket_connected.store(Management::MNG_TRUE); + m_subsystem_status.store(Management::MNG_WARNING); + } + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + if(m_socket_connected.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_INFO, "Socket disconnected.")); + m_socket_connected.store(Management::MNG_FALSE); + + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + stopThread(m_scan_thread); + setFailure(); + } + + return false; + } + + try + { + checkLineStatus(); + } + catch(...) + { + setFailure(); + return false; + } + + // Call servo status + ACSErr::Completion_var comp; + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) { - m_setup_thread->suspend(); - m_setup_thread->terminate(); - m_component->getContainerServices()->getThreadManager()->destroy(m_setup_thread); + // We only get here if the system is configured, therefore we check the correct position of the gregorian cover + SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.current_configuration()->get_sync(comp.out()) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + if(m_component.gregorian_cover()->get_sync(comp.out()) != commanded_gregorian_cover_position) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_ERROR, "Gregorian cover in wrong position.")); + setFailure(); + return false; + } } - if(m_park_thread != NULL) + + for(const auto& [name, servo] : m_servos) { - m_park_thread->suspend(); - m_park_thread->terminate(); - m_component->getContainerServices()->getThreadManager()->destroy(m_park_thread); + if(!servo->status()) + { + setFailure(); + return false; + } } - if(m_tracking_thread != NULL) + + if(motion_status == MOTION_STATUS_TRACKING) { - m_tracking_thread->suspend(); - m_tracking_thread->terminate(); - m_component->getContainerServices()->getThreadManager()->destroy(m_tracking_thread); + if(std::all_of(m_tracking_servos.begin(), m_tracking_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_FALSE) + { + return true; + } + + return servo.second->tracking()->get_sync(comp.out()) == Management::MNG_TRUE ? true : false; + })) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } } + + return true; } void SRTMinorServoBossCore::setup(std::string commanded_setup) { AUTO_TRACE("SRTMinorServoBossCore::setup()"); - checkControl(); - checkEmergency(); + try + { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(getReasonFromEx(mse)); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + + if(m_scan_active.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, "THE SYSTEM IS PERFORMING A SCAN, CANNOT SETUP NOW")); + _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } std::transform(commanded_setup.begin(), commanded_setup.end(), commanded_setup.begin(), ::toupper); - std::pair cmd_configuration; - MinorServo::SRTMinorServoFocalConfiguration commanded_configuration; + std::pair cmd_configuration; + SRTMinorServoFocalConfiguration commanded_configuration; try { - cmd_configuration = MinorServo::DiscosConfigurationNameTable.at(commanded_setup); + cmd_configuration = DiscosConfigurationNameTable.at(commanded_setup); commanded_configuration = cmd_configuration.first; - if(m_as_configuration == Management::MNG_TRUE && cmd_configuration.second) + if(m_as_configuration.load() == Management::MNG_TRUE && cmd_configuration.second) { commanded_setup += "_ASACTIVE"; } } - catch(std::out_of_range& ex) // Unknown configuration + catch(std::out_of_range& oor) { - _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setup()"); - throw impl; + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("UNKNOWN CONFIGURATION '" + commanded_setup + "'").c_str())); + _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Unknown configuration '" + commanded_setup + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); } // Exit if commanded setup is already in place or is about to be - if(commanded_configuration == m_commanded_configuration && commanded_setup == m_commanded_setup) + if(commanded_configuration == m_commanded_configuration.load() && commanded_setup == m_commanded_setup) { - if(m_motion_status == MinorServo::MOTION_STATUS_CONFIGURING || m_motion_status == MinorServo::MOTION_STATUS_CONFIGURED || m_motion_status == MinorServo::MOTION_STATUS_TRACKING) + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status == MOTION_STATUS_STARTING) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("ALREADY SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + return; + } + else if(motion_status == MOTION_STATUS_CONFIGURED || motion_status == MOTION_STATUS_TRACKING) { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("CONFIGURATION '" + commanded_setup + "' ALREADY IN PLACE").c_str())); return; } } - m_commanded_configuration = commanded_configuration; + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + + m_commanded_configuration.store(commanded_configuration); m_commanded_setup = commanded_setup; - // Stop the setup and park threads if running - if(m_setup_thread != NULL && m_setup_thread->isAlive()) - { - m_setup_thread->setStopped(); - } - if(m_park_thread != NULL && m_park_thread->isAlive()) - { - m_park_thread->setStopped(); - } - if(m_tracking_thread != NULL && m_tracking_thread->isAlive()) - { - m_tracking_thread->setStopped(); - } + // Stop the setup, park and tracking threads if running + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + m_subsystem_status.store(Management::MNG_WARNING); m_actual_setup = ""; - m_ready = Management::MNG_FALSE; - m_starting = Management::MNG_TRUE; - m_tracking = Management::MNG_FALSE; - m_motion_status = MinorServo::MOTION_STATUS_CONFIGURING; - m_subsystem_status = Management::MNG_WARNING; + m_ready.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_TRUE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_STARTING); - // Send the STOP command to each servo - for(const auto& [name, servo] : m_servos) + try + { + // Send the STOP command to each servo + for(const auto& [servo_name, servo] : m_servos) + { + servo->stop(); + } + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) { - servo->stop(); + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while sending the STOP command to a minor servo system."); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); } // Start the setup thread - if(m_setup_thread != NULL) + try { - m_setup_thread->restart(); + startThread(m_setup_thread); } - else + catch(ComponentErrors::ComponentErrorsEx& ce) { - try - { - m_setup_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoBossCoreSetupThread", m_component->m_core); - } - catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) - { - m_starting = Management::MNG_FALSE; - m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_subsystem_status = Management::MNG_FAILURE; - _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::setup()"); - impl.setThreadName("SRTMinorServoSetupThread"); - throw impl; - } - - m_setup_thread->resume(); + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, ce, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while trying to start the setup_thread"); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); } } @@ -162,157 +268,266 @@ void SRTMinorServoBossCore::park() { AUTO_TRACE("SRTMinorServoBossCore::park()"); - checkControl(); - checkEmergency(); - - // Exit if the system is already parked or is about to be - if(m_commanded_configuration == MinorServo::CONFIGURATION_PARK) + try { - if(m_motion_status == MinorServo::MOTION_STATUS_CONFIGURING || m_motion_status == MinorServo::MOTION_STATUS_PARK) - { - return; - } + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason(getReasonFromEx(mse)); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); } - m_commanded_configuration = MinorServo::CONFIGURATION_PARK; - m_commanded_setup = "Park"; - - // Stop the setup and park threads if running - if(m_setup_thread != NULL && m_setup_thread->isAlive()) + if(m_scan_active.load() == Management::MNG_TRUE) { - m_setup_thread->setStopped(); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "THE SYSTEM IS PERFORMING A SCAN, CANNOT PARK NOW")); + _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); } - if(m_park_thread != NULL && m_park_thread->isAlive()) + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status == MOTION_STATUS_PARKING) { - m_park_thread->setStopped(); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "MINOR SERVOS ALREADY PARKING")); + return; } - if(m_tracking_thread != NULL && m_tracking_thread->isAlive()) + else if (motion_status == MOTION_STATUS_PARKED) { - m_tracking_thread->setStopped(); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "MINOR SERVOS ALREADY PARKED")); + return; } + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "PARKING")); + + m_commanded_configuration.store(CONFIGURATION_PARK); + m_commanded_setup = "Park"; + + // Stop the setup, park and tracking threads if running + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + + m_subsystem_status.store(Management::MNG_WARNING); m_actual_setup = ""; - m_ready = Management::MNG_FALSE; - m_starting = Management::MNG_TRUE; - m_tracking = Management::MNG_FALSE; - m_motion_status = MinorServo::MOTION_STATUS_CONFIGURING; - m_subsystem_status = Management::MNG_WARNING; + m_ready.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_TRUE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_PARKING); - // Send the STOW command to the gregorian cover - if(std::get(m_socket->sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2))["OUTPUT"]) != "GOOD") + try { - m_starting = Management::MNG_FALSE; - m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_subsystem_status = Management::MNG_FAILURE; - _EXCPT(MinorServoErrors::SetupErrorExImpl, impl, "SRTMinorServoBossCore::park()"); - throw impl; - } + // Send the STOW command to the gregorian cover + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2)).checkOutput()) + { + _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } - // Send the STOP command to each servo - for(const auto& [name, servo] : m_servos) + // Send the STOP command to each servo + for(const auto& [servo_name, servo] : m_servos) + { + servo->stop(); + } + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) { - servo->stop(); + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while sending the STOP command to a minor servo system."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); } // Start the park thread - if(m_park_thread != NULL) + try { - m_park_thread->restart(); + startThread(m_park_thread); } - else + catch(ComponentErrors::ComponentErrorsEx& ce) { - try - { - m_park_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoBossCoreParkThread", m_component->m_core); - } - catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) - { - m_starting = Management::MNG_FALSE; - m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_subsystem_status = Management::MNG_FAILURE; - _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::park()"); - impl.setThreadName("SRTMinorServoParkThread"); - throw impl; - } - - m_park_thread->resume(); + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, ce, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while trying to start the park_thread"); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); } } void SRTMinorServoBossCore::setElevationTracking(std::string configuration) { AUTO_TRACE("SRTMinorServoBossCore::setElevationTracking()"); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setElevationTracking()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); - if(configuration == "ON") + if(configuration != "ON" && configuration != "OFF") { - m_elevation_tracking_enabled = Management::MNG_TRUE; + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setElevationTracking()"); + ex.addData("Reason", ("Unknown setElevationTracking configuration '" + configuration + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - else if(configuration == "OFF") + + ACS_LOG(LM_FULL_INFO, "setServoElevationTracking", (LM_INFO, ("SETTING ELEVATION TRACKING TO " + configuration).c_str())); + + if(configuration == "ON" && m_elevation_tracking_enabled.load() != Management::MNG_TRUE) { - m_elevation_tracking_enabled = Management::MNG_FALSE; + m_elevation_tracking_enabled.store(Management::MNG_TRUE); + + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + { + m_motion_status.store(MOTION_STATUS_TRACKING); + startThread(m_tracking_thread); + } } - else + else if(configuration == "OFF" && m_elevation_tracking_enabled.load() != Management::MNG_FALSE) { - _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setElevationTracking()"); - throw impl; + stopThread(m_tracking_thread); + m_elevation_tracking_enabled.store(Management::MNG_FALSE); + + if(m_motion_status.load() == MOTION_STATUS_TRACKING) + { + m_motion_status.store(MOTION_STATUS_CONFIGURED); + } } } void SRTMinorServoBossCore::setASConfiguration(std::string configuration) { AUTO_TRACE("SRTMinorServoBossCore::setASConfiguration()"); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setASConfiguration()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); - if(configuration == "ON") + if(configuration != "ON" && configuration != "OFF") + { + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setASConfiguration()"); + ex.addData("Reason", ("Unknown setASConfiguration configuration '" + configuration + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "setServoASConfiguration", (LM_INFO, ("SETTING ACTIVE SURFACE CONFIGURATION TO " + configuration).c_str())); + + if(configuration == "ON" && m_as_configuration.load() != Management::MNG_TRUE) { - m_as_configuration = Management::MNG_TRUE; + m_as_configuration.store(Management::MNG_TRUE); } - else if(configuration == "OFF") + else if(configuration == "OFF" && m_as_configuration.load() != Management::MNG_FALSE) { - m_as_configuration = Management::MNG_FALSE; + m_as_configuration.store(Management::MNG_FALSE); } else { - _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, impl, "SRTMinorServoBossCore::setASConfiguration()"); - throw impl; + // We asked for the same configuration, nothing else to do + return; } - // Should reload the correct setup if the system was already configured - if(!m_actual_setup.empty()) + // Should reload the correct setup if the system was already configured or was about to be + if(!m_commanded_setup.empty()) { - configuration = m_actual_setup.substr(0, m_actual_setup.find("_")); - setup(configuration); + configuration = m_commanded_setup.substr(0, m_commanded_setup.find("_")); + try + { + setup(configuration); + } + catch(ManagementErrors::ConfigurationErrorEx& ce) + { + _ADD_BACKTRACE(MinorServoErrors::ConfigurationErrorExImpl, ex, ce, "SRTMinorServoBossCore::setASConfiguration()"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } } -void SRTMinorServoBossCore::status() +void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) { - AUTO_TRACE("SRTMinorServoBossCore::status()"); + AUTO_TRACE("SRTMinorServoBossCore::setGregorianCoverPosition()"); + + checkLineStatus(); + + std::transform(position.begin(), position.end(), position.begin(), ::toupper); + + if(position != "OPEN" && position != "CLOSED") + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.addData("Reason", ("Unknown position '" + position + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_PARKING && motion_status != MOTION_STATUS_PARKED) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.setReason("You can set the gregorian cover position only when the system is parked or is parking."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_INFO, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); - IRA::CSecAreaResourceWrapper status = m_status_secure_area->Get(); - m_socket->sendCommand(SRTMinorServoCommandLibrary::status(), m_status); + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", position == "OPEN" ? 1 : 2)).checkOutput()) + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } -void SRTMinorServoBossCore::preset(double elevation) // Elevation is expressed in degrees +void SRTMinorServoBossCore::preset(double elevation) { + // Elevation is expressed in degrees AUTO_TRACE("SRTMinorServoBossCore::preset()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::preset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } - if(m_ready == Management::MNG_FALSE) + if(m_motion_status.load() != MOTION_STATUS_CONFIGURED) { - _EXCPT(MinorServoErrors::PositioningErrorExImpl, impl, "SRTMinorServoBossCore::preset()"); - throw impl; + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, "SRTMinorServoBossCore::preset()"); + ex.addData("Reason", "Minor servos are tracking, cannot send a global preset command now."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } ACSErr::Completion_var comp; - for(const auto& [name, servo] : m_servos) + for(const auto& [servo_name, servo] : m_servos) { - std::vector coordinates; - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) { servo->preset(*servo->calcCoordinates(elevation)); @@ -324,28 +539,86 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) { AUTO_TRACE("SRTMinorServoBossCore::clearUserOffsets()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + ACSErr::Completion_var comp; + if(servo_name == "ALL") + { + for(const auto& [servo_name, servo] : m_servos) + { + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->clearUserOffsets(); + } + } + return; + } + try { - m_servos.at(servo_name)->clearUserOffsets(); + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->clearUserOffsets(); + } + else + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } - catch(std::out_of_range& ex) + catch(std::out_of_range& oor) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::clearUserOffsets()"); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } -void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double offset) +void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double offset, bool log) { AUTO_TRACE("SRTMinorServoBossCore::setUserOffset()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); @@ -356,53 +629,123 @@ void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double of try { - m_servos.at(servo_name)->setUserOffset(axis_name.c_str(), offset); + auto servo = m_servos.at(servo_name); + ACSErr::Completion_var comp; + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + if(log) + { + ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_INFO, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); + } + servo->setUserOffset(axis_name.c_str(), offset); + } + else + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } - catch(std::out_of_range& ex) + catch(std::out_of_range& oor) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::setUserOffsets()"); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } -std::vector SRTMinorServoBossCore::getUserOffsets() +ACS::doubleSeq* SRTMinorServoBossCore::getUserOffsets() { AUTO_TRACE("SRTMinorServoBossCore::getUserOffsets()"); - std::vector user_offsets; + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getUserOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + ACS::doubleSeq_var offsets = new ACS::doubleSeq; ACSErr::Completion_var comp; - for(const auto& servo_name : MinorServo::ServoOrder) + + for(const auto& servo_name : ServoOrder) { auto servo = m_servos.at(servo_name); if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) { - ACS::doubleSeq* servo_offsets = servo->getUserOffsets(); - std::vector offsets(servo_offsets->get_buffer(), servo_offsets->get_buffer() + servo_offsets->length()); - user_offsets.insert(user_offsets.end(), offsets.begin(), offsets.end()); + ACS::doubleSeq servo_offsets = *servo->getUserOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); } } - return user_offsets; + return offsets._retn(); } void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) { AUTO_TRACE("SRTMinorServoBossCore::clearSystemOffsets()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + ACSErr::Completion_var comp; + if(servo_name == "ALL") + { + for(const auto& [servo_name, servo] : m_servos) + { + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->clearSystemOffsets(); + } + } + return; + } + try { - m_servos.at(servo_name)->clearSystemOffsets(); + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->clearSystemOffsets(); + } + else + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } - catch(std::out_of_range& ex) + catch(std::out_of_range& oor) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::clearSystemOffsets()"); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } @@ -410,8 +753,24 @@ void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double { AUTO_TRACE("SRTMinorServoBossCore::setSystemOffset()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); @@ -422,48 +781,80 @@ void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double try { - m_servos.at(servo_name)->setSystemOffset(axis_name.c_str(), offset); + auto servo = m_servos.at(servo_name); + ACSErr::Completion_var comp; + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + servo->setSystemOffset(axis_name.c_str(), offset); + } + else + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } - catch(std::out_of_range& ex) + catch(std::out_of_range& oor) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, impl, "SRTMinorServoBossCore::setSystemOffsets()"); - throw impl; + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } } -std::vector SRTMinorServoBossCore::getSystemOffsets() +ACS::doubleSeq* SRTMinorServoBossCore::getSystemOffsets() { AUTO_TRACE("SRTMinorServoBossCore::getSystemOffsets()"); - std::vector system_offsets; + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getSystemOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + ACS::doubleSeq_var offsets = new ACS::doubleSeq; ACSErr::Completion_var comp; - for(const auto& servo_name : MinorServo::ServoOrder) + + for(const auto& servo_name : ServoOrder) { auto servo = m_servos.at(servo_name); if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) { - ACS::doubleSeq* servo_offsets = servo->getSystemOffsets(); - std::vector offsets(servo_offsets->get_buffer(), servo_offsets->get_buffer() + servo_offsets->length()); - system_offsets.insert(system_offsets.end(), offsets.begin(), offsets.end()); + ACS::doubleSeq servo_offsets = *servo->getSystemOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); } } - return system_offsets; + return offsets._retn(); } -void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { AUTO_TRACE("SRTMinorServoBossCore::getAxesInfo()"); + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getAxesInfo()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + std::vector axes_names_vector, axes_units_vector; - unsigned int length = 0; - ACS::stringSeq_var axes_names_var = new ACS::stringSeq; - ACS::stringSeq_var axes_units_var = new ACS::stringSeq; + ACS::stringSeq_var axes_names = new ACS::stringSeq; + ACS::stringSeq_var axes_units = new ACS::stringSeq; ACSErr::Completion_var comp; - for(const auto& servo_name : MinorServo::ServoOrder) + for(const auto& servo_name : ServoOrder) { auto servo = m_servos.at(servo_name); if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) @@ -472,130 +863,490 @@ void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stri ACS::stringSeq_var servo_axes_units; servo->getAxesInfo(servo_axes_names, servo_axes_units); - unsigned int index = length; - unsigned int servo_length = (unsigned int)servo->virtual_axes()->get_sync(comp.out()); - length += servo_length; - axes_names_var->length(length); - axes_units_var->length(length); + size_t names_index = axes_names->length(); + size_t units_index = axes_units->length(); + axes_names->length(names_index + servo_axes_names->length()); + axes_units->length(units_index + servo_axes_units->length()); + std::copy(servo_axes_names->begin(), servo_axes_names->end(), axes_names->begin() + names_index); + std::copy(servo_axes_units->begin(), servo_axes_units->end(), axes_units->begin() + units_index); + } + } + + axes_names_out = axes_names._retn(); + axes_units_out = axes_units._retn(); +} - for(size_t i = 0; i < servo_length; i++, index++) - { - axes_names_var[index] = std::string(servo_name + "_" + (const char*)servo_axes_names[i]).c_str(); - axes_units_var[index] = servo_axes_units[i]; - } +ACS::doubleSeq* SRTMinorServoBossCore::getAxesPositions(ACS::Time acs_time) +{ + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getAxesPositions()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS::doubleSeq_var positions = new ACS::doubleSeq; + ACSErr::Completion_var comp; + + for(const auto& servo_name : ServoOrder) + { + auto servo = m_servos.at(servo_name); + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + ACS::doubleSeq servo_positions = *servo->getAxesPositions(acs_time); + size_t start_index = positions->length(); + positions->length(start_index + servo_positions.length()); + std::copy(servo_positions.begin(), servo_positions.end(), positions->begin() + start_index); } } - axes_names = axes_names_var._retn(); - axes_units = axes_units_var._retn(); + return positions._retn(); } -bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters) +SRTMinorServoScan SRTMinorServoBossCore::checkScanFeasibility(const ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +{ + // TODO: check whether to start from the left side or the right side, LOW priority + AUTO_TRACE("SRTMinorServoBossCore::checkScanFeasibility()"); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkScanFeasibility()"); + + SRTMinorServoScan new_scan; + new_scan.scan_range = scan_info.range; + new_scan.scan_duration = scan_info.total_time; + new_scan.starting_elevation = antenna_info.elevation * DR2D; + + std::string axis_code(scan_info.axis_code); + // Get the axis that will have to be moved during the scan + std::transform(axis_code.begin(), axis_code.end(), axis_code.begin(), ::toupper); + std::string servo_name = axis_code.substr(0, axis_code.find("_")); + std::string axis_name = axis_code.substr(axis_code.find("_") + 1); + + new_scan.servo_name = servo_name; + new_scan.axis_name = axis_name; + + ACS::stringSeq_var servo_axes_names, servo_axes_units; + + SRTBaseMinorServo_ptr servo; + + try + { + servo = m_tracking_servos.at(servo_name); + } + catch(std::out_of_range& oor) + { + ex.setReason(("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACSErr::Completion_var comp; + + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_FALSE) + { + ex.setReason(("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + servo->getAxesInfo(servo_axes_names, servo_axes_units); + + size_t axis_index; + for(axis_index = 0; axis_index < servo_axes_names->length(); axis_index++) + { + if(std::string(servo_axes_names[axis_index]) == axis_name) + { + break; + } + } + + if(axis_index == servo_axes_names->length()) + { + ex.setReason(("Axis '" + axis_code + "' not found.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + new_scan.axis_index = axis_index; + + ACS::doubleSeq starting_position = *servo->calcCoordinates(new_scan.starting_elevation); + ACS::doubleSeq final_position = *servo->calcCoordinates(new_scan.starting_elevation); + // Don't be fooled by the name, starting position now still holds the central scan position + new_scan.central_position = starting_position[axis_index]; + + starting_position[axis_index] -= scan_info.range / 2; + final_position[axis_index] += scan_info.range / 2; + + /** + * Note, we perform the calculations with some degree of approximation, + * we know the expected elevation at the start of the scan, + * but the true elevation value is going to be known only inside the startScan, + * depending on how much time the minor servos take to get to position + * TBH, I don't really know if this will really matter, since we will be starting + * the movement of the SRP far from the peak of the gaussian. + * We will check this behavior later. + * In any case, the scan will simply add an offset to the elevation tracking expected position, + * the offset value depends on the time elapsed since the start of the scan, which, + * in the case of the focusScan, it's probably always decided by the minor servo system + */ + ACS::doubleSeq_var min_ranges, max_ranges; + servo->getAxesRanges(min_ranges, max_ranges); + + // Read the servo offsets + ACS::doubleSeq offsets = *servo->virtual_offsets()->get_sync(comp.out()); + + // Check if starting or final positions are outside the axes range (considering offsets) + for(size_t i = 0; i < starting_position.length(); i++) + { + if(starting_position[i] + offsets[i] < min_ranges[i] || starting_position[i] + offsets[i] > max_ranges[i]) + { + ex.setReason("Starting position out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(final_position[i] + offsets[i] < min_ranges[i] || final_position[i] + offsets[i] > max_ranges[i]) + { + ex.setReason("Final position out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } + + // Time to reach the desired position if I were to start the movement now + ACS::Time min_starting_time = getTimeStamp() + servo->getTravelTime(ACS::doubleSeq(), starting_position) + PROGRAM_TRACK_FUTURE_TIME; + + if(start_time != 0 && min_starting_time > start_time) + { + ex.setReason("Not enough time to start the scan."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(servo->getTravelTime(starting_position, final_position) > scan_info.total_time) // Check scan total time + { + ex.setReason("Not enough time to perform the scan."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + new_scan.start_time = min_starting_time; + return new_scan; +} + +bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters) { AUTO_TRACE("SRTMinorServoBossCore::checkScan()"); - checkControl(); - checkEmergency(); - - std::cout << "checkScan" << std::endl << std::endl; - std::cout << "now: " << CIRATools::getUNIXEpoch() << std::endl; - - std::cout << "Scan info:" << std::endl; - std::cout << "start time: " << CIRATools::ACSTime2UNIXEpoch(start_time) << std::endl; - std::cout << "empty: " << std::boolalpha << scan_info.is_empty_scan << std::endl; - std::cout << "span: " << scan_info.range << std::endl; - std::cout << "total time: " << (int)scan_info.total_time << std::endl; - std::cout << "axis code: " << std::string(scan_info.axis_code) << std::endl << std::endl; - - std::cout << "Antenna info:" << std::endl; - std::cout << "target name: " << std::string(antenna_info.targetName) << std::endl; - std::cout << "azimuth: " << antenna_info.azimuth << std::endl; - std::cout << "elevation: " << antenna_info.elevation << std::endl; - std::cout << "right ascension: " << antenna_info.rightAscension << std::endl; - std::cout << "declination: " << antenna_info.declination << std::endl; - std::cout << "start time: " << CIRATools::ACSTime2UNIXEpoch(antenna_info.startEpoch) << std::endl; - std::cout << "on the fly: " << std::boolalpha << antenna_info.onTheFly << std::endl; - std::cout << "slewing time: " << antenna_info.slewingTime << std::endl; - std::cout << "azimuth section: " << antenna_info.section << std::endl; - std::cout << "scan axis: " << antenna_info.axis << std::endl; - std::cout << "stop time: " << CIRATools::ACSTime2UNIXEpoch(antenna_info.timeToStop) << std::endl; - - MinorServo::TRunTimeParameters_var ms_param_var = new MinorServo::TRunTimeParameters; - ms_param_var->onTheFly = false; + TRunTimeParameters_var ms_param_var = new TRunTimeParameters; + ms_param_var->onTheFly = !scan_info.is_empty_scan; + ms_param_var->scanAxis = CORBA::string_dup(scan_info.axis_code); ms_param_var->startEpoch = 0; ms_param_var->centerScan = 0; - ms_param_var->scanAxis = CORBA::string_dup(""); ms_param_var->timeToStop = 0; - ms_parameters = ms_param_var._retn(); - if(scan_info.is_empty_scan && m_ready == Management::MNG_FALSE) + try { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + // Something is not working, return ASAP + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + ms_parameters = ms_param_var._retn(); + return false; + } + + // Check if we are already performing another scan + if(m_scan_active.load() == Management::MNG_TRUE) + { + ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossCore::checkScan(): The system is waiting for a scan to be completed.")); + ms_parameters = ms_param_var._retn(); + return false; + } + + /** + * Empty scan, the old implementation always returned true + * Given the fact that we start the elevation tracking thread automatically + * and considering we will not have to move any axis because of the empty scan + * it is safe to return true in any situation. + * If the system is not configured this will not stop the antenna from starting to track a source + * If the system is about to be configured we will start tracking soon anyway + * The tracking flag will be set to true only when we are inside the tracking delta + * The change in status will be notified via the NotificationChannel + */ + if(scan_info.is_empty_scan) + { + ms_parameters = ms_param_var._retn(); return true; } + // We need to be ready here, we cannot wait for a setup procedure to complete + // Check if the system is now configured and/or tracking + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_TRACKING && motion_status != MOTION_STATUS_CONFIGURED) + { + ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossCore::checkScan(): The system is not ready yet.")); + ms_parameters = ms_param_var._retn(); + return false; + } + + SRTMinorServoScan scan; + try + { + scan = checkScanFeasibility(start_time, scan_info, antenna_info); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + ms_parameters = ms_param_var._retn(); + return false; + } + + ms_param_var->startEpoch = scan.start_time; + ms_param_var->centerScan = scan.central_position; + ms_param_var->timeToStop = ms_param_var->startEpoch + scan_info.total_time; + ms_parameters = ms_param_var._retn(); return true; } -void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) { AUTO_TRACE("SRTMinorServoBossCore::startScan()"); - checkControl(); - checkEmergency(); - - std::cout << "startScan" << std::endl; + // This will throw if anything is not working, no need to catch it since we will throw it again anyway + checkLineStatus(); - // Start the tracking thread - if(m_tracking_thread != NULL) + // Check if we are already performing another scan + if(m_scan_active.load() == Management::MNG_TRUE) { - m_tracking_thread->restart(); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::startScan()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - else + + // Empty scan, OK in any case + if(scan_info.is_empty_scan) { - try - { - m_tracking_thread = m_component->getContainerServices()->getThreadManager()->create("SRTMinorServoTrackingThread", m_component->m_core); - } - catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) - { - m_subsystem_status = Management::MNG_FAILURE; - _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossCore::startScan()"); - impl.setThreadName("SRTMinorServoTrackingThread"); - throw impl; - } + start_time = getTimeStamp(); + return; + } - m_tracking_thread->resume(); + // Check again, this should never block, otherwise something weird is happening + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_TRACKING && motion_status != MOTION_STATUS_CONFIGURED) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::startScan()"); + ex.setReason("The system is not ready yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } + + // This will throw if anything is not working, no need to catch it since we will throw it again anyway + SRTMinorServoScan scan = checkScanFeasibility(start_time, scan_info, antenna_info); + + stopThread(m_tracking_thread); + + // If we got here we are safe to start the scan + m_current_scan = scan; + start_time = scan.start_time; + m_scan_active.store(Management::MNG_TRUE); + startThread(m_scan_thread); } void SRTMinorServoBossCore::closeScan(ACS::Time& close_time) { AUTO_TRACE("SRTMinorServoBossCore::closeScan()"); - checkControl(); - checkEmergency(); + checkLineStatus(); + + if(m_scan_active.load() != Management::MNG_TRUE) + { + // Not scanning, or scan just stopped and the servo is still going back to the initial position + close_time = std::max(getTimeStamp(), m_last_scan.close_time); + return; + } + + // If we got here the scan was not complete, we need to update some values + // Update the scan_duration value. The scan thread will read the value and update the scan center point accordingly. + m_current_scan.scan_duration = getTimeStamp() - m_current_scan.start_time; + + // The thread might have already stopped, but we don't care + stopThread(m_scan_thread); + + // At this point the thread must have stopped, we waited at most 200ms for it to finish its execution, so we can safely assume it's done + // The thread also have updated m_last_scan with the final values - std::cout << "closeScan" << std::endl; + // Set the close_time + close_time = std::max(getTimeStamp(), m_last_scan.close_time); } -void SRTMinorServoBossCore::checkControl() +double SRTMinorServoBossCore::getElevation(const ACS::Time& acs_time) { - ACSErr::Completion_var comp; - if(m_component->control()->get_sync(comp.out()) != MinorServo::CONTROL_DISCOS) + AUTO_TRACE("SRTMinorServoBossCore::getElevation()"); + // TODO automatically try to get a new reference if the AntennaBoss component were to be deallocated + // What happens if we lose the reference? m_antennaBoss will not be _nil but getRawCoordinates will behave unexpectedly + + // Retrieve the AntennaBoss component if it was not initialized yet + try { - _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, "SRTMinorServoBossCore::checkControl()"); - impl.setReason("MinorServo system is not controlled by DISCOS!"); - throw impl; + if(CORBA::is_nil(m_antennaBoss)) + { + m_antennaBoss = m_component.getContainerServices()->getComponent("ANTENNA/Boss"); + } + + double azimuth, elevation; + m_antennaBoss->getRawCoordinates(acs_time, azimuth, elevation); + elevation *= DR2D; + // If the antennaBoss didn't command any movement to the telescope yet we get an elevation of 0° + // We don't want to track an elevation of 0°, especially when DISCOS just started + // There is a high chance the antenna is still at around 90° of elevation + // We "initialize" the tracking to an elevation of 45° + return elevation == 0.0 ? 45.0 : elevation; + } + catch(maciErrType::CannotGetComponentExImpl& impl) + { + m_antennaBoss = Antenna::AntennaBoss::_nil(); + _EXCPT(ComponentErrors::CouldntGetComponentExImpl, ex, "SRTMinorServoBossCore::getElevation()"); + ex.setComponentName("ANTENNA/Boss"); + ex.addData("Reason", "Cannot get the ANTENNA/Boss component"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } } -void SRTMinorServoBossCore::checkEmergency() +void SRTMinorServoBossCore::checkLineStatus() { + AUTO_TRACE("SRTMinorServoBossCore::checkLineStatus()"); + + if(!m_socket.isConnected()) + { + setFailure(); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("Socket not connected."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + ACSErr::Completion_var comp; - if(m_component->emergency()->get_sync(comp.out()) == Management::MNG_TRUE) + if(m_component.control()->get_sync(comp.out()) != CONTROL_DISCOS) + { + setFailure(); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("MinorServo system is not controlled by DISCOS."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + if(m_component.emergency()->get_sync(comp.out()) == Management::MNG_TRUE) + { + setFailure(); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("MinorServo system in emergency status."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +template >> +void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sleep_time) +{ + AUTO_TRACE("SRTMinorServoBossCore::startThread()"); + + try + { + if(thread != nullptr) + { + // We don't want to restart already active threads + if(!thread->isAlive()) + { + if(sleep_time != 0) + { + thread->setSleepTime(sleep_time); + } + thread->restart(); + } + } + else + { + thread = m_component.getContainerServices()->getThreadManager()->create(T::c_thread_name, *this); + if(sleep_time != 0) + { + thread->setSleepTime(sleep_time); + } + thread->resume(); + } + } + catch(acsthreadErrType::CanNotSpawnThreadExImpl& impl) { - _EXCPT(MinorServoErrors::StatusErrorExImpl, impl, "SRTMinorServoBossCore::checkEmergency()"); - impl.setReason("MinorServo system in emergency status!"); - throw impl; + // The thread failed to start for some reason + setFailure(); + _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, "SRTMinorServoBossCore::startThread()"); + ex.setThreadName(T::c_thread_name); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startThread()", (LM_INFO, (std::string(T::c_thread_name) + " STARTED").c_str())); +} + +template >> +void SRTMinorServoBossCore::stopThread(T*& thread) +{ + AUTO_TRACE("SRTMinorServoBossCore::stopThread()"); + + if(thread != nullptr && thread->isAlive()) + { + thread->stop(); + // We might not need this block, but if the previous call is blocking we won't get here anyway, better keep it + while(thread->isAlive()) + { + // TODO: remove this if found unnecessary + std::cout << "waiting thread" << std::endl; + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + } +} + +template >> +void SRTMinorServoBossCore::destroyThread(T*& thread) +{ + AUTO_TRACE("SRTMinorServoBossCore::destroyThread()"); + + if(thread != nullptr) + { + thread->terminate(); + m_component.getContainerServices()->getThreadManager()->destroy(thread); + } +} + +void SRTMinorServoBossCore::setFailure() +{ + AUTO_TRACE("SRTMinorServoBossCore::setFailure()"); + + m_subsystem_status.store(Management::MNG_FAILURE); + m_ready.store(Management::MNG_FALSE); + m_elevation_tracking.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_FALSE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_ERROR); +} + +Management::TBoolean SRTMinorServoBossCore::getCDBConfiguration(std::string which_configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::getCDBConfiguration()"); + std::string configuration = getCDBValue(m_component.getContainerServices(), which_configuration); + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration != "ON" && configuration != "OFF") + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoBossCore::getCDBConfiguration()"); + ex.setFieldName(which_configuration.c_str()); + ex.addData("Reason", "Value should be 'ON' or 'OFF'"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return configuration == "ON" ? Management::MNG_TRUE : Management::MNG_FALSE; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 2725aec94..34d92da5a 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -1,14 +1,17 @@ #include "SRTMinorServoBossImpl.h" -using namespace maci; -using namespace SimpleParser; +using namespace MinorServo; +namespace SP = SimpleParser; _IRA_LOGFILTER_DECLARE; -SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : - CharacteristicComponentImpl(componentName, containerServices), - m_core(NULL), - m_parser(NULL), +SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, maci::ContainerServices* container_services) : + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_core_ptr(std::make_shared(*this)), + m_core(*m_core_ptr), + m_parser(SP::CParser(this, 2)), + m_connected_ptr(this), m_status_ptr(this), m_ready_ptr(this), m_actual_setup_ptr(this), @@ -35,172 +38,74 @@ SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString &componentName, m SRTMinorServoBossImpl::~SRTMinorServoBossImpl() { AUTO_TRACE("SRTMinorServoBossImpl::~SRTMinorServoBossImpl()"); - - if(m_parser != NULL) - { - delete m_parser; - } - if(m_core != NULL) - { - delete m_core; - } } void SRTMinorServoBossImpl::initialize() { AUTO_TRACE("SRTMinorServoBossImpl::initialize()"); - _IRA_LOGFILTER_ACTIVATE(200000000, 500000000); - - m_core = new SRTMinorServoBossCore(this); - - IRA::CString string_buffer; - if(!IRA::CIRATools::getDBValue(getContainerServices(), "active_surface_configuration", string_buffer)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setFieldName("active_surface_configuration"); - throw impl; - } - else - { - std::string active_surface_configuration(string_buffer); - - if(active_surface_configuration == "ON") - { - m_core->m_as_configuration = Management::MNG_TRUE; - } - else if(active_surface_configuration == "OFF") - { - m_core->m_as_configuration = Management::MNG_FALSE; - } - else - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setFieldName("active_surface_configuration"); - impl.addData("Reason", "Value should be 'ON' or 'OFF'"); - throw impl; - } - } - - if(!IRA::CIRATools::getDBValue(getContainerServices(), "elevation_tracking_enabled", string_buffer)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setFieldName("elevation_tracking_enabled"); - throw impl; - } - else - { - std::string elevation_tracking_enabled(string_buffer); - - if(elevation_tracking_enabled == "ON") - { - m_core->m_elevation_tracking_enabled = Management::MNG_TRUE; - } - else if(elevation_tracking_enabled == "OFF") - { - m_core->m_elevation_tracking_enabled = Management::MNG_FALSE; - } - else - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setFieldName("elevation_tracking_enabled"); - impl.addData("Reason", "Value should be 'ON' or 'OFF'"); - throw impl; - } - } + _IRA_LOGFILTER_ACTIVATE(10000000, 20000000); try { - std::string component_name = getContainerServices()->getName().c_str(); - - m_status_ptr = new ROEnumImpl((component_name + ":status").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_subsystem_status), true); - m_ready_ptr = new ROEnumImpl((component_name + ":ready").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_ready), true); - m_actual_setup_ptr = new baci::ROstring((component_name + ":actualSetup").c_str(), getComponent(), new MSGenericDevIO(&m_core->m_actual_setup), true); - m_motion_info_ptr = new baci::ROstring((component_name + ":motionInfo").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_motion_status), true); - m_starting_ptr = new ROEnumImpl((component_name + ":starting").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_starting), true); - m_as_configuration_ptr = new ROEnumImpl((component_name + ":asConfiguration").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_as_configuration), true); - m_elevation_tracking_ptr = new ROEnumImpl((component_name + ":elevationTrack").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_elevation_tracking_enabled), true); - m_scan_active_ptr = new ROEnumImpl((component_name + ":scanActive").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_scan_active), true); - m_scanning_ptr = new ROEnumImpl((component_name + ":scanning").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_scanning), true); - m_tracking_ptr = new ROEnumImpl((component_name + ":tracking").c_str(), getComponent(), new MSGenericDevIO >(&m_core->m_tracking), true); - - SRTMinorServoDevIOInfo dev_io_info; - dev_io_info.secure_area = m_core->m_status_secure_area; - - dev_io_info.property_name = "current_configuration"; - dev_io_info.property_fields = std::vector{ "CURRENT_CONFIG" }; - m_current_configuration_ptr = new ROEnumImpl((component_name + ":current_configuration").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "simulation_enabled"; - dev_io_info.property_fields = std::vector{ "SIMULATION_ENABLED" }; - m_simulation_enabled_ptr = new ROEnumImpl((component_name + ":simulation_enabled").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "plc_time"; - dev_io_info.property_fields = std::vector{ "PLC_TIME" }; - m_plc_time_ptr = new baci::ROdouble((component_name + ":plc_time").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "plc_version"; - dev_io_info.property_fields = std::vector{ "PLC_VERSION" }; - m_plc_version_ptr = new baci::ROstring((component_name + ":plc_version").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "control"; - dev_io_info.property_fields = std::vector{ "CONTROL" }; - m_control_ptr = new ROEnumImpl((component_name + ":control").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "power"; - dev_io_info.property_fields = std::vector{ "POWER" }; - m_power_ptr = new ROEnumImpl((component_name + ":power").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "emergency"; - dev_io_info.property_fields = std::vector{ "EMERGENCY" }; - m_emergency_ptr = new ROEnumImpl((component_name + ":emergency").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "gregorian_cover"; - dev_io_info.property_fields = std::vector{ "GREGORIAN_CAP" }; - m_gregorian_cover_ptr = new ROEnumImpl((component_name + ":gregorian_cover").c_str(), getComponent(), new MSDevIO(dev_io_info), true); - - dev_io_info.property_name = "last_executed_command"; - dev_io_info.property_fields = std::vector{ "LAST_EXECUTED_COMMAND" }; - m_last_executed_command_ptr = new baci::ROdouble((component_name + ":last_executed_command").c_str(), getComponent(), new MSDevIO(dev_io_info), true); + m_connected_ptr = new ROEnumImpl((m_component_name + ":connected").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_socket_connected), true); + m_status_ptr = new ROEnumImpl((m_component_name + ":status").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_subsystem_status), true); + m_ready_ptr = new ROEnumImpl((m_component_name + ":ready").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_ready), true); + m_actual_setup_ptr = new baci::ROstring((m_component_name + ":actualSetup").c_str(), getComponent(), + new MSGenericDevIO(m_core.m_actual_setup), true); + m_motion_info_ptr = new baci::ROstring((m_component_name + ":motionInfo").c_str(), getComponent(), + new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status), true); + m_starting_ptr = new ROEnumImpl((m_component_name + ":starting").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_starting), true); + m_as_configuration_ptr = new ROEnumImpl((m_component_name + ":asConfiguration").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_as_configuration), true); + m_elevation_tracking_ptr = new ROEnumImpl((m_component_name + ":elevationTrack").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_elevation_tracking_enabled), true); + m_scan_active_ptr = new ROEnumImpl((m_component_name + ":scanActive").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_scan_active), true); + m_scanning_ptr = new ROEnumImpl((m_component_name + ":scanning").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_scanning), true); + m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_tracking), true); + m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), + new MSAnswerMapDevIO("current_configuration", "CURRENT_CONFIG", m_core.m_status), true); + m_simulation_enabled_ptr = new ROEnumImpl((m_component_name + ":simulation_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("simulation_enabled", "SIMULATION_ENABLED", m_core.m_status), true); + m_plc_time_ptr = new baci::ROdouble((m_component_name + ":plc_time").c_str(), getComponent(), + new MSAnswerMapDevIO("plc_time", "PLC_TIME", m_core.m_status), true); + m_plc_version_ptr = new baci::ROstring((m_component_name + ":plc_version").c_str(), getComponent(), + new MSAnswerMapDevIO("plc_version", "PLC_VERSION", m_core.m_status), true); + m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), + new MSAnswerMapDevIO("control", "CONTROL", m_core.m_status), true); + m_power_ptr = new ROEnumImpl((m_component_name + ":power").c_str(), getComponent(), + new MSAnswerMapDevIO("power", "POWER", m_core.m_status), true); + m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), + new MSAnswerMapDevIO("emergency", "EMERGENCY", m_core.m_status), true); + m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), + new MSAnswerMapDevIO("gregorian_cover", "GREGORIAN_CAP", m_core.m_status), true); + m_last_executed_command_ptr = new baci::ROdouble((m_component_name + ":last_executed_command").c_str(), getComponent(), + new MSAnswerMapDevIO("last_executed_command", "LAST_EXECUTED_COMMAND", m_core.m_status), true); } - catch(std::bad_alloc& ex) + catch(std::bad_alloc& ba) { - _THROW_EXCPT(ComponentErrors::MemoryAllocationExImpl, "SRTMinorServoBossImpl::initialize()"); + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, "SRTMinorServoBossImpl::initialize()"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); } - m_parser = new SimpleParser::CParser(this, 10); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_INFO, "PROPERTIES INITIALIZED")); - m_parser->add("servoSetup", new function1 >(this, &SRTMinorServoBossImpl::setup), 1); - m_parser->add("servoPark", new function0(this, &SRTMinorServoBossImpl::park), 0); - m_parser->add("setServoElevationTracking", new function1 >(this, &SRTMinorServoBossImpl::setElevationTracking), 1); - m_parser->add("setServoASConfiguration", new function1 >(this, &SRTMinorServoBossImpl::setASConfiguration), 1); - m_parser->add("setServoOffset", new function2, I >(this, &SRTMinorServoBossImpl::setOffsets), 2); - m_parser->add("clearServoOffsets", new function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); + m_parser.add("servoSetup", new SP::function1>(this, &SRTMinorServoBossImpl::setup), 1); + m_parser.add("servoPark", new SP::function0(this, &SRTMinorServoBossImpl::park), 0); + m_parser.add("setServoElevationTracking", new SP::function1>(this, &SRTMinorServoBossImpl::setElevationTracking), 1); + m_parser.add("setServoASConfiguration", new SP::function1>(this, &SRTMinorServoBossImpl::setASConfiguration), 1); + m_parser.add("setServoOffset", new SP::function2, SP::I>(this, &SRTMinorServoBossImpl::setUserOffset), 2); + m_parser.add("clearServoOffsets", new SP::function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); + m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); - try - { - double status_thread_period; - if(!IRA::CIRATools::getDBValue(getContainerServices(), "status_thread_period", status_thread_period)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setFieldName("status_thread_period"); - throw impl; - } - m_status_thread = getContainerServices()->getThreadManager()->create("SRTMinorServoStatusThread", m_core); - m_status_thread->setSleepTime(status_thread_period * 10000000); - m_status_thread->resume(); - } - catch(acsthreadErrType::acsthreadErrTypeExImpl& ex) - { - _EXCPT(ComponentErrors::CanNotStartThreadExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.setThreadName("SRTMinorServoStatusThread"); - throw impl; - } - catch(...) - { - _EXCPT(ComponentErrors::UnexpectedExImpl, impl, "SRTMinorServoBossImpl::initialize()"); - impl.addData("Reason", "Encountered an unexpected error when starting the SRTMinorServoStatusThread!"); - throw impl; - } + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_INFO, "PARSER INITIALIZED")); } void SRTMinorServoBossImpl::execute() @@ -212,13 +117,6 @@ void SRTMinorServoBossImpl::cleanUp() { AUTO_TRACE("SRTMinorServoBossImpl::cleanUp()"); stopPropertiesMonitoring(); - - if(m_status_thread != NULL) - { - m_status_thread->suspend(); - m_status_thread->terminate(); - } - _IRA_LOGFILTER_FLUSH; _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::cleanUp(); @@ -228,13 +126,6 @@ void SRTMinorServoBossImpl::aboutToAbort() { AUTO_TRACE("SRTMinorServoBossImpl::aboutToAbort()"); stopPropertiesMonitoring(); - - if(m_status_thread != NULL) - { - m_status_thread->suspend(); - m_status_thread->terminate(); - } - _IRA_LOGFILTER_FLUSH; _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::aboutToAbort(); @@ -243,152 +134,168 @@ void SRTMinorServoBossImpl::aboutToAbort() void SRTMinorServoBossImpl::setup(const char* configuration) { AUTO_TRACE("SRTMinorServoBossImpl::setup()"); - m_core->setup(std::string(configuration)); + m_core.setup(std::string(configuration)); } void SRTMinorServoBossImpl::park() { AUTO_TRACE("SRTMinorServoBossImpl::park()"); - m_core->park(); + m_core.park(); } CORBA::Boolean SRTMinorServoBossImpl::isElevationTrackingEn() { AUTO_TRACE("SRTMinorServoBossImpl::isElevationTrackingEn()"); - return m_core->m_elevation_tracking_enabled == Management::MNG_TRUE ? true : false; + return m_core.m_elevation_tracking_enabled.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isElevationTracking() { AUTO_TRACE("SRTMinorServoBossImpl::isElevationTracking()"); - return m_core->m_elevation_tracking == Management::MNG_TRUE ? true : false; + return m_core.m_elevation_tracking.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isTracking() { AUTO_TRACE("SRTMinorServoBossImpl::isTracking()"); - return m_core->m_tracking == Management::MNG_TRUE ? true : false; + return m_core.m_tracking.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isStarting() { AUTO_TRACE("SRTMinorServoBossImpl::isStarting()"); - return m_core->m_starting == Management::MNG_TRUE ? true : false; + return m_core.m_starting.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isASConfiguration() { AUTO_TRACE("SRTMinorServoBossImpl::isASConfiguration()"); - return m_core->m_as_configuration == Management::MNG_TRUE ? true : false; + return m_core.m_as_configuration.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isParking() { AUTO_TRACE("SRTMinorServoBossImpl::isParking()"); - return (m_core->m_starting == Management::MNG_TRUE && m_core->m_commanded_configuration == MinorServo::CONFIGURATION_PARK); + return (m_core.m_starting.load() == Management::MNG_TRUE && m_core.m_commanded_configuration.load() == CONFIGURATION_PARK); } CORBA::Boolean SRTMinorServoBossImpl::isReady() { AUTO_TRACE("SRTMinorServoBossImpl::isReady()"); - return m_core->m_ready == Management::MNG_TRUE ? true : false; + return m_core.m_ready.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isScanning() { AUTO_TRACE("SRTMinorServoBossImpl::isScanning()"); - return m_core->m_scanning == Management::MNG_TRUE ? true : false; + return m_core.m_scanning.load() == Management::MNG_TRUE ? true : false; } CORBA::Boolean SRTMinorServoBossImpl::isScanActive() { AUTO_TRACE("SRTMinorServoBossImpl::isScanActive()"); - return m_core->m_scan_active == Management::MNG_TRUE ? true : false; + return m_core.m_scan_active.load() == Management::MNG_TRUE ? true : false; } char* SRTMinorServoBossImpl::getActualSetup() { AUTO_TRACE("SRTMinorServoBossImpl::getActualSetup()"); - return CORBA::string_dup(m_core->m_actual_setup.c_str()); + return CORBA::string_dup(m_core.m_actual_setup.c_str()); } char* SRTMinorServoBossImpl::getCommandedSetup() { AUTO_TRACE("SRTMinorServoBossImpl::getCommandedSetup()"); - return CORBA::string_dup(m_core->m_commanded_setup.c_str()); + return CORBA::string_dup(m_core.m_commanded_setup.c_str()); } CORBA::Double SRTMinorServoBossImpl::getCentralScanPosition() { AUTO_TRACE("SRTMinorServoBossImpl::getCentralScanPosition()"); - return 0.0; + + if(m_core.m_scan_active.load() == Management::MNG_TRUE) + { + return CORBA::Double(m_core.m_current_scan.central_position); + } + else if(m_core.m_last_scan.servo_name != "") // We are not scanning now, but we performed a scan previously + { + return CORBA::Double(m_core.m_last_scan.central_position); + } + else + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossImpl::getCentralPosition()"); + ex.setReason("No scan has been performed yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTMinorServoBossImpl::clearOffsets() +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); + ACS_LOG(LM_FULL_INFO, "clearServoOffsets", (LM_INFO, "CLEARING ALL USER OFFSETS")); + m_core.clearUserOffsets("ALL"); } void SRTMinorServoBossImpl::clearUserOffset(const char* servo_name) { AUTO_TRACE("SRTMinorServoBossImpl::clearUserOffset()"); - m_core->clearUserOffsets(std::string(servo_name)); + m_core.clearUserOffsets(std::string(servo_name)); } void SRTMinorServoBossImpl::setUserOffset(const char* servo_axis_name, CORBA::Double offset) { AUTO_TRACE("SRTMinorServoBossImpl::setUserOffset()"); - m_core->setUserOffset(std::string(servo_axis_name), (double)offset); + m_core.setUserOffset(std::string(servo_axis_name), (double)offset); +} + +void SRTMinorServoBossImpl::setUserOffset(const char* servo_axis_name, const double& offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setUserOffset()"); + m_core.setUserOffset(std::string(servo_axis_name), (double)offset, true); } ACS::doubleSeq* SRTMinorServoBossImpl::getUserOffset() { AUTO_TRACE("SRTMinorServoBossImpl::getUserOffset()"); - - std::vector userOffsets = m_core->getUserOffsets(); - ACS::doubleSeq_var offsets = new ACS::doubleSeq; - offsets->length(userOffsets.size()); - for(size_t i = 0; i < userOffsets.size(); i++) - { - offsets[i] = userOffsets[i]; - } - return offsets._retn(); + return m_core.getUserOffsets(); } void SRTMinorServoBossImpl::clearSystemOffset(const char* servo_name) { AUTO_TRACE("SRTMinorServoBossImpl::clearSystemOffset()"); - m_core->clearSystemOffsets(std::string(servo_name)); + m_core.clearSystemOffsets(std::string(servo_name)); } void SRTMinorServoBossImpl::setSystemOffset(const char* servo_axis_name, CORBA::Double offset) { AUTO_TRACE("SRTMinorServoBossImpl::setSystemOffset()"); - m_core->setSystemOffset(std::string(servo_axis_name), (double)offset); + m_core.setSystemOffset(std::string(servo_axis_name), (double)offset); } ACS::doubleSeq* SRTMinorServoBossImpl::getSystemOffset() { AUTO_TRACE("SRTMinorServoBossImpl::getSystemOffset()"); - - std::vector systemOffsets = m_core->getSystemOffsets(); - ACS::doubleSeq_var offsets = new ACS::doubleSeq; - offsets->length(systemOffsets.size()); - for(size_t i = 0; i < systemOffsets.size(); i++) - { - offsets[i] = systemOffsets[i]; - } - return offsets._retn(); + return m_core.getSystemOffsets(); } void SRTMinorServoBossImpl::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) { AUTO_TRACE("SRTMinorServoBossImpl::getAxesInfo()"); - m_core->getAxesInfo(axes_names, axes_units); + m_core.getAxesInfo(axes_names, axes_units); } char* SRTMinorServoBossImpl::getScanAxis() { AUTO_TRACE("SRTMinorServoBossImpl::getScanAxis()"); - if(isScanActive()) + if(m_core.m_scan_active.load() == Management::MNG_TRUE) { - return CORBA::string_dup(""); + return CORBA::string_dup((m_core.m_current_scan.servo_name + "_" + m_core.m_current_scan.axis_name).c_str()); + } + else if(!m_core.m_last_scan.servo_name.empty()) + { + return CORBA::string_dup((m_core.m_last_scan.servo_name + "_" + m_core.m_last_scan.axis_name).c_str()); } else { @@ -396,70 +303,52 @@ char* SRTMinorServoBossImpl::getScanAxis() } } -ACS::doubleSeq* SRTMinorServoBossImpl::getAxesPosition(ACS::Time) +ACS::doubleSeq* SRTMinorServoBossImpl::getAxesPosition(ACS::Time acs_time) { - AUTO_TRACE("SRTMinorServoBossImpl::getAxesPosition()"); - - ACS::doubleSeq_var positions = new ACS::doubleSeq; - positions->length(3); - for(size_t i = 0; i < 3; i++) - { - positions[i] = 0; - } - return positions._retn(); + AUTO_TRACE("SRTMinorServoBossImpl::getAxesPositions()"); + return m_core.getAxesPositions(acs_time == 0 ? getTimeStamp() : acs_time); } void SRTMinorServoBossImpl::setElevationTracking(const char* configuration) { AUTO_TRACE("SRTMinorServoBossImpl::setElevationTracking()"); - m_core->setElevationTracking(std::string(configuration)); + m_core.setElevationTracking(std::string(configuration)); } void SRTMinorServoBossImpl::setASConfiguration(const char* configuration) { AUTO_TRACE("SRTMinorServoBossImpl::setASConfiguration()"); - m_core->setASConfiguration(std::string(configuration)); + m_core.setASConfiguration(std::string(configuration)); } -void SRTMinorServoBossImpl::setOffsets(const char* axis_code, const double& offset) -{ - AUTO_TRACE("SRTMinorServoBossImpl::setOffset()"); -} - -void SRTMinorServoBossImpl::clearOffsets() +void SRTMinorServoBossImpl::setGregorianCoverPosition(const char* position) { - AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); - - for(const auto& [name, servo] : m_core->m_servos) - { - m_core->clearUserOffsets(name); - // Not sure about the following - //m_core->clearSystemOffsets(name); - } + AUTO_TRACE("SRTMinorServoBossImpl::setGregorianCoverPosition()"); + m_core.setGregorianCoverPosition(std::string(position)); } -CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, MinorServo::TRunTimeParameters_out ms_parameters) +CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters) { AUTO_TRACE("SRTMinorServoBossImpl::checkScan()"); - return m_core->checkScan(start_time, scan_info, antenna_info, ms_parameters); + return m_core.checkScan(start_time, scan_info, antenna_info, ms_parameters); } -void SRTMinorServoBossImpl::startScan(ACS::Time& start_time, const MinorServo::MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +void SRTMinorServoBossImpl::startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) { AUTO_TRACE("SRTMinorServoBossImpl::startScan()"); - m_core->startScan(start_time, scan_info, antenna_info); + m_core.startScan(start_time, scan_info, antenna_info); } void SRTMinorServoBossImpl::closeScan(ACS::Time& close_time) { AUTO_TRACE("SRTMinorServoBossImpl::closeScan()"); - m_core->closeScan(close_time); + m_core.closeScan(close_time); } void SRTMinorServoBossImpl::preset(double elevation) { AUTO_TRACE("SRTMinorServoBossImpl::preset()"); - m_core->preset(elevation); + m_core.preset(elevation); } CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out answer) @@ -467,55 +356,60 @@ CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out AUTO_TRACE("SRTMinorServoBossImpl::command()"); IRA::CString out; - bool res; + bool res = false; + try { - m_parser->run(cmd, out); + m_parser.run(cmd, out); res = true; } - catch(ParserErrors::ParserErrorsExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - res = false; + // Only print the routine, the reason is automatically provided in the message inside the jlog. + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); } - catch(ManagementErrors::ConfigurationErrorExImpl& ex) + catch(ComponentErrors::ComponentErrorsEx& ex) { - ex.log(LM_ERROR); - res = false; + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); } - catch(ACSErr::ACSbaseExImpl& ex) + catch(ManagementErrors::ConfigurationErrorEx& ex) { - ex.log(LM_ERROR); - res = false; + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); } - catch(...) + catch(ManagementErrors::ParkingErrorEx& ex) { - ACS_SHORT_LOG((LM_WARNING, "SRTMinorServoBossImpl::command(): unknown exception.")); - res = false; + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); } + catch(...) // Unknown exception. If the above catch blocks are written correctly we should never get here. + { + ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossImpl::command()")); + } + answer = CORBA::string_dup((const char *)out); return res; } -GET_PROPERTY_REFERENCE(Management::ROTSystemStatus, m_status_ptr, status) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_ready_ptr, ready) -GET_PROPERTY_REFERENCE(ACS::ROstring, m_actual_setup_ptr, actualSetup) -GET_PROPERTY_REFERENCE(ACS::ROstring, m_motion_info_ptr, motionInfo) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_starting_ptr, starting) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_as_configuration_ptr, asConfiguration) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_elevation_tracking_ptr, elevationTrack) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_scan_active_ptr, scanActive) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_scanning_ptr, scanning) -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_tracking_ptr, tracking) - -GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoFocalConfiguration, m_current_configuration_ptr, current_configuration); -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_simulation_enabled_ptr, simulation_enabled); -GET_PROPERTY_REFERENCE(ACS::ROdouble, m_plc_time_ptr, plc_time); -GET_PROPERTY_REFERENCE(ACS::ROstring, m_plc_version_ptr, plc_version); -GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoControlStatus, m_control_ptr, control); -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_power_ptr, power); -GET_PROPERTY_REFERENCE(Management::ROTBoolean, m_emergency_ptr, emergency); -GET_PROPERTY_REFERENCE(MinorServo::ROSRTMinorServoGregorianCoverStatus, m_gregorian_cover_ptr, gregorian_cover); -GET_PROPERTY_REFERENCE(ACS::ROdouble, m_last_executed_command_ptr, last_executed_command); + +GET_PROPERTY_REFERENCE(Management::ROTSystemStatus, SRTMinorServoBossImpl, m_status_ptr, status) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_ready_ptr, ready) +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_actual_setup_ptr, actualSetup) +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_motion_info_ptr, motionInfo) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_starting_ptr, starting) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_as_configuration_ptr, asConfiguration) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_elevation_tracking_ptr, elevationTrack) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_scan_active_ptr, scanActive) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_scanning_ptr, scanning) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_tracking_ptr, tracking) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_connected_ptr, connected) +GET_PROPERTY_REFERENCE(ROSRTMinorServoFocalConfiguration, SRTMinorServoBossImpl, m_current_configuration_ptr, current_configuration); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_simulation_enabled_ptr, simulation_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTMinorServoBossImpl, m_plc_time_ptr, plc_time); +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_plc_version_ptr, plc_version); +GET_PROPERTY_REFERENCE(ROSRTMinorServoControlStatus, SRTMinorServoBossImpl, m_control_ptr, control); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_power_ptr, power); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_emergency_ptr, emergency); +GET_PROPERTY_REFERENCE(ROSRTMinorServoGregorianCoverStatus, SRTMinorServoBossImpl, m_gregorian_cover_ptr, gregorian_cover); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTMinorServoBossImpl, m_last_executed_command_ptr, last_executed_command); #include MACI_DLL_SUPPORT_FUNCTIONS(SRTMinorServoBossImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 747c59c93..63177b410 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -1,55 +1,59 @@ #include "SRTMinorServoParkThread.h" -SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): - ACS::Thread(name, responseTime, sleepTime), +using namespace MinorServo; + +SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), m_core(core) { - m_thread_name = std::string(name.c_str()); - AUTO_TRACE(m_thread_name + "::SRTMinorServoParkThread()"); + AUTO_TRACE("SRTMinorServoParkThread::SRTMinorServoParkThread()"); } SRTMinorServoParkThread::~SRTMinorServoParkThread() { - AUTO_TRACE(m_thread_name + "::~SRTMinorServoParkThread()"); + AUTO_TRACE("SRTMinorServoParkThread::~SRTMinorServoParkThread()"); } void SRTMinorServoParkThread::onStart() { - AUTO_TRACE(m_thread_name + "::onStart()"); + AUTO_TRACE("SRTMinorServoParkThread::onStart()"); this->setSleepTime(500000); // 50 milliseconds - m_start_time = CIRATools::getUNIXEpoch(); + m_start_time = IRA::CIRATools::getUNIXEpoch(); m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_INFO, "PARK THREAD STARTED")); } void SRTMinorServoParkThread::onStop() { - AUTO_TRACE(m_thread_name + "::onStop()"); + AUTO_TRACE("SRTMinorServoParkThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_INFO, "PARK THREAD STOPPED")); } void SRTMinorServoParkThread::runLoop() { - AUTO_TRACE(m_thread_name + "::runLoop()"); + AUTO_TRACE("SRTMinorServoParkThread::runLoop()"); try { - m_core->checkControl(); - m_core->checkEmergency(); + m_core.checkLineStatus(); } - catch(MinorServoErrors::StatusErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); this->setStopped(); return; } - if(CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) + if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) { - m_core->m_starting = Management::MNG_FALSE; - m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_core->m_subsystem_status = Management::MNG_FAILURE; - ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, "Timeout while performing a park operation.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::runLoop()", (LM_ERROR, "Timeout while performing a park operation.")); + m_core.setFailure(); this->setStopped(); + return; } ACSErr::Completion_var comp; @@ -59,13 +63,13 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == MinorServo::COVER_STATUS_CLOSED ? true : false; + bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == COVER_STATUS_CLOSED? true : false; // Then we cycle through all the servos and make sure their operative mode is STOP - if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; })) { m_status = 1; @@ -75,16 +79,15 @@ void SRTMinorServoParkThread::runLoop() } case 1: { - for(const auto& [name, servo] : m_core->m_servos) + for(const auto& [name, servo] : m_core.m_servos) { servo->setup(""); } - m_core->m_actual_setup = m_core->m_commanded_setup; - m_core->m_starting = Management::MNG_FALSE; - - m_core->m_subsystem_status = Management::MNG_OK; - m_core->m_motion_status = MinorServo::MOTION_STATUS_PARK; + m_core.m_actual_setup = m_core.m_commanded_setup; + m_core.m_starting.store(Management::MNG_FALSE); + m_core.m_motion_status.store(MOTION_STATUS_PARKED); + m_core.m_subsystem_status.store(Management::MNG_OK); this->setStopped(); break; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp new file mode 100644 index 000000000..bfec79cf9 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -0,0 +1,247 @@ +#include "SRTMinorServoScanThread.h" + +using namespace MinorServo; + +SRTMinorServoScanThread::SRTMinorServoScanThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time): + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_error(false) +{ + AUTO_TRACE("SRTMinorServoScanThread::SRTMinorServoScanThread()"); +} + +SRTMinorServoScanThread::~SRTMinorServoScanThread() +{ + AUTO_TRACE("SRTMinorServoScanThread::~SRTMinorServoScanThread()"); +} + +void SRTMinorServoScanThread::onStart() +{ + AUTO_TRACE("SRTMinorServoScanThread::onStart()"); + + // We want to start moving the scan servo ASAP and bring its scan axis to the start position. + // The other servos will keep tracking normally. + // The general implementation accounts for derotators which will be integrated in the future. + // The requested scan will start at start_time by adding the correct scan offset to each point. + + // This will find the first useful time to send a point synchronized with the scan start time: m_core.m_current_scan.start_time - (PROGRAM_TRACK_TIMEGAP * N) > now + PROGRAM_TRACK_FUTURE_TIME + size_t pre_scan_points = std::floor((m_core.m_current_scan.start_time - (getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME)) / PROGRAM_TRACK_TIMEGAP); + m_point_time = m_core.m_current_scan.start_time - pre_scan_points * PROGRAM_TRACK_TIMEGAP; + m_point_id = 0; + m_trajectory_id = (unsigned int)(m_point_time / 1000); + + // How many points in the scan trajectory? + // We don't check the modulo of the division, we assume all the scans duration is always expressed in seconds, therefore the modulo should always be 0 + size_t scan_points = m_core.m_current_scan.scan_duration / PROGRAM_TRACK_TIMEGAP + 1; + // How big is each offset step? We have N points but N-1 segments + double scan_delta = m_core.m_current_scan.scan_range / (scan_points - 1); + + m_scan_offsets = SRTMinorServoPositionsQueue(pre_scan_points + scan_points, 1); + for(size_t i = 0; i < pre_scan_points; i++) + { + m_scan_offsets.put(m_point_time + i * PROGRAM_TRACK_TIMEGAP, { -m_core.m_current_scan.scan_range / 2 }); + } + for(size_t i = 0; i < scan_points; i++) + { + m_scan_offsets.put(m_core.m_current_scan.start_time + i * PROGRAM_TRACK_TIMEGAP, {-m_core.m_current_scan.scan_range / 2 + i * scan_delta}); + } + + // We save the starting coordinates to return to them when the scan is finished + ACSErr::Completion_var comp; + auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); + m_starting_coordinates = *servo->virtual_positions()->get_sync(comp.out()); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_INFO, "SCAN THREAD STARTED")); +} + +void SRTMinorServoScanThread::onStop() +{ + AUTO_TRACE("SRTMinorServoScanThread::onStop()"); + + m_core.m_scanning.store(Management::MNG_FALSE); + + if(m_error) // We didn't reach the end of the scan because of some error + { + // Should we set everything to failure? + m_core.setFailure(); + return; + } + + m_core.m_scanning.store(Management::MNG_FALSE); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + + // Reset m_point_time + m_point_time -= PROGRAM_TRACK_FUTURE_TIME; + + auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); + + // Update the central scan position using the correct elevation (from the past) + m_core.m_current_scan.central_position = (*servo->calcCoordinates(m_core.getElevation((m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration) / 2)))[m_core.m_current_scan.axis_index]; + + ACS::doubleSeq return_coordinates; + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + // Restart the tracking + m_core.startThread(m_core.m_tracking_thread); + return_coordinates = *servo->calcCoordinates(m_core.getElevation(getTimeStamp())); + } + else + { + // We were not tracking, send the servo to the starting position + servo->preset(m_starting_coordinates); + return_coordinates = m_starting_coordinates; + } + + // Calculate the close_time again now that the servos are already moving back to their original position + m_core.m_current_scan.close_time = getTimeStamp() + servo->getTravelTime(ACS::doubleSeq(), return_coordinates); + + // Copy current_scan into last_scan + m_core.m_last_scan = m_core.m_current_scan; + + // Finally unlock the scan capabilities + m_core.m_scan_active.store(Management::MNG_FALSE); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_INFO, "SCAN THREAD STOPPED")); +} + +void SRTMinorServoScanThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoScanThread::runLoop()"); + + if(m_point_time == m_core.m_current_scan.start_time + PROGRAM_TRACK_FUTURE_TIME) // The system should be starting to scan right now + { + m_core.m_scanning.store(Management::MNG_TRUE); + } + else if(m_point_time == m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration + PROGRAM_TRACK_FUTURE_TIME) // The system should have finished to scan right now + { + this->setStopped(); + return; + } + else if(m_point_time > m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration) // All points were sent, we can stop sending but we'll wait for the scan to finish + { + m_point_time += PROGRAM_TRACK_TIMEGAP; + + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((m_point_time - PROGRAM_TRACK_FUTURE_TIME) - getTimeStamp()); + return; + } + + try + { + m_core.checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + + Management::TBoolean elevation_tracking = Management::MNG_FALSE; + + if(m_point_id > 0) + { + if(std::all_of(m_core.m_tracking_servos.begin(), m_core.m_tracking_servos.end(), [this](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo.first != m_core.m_current_scan.servo_name) + { + // Not tracking the elevation and this servo is not involved in the current scan + return true; + } + + bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; + if(!return_value) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_ERROR, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + } + return return_value; + } + else + { + return true; + } + })) + { + // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation + elevation_tracking = Management::MNG_TRUE; + } + else + { + m_error = true; + this->setStopped(); + return; + } + } + + double elevation = m_core.m_current_scan.starting_elevation; + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) // We are in elevation tracking mode + { + try + { + elevation = m_core.getElevation(m_point_time); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getErrorFromEx(ex)) + " Using a fixed elevation of " + std::to_string(elevation) + "° as scan central coordinate!").c_str()); + elevation_tracking = Management::MNG_FALSE; + } + } + + ACSErr::Completion_var comp; + for(const auto& [servo_name, servo] : m_core.m_tracking_servos) + { + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo_name != m_core.m_current_scan.servo_name) + { + // Not tracking the elevation and this servo is not involved in the current scan + continue; + } + + ACS::doubleSeq coordinates = m_starting_coordinates; + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + coordinates = *servo->calcCoordinates(elevation); + } + + if(servo_name == m_core.m_current_scan.servo_name) + { + try + { + // Ask for the offset in the exact m_point_time (we don't want to interpolate or retrieve any value before or after the scan time span) + coordinates[m_core.m_current_scan.axis_index] += m_scan_offsets.get(m_point_time, true).second[0]; + } + catch(...) + { + // No offset found for this point_time, ignore + } + } + + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, coordinates); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + } + } + + m_core.m_elevation_tracking.store(elevation_tracking); + + m_point_id++; + m_point_time += PROGRAM_TRACK_TIMEGAP; + + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((m_point_time - PROGRAM_TRACK_FUTURE_TIME) - getTimeStamp()); +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 21fc71927..70bc288d7 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -1,58 +1,63 @@ #include "SRTMinorServoSetupThread.h" -SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): - ACS::Thread(name, responseTime, sleepTime), +using namespace MinorServo; + +SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), m_core(core) { - m_thread_name = std::string(name.c_str()); - AUTO_TRACE(m_thread_name + "::SRTMinorServoSetupThread()"); + AUTO_TRACE("SRTMinorServoSetupThread::SRTMinorServoSetupThread()"); } SRTMinorServoSetupThread::~SRTMinorServoSetupThread() { - AUTO_TRACE(m_thread_name + "::~SRTMinorServoSetupThread()"); + AUTO_TRACE("SRTMinorServoSetupThread::~SRTMinorServoSetupThread()"); } void SRTMinorServoSetupThread::onStart() { - AUTO_TRACE(m_thread_name + "::onStart()"); + AUTO_TRACE("SRTMinorServoSetupThread::onStart()"); + this->setSleepTime(500000); // 50 milliseconds - m_start_time = CIRATools::getUNIXEpoch(); + m_start_time = IRA::CIRATools::getUNIXEpoch(); - MinorServo::SRTMinorServoFocalConfiguration commanded_configuration = m_core->m_commanded_configuration; - m_LDO_configuration = MinorServo::LDOConfigurationNameTable.left.at(commanded_configuration); - m_gregorian_cover_position = commanded_configuration == MinorServo::CONFIGURATION_PRIMARY ? MinorServo::COVER_STATUS_CLOSED : MinorServo::COVER_STATUS_OPEN; + SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); + m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); + m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_INFO, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); } void SRTMinorServoSetupThread::onStop() { - AUTO_TRACE(m_thread_name + "::onStop()"); + AUTO_TRACE("SRTMinorServoSetupThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_INFO, "SETUP THREAD STOPPED")); } void SRTMinorServoSetupThread::runLoop() { - AUTO_TRACE(m_thread_name + "::runLoop()"); + AUTO_TRACE("SRTMinorServoSetupThread::runLoop()"); try { - m_core->checkControl(); - m_core->checkEmergency(); + m_core.checkLineStatus(); } - catch(MinorServoErrors::StatusErrorExImpl& ex) + catch(MinorServoErrors::StatusErrorEx& ex) { - ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); this->setStopped(); return; } - if(CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) + if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) { - m_core->m_starting = Management::MNG_FALSE; - m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_core->m_subsystem_status = Management::MNG_FAILURE; - ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, "Timeout while performing a setup operation.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Timeout while performing a setup operation.")); + m_core.setFailure(); this->setStopped(); + return; } ACSErr::Completion_var comp; @@ -61,73 +66,165 @@ void SRTMinorServoSetupThread::runLoop() { case 0: // Check if all the servos stopped { - if(std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + if(std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_STOP ? true : false; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; })) { - // Move to phase 1 m_status = 1; } break; } - case 1: // Send the SETUP command + case 1: // Set all the servo offsets to 0 { - if(std::get(m_core->m_socket->sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration))["OUTPUT"]) != "GOOD") + for(const auto& [name, servo] : m_core.m_servos) { - m_core->m_starting = Management::MNG_FALSE; - m_core->m_motion_status = MinorServo::MOTION_STATUS_ERROR; - m_core->m_subsystem_status = Management::MNG_FAILURE; - this->setStopped(); + // Not sure about this + servo->clearSystemOffsets(); + servo->clearUserOffsets(); } - else + + m_status = 2; + break; + } + case 2: // Send the SETUP command + { + try + { + if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration)).checkOutput()) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Received NAK in response to a SETUP command.")); + m_core.setFailure(); + this->setStopped(); + return; + } + else + { + m_status = 3; + } + } + catch(...) { - m_status = 2; + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Communication error while sending a SETUP command.")); + m_core.setFailure(); + this->setStopped(); + return; } break; } - case 2: // Wait for the system to show the commanded configuration + case 3: // Wait for the system to show the commanded configuration { - if(m_core->m_component->current_configuration()->get_sync(comp.out()) == m_core->m_commanded_configuration) + if(m_core.m_component.current_configuration()->get_sync(comp.out()) == m_core.m_commanded_configuration.load()) { - m_status = 3; + m_status = 4; } break; } - case 3: // Wait for the whole system to reach the desired configuration + case 4: // Wait for the whole system to reach the desired configuration { // First we check the status of the gregorian cover - bool completed = m_core->m_component->gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; // Then we cycle through all the servos and make sure their operative mode is SETUP - if(completed && std::all_of(m_core->m_servos.begin(), m_core->m_servos.end(), [](const std::pair& servo) -> bool + if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_SETUP ? true : false; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_SETUP ? true : false; })) { - m_status = 4; + m_status = 5; + } + + break; + } + case 5: // Load the servos coefficients and send a PRESET command + { + for(const auto& [servo_name, servo] : m_core.m_servos) + { + try + { + servo->setup(m_core.m_commanded_setup.c_str()); + } + catch(...) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, ("Error while loading a SETUP to servo'" + servo_name + "'.").c_str())); + m_core.setFailure(); + this->setStopped(); + return; + } + + // This step is necessary because we have _ASACTIVE configurations that have a slightly different position from the commanded one + // Unfortunately, the Leonardo implementation accepts a fixed number of configurations, therefore we share the _ASACTIVE and AS not active configurations for each focal position + if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + try + { + servo->preset(*servo->calcCoordinates(45)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; + } + } } + m_status = 6; break; } - case 4: // Finally load the servos coefficients + case 6: // Wait for the whole system to reach the PRESET configuration { - m_core->m_actual_setup = m_core->m_commanded_setup; + if(std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + { + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PRESET ? true : false; + } + else + { + return true; + } + })) + { + m_status = 7; + } + + break; + } + case 7: // Finally set all the variables values and eventually start the elevation tracking thread + { + m_core.m_actual_setup = m_core.m_commanded_setup; + m_core.m_starting.store(Management::MNG_FALSE); + m_core.m_ready.store(Management::MNG_TRUE); + m_core.m_subsystem_status.store(Management::MNG_OK); - for(const auto& [name, servo] : m_core->m_servos) + if(m_core.m_elevation_tracking_enabled.load() == Management::MNG_TRUE) + { + m_core.m_motion_status.store(MOTION_STATUS_TRACKING); + try + { + m_core.startThread(m_core.m_tracking_thread); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; + } + } + else { - servo->setup(m_core->m_actual_setup.c_str()); + m_core.m_motion_status.store(MOTION_STATUS_CONFIGURED); } - m_core->m_starting = Management::MNG_FALSE; - m_core->m_ready = Management::MNG_TRUE; - m_core->m_subsystem_status = Management::MNG_OK; - m_core->m_motion_status = m_core->m_elevation_tracking_enabled == Management::MNG_TRUE ? MinorServo::MOTION_STATUS_TRACKING : MinorServo::MOTION_STATUS_CONFIGURED; this->setStopped(); break; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp deleted file mode 100644 index d68f74ed6..000000000 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSocket.cpp +++ /dev/null @@ -1,192 +0,0 @@ -#include "SRTMinorServoSocket.h" - -std::mutex SRTMinorServoSocket::c_mutex; - -SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port, double timeout) -{ - std::lock_guard guard(SRTMinorServoSocket::c_mutex); - - if(m_instance != nullptr) - { - if(m_instance->m_address != ip_address && m_instance->m_port != port) - { - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); - impl.addData("Reason", "Socket already open on '" + m_instance->m_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object."); - throw impl; - } - } - else - { - m_instance = new SRTMinorServoSocket(ip_address, port, timeout); - } - return *m_instance; -} - -SRTMinorServoSocket& SRTMinorServoSocket::getInstance() -{ - std::lock_guard guard(SRTMinorServoSocket::c_mutex); - - if(m_instance == nullptr) - { - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); - impl.addData("Reason", "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); - throw impl; - } - return *m_instance; -} - -void SRTMinorServoSocket::destroyInstance() -{ - if(m_instance != nullptr) - { - delete m_instance; - m_instance = nullptr; - } -} - -SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, double timeout) -{ - if(Create(m_error, STREAM) == FAIL) - { - Close(m_error); - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); - impl.addData("Reason", "Cannot create the socket."); - throw impl; - } - - if(Connect(m_error, ip_address.c_str(), port) == FAIL) - { - m_socket_status = TOUT; - Close(m_error); - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); - impl.addData("Reason", "Cannot connect the socket."); - throw impl; - } - - if(setSockMode(m_error, NONBLOCKING) != SUCCESS) - { - m_socket_status = NOTRDY; - Close(m_error); - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); - impl.addData("Reason", "Cannot set the socket to non-blocking."); - throw impl; - } - - m_address = ip_address; - m_port = port; - m_timeout = timeout; -} - -SRTMinorServoSocket::~SRTMinorServoSocket() -{ - std::lock_guard guard(m_mutex); - Close(m_error); -} - -SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) -{ - std::lock_guard guard(m_mutex); - - double start_time = CIRATools::getUNIXEpoch(); - size_t sent_bytes = 0; - - while(sent_bytes < command.size()) - { - size_t sent_now = Send(m_error, command.substr(sent_bytes, command.size() - sent_bytes).c_str(), command.size() - sent_bytes); - sent_bytes += sent_now; - - if(sent_now > 0) - { - // Reset the timer - start_time = CIRATools::getUNIXEpoch(); - } - else if(CIRATools::getUNIXEpoch() - start_time >= m_timeout) - { - m_socket_status = TOUT; - Close(m_error); - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); - impl.addData("Reason", "Timeout when sending command."); - throw impl; - } - } - - start_time = CIRATools::getUNIXEpoch(); - std::string answer; - - while(answer.size() < 2 || !(answer.rfind(CLOSER) == answer.size() - CLOSER.size())) - { - char buf; - if(Receive(m_error, &buf, 1) == 1) - { - answer += buf; - - // Reset the timer - start_time = CIRATools::getUNIXEpoch(); - } - else if(CIRATools::getUNIXEpoch() - start_time >= m_timeout) - { - m_socket_status = TOUT; - Close(m_error); - _EXCPT(ComponentErrors::SocketErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); - impl.addData("Reason", "Timeout when receiving answer."); - throw impl; - } - } - SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); - if(map) - { - map->get() = map_answer; - } - - return map_answer; -} - -SRTMinorServoSocketConfiguration& SRTMinorServoSocketConfiguration::getInstance(maci::ContainerServices* containerServices) -{ - if(m_instance == nullptr) - { - m_instance = new SRTMinorServoSocketConfiguration(containerServices); - } - - return *m_instance; -} - -SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices) -{ - AUTO_TRACE("SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); - - IRA::CString _ip_address; - if(!IRA::CIRATools::getDBValue(containerServices, "IPAddress", _ip_address, CONFIG_DOMAIN, CONFIG_DIRNAME)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); - impl.setFieldName("IPAddress"); - throw impl; - } - m_ip_address = (std::string)_ip_address; - - DWORD port; - if(!IRA::CIRATools::getDBValue(containerServices, "Port", port, CONFIG_DOMAIN, CONFIG_DIRNAME)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); - impl.setFieldName("Port"); - throw impl; - } - else - { - m_port = port; - } - - if(!IRA::CIRATools::getDBValue(containerServices, "SocketTimeout", m_timeout, CONFIG_DOMAIN, CONFIG_DIRNAME)) - { - _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); - impl.setFieldName("SocketTimeout"); - throw impl; - } -} - -SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration() -{ - AUTO_TRACE("SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration()"); - - delete m_instance; -} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp index 6c734306d..86dd1dda4 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -1,47 +1,89 @@ #include "SRTMinorServoStatusThread.h" -SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): - ACS::Thread(name, responseTime, sleepTime), - m_core(core) +using namespace MinorServo; + +SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_sleep_time(this->getSleepTime()), + m_notification_channel(NULL) { - m_thread_name = std::string(name.c_str()); - AUTO_TRACE(m_thread_name + "::SRTMinorServoStatusThread()"); + AUTO_TRACE("SRTMinorServoStatusThread::SRTMinorServoStatusThread()"); } SRTMinorServoStatusThread::~SRTMinorServoStatusThread() { - AUTO_TRACE(m_thread_name + "::~SRTMinorServoStatusThread()"); + AUTO_TRACE("SRTMinorServoStatusThread::~SRTMinorServoStatusThread()"); } void SRTMinorServoStatusThread::onStart() { - AUTO_TRACE(m_thread_name + "::onStart()"); - m_sleep_time = this->getSleepTime(); + AUTO_TRACE("SRTMinorServoStatusThread::onStart()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStart()", (LM_INFO, "STATUS THREAD STARTED")); } void SRTMinorServoStatusThread::onStop() { - AUTO_TRACE(m_thread_name + "::onStop()"); + AUTO_TRACE("SRTMinorServoStatusThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStop()", (LM_INFO, "STATUS THREAD STOPPED")); } void SRTMinorServoStatusThread::runLoop() { - AUTO_TRACE(m_thread_name + "::runLoop()"); + AUTO_TRACE("SRTMinorServoStatusThread::runLoop()"); + + ACS::Time t0 = getTimeStamp(); + unsigned long sleep_time; + + // Update the sleep time in order to not drift away by adding latency + if(m_core.status()) + { + sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + } + else + { + sleep_time = 10000000; + } + + publish(); + this->setSleepTime(sleep_time); +} + +void SRTMinorServoStatusThread::publish() +{ + // TODO: maybe update only when anything changed + MinorServoDataBlock data; TIMEVALUE now; IRA::CIRATools::getTime(now); - ACS::Time time = now.value().value; - ACS::Time next = time + m_sleep_time; + data.timeMark = now.value().value; + data.tracking = m_core.m_tracking.load() == Management::MNG_TRUE; + data.starting = m_core.m_starting.load() == Management::MNG_TRUE; + data.parking = m_core.m_motion_status.load() == MOTION_STATUS_PARKING; + data.parked = m_core.m_motion_status.load() == MOTION_STATUS_PARKED; + data.status = m_core.m_subsystem_status.load(); - m_core->status(); - - for(const auto& [name, servo] : m_core->m_servos) + if(m_notification_channel == NULL) { - servo->status(); + try + { + m_notification_channel = new nc::SimpleSupplier(MINORSERVO_DATA_CHANNEL, &m_core.m_component); + } + catch(...) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoStatusThread::publish()", "cannot access the MinorServoData notification channel!"); + return; + } } - IRA::CIRATools::getTime(now); - time = now.value().value; - ACS::TimeInterval sleep_time = next - time; - this->setSleepTime(std::max(long(sleep_time), long(0))); + try + { + m_notification_channel->publishData(data); + } + catch(ComponentErrors::CORBAProblemEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoStatusThread::publish()", "cannot send MinorServoData over the notification channel!"); + } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 179800db3..0dc91881c 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -1,90 +1,85 @@ #include "SRTMinorServoTrackingThread.h" -SRTMinorServoTrackingThread::SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore* core, const ACS::TimeInterval& responseTime, const ACS::TimeInterval& sleepTime): - ACS::Thread(name, responseTime, sleepTime), - m_core(core) +using namespace MinorServo; + +SRTMinorServoTrackingThread::SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time): + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_error(false) { - m_thread_name = std::string(name.c_str()); - AUTO_TRACE(m_thread_name + "::SRTMinorServoTrackingThread()"); + AUTO_TRACE("SRTMinorServoTrackingThread::SRTMinorServoTrackingThread()"); } SRTMinorServoTrackingThread::~SRTMinorServoTrackingThread() { - AUTO_TRACE(m_thread_name + "::~SRTMinorServoTrackingThread()"); + AUTO_TRACE("SRTMinorServoTrackingThread::~SRTMinorServoTrackingThread()"); } void SRTMinorServoTrackingThread::onStart() { - AUTO_TRACE(m_thread_name + "::onStart()"); - resetTracking(); - m_antennaBoss = Antenna::AntennaBoss::_nil(); + AUTO_TRACE("SRTMinorServoTrackingThread::onStart()"); + + this->setSleepTime(500000); // 50 milliseconds + m_point_id = 0; + m_point_time = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_INFO, "TRACKING THREAD STARTED")); } void SRTMinorServoTrackingThread::onStop() { - AUTO_TRACE(m_thread_name + "::onStop()"); + AUTO_TRACE("SRTMinorServoTrackingThread::onStop()"); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + if(m_error) + { + m_core.setFailure(); + } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_INFO, "TRACKING THREAD STOPPED")); } void SRTMinorServoTrackingThread::runLoop() { - AUTO_TRACE(m_thread_name + "::runLoop()"); + AUTO_TRACE("SRTMinorServoTrackingThread::runLoop()"); try { - m_core->checkControl(); - m_core->checkEmergency(); + m_core.checkLineStatus(); } - catch(MinorServoErrors::StatusErrorExImpl& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - ACS_LOG(LM_FULL_INFO, m_thread_name + "::runLoop()", (LM_ERROR, ex.getData("Reason").c_str())); + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; this->setStopped(); return; } - if(m_core->m_elevation_tracking_enabled == Management::MNG_FALSE) + if(m_core.m_motion_status.load() != MOTION_STATUS_TRACKING) { - // We get here if the tracking was disabled while already tracking, we stop - this->setStopped(); + // System is not ready or is not configured for tracking yet, we wait, even though we should never get here + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", "Waiting for the system to be configured for tracking!"); return; } - if(m_core->m_motion_status != MinorServo::MOTION_STATUS_TRACKING || m_core->m_subsystem_status != Management::MNG_OK) - { - // System is not ready or configured for tracking, reset the tracking - resetTracking(); - return; - } - - if(CORBA::is_nil(m_antennaBoss)) - { - try - { - m_antennaBoss = m_core->m_component->getContainerServices()->getComponent("ANTENNA/Boss"); - } - catch(maciErrType::CannotGetComponentExImpl& ex) - { - _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoTrackingThread::runLoop()", "cannot get the AntennaBoss component!"); - resetTracking(); - return; - } - } + // All checks passed, we have to track + Management::TBoolean elevation_tracking = Management::MNG_FALSE; if(m_point_id == 0) { - m_point_time = CIRATools::getUNIXEpoch() + TRACKING_FUTURE_TIME; - m_trajectory_id = int(m_point_time); + m_point_time = getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME; + m_trajectory_id = (unsigned int)(m_point_time / 1000); } else { - if(std::all_of(m_core->m_tracking_servos.begin(), m_core->m_tracking_servos.end(), [this](const std::pair& servo) -> bool + if(std::all_of(m_core.m_tracking_servos.begin(), m_core.m_tracking_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) { - bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == MinorServo::OPERATIVE_MODE_PROGRAMTRACK ? true : false; + bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; if(!return_value) { - _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str()); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_ERROR, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); } return return_value; } @@ -94,66 +89,53 @@ void SRTMinorServoTrackingThread::runLoop() } })) { - m_core->m_tracking = Management::MNG_TRUE; + // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation + elevation_tracking = Management::MNG_TRUE; } else { - resetTracking(); + m_error = true; + this->setStopped(); return; } } ACSErr::Completion_var comp; - - bool tracking_error = false; - - for(const auto& [servo_name, servo] : m_core->m_tracking_servos) + for(const auto& [servo_name, servo] : m_core.m_tracking_servos) { if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) { + double elevation = 45.0; + try { - servo->programTrack(m_trajectory_id, m_point_id, m_point_id == 0 ? m_point_time : 0, *servo->calcCoordinates(getElevation(m_point_time))); + elevation = m_core.getElevation(m_point_time); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); + elevation_tracking = Management::MNG_FALSE; } - catch(MinorServoErrors::CommunicationErrorExImpl& ex) + + try { - _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo_name + ": received NAK while sending the tracking point!").c_str()); - tracking_error = true; + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, *servo->calcCoordinates(elevation)); } - catch(ComponentErrors::SocketErrorEx& ex) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { - _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoTrackingThread::runLoop()", (servo_name + ": error encountered while sending the tracking point!").c_str()); - tracking_error = true; + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; } } } - if(tracking_error) - { - resetTracking(); - return; - } + m_core.m_elevation_tracking.store(elevation_tracking); m_point_id++; - m_point_time += TRACKING_TIMEGAP; - - unsigned long time_to_sleep = ((m_point_time - TRACKING_FUTURE_TIME) - CIRATools::getUNIXEpoch()) * 10000000; - this->setSleepTime(time_to_sleep); -} - -void SRTMinorServoTrackingThread::resetTracking() -{ - this->setSleepTime(500000); // 50 milliseconds - m_point_id = 0; - m_point_time = 0; - m_core->m_tracking = Management::MNG_FALSE; -} - -double SRTMinorServoTrackingThread::getElevation(double time) -{ - AUTO_TRACE(m_thread_name + "::getElevation()"); + m_point_time += PROGRAM_TRACK_TIMEGAP; - double azimuth, elevation; - m_antennaBoss->getRawCoordinates(CIRATools::UNIXEpoch2ACSTime(time), azimuth, elevation); - return elevation * DR2D; + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((unsigned long)(m_point_time - PROGRAM_TRACK_FUTURE_TIME - getTimeStamp())); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index 4f07f339d..1cd3c98cc 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -1,8 +1,19 @@ #include "SRTMinorServoImpl.h" -using namespace maci; +using namespace MinorServo; -SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : SRTBaseMinorServoImpl(componentName, containerServices) +SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : + SRTBaseMinorServoImpl(componentName, containerServices), + m_tracking_queue(1500, m_virtual_axes), + m_tracking_delta(SRTBaseMinorServoImpl::getMotionConstant(*this, "tracking_delta")), + m_tracking(Management::MNG_FALSE), + m_trajectory_id(0), + m_total_trajectory_points(0), + m_remaining_trajectory_points(0), + m_tracking_ptr(this), + m_trajectory_id_ptr(this), + m_total_trajectory_points_ptr(this), + m_remaining_trajectory_points_ptr(this) { AUTO_TRACE(m_servo_name + "::SRTProgramTrackMinorServoImpl()"); } @@ -12,27 +23,139 @@ SRTProgramTrackMinorServoImpl::~SRTProgramTrackMinorServoImpl() AUTO_TRACE(m_servo_name + "::~SRTProgramTrackMinorServoImpl()"); } -void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, CORBA::Double start_time, const ACS::doubleSeq& virtual_coordinates) +void SRTProgramTrackMinorServoImpl::initialize() +{ + SRTBaseMinorServoImpl::initialize(); + + try + { + m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO>(m_tracking), true); + m_trajectory_id_ptr = new baci::ROlong((m_component_name + ":trajectory_id").c_str(), getComponent(), + new MSGenericDevIO>(m_trajectory_id), true); + m_total_trajectory_points_ptr = new baci::ROlong((m_component_name + ":total_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_total_trajectory_points), true); + m_remaining_trajectory_points_ptr = new baci::ROlong((m_component_name + ":remaining_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_remaining_trajectory_points), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +/////////////////// PUBLIC methods +bool SRTProgramTrackMinorServoImpl::status() +{ + bool status = SRTBaseMinorServoImpl::status(); + + try + { + ACS::Time last_timestamp = m_status.getTimestamp(); + + // The timestamp of the read positions always corresponds to the one we're asking since they both belong to the same STATUS command answer + // The tracking timestamp is interpolated instead + std::vector virtual_positions = m_positions_queue.get(last_timestamp).second; + std::pair> tracking_point = m_tracking_queue.get(last_timestamp); + + m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); + + if(tracking_point.first < last_timestamp) + { + // We are past the last point of the trajectory, we concluded it + m_tracking.store(Management::MNG_FALSE); + m_tracking_queue.clear(); + } + else + { + bool is_tracking = true; + + for(size_t i = 0; i < virtual_positions.size(); i++) + { + if(std::fabs(virtual_positions[i] - tracking_point.second[i]) > m_tracking_delta[i]) + { + is_tracking = false; + break; + } + } + + m_tracking.store(is_tracking ? Management::MNG_TRUE : Management::MNG_FALSE); + } + } + catch(...) + { + // We might get here if m_tracking_queue is empty + // So whenever we just got a new setup or if we are past the last point inside the trajectory + m_tracking.store(Management::MNG_FALSE); // May be redundant but who cares? + } + + return status; +} + +void SRTProgramTrackMinorServoImpl::setup(const char* configuration_name) +{ + SRTBaseMinorServoImpl::setup(configuration_name); + + m_tracking_queue.clear(); + m_total_trajectory_points.store(0); + m_remaining_trajectory_points.store(0); +} + +void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& virtual_coordinates) { AUTO_TRACE("SRTProgramTrackMinorServoImpl::programTrack()"); + checkLineStatus(); + if(virtual_coordinates.length() != m_virtual_axes) { - _EXCPT(MinorServoErrors::TrackingErrorExImpl, impl, (m_servo_name + "::programTrack()").c_str()); - impl.addData("Reason", "Wrong number of values for this servo system!"); - throw impl; + _EXCPT(MinorServoErrors::TrackingErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.addData("Reason", "Wrong number of values for this servo system!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - SRTMinorServoAnswerMap answer = m_socket->sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coordinates, start_time)); + // Read the current servo offsets + ACSErr::Completion_var comp; + ACS::doubleSeq offsets = *virtual_offsets()->get_sync(comp.out()); - if(std::get(answer["OUTPUT"]) != "GOOD") + for(size_t i = 0; i < m_virtual_axes; i++) { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, (m_servo_name + "::programTrack()").c_str()); - impl.setReason("Received NAK in response to a PRESET command!"); - throw impl; + if(coordinates[i] + offsets[i] < m_min[i] || coordinates[i] + offsets[i] > m_max[i]) + { + _EXCPT(MinorServoErrors::TrackingErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.addData("Reason", "Resulting position out of range, check the offsets!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coordinates, point_id > 0 ? 0 : IRA::CIRATools::ACSTime2UNIXEpoch(point_time))).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.setReason("Received NAK in response to a PROGRAMTRACK command!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + m_trajectory_id.store(trajectory_id); + m_total_trajectory_points.store(point_id + 1); + if(point_id == 0) + { + // Clear the tracking queue to avoid interpolation between 2 different trajectories + m_tracking_queue.clear(); + } + m_tracking_queue.put(point_time, coordinates); } + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTProgramTrackMinorServoImpl, m_tracking_ptr, tracking); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_trajectory_id_ptr, trajectory_id); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_total_trajectory_points_ptr, total_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_remaining_trajectory_points_ptr, remaining_trajectory_points); + MACI_DLL_SUPPORT_FUNCTIONS(SRTProgramTrackMinorServoImpl) -- GitLab From c9ab0235b3deb048aad0af8c49c80228eb2f880c Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 14:20:38 +0100 Subject: [PATCH 061/150] Fix #832, added include guard to the file. (#833) Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl --- .../AntennaInterface/idl/EphemGeneratorMACRO_include.idl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl b/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl index 467c4f932..15c6332ec 100644 --- a/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl +++ b/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl @@ -1,3 +1,6 @@ +#ifndef _EPHEMGENERATORMACRO_IDL_ +#define _EPHEMGENERATORMACRO_IDL_ + #include /** @def DEFATTRIBUTES(NAME) @@ -43,3 +46,4 @@ #define ENDDEFATTRIBUTES } +#endif -- GitLab From 31ea9ae3fda174eae8f1a5ff993367f661e26977 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 13:59:45 +0000 Subject: [PATCH 062/150] Fixed CLow configuration for test CDB --- .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 20 +- .../DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml | 15 + .../SRT5GHzReceiver/NoiseMark/NoiseMark.xml | 16 + .../NormalModeSetup/NormalModeSetup.xml | 25 ++ .../Synthesizer/Synthesizer.xml | 10 + .../DataBlock/SRT5GHzReceiver/Taper/Taper.xml | 14 + .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 276 +++++++++--------- .../SRT5GHzReceiver/SRT5GHzReceiver.xml | 10 +- 8 files changed, 231 insertions(+), 155 deletions(-) create mode 100644 SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml create mode 100644 SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml create mode 100644 SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml create mode 100644 SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml create mode 100644 SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index b17f717e8..4f36f2fca 100644 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -1,18 +1,14 @@ - - diff --git a/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml new file mode 100644 index 000000000..9bc79d702 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Feeds/Feeds.xml @@ -0,0 +1,15 @@ + + + + + + 0 + 0.0 + 0.0 + 1.0 + + + \ No newline at end of file diff --git a/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml new file mode 100644 index 000000000..d4e46f443 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NoiseMark/NoiseMark.xml @@ -0,0 +1,16 @@ + + + + +LEFT4200.00.93 +LEFT4900.00.93 +LEFT5600.00.93 + +RIGHT4200.01.02 +RIGHT4900.01.02 +RIGHT5600.01.02 + + \ No newline at end of file diff --git a/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml new file mode 100644 index 000000000..195fc2d65 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/NormalModeSetup/NormalModeSetup.xml @@ -0,0 +1,25 @@ + + + + diff --git a/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml new file mode 100644 index 000000000..b336a520a --- /dev/null +++ b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Synthesizer/Synthesizer.xml @@ -0,0 +1,10 @@ + + + + +8200.016 + + diff --git a/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml new file mode 100644 index 000000000..5e9edf53c --- /dev/null +++ b/SRT/CDB/alma/DataBlock/SRT5GHzReceiver/Taper/Taper.xml @@ -0,0 +1,14 @@ + + + + +4200-8.5 + +4900-12 + +5600-17 + + diff --git a/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index 0e1d3c572..8d78a172f 100644 --- a/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/CDB/alma/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -4,14 +4,14 @@ - 02 - 08 -2011 created Andrea Orlati (a.orlati@ira.inaf.it) --> - - - - + + + alarm_mask="777" + alarm_trigger="1" + alarm_timer_trig="10" + default_timer_trig="10" + min_timer_trig="1" + /> diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml index 8fc0f3bb6..46ecf969d 100644 --- a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml +++ b/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRT5GHzReceiver/SRT5GHzReceiver.xml @@ -4,15 +4,15 @@ - --> -- GitLab From 3cd63bef3a30e72340e38020e8653094b1b7bf07 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 14:00:48 +0000 Subject: [PATCH 063/150] Fixed a couple bugs in SRTMinorServoBoss component --- .../include/SRTMinorServoUtils.h | 17 ++++++----------- .../src/SRTMinorServoStatusThread.cpp | 12 +++++------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h index f3ff3be96..5df5c9eb1 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h @@ -5,6 +5,7 @@ #include #include #include +#include /** * The following templates are useful if you want to check if a given type for the SRTMinorServoAnswerMap is accepted @@ -43,18 +44,12 @@ struct DB_type }; template -T getCDBValue(maci::ContainerServices* container_services, const std::string& field, const std::string& component="") -{ - return getCDBValue(container_services, field.c_str(), component.c_str()); -} - -template -T getCDBValue(maci::ContainerServices* container_services, const char* field, const char* component="") +T getCDBValue(maci::ContainerServices* container_services, const std::string& field, const std::string component = "") { using C = typename DB_type::type; C temp; - if(IRA::CIRATools::getDBValue(container_services, field, temp, "alma/", component)) + if(IRA::CIRATools::getDBValue(container_services, field.c_str(), temp, "alma/", component.c_str())) { if constexpr(std::is_same_v>) { @@ -71,13 +66,13 @@ T getCDBValue(maci::ContainerServices* container_services, const char* field, co catch(std::invalid_argument& ia) { _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); - ex.setFieldName(field); + ex.setFieldName(field.c_str()); throw ex.getComponentErrorsEx(); } catch(std::out_of_range& oor) { _EXCPT(ComponentErrors::ValueOutofRangeExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); - ex.setValueName(field); + ex.setValueName(field.c_str()); ex.setValueLimit(token.find('-') == std::string::npos ? std::numeric_limits::max() : std::numeric_limits::min()); throw ex.getComponentErrorsEx(); } @@ -98,7 +93,7 @@ T getCDBValue(maci::ContainerServices* container_services, const char* field, co else { _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); - ex.setFieldName(field); + ex.setFieldName(field.c_str()); throw ex.getComponentErrorsEx(); // Maybe throw the plain ex } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp index 86dd1dda4..07a9437c9 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -35,17 +35,15 @@ void SRTMinorServoStatusThread::runLoop() AUTO_TRACE("SRTMinorServoStatusThread::runLoop()"); ACS::Time t0 = getTimeStamp(); - unsigned long sleep_time; + unsigned long sleep_time = 10000000; - // Update the sleep time in order to not drift away by adding latency - if(m_core.status()) + // Check the status only if the properties are already being monitored by the Boss component. + // This is necessary since this thread might start before the start of the properties monitoring. + if(m_core.m_component.isPropertiesMonitoringActive() && m_core.status()) { + // Update the sleep time in order to not drift away by adding latency sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); } - else - { - sleep_time = 10000000; - } publish(); -- GitLab From c01c966f755e70257fec4e4efb07118a9ae2306e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 14:04:13 +0000 Subject: [PATCH 064/150] Updated procedures in order to use new minor servos --- .../StationProcedures/StationProcedures.xml | 38 +++++++++++-------- .../StationProcedures/StationProcedures.xml | 35 ++++++++--------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index b6d47acd7..4d86ea178 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -6,7 +6,7 @@ antennaSetup=CCB - servoSetup=CCB + servoSetup=CCB receiversSetup=CCB chooseBackend=TotalPower initialize=CCB @@ -19,16 +19,22 @@ + antennaSetup=CCG + servoSetup=CCG receiversSetup=CCG chooseBackend=TotalPower + initialize=CCG + device=0 calOff + restFrequency=0 + azelOffsets=0d,0d antennaSetup=KKG - servoSetup=KKG + servoSetup=KKG receiversSetup=KKG receiversMode=SINGLEDISH chooseBackend=TotalPower @@ -43,7 +49,7 @@ antennaSetup=LP - servoSetup=LLP + servoSetup=LLP receiversSetup=LLP receiversMode=XXC4 chooseBackend=TotalPower @@ -58,7 +64,7 @@ antennaSetup=LP - servoSetup=PPP + servoSetup=PPP receiversSetup=PPP receiversMode=C3XX chooseBackend=TotalPower @@ -73,7 +79,7 @@ antennaSetup=LP - servoSetup=PLP + servoSetup=PLP receiversSetup=PLP receiversMode=C3C4 chooseBackend=TotalPower @@ -88,28 +94,28 @@ antennaSetup=XB - servoSetup=XB + servoSetup=XB receiversSetup=CCB chooseBackend=TotalPower initialize=XB device=0 restFrequency=0 - setLO=7500 + setLO=7500 azelOffsets=0d,0d - antennaSetup=LP - servoSetup=SSP - receiversSetup=CCB - chooseBackend=TotalPower - initialize=PPP - device=0 - calOff - restFrequency=0 - azelOffsets=0d,0d + antennaSetup=LP + servoSetup=SSP + receiversSetup=CCB + chooseBackend=TotalPower + initialize=PPP + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 39b02cfa4..4d86ea178 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -6,7 +6,7 @@ antennaSetup=CCB - servoSetup=CCB + servoSetup=CCB receiversSetup=CCB chooseBackend=TotalPower initialize=CCB @@ -19,8 +19,9 @@ - receiversSetup=CCG antennaSetup=CCG + servoSetup=CCG + receiversSetup=CCG chooseBackend=TotalPower initialize=CCG device=0 @@ -33,7 +34,7 @@ antennaSetup=KKG - servoSetup=KKG + servoSetup=KKG receiversSetup=KKG receiversMode=SINGLEDISH chooseBackend=TotalPower @@ -48,7 +49,7 @@ antennaSetup=LP - servoSetup=LLP + servoSetup=LLP receiversSetup=LLP receiversMode=XXC4 chooseBackend=TotalPower @@ -63,7 +64,7 @@ antennaSetup=LP - servoSetup=PPP + servoSetup=PPP receiversSetup=PPP receiversMode=C3XX chooseBackend=TotalPower @@ -78,7 +79,7 @@ antennaSetup=LP - servoSetup=PLP + servoSetup=PLP receiversSetup=PLP receiversMode=C3C4 chooseBackend=TotalPower @@ -93,28 +94,28 @@ antennaSetup=XB - servoSetup=XB + servoSetup=XB receiversSetup=CCB chooseBackend=TotalPower initialize=XB device=0 restFrequency=0 - setLO=7500 + setLO=7500 azelOffsets=0d,0d - antennaSetup=LP - servoSetup=SSP - receiversSetup=CCB - chooseBackend=TotalPower - initialize=PPP - device=0 - calOff - restFrequency=0 - azelOffsets=0d,0d + antennaSetup=LP + servoSetup=SSP + receiversSetup=CCB + chooseBackend=TotalPower + initialize=PPP + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d -- GitLab From e86bcc0db1d6c145af678f515da13d2b7ecf565e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 19:28:03 +0000 Subject: [PATCH 065/150] Added missing CCG PointModel for SRT test CDB. --- .../DataBlock/PointingModel/PointingModel.xml | 148 ++++++++++-------- 1 file changed, 87 insertions(+), 61 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index f05570265..b1cf45978 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -1,30 +1,22 @@ - - - - - + + CCB 90.0 - 1 -2.3029563427 + 1 -2.2957174778 0 0.0 - 1 -0.0102762356 - 1 -0.0050985431 - 1 -0.0008867322 - 1 -0.0019946923 - 1 0.0873332769 - 1 0.0871561393 + 1 -0.0068070539 + 1 -0.0016828823 + 1 -0.0009974039 + 1 -0.0006166724 + 1 0.0852021798 + 1 0.0925736725 0 0.0 0 0.0 - 1 0.0115426397 + 1 0.0148610147 0 0 - 1 0.0020223276 - 1 0.0008122203 + 1 0.0005418550 + 1 -0.0000714987 0 0 0 0 0 0 @@ -45,37 +37,37 @@ KKG - 90.0 - 1 -2.2964186668 - 1 0.0 - 1 -0.0061030770 - 1 -0.0035287447 - 1 -0.0014408963 - 1 -0.0017973853 - 1 0.0719125122 - 1 0.0925239921 - 0 0 - 0 0 - 1 0.0128885703 - 0 0.0 - 1 0.0006690503 - 1 0.0000107827 - 0 0.0 - 0 0.0 - 0 0.0 - 0 0.0 - 0 0.0 - 0 0.0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 90.0 + 1 -2.2964186668 + 1 0.0 + 1 -0.0061030770 + 1 -0.0035287447 + 1 -0.0014408963 + 1 -0.0017973853 + 1 0.0719125122 + 1 0.0925239921 + 0 0 + 0 0 + 1 0.0128885703 + 0 0.0 + 1 0.0006690503 + 1 0.0000107827 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 + 0 0 @@ -115,21 +107,55 @@ XB + 90.0000 + 1 -2.2955527306 + 0 0.0000000000 + 1 -0.0027078437 + 1 0.0173532944 + 1 -0.0008693041 + 1 -0.0019183123 + 1 0.1030814573 + 1 0.0856014490 + 0 0.0000000000 + 0 0.0000000000 + 1 0.0087973252 + 0 0.0000000000 + 1 0.0003481323 + 1 0.0001999680 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + 0 0.0000000000 + + + CCG 90.0 - 1 -2.3029563427 + 1 -2.2881932258 0 0.0 - 1 -0.0102762356 - 1 -0.0050985431 - 1 -0.0008867322 - 1 -0.0019946923 - 1 0.0873332769 - 1 0.0871561393 + 1 -0.0040601296 + 1 0.0014384996 + 1 -0.0003379379 + 1 -0.0015144897 + 1 0.2964673936 + 1 -0.1382924467 0 0.0 0 0.0 - 1 0.0115426397 + 1 -0.0023407035 0 0 - 1 0.0020223276 - 1 0.0008122203 + 1 0.0002931280 + 1 -0.0004088043 0 0 0 0 0 0 -- GitLab From 03a424b11792c7cfee40e62a9be2011293013374 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 19:50:06 +0000 Subject: [PATCH 066/150] Fixes STOW command for the gregorian cover --- SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index efda46e6b..cb1752543 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -324,8 +324,8 @@ void SRTMinorServoBossCore::park() try { - // Send the STOW command to the gregorian cover - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2)).checkOutput()) + // Send the STOW command to close the gregorian cover + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 1)).checkOutput()) { _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); -- GitLab From a71887f3d9ace6b2a674cdac52f1b7a279fe5f32 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 14 Feb 2024 21:03:29 +0000 Subject: [PATCH 067/150] Minor improvement on the MS motion status DevIO --- SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 31 +++++++++++++++++-- .../src/SRTMinorServoBossImpl.cpp | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index a554c6357..a5fb819e5 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -7,6 +7,7 @@ */ #include "SRTMinorServoCommon.h" +#include "SRTMinorServoContainers.h" #include #include #include @@ -64,9 +65,16 @@ namespace MinorServo /** * Constructor. * @param motion_status the atomic status of the motion of the minor servo system. - * @param answer_map the SRTMinorServoAnswerMap containing the status of the system. It is used to read the position of the gregorian cover. + * @param answer_map a reference to the SRTMinorServoAnswerMap object containing the status of the system. It is used to read the position of the gregorian cover. + * @param scanning a reference to the TBoolean indicating whether the system is scanning or not. + * @param current_scan a reference to the SRTMinorServoScan object containing the parameters for the current scan. It is used to read the servo name and axis involved in the scan. */ - MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoAnswerMap& answer_map) : m_motion_status(motion_status), m_answer_map(answer_map) {} + MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoAnswerMap& answer_map, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : + m_motion_status(motion_status), + m_answer_map(answer_map), + m_scanning(scanning), + m_current_scan(current_scan) + {} /** * Returns the property value. @@ -97,7 +105,14 @@ namespace MinorServo } case MOTION_STATUS_TRACKING: { - motion_status = "Elevation Track Mode"; + if(m_scanning.load() == Management::MNG_FALSE) + { + motion_status = "Elevation Track Mode"; + } + else + { + motion_status = "Scanning along " + m_current_scan.servo_name + " " + m_current_scan.axis_name + " axis"; + } break; } case MOTION_STATUS_PARKING: @@ -149,6 +164,16 @@ namespace MinorServo * Reference to the SRTMinorServoAnswerMap object of the Boss. */ const SRTMinorServoAnswerMap& m_answer_map; + + /** + * Reference to the boolean telling if the system is scanning. + */ + const std::atomic& m_scanning; + + /** + * Reference to the SRTMinorServoScan object of the Boss. + */ + const SRTMinorServoScan& m_current_scan; }; /** diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 34d92da5a..3cf8143be 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -56,7 +56,7 @@ void SRTMinorServoBossImpl::initialize() m_actual_setup_ptr = new baci::ROstring((m_component_name + ":actualSetup").c_str(), getComponent(), new MSGenericDevIO(m_core.m_actual_setup), true); m_motion_info_ptr = new baci::ROstring((m_component_name + ":motionInfo").c_str(), getComponent(), - new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status), true); + new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status, m_core.m_scanning, m_core.m_current_scan), true); m_starting_ptr = new ROEnumImpl((m_component_name + ":starting").c_str(), getComponent(), new MSGenericDevIO>(m_core.m_starting), true); m_as_configuration_ptr = new ROEnumImpl((m_component_name + ":asConfiguration").c_str(), getComponent(), -- GitLab From fca2b4a366d87f44b5ff2079f7851c7f1b68fb9c Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 15 Feb 2024 19:35:18 +0000 Subject: [PATCH 068/150] Fix #834, avoided Leonardo Minor Servo SETUP command --- .../src/SRTMinorServoBossCore.cpp | 2 +- .../src/SRTMinorServoSetupThread.cpp | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index cb1752543..1c9ca5eee 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -492,7 +492,7 @@ void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_INFO, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", position == "OPEN" ? 1 : 2)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) { _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 70bc288d7..4a2354755 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -86,10 +86,24 @@ void SRTMinorServoSetupThread::runLoop() servo->clearUserOffsets(); } - m_status = 2; + //m_status = 2; + m_status = 100; break; } - case 2: // Send the SETUP command + case 100: // Send the STOW command to the gregorian cover + { + if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", m_gregorian_cover_position)).checkOutput()) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Received NAK when setting the gregorian cover position.")); + m_core.setFailure(); + this->setStopped(); + return; + } + + m_status = 5; + break; + } + /*case 2: // Send the SETUP command { try { @@ -140,7 +154,7 @@ void SRTMinorServoSetupThread::runLoop() } break; - } + }*/ case 5: // Load the servos coefficients and send a PRESET command { for(const auto& [servo_name, servo] : m_core.m_servos) @@ -180,7 +194,10 @@ void SRTMinorServoSetupThread::runLoop() } case 6: // Wait for the whole system to reach the PRESET configuration { - if(std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool + // First we check the status of the gregorian cover + bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + + if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) -- GitLab From 67561bd14420fb3efa16ee8c1144bf7255425a44 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 15 Feb 2024 19:44:42 +0000 Subject: [PATCH 069/150] Updated CDBs, getting ready for production --- .../MinorServoBossContainer.xml | 27 -- .../CalibrationTool/CalibrationTool.xml | 2 +- .../alma/MANAGEMENT/FitsZilla/FitsZilla.xml | 2 +- SRT/CDB/alma/MANAGEMENT/Point/Point.xml | 2 +- .../MACI/Components/MINORSERVO/Boss/Boss.xml | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 7 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 5 +- .../MACI/Components/MINORSERVO/PFP/PFP.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/SRP.xml | 8 +- .../MinorServoBossContainer.xml | 31 -- .../GFR/LookupTables/LookupTables.xml | 32 ++ .../MinorServo/GFR/Properties/Properties.xml | 24 ++ .../M3R/LookupTables/LookupTables.xml | 18 + .../MinorServo/M3R/Properties/Properties.xml | 24 ++ .../PFP/LookupTables/LookupTables.xml | 33 ++ .../MinorServo/PFP/Properties/Properties.xml | 36 ++ .../SRP/LookupTables/LookupTables.xml | 125 ++++++ .../MinorServo/SRP/Properties/Properties.xml | 47 +++ .../CalibrationTool/CalibrationTool.xml | 2 +- .../alma/MANAGEMENT/FitsZilla/FitsZilla.xml | 2 +- .../CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- .../CDB/alma/MANAGEMENT/Point/Point.xml | 2 +- .../CDB/alma/MINORSERVO/Boss/Boss.xml | 206 ++-------- .../CDB/alma/MINORSERVO/GFR/GFR.xml | 373 ++--------------- .../CDB/alma/MINORSERVO/M3R/M3R.xml | 374 ++--------------- .../CDB/alma/MINORSERVO/PFP/PFP.xml | 380 ++--------------- .../CDB/alma/MINORSERVO/SRP/SRP.xml | 381 ++---------------- .../CDB/alma/MINORSERVO/Socket/Socket.xml | 12 + 28 files changed, 506 insertions(+), 1664 deletions(-) delete mode 100644 SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml delete mode 100644 SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml diff --git a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml b/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml deleted file mode 100644 index 508635633..000000000 --- a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - diff --git a/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml b/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml index 221b861fd..c4ab33015 100644 --- a/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml +++ b/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="1" diff --git a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml index a40bd6376..df04e8a0e 100644 --- a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml +++ b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml @@ -20,7 +20,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" MeteoInstance="WEATHERSTATION/WeatherStation" > diff --git a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml index b067e56eb..02eb3b0a2 100644 --- a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml +++ b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/SRTMinorServo/SRTMinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="0" diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml index 2705230c3..b7a0bfd41 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Boss" - Code="MinorServoBossImpl" + Code="SRTMinorServoBossImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/MinorServoBoss:1.0" - Container="MinorServoBossContainer" - Default="true" - + Type="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" + Container="MinorServoContainer" + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index ed2c44f77..23da6db86 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="GFR" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 8a01ba209..94efe94c9 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="M3R" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" Default="true" - /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index d75a83d75..a5801b66d 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -6,9 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="PFP" - Code="WPServoImpl" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" Default="true" diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index 4534c3d82..b957480d6 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -5,11 +5,11 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="SRP" - Code="WPServoImpl" + Name="SRP" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml b/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml deleted file mode 100644 index 64fcda240..000000000 --- a/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml new file mode 100644 index 000000000..00e681dfa --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -0,0 +1,32 @@ + + + + + + ROTATION -88.70659 + ROTATION -88.70659 + ROTATION -159.8899 + ROTATION -159.8899 + ROTATION 90.971610 + ROTATION 90.971610 + ROTATION 162.771 + ROTATION 162.771 + ROTATION 55.373967 + ROTATION 55.373967 + ROTATION -51.821170 + ROTATION -51.821170 + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml new file mode 100644 index 000000000..fccec0b0f --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -0,0 +1,18 @@ + + + + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..086b3785b --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml @@ -0,0 +1,33 @@ + + + + + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml new file mode 100644 index 000000000..688491e30 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -0,0 +1,36 @@ + + + + + + X_ENABLED + Z_MASTER_ENABLED + Z_SLAVE_ENABLED + THETA_MASTER_ENABLED + THETA_SLAVE_ENABLED + + ELONG_X + ELONG_Z_MASTER + ELONG_Z_SLAVE + ELONG_THETA_MASTER + ELONG_THETA_SLAVE + + TX + TZ + RTHETA + + mm + mm + degree + + OFFSET_TX + OFFSET_TZ + OFFSET_RTHETA + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..6869a5c77 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -0,0 +1,125 @@ + + + + + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml new file mode 100644 index 000000000..165d5198f --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -0,0 +1,47 @@ + + + + + + Z1_ENABLED + Z2_ENABLED + Z3_ENABLED + Y1_ENABLED + Y2_ENABLED + X1_ENABLED + + ELONG_Z1 + ELONG_Z2 + ELONG_Z3 + ELONG_Y1 + ELONG_Y2 + ELONG_X1 + + TX + TY + TZ + RX + RY + RZ + + mm + mm + mm + degree + degree + degree + + OFFSET_TX + OFFSET_TY + OFFSET_TZ + OFFSET_RX + OFFSET_RY + OFFSET_RZ + diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml index d18bf0948..43a777280 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="1" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml index 66f145487..f139a84fc 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml @@ -20,7 +20,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" MeteoInstance="WEATHERSTATION/WeatherStation" > diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 3b8c89f50..eb9ea73b8 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -23,7 +23,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" ActiveSurfaceBossInterface="IDL:alma/ActiveSurface/SRTActiveSurfaceBoss:1.0" CustomLoggerInterface="IDL:alma/Management/CustomLogger:1.0" WeatherStationInstance="IDL:alma/Weather/GenericWeatherStation:1.0" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml index 88c537650..02eb3b0a2 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="0" diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml index ac992a0c5..4dab29cf9 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -1,197 +1,37 @@ - - - - - LLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm)= (-46.2); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PPP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - HHP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.72); TX(mm) = (1312.0); TZ(mm) = (-40.0); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - XKP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (-1060); TZ(mm) = (-45.9); - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - - slaves="GFR, M3R, PFP, SRP" -> - - + + - + - + - - - - - - + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml index 9535f226d..75f01dc18 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -1,356 +1,33 @@ - - - - - - - - - - - + physical_axes="2" + virtual_axes="1" + max_speed="3.5" + acceleration="2" + min_range="-166" + max_range="168.5"> - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml index cd650b487..83ebde14b 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -1,357 +1,33 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="1" - number_of_slaves="3" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="3" - zero="0" - park_position="0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-945, 945)" -> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml index c5f176b8a..064ca71d1 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -1,358 +1,38 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="3" - number_of_slaves="5" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="0" - zero="0" - park_position="2730.15,0,-195" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-34.0, 2740); (-1480, 1480); (-199, 40)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index 90a39717c..fcb93eec9 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -1,359 +1,38 @@ - - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="6" - number_of_slaves="7" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="1" - zero="1570.00" - park_position="-5,5,-125,0,0,0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "1" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-50, 50); (-110, 110); (-110, 110); (-0.25, 0.25); (-0.25, 0.25); (-0.25, 0.25)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml new file mode 100644 index 000000000..c7d721bd0 --- /dev/null +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -0,0 +1,12 @@ + + + + -- GitLab From d51e77851629f975bfd970398af979530642b18f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 16 Feb 2024 13:32:06 +0000 Subject: [PATCH 070/150] Updates for SRTMinorServos --- .../idl/SRTMinorServo.idl | 6 ++ .../include/SRTMinorServoBossCore.h | 6 ++ .../SRTMinorServo/include/SRTMinorServoImpl.h | 14 ++--- .../include/SRTMinorServoStatusThread.h | 5 ++ .../src/SRTBaseMinorServoImpl.cpp | 62 +++++++++---------- .../src/SRTMinorServoBossCore.cpp | 10 +++ .../src/SRTMinorServoParkThread.cpp | 5 +- .../src/SRTMinorServoSetupThread.cpp | 4 +- .../src/SRTMinorServoStatusThread.cpp | 38 +++++++++--- SRT/Servers/SRTMinorServo/src/_cover.py | 42 +++++++++++++ 10 files changed, 140 insertions(+), 52 deletions(-) create mode 100644 SRT/Servers/SRTMinorServo/src/_cover.py diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index fecbb9d28..93b9ebc9d 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -178,6 +178,12 @@ module MinorServo */ void clearSystemOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + /** + * This method resets the Leonardo offsets to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void reloadOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + /** * This method returns in the two parameters passed as reference, the names and the units of measure of the axes of the servo, respectively * @param axes_names the sequence of strings containing the names of the virtual axes of the servo diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index b64e65ed6..73ea3c816 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -382,6 +382,12 @@ private: */ std::atomic m_tracking; + /** + * This boolean will be set to true every time the socket connects. + * When true it will trigger a procedure that will check if the minor servos offsets need to be reloaded because of a discrepancy between the DISCOS offsets (user + system) and the Leonardo offsets. + */ + bool m_reload_servo_offsets; + /** * Configuration of the socket object. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index a09cb6409..204354bcf 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -158,6 +158,12 @@ public: */ void clearSystemOffsets(); + /** + * Reload the user and the system offsets to the minor servo when the Leonardo offsets do not correspond to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void reloadOffsets(); + /** * Returns the name and the unit of each virtual axes of the servo system, as reference arguments. * @param axes_names_out a string sequence object containing the names of the virtual axes of the servo system. @@ -291,13 +297,6 @@ protected: static std::vector getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant); private: - /** - * Resets both the user and the system offsets to 0. This is needed since the Leonardo servo system only tracks a single set of offsets. - * If we lose track of the offsets inside DISCOS (when restarting this component, for example), we need to reset the offsets in order to track them again. - * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. - */ - void resetOffsets(); - /** * Static function used to retrieve a table from the CDB DataBlock directory. Used inside the initialization list. * @param object the instance of this class, used inside the function logic. @@ -513,6 +512,7 @@ protected: ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }\ void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }\ void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }\ + void reloadOffsets() { SRTBaseMinorServoImpl::reloadOffsets(); }\ void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { SRTBaseMinorServoImpl::getAxesInfo(axes_names_out, axes_units_out); }\ ACS::doubleSeq* getAxesPositions(ACS::Time acs_time) { return SRTBaseMinorServoImpl::getAxesPositions(acs_time); }\ long getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest) { return SRTBaseMinorServoImpl::getTravelTime(start, dest); }\ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h index b5e55b96a..7a14305e3 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -67,6 +67,11 @@ private: */ SRTMinorServoBossCore& m_core; + /** + * The current status of the finite-state machine. + */ + unsigned int m_status; + /** * The sleeping time of the thread. * The thread should be cycling at a constant rate, therefore the inner sleeping time is always updated taking into account this and the thread execution time. diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 81c92b42a..5b4d59f05 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -129,10 +129,6 @@ bool SRTBaseMinorServoImpl::status() { m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); - // We need to call this here since we might just have established the connection, therefore we might not know how the Leonardo offsets are split between user and system - // This might eventually throw MinorServoErrorsEx - resetOffsets(); - ACSErr::Completion_var comp; ACS::doubleSeq current_point = *virtual_positions()->get_sync(comp.out()); @@ -491,6 +487,35 @@ void SRTBaseMinorServoImpl::clearSystemOffsets() } } +void SRTBaseMinorServoImpl::reloadOffsets() +{ + AUTO_TRACE(m_servo_name + "::reloadOffsets()"); + + // Sum the user and system DISCOS offsets to check whether they correspond to the Leonardo offsets + std::vector DISCOS_offsets(m_virtual_axes, 0.0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); + + // Read the Leonardo offsets + ACSErr::Completion_var comp; + ACS::doubleSeq sequence = *virtual_offsets()->get_sync(comp.out()); + std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); + + // Check if the offsets correspond or not + if(!std::equal(DISCOS_offsets.begin(), DISCOS_offsets.end(), LEONARDO_offsets.begin())) + { + // Offsets do not correspond, should reset them by sending a offset command + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, DISCOS_offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::reloadOffsets()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, m_servo_name + "::reloadOffsets()", (LM_INFO, "Offsets discrepancy, reload")); + } +} + void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { AUTO_TRACE("SRTBaseMinorServoImpl::getAxesInfo()"); @@ -703,35 +728,6 @@ std::vector SRTBaseMinorServoImpl::getMotionConstant(SRTBaseMinorServoIm } /////////////////// PRIVATE methods -void SRTBaseMinorServoImpl::resetOffsets() -{ - AUTO_TRACE(m_servo_name + "::resetOffsets()"); - - // Sum the user and system DISCOS offsets to check whether they correspond to the Leonardo offsets - std::vector DISCOS_offsets(m_virtual_axes, 0.0); - std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); - - // Read the Leonardo offsets - ACSErr::Completion_var comp; - ACS::doubleSeq sequence = *virtual_offsets()->get_sync(comp.out()); - std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); - - // Check if the offsets correspond or not - if(!std::equal(DISCOS_offsets.begin(), DISCOS_offsets.end(), LEONARDO_offsets.begin())) - { - // Offsets do not correspond, should reset them by sending a offset command - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, DISCOS_offsets)).checkOutput()) - { - _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::resetOffsets()").c_str()); - ex.setReason("Received NAK in response to an OFFSET command."); - ex.log(LM_DEBUG); - throw ex.getMinorServoErrorsEx(); - } - - ACS_LOG(LM_FULL_INFO, m_servo_name + "::resetOffsets()", (LM_INFO, "Offsets discrepancy, reset")); - } -} - std::vector SRTBaseMinorServoImpl::getPropertiesTable(SRTBaseMinorServoImpl& object, const std::string& properties_name) { AUTO_STATIC_TRACE(object.m_servo_name + "::getPropertiesTable()"); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 1c9ca5eee..3c3e30375 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -24,6 +24,7 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_scan_active(Management::MNG_FALSE), m_scanning(Management::MNG_FALSE), m_tracking(Management::MNG_FALSE), + m_reload_servo_offsets(true), m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(m_component.getContainerServices())), m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)), m_socket_connected(m_socket.isConnected() ? Management::MNG_TRUE : Management::MNG_FALSE), @@ -82,6 +83,8 @@ bool SRTMinorServoBossCore::status() stopThread(m_tracking_thread); stopThread(m_scan_thread); setFailure(); + + m_reload_servo_offsets = true; } return false; @@ -120,8 +123,15 @@ bool SRTMinorServoBossCore::status() setFailure(); return false; } + + if(m_reload_servo_offsets) + { + servo->reloadOffsets(); + } } + m_reload_servo_offsets = false; + if(motion_status == MOTION_STATUS_TRACKING) { if(std::all_of(m_tracking_servos.begin(), m_tracking_servos.end(), [](const std::pair& servo) -> bool diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 63177b410..177478169 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -4,7 +4,8 @@ using namespace MinorServo; SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), - m_core(core) + m_core(core), + m_status(0) { AUTO_TRACE("SRTMinorServoParkThread::SRTMinorServoParkThread()"); } @@ -20,8 +21,6 @@ void SRTMinorServoParkThread::onStart() this->setSleepTime(500000); // 50 milliseconds m_start_time = IRA::CIRATools::getUNIXEpoch(); - m_status = 0; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_INFO, "PARK THREAD STARTED")); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 4a2354755..162cda8aa 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -4,7 +4,8 @@ using namespace MinorServo; SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), - m_core(core) + m_core(core), + m_status(0) { AUTO_TRACE("SRTMinorServoSetupThread::SRTMinorServoSetupThread()"); } @@ -24,7 +25,6 @@ void SRTMinorServoSetupThread::onStart() SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; - m_status = 0; ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_INFO, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp index 07a9437c9..4fbf459ed 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -5,8 +5,9 @@ using namespace MinorServo; SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), m_core(core), + m_status(0), m_sleep_time(this->getSleepTime()), - m_notification_channel(NULL) + m_notification_channel(nullptr) { AUTO_TRACE("SRTMinorServoStatusThread::SRTMinorServoStatusThread()"); } @@ -27,6 +28,12 @@ void SRTMinorServoStatusThread::onStop() { AUTO_TRACE("SRTMinorServoStatusThread::onStop()"); + if(m_notification_channel != nullptr) + { + m_notification_channel->disconnect(); + m_notification_channel = nullptr; + } + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStop()", (LM_INFO, "STATUS THREAD STOPPED")); } @@ -37,12 +44,29 @@ void SRTMinorServoStatusThread::runLoop() ACS::Time t0 = getTimeStamp(); unsigned long sleep_time = 10000000; - // Check the status only if the properties are already being monitored by the Boss component. - // This is necessary since this thread might start before the start of the properties monitoring. - if(m_core.m_component.isPropertiesMonitoringActive() && m_core.status()) + switch(m_status) { - // Update the sleep time in order to not drift away by adding latency - sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + case 0: + { + // Wait for the properties to be monitored by the Boss component. + // This is necessary since this thread might start before the start of the properties monitoring. + if(m_core.m_component.isPropertiesMonitoringActive()) + { + m_status = 1; + } + + break; + } + case 1: + { + if(m_core.status()) + { + // Update the sleep time in order to not drift away by adding latency + sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + } + + break; + } } publish(); @@ -63,7 +87,7 @@ void SRTMinorServoStatusThread::publish() data.parked = m_core.m_motion_status.load() == MOTION_STATUS_PARKED; data.status = m_core.m_subsystem_status.load(); - if(m_notification_channel == NULL) + if(m_notification_channel == nullptr) { try { diff --git a/SRT/Servers/SRTMinorServo/src/_cover.py b/SRT/Servers/SRTMinorServo/src/_cover.py new file mode 100644 index 000000000..add318233 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/_cover.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# This is a python script that can be used to set the gregorian cover position +# who when what +# Giuseppe Carboni(giuseppe.carboni@inaf.it) 21/01/2024 Creation + +from Acspy.Clients.SimpleClient import PySimpleClient +import ACSLog +import maciErrType +import maciErrTypeImpl +import ClientErrorsImpl +import MinorServoErrors +import ManagementErrorsImpl +import sys +from SimpleParserPy import add_user_message + +def main(): + compName = 'MINORSERVO/Boss' + + simpleClient = PySimpleClient() + + try: + component = simpleClient.getComponent(compName) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName(compName) + add_user_message(newEx, 'MinorServoBoss not ready or not properly configured') + simpleClient.disconnect() + sys.exit(1) + + try: + inputs = component.setGregorianCoverPosition(sys.argv[1]) + except MinorServoErrors.MinorServoErrorsEx as ex: + newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) + newEx.setReason('MinorServoBoss gregorian cover position') + add_user_message(newEx, 'Unable to set the gregorian cover position') + simpleClient.disconnect() + sys.exit(1) + + +if __name__ == "__main__": + main() -- GitLab From 37bcad5e6211d424426751371ed4881c03a1e5b3 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 16 Feb 2024 18:10:04 +0000 Subject: [PATCH 071/150] Updated SRTMinorServo setup and park procedures --- .../src/SRTMinorServoBossCore.cpp | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 3c3e30375..d71455e7b 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -242,21 +242,21 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) m_tracking.store(Management::MNG_FALSE); m_motion_status.store(MOTION_STATUS_STARTING); - try + // Send the STOP command to each servo + for(const auto& [servo_name, servo] : m_servos) { - // Send the STOP command to each servo - for(const auto& [servo_name, servo] : m_servos) + try { servo->stop(); } - } - catch(MinorServoErrors::MinorServoErrorsEx& mse) - { - _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); - ex.setSubsystem("MinorServo"); - ex.setReason("Error while sending the STOP command to a minor servo system."); - ex.log(LM_DEBUG); - throw ex.getConfigurationErrorEx(); + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Error while sending the STOP command to " + servo_name + ".").c_str()); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } } // Start the setup thread @@ -335,7 +335,7 @@ void SRTMinorServoBossCore::park() try { // Send the STOW command to close the gregorian cover - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 1)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", COVER_STATUS_CLOSED)).checkOutput()) { _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); @@ -343,22 +343,33 @@ void SRTMinorServoBossCore::park() ex.log(LM_DEBUG); throw ex.getParkingErrorEx(); } - - // Send the STOP command to each servo - for(const auto& [servo_name, servo] : m_servos) - { - servo->stop(); - } } catch(MinorServoErrors::MinorServoErrorsEx& mse) { _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); - ex.setReason("Error while sending the STOP command to a minor servo system."); + ex.setReason("Error while sending the STOW command to the gregorian cover."); ex.log(LM_DEBUG); throw ex.getParkingErrorEx(); } + // Send the STOP command to each servo + for(const auto& [servo_name, servo] : m_servos) + { + try + { + servo->stop(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Error while sending the STOP command to " + servo_name + ".").c_str()); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + } + // Start the park thread try { -- GitLab From c80342700cb4675cec335bbe45f359e8024c28f9 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sat, 17 Feb 2024 20:55:26 +0000 Subject: [PATCH 072/150] Updated SRTMinorServoLibrary --- .../include/PySRTMinorServoCommandLibrary.h | 52 ++++++++++++++---- .../include/SRTMinorServoCommandLibrary.h | 18 +++---- .../include/SRTMinorServoSocket.h | 2 +- .../SRTMinorServoLibrary/src/Makefile | 2 +- .../src/PySRTMinorServoCommandLibrary.cpp | 53 ++++++++++++++----- .../src/SRTMinorServoCommandLibrary.cpp | 17 +++--- .../tests/SRTMinorServoSocketTest.cpp | 4 ++ .../tests/pyunit/__init__.py | 30 +++++------ 8 files changed, 120 insertions(+), 58 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h index dc719e6b6..a3a33a3bc 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h @@ -8,6 +8,7 @@ */ #include +#include #include "SRTMinorServoCommandLibrary.h" @@ -21,20 +22,47 @@ namespace MinorServo class PySRTMinorServoCommandLibrary : public SRTMinorServoCommandLibrary { public: + /** + * Builds the command used to ask the general status of the minor servos or, eventually, a single servo + * @param servo_id the ID string of the eventual single servo to retrieve the status. Send no servo_id argument to retrieve the general status of the system + * @return the composed message + */ + static boost::python::object status(const std::string servo_id = ""); + + /** + * Builds the command used to configure the telescope for a specific focal path + * @param configuration the desired focal path to command to the minor servo systems + * @return the composed message + */ + static boost::python::object setup(const std::string& configuration); + + /* + * Builds the command used to stow a single servo system to a given stow position + * @param servo_id the ID string of the single servo to be stowed + * @param stow_position the position to which the servo have to stow to + * @return the composed message + */ + static boost::python::object stow(const std::string& servo_id, unsigned int stow_position = 1); + + /* + * Builds the command used to stop a single servo system + * @param servo_id the ID string of the single servo to be stopped + * @return the composed message + */ + static boost::python::object stop(const std::string& servo_id); + /* * Builds the command used to move a single servo to a given set of coordinates * This is an overload of the original SRTMinorServoCommandLibrary::preset function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector * @param servo_id the ID of the single servo to be moved * @param coordinates a Python list containing the N coordinates to be sent to the servo * @return the composed message */ - static std::string preset(std::string servo_id, boost::python::list& coordinates); + static boost::python::object preset(const std::string& servo_id, const boost::python::list& coordinates); /* * Builds the command used to provide a single tracking set of coordinates to a single servo * This is an overload of the original SRTMinorServoCommandLibrary::programTrack function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector * @param servo_id the ID of the single servo to send the command to * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to * @param point_id the ID number of the given set of coordinates inside the trajectory @@ -42,34 +70,38 @@ namespace MinorServo * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory * @return the composed message */ - static std::string programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, boost::python::list& coordinates, double start_time=-1); + static boost::python::object programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const boost::python::list& coordinates, double start_time=-1); /* * Builds the command used to provide a set of offsets to a given servo * This is an overload of the original SRTMinorServoCommandLibrary::offset function - * An overload was needed in order to handle the coordinates parameter as a Python list instead of a C++ std::vector * @param servo_id the ID of the single servo to be moved * @param coordinates a Python list containing the N coordinates to be sent to the servo * @return the composed message */ - static std::string offset(std::string servo_id, boost::python::list& coordinates); + static boost::python::object offset(const std::string& servo_id, const boost::python::list& coordinates); /* * Parses the received answer by splitting it and synamically populating a std::map * This is an overload of the original SRTMinorServoCommandLibrary::parseAnswer function - * An overload was needed in order to replace the original std::map object with a boost::python::dict * @param answer the string containing the answer received from the VBrain proxy * @return a Python dictionary containing the answer splitted into keys and values. The keys are always strings, the values can either be int, double or strings. */ - static boost::python::dict parseAnswer(std::string answer); - + static boost::python::dict parseAnswer(const std::string& answer); private: /* * Converts the given Python list into a C++ std::vector object * @param py_list the given Python list to be converted * @return the composed C++ std::vector containing doubles */ - static std::vector pylist2cppvector(boost::python::list& py_list); + static std::vector pylist2cppvector(const boost::python::list& py_list); + + /** + * Converts the given std::string to a Python bytestring + * @param command a reference to the given command string + * @return the bytestring containing the given command string + */ + static boost::python::object stringToBytes(const std::string& command); }; } diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index d6d21dd70..5f0c009f5 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -32,14 +32,14 @@ namespace MinorServo * @param servo_id the ID string of the eventual single servo to retrieve the status. Send no servo_id argument to retrieve the general status of the system * @return the composed message */ - static std::string status(std::string servo_id = ""); + static std::string status(const std::string servo_id = ""); /** * Builds the command used to configure the telescope for a specific focal path * @param configuration the desired focal path to command to the minor servo systems * @return the composed message */ - static std::string setup(std::string configuration); + static std::string setup(const std::string& configuration); /* * Builds the command used to stow a single servo system to a given stow position @@ -47,14 +47,14 @@ namespace MinorServo * @param stow_position the position to which the servo have to stow to * @return the composed message */ - static std::string stow(std::string servo_id, unsigned int stow_position = 1); + static std::string stow(const std::string& servo_id, const unsigned int stow_position = 1); /* * Builds the command used to stop a single servo system * @param servo_id the ID string of the single servo to be stopped * @return the composed message */ - static std::string stop(std::string servo_id); + static std::string stop(const std::string& servo_id); /* * Builds the command used to move a single servo to a given set of virtual coordinates @@ -62,7 +62,7 @@ namespace MinorServo * @param coordinates a vector containing the N coordinates to be sent to the servo * @return the composed message */ - static std::string preset(std::string servo_id, std::vector coordinates); + static std::string preset(const std::string& servo_id, const std::vector& coordinates); /* * Builds the command used to provide a single tracking point of virtual coordinates to a single servo @@ -73,7 +73,7 @@ namespace MinorServo * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX Epoch of the starting instant of the trajectory * @return the composed message */ - static std::string programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, std::vector coordinates, double start_time = 0); + static std::string programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const std::vector& coordinates, const double start_time = 0); /* * Builds the command used to send a set of virtual offsets to a single servo @@ -81,14 +81,14 @@ namespace MinorServo * @param coordinates a vector containing the N offsets to be added the servo coordinates * @return the composed message */ - static std::string offset(std::string servo_id, std::vector coordinates); + static std::string offset(const std::string& servo_id, const std::vector& coordinates); /* * Parses the received answer by splitting it and dynamically populating a SRTMinorServoAnswerMap object - * @param answer the string containing the answer received from the VBrain proxy + * @param original_answer the string containing the answer received from the VBrain proxy * @return a SRTMinorServoAnswerMap dictionary containing the answer splitted into keys and values. The keys are always std::string, the values can either be long, double or std::string. */ - static SRTMinorServoAnswerMap parseAnswer(std::string answer); + static SRTMinorServoAnswerMap parseAnswer(const std::string& original_answer); }; } diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h index 4d2174cd6..a4a48973a 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h @@ -14,7 +14,7 @@ #include #include "SRTMinorServoCommandLibrary.h" -#define SOCKET_TIMEOUT 0.1 +#define SOCKET_TIMEOUT 0.1 #define CONFIG_DOMAIN "alma/" #define CONFIG_DIRNAME "/MINORSERVO/Socket" diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 26d07014c..6385508ce 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -98,7 +98,7 @@ PY_SCRIPTS_L = PY_MODULES = PY_MODULES_L = -PY_PACKAGES = #SRTMinorServoCommandLibrary +PY_PACKAGES = SRTMinorServoCommandLibrary PY_PACKAGES_L = pppppp_MODULES = diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp index ac0a61534..984618e08 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -2,32 +2,42 @@ using namespace MinorServo; -std::string PySRTMinorServoCommandLibrary::preset(std::string servo_id, boost::python::list& coordinates) +boost::python::object PySRTMinorServoCommandLibrary::status(const std::string servo_id) { - return SRTMinorServoCommandLibrary::preset(servo_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates)); + return stringToBytes(SRTMinorServoCommandLibrary::status(servo_id)); } -std::string PySRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, boost::python::list& coordinates, double start_time) +boost::python::object PySRTMinorServoCommandLibrary::setup(const std::string& configuration) { - return SRTMinorServoCommandLibrary::programTrack(servo_id, trajectory_id, point_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates), start_time); + return stringToBytes(SRTMinorServoCommandLibrary::setup(configuration)); } -std::string PySRTMinorServoCommandLibrary::offset(std::string servo_id, boost::python::list& coordinates) +boost::python::object PySRTMinorServoCommandLibrary::stow(const std::string& servo_id, unsigned int stow_position) { - return SRTMinorServoCommandLibrary::offset(servo_id, PySRTMinorServoCommandLibrary::pylist2cppvector(coordinates)); + return stringToBytes(SRTMinorServoCommandLibrary::stow(servo_id, stow_position)); } -std::vector PySRTMinorServoCommandLibrary::pylist2cppvector(boost::python::list& py_list) +boost::python::object PySRTMinorServoCommandLibrary::stop(const std::string& servo_id) { - std::vector cpp_vector; - for(unsigned int i = 0; i < len(py_list); i++) - { - cpp_vector.push_back(boost::python::extract(py_list[i])); - } - return cpp_vector; + return stringToBytes(SRTMinorServoCommandLibrary::stop(servo_id)); +} + +boost::python::object PySRTMinorServoCommandLibrary::preset(const std::string& servo_id, const boost::python::list& coordinates) +{ + return stringToBytes(SRTMinorServoCommandLibrary::preset(servo_id, pylist2cppvector(coordinates))); } -boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(std::string answer) +boost::python::object PySRTMinorServoCommandLibrary::programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const boost::python::list& coordinates, double start_time) +{ + return stringToBytes(SRTMinorServoCommandLibrary::programTrack(servo_id, trajectory_id, point_id, pylist2cppvector(coordinates), start_time)); +} + +boost::python::object PySRTMinorServoCommandLibrary::offset(const std::string& servo_id, const boost::python::list& coordinates) +{ + return stringToBytes(SRTMinorServoCommandLibrary::offset(servo_id, pylist2cppvector(coordinates))); +} + +boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(const std::string& answer) { auto args = SRTMinorServoCommandLibrary::parseAnswer(answer); @@ -42,3 +52,18 @@ boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(std::string answe return dictionary; } + +std::vector PySRTMinorServoCommandLibrary::pylist2cppvector(const boost::python::list& py_list) +{ + std::vector cpp_vector; + for(unsigned int i = 0; i < len(py_list); i++) + { + cpp_vector.push_back(boost::python::extract(py_list[i])); + } + return cpp_vector; +} + +boost::python::object PySRTMinorServoCommandLibrary::stringToBytes(const std::string& command) +{ + return boost::python::object(boost::python::handle<>(PyBytes_FromString(command.c_str()))); +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index 36c784843..ddafbe859 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -11,7 +11,7 @@ using namespace MinorServo; -std::string SRTMinorServoCommandLibrary::status(std::string servo_id) +std::string SRTMinorServoCommandLibrary::status(const std::string servo_id) { std::stringstream command; command << "STATUS"; @@ -23,28 +23,28 @@ std::string SRTMinorServoCommandLibrary::status(std::string servo_id) return command.str(); } -std::string SRTMinorServoCommandLibrary::setup(std::string configuration) +std::string SRTMinorServoCommandLibrary::setup(const std::string& configuration) { std::stringstream command; command << "SETUP=" << configuration << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::stow(std::string servo_id, unsigned int stow_position) +std::string SRTMinorServoCommandLibrary::stow(const std::string& servo_id, const unsigned int stow_position) { std::stringstream command; command << "STOW=" << servo_id << "," << stow_position << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::stop(std::string servo_id) +std::string SRTMinorServoCommandLibrary::stop(const std::string& servo_id) { std::stringstream command; command << "STOP=" << servo_id << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vector coordinates) +std::string SRTMinorServoCommandLibrary::preset(const std::string& servo_id, const std::vector& coordinates) { std::stringstream command; command << "PRESET=" << servo_id; @@ -56,7 +56,7 @@ std::string SRTMinorServoCommandLibrary::preset(std::string servo_id, std::vecto return command.str(); } -std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsigned long trajectory_id, unsigned long point_id, std::vector coordinates, double start_time) +std::string SRTMinorServoCommandLibrary::programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const std::vector& coordinates, const double start_time) { std::stringstream command; command << "PROGRAMTRACK=" << servo_id << "," << trajectory_id << "," << point_id << ","; @@ -77,7 +77,7 @@ std::string SRTMinorServoCommandLibrary::programTrack(std::string servo_id, unsi return command.str(); } -std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vector coordinates) +std::string SRTMinorServoCommandLibrary::offset(const std::string& servo_id, const std::vector& coordinates) { std::stringstream command; command << "OFFSET=" << servo_id; @@ -89,9 +89,10 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto return command.str(); } -SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answer) +SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(const std::string& original_answer) { // First thing first, standardize the separators and remove the newline/carriage return characters + std::string answer(original_answer); std::replace(answer.begin(), answer.end(), ':', '='); std::replace(answer.begin(), answer.end(), '|', ','); answer.erase(std::remove(answer.begin(), answer.end(), '\n'), answer.end()); diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp index 7de92d0c1..8fe3ba017 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp @@ -4,6 +4,7 @@ #include "gtest/gtest.h" #include #include +#include #include "SRTMinorServoUtils.h" #include "SRTMinorServoCommandLibrary.h" #include "SRTMinorServoTestingSocket.h" @@ -13,6 +14,8 @@ // discos-simulator -s minor_servo start & #define ADDRESS std::string("127.0.0.1") #define PORT 12800 +//#define ADDRESS std::string("192.168.200.13") +//#define PORT 4758 using namespace MinorServo; @@ -39,6 +42,7 @@ protected: void TearDown() override { SRTMinorServoTestingSocket::destroyInstance(); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); } }; diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py index 4993c068e..e62ae691a 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py @@ -7,56 +7,56 @@ class TestPySRTMinorServoCommandLibrary(unittest.TestCase): def test_status(self): command = SRTMinorServoCommandLibrary.status() - expected_command = 'STATUS\r\n' + expected_command = b'STATUS\r\n' self.assertEqual(command, expected_command) def test_status_servo(self): command = SRTMinorServoCommandLibrary.status('PFP') - expected_command = 'STATUS=PFP\r\n' + expected_command = b'STATUS=PFP\r\n' self.assertEqual(command, expected_command) def test_setup(self): command = SRTMinorServoCommandLibrary.setup('KKG') - expected_command = 'SETUP=KKG\r\n' + expected_command = b'SETUP=KKG\r\n' self.assertEqual(command, expected_command) def test_stow(self): command = SRTMinorServoCommandLibrary.stow('SRP') - expected_command = 'STOW=SRP,1\r\n' + expected_command = b'STOW=SRP,1\r\n' self.assertEqual(command, expected_command) def test_stow_position(self): command = SRTMinorServoCommandLibrary.stow('SRP', 2) - expected_command = 'STOW=SRP,2\r\n' + expected_command = b'STOW=SRP,2\r\n' self.assertEqual(command, expected_command) def test_stop(self): command = SRTMinorServoCommandLibrary.stop('SRP') - expected_command = 'STOP=SRP\r\n' + expected_command = b'STOP=SRP\r\n' self.assertEqual(command, expected_command) def test_preset(self): command = SRTMinorServoCommandLibrary.preset('PFP', [0.1, 1.1, 2.1]) - expected_command = 'PRESET=PFP,0.100000,1.100000,2.100000\r\n' + expected_command = b'PRESET=PFP,0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) def test_programTrack(self): now = time.time() command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0.1, 1.1, 2.1], now) - expected_command = f'PROGRAMTRACK=PFP,0,0,{now},0.100000,1.100000,2.100000\r\n' + expected_command = bytes(f'PROGRAMTRACK=PFP,0,0,{now:.6f},0.100000,1.100000,2.100000\r\n', encoding='latin-1') self.assertEqual(command, expected_command) for i in range(1, 10): command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, i, [0.1, 1.1, 2.1]) - expected_command = f'PROGRAMTRACK=PFP,0,{i},*,0.100000,1.100000,2.100000\r\n' + expected_command = bytes(f'PROGRAMTRACK=PFP,0,{i},*,0.100000,1.100000,2.100000\r\n', encoding='latin-1') self.assertEqual(command, expected_command) def test_offset(self): command = SRTMinorServoCommandLibrary.offset('PFP', [0.1, 1.1, 2.1]) - expected_command = 'OFFSET=PFP,0.100000,1.100000,2.100000\r\n' + expected_command = b'OFFSET=PFP,0.100000,1.100000,2.100000\r\n' self.assertEqual(command, expected_command) def test_parseAnswer(self): - answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" + answer = 'OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94' args = { 'OUTPUT': 'GOOD', 'TIMESTAMP': 1665743366.123456, @@ -85,16 +85,16 @@ class TestPySRTMinorServoCommandLibrary(unittest.TestCase): args ) - answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" + answer = b"OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) - answer = "OUTPUT:123456" + answer = b"OUTPUT:123456" self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) - answer = "OUTPUT:GOOD,12345,67890" + answer = b"OUTPUT:GOOD,12345,67890" self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) - answer = "OUTPUT:GOOD,12345.ABCD" + answer = b"OUTPUT:GOOD,12345.ABCD" self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) -- GitLab From 05ecf70971e5b180ff9c97919f9a585593180cb9 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sat, 17 Feb 2024 21:06:36 +0000 Subject: [PATCH 073/150] Updates for the SRTMinorServos --- .../CDB/alma/MINORSERVO/Socket/Socket.xml | 3 ++- SRT/Misc/SRTScripts/app-defaults/discosStartup.xml | 11 +---------- .../SRTMinorServo/src/SRTMinorServoBossCore.cpp | 4 ++-- .../SRTMinorServo/src/SRTMinorServoSetupThread.cpp | 2 +- SystemMake/Makefile | 2 +- 5 files changed, 7 insertions(+), 15 deletions(-) diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml index c7d721bd0..f9925f1d3 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -9,4 +9,5 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" IPAddress="192.168.200.13" - Port="4758"/> + Port="4758" + SocketTimeout="0.2"/> diff --git a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml index fe407ec9b..29c8a78a6 100644 --- a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml @@ -14,7 +14,7 @@ - + @@ -109,15 +109,6 @@ MASTERHOST discos - - MinorServoBossContainer - cpp - - true - 0 - MASTERHOST - discos - MinorServoContainer cpp diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index d71455e7b..fd1dc1173 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -335,7 +335,7 @@ void SRTMinorServoBossCore::park() try { // Send the STOW command to close the gregorian cover - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", COVER_STATUS_CLOSED)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", COVER_STATUS_CLOSED)).checkOutput()) { _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); @@ -513,7 +513,7 @@ void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_INFO, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) { _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 162cda8aa..4acbb041e 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -92,7 +92,7 @@ void SRTMinorServoSetupThread::runLoop() } case 100: // Send the STOW command to the gregorian cover { - if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", m_gregorian_cover_position)).checkOutput()) + if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", m_gregorian_cover_position)).checkOutput()) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Received NAK when setting the gregorian cover position.")); m_core.setFailure(); diff --git a/SystemMake/Makefile b/SystemMake/Makefile index fe778c6be..32834ba76 100644 --- a/SystemMake/Makefile +++ b/SystemMake/Makefile @@ -49,7 +49,7 @@ COMMON_SIMULATORS:= TCPGenericProtocolSim ReceiverBoardSim SRT_DOC:=SRTDox SRT_ERRORS:= SRT_INTERFACES:=SRTAntennaInterface SRTActiveSurfaceInterface \ - SRTReceiversInterface + SRTMinorServoInterface SRTReceiversInterface SRT_LIBRARIES:=SRTMinorServoLibrary SRT_SERVERS:=SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver \ SRT7GHzReceiver SRT5GHzReceiver SRTLPBandReceiver SRTPyIFDistributor WeatherStation -- GitLab From 48696c325ff6bbdfc5aadd3bc36dc4a21f4b0ae3 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sun, 18 Feb 2024 02:18:31 +0000 Subject: [PATCH 074/150] First working implementation with the actual hardware Libraries and components were slightly reworked and tweaked in order to work correctly with the current hardware status. The gregorian cover movement was took out of the setup and park procedures, since it is currently locked in place and won't move. We will add it again later. All the currently unavailable minor servos components were took out from the Boss control by commenting them. They can still be accessed via objexp and check their status. The GFR was took out as well since it keeps blocking during movements. For now it has to be moved manually, it can be done via objexp as well, but resetting the errors from VBrain. I rewrote the SRPProgramTrackTest.cpp in order to test the behavior of the SRP with new libraries. The test acts just like before. Other tests need to be reworked, keeping the same logic behind. Further investigation must be put into the scanning procedure, in particular when the recorder retrieves the coordinates. --- .../idl/SRTMinorServoBoss.idl | 2 +- SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 14 +- .../include/SRTMinorServoCommon.h | 10 +- .../src/SRTBaseMinorServoImpl.cpp | 2 +- .../src/SRTMinorServoBossCore.cpp | 50 ++--- .../src/SRTMinorServoBossImpl.cpp | 8 +- .../src/SRTMinorServoParkThread.cpp | 13 +- .../src/SRTMinorServoScanThread.cpp | 11 +- .../src/SRTMinorServoSetupThread.cpp | 26 +-- .../src/SRTMinorServoStatusThread.cpp | 7 +- .../src/SRTMinorServoTrackingThread.cpp | 6 +- SRT/Servers/SRTMinorServo/test/Makefile | 18 +- .../test/SRPProgramTrackTest.cpp | 124 ++++++------ .../test/SRTMinorServoSocketTest.cpp | 187 ------------------ 14 files changed, 144 insertions(+), 334 deletions(-) delete mode 100644 SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl index ae5c1138b..9748e827e 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -79,7 +79,7 @@ module MinorServo * @param value, the desired gregorian cover position, accepted values are 'open', 'OPEN', 'closed' or 'CLOSED' * @throw MinorServoErrors::MinorServoErrorsEx */ - void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); + //void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); }; }; diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index a5fb819e5..6d703e1e1 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -105,14 +105,7 @@ namespace MinorServo } case MOTION_STATUS_TRACKING: { - if(m_scanning.load() == Management::MNG_FALSE) - { - motion_status = "Elevation Track Mode"; - } - else - { - motion_status = "Scanning along " + m_current_scan.servo_name + " " + m_current_scan.axis_name + " axis"; - } + motion_status = "Elevation Track Mode"; break; } case MOTION_STATUS_PARKING: @@ -152,6 +145,11 @@ namespace MinorServo } } + if(m_scanning.load() == Management::MNG_TRUE) + { + motion_status = "Scanning along " + m_current_scan.servo_name + " " + m_current_scan.axis_name + " axis"; + } + return motion_status.c_str(); } private: diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h index 77248b543..ed59c4865 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -16,8 +16,8 @@ /** * programTrack constants. The first indicates the time between two consecutive points, the second indicates the time we send each point in advance. */ -#define PROGRAM_TRACK_TIMEGAP 2000000 //200 milliseconds -#define PROGRAM_TRACK_FUTURE_TIME 4000000 //400 milliseconds +#define PROGRAM_TRACK_TIMEGAP 2000000 //200 milliseconds, time between each programTrack point +#define PROGRAM_TRACK_FUTURE_TIME 26000000 //2.6 seconds, we send points this amount of time before their actual timestamp /** * Macro used to link the properties pointers to their methods. @@ -100,10 +100,10 @@ namespace MinorServo */ const std::vector ServoOrder = { - "PFP", + //"PFP", "SRP", - "GFR", - "M3R" + //"GFR", + //"M3R" }; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 5b4d59f05..53d02c054 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -512,7 +512,7 @@ void SRTBaseMinorServoImpl::reloadOffsets() throw ex.getMinorServoErrorsEx(); } - ACS_LOG(LM_FULL_INFO, m_servo_name + "::reloadOffsets()", (LM_INFO, "Offsets discrepancy, reload")); + ACS_LOG(LM_FULL_INFO, m_servo_name + "::reloadOffsets()", (LM_NOTICE, "Offsets discrepancy, reloading them")); } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index fd1dc1173..45c3faf21 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -29,13 +29,13 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)), m_socket_connected(m_socket.isConnected() ? Management::MNG_TRUE : Management::MNG_FALSE), m_servos{ - { "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, - { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") }, - { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") }, - { "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } + //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } + //{ "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") }, + //{ "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } }, m_tracking_servos{ - { "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } } { @@ -66,7 +66,7 @@ bool SRTMinorServoBossCore::status() if(m_socket_connected.load() == Management::MNG_FALSE) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_INFO, "Socket connected.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_NOTICE, "Socket connected.")); m_socket_connected.store(Management::MNG_TRUE); m_subsystem_status.store(Management::MNG_WARNING); } @@ -75,7 +75,7 @@ bool SRTMinorServoBossCore::status() { if(m_socket_connected.load() == Management::MNG_TRUE) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_INFO, "Socket disconnected.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_NOTICE, "Socket disconnected.")); m_socket_connected.store(Management::MNG_FALSE); stopThread(m_setup_thread); @@ -104,7 +104,7 @@ bool SRTMinorServoBossCore::status() ACSErr::Completion_var comp; SRTMinorServoMotionStatus motion_status = m_motion_status.load(); - if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) + /*if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) { // We only get here if the system is configured, therefore we check the correct position of the gregorian cover SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.current_configuration()->get_sync(comp.out()) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; @@ -114,7 +114,7 @@ bool SRTMinorServoBossCore::status() setFailure(); return false; } - } + }*/ for(const auto& [name, servo] : m_servos) { @@ -175,7 +175,7 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) if(m_scan_active.load() == Management::MNG_TRUE) { - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, "THE SYSTEM IS PERFORMING A SCAN, CANNOT SETUP NOW")); + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, "THE SYSTEM IS PERFORMING A SCAN, CANNOT SETUP NOW")); _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); ex.setSubsystem("MinorServo"); ex.setReason("The system is waiting for a scan to be completed."); @@ -199,7 +199,7 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) } catch(std::out_of_range& oor) { - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("UNKNOWN CONFIGURATION '" + commanded_setup + "'").c_str())); + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("UNKNOWN CONFIGURATION '" + commanded_setup + "'").c_str())); _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); ex.setSubsystem("MinorServo"); ex.setReason(("Unknown configuration '" + commanded_setup + "'.").c_str()); @@ -213,17 +213,17 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) SRTMinorServoMotionStatus motion_status = m_motion_status.load(); if(motion_status == MOTION_STATUS_STARTING) { - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("ALREADY SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("ALREADY SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); return; } else if(motion_status == MOTION_STATUS_CONFIGURED || motion_status == MOTION_STATUS_TRACKING) { - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("CONFIGURATION '" + commanded_setup + "' ALREADY IN PLACE").c_str())); + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("CONFIGURATION '" + commanded_setup + "' ALREADY IN PLACE").c_str())); return; } } - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_INFO, ("SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); m_commanded_configuration.store(commanded_configuration); m_commanded_setup = commanded_setup; @@ -293,7 +293,7 @@ void SRTMinorServoBossCore::park() if(m_scan_active.load() == Management::MNG_TRUE) { - ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "THE SYSTEM IS PERFORMING A SCAN, CANNOT PARK NOW")); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "THE SYSTEM IS PERFORMING A SCAN, CANNOT PARK NOW")); _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); ex.setReason("The system is waiting for a scan to be completed."); @@ -304,16 +304,16 @@ void SRTMinorServoBossCore::park() SRTMinorServoMotionStatus motion_status = m_motion_status.load(); if(motion_status == MOTION_STATUS_PARKING) { - ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "MINOR SERVOS ALREADY PARKING")); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "MINOR SERVOS ALREADY PARKING")); return; } else if (motion_status == MOTION_STATUS_PARKED) { - ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "MINOR SERVOS ALREADY PARKED")); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "MINOR SERVOS ALREADY PARKED")); return; } - ACS_LOG(LM_FULL_INFO, "servoPark", (LM_INFO, "PARKING")); + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "PARKING")); m_commanded_configuration.store(CONFIGURATION_PARK); m_commanded_setup = "Park"; @@ -332,7 +332,7 @@ void SRTMinorServoBossCore::park() m_tracking.store(Management::MNG_FALSE); m_motion_status.store(MOTION_STATUS_PARKING); - try + /*try { // Send the STOW command to close the gregorian cover if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", COVER_STATUS_CLOSED)).checkOutput()) @@ -351,7 +351,7 @@ void SRTMinorServoBossCore::park() ex.setReason("Error while sending the STOW command to the gregorian cover."); ex.log(LM_DEBUG); throw ex.getParkingErrorEx(); - } + }*/ // Send the STOP command to each servo for(const auto& [servo_name, servo] : m_servos) @@ -407,7 +407,7 @@ void SRTMinorServoBossCore::setElevationTracking(std::string configuration) throw ex.getMinorServoErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "setServoElevationTracking", (LM_INFO, ("SETTING ELEVATION TRACKING TO " + configuration).c_str())); + ACS_LOG(LM_FULL_INFO, "setServoElevationTracking", (LM_NOTICE, ("SETTING ELEVATION TRACKING TO " + configuration).c_str())); if(configuration == "ON" && m_elevation_tracking_enabled.load() != Management::MNG_TRUE) { @@ -453,7 +453,7 @@ void SRTMinorServoBossCore::setASConfiguration(std::string configuration) throw ex.getMinorServoErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "setServoASConfiguration", (LM_INFO, ("SETTING ACTIVE SURFACE CONFIGURATION TO " + configuration).c_str())); + ACS_LOG(LM_FULL_INFO, "setServoASConfiguration", (LM_NOTICE, ("SETTING ACTIVE SURFACE CONFIGURATION TO " + configuration).c_str())); if(configuration == "ON" && m_as_configuration.load() != Management::MNG_TRUE) { @@ -511,7 +511,7 @@ void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) throw ex.getMinorServoErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_INFO, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); + ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_NOTICE, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) { @@ -656,7 +656,7 @@ void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double of { if(log) { - ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_INFO, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); + ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_NOTICE, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); } servo->setUserOffset(axis_name.c_str(), offset); } @@ -1307,7 +1307,7 @@ void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sle throw ex.getComponentErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startThread()", (LM_INFO, (std::string(T::c_thread_name) + " STARTED").c_str())); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startThread()", (LM_NOTICE, (std::string(T::c_thread_name) + " STARTED").c_str())); } template >> diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 3cf8143be..c13d13237 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -95,7 +95,7 @@ void SRTMinorServoBossImpl::initialize() throw ex.getComponentErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_INFO, "PROPERTIES INITIALIZED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "PROPERTIES INITIALIZED")); m_parser.add("servoSetup", new SP::function1>(this, &SRTMinorServoBossImpl::setup), 1); m_parser.add("servoPark", new SP::function0(this, &SRTMinorServoBossImpl::park), 0); @@ -103,9 +103,9 @@ void SRTMinorServoBossImpl::initialize() m_parser.add("setServoASConfiguration", new SP::function1>(this, &SRTMinorServoBossImpl::setASConfiguration), 1); m_parser.add("setServoOffset", new SP::function2, SP::I>(this, &SRTMinorServoBossImpl::setUserOffset), 2); m_parser.add("clearServoOffsets", new SP::function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); - m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); + //m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_INFO, "PARSER INITIALIZED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "PARSER INITIALIZED")); } void SRTMinorServoBossImpl::execute() @@ -233,7 +233,7 @@ CORBA::Double SRTMinorServoBossImpl::getCentralScanPosition() void SRTMinorServoBossImpl::clearOffsets() { AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); - ACS_LOG(LM_FULL_INFO, "clearServoOffsets", (LM_INFO, "CLEARING ALL USER OFFSETS")); + ACS_LOG(LM_FULL_INFO, "clearServoOffsets", (LM_NOTICE, "CLEARING ALL USER OFFSETS")); m_core.clearUserOffsets("ALL"); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 177478169..19083e185 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -4,8 +4,7 @@ using namespace MinorServo; SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), - m_core(core), - m_status(0) + m_core(core) { AUTO_TRACE("SRTMinorServoParkThread::SRTMinorServoParkThread()"); } @@ -21,14 +20,16 @@ void SRTMinorServoParkThread::onStart() this->setSleepTime(500000); // 50 milliseconds m_start_time = IRA::CIRATools::getUNIXEpoch(); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_INFO, "PARK THREAD STARTED")); + m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_NOTICE, "PARK THREAD STARTED")); } void SRTMinorServoParkThread::onStop() { AUTO_TRACE("SRTMinorServoParkThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_INFO, "PARK THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_NOTICE, "PARK THREAD STOPPED")); } void SRTMinorServoParkThread::runLoop() @@ -62,10 +63,10 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == COVER_STATUS_CLOSED? true : false; + //bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == COVER_STATUS_CLOSED? true : false; // Then we cycle through all the servos and make sure their operative mode is STOP - if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index bfec79cf9..ec1d9029c 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -28,7 +28,7 @@ void SRTMinorServoScanThread::onStart() size_t pre_scan_points = std::floor((m_core.m_current_scan.start_time - (getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME)) / PROGRAM_TRACK_TIMEGAP); m_point_time = m_core.m_current_scan.start_time - pre_scan_points * PROGRAM_TRACK_TIMEGAP; m_point_id = 0; - m_trajectory_id = (unsigned int)(m_point_time / 1000); + m_trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(m_point_time)); // How many points in the scan trajectory? // We don't check the modulo of the division, we assume all the scans duration is always expressed in seconds, therefore the modulo should always be 0 @@ -51,7 +51,7 @@ void SRTMinorServoScanThread::onStart() auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); m_starting_coordinates = *servo->virtual_positions()->get_sync(comp.out()); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_INFO, "SCAN THREAD STARTED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, "SCAN THREAD STARTED")); } void SRTMinorServoScanThread::onStop() @@ -101,7 +101,7 @@ void SRTMinorServoScanThread::onStop() // Finally unlock the scan capabilities m_core.m_scan_active.store(Management::MNG_FALSE); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_INFO, "SCAN THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_NOTICE, "SCAN THREAD STOPPED")); } void SRTMinorServoScanThread::runLoop() @@ -167,7 +167,10 @@ void SRTMinorServoScanThread::runLoop() })) { // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation - elevation_tracking = Management::MNG_TRUE; + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + elevation_tracking = Management::MNG_TRUE; + } } else { diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 4acbb041e..6f407d53f 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -4,8 +4,7 @@ using namespace MinorServo; SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), - m_core(core), - m_status(0) + m_core(core) { AUTO_TRACE("SRTMinorServoSetupThread::SRTMinorServoSetupThread()"); } @@ -22,18 +21,20 @@ void SRTMinorServoSetupThread::onStart() this->setSleepTime(500000); // 50 milliseconds m_start_time = IRA::CIRATools::getUNIXEpoch(); - SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); - m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); - m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + m_status = 0; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_INFO, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); + //SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); + //m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); + //m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_NOTICE, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); } void SRTMinorServoSetupThread::onStop() { AUTO_TRACE("SRTMinorServoSetupThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_INFO, "SETUP THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_NOTICE, "SETUP THREAD STOPPED")); } void SRTMinorServoSetupThread::runLoop() @@ -87,10 +88,11 @@ void SRTMinorServoSetupThread::runLoop() } //m_status = 2; - m_status = 100; + //m_status = 100; + m_status = 5; break; } - case 100: // Send the STOW command to the gregorian cover + /*case 100: // Send the STOW command to the gregorian cover { if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", m_gregorian_cover_position)).checkOutput()) { @@ -102,7 +104,7 @@ void SRTMinorServoSetupThread::runLoop() m_status = 5; break; - } + }*/ /*case 2: // Send the SETUP command { try @@ -195,9 +197,9 @@ void SRTMinorServoSetupThread::runLoop() case 6: // Wait for the whole system to reach the PRESET configuration { // First we check the status of the gregorian cover - bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + //bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; - if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool + if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp index 4fbf459ed..3cbedce9a 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -5,7 +5,6 @@ using namespace MinorServo; SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : ACS::Thread(name, response_time, sleep_time), m_core(core), - m_status(0), m_sleep_time(this->getSleepTime()), m_notification_channel(nullptr) { @@ -21,7 +20,9 @@ void SRTMinorServoStatusThread::onStart() { AUTO_TRACE("SRTMinorServoStatusThread::onStart()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStart()", (LM_INFO, "STATUS THREAD STARTED")); + m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStart()", (LM_NOTICE, "STATUS THREAD STARTED")); } void SRTMinorServoStatusThread::onStop() @@ -34,7 +35,7 @@ void SRTMinorServoStatusThread::onStop() m_notification_channel = nullptr; } - ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStop()", (LM_INFO, "STATUS THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStop()", (LM_NOTICE, "STATUS THREAD STOPPED")); } void SRTMinorServoStatusThread::runLoop() diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 0dc91881c..55e8ba5e5 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -23,7 +23,7 @@ void SRTMinorServoTrackingThread::onStart() m_point_id = 0; m_point_time = 0; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_INFO, "TRACKING THREAD STARTED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_NOTICE, "TRACKING THREAD STARTED")); } void SRTMinorServoTrackingThread::onStop() @@ -35,7 +35,7 @@ void SRTMinorServoTrackingThread::onStop() m_core.setFailure(); } - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_INFO, "TRACKING THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); } void SRTMinorServoTrackingThread::runLoop() @@ -67,7 +67,7 @@ void SRTMinorServoTrackingThread::runLoop() if(m_point_id == 0) { m_point_time = getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME; - m_trajectory_id = (unsigned int)(m_point_time / 1000); + m_trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(m_point_time)); } else { diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 035f03688..97a093eab 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,31 +14,25 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = SRTMinorServoSocketTest SRPProgramTrackTest DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest - -SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest -SRTMinorServoSocketTest_CFLAGS = -std=c++17 -SRTMinorServoSocketTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors -SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread +EXECUTABLES_L = SRPProgramTrackTest #DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest SRPProgramTrackTest_OBJECTS = SRPProgramTrackTest -SRPProgramTrackTest_CFLAGS = -std=c++17 -SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem -SRPProgramTrackTest_LDFLAGS = -lstdc++ -lpthread +SRPProgramTrackTest_CFLAGS = -std=c++17 -fconcepts +SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem DerotatorProgramTrackTest_OBJECTS = DerotatorProgramTrackTest DerotatorProgramTrackTest_CFLAGS = -std=c++17 -DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem DerotatorProgramTrackTest_LDFLAGS = -lstdc++ -lpthread CombinedProgramTrackTest_OBJECTS = CombinedProgramTrackTest CombinedProgramTrackTest_CFLAGS = -std=c++17 -CombinedProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +CombinedProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem CombinedProgramTrackTest_LDFLAGS = -lstdc++ -lpthread ReadStatusOnlyTest_OBJECTS = ReadStatusOnlyTest ReadStatusOnlyTest_CFLAGS = -std=c++17 -ReadStatusOnlyTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocket SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +ReadStatusOnlyTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem ReadStatusOnlyTest_LDFLAGS = -lstdc++ -lpthread # END OF CUSTOMIZATION diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index c53bebd49..e1033748e 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -4,13 +4,13 @@ #include #include #include -#include "SRTMinorServoSocket.h" +#include "SRTMinorServoTestingSocket.h" #include "SRTMinorServoCommandLibrary.h" // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & -#define SIMULATION +//#define SIMULATION #ifdef SIMULATION #define ADDRESS std::string("127.0.0.1") #define PORT 12800 @@ -18,17 +18,19 @@ #define ADDRESS std::string("192.168.200.13") #define PORT 4758 #endif -#define SOCKET_TIMEOUT 0.5 #define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 -#define ADVANCE_TIMEGAP 5 -//#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } +#define ADVANCE_TIMEGAP 2.6 +#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } #define MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } #define MAX_SPEED std::vector{ 4, 4, 4, 0.04, 0.04, 0.04 } #define STATUS_PERIOD 0.01 std::atomic terminate = false; +using namespace MinorServo; +using namespace IRA; + class SRPProgramTrackTest : public ::testing::Test { @@ -39,7 +41,7 @@ protected: static void printStatus(std::string filename) { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; ofstream statusFile; @@ -77,17 +79,17 @@ protected: std::string status; try { - status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + status = serializeCoordinates(CIRATools::ACSTime2UNIXEpoch(map.getTimestamp()), getCoordinates(map)); } catch(std::bad_variant_access const& ex) { std::cout << "Bad timestamp!" << std::endl; - SRTMinorServoAnswerMap::iterator iterator; + /*SRTMinorServoAnswerMap::iterator iterator; for(iterator = map.begin(); iterator != map.end(); ++iterator) { std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); - } + }*/ } status += serializeElongations(getElongations(map)); return status; @@ -118,16 +120,14 @@ protected: for(std::string coordinate : coordinates) { - auto value = SRPStatus[coordinate]; - try { - currentCoordinates.push_back(std::get(value)); + currentCoordinates.push_back(SRPStatus.get(coordinate)); } catch(std::bad_variant_access const& ex) { - std::cout << "Bad floating point coordinate:" << std::get(value) << std::endl; - currentCoordinates.push_back(double(std::get(value))); + std::cout << "Bad floating point coordinate:" << SRPStatus.get(coordinate) << std::endl; + currentCoordinates.push_back(double(SRPStatus.get(coordinate))); } } @@ -141,16 +141,14 @@ protected: for(std::string elongation : elongations) { - auto value = SRPStatus[elongation]; - try { - currentElongations.push_back(std::get(value)); + currentElongations.push_back(SRPStatus.get(elongation)); } catch(std::bad_variant_access const& ex) { - std::cout << "Bad floating point elongation:" << std::get(value) << std::endl; - currentElongations.push_back(double(std::get(value))); + std::cout << "Bad floating point elongation:" << SRPStatus.get(elongation) << std::endl; + currentElongations.push_back(double(SRPStatus.get(elongation))); } } @@ -184,7 +182,7 @@ protected: try { - SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT, 0.2); std::cout << "Socket connected." << std::endl; } catch(ComponentErrors::SocketErrorExImpl& ex) @@ -195,41 +193,41 @@ protected: FAIL() << "Unexpected failure." << std::endl; } - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); std::cout << "Sending MS STATUS command..."; SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); - EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); - EXPECT_EQ(std::get(MSStatus["POWER"]), 1); - EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); - EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + EXPECT_TRUE(MSStatus.checkOutput()); + EXPECT_EQ(MSStatus.get("CONTROL"), 1); + //EXPECT_EQ(MSStatus.get("POWER"), 1); + EXPECT_EQ(MSStatus.get("EMERGENCY"), 2); + //EXPECT_EQ(MSStatus.get("ENABLED"), 1); std::cout << "OK." << std::endl; - SRTMinorServoAnswerMap::iterator iterator; + /*SRTMinorServoAnswerMap::iterator iterator; for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) { std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); - } + }*/ std::cout << "Sending initial SRP STATUS command..."; SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); - EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + EXPECT_TRUE(SRPStatus.checkOutput()); + //EXPECT_EQ(SRPStatus.get("SRP_STATUS"), 1); + EXPECT_EQ(SRPStatus.get("SRP_BLOCK"), 2); std::cout << "OK." << std::endl; - for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + /*for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) { std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); - } + }*/ std::cout << "Sending all axes to the starting position..." << std::endl; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); signal(SIGINT, SRPProgramTrackTest::sigintHandler); @@ -237,14 +235,14 @@ protected: { std::this_thread::sleep_for(std::chrono::milliseconds(100)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); std::cout << serializeStatus(SRPStatus) << std::endl; if(terminate) FAIL() << "Aborting test..." << std::endl; } - while(std::get(SRPStatus["SRP_OPERATIVE_MODE"]) != 40); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + while(SRPStatus.get("SRP_OPERATIVE_MODE") != 40); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 40); std::cout << "OK." << std::endl; @@ -273,7 +271,7 @@ protected: void TearDown() override { - SRTMinorServoSocket::destroyInstance(); + SRTMinorServoTestingSocket::destroyInstance(); terminate = false; } }; @@ -286,16 +284,16 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) unsigned int point_id = 0; std::vector programTrackCoordinates = startingCoordinates; - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); @@ -332,7 +330,7 @@ TEST_F(SRPProgramTrackTest, ContinuousMovementTest) } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; @@ -358,16 +356,16 @@ TEST_F(SRPProgramTrackTest, AllAxesMovementTest) unsigned int point_id = 0; std::vector programTrackCoordinates = startingCoordinates; - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); @@ -407,7 +405,7 @@ TEST_F(SRPProgramTrackTest, AllAxesMovementTest) } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; @@ -442,16 +440,16 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); } - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); @@ -473,7 +471,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } @@ -483,7 +481,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) TEST_F(SRPProgramTrackTest, SeparateMovementTest) { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; ofstream programTrackFile; @@ -507,14 +505,14 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) unsigned int point_id = 0; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); while(!terminate) { @@ -547,7 +545,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); } //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; @@ -563,7 +561,7 @@ TEST_F(SRPProgramTrackTest, SeparateMovementTest) TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); SRTMinorServoAnswerMap SRPStatus; ofstream programTrackFile; @@ -587,14 +585,14 @@ TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) unsigned int point_id = 0; SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(50)); SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); - EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); while(!terminate) { @@ -621,7 +619,7 @@ TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) } SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_TRUE(SRPStatus.checkOutput()); } //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; diff --git a/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp b/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp deleted file mode 100644 index 72399f6f7..000000000 --- a/SRT/Servers/SRTMinorServo/test/SRTMinorServoSocketTest.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/* These tests require a running simulator and were designed * - * to test the thread-safeness and singleton design pattern of the * - * SRTMinorServoSocket class. */ -#include "gtest/gtest.h" -#include -#include -#include "SRTMinorServoSocket.h" -#include "SRTMinorServoCommandLibrary.h" - -// This address and port are the ones set in the simulator -// In order for the test to properly be executed, the simulator should be launched with the following command: -// discos-simulator -s minor_servo start & -#define ADDRESS std::string("127.0.0.1") -#define PORT 12800 - - -class SRTMinorServoSocketTest : public ::testing::Test -{ -protected: - std::vector commands; - std::vector threads; - - void SetUp() override - { - std::cout << std::fixed << std::setprecision(6); - - // The following commands yield an articulated answer in return - commands.push_back(SRTMinorServoCommandLibrary::status()); - commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); - commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); - commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); - commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); - commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); - } - - void TearDown() override - { - SRTMinorServoSocket::destroyInstance(); - } -}; - -// This test passes the already created instance to some threads -TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) -{ - try - { - SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(ADDRESS, PORT); - - for(auto command : this->commands) - { - this->threads.push_back(std::thread([command, &socket]() - { - auto args = socket.sendCommand(command); - // By testing if the command was received correctly we also test if the socket is working properly - // and if the answer was received correctly without being interleaved with the answer from another thread - EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); - })); - } - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) - { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - } - else - { - FAIL() << "Unexpected failure." << std::endl; - } - } - - std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) - { - t.join(); - }); -} - -// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it -TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) -{ - std::string error = ""; - - for(auto command : this->commands) - { - std::mutex mutex; - - this->threads.push_back(std::thread([command, &error, &mutex]() - { - try - { - auto args = SRTMinorServoSocket::getInstance(ADDRESS, PORT).sendCommand(command); - // By testing if the command was received correctly we also test if the socket is working properly - // and if the answer was received correctly without being interleaved with the answer from another thread - EXPECT_EQ(std::get(args["OUTPUT"]), "GOOD"); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - std::lock_guard guard(mutex); - - if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) - { - error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; - } - else - { - error = "Unexpected failure."; - } - } - })); - } - - std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) - { - t.join(); - }); - - if(error != "") - { - FAIL() << error << std::endl; - } -} - -// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails -TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) -{ - try - { - // First let's open the socket with the chosen ADDRESS and PORT - SRTMinorServoSocket::getInstance(ADDRESS, PORT); - - // Let's try to instance another socket on a different port - SRTMinorServoSocket::getInstance(ADDRESS, PORT + 1); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) - { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - return; - } - else - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); - } - } -} - -// This test tries to retrieve an instance which has not been generated yet, failing -TEST_F(SRTMinorServoSocketTest, try_open_without_args) -{ - try - { - SRTMinorServoSocket::getInstance(); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) - { - FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; - return; - } - else - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object.").c_str()); - } - } -} - -// This test tries to generate an instance using a pair of address and port on which the socket fails to open -TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) -{ - try - { - // The exception is raised only if the given port is wrong - SRTMinorServoSocket::getInstance(ADDRESS, 0); - } - catch(ComponentErrors::SocketErrorExImpl& ex) - { - // Check if we got the correct exception - EXPECT_EQ(ex.getData("Reason"), std::string("Cannot connect the socket.").c_str()); - } -} -- GitLab From 45502d23f5bcd2ea958bd4ff50741422a2c9540e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sun, 18 Feb 2024 02:37:10 +0000 Subject: [PATCH 075/150] Fixed SRT Procedures for testing CDB --- .../StationProcedures/StationProcedures.xml | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 39b02cfa4..4d86ea178 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -6,7 +6,7 @@ antennaSetup=CCB - servoSetup=CCB + servoSetup=CCB receiversSetup=CCB chooseBackend=TotalPower initialize=CCB @@ -19,8 +19,9 @@ - receiversSetup=CCG antennaSetup=CCG + servoSetup=CCG + receiversSetup=CCG chooseBackend=TotalPower initialize=CCG device=0 @@ -33,7 +34,7 @@ antennaSetup=KKG - servoSetup=KKG + servoSetup=KKG receiversSetup=KKG receiversMode=SINGLEDISH chooseBackend=TotalPower @@ -48,7 +49,7 @@ antennaSetup=LP - servoSetup=LLP + servoSetup=LLP receiversSetup=LLP receiversMode=XXC4 chooseBackend=TotalPower @@ -63,7 +64,7 @@ antennaSetup=LP - servoSetup=PPP + servoSetup=PPP receiversSetup=PPP receiversMode=C3XX chooseBackend=TotalPower @@ -78,7 +79,7 @@ antennaSetup=LP - servoSetup=PLP + servoSetup=PLP receiversSetup=PLP receiversMode=C3C4 chooseBackend=TotalPower @@ -93,28 +94,28 @@ antennaSetup=XB - servoSetup=XB + servoSetup=XB receiversSetup=CCB chooseBackend=TotalPower initialize=XB device=0 restFrequency=0 - setLO=7500 + setLO=7500 azelOffsets=0d,0d - antennaSetup=LP - servoSetup=SSP - receiversSetup=CCB - chooseBackend=TotalPower - initialize=PPP - device=0 - calOff - restFrequency=0 - azelOffsets=0d,0d + antennaSetup=LP + servoSetup=SSP + receiversSetup=CCB + chooseBackend=TotalPower + initialize=PPP + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d -- GitLab From 99b58760640614aaa584080d6a60115d94b1938c Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 19 Feb 2024 13:28:22 +0000 Subject: [PATCH 076/150] Reverted the implementation of the ReceiversControl library --- .../IRALibrary/include/ReceiverControl.h | 12 ++-- .../IRALibrary/src/ReceiverControl.cpp | 55 ++++++++++++++++++- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/Common/Libraries/IRALibrary/include/ReceiverControl.h b/Common/Libraries/IRALibrary/include/ReceiverControl.h index 7cc825483..08024c0b3 100644 --- a/Common/Libraries/IRALibrary/include/ReceiverControl.h +++ b/Common/Libraries/IRALibrary/include/ReceiverControl.h @@ -667,8 +667,8 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number_sd=MCB_PORT_NUMBER_13, const BYTE port_number_vlbi=MCB_PORT_NUMBER_14, - const BYTE value_sd=0x01, - const BYTE value_vlbi=0x00 + const BYTE value_sd=0x00, + const BYTE value_vlbi=0x01 ); @@ -682,7 +682,7 @@ public: bool isSingleDishModeOn( const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, - const BYTE port_number=MCB_PORT_NUMBER_13 + const BYTE port_number=MCB_PORT_NUMBER_29 ); @@ -704,8 +704,8 @@ public: const BYTE port_type=MCB_PORT_TYPE_DIO, const BYTE port_number_vlbi=MCB_PORT_NUMBER_14, const BYTE port_number_sd=MCB_PORT_NUMBER_13, - const BYTE value_vlbi=0x01, - const BYTE value_sd=0x00 + const BYTE value_vlbi=0x00, + const BYTE value_sd=0x01 ); @@ -719,7 +719,7 @@ public: bool isVLBIModeOn( const BYTE data_type=MCB_CMD_DATA_TYPE_B01, const BYTE port_type=MCB_PORT_TYPE_DIO, - const BYTE port_number=MCB_PORT_NUMBER_14 + const BYTE port_number=MCB_PORT_NUMBER_30 ); diff --git a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp index b758adc08..16350e8af 100644 --- a/Common/Libraries/IRALibrary/src/ReceiverControl.cpp +++ b/Common/Libraries/IRALibrary/src/ReceiverControl.cpp @@ -889,6 +889,20 @@ void ReceiverControl::setSingleDishMode( port_number_vlbi, value_vlbi ); + + // Turn OFF the single dish mode on port number 13 + makeRequest( + m_dewar_board_ptr, // Pointer to the dewar board + MCB_CMD_SET_DATA, // Command to send + 4, // Number of parameters + data_type, + port_type, + port_number_sd, + !value_sd + ); + + // Now the bits 13 and 14 are set to 1, meaning no current is now traversing any switch magnet and no mode is currently selected + // We need to set the bit 13 to 0, which will send a TTL impulse to the desired magnet switch, selecting the desired mode usleep(3 * SETMODE_SLEEP_TIME); // Turn ON the single dish mode on port number 13 @@ -901,6 +915,19 @@ void ReceiverControl::setSingleDishMode( port_number_sd, value_sd ); + + // We can switch off the TTL impulse after some time, setting the relative bit to 1 again + usleep(3 * SETMODE_SLEEP_TIME); + // Turn OFF the single dish mode on port number 13 + makeRequest( + m_dewar_board_ptr, // Pointer to the dewar board + MCB_CMD_SET_DATA, // Command to send + 4, // Number of parameters + data_type, + port_type, + port_number_sd, + !value_sd + ); pthread_mutex_unlock(&m_dewar_mutex); } catch(MicroControllerBoardEx& ex) { @@ -961,9 +988,22 @@ void ReceiverControl::setVLBIMode( port_number_sd, value_sd ); + + // Turn OFF the VLBI mode on port number 14 + makeRequest( + m_dewar_board_ptr, // Pointer to the dewar board + MCB_CMD_SET_DATA, // Command to send + 4, // Number of parameters + data_type, + port_type, + port_number_vlbi, + !value_vlbi + ); + + // Now the bits 13 and 14 are set to 1, meaning no current is now traversing any switch magnet and no mode is currently selected + // We need to set the bit 14 to 0, which will send a TTL impulse to the desired magnet switch, selecting the desired mode usleep(3 * SETMODE_SLEEP_TIME); - // Turn ON the VLBI mode on port number 14 makeRequest( m_dewar_board_ptr, // Pointer to the dewar board @@ -974,6 +1014,19 @@ void ReceiverControl::setVLBIMode( port_number_vlbi, value_vlbi ); + + // We can switch off the TTL impulse after some time, setting the relative bit to 1 again + usleep(3 * SETMODE_SLEEP_TIME); + // Turn OFF the VLBI mode on port number 14 + makeRequest( + m_dewar_board_ptr, // Pointer to the dewar board + MCB_CMD_SET_DATA, // Command to send + 4, // Number of parameters + data_type, + port_type, + port_number_vlbi, + !value_vlbi + ); pthread_mutex_unlock(&m_dewar_mutex); } catch(MicroControllerBoardEx& ex) { -- GitLab From c50f75959366449b60455a316f362197b8250413 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 19 Feb 2024 21:04:56 +0000 Subject: [PATCH 077/150] Updated logging for SRTMinorServos --- .../SRTMinorServoLibrary/src/Makefile | 6 ++--- .../include/SRTMinorServoBossImpl.h | 1 - .../include/SRTMinorServoCommon.h | 21 +++++++++++++--- .../src/SRTMinorServoBossCore.cpp | 25 ++++++++++++------- .../src/SRTMinorServoBossImpl.cpp | 17 ++++++------- .../src/SRTMinorServoParkThread.cpp | 2 +- .../src/SRTMinorServoScanThread.cpp | 2 +- .../src/SRTMinorServoSetupThread.cpp | 10 ++++---- .../src/SRTMinorServoTrackingThread.cpp | 2 +- 9 files changed, 52 insertions(+), 34 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 6385508ce..0c507e996 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -59,10 +59,10 @@ INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMino # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary PySRTMinorServoCommandLibrary +LIBRARIES = SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary PySRTMinorServoCommandLibrary #SRTMinorServoLibrary LIBRARIES_L = -SRTMinorServoLibrary_OBJECTS = hexlib -SRTMinorServoLibrary_LIBS = gsl gslcblas m +#SRTMinorServoLibrary_OBJECTS = hexlib +#SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -fconcepts SRTMinorServoCommandLibrary_LIBS = pthread IRALibrary diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index 6f15aafac..b93e90ed1 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -19,7 +19,6 @@ #include "MinorServoErrors.h" #include "SRTMinorServoBossCore.h" #include "SRTMinorServoStatusThread.h" -#include "SRTMinorServoUtils.h" #include "MSDevIOs.h" using namespace MinorServo; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h index ed59c4865..f808395e2 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -22,11 +22,24 @@ /** * Macro used to link the properties pointers to their methods. */ -#define GET_PROPERTY_REFERENCE(TYPE, CLASSNAME, PROPERTY, PROPERTYNAME) TYPE##_ptr CLASSNAME::PROPERTYNAME()\ +#define GET_PROPERTY_REFERENCE(TYPE, CLASSNAME, PROPERTY, PROPERTYNAME) TYPE##_ptr CLASSNAME::PROPERTYNAME() \ { \ - if (PROPERTY==0) return TYPE::_nil(); \ - TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ - return tmp._retn(); \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + +/** + * Macro used to show the error on the operatorInput and on the jlog since the parser does not log Ex type exceptions + */ +#define LOG_EX(EXTYPE) \ +{ \ + EXTYPE##Impl impl(ex); \ + std::string _command(cmd); \ + std::string error = _command.substr(0, _command.find('=')) + "?"; \ + SP::CFormatter::exceptionToUser(impl, out); \ + error += out; \ + out = error.c_str(); \ } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 45c3faf21..34211e5e9 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -75,7 +75,7 @@ bool SRTMinorServoBossCore::status() { if(m_socket_connected.load() == Management::MNG_TRUE) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_NOTICE, "Socket disconnected.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Socket disconnected.")); m_socket_connected.store(Management::MNG_FALSE); stopThread(m_setup_thread); @@ -94,8 +94,9 @@ bool SRTMinorServoBossCore::status() { checkLineStatus(); } - catch(...) + catch(MinorServoErrors::MinorServoErrorsEx& ex) { + _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoBossCore::status()", getReasonFromEx(ex)); setFailure(); return false; } @@ -110,7 +111,7 @@ bool SRTMinorServoBossCore::status() SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.current_configuration()->get_sync(comp.out()) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; if(m_component.gregorian_cover()->get_sync(comp.out()) != commanded_gregorian_cover_position) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_ERROR, "Gregorian cover in wrong position.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Gregorian cover in wrong position.")); setFailure(); return false; } @@ -120,6 +121,7 @@ bool SRTMinorServoBossCore::status() { if(!servo->status()) { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, ("Error checking " + name + " status.").c_str())); setFailure(); return false; } @@ -1079,7 +1081,7 @@ bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorSer // Check if we are already performing another scan if(m_scan_active.load() == Management::MNG_TRUE) { - ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossCore::checkScan(): The system is waiting for a scan to be completed.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::checkScan()", (LM_CRITICAL, "The system is waiting for a scan to be completed.")); ms_parameters = ms_param_var._retn(); return false; } @@ -1105,7 +1107,7 @@ bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorSer SRTMinorServoMotionStatus motion_status = m_motion_status.load(); if(motion_status != MOTION_STATUS_TRACKING && motion_status != MOTION_STATUS_CONFIGURED) { - ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossCore::checkScan(): The system is not ready yet.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::checkScan()", (LM_CRITICAL, "The system is not ready yet.")); ms_parameters = ms_param_var._retn(); return false; } @@ -1149,6 +1151,7 @@ void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoSca if(scan_info.is_empty_scan) { start_time = getTimeStamp(); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startScan()", (LM_NOTICE, "Empty scan, nothing to do.")); return; } @@ -1171,6 +1174,7 @@ void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoSca m_current_scan = scan; start_time = scan.start_time; m_scan_active.store(Management::MNG_TRUE); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startScan()", (LM_NOTICE, "Scan started.")); startThread(m_scan_thread); } @@ -1199,6 +1203,7 @@ void SRTMinorServoBossCore::closeScan(ACS::Time& close_time) // Set the close_time close_time = std::max(getTimeStamp(), m_last_scan.close_time); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::closeScan()", (LM_NOTICE, "Scan closed.")); } double SRTMinorServoBossCore::getElevation(const ACS::Time& acs_time) @@ -1241,29 +1246,29 @@ void SRTMinorServoBossCore::checkLineStatus() if(!m_socket.isConnected()) { - setFailure(); _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("Socket not connected."); ex.log(LM_DEBUG); + setFailure(); throw ex.getMinorServoErrorsEx(); } ACSErr::Completion_var comp; if(m_component.control()->get_sync(comp.out()) != CONTROL_DISCOS) { - setFailure(); _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system is not controlled by DISCOS."); ex.log(LM_DEBUG); + setFailure(); throw ex.getMinorServoErrorsEx(); } if(m_component.emergency()->get_sync(comp.out()) == Management::MNG_TRUE) { - setFailure(); _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system in emergency status."); ex.log(LM_DEBUG); + setFailure(); throw ex.getMinorServoErrorsEx(); } } @@ -1300,10 +1305,10 @@ void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sle catch(acsthreadErrType::CanNotSpawnThreadExImpl& impl) { // The thread failed to start for some reason - setFailure(); _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, "SRTMinorServoBossCore::startThread()"); ex.setThreadName(T::c_thread_name); ex.log(LM_DEBUG); + setFailure(); throw ex.getComponentErrorsEx(); } @@ -1338,6 +1343,8 @@ void SRTMinorServoBossCore::destroyThread(T*& thread) thread->terminate(); m_component.getContainerServices()->getThreadManager()->destroy(thread); } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::destroyThread()", (LM_NOTICE, (std::string(T::c_thread_name) + " destroyed.").c_str())); } void SRTMinorServoBossCore::setFailure() diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index c13d13237..adbea5583 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -117,8 +117,8 @@ void SRTMinorServoBossImpl::cleanUp() { AUTO_TRACE("SRTMinorServoBossImpl::cleanUp()"); stopPropertiesMonitoring(); - _IRA_LOGFILTER_FLUSH; - _IRA_LOGFILTER_DESTROY; + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::cleanUp(); } @@ -126,8 +126,8 @@ void SRTMinorServoBossImpl::aboutToAbort() { AUTO_TRACE("SRTMinorServoBossImpl::aboutToAbort()"); stopPropertiesMonitoring(); - _IRA_LOGFILTER_FLUSH; - _IRA_LOGFILTER_DESTROY; + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; CharacteristicComponentImpl::aboutToAbort(); } @@ -365,20 +365,19 @@ CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out } catch(MinorServoErrors::MinorServoErrorsEx& ex) { - // Only print the routine, the reason is automatically provided in the message inside the jlog. - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + LOG_EX(MinorServoErrors::MinorServoErrorsEx); } catch(ComponentErrors::ComponentErrorsEx& ex) { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + LOG_EX(ComponentErrors::ComponentErrorsEx); } catch(ManagementErrors::ConfigurationErrorEx& ex) { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + LOG_EX(ManagementErrors::ConfigurationErrorEx); } catch(ManagementErrors::ParkingErrorEx& ex) { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + LOG_EX(ManagementErrors::ParkingErrorEx); } catch(...) // Unknown exception. If the above catch blocks are written correctly we should never get here. { diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 19083e185..fce41d864 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -50,7 +50,7 @@ void SRTMinorServoParkThread::runLoop() if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::runLoop()", (LM_ERROR, "Timeout while performing a park operation.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::runLoop()", (LM_CRITICAL, "Timeout while performing a park operation.")); m_core.setFailure(); this->setStopped(); return; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index ec1d9029c..8bda998a8 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -156,7 +156,7 @@ void SRTMinorServoScanThread::runLoop() bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; if(!return_value) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_ERROR, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); } return return_value; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 6f407d53f..1bcec7b37 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -55,7 +55,7 @@ void SRTMinorServoSetupThread::runLoop() if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Timeout while performing a setup operation.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Timeout while performing a setup operation.")); m_core.setFailure(); this->setStopped(); return; @@ -96,7 +96,7 @@ void SRTMinorServoSetupThread::runLoop() { if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", m_gregorian_cover_position)).checkOutput()) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Received NAK when setting the gregorian cover position.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK when setting the gregorian cover position.")); m_core.setFailure(); this->setStopped(); return; @@ -111,7 +111,7 @@ void SRTMinorServoSetupThread::runLoop() { if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration)).checkOutput()) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Received NAK in response to a SETUP command.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK in response to a SETUP command.")); m_core.setFailure(); this->setStopped(); return; @@ -123,7 +123,7 @@ void SRTMinorServoSetupThread::runLoop() } catch(...) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, "Communication error while sending a SETUP command.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Communication error while sending a SETUP command.")); m_core.setFailure(); this->setStopped(); return; @@ -167,7 +167,7 @@ void SRTMinorServoSetupThread::runLoop() } catch(...) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_ERROR, ("Error while loading a SETUP to servo'" + servo_name + "'.").c_str())); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, ("Error while loading a SETUP to servo'" + servo_name + "'.").c_str())); m_core.setFailure(); this->setStopped(); return; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 55e8ba5e5..22abf3a83 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -79,7 +79,7 @@ void SRTMinorServoTrackingThread::runLoop() bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; if(!return_value) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_ERROR, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); } return return_value; } -- GitLab From 0630c56561e34ab26adcc6f1d788dba4ffa0d07f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 19 Feb 2024 22:20:13 +0000 Subject: [PATCH 078/150] Updated SRTMinorServo socket disconnect logging --- SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 34211e5e9..fc1ea8fa2 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -75,7 +75,7 @@ bool SRTMinorServoBossCore::status() { if(m_socket_connected.load() == Management::MNG_TRUE) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Socket disconnected.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, (std::string("Socket disconnected: ") + getReasonFromEx(ex)).c_str())); m_socket_connected.store(Management::MNG_FALSE); stopThread(m_setup_thread); -- GitLab From 089cc82e2ab884b05eca4d2f82b94b5135a1b7b7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 20 Feb 2024 10:38:23 +0000 Subject: [PATCH 079/150] Fixed small bug in servos axes naming, improved logging --- .../SRTMinorServo/src/SRTMinorServoBossCore.cpp | 12 +++++------- .../SRTMinorServo/src/SRTMinorServoBossImpl.cpp | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index fc1ea8fa2..917188b00 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -886,6 +886,11 @@ void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS:: ACS::stringSeq_var servo_axes_units; servo->getAxesInfo(servo_axes_names, servo_axes_units); + std::transform(servo_axes_names->begin(), servo_axes_names->end(), servo_axes_names->begin(), [servo_name](const char* axis_name) + { + return CORBA::string_dup((servo_name + "_" + axis_name).c_str()); + }); + size_t names_index = axes_names->length(); size_t units_index = axes_units->length(); axes_names->length(names_index + servo_axes_names->length()); @@ -1323,13 +1328,6 @@ void SRTMinorServoBossCore::stopThread(T*& thread) if(thread != nullptr && thread->isAlive()) { thread->stop(); - // We might not need this block, but if the previous call is blocking we won't get here anyway, better keep it - while(thread->isAlive()) - { - // TODO: remove this if found unnecessary - std::cout << "waiting thread" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(5)); - } } } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index adbea5583..a9d2eb993 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -33,11 +33,15 @@ SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, m_last_executed_command_ptr(this) { AUTO_TRACE("SRTMinorServoBossImpl::SRTMinorServoBossImpl()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "COMPONENT CREATED")); } SRTMinorServoBossImpl::~SRTMinorServoBossImpl() { AUTO_TRACE("SRTMinorServoBossImpl::~SRTMinorServoBossImpl()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "COMPONENT DESTROYED")); } void SRTMinorServoBossImpl::initialize() @@ -95,7 +99,7 @@ void SRTMinorServoBossImpl::initialize() throw ex.getComponentErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "PROPERTIES INITIALIZED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "PROPERTIES INITIALIZED")); m_parser.add("servoSetup", new SP::function1>(this, &SRTMinorServoBossImpl::setup), 1); m_parser.add("servoPark", new SP::function0(this, &SRTMinorServoBossImpl::park), 0); @@ -105,17 +109,22 @@ void SRTMinorServoBossImpl::initialize() m_parser.add("clearServoOffsets", new SP::function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); //m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "PARSER INITIALIZED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "PARSER INITIALIZED")); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "COMPONENT INITIALIZED")); } void SRTMinorServoBossImpl::execute() { AUTO_TRACE("SRTMinorServoBossImpl::execute()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::execute()", (LM_NOTICE, "STARTING TO ACCEPT FUNCTIONAL CALLS")); } void SRTMinorServoBossImpl::cleanUp() { AUTO_TRACE("SRTMinorServoBossImpl::cleanUp()"); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::cleanUp()", (LM_NOTICE, "CLEANING UP RESOURCES")); stopPropertiesMonitoring(); _IRA_LOGFILTER_FLUSH; _IRA_LOGFILTER_DESTROY; @@ -125,6 +134,7 @@ void SRTMinorServoBossImpl::cleanUp() void SRTMinorServoBossImpl::aboutToAbort() { AUTO_TRACE("SRTMinorServoBossImpl::aboutToAbort()"); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::aboutToAbort()", (LM_NOTICE, "ATTEMPTING TO CLEAN UP RESOURCES")); stopPropertiesMonitoring(); _IRA_LOGFILTER_FLUSH; _IRA_LOGFILTER_DESTROY; -- GitLab From acbd60bd60a44493b7f9a88a58db3d523374da49 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 20 Feb 2024 10:49:12 +0000 Subject: [PATCH 080/150] Removing mistakingly pushed instruction form procedure --- .../CDB/alma/Procedures/StationProcedures/StationProcedures.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 4d86ea178..1c63bba48 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -20,7 +20,6 @@ antennaSetup=CCG - servoSetup=CCG receiversSetup=CCG chooseBackend=TotalPower initialize=CCG -- GitLab From 56d2f4d18efea1959abc73d51b5b15eceb770ea3 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 23 Feb 2024 01:32:29 +0000 Subject: [PATCH 081/150] Removed most of get_sync calls --- .../idl/SRTMinorServo.idl | 9 +- .../include/SRTMinorServoBossCore.h | 10 + .../include/SRTMinorServoBossImpl.h | 20 ++ .../include/SRTMinorServoCommon.h | 11 - .../SRTMinorServo/include/SRTMinorServoImpl.h | 49 +++- .../src/SRTBaseMinorServoImpl.cpp | 60 +++-- .../src/SRTMinorServoBossCore.cpp | 251 +++++++----------- .../src/SRTMinorServoBossImpl.cpp | 20 +- .../src/SRTMinorServoParkThread.cpp | 5 +- .../src/SRTMinorServoScanThread.cpp | 99 +++---- .../src/SRTMinorServoSetupThread.cpp | 63 +++-- .../src/SRTMinorServoTrackingThread.cpp | 71 ++--- .../src/SRTProgramTrackMinorServoImpl.cpp | 15 +- 13 files changed, 336 insertions(+), 347 deletions(-) diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 93b9ebc9d..9177b2853 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -125,8 +125,9 @@ module MinorServo * This method loads from the CDB the positioning coefficients related to the given configuration * @param configuration the string representing the name of the table from which the coefficients will be loaded * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration + * @return true if the servo is in use with the current configuration, false otherwise */ - void setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx); + boolean setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx); /** * This method calculates the servo coordinates for a given elevation @@ -265,6 +266,12 @@ module MinorServo * when there has been a communication error or when the command was not accepted */ void programTrack(in long trajectory_id, in long point_id, in ACS::Time point_time, in ACS::doubleSeq coordinates); + + /** + * This method returns a boolean indicating if the servo is tracking or not + * @return true if the servo is tracking, false otherwise + */ + boolean isTracking(); }; }; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index 73ea3c816..7471c29f8 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -413,6 +413,16 @@ private: */ const std::map m_tracking_servos; + /** + * Map that will dynamically be updated containing the current configuration's minor servos. + */ + std::map m_current_servos; + + /** + * Map that will dynamically be updated containing the current configuration's tracking minor servos. + */ + std::map m_current_tracking_servos; + /** * Current scan parameters. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index b93e90ed1..9f1aebf6c 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -498,6 +498,11 @@ private: */ baci::SmartPropertyPointer> m_tracking_ptr; + /** + * DevIO of the current_configuration property. + */ + MSAnswerMapDevIO* m_current_configuration_devio; + /** * Pointer to the current_configuration property. */ @@ -518,6 +523,11 @@ private: */ baci::SmartPropertyPointer m_plc_version_ptr; + /** + * DevIO of the control property. + */ + MSAnswerMapDevIO* m_control_devio; + /** * Pointer to the control property. */ @@ -528,11 +538,21 @@ private: */ baci::SmartPropertyPointer> m_power_ptr; + /** + * DevIO of the emergency property. + */ + MSAnswerMapDevIO* m_emergency_devio; + /** * Pointer to the emergency property. */ baci::SmartPropertyPointer> m_emergency_ptr; + /** + * DevIO of the gregorian_cover property. + */ + MSAnswerMapDevIO* m_gregorian_cover_devio; + /** * Pointer to the gregorian_cover property. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h index f808395e2..cf1070637 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -107,17 +107,6 @@ namespace MinorServo (CONFIGURATION_BWG2, 22) (CONFIGURATION_BWG3, 23) (CONFIGURATION_BWG4, 24); - - /** - * This is a simple list indicating the order of the minor servo components. - */ - const std::vector ServoOrder = - { - //"PFP", - "SRP", - //"GFR", - //"M3R" - }; } #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index 204354bcf..374576200 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -105,8 +105,9 @@ public: * Asks the servo system to load the commanded configuration table. * @param configuration_name the configuration the servo system should assume. * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. + * @return true if the servo is in use with the current configuration, false otherwise */ - void setup(const char* configuration_name = ""); + bool setup(const char* configuration_name = ""); /** * Asks the component to calculate the servo system position starting from the given elevation. @@ -331,7 +332,6 @@ protected: */ const size_t m_virtual_axes; private: - /** * Number of physical axes of the servo system. */ @@ -347,6 +347,15 @@ private: */ const std::vector m_virtual_axes_units; protected: + /** + * Commanded user offsets for each axis of the servo system. + */ + std::vector m_user_offsets; + + /** + * Commanded system offsets for each axis of the servo system. + */ + std::vector m_system_offsets; /** * Queue of positions assumed by the servo system in time. @@ -388,16 +397,6 @@ private: */ std::vector m_c_s; - /** - * Commanded user offsets for each axis of the servo system. - */ - std::vector m_user_offsets; - - /** - * Commanded system offsets for each axis of the servo system. - */ - std::vector m_system_offsets; - /** * Boolean indicating whether the servo system is used in the current focal configuration. */ @@ -413,11 +412,21 @@ private: */ baci::SmartPropertyPointer> m_enabled_ptr; + /** + * DevIO of the drive_cabinet_status property. + */ + MSAnswerMapDevIO* m_drive_cabinet_status_devio; + /** * Pointer to the drive_cabinet_status property. */ baci::SmartPropertyPointer> m_drive_cabinet_status_ptr; + /** + * DevIO of the block property. + */ + MSAnswerMapDevIO* m_block_devio; + /** * Pointer to the block property. */ @@ -448,11 +457,23 @@ private: */ baci::SmartPropertyPointer m_plain_virtual_positions_ptr; + /** + * DevIO of the virtual_positions property. + */ + MSVirtualPositionsDevIO* m_virtual_positions_devio; + /** * Pointer to the virtual_positions property. */ baci::SmartPropertyPointer m_virtual_positions_ptr; +protected: + /** + * DevIO of the virtual_offsets property. + */ + MSAnswerMapDevIO* m_virtual_offsets_devio; + +private: /** * Pointer to the virtual_offsets property. */ @@ -569,7 +590,7 @@ public: /** * Setup method definition. It simply calls the SRTBaseMinorServoImpl method. */ - void setup(const char* configuration_name = "") { SRTBaseMinorServoImpl::setup(configuration_name); } + bool setup(const char* configuration_name = "") { return SRTBaseMinorServoImpl::setup(configuration_name); } /** * Declaration of all the other inherited methods. @@ -620,7 +641,7 @@ public: * @param configuration_name the configuration the servo system should assume. * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. */ - void setup(const char* configuration_name = ""); + bool setup(const char* configuration_name = ""); /** * Declaration of all the other inherited methods. diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 53d02c054..5df1f27a6 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -11,6 +11,8 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_physical_axes(getCDBValue(container_services, "physical_axes")), m_virtual_axes_names(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_positions")), m_virtual_axes_units(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_user_offsets(m_virtual_axes, 0.0), + m_system_offsets(m_virtual_axes, 0.0), m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), m_min(SRTBaseMinorServoImpl::getMotionConstant(*this, "min_range")), m_max(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_range")), @@ -19,19 +21,21 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_r_t(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_times")), m_r_d(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_distances")), m_c_s(m_virtual_axes, 0.0), - m_user_offsets(m_virtual_axes, 0.0), - m_system_offsets(m_virtual_axes, 0.0), m_in_use(Management::MNG_FALSE), m_current_setup(""), m_enabled_ptr(this), + m_drive_cabinet_status_devio(nullptr), m_drive_cabinet_status_ptr(this), + m_block_devio(nullptr), m_block_ptr(this), m_operative_mode_ptr(this), m_physical_axes_enabled_ptr(this), m_physical_positions_ptr(this), m_virtual_axes_ptr(this), m_plain_virtual_positions_ptr(this), + m_virtual_positions_devio(nullptr), m_virtual_positions_ptr(this), + m_virtual_offsets_devio(nullptr), m_virtual_offsets_ptr(this), m_virtual_user_offsets_ptr(this), m_virtual_system_offsets_ptr(this), @@ -57,10 +61,10 @@ void SRTBaseMinorServoImpl::initialize() { m_enabled_ptr = new ROEnumImpl((m_component_name + ":enabled").c_str(), getComponent(), new MSAnswerMapDevIO(m_servo_name, "enabled", "ENABLED", m_status), true); - m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "drive_cabinet_status", "STATUS", m_status), true); - m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "block", "BLOCK", m_status), true); + m_drive_cabinet_status_devio = new MSAnswerMapDevIO(m_servo_name, "drive_cabinet_status", "STATUS", m_status); + m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), m_drive_cabinet_status_devio, true); + m_block_devio = new MSAnswerMapDevIO(m_servo_name, "block", "BLOCK", m_status); + m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), m_block_devio, true); m_operative_mode_ptr = new ROEnumImpl((m_component_name + ":operative_mode").c_str(), getComponent(), new MSAnswerMapDevIO(m_servo_name, "operative_mode", "OPERATIVE_MODE", m_status), true); m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), @@ -72,10 +76,10 @@ void SRTBaseMinorServoImpl::initialize() m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), new MSAnswerMapDevIO(m_servo_name, "virtual_positions", m_virtual_axes_names, m_status), true); std::vector virtual_offsets = SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets"); - m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), - new MSVirtualPositionsDevIO(m_servo_name, m_virtual_axes_names, virtual_offsets, m_status), true); - m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "virtual_offsets", virtual_offsets, m_status), true); + m_virtual_positions_devio = new MSVirtualPositionsDevIO(m_servo_name, m_virtual_axes_names, virtual_offsets, m_status); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), m_virtual_positions_devio, true); + m_virtual_offsets_devio = new MSAnswerMapDevIO(m_servo_name, "virtual_offsets", virtual_offsets, m_status); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), m_virtual_offsets_devio, true); m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_user_offsets").c_str(), getComponent(), new MSGenericDevIO>(m_user_offsets), true); m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_system_offsets").c_str(), getComponent(), @@ -129,8 +133,8 @@ bool SRTBaseMinorServoImpl::status() { m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); - ACSErr::Completion_var comp; - ACS::doubleSeq current_point = *virtual_positions()->get_sync(comp.out()); + ACS::Time comp; + ACS::doubleSeq current_point = m_virtual_positions_devio->read(comp); // Calculate the current speed of the axes try @@ -201,14 +205,13 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) } std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - - // Read the current servo offsets - ACSErr::Completion_var comp; - ACS::doubleSeq offsets = *virtual_offsets()->get_sync(comp.out()); + ACS::Time comp; + ACS::doubleSeq offsets = m_virtual_offsets_devio->read(comp); for(size_t i = 0; i < m_virtual_axes; i++) { - if(coordinates[i] + offsets[i] < m_min[i] || coordinates[i] + offsets[i] > m_max[i]) + double coordinate = coordinates[i] + offsets[i]; + if(coordinate < m_min[i] || coordinate > m_max[i]) { _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); ex.addData("Reason", "Resulting position out of range, check the offsets."); @@ -226,7 +229,7 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) } } -void SRTBaseMinorServoImpl::setup(const char* configuration_name) +bool SRTBaseMinorServoImpl::setup(const char* configuration_name) { AUTO_TRACE(m_servo_name + "::setup()"); m_in_use.store(Management::MNG_FALSE); @@ -238,7 +241,7 @@ void SRTBaseMinorServoImpl::setup(const char* configuration_name) if(setup_name.empty()) { - return; + return false; } IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); @@ -294,6 +297,8 @@ void SRTBaseMinorServoImpl::setup(const char* configuration_name) clearSystemOffsets(); m_in_use.store(Management::MNG_TRUE); } + + return true; } ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) @@ -496,8 +501,8 @@ void SRTBaseMinorServoImpl::reloadOffsets() std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); // Read the Leonardo offsets - ACSErr::Completion_var comp; - ACS::doubleSeq sequence = *virtual_offsets()->get_sync(comp.out()); + ACS::Time comp; + ACS::doubleSeq sequence = m_virtual_offsets_devio->read(comp); std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); // Check if the offsets correspond or not @@ -539,6 +544,12 @@ ACS::doubleSeq* SRTBaseMinorServoImpl::getAxesPositions(ACS::Time acs_time) { AUTO_TRACE("SRTBaseMinorServoImpl::getAxesPositions()"); + // Get the latest position + if(acs_time == 0) + { + acs_time = getTimeStamp(); + } + try { std::vector p = m_positions_queue.get(acs_time).second; @@ -568,8 +579,7 @@ ACS::TimeInterval SRTBaseMinorServoImpl::getTravelTime(const ACS::doubleSeq& _s_ // No starting coordinates, it means we have to start from the current position taking into account the current speed if(_s_p.length() == 0) { - ACSErr::Completion_var comp; - s_p = *virtual_positions()->get_sync(comp.out()); + s_p = *getAxesPositions(0); } else if(_s_p.length() != m_virtual_axes) { @@ -662,8 +672,8 @@ void SRTBaseMinorServoImpl::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - ACSErr::Completion_var comp; - if(block()->get_sync(comp.out()) == Management::MNG_TRUE || drive_cabinet_status()->get_sync(comp.out()) == DRIVE_CABINET_ERROR) + ACS::Time comp; + if(m_block_devio->read(comp) == Management::MNG_TRUE || m_drive_cabinet_status_devio->read(comp) == DRIVE_CABINET_ERROR) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); ex.setReason("Servo system blocked or drive cabinet error."); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 917188b00..5d3cd1997 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -102,14 +102,14 @@ bool SRTMinorServoBossCore::status() } // Call servo status - ACSErr::Completion_var comp; + //ACS::Time comp; SRTMinorServoMotionStatus motion_status = m_motion_status.load(); /*if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) { // We only get here if the system is configured, therefore we check the correct position of the gregorian cover - SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.current_configuration()->get_sync(comp.out()) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; - if(m_component.gregorian_cover()->get_sync(comp.out()) != commanded_gregorian_cover_position) + SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.m_current_configuration_devio->read(comp) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + if(m_component.m_gregorian_cover_devio->read(comp) != commanded_gregorian_cover_position) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Gregorian cover in wrong position.")); setFailure(); @@ -136,14 +136,9 @@ bool SRTMinorServoBossCore::status() if(motion_status == MOTION_STATUS_TRACKING) { - if(std::all_of(m_tracking_servos.begin(), m_tracking_servos.end(), [](const std::pair& servo) -> bool + if(std::all_of(m_current_tracking_servos.begin(), m_current_tracking_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_FALSE) - { - return true; - } - return servo.second->tracking()->get_sync(comp.out()) == Management::MNG_TRUE ? true : false; })) { @@ -243,8 +238,10 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) m_scanning.store(Management::MNG_FALSE); m_tracking.store(Management::MNG_FALSE); m_motion_status.store(MOTION_STATUS_STARTING); + m_current_servos.clear(); + m_current_tracking_servos.clear(); - // Send the STOP command to each servo + // Send the STOP command to all the servos for(const auto& [servo_name, servo] : m_servos) { try @@ -333,6 +330,8 @@ void SRTMinorServoBossCore::park() m_scanning.store(Management::MNG_FALSE); m_tracking.store(Management::MNG_FALSE); m_motion_status.store(MOTION_STATUS_PARKING); + m_current_servos.clear(); + m_current_tracking_servos.clear(); /*try { @@ -355,7 +354,7 @@ void SRTMinorServoBossCore::park() throw ex.getParkingErrorEx(); }*/ - // Send the STOP command to each servo + // Send the STOP command to all the servos for(const auto& [servo_name, servo] : m_servos) { try @@ -547,14 +546,9 @@ void SRTMinorServoBossCore::preset(double elevation) throw ex.getMinorServoErrorsEx(); } - ACSErr::Completion_var comp; - - for(const auto& [servo_name, servo] : m_servos) + for(const auto& [servo_name, servo] : m_current_servos) { - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - servo->preset(*servo->calcCoordinates(elevation)); - } + servo->preset(*servo->calcCoordinates(elevation)); } } @@ -583,38 +577,31 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); - ACSErr::Completion_var comp; if(servo_name == "ALL") { - for(const auto& [servo_name, servo] : m_servos) + for(const auto& [servo_name, servo] : m_current_servos) { - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { servo->clearUserOffsets(); - } } return; } + else if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } try { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - servo->clearUserOffsets(); - } - else - { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); - ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); - ex.log(LM_DEBUG); - throw ex.getMinorServoErrorsEx(); - } + auto servo = m_current_servos.at(servo_name); + servo->clearUserOffsets(); } catch(std::out_of_range& oor) { _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); - ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } @@ -650,30 +637,27 @@ void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double of std::getline(ss, servo_name, '_'); ss >> axis_name; + if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + try { - auto servo = m_servos.at(servo_name); - ACSErr::Completion_var comp; - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - if(log) - { - ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_NOTICE, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); - } - servo->setUserOffset(axis_name.c_str(), offset); - } - else + auto servo = m_current_servos.at(servo_name); + if(log) { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); - ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); - ex.log(LM_DEBUG); - throw ex.getMinorServoErrorsEx(); + ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_NOTICE, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); } + servo->setUserOffset(axis_name.c_str(), offset); } catch(std::out_of_range& oor) { _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); - ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } @@ -693,18 +677,13 @@ ACS::doubleSeq* SRTMinorServoBossCore::getUserOffsets() } ACS::doubleSeq_var offsets = new ACS::doubleSeq; - ACSErr::Completion_var comp; - for(const auto& servo_name : ServoOrder) + for(const auto& [servo_name, servo] : m_current_servos) { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - ACS::doubleSeq servo_offsets = *servo->getUserOffsets(); - size_t start_index = offsets->length(); - offsets->length(start_index + servo_offsets.length()); - std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); - } + ACS::doubleSeq servo_offsets = *servo->getUserOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); } return offsets._retn(); @@ -735,38 +714,31 @@ void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); - ACSErr::Completion_var comp; if(servo_name == "ALL") { - for(const auto& [servo_name, servo] : m_servos) + for(const auto& [servo_name, servo] : m_current_servos) { - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - servo->clearSystemOffsets(); - } + servo->clearSystemOffsets(); } return; } + else if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } try { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - servo->clearSystemOffsets(); - } - else - { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); - ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); - ex.log(LM_DEBUG); - throw ex.getMinorServoErrorsEx(); - } + auto servo = m_current_servos.at(servo_name); + servo->clearSystemOffsets(); } catch(std::out_of_range& oor) { _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); - ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } @@ -802,26 +774,23 @@ void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double std::getline(ss, servo_name, '_'); ss >> axis_name; + if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + try { - auto servo = m_servos.at(servo_name); - ACSErr::Completion_var comp; - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - servo->setSystemOffset(axis_name.c_str(), offset); - } - else - { - _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); - ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); - ex.log(LM_DEBUG); - throw ex.getMinorServoErrorsEx(); - } + auto servo = m_current_servos.at(servo_name); + servo->setSystemOffset(axis_name.c_str(), offset); } catch(std::out_of_range& oor) { _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); - ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } @@ -841,18 +810,13 @@ ACS::doubleSeq* SRTMinorServoBossCore::getSystemOffsets() } ACS::doubleSeq_var offsets = new ACS::doubleSeq; - ACSErr::Completion_var comp; - for(const auto& servo_name : ServoOrder) + for(const auto& [servo_name, servo] : m_current_servos) { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - ACS::doubleSeq servo_offsets = *servo->getSystemOffsets(); - size_t start_index = offsets->length(); - offsets->length(start_index + servo_offsets.length()); - std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); - } + ACS::doubleSeq servo_offsets = *servo->getSystemOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); } return offsets._retn(); @@ -876,28 +840,23 @@ void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS:: ACS::stringSeq_var axes_names = new ACS::stringSeq; ACS::stringSeq_var axes_units = new ACS::stringSeq; - ACSErr::Completion_var comp; - for(const auto& servo_name : ServoOrder) + for(const auto& [servo_name, servo] : m_current_servos) { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + ACS::stringSeq_var servo_axes_names; + ACS::stringSeq_var servo_axes_units; + servo->getAxesInfo(servo_axes_names, servo_axes_units); + + std::transform(servo_axes_names->begin(), servo_axes_names->end(), servo_axes_names->begin(), [servo_name](const char* axis_name) { - ACS::stringSeq_var servo_axes_names; - ACS::stringSeq_var servo_axes_units; - servo->getAxesInfo(servo_axes_names, servo_axes_units); + return CORBA::string_dup((servo_name + "_" + axis_name).c_str()); + }); - std::transform(servo_axes_names->begin(), servo_axes_names->end(), servo_axes_names->begin(), [servo_name](const char* axis_name) - { - return CORBA::string_dup((servo_name + "_" + axis_name).c_str()); - }); - - size_t names_index = axes_names->length(); - size_t units_index = axes_units->length(); - axes_names->length(names_index + servo_axes_names->length()); - axes_units->length(units_index + servo_axes_units->length()); - std::copy(servo_axes_names->begin(), servo_axes_names->end(), axes_names->begin() + names_index); - std::copy(servo_axes_units->begin(), servo_axes_units->end(), axes_units->begin() + units_index); - } + size_t names_index = axes_names->length(); + size_t units_index = axes_units->length(); + axes_names->length(names_index + servo_axes_names->length()); + axes_units->length(units_index + servo_axes_units->length()); + std::copy(servo_axes_names->begin(), servo_axes_names->end(), axes_names->begin() + names_index); + std::copy(servo_axes_units->begin(), servo_axes_units->end(), axes_units->begin() + units_index); } axes_names_out = axes_names._retn(); @@ -916,18 +875,13 @@ ACS::doubleSeq* SRTMinorServoBossCore::getAxesPositions(ACS::Time acs_time) } ACS::doubleSeq_var positions = new ACS::doubleSeq; - ACSErr::Completion_var comp; - for(const auto& servo_name : ServoOrder) + for(const auto& [servo_name, servo] : m_current_servos) { - auto servo = m_servos.at(servo_name); - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - ACS::doubleSeq servo_positions = *servo->getAxesPositions(acs_time); - size_t start_index = positions->length(); - positions->length(start_index + servo_positions.length()); - std::copy(servo_positions.begin(), servo_positions.end(), positions->begin() + start_index); - } + ACS::doubleSeq servo_positions = *servo->getAxesPositions(acs_time); + size_t start_index = positions->length(); + positions->length(start_index + servo_positions.length()); + std::copy(servo_positions.begin(), servo_positions.end(), positions->begin() + start_index); } return positions._retn(); @@ -955,28 +909,26 @@ SRTMinorServoScan SRTMinorServoBossCore::checkScanFeasibility(const ACS::Time& s ACS::stringSeq_var servo_axes_names, servo_axes_units; - SRTBaseMinorServo_ptr servo; - - try + if(!m_servos.count(servo_name)) { - servo = m_tracking_servos.at(servo_name); + ex.setReason(("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); } - catch(std::out_of_range& oor) + else if(!m_tracking_servos.count(servo_name)) { - ex.setReason(("Unknown servo '" + servo_name + "'.").c_str()); + ex.setReason(("Servo '" + servo_name + "' is not a tracking servo.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } - - ACSErr::Completion_var comp; - - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_FALSE) + else if(!m_current_tracking_servos.count(servo_name)) { ex.setReason(("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } + SRTProgramTrackMinorServo_ptr servo = m_current_tracking_servos.at(servo_name); servo->getAxesInfo(servo_axes_names, servo_axes_units); size_t axis_index; @@ -1021,12 +973,13 @@ SRTMinorServoScan SRTMinorServoBossCore::checkScanFeasibility(const ACS::Time& s servo->getAxesRanges(min_ranges, max_ranges); // Read the servo offsets - ACS::doubleSeq offsets = *servo->virtual_offsets()->get_sync(comp.out()); + ACS::doubleSeq user_offsets = *servo->getUserOffsets(); + ACS::doubleSeq system_offsets = *servo->getSystemOffsets(); // Check if starting or final positions are outside the axes range (considering offsets) for(size_t i = 0; i < starting_position.length(); i++) { - if(starting_position[i] + offsets[i] < min_ranges[i] || starting_position[i] + offsets[i] > max_ranges[i]) + if(starting_position[i] + user_offsets[i] + system_offsets[i] < min_ranges[i] || starting_position[i] + user_offsets[i] + system_offsets[i] > max_ranges[i]) { ex.setReason("Starting position out of range."); ex.log(LM_DEBUG); @@ -1258,8 +1211,8 @@ void SRTMinorServoBossCore::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - ACSErr::Completion_var comp; - if(m_component.control()->get_sync(comp.out()) != CONTROL_DISCOS) + ACS::Time comp; + if(m_component.m_control_devio->read(comp) != CONTROL_DISCOS) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system is not controlled by DISCOS."); @@ -1268,7 +1221,7 @@ void SRTMinorServoBossCore::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - if(m_component.emergency()->get_sync(comp.out()) == Management::MNG_TRUE) + if(m_component.m_emergency_devio->read(comp) == Management::MNG_TRUE) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system in emergency status."); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index a9d2eb993..91087d07f 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -22,13 +22,17 @@ SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, m_scan_active_ptr(this), m_scanning_ptr(this), m_tracking_ptr(this), + m_current_configuration_devio(nullptr), m_current_configuration_ptr(this), m_simulation_enabled_ptr(this), m_plc_time_ptr(this), m_plc_version_ptr(this), + m_control_devio(nullptr), m_control_ptr(this), m_power_ptr(this), + m_emergency_devio(nullptr), m_emergency_ptr(this), + m_gregorian_cover_devio(nullptr), m_gregorian_cover_ptr(this), m_last_executed_command_ptr(this) { @@ -73,22 +77,22 @@ void SRTMinorServoBossImpl::initialize() new MSGenericDevIO>(m_core.m_scanning), true); m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), new MSGenericDevIO>(m_core.m_tracking), true); - m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), - new MSAnswerMapDevIO("current_configuration", "CURRENT_CONFIG", m_core.m_status), true); + m_current_configuration_devio = new MSAnswerMapDevIO("current_configuration", "CURRENT_CONFIG", m_core.m_status); + m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), m_current_configuration_devio, true); m_simulation_enabled_ptr = new ROEnumImpl((m_component_name + ":simulation_enabled").c_str(), getComponent(), new MSAnswerMapDevIO("simulation_enabled", "SIMULATION_ENABLED", m_core.m_status), true); m_plc_time_ptr = new baci::ROdouble((m_component_name + ":plc_time").c_str(), getComponent(), new MSAnswerMapDevIO("plc_time", "PLC_TIME", m_core.m_status), true); m_plc_version_ptr = new baci::ROstring((m_component_name + ":plc_version").c_str(), getComponent(), new MSAnswerMapDevIO("plc_version", "PLC_VERSION", m_core.m_status), true); - m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), - new MSAnswerMapDevIO("control", "CONTROL", m_core.m_status), true); + m_control_devio = new MSAnswerMapDevIO("control", "CONTROL", m_core.m_status); + m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), m_control_devio, true); m_power_ptr = new ROEnumImpl((m_component_name + ":power").c_str(), getComponent(), new MSAnswerMapDevIO("power", "POWER", m_core.m_status), true); - m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), - new MSAnswerMapDevIO("emergency", "EMERGENCY", m_core.m_status), true); - m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), - new MSAnswerMapDevIO("gregorian_cover", "GREGORIAN_CAP", m_core.m_status), true); + m_emergency_devio = new MSAnswerMapDevIO("emergency", "EMERGENCY", m_core.m_status); + m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), m_emergency_devio, true); + m_gregorian_cover_devio = new MSAnswerMapDevIO("gregorian_cover", "GREGORIAN_CAP", m_core.m_status); + m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), m_gregorian_cover_devio, true); m_last_executed_command_ptr = new baci::ROdouble((m_component_name + ":last_executed_command").c_str(), getComponent(), new MSAnswerMapDevIO("last_executed_command", "LAST_EXECUTED_COMMAND", m_core.m_status), true); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index fce41d864..e04eff8b8 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -56,14 +56,13 @@ void SRTMinorServoParkThread::runLoop() return; } - ACSErr::Completion_var comp; - switch(m_status) { case 0: { // First we check if the gregorian cover has closed - //bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == COVER_STATUS_CLOSED? true : false; + ACS::Time comp; + //bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == COVER_STATUS_CLOSED ? true : false; // Then we cycle through all the servos and make sure their operative mode is STOP if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index 8bda998a8..a82aab228 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -49,7 +49,7 @@ void SRTMinorServoScanThread::onStart() // We save the starting coordinates to return to them when the scan is finished ACSErr::Completion_var comp; auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); - m_starting_coordinates = *servo->virtual_positions()->get_sync(comp.out()); + m_starting_coordinates = *servo->getAxesPositions(0); ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, "SCAN THREAD STARTED")); } @@ -138,38 +138,29 @@ void SRTMinorServoScanThread::runLoop() return; } - Management::TBoolean elevation_tracking = Management::MNG_FALSE; - - if(m_point_id > 0) + if(m_point_id == 1) { - if(std::all_of(m_core.m_tracking_servos.begin(), m_core.m_tracking_servos.end(), [this](const std::pair& servo) -> bool + if(std::all_of(m_core.m_current_tracking_servos.begin(), m_core.m_current_tracking_servos.end(), [this](const std::pair& servo) -> bool { - ACSErr::Completion_var comp; - if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo.first != m_core.m_current_scan.servo_name) { - if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo.first != m_core.m_current_scan.servo_name) - { - // Not tracking the elevation and this servo is not involved in the current scan - return true; - } - - bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; - if(!return_value) - { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); - } - return return_value; + // Not tracking the elevation and this servo is not involved in the current scan + return true; } - else + + ACSErr::Completion_var comp; + if(servo.second->operative_mode()->get_sync(comp.out()) != OPERATIVE_MODE_PROGRAMTRACK) { - return true; + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + return false; } + return true; })) { // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) { - elevation_tracking = Management::MNG_TRUE; + m_core.m_elevation_tracking.store(Management::MNG_TRUE); } } else @@ -191,56 +182,50 @@ void SRTMinorServoScanThread::runLoop() catch(ComponentErrors::ComponentErrorsEx& ex) { _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getErrorFromEx(ex)) + " Using a fixed elevation of " + std::to_string(elevation) + "° as scan central coordinate!").c_str()); - elevation_tracking = Management::MNG_FALSE; + m_core.m_elevation_tracking.store(Management::MNG_FALSE); } } - ACSErr::Completion_var comp; - for(const auto& [servo_name, servo] : m_core.m_tracking_servos) + for(const auto& [servo_name, servo] : m_core.m_current_tracking_servos) { - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo_name != m_core.m_current_scan.servo_name) { - if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo_name != m_core.m_current_scan.servo_name) - { - // Not tracking the elevation and this servo is not involved in the current scan - continue; - } - - ACS::doubleSeq coordinates = m_starting_coordinates; + // Not tracking the elevation and this servo is not involved in the current scan + continue; + } - if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) - { - coordinates = *servo->calcCoordinates(elevation); - } + ACS::doubleSeq coordinates = m_starting_coordinates; - if(servo_name == m_core.m_current_scan.servo_name) - { - try - { - // Ask for the offset in the exact m_point_time (we don't want to interpolate or retrieve any value before or after the scan time span) - coordinates[m_core.m_current_scan.axis_index] += m_scan_offsets.get(m_point_time, true).second[0]; - } - catch(...) - { - // No offset found for this point_time, ignore - } - } + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + coordinates = *servo->calcCoordinates(elevation); + } + if(servo_name == m_core.m_current_scan.servo_name) + { try { - servo->programTrack(m_trajectory_id, m_point_id, m_point_time, coordinates); + // Ask for the offset in the exact m_point_time (we don't want to interpolate or retrieve any value before or after the scan time span) + coordinates[m_core.m_current_scan.axis_index] += m_scan_offsets.get(m_point_time, true).second[0]; } - catch(MinorServoErrors::MinorServoErrorsEx& ex) + catch(...) { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_error = true; - this->setStopped(); - return; + // No offset found for this point_time, ignore } } - } - m_core.m_elevation_tracking.store(elevation_tracking); + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, coordinates); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + } m_point_id++; m_point_time += PROGRAM_TRACK_TIMEGAP; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 1bcec7b37..a36e5d0fb 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -61,8 +61,6 @@ void SRTMinorServoSetupThread::runLoop() return; } - ACSErr::Completion_var comp; - switch(m_status) { case 0: // Check if all the servos stopped @@ -133,7 +131,8 @@ void SRTMinorServoSetupThread::runLoop() } case 3: // Wait for the system to show the commanded configuration { - if(m_core.m_component.current_configuration()->get_sync(comp.out()) == m_core.m_commanded_configuration.load()) + ACS::Time comp; + if(m_core.m_component.m_current_configuration_devio->read(comp) == m_core.m_commanded_configuration.load()) { m_status = 4; } @@ -142,8 +141,9 @@ void SRTMinorServoSetupThread::runLoop() } case 4: // Wait for the whole system to reach the desired configuration { + ACSErr::Completion_var comp; // First we check the status of the gregorian cover - bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == m_gregorian_cover_position ? true : false; // Then we cycle through all the servos and make sure their operative mode is SETUP if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool @@ -163,7 +163,18 @@ void SRTMinorServoSetupThread::runLoop() { try { - servo->setup(m_core.m_commanded_setup.c_str()); + if(servo->setup(m_core.m_commanded_setup.c_str())) + { + m_core.m_current_servos[servo_name] = servo; + try + { + m_core.m_current_tracking_servos[servo_name] = m_core.m_tracking_servos.at(servo_name); + } + catch(...) + { + // Not a tracking servo, ignore + } + } } catch(...) { @@ -172,22 +183,22 @@ void SRTMinorServoSetupThread::runLoop() this->setStopped(); return; } + } - // This step is necessary because we have _ASACTIVE configurations that have a slightly different position from the commanded one - // Unfortunately, the Leonardo implementation accepts a fixed number of configurations, therefore we share the _ASACTIVE and AS not active configurations for each focal position - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) + // This step is necessary because we have _ASACTIVE configurations that have a slightly different position from the commanded one + // Unfortunately, the Leonardo implementation accepts a fixed number of configurations, therefore we share the _ASACTIVE and AS not active configurations for each focal position + for(const auto& [servo_name, servo] : m_core.m_current_servos) + { + try { - try - { - servo->preset(*servo->calcCoordinates(45)); - } - catch(MinorServoErrors::MinorServoErrorsEx& ex) - { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); - this->setStopped(); - return; - } + servo->preset(*servo->calcCoordinates(45)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; } } @@ -196,20 +207,14 @@ void SRTMinorServoSetupThread::runLoop() } case 6: // Wait for the whole system to reach the PRESET configuration { + //ACSErr::Completion_var comp; // First we check the status of the gregorian cover - //bool completed = m_core.m_component.gregorian_cover()->get_sync(comp.out()) == m_gregorian_cover_position ? true : false; + //bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == m_gregorian_cover_position ? true : false; - if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [this](const std::pair& servo) -> bool + if(/*completed && */std::all_of(m_core.m_current_servos.begin(), m_core.m_current_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PRESET ? true : false; - } - else - { - return true; - } + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PRESET ? true : false; })) { m_status = 7; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 22abf3a83..47bac8dc4 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -62,35 +62,26 @@ void SRTMinorServoTrackingThread::runLoop() } // All checks passed, we have to track - Management::TBoolean elevation_tracking = Management::MNG_FALSE; - if(m_point_id == 0) { m_point_time = getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME; m_trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(m_point_time)); } - else + else if(m_point_id == 1) { - if(std::all_of(m_core.m_tracking_servos.begin(), m_core.m_tracking_servos.end(), [this](const std::pair& servo) -> bool + if(std::all_of(m_core.m_current_tracking_servos.begin(), m_core.m_current_tracking_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - if(servo.second->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - bool return_value = servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PROGRAMTRACK ? true : false; - if(!return_value) - { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); - } - return return_value; - } - else + if(servo.second->operative_mode()->get_sync(comp.out()) != OPERATIVE_MODE_PROGRAMTRACK) { - return true; + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + return false; } + return true; })) { // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation - elevation_tracking = Management::MNG_TRUE; + m_core.m_elevation_tracking.store(Management::MNG_TRUE); } else { @@ -100,39 +91,33 @@ void SRTMinorServoTrackingThread::runLoop() } } - ACSErr::Completion_var comp; - for(const auto& [servo_name, servo] : m_core.m_tracking_servos) + for(const auto& [servo_name, servo] : m_core.m_current_tracking_servos) { - if(servo->in_use()->get_sync(comp.out()) == Management::MNG_TRUE) - { - double elevation = 45.0; + double elevation = 45.0; - try - { - elevation = m_core.getElevation(m_point_time); - } - catch(ComponentErrors::ComponentErrorsEx& ex) - { - _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); - elevation_tracking = Management::MNG_FALSE; - } + try + { + elevation = m_core.getElevation(m_point_time); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + } - try - { - servo->programTrack(m_trajectory_id, m_point_id, m_point_time, *servo->calcCoordinates(elevation)); - } - catch(MinorServoErrors::MinorServoErrorsEx& ex) - { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_error = true; - this->setStopped(); - return; - } + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, *servo->calcCoordinates(elevation)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; } } - m_core.m_elevation_tracking.store(elevation_tracking); - m_point_id++; m_point_time += PROGRAM_TRACK_TIMEGAP; diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index 1cd3c98cc..f294bc939 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -94,13 +94,15 @@ bool SRTProgramTrackMinorServoImpl::status() return status; } -void SRTProgramTrackMinorServoImpl::setup(const char* configuration_name) +bool SRTProgramTrackMinorServoImpl::setup(const char* configuration_name) { - SRTBaseMinorServoImpl::setup(configuration_name); + bool return_value = SRTBaseMinorServoImpl::setup(configuration_name); m_tracking_queue.clear(); m_total_trajectory_points.store(0); m_remaining_trajectory_points.store(0); + + return return_value; } void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& virtual_coordinates) @@ -118,14 +120,13 @@ void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORB } std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - - // Read the current servo offsets - ACSErr::Completion_var comp; - ACS::doubleSeq offsets = *virtual_offsets()->get_sync(comp.out()); + ACS::Time comp; + ACS::doubleSeq offsets = m_virtual_offsets_devio->read(comp); for(size_t i = 0; i < m_virtual_axes; i++) { - if(coordinates[i] + offsets[i] < m_min[i] || coordinates[i] + offsets[i] > m_max[i]) + double coordinate = coordinates[i] + offsets[i]; + if(coordinate < m_min[i] || coordinate > m_max[i]) { _EXCPT(MinorServoErrors::TrackingErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); ex.addData("Reason", "Resulting position out of range, check the offsets!"); -- GitLab From 15ef34e76778b16c6f6a6e9cfb11a877cba52295 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 23 Feb 2024 12:18:59 +0000 Subject: [PATCH 082/150] Fixed a couple more things --- SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h | 6 ++++++ SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp | 4 ++-- SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index 374576200..ac49cf99e 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -660,6 +660,12 @@ public: */ void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& coordinates); + /** + * Returns the tracking status of the minor servo. + * @return true if the minor servo is tracking within the tracking error, false otherwise + */ + bool isTracking() { return m_tracking.load() == Management::MNG_TRUE; } + /** * Declaration of all the other inherited properties methods. */ diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 5d3cd1997..f05589f3f 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -139,7 +139,7 @@ bool SRTMinorServoBossCore::status() if(std::all_of(m_current_tracking_servos.begin(), m_current_tracking_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->tracking()->get_sync(comp.out()) == Management::MNG_TRUE ? true : false; + return servo.second->isTracking(); })) { m_tracking.store(Management::MNG_TRUE); @@ -985,7 +985,7 @@ SRTMinorServoScan SRTMinorServoBossCore::checkScanFeasibility(const ACS::Time& s ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } - else if(final_position[i] + offsets[i] < min_ranges[i] || final_position[i] + offsets[i] > max_ranges[i]) + else if(final_position[i] + user_offsets[i] + system_offsets[i] < min_ranges[i] || final_position[i] + user_offsets[i] + system_offsets[i] > max_ranges[i]) { ex.setReason("Final position out of range."); ex.log(LM_DEBUG); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index e04eff8b8..efeabcb31 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -61,7 +61,7 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - ACS::Time comp; + // ACS::Time comp; //bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == COVER_STATUS_CLOSED ? true : false; // Then we cycle through all the servos and make sure their operative mode is STOP -- GitLab From 110a4401717903577630ca53e7e3bc45cc7ded4f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 1 Mar 2024 11:19:33 +0000 Subject: [PATCH 083/150] Refactored SRTMinorServos --- .../include/SRTMinorServoAnswerMap.h | 204 ----- .../include/SRTMinorServoCommandLibrary.h | 2 +- .../include/SRTMinorServoContainers.h | 848 ++++++++++++++++++ .../SRTMinorServoLibrary/src/Makefile | 2 +- SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 300 +------ .../include/SRTMinorServoBossCore.h | 6 +- .../include/SRTMinorServoBossImpl.h | 23 +- .../include/SRTMinorServoCommon.h | 74 -- .../include/SRTMinorServoContainers.h | 328 ------- .../SRTMinorServo/include/SRTMinorServoImpl.h | 35 +- .../include/SRTMinorServoParkThread.h | 2 +- .../include/SRTMinorServoScanThread.h | 2 +- .../include/SRTMinorServoSetupThread.h | 2 +- .../include/SRTMinorServoStatusThread.h | 2 +- .../include/SRTMinorServoTrackingThread.h | 2 +- .../src/SRTBaseMinorServoImpl.cpp | 51 +- .../src/SRTMinorServoBossCore.cpp | 16 +- .../src/SRTMinorServoBossImpl.cpp | 28 +- .../src/SRTMinorServoParkThread.cpp | 3 +- .../src/SRTMinorServoScanThread.cpp | 8 +- .../src/SRTMinorServoSetupThread.cpp | 33 +- .../src/SRTMinorServoTrackingThread.cpp | 6 +- .../src/SRTProgramTrackMinorServoImpl.cpp | 3 +- 23 files changed, 970 insertions(+), 1010 deletions(-) delete mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h delete mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h deleted file mode 100644 index 4c111db94..000000000 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoAnswerMap.h +++ /dev/null @@ -1,204 +0,0 @@ -#ifndef _SRTMINORSERVOANSWERMAP_H -#define _SRTMINORSERVOANSWERMAP_H - -#include -#include -#include -#include -#include -#include "SRTMinorServoUtils.h" - - -namespace MinorServo -{ - class SRTMinorServoAnswerMap : private std::map> - { - /** - * This class privately extends the type std::map>. - * It is therefore an std::map which can hold different types of values, such as long, double and str::string, in the same container. - * It is used to store the answers received from the SRTMinorServo Leonardo system. - * This design was critical since all the received values have heterogeneous keys and values. - * With this object, the SRTMinorServoSocket can correctly retrieve and store all the received values without having to know the keys or types a priori. - */ - - /* - * Declare this class as friend since it will have to iterate through the inner map - */ - friend class PySRTMinorServoCommandLibrary; - public: - /** - * Use the same clear method of the parent class - */ - using std::map>::clear; - - /** - * Default constructor, initialize the std::map object and the synchronization mutex - */ - SRTMinorServoAnswerMap() : std::map>(), m_mutex() {} - - /** - * Initialize the std::map with the content of another SRTMinorServoAnswerMap, initialize the mutex, lock both objects - * @param other the SRTMinorServoAnswerMap with which the content of the current object will be initialized - */ - SRTMinorServoAnswerMap(const SRTMinorServoAnswerMap& other) : m_mutex() - { - std::unique_lock lockThis(m_mutex, std::defer_lock); - std::unique_lock lockOther(other.m_mutex, std::defer_lock); - std::lock(lockThis, lockOther); - static_cast>&>(*this) = static_cast>&>(other); - } - - /** - * Assignment operator. It lock both the current object and the assigned one's mutexes - * @param other the SRTMinorServoAnswerMap which values have to be stored in the current object - */ - SRTMinorServoAnswerMap& operator=(const SRTMinorServoAnswerMap& other) - { - if(this != &other) - { - std::unique_lock lockThis(m_mutex, std::defer_lock); - std::unique_lock lockOther(other.m_mutex, std::defer_lock); - std::lock(lockThis, lockOther); - static_cast>&>(*this) = static_cast>&>(other); - } - - return *this; - } - - /** - * Equality operator, only check the std::map and avoid comparing the mutexes, which will obviously be different - * @param other the SRTMinorServoAnswerMap object to compare the current object with - */ - bool operator==(const SRTMinorServoAnswerMap& other) const - { - return static_cast>&>(*this) == static_cast>&>(other); - } - - /** - * get method. It must be used with a template parameter, in order for the SRTMinorServoAnswerMap to be able to retrieve the correct type of object for the given key. - * The method will automatically convert the retrieved long, double or std::string to the given template type. - * @param T the type (i.e.: int, long, double, char*) of the object to be retrieved. It can be anything derived from integral, floating point or string values. - * @param key the key assigned to the value you want to retrieve - * @return the value associated to given key 'key', returned as template type 'T', if possible. Be aware that some casts (i.e.: long to int, double to float) will lose precision and/or overflow - * @throw std::bad_variant_access when retrieving the stored value by asking the wrong type (i.e.: stored type is a double but T is char*) - * @throw std::runtime_error when attempting to retrieve a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) - */ - template - T get(const std::string& key) const - { - if constexpr(std::negation_v>) - { - throw std::runtime_error("Unsupported type."); - } - - std::shared_lock lock(m_mutex); - - if constexpr(std::is_integral_v) - { - return (T)std::get(this->at(key)); - } - else if constexpr(std::is_floating_point_v) - { - return (T)std::get(this->at(key)); - } - else if constexpr(is_string_v) - { - return (T)std::get(this->at(key)).c_str(); - } - } - - /** - * put method. The template parameter is automatically deducted from the 'value' argument. Stores the given 'value' associated with key 'key' - * @param key the key associated to the stored value 'value' - * @param value the value we are storing with the given key 'key' - * @throw std::runtime_error when attempting to store a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) - */ - template - void put(const std::string& key, const T& value) - { - if constexpr(std::negation_v>) - { - throw std::runtime_error("Unsupported type."); - } - - std::unique_lock lock(m_mutex); - - if constexpr(std::is_integral_v) - { - this->operator[](key) = long(value); - } - else if constexpr(std::is_floating_point_v) - { - this->operator[](key) = double(value); - } - else if constexpr(is_string_v) - { - this->operator[](key) = std::string(value); - } - } - - /** - * This method checks whether the container holds a value for the given key 'key' - * @param key the key for the value we want to check if it's present in the container - * @return true if the value is present in the container, false otherwise - */ - bool contains(const std::string& key) const - { - std::shared_lock lock(m_mutex); - return this->find(key) != this->end(); - } - - /** - * This methods returns the std::variant type index for the value associated to the given key 'key' - * @param key the key for the value we want to retrieve the type index - * @throw std::out_of_range if the key is not found in the object - * @return 0 for long, 1 for double, 2 for std::string - */ - unsigned int index(const std::string& key) const - { - std::shared_lock lock(m_mutex); - return this->at(key).index(); - } - - /** - * This method checks whether the contained answer to a command sent to the SRTMinorServo system was positive or not - * @return true if the command was correctly accepted, false if the command was not accepted or the 'OUTPUT' key was not found (unlikely scenario) - */ - const bool checkOutput() const - { - std::shared_lock lock(m_mutex); - try - { - if(this->get("OUTPUT") == "GOOD") - { - return true; - } - } - catch(std::out_of_range& ex) - { - // Key not found - } - - return false; - } - - /** - * This method retrieves the ACS::Time associated with the received answer map. It converts the value from UNIX Epoch (double) to ACS::Time - * @return the ACS::Time associated with the answer map - */ - const ACS::Time getTimestamp() const - { - std::shared_lock lock(m_mutex); - return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); - } - - private: - /** - * Shared mutex to control read and write accesses. Multiple reading access are permitted and will only block writing access. Writing access will block all accesses - */ - mutable std::shared_mutex m_mutex; - }; -} - - -#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 5f0c009f5..702334252 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -7,7 +7,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoAnswerMap.h" +#include "SRTMinorServoContainers.h" #include #include #include diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h new file mode 100644 index 000000000..9a7b829df --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -0,0 +1,848 @@ +#ifndef __SRTMINORSERVOCONTAINERS_H__ +#define __SRTMINORSERVOCONTAINERS_H__ + +/** + * SRTMinorServoContainers.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "SRTMinorServoUtils.h" + + +namespace MinorServo +{ + /** + * Object used to store some info regarding a scan. + */ + struct SRTMinorServoScan + { + /** + * Name of the servo involved in the scan. + */ + std::string servo_name = ""; + + /** + * Name of the axis involved in the scan. + */ + std::string axis_name = ""; + + /** + * Index of the axis involved in the scan. + */ + size_t axis_index = 0; + + /** + * Range of the scan. + */ + double scan_range = 0; + + /** + * Starting time of the scan. + */ + ACS::Time start_time = 0; + + /** + * Closing time of the scan. + */ + ACS::Time close_time = 0; + + /** + * Duration of the scan. + */ + ACS::TimeInterval scan_duration = 0; + + /** + * Central position of the scan axis. + */ + double central_position = 0; + + /** + * Starting elevation for the scan. + */ + double starting_elevation = 0; + }; + + /** + * This dictionary contains information regarding the possibile focal configurations. + * The key indicates the configuration as known by DISCOS. + * The value is a pair, the first element of the pair is the DISCOS enumeration for the relative Leonardo configuration, + * the second element of the pair indicates whether the configuration has a ASACTIVE twin configuraiton. + */ + using DiscosConfigurationNameTableType = std::map>; + const DiscosConfigurationNameTableType DiscosConfigurationNameTable = + { + {"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, + {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, + {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, + {"QQG", std::make_pair(CONFIGURATION_GREGORIAN4, true )}, + {"TRI", std::make_pair(CONFIGURATION_GREGORIAN5, true )}, + {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, + {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, + {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, + }; + + /** + * This dictionary contains the Leonardo focal configurations DISCOS enumerations, alongside their name inside the Leonardo minor servo system. + */ + using LDOConfigurationNameTableType = boost::bimap; + const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of + (CONFIGURATION_PRIMARY, "Primario") + (CONFIGURATION_GREGORIAN1, "Gregoriano 1") + (CONFIGURATION_GREGORIAN2, "Gregoriano 2") + (CONFIGURATION_GREGORIAN3, "Gregoriano 3") + (CONFIGURATION_GREGORIAN4, "Gregoriano 4") + (CONFIGURATION_GREGORIAN5, "Gregoriano 5") + (CONFIGURATION_GREGORIAN6, "Gregoriano 6") + (CONFIGURATION_GREGORIAN7, "Gregoriano 7") + (CONFIGURATION_GREGORIAN8, "Gregoriano 8") + (CONFIGURATION_BWG1, "BWG1") + (CONFIGURATION_BWG2, "BWG2") + (CONFIGURATION_BWG3, "BWG3") + (CONFIGURATION_BWG4, "BWG4"); + + /** + * This dictionary containes the Leonardo focal configurations DISCOS enumerations, alongside their ID counterpart as read from the Leonardo minor servo system proxy. + */ + using LDOConfigurationIDTableType = boost::bimap; + const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of + (CONFIGURATION_UNKNOWN, 0) + (CONFIGURATION_PRIMARY, 1) + (CONFIGURATION_GREGORIAN1, 11) + (CONFIGURATION_GREGORIAN2, 12) + (CONFIGURATION_GREGORIAN3, 13) + (CONFIGURATION_GREGORIAN4, 14) + (CONFIGURATION_GREGORIAN5, 15) + (CONFIGURATION_GREGORIAN6, 16) + (CONFIGURATION_GREGORIAN7, 17) + (CONFIGURATION_GREGORIAN8, 18) + (CONFIGURATION_BWG1, 21) + (CONFIGURATION_BWG2, 22) + (CONFIGURATION_BWG3, 23) + (CONFIGURATION_BWG4, 24); + + using SRTMinorServoLookupTable = std::map>; + + /** + * This class implements a queue of time tagged positions. it extends a simple std::map with some specific methods. + */ + class SRTMinorServoPositionsQueue : private std::map> + { + public: + /** + * Default constructor. Used only for lazy initialization. + */ + SRTMinorServoPositionsQueue() : std::map>(), m_queue_size(0), m_vector_size(0), m_mutex() {} + + /** + * Constructor with queue size as parameter. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + */ + SRTMinorServoPositionsQueue(size_t queue_size) : std::map>(), m_queue_size(queue_size), m_vector_size(0), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + } + + /** + * Constructor with queue size and vector size as parameters. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + * @param vector_size the length of the vectors that this object will store. Once set it cannot be changed. This assures we are always dealing with the same number of virtual axes. + */ + SRTMinorServoPositionsQueue(size_t queue_size, size_t vector_size) : std::map>(), m_queue_size(queue_size), m_vector_size(vector_size), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + vectorLazyInit(vector_size); + } + + /** + * Custom assignment operator. It locks both the current object and the passed one with a mutex in order for the assignment operation to be thread safe. + * @param other the other SRTMinorServoPositionsQueue we are assigning its value to the current object. + * @return the newly populated SRTMinorServoPositionsQueue object. + */ + SRTMinorServoPositionsQueue& operator=(const SRTMinorServoPositionsQueue& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + m_queue_size = other.m_queue_size; + m_vector_size = other.m_vector_size; + std::map>::operator=(other); + } + + return *this; + } + + /** + * Put method, with initializer list argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::initializer_list& values) + { + put(key, std::vector(values)); + } + + /** + * Put method, with ACS::doubleSeq argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const ACS::doubleSeq& values) + { + put(key, std::vector(values.get_buffer(), values.get_buffer() + values.length())); + } + + /** + * Put method, with std::vector argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::vector& values) + { + std::unique_lock lock(m_mutex); + + vectorLazyInit(values.size()); + queueLazyInit(m_queue_size); + if(std::map>::size() == m_queue_size) + { + // Remove the oldest one + this->erase(this->begin()); + } + this->emplace(std::make_pair(key, values)); + } + + /** + * Get method. It retrieves a set of coordinates from a given ACS::Time, giving back the time as well. + * @param key the time the user wants to retrieve the related coordinates. + * @param exact a boolean indicating whether the user wants to interpolate (false) or not (true). + * @throw std::logic_error when the queue is empty. + * @throw std::out_of_range when the exact point was not found in the queue. + * @return a std::pair containing the ACS::Time as first element and the set of coordinates as second element. + */ + std::pair> get(ACS::Time key, bool exact = false) + { + std::shared_lock lock(m_mutex); + + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + + if(const SRTMinorServoPositionsQueue::iterator point = this->find(key); point != this->end()) + { + return *point; + } + else if(exact) + { + // Exact point not found, we throw an exception + throw std::out_of_range("Exact point not found!"); + } + else + { + // Key not found, should check outside the boundaries or interpolate + if(key <= this->begin()->first) + { + // Aksed for a timestamp older than the earliest point in the queue + return *this->cbegin(); + } + else if(key >= this->rbegin()->first) + { + // Asked for a timestamp newer than the latest point in the queue + return *this->crbegin(); + } + else + { + std::vector positions(m_vector_size, 0.0); + SRTMinorServoPositionsQueue::iterator p0, p1; + p1 = this->lower_bound(key); + p0 = p1; + p0--; + + // Calculate the linear fit for each position + double fraction = (key - p0->first) / (p1->first - p0->first); + + for(size_t i = 0; i < m_vector_size; i++) + { + positions[i] = p0->second[i] + fraction * (p1->second[i] - p0->second[i]); + } + + return std::make_pair(key, (const std::vector)positions); + } + } + } + + /** + * Size method thread safe override. + * @return the number of elements in the queue. + */ + size_t size() const + { + std::shared_lock lock(m_mutex); + return std::map>::size(); + } + + /** + * Clear method, thread safe. It empties the queue. + */ + void clear() + { + std::unique_lock lock(m_mutex); + std::map>::clear(); + } + + /** + * This method returns the number of points having a higher tag time than the one passed as argument. + * @param t the time threshold. This method counts and returns the number of points having a higher time than this value. + * @throw std::logic_error when the queue is empty. + * @return the number of points having a higher time than the given one. + */ + size_t getRemainingPoints(ACS::Time t) + { + std::shared_lock lock(m_mutex); + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + return std::distance(this->lower_bound(t), this->end()); + } + + private: + /** + * This method gets called by the constructors for the lazy intialization of the queue size value. + * @param queue_size the desired maximum queue size. + * @throw std::length_error when the desired queue size is equal to 0 or when it is greater than the maximum size that can be currently allocated. + */ + void queueLazyInit(size_t queue_size) + { + if(m_queue_size == 0) + { + if(queue_size == 0) + { + // The maximum queue size was not set yet + throw std::length_error("Queue length cannot be 0."); + } + else if(queue_size > this->max_size()) + { + // The requested size is greater than the maximum possible queue size + throw std::length_error("Queue length cannot exceed " + std::to_string(this->max_size()) + "."); + } + else + { + m_queue_size = queue_size; + } + } + } + + /** + * This method gets called by the constructors for the lazy initialization of the vector size value. + * @param vector_size the desired length of the vector containing the set of points. + * @throw std::length_error when the desired vector size is equal to 0 or when it is longer than 6. We don't have more than 6 axes, so we hard cap this value to 6. + * It also throws this when the user tries to insert a vector with different lenght then the already defined one. This ensures all stored vecors are of equal length. + */ + void vectorLazyInit(size_t vector_size) + { + if(vector_size == 0) + { + throw std::length_error("Vector length cannot be 0."); + } + else if(vector_size > 6) + { + // Hard cap to 6, we don't need more + throw std::length_error("Vector length cannot be longer than 6."); + } + else if(m_vector_size == 0) + { + m_vector_size = vector_size; + } + else if(m_vector_size != vector_size) + { + throw std::length_error("New vector length does not match the initial one."); + } + } + + /** + * The maximum size of the queue. + */ + size_t m_queue_size; + + /** + * The desired length of the vectors stored by this object. + */ + size_t m_vector_size; + + /** + * The shared mutex used for access synchronization. + */ + mutable std::shared_mutex m_mutex; + }; + + + class SRTMinorServoAnswerMap : private std::map> + { + /** + * This class privately extends the type std::map>. + * It is therefore an std::map which can hold different types of values, such as long, double and str::string, in the same container. + * It is used to store the answers received from the SRTMinorServo Leonardo system. + * This design was critical since all the received values have heterogeneous keys and values. + * With this object, the SRTMinorServoSocket can correctly retrieve and store all the received values without having to know the keys or types a priori. + */ + + /* + * Declare this class as friend since it will have to iterate through the inner map + */ + friend class PySRTMinorServoCommandLibrary; + public: + /** + * Use the same clear method of the parent class + */ + using std::map>::clear; + + /** + * Default constructor, initialize the std::map object and the synchronization mutex + */ + SRTMinorServoAnswerMap() : std::map>(), m_mutex() {} + + /** + * Initialize the std::map with the content of another SRTMinorServoAnswerMap, initialize the mutex, lock both objects + * @param other the SRTMinorServoAnswerMap with which the content of the current object will be initialized + */ + SRTMinorServoAnswerMap(const SRTMinorServoAnswerMap& other) : m_mutex() + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + /** + * Assignment operator. It lock both the current object and the assigned one's mutexes + * @param other the SRTMinorServoAnswerMap which values have to be stored in the current object + */ + SRTMinorServoAnswerMap& operator=(const SRTMinorServoAnswerMap& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + return *this; + } + + /** + * Equality operator, only check the std::map and avoid comparing the mutexes, which will obviously be different + * @param other the SRTMinorServoAnswerMap object to compare the current object with + */ + bool operator==(const SRTMinorServoAnswerMap& other) const + { + return static_cast>&>(*this) == static_cast>&>(other); + } + + /** + * get method. It must be used with a template parameter, in order for the SRTMinorServoAnswerMap to be able to retrieve the correct type of object for the given key. + * The method will automatically convert the retrieved long, double or std::string to the given template type. + * @param T the type (i.e.: int, long, double, char*) of the object to be retrieved. It can be anything derived from integral, floating point or string values. + * @param key the key assigned to the value you want to retrieve + * @return the value associated to given key 'key', returned as template type 'T', if possible. Be aware that some casts (i.e.: long to int, double to float) will lose precision and/or overflow + * @throw std::bad_variant_access when retrieving the stored value by asking the wrong type (i.e.: stored type is a double but T is char*) + * @throw std::runtime_error when attempting to retrieve a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + T get(const std::string& key) const + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::shared_lock lock(m_mutex); + + if constexpr(std::is_integral_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(std::is_floating_point_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(is_string_v) + { + return (T)std::get(this->at(key)).c_str(); + } + } + + /** + * put method. The template parameter is automatically deducted from the 'value' argument. Stores the given 'value' associated with key 'key' + * @param key the key associated to the stored value 'value' + * @param value the value we are storing with the given key 'key' + * @throw std::runtime_error when attempting to store a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + void put(const std::string& key, const T& value) + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::unique_lock lock(m_mutex); + + if constexpr(std::is_integral_v) + { + this->operator[](key) = long(value); + } + else if constexpr(std::is_floating_point_v) + { + this->operator[](key) = double(value); + } + else if constexpr(is_string_v) + { + this->operator[](key) = std::string(value); + } + } + + /** + * This method checks whether the container holds a value for the given key 'key' + * @param key the key for the value we want to check if it's present in the container + * @return true if the value is present in the container, false otherwise + */ + bool contains(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->find(key) != this->end(); + } + + /** + * This methods returns the std::variant type index for the value associated to the given key 'key' + * @param key the key for the value we want to retrieve the type index + * @throw std::out_of_range if the key is not found in the object + * @return 0 for long, 1 for double, 2 for std::string + */ + unsigned int index(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->at(key).index(); + } + + /** + * This method checks whether the contained answer to a command sent to the SRTMinorServo system was positive or not + * @return true if the command was correctly accepted, false if the command was not accepted or the 'OUTPUT' key was not found (unlikely scenario) + */ + const bool checkOutput() const + { + std::shared_lock lock(m_mutex); + try + { + if(this->get("OUTPUT") == "GOOD") + { + return true; + } + } + catch(std::out_of_range& ex) + { + // Key not found + } + + return false; + } + + /** + * This method retrieves the ACS::Time associated with the received answer map. It converts the value from UNIX Epoch (double) to ACS::Time + * @return the ACS::Time associated with the answer map + */ + const ACS::Time getTimestamp() const + { + std::shared_lock lock(m_mutex); + return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); + } + + protected: + /** + * Shared mutex to control read and write accesses. Multiple reading access are permitted and will only block writing access. Writing access will block all accesses + */ + mutable std::shared_mutex m_mutex; + }; + + /** + * This class is a specialization of the SRTMinorServoAnswerMap for the general Leonardo Minor Servo System status. + */ + class SRTMinorServoGeneralStatus : public SRTMinorServoAnswerMap + { + public: + /** + * Retrieves the current configuration from the map. + * @return the current SRTMinorServoFocalConfiguration. + */ + SRTMinorServoFocalConfiguration getFocalConfiguration() const + { + return LDOConfigurationIDTable.right.at(this->get("CURRENT_CONFIG")); + } + + /** + * Retrieves a boolean indicating whether the simulation is enabled or not. + * @returns a boolean indicating whether the simulation is enabled or not. + */ + Management::TBoolean isSimulationEnabled() const + { + return this->get("SIMULATION_ENABLED") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the PLC time of the reading. + * @return a double indicating the PLC time, expressed as UNIX Epoch. + */ + double getPLCTime() const + { + return this->get("PLC_TIME"); + } + + /** + * Returns the firmware version present on the PLC. + * @return a string containing the firmware version. + */ + ACE_CString getPLCVersion() const + { + return this->get("PLC_VERSION").c_str(); + } + + /** + * Returns who is controlling the Leonardo Minor Servo System. + * @return an enum indicating who is controlling the system. + */ + SRTMinorServoControlStatus getControl() const + { + return SRTMinorServoControlStatus(this->get("CONTROL") - 1); + } + + /** + * Returns a boolean indicating whether the system is powered on or not. + * @return a boolean indicating whether the system is powered on or not. + */ + Management::TBoolean hasPower() const + { + return this->get("POWER") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Is the emergency stop pressed somewhere? Is there an emergency situation? + * @return a boolean indicating if an emergency is present or not. + */ + Management::TBoolean emergencyPressed() const + { + return this->get("EMERGENCY") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the position of the gregorian cover. + * @return an enum indicating the position of the gregorian cover. + */ + SRTMinorServoGregorianCoverStatus getGregorianCoverPosition() const + { + return SRTMinorServoGregorianCoverStatus(this->get("GREGORIAN_CAP")); + } + + /** + * Returns the UNIX Epoch of the last executed command. + * @return a double containing the UNIX Epoch of the last executed command. + */ + double getLastExecutedCommand() const + { + return this->get("LAST_EXECUTED_COMMAND"); + } + }; + + /** + * This class is a specialization of the SRTMinorServoAnswerMap for a single servo status of the Leonardo Minor Servo System. + */ + class SRTMinorServoStatus : public SRTMinorServoAnswerMap + { + public: + /** + * Constructor. Accepts some lists of labels in order to correctly retrieve the values from the map. + * @param servo_name the servo name used as a prefix when retrieving the values. + * @param physical_axes_enabled the labels used to retrieve the status of each physical axis. + * @param physical_positions the labels used to retrieve the position of each physical axis. + * @param virtual_positions the labels used to retrieve the position of each virtual axis. + * @param virtual_offsets the labels used to retrieve the offset of each virtual axis. + */ + SRTMinorServoStatus( + const std::string& servo_name, + const std::vector& physical_axes_enabled, + const std::vector& physical_positions, + const std::vector& virtual_positions, + const std::vector& virtual_offsets + ) : + SRTMinorServoAnswerMap(), + m_servo_name(servo_name), + m_physical_axes_enabled(physical_axes_enabled), + m_physical_positions(physical_positions), + m_virtual_positions(virtual_positions), + m_virtual_offsets(virtual_offsets) + {} + + /** + * Returns a boolean indicating whether the servo is enabled. + * @returns true if enabled, false otherwise. + */ + Management::TBoolean isEnabled() const + { + return this->get(m_servo_name + "_ENABLED") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the status of the servo drive cabinet. + * @returns an enum indicating the status of the servo drive cabinet. + */ + SRTMinorServoCabinetStatus getDriveCabinetStatus() const + { + return SRTMinorServoCabinetStatus(this->get(m_servo_name + "_STATUS") - 1); + } + + /** + * Returns a boolean indicating whether the servo is blocked or not. + * @return true if the servo is blocked, false otherwise. + */ + Management::TBoolean isBlocked() const + { + return this->get(m_servo_name + "_BLOCK") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the operative mode of the servo. + * @return an enum indicating the operative mode of the servo. + */ + SRTMinorServoOperativeMode getOperativeMode() const + { + return SRTMinorServoOperativeMode(this->get(m_servo_name + "_OPERATIVE_MODE") / 10); + } + + /** + * Returns the status of each physical axis. + * @return a boolean sequence, true if the axis is enabled, false otherwise. + */ + ACS::booleanSeq getPhysicalAxesEnabled() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_physical_axes_enabled); + } + + /** + * Returns the position of each physical axis. + * @return a double sequence containing the position of each physical axis. + */ + ACS::doubleSeq getPhysicalPositions() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_physical_positions); + } + + /** + * Returns the plain position of each virtual axis. + * @return a double sequence containing the plain position of each virtual axis. + */ + ACS::doubleSeq getPlainVirtualPositions() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_virtual_positions); + } + + /** + * Returns the actual position of each virtual axis, minus the offset. + * @return a double sequence containing the position of each virtual axis, minus the offset. + */ + ACS::doubleSeq getVirtualPositions() const + { + std::shared_lock lock(m_mutex); + ACS::doubleSeq virtual_positions = getPlainVirtualPositions(); + ACS::doubleSeq virtual_offsets = getVirtualOffsets(); + for(size_t i = 0; i < virtual_positions.length(); i++) + { + virtual_positions[i] -= virtual_offsets[i]; + } + + return virtual_positions; + } + + /** + * Returns the offset of each virtual axis. + * @return a double sequence containing the offset of each virtual axis. + */ + ACS::doubleSeq getVirtualOffsets() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_virtual_offsets); + } + + private: + /** + * This method extracts a sequence, either boolean or double, from the map, and returns it. + * @param labels a vector of strings containing the labels to use in order to extract the corresponding values from the map. + * @return the composed sequence of booleans or doubles. + */ + template >> + T getSequence(const std::vector& labels) const + { + T sequence; + sequence.length(labels.size()); + + for(size_t i = 0; i < labels.size(); i++) + { + if constexpr(std::is_same_v) + { + sequence[i] = (bool)this->get(m_servo_name + "_" + labels[i]); + } + else if constexpr(std::is_same_v) + { + sequence[i] = this->get(m_servo_name + "_" + labels[i]); + } + } + + return sequence; + } + + /** + * The name of the servo, this is used as prefix when retrieving values from the map. + */ + const std::string m_servo_name; + + /** + * The labels for the enabled value of each physical axis. + */ + const std::vector m_physical_axes_enabled; + + /** + * The labels for the positions of each physical axis. + */ + const std::vector m_physical_positions; + + /** + * The labels for the positions of each virtual axis. + */ + const std::vector m_virtual_positions; + + /** + * The labels for the offsets of each virtual axis. + */ + const std::vector m_virtual_offsets; + }; +} + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index 0c507e996..9bc719dce 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -54,7 +54,7 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoAnswerMap.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h SRTMinorServoUtils.h #hexlib.h +INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h SRTMinorServoUtils.h SRTMinorServoContainers.h #hexlib.h # # Libraries (public and local) diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index 6d703e1e1..330d3905d 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -2,17 +2,16 @@ #define _MSDEVIOS_H /** - * MSDevIO.h + * MSDevIOs.h * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include "SRTMinorServoContainers.h" #include #include #include -#include -#include "SRTMinorServoAnswerMap.h" +#include "SRTMinorServoBossCore.h" namespace MinorServo @@ -69,9 +68,9 @@ namespace MinorServo * @param scanning a reference to the TBoolean indicating whether the system is scanning or not. * @param current_scan a reference to the SRTMinorServoScan object containing the parameters for the current scan. It is used to read the servo name and axis involved in the scan. */ - MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoAnswerMap& answer_map, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : + MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoGeneralStatus& boss_status, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : m_motion_status(motion_status), - m_answer_map(answer_map), + m_boss_status(boss_status), m_scanning(scanning), m_current_scan(current_scan) {} @@ -84,7 +83,6 @@ namespace MinorServo ACE_CString read(ACS::Time& timestamp) { std::string motion_status; - SRTMinorServoAnswerMap answer_map = m_answer_map; switch(m_motion_status.load()) { @@ -120,13 +118,13 @@ namespace MinorServo try { // If I can read the status of the gregorian cover I will notify the user about it on the GUI - SRTMinorServoGregorianCoverStatus cover_status = SRTMinorServoGregorianCoverStatus(answer_map.get("GREGORIAN_CAP")); + SRTMinorServoGregorianCoverStatus cover_position = m_boss_status.getGregorianCoverPosition(); - if(cover_status == COVER_STATUS_OPEN) + if(cover_position == COVER_STATUS_OPEN) { motion_status += ", gregorian cover open"; } - else if(cover_status == COVER_STATUS_CLOSED) + else if(cover_position == COVER_STATUS_CLOSED) { motion_status += ", gregorian cover closed"; } @@ -159,9 +157,9 @@ namespace MinorServo const std::atomic& m_motion_status; /** - * Reference to the SRTMinorServoAnswerMap object of the Boss. + * Reference to the SRTMinorServoGeneralStatus object of the Boss. */ - const SRTMinorServoAnswerMap& m_answer_map; + const SRTMinorServoGeneralStatus& m_boss_status; /** * Reference to the boolean telling if the system is scanning. @@ -174,170 +172,34 @@ namespace MinorServo const SRTMinorServoScan& m_current_scan; }; - /** - * This class is used to read the virtual positions of a minor servo system. It is specialized this way in order to sum the plain virtual positions and the offsets. - */ - class MSVirtualPositionsDevIO : public MSBaseDevIO - { - public: - /** - * Constructor. - * @param servo_name the name of the minor servo system the property belongs to. - * @param virtual_positions_fields the name of the virtual positions fields inside the SRTMinorServoAnswerMap object. - * @param virtual_offsets_fields the name of the virtual offsets fields inside the SRTMinorServoAnswerMap object. - * @param answer_map the SRTMinorServoAnswerMap object containing the status of the minor servo system. - */ - MSVirtualPositionsDevIO(const std::string& servo_name, std::vector virtual_positions_fields, std::vector virtual_offsets_fields, const SRTMinorServoAnswerMap& answer_map) : - m_virtual_positions_fields([&]() - { - std::transform(virtual_positions_fields.begin(), virtual_positions_fields.end(), virtual_positions_fields.begin(), [servo_name](const std::string& field) - { - return servo_name + "_" + field; - }); - return virtual_positions_fields; - }()), - m_virtual_offsets_fields([&]() - { - std::transform(virtual_offsets_fields.begin(), virtual_offsets_fields.end(), virtual_offsets_fields.begin(), [servo_name](const std::string& field) - { - return servo_name + "_" + field; - }); - return virtual_offsets_fields; - }()), - m_answer_map(answer_map) - { - } - - /** - * Returns the property value. - * @param timestamp epoch when the operation completes. - * @return a sequence of double containing the virtual positions taking the virtual offsets into account. - */ - ACS::doubleSeq read(ACS::Time& timestamp) - { - SRTMinorServoAnswerMap answer_map = m_answer_map; - - ACS::doubleSeq sequence; - - try - { - sequence.length(m_virtual_positions_fields.size()); - - for(size_t i = 0; i < m_virtual_positions_fields.size(); i++) - { - sequence[i] = answer_map.get(m_virtual_positions_fields[i]) - answer_map.get(m_virtual_offsets_fields[i]); - } - } - catch(std::out_of_range& ex) - { - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSVirtualPositionsDevIO::read()"); - impl.setPropertyName("virtual_positions"); - impl.setReason("Property is missing from the map!"); - throw impl; - } - catch(std::bad_variant_access& ex) - { - _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSVirtualPositionsDevIO::read()"); - impl.setPropertyName("virtual_positions"); - impl.setReason("Attempt to access the property with the wrong variant type!"); - throw impl; - } - catch(ACSErr::ACSbaseExImpl& ex) - { - _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSVirtualPositionsDevIO::read()"); - impl.setPropertyName("virtual_positions"); - impl.setReason("Property could not be read!"); - throw impl; - } - - timestamp = getTimeStamp(); //completion time - return sequence; - } - - private: - /** - * The virtual positions fields names. - */ - const std::vector m_virtual_positions_fields; - - /** - * The virtual offsets fields names. - */ - const std::vector m_virtual_offsets_fields; - - /** - * The SRTMinorServoAnswerMap containing the status of the minor servo system. - */ - const SRTMinorServoAnswerMap& m_answer_map; - }; - /** * This template class is used to retrieve values from a SRTMinorServoAnswerMap and provide them as properties. * The templates is specialized for the types listed right below and compilation will fail if the developer attempts to use it for an unknown MSDevIO type. */ - template >> - class MSAnswerMapDevIO : public MSBaseDevIO + template + && is_any_v + >> + class MSAnswerMapDevIO : public MSBaseDevIO { public: /** - * Single property-field, no servo-name constructor. - * @param property_name the name of the property, used when raising exceptions. - * @param property_field the field name of the property as it appears inside the SRTMinorServoAnswerMap. - * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. - */ - MSAnswerMapDevIO(const std::string& property_name, const std::string& property_field, const SRTMinorServoAnswerMap& answer_map) : - MSAnswerMapDevIO(property_name, std::vector{ property_field }, answer_map) {} - - /** - * Multiple property-fields, no servo-name constructor. - * @param property_name the name of the property, used when raising exceptions. - * @param property_fields the field names of the property as they appear inside the SRTMinorServoAnswerMap. - * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. + * Constructor, accepting the SRTMinorServoAnswerMap derived object and a pointer to the method used to retrieve the DevIO value. + * @param map, the SRTMinorServoAnswerMap derived object. + * @param method, the method to call in order to retrieve the return value. */ - MSAnswerMapDevIO(const std::string& property_name, const std::vector& property_fields, const SRTMinorServoAnswerMap& answer_map) : - m_property_name(property_name), - m_property_fields(property_fields), - m_answer_map(answer_map) {} - - /** - * Single property-field, with servo-name constructor. - * @param servo_name the name of the minor servo system the property belongs to. Used as prefix for the property_field argument. - * @param property_name the name of the property, used when raising exceptions. - * @param property_field the field name of the property as it appears inside the SRTMinorServoAnswerMap. - * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. - */ - MSAnswerMapDevIO(const std::string& servo_name, const std::string& property_name, const std::string& property_field, const SRTMinorServoAnswerMap& answer_map) : - MSAnswerMapDevIO(servo_name, property_name, std::vector{ property_field }, answer_map) {} - - /** - * Multiple property-fields, with servo-name constructor. - * @param servo_name the name of the minor servo system the property belongs to. Used as prefix for the property_fields argument. - * @param property_name the name of the property, used when raising exceptions. - * @param property_fields the field names of the property as they appear inside the SRTMinorServoAnswerMap. - * @param answer_map the reference to the SRTMinorServoAnswerMap containing the readings from the PLC. - */ - MSAnswerMapDevIO(const std::string& servo_name, const std::string& property_name, std::vector property_fields, const SRTMinorServoAnswerMap& answer_map) : - m_property_name(property_name), - m_property_fields([&]() - { - std::transform(property_fields.begin(), property_fields.end(), property_fields.begin(), [servo_name](const std::string& field) - { - return servo_name + "_" + field; - }); - return property_fields; - }()), - m_answer_map(answer_map) {} + MSAnswerMapDevIO(const std::string& property_name, const Y& map, X (Y::*method)() const) : m_property_name(property_name), m_map(map), m_method(method) {} /** * Used to read the property value. @@ -345,101 +207,13 @@ namespace MinorServo * @throw ComponentErrors::PropertyError. * @return the property value as read from the SRTMinorServoAnswerMap object reference. */ - T read(ACS::Time& timestamp) + X read(ACS::Time& timestamp) { timestamp = getTimeStamp(); - // Copy the answer map by value. This will ensure all the elements for any sequence belong to the same reading from PLC. - SRTMinorServoAnswerMap answer_map = m_answer_map; - try { - if constexpr(std::is_same_v) - { - return (answer_map.get(m_property_fields[0]) == 1) ? Management::MNG_TRUE : Management::MNG_FALSE; - } - else if constexpr(std::is_same_v) - { - unsigned int index = answer_map.index(m_property_fields[0]); - - switch(index) - { - case 0: - { - return (double)answer_map.get(m_property_fields[0]); - } - case 1: - { - return answer_map.get(m_property_fields[0]); - } - default: - { - throw std::bad_variant_access(); - } - } - } - else if constexpr(std::is_same_v) - { - unsigned int index = answer_map.index(m_property_fields[0]); - - switch(index) - { - case 0: - { - return std::to_string(answer_map.get(m_property_fields[0])).c_str(); - } - case 1: - { - return std::to_string(answer_map.get(m_property_fields[0])).c_str(); - } - default: - { - return answer_map.get(m_property_fields[0]).c_str(); - } - } - } - else if constexpr(std::is_same_v) - { - ACS::booleanSeq value; - value.length(m_property_fields.size()); - - for(size_t i = 0; i < m_property_fields.size(); i++) - { - value[i] = answer_map.get(m_property_fields[i]); - } - return value; - } - else if constexpr(std::is_same_v) - { - ACS::doubleSeq value; - value.length(m_property_fields.size()); - - for(size_t i = 0; i < m_property_fields.size(); i++) - { - value[i] = answer_map.get(m_property_fields[i]); - } - return value; - } - else if constexpr(std::is_same_v) - { - return LDOConfigurationIDTable.right.at(answer_map.get(m_property_fields[0])); - } - else if constexpr(std::is_same_v) - { - return SRTMinorServoControlStatus(answer_map.get(m_property_fields[0]) - 1); - } - else if constexpr(std::is_same_v) - { - return SRTMinorServoGregorianCoverStatus(answer_map.get(m_property_fields[0])); - } - else if constexpr(std::is_same_v) - { - return SRTMinorServoCabinetStatus(answer_map.get(m_property_fields[0]) - 1); - } - else if constexpr(std::is_same_v) - { - return SRTMinorServoOperativeMode(answer_map.get(m_property_fields[0]) / 10); - } + return (m_map.*m_method)(); } catch(std::out_of_range& ex) { @@ -466,19 +240,19 @@ namespace MinorServo private: /** - * The name of the property, used when raising exceptions. + * The name of the property. */ const std::string m_property_name; /** - * The field names of the property as they appear on the SRTMinorServoAnswerMap. + * The reference to the SRTMinorServoAnswerMap in which the readings from the PLC appear. This could be either a SRTMinorServoGeneralStatus or a SRTMinorServoStatus. */ - const std::vector m_property_fields; + const Y& m_map; /** - * The reference to the SRTMinorServoAnswerMap in whichthe readings from the PLC appear. + * Pointer to the method of the SRTMinorServoAnswerMap to call in order to retrieve the DevIO return value. */ - const SRTMinorServoAnswerMap& m_answer_map; + X (Y::*m_method)() const; }; /** diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index 7471c29f8..470186058 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include @@ -313,9 +313,9 @@ private: Antenna::AntennaBoss_var m_antennaBoss; /** - * SRTMinorServoAnswerMap object containing the status read from the PLC. + * SRTMinorServoGeneralStatus object containing the status read from the PLC. */ - SRTMinorServoAnswerMap m_status; + SRTMinorServoGeneralStatus m_status; /** * Enumeration indicating the status of the motion of the minor servo system. diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index 9f1aebf6c..40eb0c828 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include @@ -20,6 +20,7 @@ #include "SRTMinorServoBossCore.h" #include "SRTMinorServoStatusThread.h" #include "MSDevIOs.h" +#include "SRTMinorServoCommon.h" using namespace MinorServo; @@ -498,11 +499,6 @@ private: */ baci::SmartPropertyPointer> m_tracking_ptr; - /** - * DevIO of the current_configuration property. - */ - MSAnswerMapDevIO* m_current_configuration_devio; - /** * Pointer to the current_configuration property. */ @@ -523,11 +519,6 @@ private: */ baci::SmartPropertyPointer m_plc_version_ptr; - /** - * DevIO of the control property. - */ - MSAnswerMapDevIO* m_control_devio; - /** * Pointer to the control property. */ @@ -538,21 +529,11 @@ private: */ baci::SmartPropertyPointer> m_power_ptr; - /** - * DevIO of the emergency property. - */ - MSAnswerMapDevIO* m_emergency_devio; - /** * Pointer to the emergency property. */ baci::SmartPropertyPointer> m_emergency_ptr; - /** - * DevIO of the gregorian_cover property. - */ - MSAnswerMapDevIO* m_gregorian_cover_devio; - /** * Pointer to the gregorian_cover property. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h index cf1070637..2048dbdf7 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -6,13 +6,6 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SuppressWarnings.h" -#include -#include -#include -#include -#include - /** * programTrack constants. The first indicates the time between two consecutive points, the second indicates the time we send each point in advance. */ @@ -42,71 +35,4 @@ out = error.c_str(); \ } - -namespace MinorServo -{ - /** - * This dictionary contains information regarding the possibile focal configurations. - * The key indicates the configuration as known by DISCOS. - * The value is a pair, the first element of the pair is the DISCOS enumeration for the relative Leonardo configuration, - * the second element of the pair indicates whether the configuration has a ASACTIVE twin configuraiton. - */ - using DiscosConfigurationNameTableType = std::map>; - const DiscosConfigurationNameTableType DiscosConfigurationNameTable = - { - {"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, - {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, - {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, - {"QQG", std::make_pair(CONFIGURATION_GREGORIAN4, true )}, - {"TRI", std::make_pair(CONFIGURATION_GREGORIAN5, true )}, - {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, - {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, - {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, - }; - - /** - * This dictionary contains the Leonardo focal configurations DISCOS enumerations, alongside their name inside the Leonardo minor servo system. - */ - using LDOConfigurationNameTableType = boost::bimap; - const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of - (CONFIGURATION_PRIMARY, "Primario") - (CONFIGURATION_GREGORIAN1, "Gregoriano 1") - (CONFIGURATION_GREGORIAN2, "Gregoriano 2") - (CONFIGURATION_GREGORIAN3, "Gregoriano 3") - (CONFIGURATION_GREGORIAN4, "Gregoriano 4") - (CONFIGURATION_GREGORIAN5, "Gregoriano 5") - (CONFIGURATION_GREGORIAN6, "Gregoriano 6") - (CONFIGURATION_GREGORIAN7, "Gregoriano 7") - (CONFIGURATION_GREGORIAN8, "Gregoriano 8") - (CONFIGURATION_BWG1, "BWG1") - (CONFIGURATION_BWG2, "BWG2") - (CONFIGURATION_BWG3, "BWG3") - (CONFIGURATION_BWG4, "BWG4"); - - /** - * This dictionary containes the Leonardo focal configurations DISCOS enumerations, alongside their ID counterpart as read from the Leonardo minor servo system proxy. - */ - using LDOConfigurationIDTableType = boost::bimap; - const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of - (CONFIGURATION_UNKNOWN, 0) - (CONFIGURATION_PRIMARY, 1) - (CONFIGURATION_GREGORIAN1, 11) - (CONFIGURATION_GREGORIAN2, 12) - (CONFIGURATION_GREGORIAN3, 13) - (CONFIGURATION_GREGORIAN4, 14) - (CONFIGURATION_GREGORIAN5, 15) - (CONFIGURATION_GREGORIAN6, 16) - (CONFIGURATION_GREGORIAN7, 17) - (CONFIGURATION_GREGORIAN8, 18) - (CONFIGURATION_BWG1, 21) - (CONFIGURATION_BWG2, 22) - (CONFIGURATION_BWG3, 23) - (CONFIGURATION_BWG4, 24); -} - #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h deleted file mode 100644 index 1dad210f9..000000000 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoContainers.h +++ /dev/null @@ -1,328 +0,0 @@ -#ifndef __SRTMINORSERVOCONTAINERS_H__ -#define __SRTMINORSERVOCONTAINERS_H__ - -/** - * SRTMinorServoContainers.h - * Giuseppe Carboni (giuseppe.carboni@inaf.it) - */ - -#include "SuppressWarnings.h" -#include -#include -#include - - -namespace MinorServo -{ - /** - * Object used to store some info regarding a scan. - */ - struct SRTMinorServoScan - { - /** - * Name of the servo involved in the scan. - */ - std::string servo_name = ""; - - /** - * Name of the axis involved in the scan. - */ - std::string axis_name = ""; - - /** - * Index of the axis involved in the scan. - */ - size_t axis_index = 0; - - /** - * Range of the scan. - */ - double scan_range = 0; - - /** - * Starting time of the scan. - */ - ACS::Time start_time = 0; - - /** - * Closing time of the scan. - */ - ACS::Time close_time = 0; - - /** - * Duration of the scan. - */ - ACS::TimeInterval scan_duration = 0; - - /** - * Central position of the scan axis. - */ - double central_position = 0; - - /** - * Starting elevation for the scan. - */ - double starting_elevation = 0; - }; - - using SRTMinorServoLookupTable = std::map>; - - /** - * This class implements a queue of time tagged positions. it extends a simple std::map with some specific methods. - */ - class SRTMinorServoPositionsQueue : private std::map> - { - public: - /** - * Default constructor. Used only for lazy initialization. - */ - SRTMinorServoPositionsQueue() : std::map>(), m_queue_size(0), m_vector_size(0), m_mutex() {} - - /** - * Constructor with queue size as parameter. - * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. - */ - SRTMinorServoPositionsQueue(size_t queue_size) : std::map>(), m_queue_size(queue_size), m_vector_size(0), m_mutex() - { - std::unique_lock lock(m_mutex); - queueLazyInit(queue_size); - } - - /** - * Constructor with queue size and vector size as parameters. - * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. - * @param vector_size the length of the vectors that this object will store. Once set it cannot be changed. This assures we are always dealing with the same number of virtual axes. - */ - SRTMinorServoPositionsQueue(size_t queue_size, size_t vector_size) : std::map>(), m_queue_size(queue_size), m_vector_size(vector_size), m_mutex() - { - std::unique_lock lock(m_mutex); - queueLazyInit(queue_size); - vectorLazyInit(vector_size); - } - - /** - * Custom assignment operator. It locks both the current object and the passed one with a mutex in order for the assignment operation to be thread safe. - * @param other the other SRTMinorServoPositionsQueue we are assigning its value to the current object. - * @return the newly populated SRTMinorServoPositionsQueue object. - */ - SRTMinorServoPositionsQueue& operator=(const SRTMinorServoPositionsQueue& other) - { - if(this != &other) - { - std::unique_lock lockThis(m_mutex, std::defer_lock); - std::unique_lock lockOther(other.m_mutex, std::defer_lock); - std::lock(lockThis, lockOther); - m_queue_size = other.m_queue_size; - m_vector_size = other.m_vector_size; - std::map>::operator=(other); - } - - return *this; - } - - /** - * Put method, with initializer list argument. - * @param key the time the given coordinates are related to. - * @param values the given set of coordinates. - */ - void put(ACS::Time key, const std::initializer_list& values) - { - put(key, std::vector(values)); - } - - /** - * Put method, with ACS::doubleSeq argument. - * @param key the time the given coordinates are related to. - * @param values the given set of coordinates. - */ - void put(ACS::Time key, const ACS::doubleSeq& values) - { - put(key, std::vector(values.get_buffer(), values.get_buffer() + values.length())); - } - - /** - * Put method, with std::vector argument. - * @param key the time the given coordinates are related to. - * @param values the given set of coordinates. - */ - void put(ACS::Time key, const std::vector& values) - { - std::unique_lock lock(m_mutex); - - vectorLazyInit(values.size()); - queueLazyInit(m_queue_size); - if(std::map>::size() == m_queue_size) - { - // Remove the oldest one - this->erase(this->begin()); - } - this->emplace(std::make_pair(key, values)); - } - - /** - * Get method. It retrieves a set of coordinates from a given ACS::Time, giving back the time as well. - * @param key the time the user wants to retrieve the related coordinates. - * @param exact a boolean indicating whether the user wants to interpolate (false) or not (true). - * @throw std::logic_error when the queue is empty. - * @throw std::out_of_range when the exact point was not found in the queue. - * @return a std::pair containing the ACS::Time as first element and the set of coordinates as second element. - */ - std::pair> get(ACS::Time key, bool exact = false) - { - std::shared_lock lock(m_mutex); - - if(this->empty()) - { - throw std::logic_error("The queue is empty!"); - } - - if(const SRTMinorServoPositionsQueue::iterator point = this->find(key); point != this->end()) - { - return *point; - } - else if(exact) - { - // Exact point not found, we throw an exception - throw std::out_of_range("Exact point not found!"); - } - else - { - // Key not found, should check outside the boundaries or interpolate - if(key <= this->begin()->first) - { - // Aksed for a timestamp older than the earliest point in the queue - return *this->cbegin(); - } - else if(key >= this->rbegin()->first) - { - // Asked for a timestamp newer than the latest point in the queue - return *this->crbegin(); - } - else - { - std::vector positions(m_vector_size, 0.0); - SRTMinorServoPositionsQueue::iterator p0, p1; - p1 = this->lower_bound(key); - p0 = p1; - p0--; - - // Calculate the linear fit for each position - double fraction = (key - p0->first) / (p1->first - p0->first); - - for(size_t i = 0; i < m_vector_size; i++) - { - positions[i] = p0->second[i] + fraction * (p1->second[i] - p0->second[i]); - } - - return std::make_pair(key, (const std::vector)positions); - } - } - } - - /** - * Size method thread safe override. - * @return the number of elements in the queue. - */ - size_t size() const - { - std::shared_lock lock(m_mutex); - return std::map>::size(); - } - - /** - * Clear method, thread safe. It empties the queue. - */ - void clear() - { - std::unique_lock lock(m_mutex); - std::map>::clear(); - } - - /** - * This method returns the number of points having a higher tag time than the one passed as argument. - * @param t the time threshold. This method counts and returns the number of points having a higher time than this value. - * @throw std::logic_error when the queue is empty. - * @return the number of points having a higher time than the given one. - */ - size_t getRemainingPoints(ACS::Time t) - { - std::shared_lock lock(m_mutex); - if(this->empty()) - { - throw std::logic_error("The queue is empty!"); - } - return std::distance(this->lower_bound(t), this->end()); - } - - private: - /** - * This method gets called by the constructors for the lazy intialization of the queue size value. - * @param queue_size the desired maximum queue size. - * @throw std::length_error when the desired queue size is equal to 0 or when it is greater than the maximum size that can be currently allocated. - */ - void queueLazyInit(size_t queue_size) - { - if(m_queue_size == 0) - { - if(queue_size == 0) - { - // The maximum queue size was not set yet - throw std::length_error("Queue length cannot be 0."); - } - else if(queue_size > this->max_size()) - { - // The requested size is greater than the maximum possible queue size - throw std::length_error("Queue length cannot exceed " + std::to_string(this->max_size()) + "."); - } - else - { - m_queue_size = queue_size; - } - } - } - - /** - * This method gets called by the constructors for the lazy initialization of the vector size value. - * @param vector_size the desired length of the vector containing the set of points. - * @throw std::length_error when the desired vector size is equal to 0 or when it is longer than 6. We don't have more than 6 axes, so we hard cap this value to 6. - * It also throws this when the user tries to insert a vector with different lenght then the already defined one. This ensures all stored vecors are of equal length. - */ - void vectorLazyInit(size_t vector_size) - { - if(vector_size == 0) - { - throw std::length_error("Vector length cannot be 0."); - } - else if(vector_size > 6) - { - // Hard cap to 6, we don't need more - throw std::length_error("Vector length cannot be longer than 6."); - } - else if(m_vector_size == 0) - { - m_vector_size = vector_size; - } - else if(m_vector_size != vector_size) - { - throw std::length_error("New vector length does not match the initial one."); - } - } - - /** - * The maximum size of the queue. - */ - size_t m_queue_size; - - /** - * The desired length of the vectors stored by this object. - */ - size_t m_vector_size; - - /** - * The shared mutex used for access synchronization. - */ - mutable std::shared_mutex m_mutex; - }; -} - -#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index ac49cf99e..f348f0be9 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include @@ -24,6 +24,7 @@ #include "SRTMinorServoSocket.h" #include "MSDevIOs.h" #include "SRTMinorServoContainers.h" +#include "SRTMinorServoCommon.h" using namespace MinorServo; @@ -322,11 +323,6 @@ protected: */ const std::string m_servo_name; - /** - * Dictionary containing the last status retrieved form the servo system. - */ - SRTMinorServoAnswerMap m_status; - /** * Number of virtual axes of the servo system. */ @@ -347,6 +343,11 @@ private: */ const std::vector m_virtual_axes_units; protected: + /** + * Dictionary containing the last status retrieved form the servo system. + */ + SRTMinorServoStatus m_status; + /** * Commanded user offsets for each axis of the servo system. */ @@ -412,21 +413,11 @@ private: */ baci::SmartPropertyPointer> m_enabled_ptr; - /** - * DevIO of the drive_cabinet_status property. - */ - MSAnswerMapDevIO* m_drive_cabinet_status_devio; - /** * Pointer to the drive_cabinet_status property. */ baci::SmartPropertyPointer> m_drive_cabinet_status_ptr; - /** - * DevIO of the block property. - */ - MSAnswerMapDevIO* m_block_devio; - /** * Pointer to the block property. */ @@ -457,23 +448,11 @@ private: */ baci::SmartPropertyPointer m_plain_virtual_positions_ptr; - /** - * DevIO of the virtual_positions property. - */ - MSVirtualPositionsDevIO* m_virtual_positions_devio; - /** * Pointer to the virtual_positions property. */ baci::SmartPropertyPointer m_virtual_positions_ptr; -protected: - /** - * DevIO of the virtual_offsets property. - */ - MSAnswerMapDevIO* m_virtual_offsets_devio; - -private: /** * Pointer to the virtual_offsets property. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h index ea428d36b..c2af90348 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include "SRTMinorServoBossCore.h" diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h index 0a00a84b0..e5c26e67d 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include "SRTMinorServoBossCore.h" diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h index 3413fc565..747c458a4 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include "SRTMinorServoBossCore.h" diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h index 7a14305e3..fbe34f5ad 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include "SRTMinorServoSocket.h" diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h index 9684e0153..32ae15c9e 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h @@ -6,7 +6,7 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ -#include "SRTMinorServoCommon.h" +#include "SuppressWarnings.h" #include #include #include "SRTMinorServoBossCore.h" diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 5df1f27a6..df2e50b72 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -6,11 +6,17 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, CharacteristicComponentImpl(component_name, container_services), m_component_name(std::string(component_name.c_str())), m_servo_name(std::string(strchr(component_name.c_str(), '/') + 1)), - m_status(), m_virtual_axes(getCDBValue(container_services, "virtual_axes")), m_physical_axes(getCDBValue(container_services, "physical_axes")), m_virtual_axes_names(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_positions")), m_virtual_axes_units(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_status( + m_servo_name, + SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_axes_enabled"), + SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_positions"), + m_virtual_axes_names, + SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets") + ), m_user_offsets(m_virtual_axes, 0.0), m_system_offsets(m_virtual_axes, 0.0), m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), @@ -24,18 +30,14 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_in_use(Management::MNG_FALSE), m_current_setup(""), m_enabled_ptr(this), - m_drive_cabinet_status_devio(nullptr), m_drive_cabinet_status_ptr(this), - m_block_devio(nullptr), m_block_ptr(this), m_operative_mode_ptr(this), m_physical_axes_enabled_ptr(this), m_physical_positions_ptr(this), m_virtual_axes_ptr(this), m_plain_virtual_positions_ptr(this), - m_virtual_positions_devio(nullptr), m_virtual_positions_ptr(this), - m_virtual_offsets_devio(nullptr), m_virtual_offsets_ptr(this), m_virtual_user_offsets_ptr(this), m_virtual_system_offsets_ptr(this), @@ -60,26 +62,25 @@ void SRTBaseMinorServoImpl::initialize() try { m_enabled_ptr = new ROEnumImpl((m_component_name + ":enabled").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "enabled", "ENABLED", m_status), true); - m_drive_cabinet_status_devio = new MSAnswerMapDevIO(m_servo_name, "drive_cabinet_status", "STATUS", m_status); - m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), m_drive_cabinet_status_devio, true); - m_block_devio = new MSAnswerMapDevIO(m_servo_name, "block", "BLOCK", m_status); - m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), m_block_devio, true); + new MSAnswerMapDevIO("enabled", m_status, &SRTMinorServoStatus::isEnabled), true); + m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), + new MSAnswerMapDevIO("drive_cabinet_status", m_status, &SRTMinorServoStatus::getDriveCabinetStatus), true); + m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), + new MSAnswerMapDevIO("block", m_status, &SRTMinorServoStatus::isBlocked), true); m_operative_mode_ptr = new ROEnumImpl((m_component_name + ":operative_mode").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "operative_mode", "OPERATIVE_MODE", m_status), true); + new MSAnswerMapDevIO("operative_mode", m_status, &SRTMinorServoStatus::getOperativeMode), true); m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "physical_axes_enabled", SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_axes_enabled"), m_status), true); + new MSAnswerMapDevIO("physical_axes_enabled", m_status, &SRTMinorServoStatus::getPhysicalAxesEnabled), true); m_physical_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":physical_positions").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "physical_positions", SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_positions"), m_status), true); + new MSAnswerMapDevIO("physical_positions", m_status, &SRTMinorServoStatus::getPhysicalPositions), true); m_virtual_axes_ptr = new baci::ROlong((m_component_name + ":virtual_axes").c_str(), getComponent(), new MSGenericDevIO(m_virtual_axes), true); m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), - new MSAnswerMapDevIO(m_servo_name, "virtual_positions", m_virtual_axes_names, m_status), true); - std::vector virtual_offsets = SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets"); - m_virtual_positions_devio = new MSVirtualPositionsDevIO(m_servo_name, m_virtual_axes_names, virtual_offsets, m_status); - m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), m_virtual_positions_devio, true); - m_virtual_offsets_devio = new MSAnswerMapDevIO(m_servo_name, "virtual_offsets", virtual_offsets, m_status); - m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), m_virtual_offsets_devio, true); + new MSAnswerMapDevIO("plain_virtual_positions", m_status, &SRTMinorServoStatus::getPlainVirtualPositions), true); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_positions", m_status, &SRTMinorServoStatus::getVirtualPositions), true); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_offsets", m_status, &SRTMinorServoStatus::getVirtualOffsets), true); m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_user_offsets").c_str(), getComponent(), new MSGenericDevIO>(m_user_offsets), true); m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_system_offsets").c_str(), getComponent(), @@ -133,8 +134,7 @@ bool SRTBaseMinorServoImpl::status() { m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); - ACS::Time comp; - ACS::doubleSeq current_point = m_virtual_positions_devio->read(comp); + ACS::doubleSeq current_point = m_status.getVirtualPositions(); // Calculate the current speed of the axes try @@ -205,8 +205,7 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) } std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - ACS::Time comp; - ACS::doubleSeq offsets = m_virtual_offsets_devio->read(comp); + ACS::doubleSeq offsets = m_status.getVirtualOffsets(); for(size_t i = 0; i < m_virtual_axes; i++) { @@ -501,8 +500,7 @@ void SRTBaseMinorServoImpl::reloadOffsets() std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); // Read the Leonardo offsets - ACS::Time comp; - ACS::doubleSeq sequence = m_virtual_offsets_devio->read(comp); + ACS::doubleSeq sequence = m_status.getVirtualOffsets(); std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); // Check if the offsets correspond or not @@ -672,8 +670,7 @@ void SRTBaseMinorServoImpl::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - ACS::Time comp; - if(m_block_devio->read(comp) == Management::MNG_TRUE || m_drive_cabinet_status_devio->read(comp) == DRIVE_CABINET_ERROR) + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); ex.setReason("Servo system blocked or drive cabinet error."); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index f05589f3f..04e5f1b78 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -101,15 +101,12 @@ bool SRTMinorServoBossCore::status() return false; } - // Call servo status - //ACS::Time comp; - SRTMinorServoMotionStatus motion_status = m_motion_status.load(); /*if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) { // We only get here if the system is configured, therefore we check the correct position of the gregorian cover - SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_component.m_current_configuration_devio->read(comp) == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; - if(m_component.m_gregorian_cover_devio->read(comp) != commanded_gregorian_cover_position) + SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_status.getFocalConfiguration() == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + if(m_status.getGregorianCoverPosition() != commanded_gregorian_cover_position) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Gregorian cover in wrong position.")); setFailure(); @@ -1109,7 +1106,6 @@ void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoSca if(scan_info.is_empty_scan) { start_time = getTimeStamp(); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startScan()", (LM_NOTICE, "Empty scan, nothing to do.")); return; } @@ -1132,7 +1128,6 @@ void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoSca m_current_scan = scan; start_time = scan.start_time; m_scan_active.store(Management::MNG_TRUE); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startScan()", (LM_NOTICE, "Scan started.")); startThread(m_scan_thread); } @@ -1211,8 +1206,7 @@ void SRTMinorServoBossCore::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - ACS::Time comp; - if(m_component.m_control_devio->read(comp) != CONTROL_DISCOS) + if(m_status.getControl() != CONTROL_DISCOS) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system is not controlled by DISCOS."); @@ -1221,7 +1215,7 @@ void SRTMinorServoBossCore::checkLineStatus() throw ex.getMinorServoErrorsEx(); } - if(m_component.m_emergency_devio->read(comp) == Management::MNG_TRUE) + if(m_status.emergencyPressed() == Management::MNG_TRUE) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system in emergency status."); @@ -1269,8 +1263,6 @@ void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sle setFailure(); throw ex.getComponentErrorsEx(); } - - ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::startThread()", (LM_NOTICE, (std::string(T::c_thread_name) + " STARTED").c_str())); } template >> diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 91087d07f..8a8a55374 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -22,17 +22,13 @@ SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, m_scan_active_ptr(this), m_scanning_ptr(this), m_tracking_ptr(this), - m_current_configuration_devio(nullptr), m_current_configuration_ptr(this), m_simulation_enabled_ptr(this), m_plc_time_ptr(this), m_plc_version_ptr(this), - m_control_devio(nullptr), m_control_ptr(this), m_power_ptr(this), - m_emergency_devio(nullptr), m_emergency_ptr(this), - m_gregorian_cover_devio(nullptr), m_gregorian_cover_ptr(this), m_last_executed_command_ptr(this) { @@ -77,24 +73,22 @@ void SRTMinorServoBossImpl::initialize() new MSGenericDevIO>(m_core.m_scanning), true); m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), new MSGenericDevIO>(m_core.m_tracking), true); - m_current_configuration_devio = new MSAnswerMapDevIO("current_configuration", "CURRENT_CONFIG", m_core.m_status); - m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), m_current_configuration_devio, true); + m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), new MSAnswerMapDevIO("current_configuration", m_core.m_status, &SRTMinorServoGeneralStatus::getFocalConfiguration), true); m_simulation_enabled_ptr = new ROEnumImpl((m_component_name + ":simulation_enabled").c_str(), getComponent(), - new MSAnswerMapDevIO("simulation_enabled", "SIMULATION_ENABLED", m_core.m_status), true); + new MSAnswerMapDevIO("simulation_enabled", m_core.m_status, &SRTMinorServoGeneralStatus::isSimulationEnabled), true); m_plc_time_ptr = new baci::ROdouble((m_component_name + ":plc_time").c_str(), getComponent(), - new MSAnswerMapDevIO("plc_time", "PLC_TIME", m_core.m_status), true); + new MSAnswerMapDevIO("plc_time", m_core.m_status, &SRTMinorServoGeneralStatus::getPLCTime), true); m_plc_version_ptr = new baci::ROstring((m_component_name + ":plc_version").c_str(), getComponent(), - new MSAnswerMapDevIO("plc_version", "PLC_VERSION", m_core.m_status), true); - m_control_devio = new MSAnswerMapDevIO("control", "CONTROL", m_core.m_status); - m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), m_control_devio, true); + new MSAnswerMapDevIO("plc_version", m_core.m_status, &SRTMinorServoGeneralStatus::getPLCVersion), true); + m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), + new MSAnswerMapDevIO("control", m_core.m_status, &SRTMinorServoGeneralStatus::getControl), true); m_power_ptr = new ROEnumImpl((m_component_name + ":power").c_str(), getComponent(), - new MSAnswerMapDevIO("power", "POWER", m_core.m_status), true); - m_emergency_devio = new MSAnswerMapDevIO("emergency", "EMERGENCY", m_core.m_status); - m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), m_emergency_devio, true); - m_gregorian_cover_devio = new MSAnswerMapDevIO("gregorian_cover", "GREGORIAN_CAP", m_core.m_status); - m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), m_gregorian_cover_devio, true); + new MSAnswerMapDevIO("power", m_core.m_status, &SRTMinorServoGeneralStatus::hasPower), true); + m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), + new MSAnswerMapDevIO("emergency", m_core.m_status, &SRTMinorServoGeneralStatus::emergencyPressed), true); + m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), new MSAnswerMapDevIO("gregorian_cover", m_core.m_status, &SRTMinorServoGeneralStatus::getGregorianCoverPosition), true); m_last_executed_command_ptr = new baci::ROdouble((m_component_name + ":last_executed_command").c_str(), getComponent(), - new MSAnswerMapDevIO("last_executed_command", "LAST_EXECUTED_COMMAND", m_core.m_status), true); + new MSAnswerMapDevIO("last_executed_command", m_core.m_status, &SRTMinorServoGeneralStatus::getLastExecutedCommand), true); } catch(std::bad_alloc& ba) { diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index efeabcb31..8afaab79f 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -61,8 +61,7 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - // ACS::Time comp; - //bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == COVER_STATUS_CLOSED ? true : false; + //bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED ? true : false; // Then we cycle through all the servos and make sure their operative mode is STOP if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index a82aab228..a70f66795 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -51,13 +51,17 @@ void SRTMinorServoScanThread::onStart() auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); m_starting_coordinates = *servo->getAxesPositions(0); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, "SCAN THREAD STARTED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, + ("SCAN THREAD STARTED, SCANNING " + std::to_string((int)m_core.m_current_scan.scan_range) + "MM IN " + std::to_string((int)(m_core.m_current_scan.scan_duration / 10000000)) + " SECONDS ALONG " + m_core.m_current_scan.servo_name + " " + m_core.m_current_scan.axis_name + " AXIS").c_str() + )); } void SRTMinorServoScanThread::onStop() { AUTO_TRACE("SRTMinorServoScanThread::onStop()"); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_NOTICE, "SCAN THREAD STOPPED")); + m_core.m_scanning.store(Management::MNG_FALSE); if(m_error) // We didn't reach the end of the scan because of some error @@ -100,8 +104,6 @@ void SRTMinorServoScanThread::onStop() // Finally unlock the scan capabilities m_core.m_scan_active.store(Management::MNG_FALSE); - - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_NOTICE, "SCAN THREAD STOPPED")); } void SRTMinorServoScanThread::runLoop() diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index a36e5d0fb..1daa85968 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -35,6 +35,19 @@ void SRTMinorServoSetupThread::onStop() AUTO_TRACE("SRTMinorServoSetupThread::onStop()"); ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_NOTICE, "SETUP THREAD STOPPED")); + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + try + { + m_core.startThread(m_core.m_tracking_thread); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + } + } } void SRTMinorServoSetupThread::runLoop() @@ -131,8 +144,7 @@ void SRTMinorServoSetupThread::runLoop() } case 3: // Wait for the system to show the commanded configuration { - ACS::Time comp; - if(m_core.m_component.m_current_configuration_devio->read(comp) == m_core.m_commanded_configuration.load()) + if(m_core.m_status.getFocalConfiguration() == m_core.m_commanded_configuration.load()) { m_status = 4; } @@ -141,9 +153,8 @@ void SRTMinorServoSetupThread::runLoop() } case 4: // Wait for the whole system to reach the desired configuration { - ACSErr::Completion_var comp; // First we check the status of the gregorian cover - bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == m_gregorian_cover_position ? true : false; + bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; // Then we cycle through all the servos and make sure their operative mode is SETUP if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool @@ -207,9 +218,8 @@ void SRTMinorServoSetupThread::runLoop() } case 6: // Wait for the whole system to reach the PRESET configuration { - //ACSErr::Completion_var comp; // First we check the status of the gregorian cover - //bool completed = m_core.m_component.m_gregorian_cover_devio->read(comp) == m_gregorian_cover_position ? true : false; + //bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; if(/*completed && */std::all_of(m_core.m_current_servos.begin(), m_core.m_current_servos.end(), [this](const std::pair& servo) -> bool { @@ -232,17 +242,6 @@ void SRTMinorServoSetupThread::runLoop() if(m_core.m_elevation_tracking_enabled.load() == Management::MNG_TRUE) { m_core.m_motion_status.store(MOTION_STATUS_TRACKING); - try - { - m_core.startThread(m_core.m_tracking_thread); - } - catch(ComponentErrors::ComponentErrorsEx& ex) - { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); - this->setStopped(); - return; - } } else { diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 47bac8dc4..ad19c5b98 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -29,13 +29,15 @@ void SRTMinorServoTrackingThread::onStart() void SRTMinorServoTrackingThread::onStop() { AUTO_TRACE("SRTMinorServoTrackingThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + if(m_error) { m_core.setFailure(); } - - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); } void SRTMinorServoTrackingThread::runLoop() diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index f294bc939..959afb9de 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -120,8 +120,7 @@ void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORB } std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); - ACS::Time comp; - ACS::doubleSeq offsets = m_virtual_offsets_devio->read(comp); + ACS::doubleSeq offsets = m_status.getVirtualOffsets(); for(size_t i = 0; i < m_virtual_axes; i++) { -- GitLab From 2eb7d19a0faf6245933803c547bbae00c89ab48b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sun, 3 Mar 2024 01:53:59 +0000 Subject: [PATCH 084/150] Updated SRTMinorServoAnswerMap socket handling --- .../include/SRTMinorServoContainers.h | 21 +++++++++++++++++-- .../src/SRTMinorServoSocket.cpp | 2 +- .../tests/SRTMinorServoCommandLibraryTest.cpp | 8 ++++++- .../src/SRTMinorServoBossCore.cpp | 4 ++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index 9a7b829df..207303ac0 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -425,7 +425,7 @@ namespace MinorServo SRTMinorServoAnswerMap(const SRTMinorServoAnswerMap& other) : m_mutex() { std::unique_lock lockThis(m_mutex, std::defer_lock); - std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); std::lock(lockThis, lockOther); static_cast>&>(*this) = static_cast>&>(other); } @@ -439,7 +439,7 @@ namespace MinorServo if(this != &other) { std::unique_lock lockThis(m_mutex, std::defer_lock); - std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); std::lock(lockThis, lockOther); static_cast>&>(*this) = static_cast>&>(other); } @@ -447,6 +447,23 @@ namespace MinorServo return *this; } + /** + * Update operator. It merges the current object with the elements of another object + * @param other the SRTMinorServoAnswerMap which values have to be copied inside the current object + */ + SRTMinorServoAnswerMap& operator+=(const SRTMinorServoAnswerMap& other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + for(const auto& entry : other) + { + this->operator[](entry.first) = entry.second; + } + + return *this; + } + /** * Equality operator, only check the std::map and avoid comparing the mutexes, which will obviously be different * @param other the SRTMinorServoAnswerMap object to compare the current object with diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index d0e3405ef..3c4cf9dca 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -179,7 +179,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); if(map) { - map->get() = map_answer; + map->get() += map_answer; } return map_answer; diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp index 1447613f7..b0fb317e2 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp @@ -61,8 +61,14 @@ TEST(SRTMinorServoCommandLibraryTest, parseAnswer) args.put("OUTPUT", "GOOD"); args.put("TIMESTAMP", 1665743366.654321); EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); - EXPECT_EQ(args.getTimestamp(), 138850361666543210); + EXPECT_TRUE(args.checkOutput()); + SRTMinorServoAnswerMap other; + other.put("OTHER", 123456); + args += other; + EXPECT_EQ(args.get("OTHER"), 123456); + EXPECT_EQ(args.getTimestamp(), 138850361666543210); + EXPECT_TRUE(args.checkOutput()); // Complete correct answer answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 04e5f1b78..1b1e57785 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -30,8 +30,8 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_socket_connected(m_socket.isConnected() ? Management::MNG_TRUE : Management::MNG_FALSE), m_servos{ //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, - { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } - //{ "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") }, + { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") } //{ "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } }, m_tracking_servos{ -- GitLab From 7697e1743effb75daca0cfce69b3358590211b40 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 4 Mar 2024 13:50:00 +0000 Subject: [PATCH 085/150] Added some log for the SRTMinorServoAnswerMap --- .../include/SRTMinorServoContainers.h | 35 ++++++++++++++----- .../src/SRTMinorServoCommandLibrary.cpp | 2 ++ .../src/SRTMinorServoSocket.cpp | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index 207303ac0..d0e84bf1c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -492,17 +492,26 @@ namespace MinorServo std::shared_lock lock(m_mutex); - if constexpr(std::is_integral_v) - { - return (T)std::get(this->at(key)); - } - else if constexpr(std::is_floating_point_v) + try { - return (T)std::get(this->at(key)); + if constexpr(std::is_integral_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(std::is_floating_point_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(is_string_v) + { + return (T)std::get(this->at(key)).c_str(); + } } - else if constexpr(is_string_v) + catch(std::out_of_range& ex) { - return (T)std::get(this->at(key)).c_str(); + std::cout << "PLAIN ANSWER:" << std::endl; + std::cout << this->getPlainAnswer() << std::endl; + throw ex; } } @@ -591,6 +600,16 @@ namespace MinorServo return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); } + /** + * This method returns the plain answer received from the socket. Useful for log purposes. + * @return a std::string containing the plain answer received from the socket. + */ + const std::string getPlainAnswer() const + { + std::shared_lock lock(m_mutex); + return this->get("PLAIN_ANSWER"); + } + protected: /** * Shared mutex to control read and write accesses. Multiple reading access are permitted and will only block writing access. Writing access will block all accesses diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index ddafbe859..6d23c3291 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -172,5 +172,7 @@ SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(const std::strin args.clear(); } + args.put("PLAIN_ANSWER", original_answer); + return args; } diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index 3c4cf9dca..d0e3405ef 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -179,7 +179,7 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); if(map) { - map->get() += map_answer; + map->get() = map_answer; } return map_answer; -- GitLab From 17f4a8a05f499d124f6b09efcfc5f0084d2a217f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 15:44:48 +0100 Subject: [PATCH 086/150] Fix #797, reduced ExternalClients excp. log output (#845) --- .../include/ExternalClientsSocketServer.h | 8 +++- .../src/ExternalClientsSocketServer.cpp | 42 ++++++++++++------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h b/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h index 19db9bf95..162ba37e6 100644 --- a/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h +++ b/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h @@ -20,6 +20,7 @@ #include #include #include +#include #define BUFFERSIZE 1000 #define GAVINO "MANAGEMENT/Gavino" @@ -96,7 +97,12 @@ public: void byebye() {m_byebye=true;}; private: - ContainerServices* m_services; + /** + * Log filtering object + */ + IRA::CLogDike m_logDike; + + ContainerServices* m_services; /** It contains error information */ CError m_Error; diff --git a/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp b/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp index 2fe3df0f4..a34bfebb2 100644 --- a/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp +++ b/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp @@ -17,8 +17,7 @@ using namespace ComponentErrors; using namespace ManagementErrors; CExternalClientsSocketServer::CExternalClientsSocketServer (ContainerServices * service):CSocket (), -m_services -(service) +m_services (service), m_logDike(_IRA_LOGDIKE_GETLOGGER) { AUTO_TRACE ("CExternalClientsSocketServer::CExternalClientsSocketServer()"); setExternalClientSocketStatus (ExternalClientSocketStatus_NOTCNTD); @@ -308,7 +307,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); status_val = "NA"; } out.Concat (status_val); @@ -322,7 +322,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); target = "NA"; } out.Concat (target); @@ -350,7 +351,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); azStr = "NA"; elStr = "NA"; raStr = "NA"; @@ -385,7 +387,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); azErr = 0.0; } out.Concat (azErr); @@ -399,7 +402,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); elErr = 0.0; } out.Concat (elErr); @@ -413,7 +417,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); pointingAzCorr = 0.0; } out.Concat (pointingAzCorr); @@ -428,7 +433,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); pointingElCorr = 0.0; } out.Concat (pointingElCorr); @@ -442,7 +448,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); refractionCorr = 0.0; } out.Concat (refractionCorr); @@ -456,7 +463,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); azOff = 0.0; elOff = 0.0; raOff = 0.0; @@ -485,7 +493,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); receiver = "NA"; } out.Concat (receiver); @@ -500,7 +509,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); lo[0] = 0.0; } out.Concat (lo[0]); @@ -522,7 +532,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); trackingStr = "NA"; } out.Concat (trackingStr); @@ -549,7 +560,8 @@ CExternalClientsSocketServer::cmdToScheduler () { _EXCPT (ComponentErrors::UnexpectedExImpl, impl, "CExternalClientsSocketServer::cmdToScheduler()"); - impl.log (LM_ERROR); + _IRA_LOGDIKE_EXCEPTION(m_logDike,impl,LM_ERROR); + //impl.log (LM_ERROR); ret_val = "Unexpected Error"; out = IRA::CString (ret_val); } -- GitLab From d5339f7279ed23d86441b69f40bfce5999565b5b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 16:31:39 +0100 Subject: [PATCH 087/150] Fix #844, addresses of external clients are now logged (#846) Their ports are logged as well --- .../ExternalClients/include/ExternalClientsSocketServer.h | 4 ++++ .../ExternalClients/src/ExternalClientsSocketServer.cpp | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h b/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h index 162ba37e6..f41cdb496 100644 --- a/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h +++ b/Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h @@ -125,6 +125,10 @@ private: /** This is the reference to the mount component */ Antenna::Mount_var m_mount; + /** Address and port of the connected client **/ + CString m_peerAddress; + WORD m_peerPort; + int receiveBuffer(BYTE *Msg,WORD Len); void printBuffer(BYTE *Buff,WORD Len); OperationResult sendBuffer(BYTE *Msg,WORD Len); diff --git a/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp b/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp index a34bfebb2..f28a30468 100644 --- a/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp +++ b/Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp @@ -17,7 +17,7 @@ using namespace ComponentErrors; using namespace ManagementErrors; CExternalClientsSocketServer::CExternalClientsSocketServer (ContainerServices * service):CSocket (), -m_services (service), m_logDike(_IRA_LOGDIKE_GETLOGGER) +m_services (service), m_logDike(_IRA_LOGDIKE_GETLOGGER), m_peerAddress(""), m_peerPort(0) { AUTO_TRACE ("CExternalClientsSocketServer::CExternalClientsSocketServer()"); setExternalClientSocketStatus (ExternalClientSocketStatus_NOTCNTD); @@ -230,6 +230,9 @@ CExternalClientsSocketServer::cmdToScheduler () } if (Res == WOULDBLOCK) setSockMode (m_Error, BLOCKING); + + newExternalClientsSocketServer.getPeerName(m_peerAddress, m_peerPort); + ACS_LOG(LM_FULL_INFO, "CExternalClientsSocketServer::cmdToScheduler()", (LM_NOTICE, std::string("Got connection from " + std::string(m_peerAddress) + " " + std::to_string(m_peerPort)).c_str())); } m_accept = true; @@ -602,7 +605,10 @@ CExternalClientsSocketServer::cmdToScheduler () } else { + ACS_LOG(LM_FULL_INFO, "CExternalClientsSocketServer::cmdToScheduler()", (LM_NOTICE, std::string("Closed connection from " + std::string(m_peerAddress) + " " + std::to_string(m_peerPort)).c_str())); newExternalClientsSocketServer.Close (m_Error); + m_peerAddress = ""; + m_peerPort = 0; m_accept = false; } } -- GitLab From fa7e9bb1d4a6fac0ce96eec8189d83fd52d9461a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 16:36:10 +0000 Subject: [PATCH 088/150] Updated branch --- .../DataBlock/PointingModel/PointingModel.xml | 46 ++++++++-------- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + .../DataBlock/PointingModel/PointingModel.xml | 46 ++++++++-------- .../CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + .../CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + .../CDB/alma/MINORSERVO/Socket/Socket.xml | 2 +- .../idl/SRTMinorServo.idl | 5 ++ .../include/SRTMinorServoContainers.h | 14 ++++- .../src/SRTMinorServoSocket.cpp | 7 +-- .../config/CDB/schemas/SRTMinorServo.xsd | 1 + .../SRTMinorServo/include/SRTMinorServoImpl.h | 52 ++++++++++++------- .../src/SRTMinorServoTrackingThread.cpp | 14 +++++ .../src/SRTProgramTrackMinorServoImpl.cpp | 20 +++++-- 14 files changed, 137 insertions(+), 74 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index b1cf45978..14a8fbca7 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -38,36 +38,36 @@ KKG 90.0 - 1 -2.2964186668 - 1 0.0 - 1 -0.0061030770 - 1 -0.0035287447 - 1 -0.0014408963 - 1 -0.0017973853 - 1 0.0719125122 - 1 0.0925239921 - 0 0 - 0 0 - 1 0.0128885703 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 0 0.0 - 1 0.0006690503 - 1 0.0000107827 + 1 0.0002358370 + 1 0.0000537828 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 064ca71d1..6fdbf0722 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -34,5 +34,6 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index fcb93eec9..eebfba2c7 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -34,5 +34,6 @@ + diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index b1cf45978..14a8fbca7 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -38,36 +38,36 @@ KKG 90.0 - 1 -2.2964186668 - 1 0.0 - 1 -0.0061030770 - 1 -0.0035287447 - 1 -0.0014408963 - 1 -0.0017973853 - 1 0.0719125122 - 1 0.0925239921 - 0 0 - 0 0 - 1 0.0128885703 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 0 0.0 - 1 0.0006690503 - 1 0.0000107827 + 1 0.0002358370 + 1 0.0000537828 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml index 064ca71d1..6fdbf0722 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -34,5 +34,6 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index fcb93eec9..eebfba2c7 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -34,5 +34,6 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml index f9925f1d3..5ca037aaa 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -10,4 +10,4 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" IPAddress="192.168.200.13" Port="4758" - SocketTimeout="0.2"/> + SocketTimeout="1"/> diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 9177b2853..5c3eb142a 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -254,6 +254,11 @@ module MinorServo */ readonly attribute ACS::ROlong remaining_trajectory_points; + /** + * This property returns the sequence of tracking error for each virtual axis of the servo + */ + readonly attribute ACS::ROdoubleSeq tracking_error; + /** * This method loads a set of coordinates that have to be tracked by the servo system * @param trajectory_id the ID of the trajectory to which the current point belongs diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index d0e84bf1c..dfea1df66 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -509,8 +509,8 @@ namespace MinorServo } catch(std::out_of_range& ex) { - std::cout << "PLAIN ANSWER:" << std::endl; - std::cout << this->getPlainAnswer() << std::endl; + std::cout << "PLAIN_COMMAND: " << this->getPlainCommand(); + std::cout << "PLAIN_ANSWER:" << this->getPlainAnswer(); throw ex; } } @@ -600,6 +600,16 @@ namespace MinorServo return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); } + /** + * This method returns the plain command sent using the socket. Useful for log purposes. + * @return a std::string containing the plain command sent using the socket. + */ + const std::string getPlainCommand() const + { + std::shared_lock lock(m_mutex); + return this->get("PLAIN_COMMAND"); + } + /** * This method returns the plain answer received from the socket. Useful for log purposes. * @return a std::string containing the plain answer received from the socket. diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index d0e3405ef..f0606fe29 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -102,10 +102,10 @@ const bool SRTMinorServoSocket::isConnected() const SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) { - connect(); - std::lock_guard guard(m_mutex); + connect(); + double start_time = IRA::CIRATools::getUNIXEpoch(); size_t sent_bytes = 0; @@ -171,12 +171,13 @@ SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std m_socket_status = NOTREADY; Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); - impl.setReason("Something went wrong while receiving some bytes."); + impl.setReason(("Something went wrong while receiving some bytes. Command: " + command).c_str()); throw impl.getMinorServoErrorsEx(); } } SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); + map_answer.put("PLAIN_COMMAND", command); if(map) { map->get() = map_answer; diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index e2477b42c..d3f3d966f 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -75,6 +75,7 @@ + diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index f348f0be9..2a43122df 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -200,85 +200,85 @@ public: /** * Returns a reference to the enabled property implementation of the IDL interface. - * @return pointer to read-only boolean property enabled. + * @return pointer to the read-only boolean property enabled. */ virtual Management::ROTBoolean_ptr enabled(); /** * Returns a reference to the drive_cabinet_status property implementation of the IDL interface. - * @return pointer to read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. + * @return pointer to the read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. */ virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); /** * Returns a reference to the block property implementation of the IDL interface. - * @return pointer to read-only boolean property block. + * @return pointer to the read-only boolean property block. */ virtual Management::ROTBoolean_ptr block(); /** * Returns a reference to the operative_mode property implementation of the IDL interface. - * @return pointer to read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. + * @return pointer to the read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. */ virtual ROSRTMinorServoOperativeMode_ptr operative_mode(); /** * Returns a reference to the physical_axes_enabled property implementation of the IDL interface. - * @return pointer to read-only boolean sequence property physical_axes_enabled. + * @return pointer to the read-only boolean sequence property physical_axes_enabled. */ virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); /** * Returns a reference to the physical_positions property implementation of the IDL interface. - * @return pointer to read-only boolean sequence property physical_positions. + * @return pointer to the read-only boolean sequence property physical_positions. */ virtual ACS::ROdoubleSeq_ptr physical_positions(); /** * Returns a reference to the virtual_axes property implementation of the IDL interface. - * @return pointer to read-only long property virtual_axes. + * @return pointer to the read-only long property virtual_axes. */ virtual ACS::ROlong_ptr virtual_axes(); /** * Returns a reference to the plain_virtual_positions property implementation of the IDL interface. - * @return pointer to read-only double sequence property plain_virtual_positions. + * @return pointer to the read-only double sequence property plain_virtual_positions. */ virtual ACS::ROdoubleSeq_ptr plain_virtual_positions(); /** * Returns a reference to the virtual_positions property implementation of the IDL interface. - * @return pointer to read-only double sequence property virtual_positions. + * @return pointer to the read-only double sequence property virtual_positions. */ virtual ACS::ROdoubleSeq_ptr virtual_positions(); /** * Returns a reference to the virtual_offsets property implementation of the IDL interface. - * @return pointer to read-only double sequence property virtual_offsets. + * @return pointer to the read-only double sequence property virtual_offsets. */ virtual ACS::ROdoubleSeq_ptr virtual_offsets(); /** * Returns a reference to the virtual_user_offsets property implementation of the IDL interface. - * @return pointer to read-only double sequence property virtual_user_offsets. + * @return pointer to the read-only double sequence property virtual_user_offsets. */ virtual ACS::ROdoubleSeq_ptr virtual_user_offsets(); /** * Returns a reference to the virtual_system_offsets property implementation of the IDL interface. - * @return pointer to read-only double sequence property virtual_system_offsets. + * @return pointer to the read-only double sequence property virtual_system_offsets. */ virtual ACS::ROdoubleSeq_ptr virtual_system_offsets(); /** * Returns a reference to the in_use property implementation of the IDL interface. - * @return pointer to read-only boolean property in_use. + * @return pointer to the read-only boolean property in_use. */ virtual Management::ROTBoolean_ptr in_use(); /** * Returns a reference to the current_setup property implementation of the IDL interface. - * @return pointer to read-only string property current_setup. + * @return pointer to the read-only string property current_setup. */ virtual ACS::ROstring_ptr current_setup(); @@ -652,28 +652,34 @@ public: /** * Returns a reference to the tracking property implementation of the IDL interface. - * @return pointer to read-only boolean property tracking. + * @return pointer to the read-only boolean property tracking. */ virtual Management::ROTBoolean_ptr tracking(); /** * Returns a reference to the trajectory_id property implementation of the IDL interface. - * @return pointer to read-only long property trajectory_id. + * @return pointer to the read-only long property trajectory_id. */ virtual ACS::ROlong_ptr trajectory_id(); /** * Returns a reference to the total_trajectory_points property implementation of the IDL interface. - * @return pointer to read-only long property total_trajectory_points. + * @return pointer to the read-only long property total_trajectory_points. */ virtual ACS::ROlong_ptr total_trajectory_points(); /** * Returns a reference to the remaining_trajectory_points property implementation of the IDL interface. - * @return pointer to read-only long property remaining_trajectory_points. + * @return pointer to the read-only long property remaining_trajectory_points. */ virtual ACS::ROlong_ptr remaining_trajectory_points(); + /** + * Returns a reference to the tracking_error property implementation of the IDL interface. + * @return pointer to the read-only double sequence property tracking_error. + */ + virtual ACS::ROdoubleSeq_ptr tracking_error(); + private: /** * Queue of positions to be assumed by the servo system when tracking a trajectory. @@ -685,6 +691,11 @@ private: */ const std::vector m_tracking_delta; + /** + * Tracking error values for all minor servo system virtual axes. + */ + std::vector m_tracking_error; + /** * Indicates if the servo system is tracking or not. It is tracking when the position error is lower than the tracking delta for all the virtual axes. */ @@ -724,6 +735,11 @@ private: * Pointer to the remaining_trajectory_points property. */ baci::SmartPropertyPointer m_remaining_trajectory_points_ptr; + + /** + * Pointer to the tracking_error property. + */ + baci::SmartPropertyPointer m_tracking_error_ptr; }; #endif diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index ad19c5b98..7f4350101 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -118,6 +118,20 @@ void SRTMinorServoTrackingThread::runLoop() this->setStopped(); return; } + catch(std::exception& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.what())); + m_error = true; + this->setStopped(); + return; + } + catch(CORBA::Exception& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex._info().c_str())); + m_error = true; + this->setStopped(); + return; + } } m_point_id++; diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index 959afb9de..16fa1ebd6 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -6,6 +6,7 @@ SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString & SRTBaseMinorServoImpl(componentName, containerServices), m_tracking_queue(1500, m_virtual_axes), m_tracking_delta(SRTBaseMinorServoImpl::getMotionConstant(*this, "tracking_delta")), + m_tracking_error(m_virtual_axes, 0.0), m_tracking(Management::MNG_FALSE), m_trajectory_id(0), m_total_trajectory_points(0), @@ -13,7 +14,8 @@ SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString & m_tracking_ptr(this), m_trajectory_id_ptr(this), m_total_trajectory_points_ptr(this), - m_remaining_trajectory_points_ptr(this) + m_remaining_trajectory_points_ptr(this), + m_tracking_error_ptr(this) { AUTO_TRACE(m_servo_name + "::SRTProgramTrackMinorServoImpl()"); } @@ -37,6 +39,8 @@ void SRTProgramTrackMinorServoImpl::initialize() new MSGenericDevIO>(m_total_trajectory_points), true); m_remaining_trajectory_points_ptr = new baci::ROlong((m_component_name + ":remaining_trajectory_points").c_str(), getComponent(), new MSGenericDevIO>(m_remaining_trajectory_points), true); + m_tracking_error_ptr = new baci::ROdoubleSeq((m_component_name + ":tracking_error").c_str(), getComponent(), + new MSGenericDevIO>(m_tracking_error), true); } catch(std::bad_alloc& ba) { @@ -57,7 +61,7 @@ bool SRTProgramTrackMinorServoImpl::status() // The timestamp of the read positions always corresponds to the one we're asking since they both belong to the same STATUS command answer // The tracking timestamp is interpolated instead - std::vector virtual_positions = m_positions_queue.get(last_timestamp).second; + ACS::doubleSeq virtual_positions = m_status.getVirtualPositions(); std::pair> tracking_point = m_tracking_queue.get(last_timestamp); m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); @@ -67,14 +71,20 @@ bool SRTProgramTrackMinorServoImpl::status() // We are past the last point of the trajectory, we concluded it m_tracking.store(Management::MNG_FALSE); m_tracking_queue.clear(); + m_tracking_error = std::vector(m_virtual_axes, 0.0); } else { bool is_tracking = true; - for(size_t i = 0; i < virtual_positions.size(); i++) + std::transform(virtual_positions.begin(), virtual_positions.end(), tracking_point.second.begin(), m_tracking_error.begin(), [](double current_pos, double commanded_pos) { - if(std::fabs(virtual_positions[i] - tracking_point.second[i]) > m_tracking_delta[i]) + return std::fabs(current_pos - commanded_pos); + }); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + if(std::fabs(m_tracking_error[i]) > m_tracking_delta[i]) { is_tracking = false; break; @@ -89,6 +99,7 @@ bool SRTProgramTrackMinorServoImpl::status() // We might get here if m_tracking_queue is empty // So whenever we just got a new setup or if we are past the last point inside the trajectory m_tracking.store(Management::MNG_FALSE); // May be redundant but who cares? + m_tracking_error = std::vector(m_virtual_axes, 0.0); } return status; @@ -157,5 +168,6 @@ GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTProgramTrackMinorServoImpl, m_ GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_trajectory_id_ptr, trajectory_id); GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_total_trajectory_points_ptr, total_trajectory_points); GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_remaining_trajectory_points_ptr, remaining_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTProgramTrackMinorServoImpl, m_tracking_error_ptr, tracking_error); MACI_DLL_SUPPORT_FUNCTIONS(SRTProgramTrackMinorServoImpl) -- GitLab From 1780f7a4b6303e24beb8cebb8b1727902b9089b1 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 17:44:15 +0100 Subject: [PATCH 089/150] Fix #836, fixed HPBW measure in caltoolclient (#837) --- Common/Clients/CaltoolClient/src/_ctc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/Clients/CaltoolClient/src/_ctc.py b/Common/Clients/CaltoolClient/src/_ctc.py index ca41edf75..ba998ee4c 100644 --- a/Common/Clients/CaltoolClient/src/_ctc.py +++ b/Common/Clients/CaltoolClient/src/_ctc.py @@ -288,8 +288,8 @@ class Application(Qt.QDialog,calibrationtool_ui.Ui_CalibrationToolDialog): else: self.scanAxisLabel.setText('ScanAxis - Focus') xaxis_text="Distance (mm)" - hpbw_label_text='HPBW(mm)' - peakOffsetLabel_text='PeakOffset(mm)' + hpbw_label_text='HPBW (arcmin)' + peakOffsetLabel_text='PeakOffset (mm)' self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) self.hpbw_label.setText(hpbw_label_text) -- GitLab From d7310dcffa1cd0a2bf6e7c7c598f9eee70278b2b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 18:04:58 +0100 Subject: [PATCH 090/150] Fixed some label inside caltoolclient --- Common/Clients/CaltoolClient/src/_ctc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/Clients/CaltoolClient/src/_ctc.py b/Common/Clients/CaltoolClient/src/_ctc.py index ba998ee4c..4629daf41 100644 --- a/Common/Clients/CaltoolClient/src/_ctc.py +++ b/Common/Clients/CaltoolClient/src/_ctc.py @@ -283,8 +283,8 @@ class Application(Qt.QDialog,calibrationtool_ui.Ui_CalibrationToolDialog): if 'SUBR' not in str(scanaxis): self.scanAxisLabel.setText('ScanAxis - Pointing') xaxis_text="Direction (Deg)" - hpbw_label_text='HPBW(arcmim)' - peakOffsetLabel_text='PeakOffset(deg)' + hpbw_label_text='HPBW (arcmim)' + peakOffsetLabel_text='PeakOffset (deg)' else: self.scanAxisLabel.setText('ScanAxis - Focus') xaxis_text="Distance (mm)" -- GitLab From aabd3b0050c6c626b74acee23a86f0d3722ed21d Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 13 Mar 2024 18:10:58 +0100 Subject: [PATCH 091/150] Added missing space in label for caltoolclient --- Common/Clients/CaltoolClient/src/calibrationToolClient.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Clients/CaltoolClient/src/calibrationToolClient.ui b/Common/Clients/CaltoolClient/src/calibrationToolClient.ui index 8ef0be0f1..40edee8a0 100644 --- a/Common/Clients/CaltoolClient/src/calibrationToolClient.ui +++ b/Common/Clients/CaltoolClient/src/calibrationToolClient.ui @@ -361,7 +361,7 @@ - PeakOffset(deg) + PeakOffset (deg) -- GitLab From d1d00f36d2acb84c001abeabbbe16d394c88a7ab Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 15 Mar 2024 11:37:01 +0000 Subject: [PATCH 092/150] Updated AntennaBoss component retrieving method --- .../include/SRTMinorServoBossCore.h | 4 +-- .../src/SRTMinorServoBossCore.cpp | 31 +++++++------------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index 470186058..157fe1f23 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include @@ -310,7 +310,7 @@ private: /** * Pointer to the AntennaBoss component. */ - Antenna::AntennaBoss_var m_antennaBoss; + Antenna::AntennaBoss_proxy m_antennaBoss; /** * SRTMinorServoGeneralStatus object containing the status read from the PLC. diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 1b1e57785..7c4052822 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -9,7 +9,7 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_park_thread(nullptr), m_tracking_thread(nullptr), m_scan_thread(nullptr), - m_antennaBoss(Antenna::AntennaBoss::_nil()), + m_antennaBoss("IDL:alma/Antenna/AntennaBoss:1.0", m_component.getContainerServices()), m_status(), m_motion_status(MOTION_STATUS_UNCONFIGURED), m_commanded_setup("Unknown"), @@ -146,6 +146,14 @@ bool SRTMinorServoBossCore::status() m_tracking.store(Management::MNG_FALSE); } } + else if(motion_status == MOTION_STATUS_CONFIGURED) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } return true; } @@ -1162,33 +1170,18 @@ void SRTMinorServoBossCore::closeScan(ACS::Time& close_time) double SRTMinorServoBossCore::getElevation(const ACS::Time& acs_time) { AUTO_TRACE("SRTMinorServoBossCore::getElevation()"); - // TODO automatically try to get a new reference if the AntennaBoss component were to be deallocated - // What happens if we lose the reference? m_antennaBoss will not be _nil but getRawCoordinates will behave unexpectedly - // Retrieve the AntennaBoss component if it was not initialized yet + double azimuth, elevation; + try { - if(CORBA::is_nil(m_antennaBoss)) - { - m_antennaBoss = m_component.getContainerServices()->getComponent("ANTENNA/Boss"); - } - - double azimuth, elevation; m_antennaBoss->getRawCoordinates(acs_time, azimuth, elevation); elevation *= DR2D; - // If the antennaBoss didn't command any movement to the telescope yet we get an elevation of 0° - // We don't want to track an elevation of 0°, especially when DISCOS just started - // There is a high chance the antenna is still at around 90° of elevation - // We "initialize" the tracking to an elevation of 45° return elevation == 0.0 ? 45.0 : elevation; } - catch(maciErrType::CannotGetComponentExImpl& impl) + catch(ComponentErrors::CouldntGetComponentExImpl& ex) { - m_antennaBoss = Antenna::AntennaBoss::_nil(); - _EXCPT(ComponentErrors::CouldntGetComponentExImpl, ex, "SRTMinorServoBossCore::getElevation()"); - ex.setComponentName("ANTENNA/Boss"); ex.addData("Reason", "Cannot get the ANTENNA/Boss component"); - ex.log(LM_DEBUG); throw ex.getComponentErrorsEx(); } } -- GitLab From 30c445f15447d66c3c9a4244e27e633c823aa142 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 18 Mar 2024 09:19:49 +0000 Subject: [PATCH 093/150] Updated SRTActiveSurface setProfile method --- .../SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp index a63fa676f..bfe1c7c69 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp @@ -1381,7 +1381,7 @@ void CSRTActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& newP if(!usdCorrections) { ACS_SHORT_LOG ((LM_INFO, "File %s not found", m_lut.c_str())); - exit(-1); + return; } actuatorsCorrections.length(NPOSITIONS); for (int i = 1; i <= CIRCLES; i++) @@ -1402,7 +1402,6 @@ void CSRTActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& newP usdCounter = 0; for(unsigned int i = 0; i < SECTORS; i++) { - m_sector[i] = false; usdCounter += usdCounters[i]; } -- GitLab From e6601d4ad8edbf7db4f699a3c49583916bb4e6d7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 18 Mar 2024 11:45:10 +0000 Subject: [PATCH 094/150] Updated CCG procedure --- .../CDB/alma/Procedures/StationProcedures/StationProcedures.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 1c63bba48..4d86ea178 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -20,6 +20,7 @@ antennaSetup=CCG + servoSetup=CCG receiversSetup=CCG chooseBackend=TotalPower initialize=CCG -- GitLab From 1c47fe51e46f60f365a73d6cb88a4d061eca7087 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 18 Mar 2024 12:48:22 +0100 Subject: [PATCH 095/150] Fix #847, commented `throw` in ComponentProxy lib (#848) --- Common/Libraries/ComponentProxy/include/ComponentProxy.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/Libraries/ComponentProxy/include/ComponentProxy.h b/Common/Libraries/ComponentProxy/include/ComponentProxy.h index 6a798f295..849d6b30e 100644 --- a/Common/Libraries/ComponentProxy/include/ComponentProxy.h +++ b/Common/Libraries/ComponentProxy/include/ComponentProxy.h @@ -55,10 +55,10 @@ class ComponentProxy ComponentProxy(); ComponentProxy(const char*, maci::ContainerServices*); virtual ~ComponentProxy(); - void loadDefault() throw (ComponentErrors::CouldntGetComponentExImpl); + void loadDefault(); //throw (ComponentErrors::CouldntGetComponentExImpl); void unload(); //ComponentVar getComponentVar(){ return m_component_var;}; - ComponentVar& operator->() throw (ComponentErrors::CouldntGetComponentExImpl); + ComponentVar& operator->(); //throw (ComponentErrors::CouldntGetComponentExImpl); void setError(){ m_error = true;}; void resetError(){ m_error = false;}; bool isError(){ return m_error;}; @@ -103,7 +103,7 @@ ComponentProxy::~ComponentProxy() template void ComponentProxy::loadDefault() -throw (ComponentErrors::CouldntGetComponentExImpl) +//throw (ComponentErrors::CouldntGetComponentExImpl) { if(m_name == "") { @@ -230,7 +230,7 @@ ComponentProxy::setContainerServices( template ComponentVar& ComponentProxy::operator->() -throw (ComponentErrors::CouldntGetComponentExImpl) +//throw (ComponentErrors::CouldntGetComponentExImpl) { loadDefault(); //return m_component_var.out(); -- GitLab From c66bd5f676884810f54b153343e0090b50d073d2 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 21 Mar 2024 11:09:25 +0000 Subject: [PATCH 096/150] Updated Sardara configuration for CLow and CHigh --- Common/Servers/Sardara/include/CommandLine.h | 1 - Common/Servers/Sardara/src/CommandLine.cpp | 28 +++++++--- .../CDB/alma/DataBlock/Sardara/Sardara.xml | 54 ++++++++++++++----- 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/Common/Servers/Sardara/include/CommandLine.h b/Common/Servers/Sardara/include/CommandLine.h index 4b7869e2d..846c9dfa9 100644 --- a/Common/Servers/Sardara/include/CommandLine.h +++ b/Common/Servers/Sardara/include/CommandLine.h @@ -780,7 +780,6 @@ ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::Mal bool m_SC00; bool m_SL00; bool m_SP00; - bool m_SC00S; bool m_SL00S; bool m_SP00S; bool m_SCC00; diff --git a/Common/Servers/Sardara/src/CommandLine.cpp b/Common/Servers/Sardara/src/CommandLine.cpp index e86ac7050..d8dd17334 100644 --- a/Common/Servers/Sardara/src/CommandLine.cpp +++ b/Common/Servers/Sardara/src/CommandLine.cpp @@ -51,7 +51,8 @@ CCommandLine::CCommandLine(ContainerServices *service): CSocket(), // SRT configurations m_SK00=false; m_SK00S=false; m_SK77=false; m_SK77S=false; - m_SC00=false; m_SC00S=false; + m_SCC00=false; m_SCC00S=false; + m_SCH00=false; m_SCH00S=false; m_SL00=false; m_SL00S=false; m_SP00=false; m_SP00S=false; m_stationSRT=false; @@ -780,7 +781,8 @@ void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (C if (m_stationSRT==true) { m_SK77=m_SK77S=false; m_SK00=m_SK00S=false; - m_SC00=m_SC00S=false; + m_SCC00=m_SCC00S=false; + m_SCH00=m_SCH00S=false; m_SL00=m_SL00S=false; m_SP00=m_SP00S=false; m_stokes=false; @@ -797,10 +799,16 @@ void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (C m_SK00=true; m_CK=true; } - if (config.Compare("SC00")==0) { + if (config.Compare("SCC00")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SCC00=true; + m_CK=true; + } + if (config.Compare("SCH00")==0) { m_filter=1250.0; m_inputsNumber=m_sectionsNumber; - m_SC00=true; + m_SCH00=true; m_CK=true; } if (config.Compare("SL00")==0) { @@ -833,11 +841,19 @@ void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (C m_stokes=true; m_CK=true; } - if (config.Compare("SC00S")==0) { + if (config.Compare("SCC00S")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_sectionsNumber=m_sectionsNumber/2; + m_SCC00S=true; + m_stokes=true; + m_CK=true; + } + if (config.Compare("SCH00S")==0) { m_filter=1250.0; m_inputsNumber=m_sectionsNumber; m_sectionsNumber=m_sectionsNumber/2; - m_SC00S=true; + m_SCH00S=true; m_stokes=true; m_CK=true; } diff --git a/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml b/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml index 3209a7141..8f3f05847 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml @@ -12,7 +12,7 @@ GREGORIAN 1 1500.0 - 7.0 + 7.0 0 1 L R 0 0 @@ -27,7 +27,7 @@ GREGORIAN 7 1500.0 - 7.0 + 7.0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 L R L R L R L R L R L R L R 0 0 1 1 2 2 3 3 4 4 5 5 6 6 @@ -36,13 +36,28 @@ - SC00 + SCC00 2 TRUE BWG 1 1500.0 - 9.0 + 9.0 + 0 1 + L R + 0 0 + 0 1 + 1024 + + + + SCH00 + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 0 1 L R 0 0 @@ -57,7 +72,7 @@ PRIMARY 1 1500.0 - 10.0 + 10.0 2 3 L R 0 0 @@ -72,7 +87,7 @@ PRIMARY 1 500.0 - 10.0 + 10.0 0 1 L R 0 0 @@ -87,7 +102,7 @@ GREGORIAN 1 1500.0 - 7.0 + 7.0 0 1 2 3 S S 0 0 @@ -102,7 +117,7 @@ GREGORIAN 7 1500.0 - 7.0 + 7.0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S S S S S S S S S S S S S S 0 0 1 1 2 2 3 3 4 4 5 5 6 6 @@ -111,13 +126,28 @@ - SC00S + SCC00S + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 + 0 1 + S S + 0 0 + 0 1 + 1024 + + + + SCH00S 2 TRUE BWG 1 1500.0 - 9.0 + 9.0 0 1 S S 0 0 @@ -132,7 +162,7 @@ PRIMARY 1 1500.0 - 10.0 + 10.0 2 3 S S 0 0 @@ -147,7 +177,7 @@ PRIMARY 1 500.0 - 10.0 + 10.0 0 1 S S 0 0 -- GitLab From c26c005a20266aa30b3f06b63d2b461a64138351 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 2 Apr 2024 10:32:59 +0200 Subject: [PATCH 097/150] Fix #853, allowed setSection=*,... to configure all sections (#854) * Fix #853, allowed setSection=*,... to configure all sections This fix is for TotalPower and Sardara backends * Fix #853, updated changelog --- CHANGELOG.md | 1 + Common/Servers/Sardara/src/CommandLine.cpp | 468 +++++++++--------- Common/Servers/TotalPower/src/CommandLine.cpp | 159 +++--- 3 files changed, 332 insertions(+), 296 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12d48bf9..df21abc5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -108,3 +108,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/ ## Changed issue #689 - The dataset provided by weather station has been enlarged by the wind direction. The correctponding RAL 'wx' command will noe provided wind direction readout, as well issue #621 - The maximum number of chars of the schedule file name is now 37 (extension included). This is done for fits file and archive issue with the lenght of the schedule name. + issue #853 - The setSection command can now accept a wildcard (*) as section identifier. This will allow to configure all backend sections with a single command diff --git a/Common/Servers/Sardara/src/CommandLine.cpp b/Common/Servers/Sardara/src/CommandLine.cpp index d8dd17334..050946a6a 100644 --- a/Common/Servers/Sardara/src/CommandLine.cpp +++ b/Common/Servers/Sardara/src/CommandLine.cpp @@ -353,241 +353,259 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const BackendsErrors::BackendBusyExImpl) { AUTO_TRACE("CCommandLine::setConfiguration()"); - double newBW,newSR,newFreq; - long newBins, newFeed, newPol; + std::vector newBW(m_sectionsNumber); + std::vector newSR(m_sectionsNumber); + std::vector newFreq(m_sectionsNumber); + std::vector newBins(m_sectionsNumber); + std::vector newFeed(m_sectionsNumber); + std::vector newPol(m_sectionsNumber); double filter; int j; + size_t minSection, maxSection; - if (m_SardaraInitialized == true) { - /* if (getIsBusy()) { + if (m_SardaraInitialized == true) { + /* if (getIsBusy()) { _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setConfiguration()"); throw impl; - }*/ - if (inputId>=0) { //check the section id is in valid ranges - //if (inputId>=m_sectionsNumber) { - if (inputId>m_sectionsNumber) { - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setReason("the section identifier is out of range"); - throw impl; - } - } - else { - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setReason("the section identifier is out of range"); - throw impl; - } + }*/ + if (inputId>=0) { //check the section id is in valid ranges + //if (inputId>=m_sectionsNumber) { + if (inputId>m_sectionsNumber) { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } + minSection=inputId; + maxSection=minSection+1; + } + else if (inputId==-1) + { + minSection=0; + maxSection=m_sectionsNumber; + } + else { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } - if (bw>=0) { // the user ask for a new value - if (bwMAX_BAND_WIDTH) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("bandWidth"); - impl.setValueLimit(MAX_BAND_WIDTH); - throw impl; - } - newBW=bw; - } - else { // else keep the present value - newBW=m_bandWidth[inputId]; - } + for(size_t i=minSection; i=0) { // the user ask for a new value + if (bwMAX_BAND_WIDTH) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bandWidth"); + impl.setValueLimit(MAX_BAND_WIDTH); + throw impl; + } + newBW[i]=bw; + } + else { // else keep the present value + newBW[i]=m_bandWidth[i]; + } - if (sr>=0) {// the user ask for a new value - if ((sr > MAX_SAMPLE_RATE) || (sr != 2*newBW)) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("sampleRate"); - impl.setValueLimit(MAX_SAMPLE_RATE); - throw impl; - } - newSR=sr; - } - else { - newSR=m_sampleRate[inputId]; - } + if (sr>=0) {// the user ask for a new value + if ((sr > MAX_SAMPLE_RATE) || (sr != 2*newBW[i])) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("sampleRate"); + impl.setValueLimit(MAX_SAMPLE_RATE); + throw impl; + } + newSR[i]=sr; + } + else { + newSR[i]=m_sampleRate[i]; + } - if (freq >= 0) { // the user ask for a new value - if (freq >= MIN_FREQUENCY && freq <= MAX_FREQUENCY) { - newFreq = freq; - } - else { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("freq"); - throw impl; - } - } - else - newFreq = m_frequency[inputId]; + if (freq >= 0) { // the user ask for a new value + if (freq >= MIN_FREQUENCY && freq <= MAX_FREQUENCY) { + newFreq[i] = freq; + } + else { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("freq"); + throw impl; + } + } + else + newFreq[i] = m_frequency[i]; + + if (feed >= 0) { // the user ask for a new value + if (feed != 0) { // BUT for the moment is it possible to use ONLY feed 0 + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("feed"); + throw impl; + } + newFeed[i] = feed; + } + else + newFeed[i] = m_feedNumber[i]; - if (feed >= 0) { // the user ask for a new value - if (feed != 0) { // BUT for the moment is it possible to use ONLY feed 0 - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("feed"); - throw impl; - } - newFeed = feed; - } - else - newFeed = m_feedNumber[inputId]; - - if (pol >= 0) { // the user ask for a new value - if ((pol == 0) || (pol == 1)) { // LCP or RCP - newPol = pol; - } - if (pol == 2) { // FULL STOKES - newPol = pol; - } - if (pol >= 3) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("pol"); - throw impl; - } - newPol = pol; - } - else - newPol = m_polarization[inputId]; - - if (bins>=0) { // the user ask for a new value - if (bins != MIN_BINS && bins != MAX_BINS) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("bins"); - /*if (bins != MIN_BINS) - impl.setValue(MIN_BINS); - if (bins != MAX_BINS) - impl.setValue(MAX_BINS);*/ - throw impl; - } - newBins=bins; - } - else - newBins = m_bins[inputId]; - - if (m_stationSRT == true) { - try { - Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); - Message reply = sendBackendCommand(request); - if (reply.is_success_reply()) { - for (j=0;jsetSection(j,-1, filter, -1, -1, -1, -1); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); - } - } - /*if ((m_SL00==true || m_SL00S==true) && m_stationSRT == true) { - try { - if (newBW==128.00) { - m_ifDistributor->setup("BW-NARROW"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-NARROW")); - } - if (newBW==420.00) { - m_ifDistributor->setup("BW-MEDIUM"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-MEDIUM")); - } - if (newBW==500.00) { - m_ifDistributor->setup("BW-WIDE"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-WIDE")); - } - if (newBW==512.00) { - m_ifDistributor->setup("BW-UNFILTERED"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-UNFILTERED")); - } - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); - impl.log(LM_ERROR); - } - }*/ - } - } - catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SARDARA_SET_SECTION ERROR")); - } - } + if (pol >= 0) { // the user ask for a new value + if ((pol == 0) || (pol == 1)) { // LCP or RCP + newPol[i] = pol; + } + if (pol == 2) { // FULL STOKES + newPol[i] = pol; + } + if (pol >= 3) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("pol"); + throw impl; + } + newPol[i] = pol; + } + else + newPol[i] = m_polarization[i]; + + if (bins>=0) { // the user ask for a new value + if (bins != MIN_BINS && bins != MAX_BINS) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bins"); + /*if (bins != MIN_BINS) + impl.setValue(MIN_BINS); + if (bins != MAX_BINS) + impl.setValue(MAX_BINS);*/ + throw impl; + } + newBins[i]=bins; + } + else + newBins[i] = m_bins[i]; + } - if (m_stationMEDNT == true) { - try { - Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); - Message reply = sendBackendCommand(request); - if (reply.is_success_reply()) { - for (int j=0;jsetSection(j,-1, filter, -1, -1, -1, -1); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); - } - } - } - } - } - catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SARDARA_SET_SECTION ERROR")); - } - } - } + for(size_t i=minSection; isetSection(j,-1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",i,filter)); + } + } + /*if ((m_SL00==true || m_SL00S==true) && m_stationSRT == true) { + try { + if (newBW[i]==128.00) { + m_ifDistributor->setup("BW-NARROW"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-NARROW")); + } + if (newBW[i]==420.00) { + m_ifDistributor->setup("BW-MEDIUM"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-MEDIUM")); + } + if (newBW[i]==500.00) { + m_ifDistributor->setup("BW-WIDE"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-WIDE")); + } + if (newBW[i]==512.00) { + m_ifDistributor->setup("BW-UNFILTERED"); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-UNFILTERED")); + } + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); + impl.log(LM_ERROR); + } + }*/ + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SARDARA_SET_SECTION ERROR")); + } + } + + if (m_stationMEDNT == true) { + try { + Message request = Command::setSection(i, newFreq[i], newBW[i], newFeed[i], newPol[i], newSR[i], newBins[i]); + Message reply = sendBackendCommand(request); + if (reply.is_success_reply()) { + for (int j=0;jsetSection(j,-1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",i,filter)); + } + } + } + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SARDARA_SET_SECTION ERROR")); + } + } + } + } } void CCommandLine::getZeroTPI(DWORD *tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, diff --git a/Common/Servers/TotalPower/src/CommandLine.cpp b/Common/Servers/TotalPower/src/CommandLine.cpp index bfee25488..7ec0519e9 100644 --- a/Common/Servers/TotalPower/src/CommandLine.cpp +++ b/Common/Servers/TotalPower/src/CommandLine.cpp @@ -488,7 +488,10 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const WORD len; char sBuff[SENDBUFFERSIZE]; char rBuff[RECBUFFERSIZE]; - double newBW,newAtt,newSR; + std::vector newBW(m_sectionsNumber); + std::vector newAtt(m_sectionsNumber); + std::vector newSR(m_sectionsNumber); + size_t minSection, maxSection; if (getIsBusy()) { _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setConfiguration()"); throw impl; @@ -499,94 +502,108 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const impl.setReason("the section identifier is out of range"); throw impl; } + minSection=inputId; + maxSection=minSection+1; + } + else if (inputId==-1) + { + minSection=0; + maxSection=m_sectionsNumber; } else { _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); impl.setReason("the section identifier is out of range"); throw impl; } - if (bw>=0) { // the user ask for a new value - if (bwMAX_BAND_WIDTH) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("bandWidth"); - impl.setValueLimit(MAX_BAND_WIDTH); - throw impl; + + for(size_t i=minSection; i=0) { // the user ask for a new value + if (bwMAX_BAND_WIDTH) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bandWidth"); + impl.setValueLimit(MAX_BAND_WIDTH); + throw impl; + } + newBW[i]=bw; } - newBW=bw; - } - else { // else keep the present value - newBW=m_bandWidth[inputId]; - } - if (sr>=0) {// the user ask for a new value - if (sr>MAX_SAMPLE_RATE) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("sampleRate"); - impl.setValueLimit(MAX_SAMPLE_RATE); - throw impl; + else { // else keep the present value + newBW[i]=m_bandWidth[i]; } - newSR=sr; - } - else { - newSR=m_sampleRate[inputId]; + if (sr>=0) {// the user ask for a new value + if (sr>MAX_SAMPLE_RATE) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("sampleRate"); + impl.setValueLimit(MAX_SAMPLE_RATE); + throw impl; + } + newSR[i]=sr; + } + else { + newSR[i]=m_sampleRate[i]; + } + newAtt[i]=m_attenuation[i]; } - newAtt=m_attenuation[inputId]; if (!checkConnection()) { _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setConfiguration()"); } - len=CProtocol::setConfiguration(sBuff,inputId,m_input[inputId],newAtt,newBW,m_boards); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - if (!CProtocol::isAck(rBuff)) { - _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::setConfiguration()"); - } - m_bandWidth[inputId]=newBW; - for (int j=0;j=0) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_FREQUENCY")); - } - if (feed>=0) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_FEED")); - } - if (bins>=0) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_BINS_NUMBER")); + for(size_t i=minSection; i=0) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_POLARIZATION")); + if (res>0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::setConfiguration()"); + } + m_bandWidth[i]=newBW[i]; + for (int j=0;j=0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_FREQUENCY")); + } + if (feed>=0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_FEED")); + } + if (bins>=0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_BINS_NUMBER")); + } + if (pol>=0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_WARNING,"CANNOT_CHANGE_POLARIZATION")); + } + IRA::CString temp; + if (m_polarization[i]==Backends::BKND_LCP) { //FULL STOKE not possible.... + temp="LCP"; + } + else { + temp="RCP"; + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"SECTION_CONFIGURED %ld,FREQ=%lf,BW=%lf,FEED=%ld,POL=%s,SR=%lf,BINS=%ld",i,m_frequency[i],newBW[i],m_feedNumber[i], + (const char *)temp,newSR[i],m_bins[i])); } - IRA::CString temp; - if (m_polarization[inputId]==Backends::BKND_LCP) { //FULL STOKE not possible.... - temp="LCP"; + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::setConfiguration()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::setConfiguration()"); } else { - temp="RCP"; + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setConfiguration()"); } - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"SECTION_CONFIGURED %ld,FREQ=%lf,BW=%lf,FEED=%ld,POL=%s,SR=%lf,BINS=%ld",inputId,m_frequency[inputId],newBW,m_feedNumber[inputId], - (const char *)temp,newSR,m_bins[inputId])); - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::setConfiguration()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::setConfiguration()"); } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setConfiguration()"); - } } void CCommandLine::getZeroTPI(DWORD *tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, -- GitLab From 00d690fe0985b3f2ef45d2d208dc665aa43ce751 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 4 Apr 2024 08:12:00 +0000 Subject: [PATCH 098/150] Fix #839, set a longer timeout for SRT minor servos setup and park --- SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h | 4 ++-- SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h index c2af90348..031e058a8 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -11,8 +11,8 @@ #include #include "SRTMinorServoBossCore.h" -// TODO: fine-tune this with the real hardware. The correct procedure can easily exceed this timeout, it should be increased accordingly. -#define PARK_TIMEOUT 60 +// Same timeout as the one defined for the SETUP procedure +#define PARK_TIMEOUT 120 class SRTMinorServoBossCore; diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h index 747c458a4..2a1f4297f 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -11,8 +11,8 @@ #include #include "SRTMinorServoBossCore.h" -// TODO: fine-tune this with the real hardware. The correct procedure can easily exceed this timeout, it should be increased accordingly. -#define SETUP_TIMEOUT 60 +// GFR from -160 to 160 takes approximately 110 seconds +#define SETUP_TIMEOUT 120 class SRTMinorServoBossCore; -- GitLab From 3272ed2f9e495d7e0a1323019f6768e355c31ace Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 9 Apr 2024 12:30:53 +0200 Subject: [PATCH 099/150] Updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f12d48bf9..494cfef17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/ This command must be placed in the .bck file in order to work properly. issue #619 - Active surface components are now capable of changing look-up tables on the fly via the `asSetLUT` command issue #806 Added support for the C-band receiver at the SRT + project #2 - Completed integration of new SRT Minor Servos ## Fixed ## Changed -- GitLab From 7e45a034668538bf0cfde31a040f93a8eda4c183 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 9 Apr 2024 12:31:53 +0200 Subject: [PATCH 100/150] SRT new Minor Servos (#852) * Fix #672, fix #637, some improvements for the SRTMinorServoCommandLibrary (#674) Fix #672, wrote all the commands in capital letters Fix #673, added the OFFSET command to the library Also, fixed changed the start_time parameter to be written as an integer * Fix #646, wrote a Python wrapper for the `SRTMinorServoCommandLibrary` (#650) * Fix #646, wrote a Python wrapper for the `SRTMinorServoCommandLibrary` * Fix #646, Added a python module that uses the wrapper library It has been commented in order to replicate the behavior in any future python wrapped C++ library * Fix #646, fixed a few small things regarding some include and the Makefile * Fix #646, added documentation about the Python wrapper Also, fixed some small inconsistencies with the new C++ implementation * Issue #637, removed an unneeded include statement * Fix #684, fixed tests for the SRTMinorServoCommandLibrary and its python wrapper (#685) * Fix #771, first implementation of parseAnswer and related tests (#772) * Issue #771, first implementation of parseAnswer and related tests Right now the function is not robust, it should check for errors in the answer format * Fix #771, complete implementation of `parseAnswer` function Tests were updated as well * Moved old SRT Minor Servos to another directory * Fix #782, wrote a singleton socket class for SRT new minor servos (#783) * Fix #782, wrote a singleton socket class for SRT new minor servos This is the first implementation, connection checks for the socket should be added in order to avoid some disconnection errors * Fix #782, improved SRT MS singleton socket and tests The socket is now set to non-blocking, therefore some checks were added in order to accomodate to this change. Fixed a wrong behavior regarding the singleton design pattern. Previously it was possible to call the getInstance(ip_address, port) method multiple times with multiple addresses, but only the first instance was returned, meaning that only the first instance was actually opened to the correct IP address and port. Now if the user tries to open a second socket on a different IP address and port an exception is raised. * Updated the SRTMinorServoCommandLibrary * Added a test for SRP Program Track * Some minor fixes for the SRTMinorServoCommandLibrary * Updated SRPProgramTrackTest * Improved SRP tests * Updated SRPProgramTrackTest * Updated SRPProgramTrackTest Added a script to plot trajectories * Added .gitignore in order to ignore test folders * Updated SRPProgramTrackTest Added a separate trajectories test * Updated SRPProgramTrackTest.cpp * Fix SRTMinorServoCommandLibrary programTrack start_time issue * Minor fixes for SRTMinorServoCommandLibrary * Updated SRP and Derotator programTrack tests * Small update for plotting scripts * Updated SRPProgramTrackTest.cpp * First skeleton of combined SRP and Derotator tests * Added sine wave tests * Added combined test and plotting script * Included rotations in sine wave tests * Updated new minor servos tests * Minor Servos update * Some updates * Updated CDB and schemas * Updated SRTMinorServoLibraries * Updated SRTMinorServoSocket and tests * Commented new interfaces * Updated CDB schemas and configurations * Updated SRTMinorServo interfaces * Updated SRT MinorServo Libraries and tests * Commented new SRT minor servo files. Commented pretty much every file. I will perform some more tests with the simulators before tweaking the system to be used with the current Leonardo minor servo system status. * Fixed a couple bugs in SRTMinorServoBoss component * Updated procedures in order to use new minor servos * Fixes STOW command for the gregorian cover * Minor improvement on the MS motion status DevIO * Fix #834, avoided Leonardo Minor Servo SETUP command * Updated CDBs, getting ready for production * Updates for SRTMinorServos * Updated SRTMinorServo setup and park procedures * Updated SRTMinorServoLibrary * Updates for the SRTMinorServos * First working implementation with the actual hardware Libraries and components were slightly reworked and tweaked in order to work correctly with the current hardware status. The gregorian cover movement was took out of the setup and park procedures, since it is currently locked in place and won't move. We will add it again later. All the currently unavailable minor servos components were took out from the Boss control by commenting them. They can still be accessed via objexp and check their status. The GFR was took out as well since it keeps blocking during movements. For now it has to be moved manually, it can be done via objexp as well, but resetting the errors from VBrain. I rewrote the SRPProgramTrackTest.cpp in order to test the behavior of the SRP with new libraries. The test acts just like before. Other tests need to be reworked, keeping the same logic behind. Further investigation must be put into the scanning procedure, in particular when the recorder retrieves the coordinates. * Updated logging for SRTMinorServos * Updated SRTMinorServo socket disconnect logging * Fixed small bug in servos axes naming, improved logging * Removed most of get_sync calls * Fixed a couple more things * Refactored SRTMinorServos * Updated SRTMinorServoAnswerMap socket handling * Added some log for the SRTMinorServoAnswerMap * Updated branch * Updated AntennaBoss component retrieving method * Updated CCG procedure * Fix #839, set a longer timeout for SRT minor servos setup and park * Updated CHANGELOG.md --- CHANGELOG.md | 1 + .../include/MinorServoBossTextClient.h | 4 +- .../MinorServoBossTextClient/src/Makefile | 3 + .../src/MinorServoBossTextClient.cpp | 2 +- .../MACI/Components/MINORSERVO/Boss/Boss.xml | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 7 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 5 +- .../MACI/Components/MINORSERVO/PFP/PFP.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/SRP.xml | 8 +- .../MinorServoBossContainer.xml | 31 - .../GFR/LookupTables/LookupTables.xml | 32 + .../MinorServo/GFR/Properties/Properties.xml | 24 + .../M3R/LookupTables/LookupTables.xml | 18 + .../MinorServo/M3R/Properties/Properties.xml | 24 + .../PFP/LookupTables/LookupTables.xml | 33 + .../MinorServo/PFP/Properties/Properties.xml | 36 + .../SRP/LookupTables/LookupTables.xml | 125 ++ .../MinorServo/SRP/Properties/Properties.xml | 47 + .../DataBlock/PointingModel/PointingModel.xml | 46 +- .../CalibrationTool/CalibrationTool.xml | 2 +- .../alma/MANAGEMENT/FitsZilla/FitsZilla.xml | 2 +- SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- SRT/CDB/alma/MANAGEMENT/Point/Point.xml | 2 +- SRT/CDB/alma/MINORSERVO/Boss/Boss.xml | 206 +-- SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 373 +---- SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 374 +---- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 381 +---- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 382 +---- SRT/CDB/alma/MINORSERVO/Socket/Socket.xml | 12 + .../StationProcedures/StationProcedures.xml | 38 +- .../MACI/Components/MINORSERVO/Boss/Boss.xml | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 7 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 5 +- .../MACI/Components/MINORSERVO/PFP/PFP.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/SRP.xml | 8 +- .../MinorServoBossContainer.xml | 31 - .../GFR/LookupTables/LookupTables.xml | 32 + .../MinorServo/GFR/Properties/Properties.xml | 24 + .../M3R/LookupTables/LookupTables.xml | 18 + .../MinorServo/M3R/Properties/Properties.xml | 24 + .../PFP/LookupTables/LookupTables.xml | 33 + .../MinorServo/PFP/Properties/Properties.xml | 36 + .../SRP/LookupTables/LookupTables.xml | 125 ++ .../MinorServo/SRP/Properties/Properties.xml | 47 + .../DataBlock/PointingModel/PointingModel.xml | 46 +- .../CalibrationTool/CalibrationTool.xml | 2 +- .../alma/MANAGEMENT/FitsZilla/FitsZilla.xml | 2 +- .../CDB/alma/MANAGEMENT/Gavino/Gavino.xml | 2 +- .../CDB/alma/MANAGEMENT/Point/Point.xml | 2 +- .../CDB/alma/MINORSERVO/Boss/Boss.xml | 206 +-- .../CDB/alma/MINORSERVO/GFR/GFR.xml | 373 +---- .../CDB/alma/MINORSERVO/M3R/M3R.xml | 374 +---- .../CDB/alma/MINORSERVO/PFP/PFP.xml | 381 +---- .../CDB/alma/MINORSERVO/SRP/SRP.xml | 382 +---- .../CDB/alma/MINORSERVO/Socket/Socket.xml | 13 + .../StationProcedures/StationProcedures.xml | 1 + .../SRTMinorServoInterface/idl/.gitignore | 1 + .../idl/SRTMinorServo.idl | 283 ++++ .../idl/SRTMinorServoBoss.idl | 86 ++ .../idl/SRTMinorServoCommon.midl | 102 ++ .../SRTMinorServoInterface/src/Makefile | 64 + .../SRTMinorServoInterface/test/Makefile | 92 ++ .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/commands}/__init__.py | 0 .../functional/commands/test_servoSetup.py | 62 + .../commands/test_setServoASConfiguration.py | 44 + .../test_setServoElevationTracking.py | 46 + .../commands/test_setServoOffset.py | 38 + .../test/functional/test_clearUserOffset.py | 58 + .../test/functional/test_getAxesInfo.py | 92 ++ .../test/functional/test_getAxesPosition.py | 87 ++ .../functional/test_getCentralScanPosition.py | 58 + .../test/functional/test_position.py | 126 ++ .../test/functional/test_scan.py | 430 ++++++ .../functional/test_setASConfiguration.py | 56 + .../functional/test_setElevationTracking.py | 56 + .../test/functional/test_systemOffset.py | 95 ++ .../test/functional/test_userOffset.py | 96 ++ .../test/pyunit/__init__.py | 0 .../SRTMinorServoInterface}/test/unittest.cpp | 0 .../include/PySRTMinorServoCommandLibrary.h | 130 ++ .../include/SRTMinorServoCommandLibrary.h | 123 +- .../include/SRTMinorServoContainers.h | 894 +++++++++++ .../include/SRTMinorServoSocket.h | 203 +++ .../include/SRTMinorServoTestingSocket.h | 25 + .../include/SRTMinorServoUtils.h | 144 ++ .../SRTMinorServoLibrary/src/Makefile | 29 +- .../src/PySRTMinorServoCommandLibrary.cpp | 69 + .../src/SRTMinorServoCommandLibrary.cpp | 142 +- .../src/SRTMinorServoCommandLibrary/README.md | 19 + .../SRTMinorServoCommandLibrary/__init__.py | 17 + .../src/SRTMinorServoSocket.cpp | 237 +++ .../SRTMinorServoLibrary/tests/.discos | 5 + .../SRTMinorServoLibrary/tests/Makefile | 97 ++ .../tests/SRTMinorServoCommandLibraryTest.cpp | 108 ++ .../tests/SRTMinorServoSocketTest.cpp | 214 +++ .../tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../tests/pyunit/__init__.py | 102 ++ .../SRTScripts/app-defaults/discosStartup.xml | 11 +- .../app-defaults/simulationStartup.xml | 9 - .../config/CDB/schemas/SRTMinorServo.xsd | 88 ++ .../config/CDB/schemas/SRTMinorServoBoss.xsd | 83 ++ .../CDB/schemas/SRTMinorServoLookupTable.xsd | 52 + .../CDB/schemas/SRTMinorServoProperties.xsd | 35 + .../SRTMinorServoSocketConfiguration.xsd | 32 + SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 317 ++++ .../include/SRTMinorServoBossCore.h | 437 ++++++ .../include/SRTMinorServoBossImpl.h | 548 +++++++ .../include/SRTMinorServoCommon.h | 38 + .../SRTMinorServo/include/SRTMinorServoImpl.h | 745 ++++++++++ .../include/SRTMinorServoParkThread.h | 78 + .../include/SRTMinorServoScanThread.h | 96 ++ .../include/SRTMinorServoSetupThread.h | 87 ++ .../include/SRTMinorServoStatusThread.h | 87 ++ .../include/SRTMinorServoTrackingThread.h | 85 ++ .../SRTMinorServo/include/SuppressWarnings.h | 13 + SRT/Servers/SRTMinorServo/src/Makefile | 66 +- .../src/SRTBaseMinorServoImpl.cpp | 811 ++++++++++ .../src/SRTGenericMinorServoImpl.cpp | 13 + .../src/SRTMinorServoBossCore.cpp | 1316 +++++++++++++++++ .../src/SRTMinorServoBossImpl.cpp | 422 ++++++ .../src/SRTMinorServoParkThread.cpp | 93 ++ .../src/SRTMinorServoScanThread.cpp | 237 +++ .../src/SRTMinorServoSetupThread.cpp | 255 ++++ .../src/SRTMinorServoStatusThread.cpp | 112 ++ .../src/SRTMinorServoTrackingThread.cpp | 142 ++ .../src/SRTProgramTrackMinorServoImpl.cpp | 173 +++ SRT/Servers/SRTMinorServo/src/_cover.py | 42 + SRT/Servers/SRTMinorServo/test/.gitignore | 3 + .../test/CombinedProgramTrackTest.cpp | 532 +++++++ .../test/DerotatorProgramTrackTest.cpp | 495 +++++++ SRT/Servers/SRTMinorServo/test/Makefile | 38 +- .../SRTMinorServo/test/ReadStatusOnlyTest.cpp | 216 +++ .../test/SRPProgramTrackTest.cpp | 632 ++++++++ .../SRTMinorServo/test/TESTS/plotCombined.py | 112 ++ .../test/TESTS/plotDerotatorTrajectory.py | 47 + .../test/TESTS/plotSRPTrajectories.py | 134 ++ .../config/CDB/schemas/MinorServo.xsd | 0 .../doc/derotator/derotator.pdf | Bin .../doc/derotator/icd.pdf | Bin .../doc/derotator/icd_bus.pdf | Bin .../doc/derotator/sensor.pdf | Bin .../doc/minor_servo/gimbal.pdf | Bin .../doc/minor_servo/minor_servo_system.pdf | Bin .../include/DerotatorImpl.h | 0 .../include/DevIOASConfiguration.h | 0 .../include/DevIOActualSetup.h | 0 .../include/DevIOElevationTrack.h | 0 .../include/DevIOMotionInfo.h | 0 .../include/DevIOParking.h | 0 .../include/DevIOReady.h | 0 .../include/DevIOScanActive.h | 0 .../include/DevIOScanning.h | 0 .../include/DevIOStarting.h | 0 .../include/DevIOTracking.h | 0 .../include/MSBossConfiguration.h | 0 .../include/MSBossPublisher.h | 0 .../include/MSParameters.h | 0 .../include/MinorServoBossImpl.h | 0 .../include/ParkThread.h | 0 .../include/PdoubleSeqDevIO.h | 0 .../include/RequestDispatcher.h | 0 .../include/ScanThread.h | 0 .../include/SetupThread.h | 0 .../include/SocketListener.h | 0 .../include/SubsystemStatusDevIO.h | 0 .../include/SubsystemVStatusDevIO.h | 0 .../include/TrackingThread.h | 0 .../include/WPServoImpl.h | 0 .../include/WPServoSocket.h | 0 .../include/WPServoTalker.h | 0 .../include/WPStatusDevIO.h | 0 .../include/WPStatusUpdater.h | 0 .../include/WPUtils.h | 0 .../include/libCom.h | 0 .../include/macros.def | 0 .../include/utils.h | 0 .../src/MSBossConfiguration.cpp | 0 .../src/MSBossPublisher.cpp | 0 SRT/Servers/SRTOldMinorServo/src/Makefile | 75 + .../src/MinorServoBossImpl.cpp | 0 .../src/ParkThread.cpp | 0 .../src/RequestDispatcher.cpp | 0 .../src/ScanThread.cpp | 0 .../src/SetupThread.cpp | 0 .../src/SocketListener.cpp | 0 .../src/TrackingThread.cpp | 0 .../src/WPServoImpl.cpp | 0 .../src/WPServoSocket.cpp | 0 .../src/WPServoTalker.cpp | 0 .../src/WPStatusUpdater.cpp | 0 .../src/WPUtils.cpp | 0 .../src/libCom.cpp | 0 .../src/utils.cpp | 0 SRT/Servers/SRTOldMinorServo/test/Makefile | 90 ++ .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/test_container_crash.py | 0 .../test/functional/test_failure.py | 0 .../test/functional/test_setup.py | 0 .../test_setup_after_manual_movement.py | 0 .../test/no_auto/Makefile | 0 .../test/no_auto/commissioning/05082013.rst | 0 .../SRP_linear/plot_positions.py | 0 .../SRP_linear/test_SRP_linear_movement.py | 0 .../test/no_auto/commissioning/TODO.rst | 0 .../test/no_auto/commissioning/clean_test.py | 0 .../no_auto/commissioning/command_input.py | 0 .../getAxesPosition/test_getAxesPosition.py | 0 .../test_getAxesPositionSpeed.py | 0 .../getFromHistory/test_getFromHistory.py | 0 .../offsets/testSRP_after_startFocusScan.py | 0 .../offsets/testSRP_before_startFocusScan.py | 0 .../test/no_auto/commissioning/parameters.py | 0 .../no_auto/commissioning/plot_positions.py | 0 .../property/property_sampler.py | 0 .../sampling_time/test_getstatus_speed.py | 0 .../scan/testSRP_checkFocusScan.py | 0 .../scan/testSRP_checkMinPositioninTime.py | 0 .../scan/testSRP_multiple_startFocusScan.py | 0 .../scan/testSRP_pointingDuringScan.py | 0 .../scan/testSRP_startFocusScan.py | 0 .../scan/testSRP_startFocusScanNow.py | 0 .../commissioning/scan/testSRP_stopScan.py | 0 .../timed_pos/timed_positions1SRP.py | 0 .../timed_pos/timed_positions2PFP.py | 0 .../timed_pos/timed_positions2SRP.py | 0 .../tracking/test_SRP_elevation_tracking.py | 0 .../performances/get_axes_positions.py | 0 .../test/no_auto/real2virtual.c | 0 .../test/no_auto/send_command.py | 0 .../test/no_auto/simple_talk.py | 0 .../no_auto/srp_refsystems/hexlib/Makefile | 0 .../no_auto/srp_refsystems/hexlib/hexdata.txt | 0 .../no_auto/srp_refsystems/hexlib/hexlib.c | 0 .../no_auto/srp_refsystems/hexlib/hexlib.h | 0 .../srp_refsystems/hexlib/real2virtual.c | 0 .../srp_refsystems/hexlib/virtual2real.c | 0 .../no_auto/srp_refsystems/srp_refsystems.pyw | 0 .../test/no_auto/virtual2real.c | 0 .../test/no_auto/wpservo_test.py | 0 .../SRTOldMinorServo/test/pyunit/__init__.py | 0 .../SRTOldMinorServo/test/unittest.cpp | 6 + SystemMake/Makefile | 2 +- 246 files changed, 14385 insertions(+), 3470 deletions(-) delete mode 100644 SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/MINORSERVO/Socket/Socket.xml delete mode 100644 SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl create mode 100644 SRT/Interfaces/SRTMinorServoInterface/src/Makefile create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/Makefile rename SRT/{Servers/SRTMinorServo => Interfaces/SRTMinorServoInterface}/test/external/__init__.py (100%) rename SRT/{Servers/SRTMinorServo => Interfaces/SRTMinorServoInterface}/test/functional/__init__.py (100%) rename SRT/{Servers/SRTMinorServo/test/pyunit => Interfaces/SRTMinorServoInterface/test/functional/commands}/__init__.py (100%) create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py create mode 100644 SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py rename SRT/{Servers/SRTMinorServo => Interfaces/SRTMinorServoInterface}/test/unittest.cpp (100%) create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py create mode 100644 SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/.discos create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/Makefile create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py create mode 100644 SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd create mode 100644 SRT/Servers/SRTMinorServo/include/MSDevIOs.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h create mode 100644 SRT/Servers/SRTMinorServo/include/SuppressWarnings.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/_cover.py create mode 100644 SRT/Servers/SRTMinorServo/test/.gitignore create mode 100644 SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp create mode 100755 SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py create mode 100755 SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py create mode 100755 SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/config/CDB/schemas/MinorServo.xsd (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/derotator.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/icd.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/icd_bus.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/derotator/sensor.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/minor_servo/gimbal.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/doc/minor_servo/minor_servo_system.pdf (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DerotatorImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOASConfiguration.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOActualSetup.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOElevationTrack.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOMotionInfo.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOParking.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOReady.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOScanActive.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOScanning.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOStarting.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/DevIOTracking.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSBossConfiguration.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSBossPublisher.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MSParameters.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/MinorServoBossImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/ParkThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/PdoubleSeqDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/RequestDispatcher.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/ScanThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SetupThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SocketListener.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SubsystemStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/SubsystemVStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/TrackingThread.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoImpl.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoSocket.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPServoTalker.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPStatusDevIO.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPStatusUpdater.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/WPUtils.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/libCom.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/macros.def (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/include/utils.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MSBossConfiguration.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MSBossPublisher.cpp (100%) create mode 100644 SRT/Servers/SRTOldMinorServo/src/Makefile rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/MinorServoBossImpl.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/ParkThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/RequestDispatcher.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/ScanThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/SetupThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/SocketListener.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/TrackingThread.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoImpl.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoSocket.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPServoTalker.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPStatusUpdater.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/WPUtils.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/libCom.cpp (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/src/utils.cpp (100%) create mode 100644 SRT/Servers/SRTOldMinorServo/test/Makefile create mode 100644 SRT/Servers/SRTOldMinorServo/test/external/__init__.py create mode 100644 SRT/Servers/SRTOldMinorServo/test/functional/__init__.py rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_container_crash.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_failure.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_setup.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/functional/test_setup_after_manual_movement.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/05082013.rst (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/SRP_linear/plot_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/TODO.rst (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/clean_test.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/command_input.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/parameters.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/plot_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/property/property_sampler.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_startFocusScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/scan/testSRP_stopScan.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/performances/get_axes_positions.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/real2virtual.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/send_command.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/simple_talk.py (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/Makefile (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexdata.txt (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexlib.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/hexlib.h (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/real2virtual.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/hexlib/virtual2real.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/srp_refsystems/srp_refsystems.pyw (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/virtual2real.c (100%) rename SRT/Servers/{SRTMinorServo => SRTOldMinorServo}/test/no_auto/wpservo_test.py (100%) create mode 100644 SRT/Servers/SRTOldMinorServo/test/pyunit/__init__.py create mode 100644 SRT/Servers/SRTOldMinorServo/test/unittest.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index df21abc5a..9fd35d937 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,6 +103,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/ This command must be placed in the .bck file in order to work properly. issue #619 - Active surface components are now capable of changing look-up tables on the fly via the `asSetLUT` command issue #806 Added support for the C-band receiver at the SRT + project #2 - Completed integration of new SRT Minor Servos ## Fixed ## Changed diff --git a/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h index 97cdc5198..3656b750c 100644 --- a/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h +++ b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h @@ -78,10 +78,12 @@ /* define name and component interface */ /* ********************************** */ #define COMPONENT_NAME "MINORSERVO/Boss" /* the name of the instantiation of the component */ -#define COMPONENT_INTERFACE_TPYE "IDL:alma/MinorServo/MinorServoBoss:1.0" /* the type of the interface */ #define COMPONENT_IDL_MODULE MinorServo /* the IDL module that contains the component interface */ #define COMPONENT_IDL_INTERFACE MinorServoBoss /* the IDL interface of the component */ #define COMPONENT_SMARTPOINTER MinorServoBoss_var /* the component type */ +#ifndef COMPONENT_INTERFACE_TPYE + #define COMPONENT_INTERFACE_TPYE "IDL:alma/MinorServo/MinorServoBoss:1.0" +#endif /* ********************************** */ /* define user input command style */ diff --git a/Common/Clients/MinorServoBossTextClient/src/Makefile b/Common/Clients/MinorServoBossTextClient/src/Makefile index 39d35e743..246fd626e 100644 --- a/Common/Clients/MinorServoBossTextClient/src/Makefile +++ b/Common/Clients/MinorServoBossTextClient/src/Makefile @@ -69,6 +69,9 @@ _tui_MinorServoBossTextClient_LIBS = MinorServoBossStubs IRALibrary Managme TextWindowLibrary ClientErrors ComponentErrors ManagementErrors MinorServoErrors AntennaDefinitionsStubs \ MinorServoDefinitionsStubs +ifeq ($(STATION),SRT) + MinorServoBossTextClient_CFLAGS = -DCOMPONENT_INTERFACE_TPYE="\"IDL:alma/MinorServo/SRTMinorServoBoss:1.0\"" +endif SCRIPTS = minorservoBossTui diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp index 9f490e5ba..c90158e95 100644 --- a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -289,7 +289,7 @@ int main(int argc, char *argv[]) { status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); - _TW_SET_COMPONENT(motionInfo_field,18,3,23,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(motionInfo_field,18,3,30,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); /* ****************************************************************** */ _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); diff --git a/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml b/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml index 2705230c3..b7a0bfd41 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Boss" - Code="MinorServoBossImpl" + Code="SRTMinorServoBossImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/MinorServoBoss:1.0" - Container="MinorServoBossContainer" - Default="true" - + Type="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" + Container="MinorServoContainer" + Default="true" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index ed2c44f77..23da6db86 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="GFR" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="true" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 8a01ba209..94efe94c9 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="M3R" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" Default="true" - /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index d75a83d75..a5801b66d 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -6,9 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="PFP" - Code="WPServoImpl" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" Default="true" diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index 4534c3d82..b957480d6 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -5,11 +5,11 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="SRP" - Code="WPServoImpl" + Name="SRP" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="true" /> diff --git a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml b/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml deleted file mode 100644 index 64fcda240..000000000 --- a/SRT/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml new file mode 100644 index 000000000..00e681dfa --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -0,0 +1,32 @@ + + + + + + ROTATION -88.70659 + ROTATION -88.70659 + ROTATION -159.8899 + ROTATION -159.8899 + ROTATION 90.971610 + ROTATION 90.971610 + ROTATION 162.771 + ROTATION 162.771 + ROTATION 55.373967 + ROTATION 55.373967 + ROTATION -51.821170 + ROTATION -51.821170 + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml new file mode 100644 index 000000000..fccec0b0f --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -0,0 +1,18 @@ + + + + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..086b3785b --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml @@ -0,0 +1,33 @@ + + + + + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml new file mode 100644 index 000000000..688491e30 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -0,0 +1,36 @@ + + + + + + X_ENABLED + Z_MASTER_ENABLED + Z_SLAVE_ENABLED + THETA_MASTER_ENABLED + THETA_SLAVE_ENABLED + + ELONG_X + ELONG_Z_MASTER + ELONG_Z_SLAVE + ELONG_THETA_MASTER + ELONG_THETA_SLAVE + + TX + TZ + RTHETA + + mm + mm + degree + + OFFSET_TX + OFFSET_TZ + OFFSET_RTHETA + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..6869a5c77 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -0,0 +1,125 @@ + + + + + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml new file mode 100644 index 000000000..165d5198f --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -0,0 +1,47 @@ + + + + + + Z1_ENABLED + Z2_ENABLED + Z3_ENABLED + Y1_ENABLED + Y2_ENABLED + X1_ENABLED + + ELONG_Z1 + ELONG_Z2 + ELONG_Z3 + ELONG_Y1 + ELONG_Y2 + ELONG_X1 + + TX + TY + TZ + RX + RY + RZ + + mm + mm + mm + degree + degree + degree + + OFFSET_TX + OFFSET_TY + OFFSET_TZ + OFFSET_RX + OFFSET_RY + OFFSET_RZ + diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index b1cf45978..14a8fbca7 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -38,36 +38,36 @@ KKG 90.0 - 1 -2.2964186668 - 1 0.0 - 1 -0.0061030770 - 1 -0.0035287447 - 1 -0.0014408963 - 1 -0.0017973853 - 1 0.0719125122 - 1 0.0925239921 - 0 0 - 0 0 - 1 0.0128885703 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 0 0.0 - 1 0.0006690503 - 1 0.0000107827 + 1 0.0002358370 + 1 0.0000537828 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 diff --git a/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml b/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml index 221b861fd..c4ab33015 100644 --- a/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml +++ b/SRT/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="1" diff --git a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml index c17f54267..df04e8a0e 100644 --- a/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml +++ b/SRT/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml @@ -20,7 +20,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" MeteoInstance="WEATHERSTATION/WeatherStation" > diff --git a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 2fde0991d..422590f78 100644 --- a/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -23,7 +23,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" ActiveSurfaceBossInterface="IDL:alma/ActiveSurface/SRTActiveSurfaceBoss:1.0" CustomLoggerInterface="IDL:alma/Management/CustomLogger:1.0" WeatherStationInstance="IDL:alma/Weather/GenericWeatherStation:1.0" diff --git a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml index 88c537650..02eb3b0a2 100644 --- a/SRT/CDB/alma/MANAGEMENT/Point/Point.xml +++ b/SRT/CDB/alma/MANAGEMENT/Point/Point.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="0" diff --git a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml index d4e2d5e3d..4dab29cf9 100644 --- a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -1,197 +1,37 @@ - - - - - LLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm)= (-46.2); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PPP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - HHP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.72); TX(mm) = (1312.0); TZ(mm) = (-40.0); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - XKP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (-1060); TZ(mm) = (-45.9); - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - - slaves="GFR, M3R, PFP, SRP" -> - - + + - + - + - - - - - - + + + + + + + + + + + + diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index e13e504db..75f01dc18 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -1,356 +1,33 @@ - - - - - - - - - - - + physical_axes="2" + virtual_axes="1" + max_speed="3.5" + acceleration="2" + min_range="-166" + max_range="168.5"> - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index c741e7cd8..83ebde14b 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -1,357 +1,33 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="1" - number_of_slaves="3" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="3" - zero="0" - park_position="0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-945, 945)" -> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 0c7cd46b3..6fdbf0722 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -1,358 +1,39 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="3" - number_of_slaves="5" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="0" - zero="0" - park_position="2730.15,0,-195" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-28.51, 2740); (-1480, 1480); (-199, 40)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index 44730072b..eebfba2c7 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -1,359 +1,39 @@ - - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="6" - number_of_slaves="7" - scale_factor="1" - scale_offset="0" - server_ip="127.0.0.1" - server_port="10000" - timeout="2000000" - servo_address="1" - zero="1570.00" - park_position="-5,5,-125,0,0,0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "1" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-50, 50); (-110, 110); (-110, 110); (-0.25, 0.25); (-0.25, 0.25); (-0.25, 0.25)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml new file mode 100644 index 000000000..b1de61c19 --- /dev/null +++ b/SRT/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -0,0 +1,12 @@ + + + + diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index b6d47acd7..4d86ea178 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -6,7 +6,7 @@ antennaSetup=CCB - servoSetup=CCB + servoSetup=CCB receiversSetup=CCB chooseBackend=TotalPower initialize=CCB @@ -19,16 +19,22 @@ + antennaSetup=CCG + servoSetup=CCG receiversSetup=CCG chooseBackend=TotalPower + initialize=CCG + device=0 calOff + restFrequency=0 + azelOffsets=0d,0d antennaSetup=KKG - servoSetup=KKG + servoSetup=KKG receiversSetup=KKG receiversMode=SINGLEDISH chooseBackend=TotalPower @@ -43,7 +49,7 @@ antennaSetup=LP - servoSetup=LLP + servoSetup=LLP receiversSetup=LLP receiversMode=XXC4 chooseBackend=TotalPower @@ -58,7 +64,7 @@ antennaSetup=LP - servoSetup=PPP + servoSetup=PPP receiversSetup=PPP receiversMode=C3XX chooseBackend=TotalPower @@ -73,7 +79,7 @@ antennaSetup=LP - servoSetup=PLP + servoSetup=PLP receiversSetup=PLP receiversMode=C3C4 chooseBackend=TotalPower @@ -88,28 +94,28 @@ antennaSetup=XB - servoSetup=XB + servoSetup=XB receiversSetup=CCB chooseBackend=TotalPower initialize=XB device=0 restFrequency=0 - setLO=7500 + setLO=7500 azelOffsets=0d,0d - antennaSetup=LP - servoSetup=SSP - receiversSetup=CCB - chooseBackend=TotalPower - initialize=PPP - device=0 - calOff - restFrequency=0 - azelOffsets=0d,0d + antennaSetup=LP + servoSetup=SSP + receiversSetup=CCB + chooseBackend=TotalPower + initialize=PPP + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml index 2705230c3..b7a0bfd41 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/Boss/Boss.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Boss" - Code="MinorServoBossImpl" + Code="SRTMinorServoBossImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/MinorServoBoss:1.0" - Container="MinorServoBossContainer" - Default="true" - + Type="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" + Container="MinorServoContainer" + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index ed2c44f77..23da6db86 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="GFR" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 8a01ba209..94efe94c9 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -6,10 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="M3R" - Code="WPServoImpl" + Code="SRTGenericMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" Default="true" - /> diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index d75a83d75..a5801b66d 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -6,9 +6,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="PFP" - Code="WPServoImpl" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" Default="true" diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index 4534c3d82..b957480d6 100644 --- a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -5,11 +5,11 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="SRP" - Code="WPServoImpl" + Name="SRP" + Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/WPServo:1.0" + Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="true" /> diff --git a/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml b/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml deleted file mode 100644 index 64fcda240..000000000 --- a/SRT/Configuration/CDB/MACI/Containers/MinorServoBossContainer/MinorServoBossContainer.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml new file mode 100644 index 000000000..00e681dfa --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -0,0 +1,32 @@ + + + + + + ROTATION -88.70659 + ROTATION -88.70659 + ROTATION -159.8899 + ROTATION -159.8899 + ROTATION 90.971610 + ROTATION 90.971610 + ROTATION 162.771 + ROTATION 162.771 + ROTATION 55.373967 + ROTATION 55.373967 + ROTATION -51.821170 + ROTATION -51.821170 + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml new file mode 100644 index 000000000..fccec0b0f --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -0,0 +1,18 @@ + + + + + + ROTATION 0 + ROTATION 0 + ROTATION 0 + ROTATION 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml new file mode 100644 index 000000000..d68395104 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Properties/Properties.xml @@ -0,0 +1,24 @@ + + + + + + CLOCKWISE_ENABLED + COUNTERCLOCKWISE_ENABLED + + CLOCKWISE + COUNTERCLOCKWISE + + ROTATION + + degree + + OFFSET + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..086b3785b --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml @@ -0,0 +1,33 @@ + + + + + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + TX 0 + TZ 0 + RTHETA 0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml new file mode 100644 index 000000000..688491e30 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml @@ -0,0 +1,36 @@ + + + + + + X_ENABLED + Z_MASTER_ENABLED + Z_SLAVE_ENABLED + THETA_MASTER_ENABLED + THETA_SLAVE_ENABLED + + ELONG_X + ELONG_Z_MASTER + ELONG_Z_SLAVE + ELONG_THETA_MASTER + ELONG_THETA_SLAVE + + TX + TZ + RTHETA + + mm + mm + degree + + OFFSET_TX + OFFSET_TZ + OFFSET_RTHETA + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml new file mode 100644 index 000000000..6869a5c77 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -0,0 +1,125 @@ + + + + + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX0 + TY0 + TZ0 + RX0 + RY0 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX38 + TY31 + TZ-12.788622422210521 + RX-0.005254963341757046 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 + RY-0.03611111111111111 + RZ0 + + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 + RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 + RY-0.036111111111111108 + RZ0 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml new file mode 100644 index 000000000..165d5198f --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Properties/Properties.xml @@ -0,0 +1,47 @@ + + + + + + Z1_ENABLED + Z2_ENABLED + Z3_ENABLED + Y1_ENABLED + Y2_ENABLED + X1_ENABLED + + ELONG_Z1 + ELONG_Z2 + ELONG_Z3 + ELONG_Y1 + ELONG_Y2 + ELONG_X1 + + TX + TY + TZ + RX + RY + RZ + + mm + mm + mm + degree + degree + degree + + OFFSET_TX + OFFSET_TY + OFFSET_TZ + OFFSET_RX + OFFSET_RY + OFFSET_RZ + diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index b1cf45978..14a8fbca7 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -38,36 +38,36 @@ KKG 90.0 - 1 -2.2964186668 - 1 0.0 - 1 -0.0061030770 - 1 -0.0035287447 - 1 -0.0014408963 - 1 -0.0017973853 - 1 0.0719125122 - 1 0.0925239921 - 0 0 - 0 0 - 1 0.0128885703 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 0 0.0 - 1 0.0006690503 - 1 0.0000107827 + 1 0.0002358370 + 1 0.0000537828 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml index d18bf0948..43a777280 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/CalibrationTool/CalibrationTool.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="1" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml index 66f145487..f139a84fc 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/FitsZilla/FitsZilla.xml @@ -20,7 +20,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" MeteoInstance="WEATHERSTATION/WeatherStation" > diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml index 3b8c89f50..eb9ea73b8 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Gavino/Gavino.xml @@ -23,7 +23,7 @@ AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" ReceiversBossInterface="IDL:alma/Receivers/ReceiversBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" ActiveSurfaceBossInterface="IDL:alma/ActiveSurface/SRTActiveSurfaceBoss:1.0" CustomLoggerInterface="IDL:alma/Management/CustomLogger:1.0" WeatherStationInstance="IDL:alma/Weather/GenericWeatherStation:1.0" diff --git a/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml b/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml index 88c537650..02eb3b0a2 100644 --- a/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml +++ b/SRT/Configuration/CDB/alma/MANAGEMENT/Point/Point.xml @@ -15,7 +15,7 @@ RepetitionExpireTime="8000000" TrackingFlagDutyCycle="100000" AntennaBossInterface="IDL:alma/Antenna/AntennaBoss:1.0" - MinorServoBossInterface="IDL:alma/MinorServo/MinorServoBoss:1.0" + MinorServoBossInterface="IDL:alma/MinorServo/SRTMinorServoBoss:1.0" SchedulerInterface="IDL:alma/Management/Scheduler:1.0" ObservatoryInterface="IDL:alma/Antenna/Observatory:1.0" GenerateFile="0" diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml index ac992a0c5..4dab29cf9 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -1,197 +1,37 @@ - - - - - LLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm)= (-46.2); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PPP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - PLP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (458); TZ(mm) = (-45.9); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - HHP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.72); TX(mm) = (1312.0); TZ(mm) = (-40.0); - @ PFP: power_off_encoder; - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - XKP=" - @ SRP: park; - @ PFP: RY(mm) = (-25.75); TX(mm) = (-1060); TZ(mm) = (-45.9); - @ GFR: RZ(mm) = (-600); - @ M3R: RZ(mm) = (860); - " - - - slaves="GFR, M3R, PFP, SRP" -> - - + + - + - + - - - - - - + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml index 9535f226d..75f01dc18 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -1,356 +1,33 @@ - - - - - - - - - - - + physical_axes="2" + virtual_axes="1" + max_speed="3.5" + acceleration="2" + min_range="-166" + max_range="168.5"> - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml index cd650b487..83ebde14b 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -1,357 +1,33 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="1" - number_of_slaves="3" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="3" - zero="0" - park_position="0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-945, 945)" -> - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml index c5f176b8a..6fdbf0722 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -1,358 +1,39 @@ - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="3" - number_of_slaves="5" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="0" - zero="0" - park_position="2730.15,0,-195" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "0" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-34.0, 2740); (-1480, 1480); (-199, 40)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index 90a39717c..eebfba2c7 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -1,359 +1,39 @@ - - - - - - - actionThreadStackSize="2048" - monitoringThreadStackSize="4096" - number_of_axis="6" - number_of_slaves="7" - scale_factor="1" - scale_offset="0" - server_ip="192.168.200.16" - server_port="10000" - timeout="2000000" - servo_address="1" - zero="1570.00" - park_position="-5,5,-125,0,0,0" - max_speed="0" - min_speed="0" - driver_type = "unknown" - virtual_rs = "1" - require_calibration = "0" - expire_time = "0.05000" - tracking_delta = "1.0" - limits="(-50, 50); (-110, 110); (-110, 110); (-0.25, 0.25); (-0.25, 0.25); (-0.25, 0.25)" -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml new file mode 100644 index 000000000..5ca037aaa --- /dev/null +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Socket/Socket.xml @@ -0,0 +1,13 @@ + + + + diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 1c63bba48..4d86ea178 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -20,6 +20,7 @@ antennaSetup=CCG + servoSetup=CCG receiversSetup=CCG chooseBackend=TotalPower initialize=CCG diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore b/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore new file mode 100644 index 000000000..981c93f21 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/.gitignore @@ -0,0 +1 @@ +SRTMinorServoCommon.idl diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl new file mode 100644 index 000000000..5c3eb142a --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -0,0 +1,283 @@ +#ifndef __SRTMINORSERVO_IDL__ +#define __SRTMINORSERVO_IDL__ +/***************************************************************\ + * Authors: + * Giuseppe Carboni + * + * Created: Mon Mar 06 12:30:00 CEST 2023 +\***************************************************************/ + +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + /** + * This IDL interface describes the CORBA interface of a common SRTMinorServo component. + * This is simply the base interface from which the SRTGenericMinorServo and SRTProgramTrackMinorServo interfaces inherit. + */ + interface SRTBaseMinorServo : ACS::CharacteristicComponent + { + /** + * This property tells if all the servo axes are enabled + */ + readonly attribute Management::ROTBoolean enabled; + + /** + * This property tells the status of the servo drive cabinet + */ + readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; + + /** + * This property tells if the servo is in blocked state and cannot move + */ + readonly attribute Management::ROTBoolean block; + + /** + * This property returns the current operative mode of the servo + */ + readonly attribute ROSRTMinorServoOperativeMode operative_mode; + + /** + * This property returns the sequence of statuses of the servo physical axes + */ + readonly attribute ACS::RObooleanSeq physical_axes_enabled; + + /** + * This property returns the sequence of current positions of the physical axes of the servo + */ + readonly attribute ACS::ROdoubleSeq physical_positions; + + /** + * This property returns the number of virtual axes of the servo + */ + readonly attribute ACS::ROlong virtual_axes; + + /** + * This property returns the current plain positions of the virtual axes of the servo + * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets + */ + readonly attribute ACS::ROdoubleSeq plain_virtual_positions; + + /** + * This property returns the current positions of the virtual axes of the servo + * The positions returned by this property equals to the plain virtual positions minus the offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_positions; + + /** + * This property returns the current offsets of the virtual axes of the servo + * The offset values are the sum of user and system offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_offsets; + + /** + * This property returns the current user offsets of the virtual axes of the servo + */ + readonly attribute ACS::ROdoubleSeq virtual_user_offsets; + + /** + * This property returns the current system offsets of the virtual axes of the servo + */ + readonly attribute ACS::ROdoubleSeq virtual_system_offsets; + + /** + * This property indicates whether the servo is in use in the current configuration + */ + readonly attribute Management::ROTBoolean in_use; + + /** + * This property returns the configuration of the servo. Each configuration has different positioning coefficients + */ + readonly attribute ACS::ROstring current_setup; + + /** + * This method asks the PLC the status for the corresponding servo + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware + * @return true if the servo is not in an error state, false otherwise + */ + boolean status() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method commands a STOW operation to the servo + * @param stow_position the index of the position we want the servo to stow to + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + */ + void stow(in long stow_position) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method commands a STOP operation to the servo + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted + */ + void stop() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method commands a PRESET operation to the servo + * @param coordinates, a sequence of double + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted + */ + void preset(in ACS::doubleSeq coordinates) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method loads from the CDB the positioning coefficients related to the given configuration + * @param configuration the string representing the name of the table from which the coefficients will be loaded + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration + * @return true if the servo is in use with the current configuration, false otherwise + */ + boolean setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx); + + /** + * This method calculates the servo coordinates for a given elevation + * @param elevation the elevation to use for the coordinates calculation, expressed in degrees + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation + * @return the calculated coordinates as a sequence of doubles + */ + ACS::doubleSeq calcCoordinates(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the user offsets of the servo + * @return the user offsets as a sequence of doubles + */ + ACS::doubleSeq getUserOffsets(); + + /** + * This method sets the user offset of the servo for a given axis + * @param axis_name a string corresponding to the axis we want to set the offset for + * @param offset the absolute user offset value for the given servo axis + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted + */ + void setUserOffset(in string axis_name, in double offset) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method sets the user offsets to zero for all the servo axes + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void clearUserOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the system offsets of the servo + * @return the system offsets as a sequence of doubles + */ + ACS::doubleSeq getSystemOffsets(); + + /** + * This method sets the system offset of the servo for a given axis + * @param axis_name a string corresponding to the axis we want to set the offset for + * @param offset the absolute system offset value for the given servo axis + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted + */ + void setSystemOffset(in string axis_name, in double offset) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method sets the system offsets to zero for all the servo axes + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void clearSystemOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method resets the Leonardo offsets to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted + */ + void reloadOffsets() raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns in the two parameters passed as reference, the names and the units of measure of the axes of the servo, respectively + * @param axes_names the sequence of strings containing the names of the virtual axes of the servo + * @param axes_units the sequence of strings containing the units of measure of each virtual axis of the servo + */ + void getAxesInfo(out ACS::stringSeq axes_names, out ACS::stringSeq axes_units); + + /** + * This method returns the positions of all the axes of the servo for a given time + * @param acs_time the ACS::Time for which we want to retrieve the servo positions + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty + * @return a sequence of doubles containing the positions of the servo for the given time + */ + ACS::doubleSeq getAxesPositions(in ACS::Time acs_time) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This method returns the time it would take for the servo to get from a starting position to a destination position + * An empty starting position means the function will calculate the travel time from the current position, taking into account the current speed as well + * To account for the current speed, it is sufficient to call the method in this way: + * getTravelTime(ACS::doubleSeq(), ); + * @param starting_position the sequence of starting axes positions or an empty sequence + * @param destination_position the sequence of destination axes positions, mandatory + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + ACS::TimeInterval getTravelTime(in ACS::doubleSeq starting_position, in ACS::doubleSeq destination_position); + + /** + * This method returns the minimum and maximun ranges for all the servo axes in the given sequence passed by reference + * @param min_ranges the minimum range of the servo axes + * @param max_ranges the maximum range of the servo axes + */ + void getAxesRanges(out ACS::doubleSeq min_ranges, out ACS::doubleSeq max_ranges); + }; + + /** + * This IDL interface describes the CORBA interface of a generic SRTMinorServo component. + * This interface is derived from the SRTBaseMinorServo and it is empty. + * It's sole purpose is to generate the POA_MinorServo::SRTGenericMinorServo class needed for the components. + */ + interface SRTGenericMinorServo : SRTBaseMinorServo {}; + + /** + * This IDL interface describes the CORBA interface of a ProgramTrack-capable SRTMinorServo component. + * It extends the SRTBaseMinorServo interface with some more attributes and methods described below. + */ + interface SRTProgramTrackMinorServo : SRTBaseMinorServo + { + /** + * This property indicates whether the servo system is tracking the given trajectory + */ + readonly attribute Management::ROTBoolean tracking; + + /** + * This property indicates the ID of the trajectory. It always corresponds to starting time of the trajectory, expressed as the UNIX Epoch * 1000 (long) + */ + readonly attribute ACS::ROlong trajectory_id; + + /** + * This property indicates the total number of points loaded into the current trajectory + */ + readonly attribute ACS::ROlong total_trajectory_points; + + /** + * This property indicates the number of points of the current trajectory which remain to be tracked + */ + readonly attribute ACS::ROlong remaining_trajectory_points; + + /** + * This property returns the sequence of tracking error for each virtual axis of the servo + */ + readonly attribute ACS::ROdoubleSeq tracking_error; + + /** + * This method loads a set of coordinates that have to be tracked by the servo system + * @param trajectory_id the ID of the trajectory to which the current point belongs + * @param point_id the ID of the point inside the current trajectory. It must be a consecutive number for the servo system to acknowledge + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the servo system and the points after are spaced by 0.2 seconds from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param coordinates the coordinates to track at the given time + * @throw MinorServoErrorsEx when the length of the coordinates sequence does not match the number of virtual axis of the servo system, + * when there has been a communication error or when the command was not accepted + */ + void programTrack(in long trajectory_id, in long point_id, in ACS::Time point_time, in ACS::doubleSeq coordinates); + + /** + * This method returns a boolean indicating if the servo is tracking or not + * @return true if the servo is tracking, false otherwise + */ + boolean isTracking(); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl new file mode 100644 index 000000000..9748e827e --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -0,0 +1,86 @@ +#ifndef __SRTMINORSERVOBOSS_IDL__ +#define __SRTMINORSERVOBOSS_IDL__ +/***************************************************************\ + * Authors: + * Giuseppe Carboni + * + * Created: Mon Mar 06 12:30:00 CEST 2023 + * Last Modified: Mon Mar 06 12:30:00 CEST 2023 +\***************************************************************/ + +#include +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + interface SRTMinorServoBoss: MinorServoBoss + { + /** + * Boolean indicating whether the component is connected to the Leonardo Minor Servo system + */ + readonly attribute Management::ROTBoolean connected; + + /** + * Current configuration of the Leonardo minor servo system + */ + readonly attribute ROSRTMinorServoFocalConfiguration current_configuration; + + /** + * Boolean indicating whether the system is in simulation mode or not + */ + readonly attribute Management::ROTBoolean simulation_enabled; + + /** + * UNIX Epoch of the Leonardo minor servo system PLC machine + */ + readonly attribute ACS::ROdouble plc_time; + + /** + * Version of the software on the PLC machine + */ + readonly attribute ACS::ROstring plc_version; + + /** + * Enumeration indicating whether the system is controlled by VBrain or DISCOS + */ + readonly attribute ROSRTMinorServoControlStatus control; + + /** + * Boolean indicating whether all the axes are powered or not + */ + readonly attribute Management::ROTBoolean power; + + /** + * Boolean indicating whether the system entered an emergency status + */ + readonly attribute Management::ROTBoolean emergency; + + /** + * Position of the gregorian cover + */ + readonly attribute ROSRTMinorServoGregorianCoverStatus gregorian_cover; + + /** + * UNIX Epoch of the last executed command (STATUS commands are not shown here) + */ + readonly attribute ACS::ROdouble last_executed_command; + + /** + * This command sets all the minor servos involved in the current focal configuration to their position calculated from the elevation argument + * @param elevation, the elevation the minor servos should use to calculate their position + * @throw MinorServoErrors::MinorServoErrorsEx + */ + void preset(in double elevation) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This command opens or closes the gregorian cover + * @param value, the desired gregorian cover position, accepted values are 'open', 'OPEN', 'closed' or 'CLOSED' + * @throw MinorServoErrors::MinorServoErrorsEx + */ + //void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl new file mode 100644 index 000000000..6addf4c0d --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -0,0 +1,102 @@ +/***************************************************************\ + * Author: Giuseppe Carboni +\***************************************************************/ +#ifndef __SRTMINORSERVOCOMMON_MIDL__ +#define __SRTMINORSERVOCOMMON_MIDL__ + +#include +#include +#include +#include +#include +#include + +#pragma prefix "alma" + +module MinorServo +{ + /** + * Enumerator which indicates a Leonardo minor servo configuration + */ + enum SRTMinorServoFocalConfiguration + { + CONFIGURATION_UNKNOWN, + CONFIGURATION_PARK, + CONFIGURATION_PRIMARY, + CONFIGURATION_GREGORIAN1, + CONFIGURATION_GREGORIAN2, + CONFIGURATION_GREGORIAN3, + CONFIGURATION_GREGORIAN4, + CONFIGURATION_GREGORIAN5, + CONFIGURATION_GREGORIAN6, + CONFIGURATION_GREGORIAN7, + CONFIGURATION_GREGORIAN8, + CONFIGURATION_BWG1, + CONFIGURATION_BWG2, + CONFIGURATION_BWG3, + CONFIGURATION_BWG4 + }; + ACS_ENUM(SRTMinorServoFocalConfiguration); + + /** + * Enumerator which indicates the status of the control for the Leonardo minor servo system + */ + enum SRTMinorServoControlStatus + { + CONTROL_DISCOS, + CONTROL_VBRAIN + }; + ACS_ENUM(SRTMinorServoControlStatus); + + /** + * Enumerator which indicates the position of the gregorian cover + */ + enum SRTMinorServoGregorianCoverStatus + { + COVER_STATUS_UNKNOWN, + COVER_STATUS_CLOSED, + COVER_STATUS_OPEN + }; + ACS_ENUM(SRTMinorServoGregorianCoverStatus); + + /** + * Enumerator which indicates the status of a servo drive cabinet + */ + enum SRTMinorServoCabinetStatus + { + DRIVE_CABINET_OK, + DRIVE_CABINET_WARNING, + DRIVE_CABINET_ERROR + }; + ACS_ENUM(SRTMinorServoCabinetStatus); + + /** + * Enumerator which indicates the operating mode of a single servo + */ + enum SRTMinorServoOperativeMode + { + OPERATIVE_MODE_UNKNOWN, + OPERATIVE_MODE_SETUP, + OPERATIVE_MODE_STOW, + OPERATIVE_MODE_STOP, + OPERATIVE_MODE_PRESET, + OPERATIVE_MODE_PROGRAMTRACK + }; + ACS_ENUM(SRTMinorServoOperativeMode); + + /** + * Enumerator which indicates the type of movement made by the whole system (i.e.: performing setup, parking, tracking...) + */ + enum SRTMinorServoMotionStatus + { + MOTION_STATUS_UNCONFIGURED, + MOTION_STATUS_STARTING, + MOTION_STATUS_CONFIGURED, + MOTION_STATUS_TRACKING, + MOTION_STATUS_PARKING, + MOTION_STATUS_PARKED, + MOTION_STATUS_ERROR + }; + ACS_ENUM(SRTMinorServoMotionStatus); +}; +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile new file mode 100644 index 000000000..9cac56365 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile @@ -0,0 +1,64 @@ +#************************************************************************************** +# E.S.O. - ACS project +# +# Makefile of SRTMinorServo IDL +# +#-------------------------------------------------------------------------------------- +# Giuseppe Carboni (giuseppe.carboni@inaf.it) +#-------------------------------------------------------------------------------------- +# +#************************************************************************************** + +#************************************************************************************** +# This Makefile follows VLT Standards (see Makefile(5) for more). +#************************************************************************************** + +MAKE_PDF = ON + +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +# IDL FILES +# +IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTMinorServoCommon + +SRTMinorServoCommonStubs_LIBS = baciStubs ManagmentDefinitionsStubs MinorServoDefinitionsStubs ComponentErrorsStubs MinorServoErrorsStubs +SRTMinorServoStubs_LIBS = SRTMinorServoCommonStubs +SRTMinorServoBossStubs_LIBS = SRTMinorServoCommonStubs MinorServoBossStubs + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + + +# TARGETS +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + $(RM) *~ ../include/*~ ../idl/*~ ../*~ ../../*~ core + $(RM) ../doc/html + $(RM) tmp.txt acsexmplbeans.jar ../doc/abeans.log + @echo " . . . clean done" + +clean_dist : clean clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + # cp ../doc/html/group__ACSEXMPLDOC.html ../doc/html/main.html + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + +#___oOo___ diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/Makefile b/SRT/Interfaces/SRTMinorServoInterface/test/Makefile new file mode 100644 index 000000000..e70daa63e --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/Makefile @@ -0,0 +1,92 @@ +# CPP UNIT TESTING SETUP +#-------------- +# GTEST_HOME=/usr/local/include/gtest +# GMOCK_HOME=/usr/local/include/gmock +# GTEST_LIBS=gtest gtest_main + +# USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# USER_LIBS=C++ pthread +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# EXECUTABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + python -m unittest functional/commands + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + rm -rf ../lib/python/site-packages/* + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Servers/SRTMinorServo/test/external/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/external/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/external/__init__.py rename to SRT/Interfaces/SRTMinorServoInterface/test/external/__init__.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/__init__.py rename to SRT/Interfaces/SRTMinorServoInterface/test/functional/__init__.py diff --git a/SRT/Servers/SRTMinorServo/test/pyunit/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/__init__.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/pyunit/__init__.py rename to SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/__init__.py diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py new file mode 100644 index 000000000..aa862cae0 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_servoSetup.py @@ -0,0 +1,62 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestServoSetupCmd(unittest.TestCase): + """Test the servoSetup command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_code(self): + success, answer = self.boss.command('servoSetup=FOO') + self.assertFalse(success) + time.sleep(0.2) + if self.boss.isStarting(): + self.wait_ready() + + def test_right_code(self): + success, answer = self.boss.command('servoSetup=' + self.setup_code) + self.assertTrue(success) + time.sleep(0.2) + if self.boss.isStarting(): + self.wait_ready() + + def wait_ready(self): + while not self.boss.isReady(): + time.sleep(0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from PyMinorServoTest import simunittest + simunittest.run(TestServoSetupCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py new file mode 100644 index 000000000..a4d0b257d --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoASConfiguration.py @@ -0,0 +1,44 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from PyMinorServoTest import simunittest +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoASConfigurationCmd(unittest.TestCase): + """Test the setServoASConfiguration command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_axis_code(self): + success, answer = self.boss.command('setServoASConfiguration=FOO') + self.assertFalse(success) + + def test_right_axis_code(self): + success, answer = self.boss.command('setServoASConfiguration=on') + self.assertTrue(success) + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + simunittest.run(TestSetServoASConfigurationCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py new file mode 100644 index 000000000..7d67f7ad1 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoElevationTracking.py @@ -0,0 +1,46 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoElevationTrackingCmd(unittest.TestCase): + """Test the setServoElevationTracking command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_flag(self): + success, answer = self.boss.command('setServoElevationTracking=FOO') + self.assertFalse(success) + + def test_right_flag(self): + #FIXME: we need servoSetup before this + success, answer = self.boss.command('setServoElevationTracking=on') + self.assertTrue(success) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from PyMinorServoTest import simunittest + simunittest.run(TestSetServoElevationTrackingCmd) diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py new file mode 100644 index 000000000..64888d527 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/commands/test_setServoOffset.py @@ -0,0 +1,38 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +__author__ = "Marco Buttu " + + +class TestSetServoOffsetCmd(unittest.TestCase): + """Test the setServoOffset command""" + + telescope = os.getenv('STATION') + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.boss.park() + self.client.releaseComponent('MINORSERVO/Boss') + + def test_wrong_axis_code(self): + success, answer = self.boss.command('setServoOffset=FOO_TX,0') + self.assertFalse(success) + + +if __name__ == '__main__': + unittest.main() diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py new file mode 100644 index 000000000..98ab9110f --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_clearUserOffset.py @@ -0,0 +1,58 @@ +from __future__ import with_statement + +import os +import math +import time +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestClearUserOffset(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.clearUserOffset('FOO') + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestClearUserOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py new file mode 100644 index 000000000..ed2b37f2c --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesInfo.py @@ -0,0 +1,92 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime + +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestGetAxesInfo(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + cls.client.disconnect() + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + with self.assertRaises(MinorServoErrorsEx): + axes, units = self.boss.getAxesInfo() + + def test_ready(self): + """Get the axes information""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + axes, units = self.boss.getAxesInfo() + self.assertTrue(any(axes)) + self.assertTrue(any(units)) + self.assertEqual(len(units), len(axes)) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetAxesInfo, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py new file mode 100644 index 000000000..7a1f57511 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getAxesPosition.py @@ -0,0 +1,87 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime + +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestGetAxesPosition(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + + def tearDown(self): + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + with self.assertRaises(MinorServoErrorsEx): + position = self.boss.getAxesPosition(0) + + def test_ready(self): + """Get the axes position""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + position = self.boss.getAxesPosition(0) + self.assertTrue(any(position)) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetAxesPosition, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py new file mode 100644 index 000000000..600c3ea58 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_getCentralScanPosition.py @@ -0,0 +1,58 @@ +from __future__ import with_statement + +import os + +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + +class TestGetCentralScanPosition(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + + @classmethod + def tearDownClass(cls): + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.client = PySimpleClient() + self.boss = self.client.getComponent('MINORSERVO/Boss') + + def tearDown(self): + self.client.releaseComponent('MINORSERVO/Boss') + + def test_scan_not_active(self): + """Raise a MinorServoErrorsEx if the scan is not active""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.getCentralScanPosition() + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestGetCentralScanPosition, 'srt-mscu-sim') + diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py new file mode 100644 index 000000000..892aa9be6 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_position.py @@ -0,0 +1,126 @@ +from __future__ import with_statement +import random +import math +import time +import os +from datetime import datetime + +import unittest +import Management +import MinorServo +import Antenna + +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp +from Acspy.Clients.SimpleClient import PySimpleClient +from Acspy.Util import ACSCorba + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class PositionTest(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.axis_code='SRP_TZ' if self.telescope == 'SRT' else 'Z' + setupCode = 'KKG' if self.telescope == 'SRT' else 'CCC' + # Wait (maximum one minute) in case the boss is parking + if self.boss.isParking(): + t0 = datetime.now() + while self.boss.isParking() and (datetime.now() - t0).seconds < 60: + time.sleep(2) + if self.boss.isParking(): + self.fail('The system can not exit form a parking state') + + if self.boss.getActualSetup() != setupCode: + self.boss.setup(setupCode) + # Wait (maximum 5 minutes) in case the boss is starting + t0 = datetime.now() + while not self.boss.isReady() and (datetime.now() - t0).seconds < 60*5: + time.sleep(2) + if not self.boss.isReady(): + self.fail('The system is not ready for executing the tests') + self.boss.setElevationTracking('OFF') + self.boss.setASConfiguration('OFF') + axes, units = self.boss.getAxesInfo() + self.idx = axes.index(self.axis_code) + + def tearDown(self): + # self.boss.clearUserOffset(self.axis_code) + self.boss.setUserOffset(self.axis_code, 0) + self.wait_tracking() + + def test_get_current_position(self): + timestamp = getTimeStamp().value + position = self.get_position() + position_now = self.get_position(timestamp) + self.assertAlmostEqual(position, position_now, delta=0.1) + + def test_get_offset_position(self): + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + position_now = self.get_position() + self.assertAlmostEqual(position_now, position + 10, delta=0.1) + + def test_get_past_position(self): + timestamp = getTimeStamp().value + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + position_past = self.get_position(timestamp) + self.assertAlmostEqual(position, position_past, delta=0.1) + + def test_get_past_position_with_sleep(self): + timestamp = getTimeStamp().value + position = self.get_position() + self.boss.setUserOffset(self.axis_code, 10) + self.wait_tracking() + time.sleep(10) + position_past = self.get_position(timestamp) + self.assertAlmostEqual(position, position_past, delta=0.1) + + def wait_tracking(self): + time.sleep(1) # Give the time to command the new position + # TODO: we need a better solution than this sleep to be sure the tests + # procuce always the same results + while not self.boss.isTracking(): + time.sleep(0.1) + + def get_position(self, timestamp=0): + return self.boss.getAxesPosition(timestamp)[self.idx] + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main(verbosity=2, failfast=True) # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(PositionTest, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py new file mode 100644 index 000000000..1c0c266f8 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_scan.py @@ -0,0 +1,430 @@ +from __future__ import with_statement +import random +import math +import time +import os +from datetime import datetime + +import unittest +import Management +import MinorServo +import Antenna + +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp +from Acspy.Clients.SimpleClient import PySimpleClient +from Acspy.Util import ACSCorba + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class ScanBaseTest(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + cls.client.disconnect() + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.antennaInfo = Antenna.TRunTimeParameters( + targetName='dummy', + azimuth=math.pi, + elevation=math.pi/2 * 1/random.randrange(2, 10), + rightAscension=0, + declination=0, + startEpoch=getTimeStamp().value + 100000000, + onTheFly=False, + slewingTime=100000000, + section=Antenna.ANT_SOUTH, + axis=Management.MNG_TRACK, + timeToStop=0) + + self.scan = MinorServo.MinorServoScan( + range=20, + total_time=100000000, # 10 seconds + axis_code='SRP_TZ' if self.telescope == 'SRT' else 'Z', + is_empty_scan=False) + + def tearDown(self): + if self.boss.isScanActive(): + t = self.boss.closeScan() + self.waitUntilTime(t) + + def waitUntilTime(self, targetTime): + while getTimeStamp().value < targetTime: + time.sleep(0.1) + + def waitUntil(self, action, value): + """For instance: waitUntil(isReady, True)""" + while action() != value: + time.sleep(0.1) + + +class ScanTest(ScanBaseTest): + """Test checkScan(), startScan() and closeScan()""" + + def setUp(self): + super(ScanTest, self).setUp() + setupCode = 'KKG' if self.telescope == 'SRT' else 'CCC' + + # Wait (maximum one minute) in case the boss is parking + if self.boss.isParking(): + t0 = datetime.now() + while self.boss.isParking() and (datetime.now() - t0).seconds < 60: + time.sleep(2) + if self.boss.isParking(): + self.fail('The system can not exit form a parking state') + + if self.boss.getActualSetup() != setupCode or not self.boss.isReady(): + self.boss.setup(setupCode) + + # Wait (maximum 5 minutes) in case the boss is starting + t0 = datetime.now() + while not self.boss.isReady() and (datetime.now() - t0).seconds < 60*5: + time.sleep(2) + + if not self.boss.isReady(): + self.fail('The system is not ready for executing the tests') + + self.boss.setElevationTracking('OFF') + self.boss.setASConfiguration('OFF') + axes, units = self.boss.getAxesInfo() + self.idx = axes.index(self.scan.axis_code) + + getPosition = getattr(self, 'get%sPosition' %self.telescope) + centerScanPosition = getPosition( + self.boss.getActualSetup(), + 'SRP', + math.degrees(self.antennaInfo.elevation)) + self.centerScan = centerScanPosition[self.idx] + + def test_startScan_empty_scan_system_ready(self): + """Do nothing in case of empty scan and system ready""" + self.scan.is_empty_scan = True + startTime = 0 + self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_startScan_empty_scan_system_not_ready(self): + """Do nothing in case of empty scan and system NOT ready""" + self.scan.is_empty_scan = True + startTime = 0 + self.boss.park() + self.waitUntil(self.boss.isReady, False) + self.assertFalse(self.boss.isReady()) + self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_startScan_ASAP(self): + """Starting time unknown: the scan must start ASAP""" + startTime = 0 + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertGreater(t, getTimeStamp().value) + self.isAssertScan(t) + + def test_startScan_ASAP_at_checkScan_time(self): + """Starting time given by checkScan()""" + startTime = 0 + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + startTime = msInfo.startEpoch + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertGreater(t, getTimeStamp().value) + self.isAssertScan(t) + + def test_startScan_at_given_time(self): + """Start at given time""" + startTime = getTimeStamp().value + 60*10**7 # Start in one minute + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.assertEqual(t, startTime) + self.isAssertScan(t) + + def test_startScan_too_fast(self): + """Servo not enough fast for accomplishing the scan in total_time""" + startTime = getTimeStamp().value + 60*10**7 # Start in one minute + self.scan.total_time = 5000000 # 0.5 seconds + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_startScan_out_of_range(self): + """Scan out of the servo position limits""" + startTime = 0 + self.scan.range = 5000 # 5 meters + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_startScan_time_too_close_to_now(self): + """Starting time too close to the current time""" + startTime = getTimeStamp().value + 1*10**7 # Start in 1 second from now + with self.assertRaises(MinorServoErrorsEx): + self.boss.startScan(startTime, self.scan, self.antennaInfo) + + def test_closeScan_time_to_stop(self): + """Return the time_to_stop""" + startTime = 0 + t = self.boss.startScan(startTime, self.scan, self.antennaInfo) + self.waitUntilTime(startTime) + time_to_stop = self.boss.closeScan() + # The time_to_stop should be greater than now + self.assertGreater(time_to_stop, getTimeStamp().value) + + def test_checkScan_with_scanActive(self): + """checkScan() raises an exception in case there is an active scan.""" + startTime = getTimeStamp().value + 15*10**7 # Start in 15 seconds + self.boss.startScan(startTime, self.scan, self.antennaInfo) + # Wait untill the scan finishes (one second after the scan) + targetTime = startTime + self.scan.total_time + 1*10**7 + self.waitUntilTime(targetTime) + with self.assertRaises(MinorServoErrorsEx): + self.boss.checkScan(startTime, self.scan, self.antennaInfo) + + def test_checkScan_with_scan_in_execution(self): + """checkScan() raises an exception in case there is a scan in execution.""" + startTime = getTimeStamp().value + 15*10**7 # Start in 15 seconds + self.boss.startScan(startTime, self.scan, self.antennaInfo) + # Wait untill the scan starts + targetTime = startTime + 2*10**7 # 2 seconds after the starting time + self.waitUntilTime(targetTime) + with self.assertRaises(MinorServoErrorsEx): + self.boss.checkScan(startTime, self.scan, self.antennaInfo) + + def test_checkScan_empty_scan_start_ASAP(self): + """Starting time unknown: the scan must start ASAP""" + startTime = 0 + self.scan.is_empty_scan = True + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertGreater(msInfo.startEpoch, getTimeStamp().value) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual(msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_not_empty_scan_start_ASAP(self): + """Scan not empty: starting time unknown, the scan must start ASAP""" + startTime = 0 + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertTrue(msInfo.onTheFly) + self.assertGreater(msInfo.startEpoch, getTimeStamp().value) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_empty_scan_start_at_given_time(self): + """Starting time known and achievable""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute + self.scan.is_empty_scan = True + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertFalse(msInfo.onTheFly) + self.assertEqual(msInfo.startEpoch, startTime) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_not_empty_scan_start_at_given_time(self): + """Scan not empty: starting time known and achievable""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute + + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertTrue(res) + self.assertAlmostEqual(msInfo.centerScan, self.centerScan, delta=0.01) + self.assertTrue(msInfo.onTheFly) + self.assertEqual(msInfo.startEpoch, startTime) + self.assertEqual(msInfo.scanAxis, self.scan.axis_code) + self.assertEqual( + msInfo.timeToStop, + msInfo.startEpoch + self.scan.total_time) + + def test_checkScan_too_fast(self): + """Servo not enough fast for accomplishing the scan in total_time""" + startTime = getTimeStamp().value + 60*10**7 # Start in a minute from now + self.scan.total_time = 5000000 # 0.5 seconds + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def test_checkScan_out_of_range(self): + """The scan goes out of the servo position limits""" + startTime = 0 + self.scan.range = 1000 # 1 meter + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def test_checkScan_start_time_too_close_to_now(self): + """Starting time too close to the current time""" + startTime = getTimeStamp().value + 1*10**6 # Start in 0.1 second from now + res, msInfo = self.boss.checkScan(startTime, self.scan, self.antennaInfo) + self.assertFalse(res) + + def isAssertScan(self, startTime): + self.assertFalse(self.boss.isScanning()) + self.assertTrue(self.boss.isScanActive()) + # Assertions to verify right after startTime + self.waitUntilTime(startTime) + self.assertTrue(self.boss.isScanning()) + self.assertTrue(self.boss.isScanActive()) + self.assertAlmostEqual( + self.boss.getCentralScanPosition(), + self.centerScan, + delta=0.1) + # Wait untill the scan finishes (one second after the scan) + targetTime = startTime + self.scan.total_time + 1*10**7 + self.waitUntilTime(targetTime) + startPos = self.boss.getAxesPosition(startTime)[self.idx] + endPos = self.boss.getAxesPosition(targetTime)[self.idx] + self.assertTrue(self.boss.isScanActive()) + self.assertFalse(self.boss.isScanning()) + self.assertAlmostEqual(startPos + self.scan.range, endPos, delta=0.1) + + def getSRTPosition(self, conf_code, servo_name, elevation=45): + """Return the servo position related to the elevation. + + Parameters: + - conf_code: value returned by getActualSetup() (CCB, CCB_ASACTIVE,...) + - servo_name: SRP, GFR, M3R, PFP + - elevation: the antenna elevation, in degrees + """ + dal = ACSCorba.cdb() + dao = dal.get_DAO_Servant('alma/MINORSERVO/Boss') + body = dao.get_field_data(conf_code) + configurations = body.strip().split('@') + servos_conf = {} + for conf in configurations: + if conf: + name, value = conf.split(':') + servos_conf[name.strip()] = value.strip() + + # Example of servo_conf: + # >>> servos_conf['PFP'] + # 'RY(mm)=(-25.75); TX(mm)=(458); TZ(mm)=(-46.2);' + srp_conf = servos_conf[servo_name] + srp_items = [item.strip() for item in srp_conf.split(';')] + srp_axes = [] + for item in srp_items: + if '=' in item: + name, value = item.split('=') + srp_axes.append(value.strip()) + + # Example of srp_axes: + # >>> srp_axes + # ['(-25.75)', '(458)', '(-46.2)'] + position = [] + for axis in srp_axes: + axis = axis.lstrip('(') + axis = axis.rstrip(')') + # At this point, axis is something like '-0.23, 0.01, 3.2' + coeffs = [float(item) for item in axis.split(',')] + value = 0 + for idx, coeff in enumerate(coeffs): + value += coeff * elevation**idx + # Value: -25.75*elevation**0 + 485*elevation**1 -46.2*elevation**2 + position.append(value) + return position + + def getMEDPosition(self, conf_code, servo_name="", elevation=45): + """Return the servo position related to the elevation for MED + radiotelescope. + + Parameters: + - conf_code: value returned by getActualSetup() (CCC, KKC,...) + - servo_name: "" not use at Med + - elevation: the antenna elevation, in degrees + """ + from xml.dom.minidom import parseString + dal = ACSCorba.cdb() + dao = dal.get_DAO('alma/DataBlock/MinorServoParameters') + root = parseString(dao).documentElement + position = [] + coefficients = [] + for minorservo in root.getElementsByTagName("MinorServo"): + for code in minorservo.getElementsByTagName("code"): + if code.firstChild.data == conf_code: + if minorservo.getElementsByTagName("primary")[0].firstChild.data == "1": + yp_string_poly = minorservo.getElementsByTagName("YPaxis")[0].firstChild.data + coefficients.append(map(float,yp_string_poly.split(",")[3:])) + zp_string_poly = minorservo.getElementsByTagName("ZPaxis")[0].firstChild.data + coefficients.append(map(float,zp_string_poly.split(",")[3:])) + else: + x_string_poly = minorservo.getElementsByTagName("Xaxis")[0].firstChild.data + coefficients.append(map(float,x_string_poly.split(",")[3:])) + y_string_poly = minorservo.getElementsByTagName("Yaxis")[0].firstChild.data + coefficients.append(map(float,y_string_poly.split(",")[3:])) + z_string_poly = minorservo.getElementsByTagName("Zaxis")[0].firstChild.data + coefficients.append(map(float,z_string_poly.split(",")[3:])) + tx_string_poly = minorservo.getElementsByTagName("THETAXaxis")[0].firstChild.data + coefficients.append(map(float,tx_string_poly.split(",")[3:])) + ty_string_poly = minorservo.getElementsByTagName("THETAYaxis")[0].firstChild.data + coefficients.append(map(float,ty_string_poly.split(",")[3:])) + for coefficient in coefficients: + axis_position = 0 + for exp, coeff in enumerate(coefficient): + axis_position += (elevation)**(exp) * coeff + position.append(axis_position) + return position + + +class ScanInterfaceTest(ScanBaseTest): + """Test the interface of startScan() and closeScan()""" + + def test_checkScan_not_empty_system_not_ready(self): + """Raise a MinorServoErrorsEx in case the system is not ready""" + try: + with self.assertRaises(MinorServoErrorsEx): + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + except: + with self.assertRaises(MinorServoErrorsEx): + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + + def _test_checkScan_empty_scan_system_not_ready(self): + """Do nothing in case of empty scan and system NOT ready""" + self.scan.is_empty_scan = True + self.assertFalse(self.boss.isReady()) + t = self.boss.checkScan(0, self.scan, self.antennaInfo) + self.assertFalse(self.boss.isScanActive()) + + def test_closeScan_scan_not_active(self): + """Do nothing in case no scan is active""" + try: + self.boss.closeScan() + except: + self.boss.closeScan() + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main(verbosity=2, failfast=True) # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(ScanTest, 'srt-mscu-sim') + simulator.run(ScanInterfaceTest, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py new file mode 100644 index 000000000..b9cf28096 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setASConfiguration.py @@ -0,0 +1,56 @@ +from __future__ import with_statement + +import os +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSetASConfiguration(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_right_flag(self): + """Set the AS configuration properly""" + self.boss.setASConfiguration('on') + self.assertTrue(self.boss.isASConfiguration()) + + def test_wrong_flag(self): + """Raise a MinorServoErrorsEx in case of wrong code""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.setASConfiguration('foo') + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSetASConfiguration, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py new file mode 100644 index 000000000..8f24da6d3 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_setElevationTracking.py @@ -0,0 +1,56 @@ +from __future__ import with_statement + +import os +import unittest + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSetElevationTracking(unittest.TestCase): + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def test_right_flag(self): + """Set the elevation tracking properly""" + self.boss.setElevationTracking('on') + self.assertTrue(self.boss.isElevationTrackingEn()) + + def test_wrong_flag(self): + """Raise a MinorServoErrorsEx in case of wrong code""" + with self.assertRaises(MinorServoErrorsEx): + self.boss.setElevationTracking('foo') + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSetElevationTracking, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py new file mode 100644 index 000000000..e25314614 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_systemOffset.py @@ -0,0 +1,95 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + +__author__ = "Marco Buttu " + + +class TestSystemOffset(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + self.axis_code = "SRP_TX" if self.telescope == "SRT" else "X" + + def tearDown(self): + #self.boss.clearSystemOffset(self.axis_code) + self.boss.setSystemOffset(self.axis_code, 0) # TODO + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + with self.assertRaises(MinorServoErrorsEx): + self.boss.setSystemOffset(self.axis_code + "WRONG", 0) + + def test_get_offset(self): + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + target_offset = 5.0 + self.boss.setSystemOffset(self.axis_code, target_offset) + offset = self.boss.getSystemOffset()[0] # SRP_TX and X both have index 0 + self.assertAlmostEqual(offset, target_offset, delta=0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestSystemOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py new file mode 100644 index 000000000..269c44ce6 --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/test/functional/test_userOffset.py @@ -0,0 +1,96 @@ +from __future__ import with_statement + +import os +import math +import time +import datetime +import unittest + +import MinorServo +import Management +import Antenna + +from Acspy.Clients.SimpleClient import PySimpleClient +from MinorServoErrors import MinorServoErrorsEx +from Acspy.Common.TimeHelper import getTimeStamp + +from acswrapper.system import acs +from acswrapper.containers import ( + Container, ContainerError, start_containers_and_wait, + stop_containers_and_wait +) + + +__author__ = "Marco Buttu " + + +class TestUserOffset(unittest.TestCase): + + telescope = os.getenv('STATION') + + @classmethod + def setUpClass(cls): + if not acs.is_running(): + acs.start() + cls.containers = [ + Container('MinorServoContainer', 'cpp'), + Container('MinorServoBossContainer', 'cpp'), + ] + try: + start_containers_and_wait(cls.containers) + except ContainerError, ex: + cls.fail(ex.message) + cls.client = PySimpleClient() + cls.boss = cls.client.getComponent('MINORSERVO/Boss') + + @classmethod + def tearDownClass(cls): + cls.client.releaseComponent('MINORSERVO/Boss') + stop_containers_and_wait(cls.containers) + + def setUp(self): + self.setup_code = "CCB" if self.telescope == "SRT" else "CCC" + self.axis_code = "SRP_TX" if self.telescope == "SRT" else "X" + + def tearDown(self): + # self.boss.clearUserOffset(self.axis_code) + self.boss.setUserOffset(self.axis_code, 0) # TODO + self.boss.park() + time.sleep(0.2) + self.wait_parked() + + def test_wrong_servo_name(self): + """Raise a MinorServoErrorsEx in case of wrong servo name""" + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + with self.assertRaises(MinorServoErrorsEx): + self.boss.setUserOffset(self.axis_code + "WRONG", 0) + + def test_get_offset(self): + self.boss.setup(self.setup_code) + counter = 0 # Seconds + now = time_ref = datetime.datetime.now() + while not self.boss.isReady() or (time_ref - now).seconds < 20: + time.sleep(1) + now = datetime.datetime.now() + + target_offset = 5.0 + self.boss.setUserOffset(self.axis_code, target_offset) + offset = self.boss.getUserOffset()[0] # SRP_TX and X both have index 0 + self.assertAlmostEqual(offset, target_offset, delta=0.1) + + def wait_parked(self): + while self.boss.isParking(): + time.sleep(0.1) + + +if __name__ == '__main__': + if 'Configuration' in os.getenv('ACS_CDB'): + unittest.main() # Real test using the antenna CDB + else: + from testing import simulator + simulator.run(TestUserOffset, 'srt-mscu-sim') diff --git a/SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py b/SRT/Interfaces/SRTMinorServoInterface/test/pyunit/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTMinorServo/test/unittest.cpp b/SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/test/unittest.cpp rename to SRT/Interfaces/SRTMinorServoInterface/test/unittest.cpp diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h new file mode 100644 index 000000000..a3a33a3bc --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/PySRTMinorServoCommandLibrary.h @@ -0,0 +1,130 @@ +#ifndef _PYSRTMINORSERVOCOMMANDLIBRARY_H +#define _PYSRTMINORSERVOCOMMANDLIBRARY_H + +/** + * PySRTMinorServoCommandLibrary.h + * 2021/12/13 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include "SRTMinorServoCommandLibrary.h" + + +namespace MinorServo +{ + /** + * SRT Minor Servo Command Library Python Wrapper + * + * This class wraps the SRTMinorServoCommandLibrary with boost_python in order to grant access to its static functions via Python + */ + class PySRTMinorServoCommandLibrary : public SRTMinorServoCommandLibrary + { + public: + /** + * Builds the command used to ask the general status of the minor servos or, eventually, a single servo + * @param servo_id the ID string of the eventual single servo to retrieve the status. Send no servo_id argument to retrieve the general status of the system + * @return the composed message + */ + static boost::python::object status(const std::string servo_id = ""); + + /** + * Builds the command used to configure the telescope for a specific focal path + * @param configuration the desired focal path to command to the minor servo systems + * @return the composed message + */ + static boost::python::object setup(const std::string& configuration); + + /* + * Builds the command used to stow a single servo system to a given stow position + * @param servo_id the ID string of the single servo to be stowed + * @param stow_position the position to which the servo have to stow to + * @return the composed message + */ + static boost::python::object stow(const std::string& servo_id, unsigned int stow_position = 1); + + /* + * Builds the command used to stop a single servo system + * @param servo_id the ID string of the single servo to be stopped + * @return the composed message + */ + static boost::python::object stop(const std::string& servo_id); + + /* + * Builds the command used to move a single servo to a given set of coordinates + * This is an overload of the original SRTMinorServoCommandLibrary::preset function + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static boost::python::object preset(const std::string& servo_id, const boost::python::list& coordinates); + + /* + * Builds the command used to provide a single tracking set of coordinates to a single servo + * This is an overload of the original SRTMinorServoCommandLibrary::programTrack function + * @param servo_id the ID of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a Python list containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory + * @return the composed message + */ + static boost::python::object programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const boost::python::list& coordinates, double start_time=-1); + + /* + * Builds the command used to provide a set of offsets to a given servo + * This is an overload of the original SRTMinorServoCommandLibrary::offset function + * @param servo_id the ID of the single servo to be moved + * @param coordinates a Python list containing the N coordinates to be sent to the servo + * @return the composed message + */ + static boost::python::object offset(const std::string& servo_id, const boost::python::list& coordinates); + + /* + * Parses the received answer by splitting it and synamically populating a std::map + * This is an overload of the original SRTMinorServoCommandLibrary::parseAnswer function + * @param answer the string containing the answer received from the VBrain proxy + * @return a Python dictionary containing the answer splitted into keys and values. The keys are always strings, the values can either be int, double or strings. + */ + static boost::python::dict parseAnswer(const std::string& answer); + private: + /* + * Converts the given Python list into a C++ std::vector object + * @param py_list the given Python list to be converted + * @return the composed C++ std::vector containing doubles + */ + static std::vector pylist2cppvector(const boost::python::list& py_list); + + /** + * Converts the given std::string to a Python bytestring + * @param command a reference to the given command string + * @return the bytestring containing the given command string + */ + static boost::python::object stringToBytes(const std::string& command); + }; +} + +/* + * The following 3 lines of code allow the overloaded functions to ignore the optional parameter and use the default one defined in the original SRTMinorServoCommandLibrary header file + */ +BOOST_PYTHON_FUNCTION_OVERLOADS(status, MinorServo::PySRTMinorServoCommandLibrary::status, 0, 1) +BOOST_PYTHON_FUNCTION_OVERLOADS(stow, MinorServo::PySRTMinorServoCommandLibrary::stow, 1, 2) +BOOST_PYTHON_FUNCTION_OVERLOADS(programTrack, MinorServo::PySRTMinorServoCommandLibrary::programTrack, 4, 5) + +/* + * Python module definition. Since the original SRTMinorServoCommandLibrary only contains static functions, we write the Python module with static functions only, omitting the class + */ +BOOST_PYTHON_MODULE(libPySRTMinorServoCommandLibrary) +{ + using namespace boost::python; + def("status", &MinorServo::PySRTMinorServoCommandLibrary::status, status(arg("servo_id") = "")); + def("setup", &MinorServo::PySRTMinorServoCommandLibrary::setup); + def("stow", &MinorServo::PySRTMinorServoCommandLibrary::stow, stow(arg("stow_position") = 1)); + def("stop", &MinorServo::PySRTMinorServoCommandLibrary::stop); + def("preset", &MinorServo::PySRTMinorServoCommandLibrary::preset); + def("programTrack", &MinorServo::PySRTMinorServoCommandLibrary::programTrack, programTrack(arg("start_time") = -1)); + def("offset", &MinorServo::PySRTMinorServoCommandLibrary::offset); + def("parseAnswer", &MinorServo::PySRTMinorServoCommandLibrary::parseAnswer); +} +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h index 4eb606149..702334252 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoCommandLibrary.h @@ -7,66 +7,89 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ +#include "SRTMinorServoContainers.h" #include #include -#include -#include +#include +#include -/** - * SRT Minor Servo Command Library - * - * This class features static functions used to build commands to be sent to the PON minor servo control unit of the Sardinia Radio Telescope - */ -class SRTMinorServoCommandLibrary + +#define CLOSER std::string("\r\n") + + +namespace MinorServo { -public: /** - * Builds the command used to ask the status of the MSCU or, eventually, a single servo - * @param servo_id the ID number of the eventual single servo to retrieve the status - * @return the composed message + * SRT Minor Servo Command Library + * + * This class features static functions used to build commands to be sent to the PON minor servo control unit of the Sardinia Radio Telescope */ - static std::string status(int servo_id = -1); + class SRTMinorServoCommandLibrary + { + public: + /** + * Builds the command used to ask the status of the MSCU or, eventually, a single servo + * @param servo_id the ID string of the eventual single servo to retrieve the status. Send no servo_id argument to retrieve the general status of the system + * @return the composed message + */ + static std::string status(const std::string servo_id = ""); - /** - * Builds the command used to configure the telescope for an observation - * @param configuration the desired observing configuration - * @return the composed message - */ - static std::string setup(std::string configuration); + /** + * Builds the command used to configure the telescope for a specific focal path + * @param configuration the desired focal path to command to the minor servo systems + * @return the composed message + */ + static std::string setup(const std::string& configuration); - /* - * Builds the command used to stow a single servo system to a given stow position - * @param servo_id the ID number of the single servo to be stowed - * @param stow_position the position to which the servo have to stow to - * @return the composed message - */ - static std::string stow(unsigned int servo_id, unsigned int stow_position = 0); + /* + * Builds the command used to stow a single servo system to a given stow position + * @param servo_id the ID string of the single servo to be stowed + * @param stow_position the position to which the servo have to stow to + * @return the composed message + */ + static std::string stow(const std::string& servo_id, const unsigned int stow_position = 1); - /* - * Builds the command used to stop a single servo system - * @param servo_id the ID number of the single servo to be stopped - * @return the composed message - */ - static std::string stop(unsigned int servo_id); + /* + * Builds the command used to stop a single servo system + * @param servo_id the ID string of the single servo to be stopped + * @return the composed message + */ + static std::string stop(const std::string& servo_id); - /* - * Builds the command used to move a single servo to a given set of coordinates - * @param servo_id the ID number of the single servo to be moved - * @param coordinates a vector containing the N coordinates to be sent to the servo - * @return the composed message - */ - static std::string preset(unsigned int servo_id, std::vector coordinates); + /* + * Builds the command used to move a single servo to a given set of virtual coordinates + * @param servo_id the ID string of the single servo to be moved + * @param coordinates a vector containing the N coordinates to be sent to the servo + * @return the composed message + */ + static std::string preset(const std::string& servo_id, const std::vector& coordinates); - /* - * Builds the command used to provide a single tracking set of coordinates to a single servo - * @param servo_id the ID number of the single servo to send the command to - * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to - * @param point_id the ID number of the given set of coordinates inside the trajectory - * @param coordinates a vector containing the N coordinates the servo have to move to at the given time - * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX epoch of the starting instant of the trajectory - * @return the composed message - */ - static std::string programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time = -1); -}; + /* + * Builds the command used to provide a single tracking point of virtual coordinates to a single servo + * @param servo_id the ID string of the single servo to send the command to + * @param trajectory_id the ID number of the trajectory the given set of coordinates belongs to + * @param point_id the ID number of the given set of coordinates inside the trajectory + * @param coordinates a vector containing the N coordinates the servo have to move to at the given time + * @param start_time only mandatory for the first point in the trajectory, a double representing the UNIX Epoch of the starting instant of the trajectory + * @return the composed message + */ + static std::string programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const std::vector& coordinates, const double start_time = 0); + + /* + * Builds the command used to send a set of virtual offsets to a single servo + * @param servo_id the ID string of the single servo to send the offsets to + * @param coordinates a vector containing the N offsets to be added the servo coordinates + * @return the composed message + */ + static std::string offset(const std::string& servo_id, const std::vector& coordinates); + + /* + * Parses the received answer by splitting it and dynamically populating a SRTMinorServoAnswerMap object + * @param original_answer the string containing the answer received from the VBrain proxy + * @return a SRTMinorServoAnswerMap dictionary containing the answer splitted into keys and values. The keys are always std::string, the values can either be long, double or std::string. + */ + static SRTMinorServoAnswerMap parseAnswer(const std::string& original_answer); + }; +} #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h new file mode 100644 index 000000000..dfea1df66 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -0,0 +1,894 @@ +#ifndef __SRTMINORSERVOCONTAINERS_H__ +#define __SRTMINORSERVOCONTAINERS_H__ + +/** + * SRTMinorServoContainers.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "SRTMinorServoUtils.h" + + +namespace MinorServo +{ + /** + * Object used to store some info regarding a scan. + */ + struct SRTMinorServoScan + { + /** + * Name of the servo involved in the scan. + */ + std::string servo_name = ""; + + /** + * Name of the axis involved in the scan. + */ + std::string axis_name = ""; + + /** + * Index of the axis involved in the scan. + */ + size_t axis_index = 0; + + /** + * Range of the scan. + */ + double scan_range = 0; + + /** + * Starting time of the scan. + */ + ACS::Time start_time = 0; + + /** + * Closing time of the scan. + */ + ACS::Time close_time = 0; + + /** + * Duration of the scan. + */ + ACS::TimeInterval scan_duration = 0; + + /** + * Central position of the scan axis. + */ + double central_position = 0; + + /** + * Starting elevation for the scan. + */ + double starting_elevation = 0; + }; + + /** + * This dictionary contains information regarding the possibile focal configurations. + * The key indicates the configuration as known by DISCOS. + * The value is a pair, the first element of the pair is the DISCOS enumeration for the relative Leonardo configuration, + * the second element of the pair indicates whether the configuration has a ASACTIVE twin configuraiton. + */ + using DiscosConfigurationNameTableType = std::map>; + const DiscosConfigurationNameTableType DiscosConfigurationNameTable = + { + {"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, + {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, + {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, + {"QQG", std::make_pair(CONFIGURATION_GREGORIAN4, true )}, + {"TRI", std::make_pair(CONFIGURATION_GREGORIAN5, true )}, + {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, + {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, + {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, + }; + + /** + * This dictionary contains the Leonardo focal configurations DISCOS enumerations, alongside their name inside the Leonardo minor servo system. + */ + using LDOConfigurationNameTableType = boost::bimap; + const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of + (CONFIGURATION_PRIMARY, "Primario") + (CONFIGURATION_GREGORIAN1, "Gregoriano 1") + (CONFIGURATION_GREGORIAN2, "Gregoriano 2") + (CONFIGURATION_GREGORIAN3, "Gregoriano 3") + (CONFIGURATION_GREGORIAN4, "Gregoriano 4") + (CONFIGURATION_GREGORIAN5, "Gregoriano 5") + (CONFIGURATION_GREGORIAN6, "Gregoriano 6") + (CONFIGURATION_GREGORIAN7, "Gregoriano 7") + (CONFIGURATION_GREGORIAN8, "Gregoriano 8") + (CONFIGURATION_BWG1, "BWG1") + (CONFIGURATION_BWG2, "BWG2") + (CONFIGURATION_BWG3, "BWG3") + (CONFIGURATION_BWG4, "BWG4"); + + /** + * This dictionary containes the Leonardo focal configurations DISCOS enumerations, alongside their ID counterpart as read from the Leonardo minor servo system proxy. + */ + using LDOConfigurationIDTableType = boost::bimap; + const LDOConfigurationIDTableType LDOConfigurationIDTable = boost::assign::list_of + (CONFIGURATION_UNKNOWN, 0) + (CONFIGURATION_PRIMARY, 1) + (CONFIGURATION_GREGORIAN1, 11) + (CONFIGURATION_GREGORIAN2, 12) + (CONFIGURATION_GREGORIAN3, 13) + (CONFIGURATION_GREGORIAN4, 14) + (CONFIGURATION_GREGORIAN5, 15) + (CONFIGURATION_GREGORIAN6, 16) + (CONFIGURATION_GREGORIAN7, 17) + (CONFIGURATION_GREGORIAN8, 18) + (CONFIGURATION_BWG1, 21) + (CONFIGURATION_BWG2, 22) + (CONFIGURATION_BWG3, 23) + (CONFIGURATION_BWG4, 24); + + using SRTMinorServoLookupTable = std::map>; + + /** + * This class implements a queue of time tagged positions. it extends a simple std::map with some specific methods. + */ + class SRTMinorServoPositionsQueue : private std::map> + { + public: + /** + * Default constructor. Used only for lazy initialization. + */ + SRTMinorServoPositionsQueue() : std::map>(), m_queue_size(0), m_vector_size(0), m_mutex() {} + + /** + * Constructor with queue size as parameter. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + */ + SRTMinorServoPositionsQueue(size_t queue_size) : std::map>(), m_queue_size(queue_size), m_vector_size(0), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + } + + /** + * Constructor with queue size and vector size as parameters. + * @param queue_size the maximum size of the queue. Once this value is reached the oldest entry gets discarded. + * @param vector_size the length of the vectors that this object will store. Once set it cannot be changed. This assures we are always dealing with the same number of virtual axes. + */ + SRTMinorServoPositionsQueue(size_t queue_size, size_t vector_size) : std::map>(), m_queue_size(queue_size), m_vector_size(vector_size), m_mutex() + { + std::unique_lock lock(m_mutex); + queueLazyInit(queue_size); + vectorLazyInit(vector_size); + } + + /** + * Custom assignment operator. It locks both the current object and the passed one with a mutex in order for the assignment operation to be thread safe. + * @param other the other SRTMinorServoPositionsQueue we are assigning its value to the current object. + * @return the newly populated SRTMinorServoPositionsQueue object. + */ + SRTMinorServoPositionsQueue& operator=(const SRTMinorServoPositionsQueue& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::unique_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + m_queue_size = other.m_queue_size; + m_vector_size = other.m_vector_size; + std::map>::operator=(other); + } + + return *this; + } + + /** + * Put method, with initializer list argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::initializer_list& values) + { + put(key, std::vector(values)); + } + + /** + * Put method, with ACS::doubleSeq argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const ACS::doubleSeq& values) + { + put(key, std::vector(values.get_buffer(), values.get_buffer() + values.length())); + } + + /** + * Put method, with std::vector argument. + * @param key the time the given coordinates are related to. + * @param values the given set of coordinates. + */ + void put(ACS::Time key, const std::vector& values) + { + std::unique_lock lock(m_mutex); + + vectorLazyInit(values.size()); + queueLazyInit(m_queue_size); + if(std::map>::size() == m_queue_size) + { + // Remove the oldest one + this->erase(this->begin()); + } + this->emplace(std::make_pair(key, values)); + } + + /** + * Get method. It retrieves a set of coordinates from a given ACS::Time, giving back the time as well. + * @param key the time the user wants to retrieve the related coordinates. + * @param exact a boolean indicating whether the user wants to interpolate (false) or not (true). + * @throw std::logic_error when the queue is empty. + * @throw std::out_of_range when the exact point was not found in the queue. + * @return a std::pair containing the ACS::Time as first element and the set of coordinates as second element. + */ + std::pair> get(ACS::Time key, bool exact = false) + { + std::shared_lock lock(m_mutex); + + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + + if(const SRTMinorServoPositionsQueue::iterator point = this->find(key); point != this->end()) + { + return *point; + } + else if(exact) + { + // Exact point not found, we throw an exception + throw std::out_of_range("Exact point not found!"); + } + else + { + // Key not found, should check outside the boundaries or interpolate + if(key <= this->begin()->first) + { + // Aksed for a timestamp older than the earliest point in the queue + return *this->cbegin(); + } + else if(key >= this->rbegin()->first) + { + // Asked for a timestamp newer than the latest point in the queue + return *this->crbegin(); + } + else + { + std::vector positions(m_vector_size, 0.0); + SRTMinorServoPositionsQueue::iterator p0, p1; + p1 = this->lower_bound(key); + p0 = p1; + p0--; + + // Calculate the linear fit for each position + double fraction = (key - p0->first) / (p1->first - p0->first); + + for(size_t i = 0; i < m_vector_size; i++) + { + positions[i] = p0->second[i] + fraction * (p1->second[i] - p0->second[i]); + } + + return std::make_pair(key, (const std::vector)positions); + } + } + } + + /** + * Size method thread safe override. + * @return the number of elements in the queue. + */ + size_t size() const + { + std::shared_lock lock(m_mutex); + return std::map>::size(); + } + + /** + * Clear method, thread safe. It empties the queue. + */ + void clear() + { + std::unique_lock lock(m_mutex); + std::map>::clear(); + } + + /** + * This method returns the number of points having a higher tag time than the one passed as argument. + * @param t the time threshold. This method counts and returns the number of points having a higher time than this value. + * @throw std::logic_error when the queue is empty. + * @return the number of points having a higher time than the given one. + */ + size_t getRemainingPoints(ACS::Time t) + { + std::shared_lock lock(m_mutex); + if(this->empty()) + { + throw std::logic_error("The queue is empty!"); + } + return std::distance(this->lower_bound(t), this->end()); + } + + private: + /** + * This method gets called by the constructors for the lazy intialization of the queue size value. + * @param queue_size the desired maximum queue size. + * @throw std::length_error when the desired queue size is equal to 0 or when it is greater than the maximum size that can be currently allocated. + */ + void queueLazyInit(size_t queue_size) + { + if(m_queue_size == 0) + { + if(queue_size == 0) + { + // The maximum queue size was not set yet + throw std::length_error("Queue length cannot be 0."); + } + else if(queue_size > this->max_size()) + { + // The requested size is greater than the maximum possible queue size + throw std::length_error("Queue length cannot exceed " + std::to_string(this->max_size()) + "."); + } + else + { + m_queue_size = queue_size; + } + } + } + + /** + * This method gets called by the constructors for the lazy initialization of the vector size value. + * @param vector_size the desired length of the vector containing the set of points. + * @throw std::length_error when the desired vector size is equal to 0 or when it is longer than 6. We don't have more than 6 axes, so we hard cap this value to 6. + * It also throws this when the user tries to insert a vector with different lenght then the already defined one. This ensures all stored vecors are of equal length. + */ + void vectorLazyInit(size_t vector_size) + { + if(vector_size == 0) + { + throw std::length_error("Vector length cannot be 0."); + } + else if(vector_size > 6) + { + // Hard cap to 6, we don't need more + throw std::length_error("Vector length cannot be longer than 6."); + } + else if(m_vector_size == 0) + { + m_vector_size = vector_size; + } + else if(m_vector_size != vector_size) + { + throw std::length_error("New vector length does not match the initial one."); + } + } + + /** + * The maximum size of the queue. + */ + size_t m_queue_size; + + /** + * The desired length of the vectors stored by this object. + */ + size_t m_vector_size; + + /** + * The shared mutex used for access synchronization. + */ + mutable std::shared_mutex m_mutex; + }; + + + class SRTMinorServoAnswerMap : private std::map> + { + /** + * This class privately extends the type std::map>. + * It is therefore an std::map which can hold different types of values, such as long, double and str::string, in the same container. + * It is used to store the answers received from the SRTMinorServo Leonardo system. + * This design was critical since all the received values have heterogeneous keys and values. + * With this object, the SRTMinorServoSocket can correctly retrieve and store all the received values without having to know the keys or types a priori. + */ + + /* + * Declare this class as friend since it will have to iterate through the inner map + */ + friend class PySRTMinorServoCommandLibrary; + public: + /** + * Use the same clear method of the parent class + */ + using std::map>::clear; + + /** + * Default constructor, initialize the std::map object and the synchronization mutex + */ + SRTMinorServoAnswerMap() : std::map>(), m_mutex() {} + + /** + * Initialize the std::map with the content of another SRTMinorServoAnswerMap, initialize the mutex, lock both objects + * @param other the SRTMinorServoAnswerMap with which the content of the current object will be initialized + */ + SRTMinorServoAnswerMap(const SRTMinorServoAnswerMap& other) : m_mutex() + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + /** + * Assignment operator. It lock both the current object and the assigned one's mutexes + * @param other the SRTMinorServoAnswerMap which values have to be stored in the current object + */ + SRTMinorServoAnswerMap& operator=(const SRTMinorServoAnswerMap& other) + { + if(this != &other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + static_cast>&>(*this) = static_cast>&>(other); + } + + return *this; + } + + /** + * Update operator. It merges the current object with the elements of another object + * @param other the SRTMinorServoAnswerMap which values have to be copied inside the current object + */ + SRTMinorServoAnswerMap& operator+=(const SRTMinorServoAnswerMap& other) + { + std::unique_lock lockThis(m_mutex, std::defer_lock); + std::shared_lock lockOther(other.m_mutex, std::defer_lock); + std::lock(lockThis, lockOther); + for(const auto& entry : other) + { + this->operator[](entry.first) = entry.second; + } + + return *this; + } + + /** + * Equality operator, only check the std::map and avoid comparing the mutexes, which will obviously be different + * @param other the SRTMinorServoAnswerMap object to compare the current object with + */ + bool operator==(const SRTMinorServoAnswerMap& other) const + { + return static_cast>&>(*this) == static_cast>&>(other); + } + + /** + * get method. It must be used with a template parameter, in order for the SRTMinorServoAnswerMap to be able to retrieve the correct type of object for the given key. + * The method will automatically convert the retrieved long, double or std::string to the given template type. + * @param T the type (i.e.: int, long, double, char*) of the object to be retrieved. It can be anything derived from integral, floating point or string values. + * @param key the key assigned to the value you want to retrieve + * @return the value associated to given key 'key', returned as template type 'T', if possible. Be aware that some casts (i.e.: long to int, double to float) will lose precision and/or overflow + * @throw std::bad_variant_access when retrieving the stored value by asking the wrong type (i.e.: stored type is a double but T is char*) + * @throw std::runtime_error when attempting to retrieve a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + T get(const std::string& key) const + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::shared_lock lock(m_mutex); + + try + { + if constexpr(std::is_integral_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(std::is_floating_point_v) + { + return (T)std::get(this->at(key)); + } + else if constexpr(is_string_v) + { + return (T)std::get(this->at(key)).c_str(); + } + } + catch(std::out_of_range& ex) + { + std::cout << "PLAIN_COMMAND: " << this->getPlainCommand(); + std::cout << "PLAIN_ANSWER:" << this->getPlainAnswer(); + throw ex; + } + } + + /** + * put method. The template parameter is automatically deducted from the 'value' argument. Stores the given 'value' associated with key 'key' + * @param key the key associated to the stored value 'value' + * @param value the value we are storing with the given key 'key' + * @throw std::runtime_error when attempting to store a value with a type which cannot be stored in the container (anything not integral, not floating point and not similar to std::string) + */ + template + void put(const std::string& key, const T& value) + { + if constexpr(std::negation_v>) + { + throw std::runtime_error("Unsupported type."); + } + + std::unique_lock lock(m_mutex); + + if constexpr(std::is_integral_v) + { + this->operator[](key) = long(value); + } + else if constexpr(std::is_floating_point_v) + { + this->operator[](key) = double(value); + } + else if constexpr(is_string_v) + { + this->operator[](key) = std::string(value); + } + } + + /** + * This method checks whether the container holds a value for the given key 'key' + * @param key the key for the value we want to check if it's present in the container + * @return true if the value is present in the container, false otherwise + */ + bool contains(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->find(key) != this->end(); + } + + /** + * This methods returns the std::variant type index for the value associated to the given key 'key' + * @param key the key for the value we want to retrieve the type index + * @throw std::out_of_range if the key is not found in the object + * @return 0 for long, 1 for double, 2 for std::string + */ + unsigned int index(const std::string& key) const + { + std::shared_lock lock(m_mutex); + return this->at(key).index(); + } + + /** + * This method checks whether the contained answer to a command sent to the SRTMinorServo system was positive or not + * @return true if the command was correctly accepted, false if the command was not accepted or the 'OUTPUT' key was not found (unlikely scenario) + */ + const bool checkOutput() const + { + std::shared_lock lock(m_mutex); + try + { + if(this->get("OUTPUT") == "GOOD") + { + return true; + } + } + catch(std::out_of_range& ex) + { + // Key not found + } + + return false; + } + + /** + * This method retrieves the ACS::Time associated with the received answer map. It converts the value from UNIX Epoch (double) to ACS::Time + * @return the ACS::Time associated with the answer map + */ + const ACS::Time getTimestamp() const + { + std::shared_lock lock(m_mutex); + return IRA::CIRATools::UNIXEpoch2ACSTime(this->get("TIMESTAMP")); + } + + /** + * This method returns the plain command sent using the socket. Useful for log purposes. + * @return a std::string containing the plain command sent using the socket. + */ + const std::string getPlainCommand() const + { + std::shared_lock lock(m_mutex); + return this->get("PLAIN_COMMAND"); + } + + /** + * This method returns the plain answer received from the socket. Useful for log purposes. + * @return a std::string containing the plain answer received from the socket. + */ + const std::string getPlainAnswer() const + { + std::shared_lock lock(m_mutex); + return this->get("PLAIN_ANSWER"); + } + + protected: + /** + * Shared mutex to control read and write accesses. Multiple reading access are permitted and will only block writing access. Writing access will block all accesses + */ + mutable std::shared_mutex m_mutex; + }; + + /** + * This class is a specialization of the SRTMinorServoAnswerMap for the general Leonardo Minor Servo System status. + */ + class SRTMinorServoGeneralStatus : public SRTMinorServoAnswerMap + { + public: + /** + * Retrieves the current configuration from the map. + * @return the current SRTMinorServoFocalConfiguration. + */ + SRTMinorServoFocalConfiguration getFocalConfiguration() const + { + return LDOConfigurationIDTable.right.at(this->get("CURRENT_CONFIG")); + } + + /** + * Retrieves a boolean indicating whether the simulation is enabled or not. + * @returns a boolean indicating whether the simulation is enabled or not. + */ + Management::TBoolean isSimulationEnabled() const + { + return this->get("SIMULATION_ENABLED") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the PLC time of the reading. + * @return a double indicating the PLC time, expressed as UNIX Epoch. + */ + double getPLCTime() const + { + return this->get("PLC_TIME"); + } + + /** + * Returns the firmware version present on the PLC. + * @return a string containing the firmware version. + */ + ACE_CString getPLCVersion() const + { + return this->get("PLC_VERSION").c_str(); + } + + /** + * Returns who is controlling the Leonardo Minor Servo System. + * @return an enum indicating who is controlling the system. + */ + SRTMinorServoControlStatus getControl() const + { + return SRTMinorServoControlStatus(this->get("CONTROL") - 1); + } + + /** + * Returns a boolean indicating whether the system is powered on or not. + * @return a boolean indicating whether the system is powered on or not. + */ + Management::TBoolean hasPower() const + { + return this->get("POWER") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Is the emergency stop pressed somewhere? Is there an emergency situation? + * @return a boolean indicating if an emergency is present or not. + */ + Management::TBoolean emergencyPressed() const + { + return this->get("EMERGENCY") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the position of the gregorian cover. + * @return an enum indicating the position of the gregorian cover. + */ + SRTMinorServoGregorianCoverStatus getGregorianCoverPosition() const + { + return SRTMinorServoGregorianCoverStatus(this->get("GREGORIAN_CAP")); + } + + /** + * Returns the UNIX Epoch of the last executed command. + * @return a double containing the UNIX Epoch of the last executed command. + */ + double getLastExecutedCommand() const + { + return this->get("LAST_EXECUTED_COMMAND"); + } + }; + + /** + * This class is a specialization of the SRTMinorServoAnswerMap for a single servo status of the Leonardo Minor Servo System. + */ + class SRTMinorServoStatus : public SRTMinorServoAnswerMap + { + public: + /** + * Constructor. Accepts some lists of labels in order to correctly retrieve the values from the map. + * @param servo_name the servo name used as a prefix when retrieving the values. + * @param physical_axes_enabled the labels used to retrieve the status of each physical axis. + * @param physical_positions the labels used to retrieve the position of each physical axis. + * @param virtual_positions the labels used to retrieve the position of each virtual axis. + * @param virtual_offsets the labels used to retrieve the offset of each virtual axis. + */ + SRTMinorServoStatus( + const std::string& servo_name, + const std::vector& physical_axes_enabled, + const std::vector& physical_positions, + const std::vector& virtual_positions, + const std::vector& virtual_offsets + ) : + SRTMinorServoAnswerMap(), + m_servo_name(servo_name), + m_physical_axes_enabled(physical_axes_enabled), + m_physical_positions(physical_positions), + m_virtual_positions(virtual_positions), + m_virtual_offsets(virtual_offsets) + {} + + /** + * Returns a boolean indicating whether the servo is enabled. + * @returns true if enabled, false otherwise. + */ + Management::TBoolean isEnabled() const + { + return this->get(m_servo_name + "_ENABLED") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the status of the servo drive cabinet. + * @returns an enum indicating the status of the servo drive cabinet. + */ + SRTMinorServoCabinetStatus getDriveCabinetStatus() const + { + return SRTMinorServoCabinetStatus(this->get(m_servo_name + "_STATUS") - 1); + } + + /** + * Returns a boolean indicating whether the servo is blocked or not. + * @return true if the servo is blocked, false otherwise. + */ + Management::TBoolean isBlocked() const + { + return this->get(m_servo_name + "_BLOCK") == 1 ? Management::MNG_TRUE : Management::MNG_FALSE; + } + + /** + * Returns the operative mode of the servo. + * @return an enum indicating the operative mode of the servo. + */ + SRTMinorServoOperativeMode getOperativeMode() const + { + return SRTMinorServoOperativeMode(this->get(m_servo_name + "_OPERATIVE_MODE") / 10); + } + + /** + * Returns the status of each physical axis. + * @return a boolean sequence, true if the axis is enabled, false otherwise. + */ + ACS::booleanSeq getPhysicalAxesEnabled() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_physical_axes_enabled); + } + + /** + * Returns the position of each physical axis. + * @return a double sequence containing the position of each physical axis. + */ + ACS::doubleSeq getPhysicalPositions() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_physical_positions); + } + + /** + * Returns the plain position of each virtual axis. + * @return a double sequence containing the plain position of each virtual axis. + */ + ACS::doubleSeq getPlainVirtualPositions() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_virtual_positions); + } + + /** + * Returns the actual position of each virtual axis, minus the offset. + * @return a double sequence containing the position of each virtual axis, minus the offset. + */ + ACS::doubleSeq getVirtualPositions() const + { + std::shared_lock lock(m_mutex); + ACS::doubleSeq virtual_positions = getPlainVirtualPositions(); + ACS::doubleSeq virtual_offsets = getVirtualOffsets(); + for(size_t i = 0; i < virtual_positions.length(); i++) + { + virtual_positions[i] -= virtual_offsets[i]; + } + + return virtual_positions; + } + + /** + * Returns the offset of each virtual axis. + * @return a double sequence containing the offset of each virtual axis. + */ + ACS::doubleSeq getVirtualOffsets() const + { + std::shared_lock lock(m_mutex); + return getSequence(m_virtual_offsets); + } + + private: + /** + * This method extracts a sequence, either boolean or double, from the map, and returns it. + * @param labels a vector of strings containing the labels to use in order to extract the corresponding values from the map. + * @return the composed sequence of booleans or doubles. + */ + template >> + T getSequence(const std::vector& labels) const + { + T sequence; + sequence.length(labels.size()); + + for(size_t i = 0; i < labels.size(); i++) + { + if constexpr(std::is_same_v) + { + sequence[i] = (bool)this->get(m_servo_name + "_" + labels[i]); + } + else if constexpr(std::is_same_v) + { + sequence[i] = this->get(m_servo_name + "_" + labels[i]); + } + } + + return sequence; + } + + /** + * The name of the servo, this is used as prefix when retrieving values from the map. + */ + const std::string m_servo_name; + + /** + * The labels for the enabled value of each physical axis. + */ + const std::vector m_physical_axes_enabled; + + /** + * The labels for the positions of each physical axis. + */ + const std::vector m_physical_positions; + + /** + * The labels for the positions of each virtual axis. + */ + const std::vector m_virtual_positions; + + /** + * The labels for the offsets of each virtual axis. + */ + const std::vector m_virtual_offsets; + }; +} + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h new file mode 100644 index 000000000..a4a48973a --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoSocket.h @@ -0,0 +1,203 @@ +#ifndef __SRTMINORSERVOSOCKET_H__ +#define __SRTMINORSERVOSOCKET_H__ + +/** + * SRTMinorServoSocket.h + * 2023/02/23 + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +#include +#include +#include +#include +#include "SRTMinorServoCommandLibrary.h" + +#define SOCKET_TIMEOUT 0.1 +#define CONFIG_DOMAIN "alma/" +#define CONFIG_DIRNAME "/MINORSERVO/Socket" + +namespace MinorServo +{ + /** + * Testing class forward declaration. + * The declaration of this class can be found in the SRTMinorServoTestingSocket.h header file. + * A developer must use this class for testing purposes if he needs to destroy the singleton socket instance as well. + */ + class SRTMinorServoTestingSocket; + + class SRTMinorServoSocket: public IRA::CSocket + { + /** + * This class implements a singleton socket. The singleton pattern was necessary to provide each servo system component communication capabilities with the Leonardo system. + * As long as all the said components run on the same container this will only be instanced once. + */ + public: + /** + * Calls the constructor and returns the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed + * @throw MinorServoErrors::MinorServoErrorsEx when the user calls this method a second time with different IP address and port arguments + * @return the singleton socket instance, eventually connected to the given IP address and port, by reference + */ + static SRTMinorServoSocket& getInstance(std::string ip_address, int port, double timeout=SOCKET_TIMEOUT); + + /** + * Returns the previously generated singleton socket instance + * @throw MinorServoErrors::MinorServoErrorsExImpl when the user calls this method when the instance has not been generated yet + * @return the singleton socket instance, by reference + */ + static SRTMinorServoSocket& getInstance(); + + /** + * Sends a command on the socket and returns the received answer, if any + * @param command the command to be sent over the socket + * @param map, optional SRTMinorServoAnswerMap object. If provided, the 'map' argument content gets updated with the newly received answer + * @throw MinorServoErrors::MinorServoErrorsEx when the operation of sending or receiving fails unexpectedly + * @return the received answer to the given command + */ + SRTMinorServoAnswerMap sendCommand(std::string command, std::optional> map = {}); + + /** + * Copy constructor operator disabled by default + */ + SRTMinorServoSocket(SRTMinorServoSocket const&) = delete; + + /** + * Copy assignment operator disabled by default + */ + void operator=(SRTMinorServoSocket const&) = delete; + + /** + * Method to check if socket is connected + * @return true if the socket is connected, false otherwise + */ + const bool isConnected() const; + + private: + /** + * Declare the testing class as friend class in order for it to have access to private members for testing purposes + */ + friend class SRTMinorServoTestingSocket; + + /** + * Constructor method. Generates the singleton socket instance + * @param ip_address the IP address to which the socket will connect + * @param port the port to which the socket will connect + * @param timeout the timeout, in seconds, for the communication to be considered failed + */ + SRTMinorServoSocket(std::string ip_address, int port, double timeout); + + /** + * Destructor method. Closes the socket upon destruction + */ + ~SRTMinorServoSocket(); + + /** + * Connection function. It gets called every time the socket gets disconnected + * throw MinorServoErrors::MinorServoErrorsEx when the connection attempt fails + */ + void connect(); + + /** + * Instance of the socket. By default it gets initialized to a null pointer + */ + inline static SRTMinorServoSocket* m_instance = nullptr; + + /** + * IP address and port of the socket. Being object members their values only exist when a singleton socket object is created correctly + */ + std::string m_ip_address; + int m_port; + + /** + * Timeout for communication operations + */ + double m_timeout; + + /** + * Mutex object used to syncronize communications and prevent collisions between multiple threads + */ + std::mutex m_mutex; + + /** + * Library mutex, used only to synchronize the getInstance methods + */ + static std::mutex c_mutex; + + /** + * Socket status enumerator + */ + enum socket_status + { + NOTREADY, + TIMEOUT, + READY + } m_socket_status; + + /** + * Socket error variable. This stores an error condition in case it arises + */ + IRA::CError m_error; + }; + + + class SRTMinorServoSocketConfiguration + { + /** + * This class implements a singleton socket configuration object. The singleton pattern was necessary to provide each servo system component access to the singleton socket parameters. + * As long as all the said components run on the same container this will only be instanced once. + * The first component to instantiate the singleton configuration will also instantiate the socket, opening communications. + */ + public: + /** + * Calls the constructor and returns the singleton socket configuration instance + * @param containerServices, the container services necessary to read the configuration from the CDB + * @return the singleton socket configuration instance + */ + static SRTMinorServoSocketConfiguration& getInstance(maci::ContainerServices* containerServices); + + /** + * Copy constructor operator disabled by default + */ + SRTMinorServoSocketConfiguration(SRTMinorServoSocketConfiguration const&) = delete; + + /** + * Copy assignment operator disabled by default + */ + void operator=(SRTMinorServoSocketConfiguration const&) = delete; + + /** + * IP address and port of the socket configuration + */ + std::string m_ip_address; + int m_port; + + /** + * Timeout for communication operations + */ + double m_timeout; + + private: + /** + * Constructor method + * @param containerServices, the container services necessary to read the configuration from the CDB + * @return the socket configuration object + */ + SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices); + + /** + * Destructor method + */ + ~SRTMinorServoSocketConfiguration(); + + /** + * Instance of the socket configuration object. By default it gets initialized to a null pointer + */ + inline static SRTMinorServoSocketConfiguration* m_instance = nullptr; + }; +} + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h new file mode 100644 index 000000000..da33e9dd9 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoTestingSocket.h @@ -0,0 +1,25 @@ +#include "SRTMinorServoSocket.h" + +namespace MinorServo +{ + class SRTMinorServoTestingSocket: public SRTMinorServoSocket + { + /** + * This class is a friend class of SRTMinorServoSocket. It can be used for testing purposes without altering the behavior of the original class. + */ + public: + /** + * This method explicitly destroys the singleton socket instance. + * Each test in the same test file is executed under the same process, therefore a singleton instance that does not get destroyed will still exist in the next executed tests. + * We want to test a new instance of the socket every time, therefore the existence of this method is critical. + */ + static void destroyInstance() + { + if(SRTMinorServoSocket::m_instance != nullptr) + { + delete SRTMinorServoSocket::m_instance; + SRTMinorServoSocket::m_instance = nullptr; + } + } + }; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h new file mode 100644 index 000000000..5df5c9eb1 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoUtils.h @@ -0,0 +1,144 @@ +#ifndef _SRTMINORSERVOUTILS_H +#define _SRTMINORSERVOUTILS_H +#include +#include +#include +#include +#include +#include + +/** + * The following templates are useful if you want to check if a given type for the SRTMinorServoAnswerMap is accepted + */ +template +struct is_atomic { static constexpr bool value = false; }; + +template +struct is_atomic> { static constexpr bool value = true; }; + +template +inline constexpr bool is_atomic_v = is_atomic::value; + +template +struct is_any : public std::disjunction...> {}; + +template +inline constexpr bool is_any_v = (std::is_same_v || ...); + +template +struct is_string : public std::disjunction, char*, const char*, std::string>> {}; + +template +inline constexpr bool is_string_v = is_string::value; + +template +struct is_known : public std::disjunction>, is_string>> {}; + +template +inline constexpr bool is_known_v = is_known::value; + +template , std::is_same>>>> +struct DB_type +{ + using type = std::conditional_t, std::is_same>>, IRA::CString, std::conditional_t, long, double>>; +}; + +template +T getCDBValue(maci::ContainerServices* container_services, const std::string& field, const std::string component = "") +{ + using C = typename DB_type::type; + + C temp; + if(IRA::CIRATools::getDBValue(container_services, field.c_str(), temp, "alma/", component.c_str())) + { + if constexpr(std::is_same_v>) + { + std::vector values; + std::istringstream iss(std::string(temp).c_str()); + std::string token; + while(std::getline(iss, token, ',')) + { + double value; + try + { + value = std::stod(token); + } + catch(std::invalid_argument& ia) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setFieldName(field.c_str()); + throw ex.getComponentErrorsEx(); + } + catch(std::out_of_range& oor) + { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setValueName(field.c_str()); + ex.setValueLimit(token.find('-') == std::string::npos ? std::numeric_limits::max() : std::numeric_limits::min()); + throw ex.getComponentErrorsEx(); + } + + values.push_back(value); + } + return values; + } + else if constexpr(std::is_same_v) + { + return (T)std::string(temp).c_str(); + } + else + { + return T(temp); + } + } + else + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoUtils::getCDBValue()"); + ex.setFieldName(field.c_str()); + throw ex.getComponentErrorsEx(); // Maybe throw the plain ex + } +} + +const char* getReasonFromEx(const auto& ex) +{ + std::string reason = "Unknown reason"; + + for(auto [name, value] : ex.errorTrace.data) + { + if(strcmp(name, "Reason") == 0) + { + reason = value; + break; + } + } + + return reason.c_str(); +} + +const char* getErrorFromEx(const auto& ex) +{ + std::string error(ex.errorTrace.routine); + + for(auto [name, value] : ex.errorTrace.data) + { + if(strcmp(name, "Reason") == 0) + { + error += ": " + std::string(value); + break; + } + } + + return error.c_str(); +} + +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wunused-function") + +static std::ostream& operator<<(std::ostream& out, const std::variant& value) +{ + std::visit([&out](const auto& val) { out << val; }, value); + return out; +} + +C11_IGNORE_WARNING_POP + +#endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile index ab438abf3..9bc719dce 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/Makefile +++ b/SRT/Libraries/SRTMinorServoLibrary/src/Makefile @@ -23,7 +23,7 @@ USER_CFLAGS = -Wall # # additional include and library search paths # USER_INC = /usr/local/include -USER_LIB = -lgsl -lgslcblas -lm +# USER_LIB = # # MODULE CODE DESCRIPTION: @@ -35,11 +35,15 @@ USER_LIB = -lgsl -lgslcblas -lm # C programs (public and local) # ----------------------------- EXECUTABLES = -EXECUTABLES_L = +EXECUTABLES_L = + +xxxxx_OBJECTS = +xxxxx_CFLAGS = +xxxxx_LIBS = # # -xxxxx_OBJECTS = +xxxxx_OBJECTS = xxxxx_LDFLAGS = xxxxx_LIBS = @@ -50,17 +54,24 @@ xxxxx_LIBS = # # Includes (.h) files (public only) # --------------------------------- -INCLUDES = hexlib.h SRTMinorServoCommandLibrary.h +INCLUDES = SRTMinorServoCommandLibrary.h SRTMinorServoSocket.h SRTMinorServoTestingSocket.h SRTMinorServoUtils.h SRTMinorServoContainers.h #hexlib.h # # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTMinorServoLibrary SRTMinorServoCommandLibrary +LIBRARIES = SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary PySRTMinorServoCommandLibrary #SRTMinorServoLibrary LIBRARIES_L = -SRTMinorServoLibrary_OBJECTS = hexlib -SRTMinorServoLibrary_LIBS = +#SRTMinorServoLibrary_OBJECTS = hexlib +#SRTMinorServoLibrary_LIBS = gsl gslcblas m SRTMinorServoCommandLibrary_OBJECTS = SRTMinorServoCommandLibrary -SRTMinorServoCommandLibrary_LIBS = IRALibrary +SRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoCommandLibrary_LIBS = pthread IRALibrary +PySRTMinorServoCommandLibrary_OBJECTS = PySRTMinorServoCommandLibrary +PySRTMinorServoCommandLibrary_CFLAGS = -std=c++17 -fconcepts +PySRTMinorServoCommandLibrary_LIBS = SRTMinorServoCommandLibrary boost_python3 +SRTMinorServoSocketLibrary_OBJECTS = SRTMinorServoSocket +SRTMinorServoSocketLibrary_LIBS = IRALibrary ComponentErrors MinorServoErrors SRTMinorServoCommandLibrary +SRTMinorServoSocket_CFLAGS = -std=c++17 -fconcepts # # @@ -87,7 +98,7 @@ PY_SCRIPTS_L = PY_MODULES = PY_MODULES_L = -PY_PACKAGES = +PY_PACKAGES = SRTMinorServoCommandLibrary PY_PACKAGES_L = pppppp_MODULES = diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp new file mode 100644 index 000000000..984618e08 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/PySRTMinorServoCommandLibrary.cpp @@ -0,0 +1,69 @@ +#include "PySRTMinorServoCommandLibrary.h" + +using namespace MinorServo; + +boost::python::object PySRTMinorServoCommandLibrary::status(const std::string servo_id) +{ + return stringToBytes(SRTMinorServoCommandLibrary::status(servo_id)); +} + +boost::python::object PySRTMinorServoCommandLibrary::setup(const std::string& configuration) +{ + return stringToBytes(SRTMinorServoCommandLibrary::setup(configuration)); +} + +boost::python::object PySRTMinorServoCommandLibrary::stow(const std::string& servo_id, unsigned int stow_position) +{ + return stringToBytes(SRTMinorServoCommandLibrary::stow(servo_id, stow_position)); +} + +boost::python::object PySRTMinorServoCommandLibrary::stop(const std::string& servo_id) +{ + return stringToBytes(SRTMinorServoCommandLibrary::stop(servo_id)); +} + +boost::python::object PySRTMinorServoCommandLibrary::preset(const std::string& servo_id, const boost::python::list& coordinates) +{ + return stringToBytes(SRTMinorServoCommandLibrary::preset(servo_id, pylist2cppvector(coordinates))); +} + +boost::python::object PySRTMinorServoCommandLibrary::programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const boost::python::list& coordinates, double start_time) +{ + return stringToBytes(SRTMinorServoCommandLibrary::programTrack(servo_id, trajectory_id, point_id, pylist2cppvector(coordinates), start_time)); +} + +boost::python::object PySRTMinorServoCommandLibrary::offset(const std::string& servo_id, const boost::python::list& coordinates) +{ + return stringToBytes(SRTMinorServoCommandLibrary::offset(servo_id, pylist2cppvector(coordinates))); +} + +boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(const std::string& answer) +{ + auto args = SRTMinorServoCommandLibrary::parseAnswer(answer); + + boost::python::dict dictionary; + + SRTMinorServoAnswerMap::iterator iter; + + for(iter = args.begin(); iter != args.end(); ++iter) + { + std::visit([dictionary, iter](const auto& var) mutable { dictionary[iter->first] = var; }, iter->second); + } + + return dictionary; +} + +std::vector PySRTMinorServoCommandLibrary::pylist2cppvector(const boost::python::list& py_list) +{ + std::vector cpp_vector; + for(unsigned int i = 0; i < len(py_list); i++) + { + cpp_vector.push_back(boost::python::extract(py_list[i])); + } + return cpp_vector; +} + +boost::python::object PySRTMinorServoCommandLibrary::stringToBytes(const std::string& command) +{ + return boost::python::object(boost::python::handle<>(PyBytes_FromString(command.c_str()))); +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp index a3a937a93..6d23c3291 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary.cpp @@ -4,57 +4,62 @@ * Giuseppe Carboni (giuseppe.carboni@inaf.it) */ +#include +#include +#include #include "SRTMinorServoCommandLibrary.h" -std::string SRTMinorServoCommandLibrary::status(int servo_id) +using namespace MinorServo; + +std::string SRTMinorServoCommandLibrary::status(const std::string servo_id) { std::stringstream command; - command << "status"; - if(servo_id >= 0) + command << "STATUS"; + if(servo_id != "") { command << "=" << servo_id; } - command << std::endl; + command << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::setup(std::string configuration) +std::string SRTMinorServoCommandLibrary::setup(const std::string& configuration) { std::stringstream command; - command << "setup=" << configuration << std::endl; + command << "SETUP=" << configuration << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::stow(unsigned int servo_id, unsigned int stow_position) +std::string SRTMinorServoCommandLibrary::stow(const std::string& servo_id, const unsigned int stow_position) { std::stringstream command; - command << "stow=" << servo_id << "," << stow_position << std::endl; + command << "STOW=" << servo_id << "," << stow_position << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::stop(unsigned int servo_id) +std::string SRTMinorServoCommandLibrary::stop(const std::string& servo_id) { std::stringstream command; - command << "stop=" << servo_id << std::endl; + command << "STOP=" << servo_id << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::preset(unsigned int servo_id, std::vector coordinates) +std::string SRTMinorServoCommandLibrary::preset(const std::string& servo_id, const std::vector& coordinates) { std::stringstream command; - command << "preset=" << servo_id; + command << "PRESET=" << servo_id; for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { - command << "," << coordinates[coordinate]; + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; } - command << std::endl; + command << CLOSER; return command.str(); } -std::string SRTMinorServoCommandLibrary::programTrack(unsigned int servo_id, unsigned int trajectory_id, unsigned int point_id, std::vector coordinates, double start_time) +std::string SRTMinorServoCommandLibrary::programTrack(const std::string& servo_id, const unsigned long& trajectory_id, const unsigned long& point_id, const std::vector& coordinates, const double start_time) { std::stringstream command; - command << "programTrack=" << servo_id << "," << trajectory_id << "," << point_id << ","; + command << "PROGRAMTRACK=" << servo_id << "," << trajectory_id << "," << point_id << ","; if(start_time > 0) { command << std::fixed << std::setprecision(6) << start_time; @@ -64,11 +69,110 @@ std::string SRTMinorServoCommandLibrary::programTrack(unsigned int servo_id, uns command << "*"; } - command.unsetf(std::ios_base::floatfield); for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) { - command << "," << coordinates[coordinate]; + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; } - command << std::endl; + command << CLOSER; return command.str(); } + +std::string SRTMinorServoCommandLibrary::offset(const std::string& servo_id, const std::vector& coordinates) +{ + std::stringstream command; + command << "OFFSET=" << servo_id; + for(unsigned int coordinate = 0; coordinate < coordinates.size(); coordinate++) + { + command << "," << std::fixed << std::setprecision(6) << coordinates[coordinate]; + } + command << CLOSER; + return command.str(); +} + +SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(const std::string& original_answer) +{ + // First thing first, standardize the separators and remove the newline/carriage return characters + std::string answer(original_answer); + std::replace(answer.begin(), answer.end(), ':', '='); + std::replace(answer.begin(), answer.end(), '|', ','); + answer.erase(std::remove(answer.begin(), answer.end(), '\n'), answer.end()); + answer.erase(std::remove(answer.begin(), answer.end(), '\r'), answer.end()); + + // Create the dictionary + SRTMinorServoAnswerMap args; + + std::stringstream ss(answer); + std::string token; + + try + { + // Loop through the tokens + while(std::getline(ss, token, ',')) + { + std::stringstream sss(token); + std::string key, value; + std::getline(sss, key, '='); + std::getline(sss, value); + + // No value, could be the timestamp + if(value.empty()) + { + if(args.contains("TIMESTAMP")) // Timestamp already found, some other value is missing + { + throw std::invalid_argument(std::string("Missing key for value " + value)); + } + + value = key; + key = "TIMESTAMP"; + } + + if(key == "OUTPUT") + { + if(value != "GOOD" && value != "BAD") + { + throw std::invalid_argument(std::string("Unrecognized OUTPUT value: " + value)); + } + + args.put(key, value); + } + else if(key == "TIMESTAMP") + { + size_t last_char; + args.put(key, std::stod(value, &last_char)); + if(last_char != value.size()) + { + throw std::invalid_argument(std::string("Wrong TIMESTAMP value: " + value)); + } + } + else + { + size_t last_char; + args.put(key, std::stol(value, &last_char)); + if(last_char != value.size()) + { + args.put(key, std::stod(value)); + } + } + } + + if(!args.contains("OUTPUT")) + { + throw std::invalid_argument(std::string("Missing OUTPUT value!")); + } + else if(args.checkOutput() && !args.contains("TIMESTAMP")) + { + throw std::invalid_argument(std::string("Missing TIMESTAMP value!")); + } + } + catch(const std::invalid_argument& ex) + { + // If we are not able to convert any of the values to the correct type, + // or if OUTPUT and/or TIMESTAMP is missing, we send back an empty dictionary. + // It will be the caller's duty to understand that something was wrong with the answer. + args.clear(); + } + + args.put("PLAIN_ANSWER", original_answer); + + return args; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md new file mode 100644 index 000000000..7eb57a028 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/README.md @@ -0,0 +1,19 @@ +# SRTMinorServoCommandLibrary Python wrapper + +In order to use the SRTMinorServoCommandLibrary python wrapper, it is sufficient to import the SRTCommandLibrary package like this: + +`import SRTMinorServoCommandLibrary` + +The all the functions of the library can be used in the following fashion: + +`SRTMinorServoCommandLibrary.status()` +`SRTMinorServoCommandLibrary.status('PFP')` +`SRTMinorServoCommandLibrary.setup('KKG')` +`SRTMinorServoCommandLibrary.stow('PFP')` +`SRTMinorServoCommandLibrary.stow('PFP', 2)` +`SRTMinorServoCommandLibrary.stop('SRP')` +`SRTMinorServoCommandLibrary.preset('SRP', [0, 1, 2, 3, 4, 5])` +`SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0, 1, 2, 3, 4, 5], )` +`SRTMinorServoCommandLibrary.programTrack('PFP', 0, 1, [0, 1, 2, 3, 4, 5])` +`SRTMinorServoCommandLibrary.offset('SRP', [6, 7, 8, 9, 10, 11])` +`SRTMinorServoCommandLibrary.parseAnswer('OUTPUT:GOOD,1665757400.123456,PFP_ENABLED=5|PFP_STATUS=44|PFP_BLOCK=7|PFP_WARNING=47|PFP_ROTARY_AXIS_ENABLE=52|PFP_COORD_1=94')` diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py new file mode 100644 index 000000000..f07ae391e --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoCommandLibrary/__init__.py @@ -0,0 +1,17 @@ +# The following lines will look for the libPySRTMinorServoCommandLibrary in the +# $INTROOT/lib path instead of looking in the $INTROOT/lib/python/site-packages +# path. This is a workaround needed since the said library is a C++ shared +# library and it does not get automatically installed in the correct folder. +# By adding this workaround we're also able to rename the library with the +# module name SRTMinorServoCommandLibrary, trimming the 'libPy' header. I +# suggest to use this approach whenever a Python wrapper is needed. +import os +import sys +# Temporarily add the $INTROOT/lib path to Python libraries path +sys.path.append(os.path.join(os.environ['INTROOT'], 'lib')) +# Import the functions we need +from libPySRTMinorServoCommandLibrary import status, setup, stop, stow, preset, programTrack, offset, parseAnswer +# Remove the added path and unused imported modules +sys.path.remove(os.path.join(os.environ['INTROOT'], 'lib')) +del os +del sys diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp new file mode 100644 index 000000000..f0606fe29 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -0,0 +1,237 @@ +#include "SRTMinorServoSocket.h" + +using namespace MinorServo; + +std::mutex SRTMinorServoSocket::c_mutex; + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance(std::string ip_address, int port, double timeout) +{ + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + + if(m_instance != nullptr) + { + if(m_instance->m_ip_address != ip_address || m_instance->m_port != port) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance(std::string, int)"); + impl.setReason(("Socket already open on '" + m_instance->m_ip_address + ":" + std::to_string(m_instance->m_port) + "' . Use getInstance() (no arguments) to retrieve the object.").c_str()); + throw impl.getMinorServoErrorsEx(); + } + } + else + { + m_instance = new SRTMinorServoSocket(ip_address, port, timeout); + } + return *m_instance; +} + +SRTMinorServoSocket& SRTMinorServoSocket::getInstance() +{ + std::lock_guard guard(SRTMinorServoSocket::c_mutex); + + if(m_instance == nullptr) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::getInstance()"); + impl.setReason("Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + throw impl.getMinorServoErrorsEx(); + } + return *m_instance; +} + +SRTMinorServoSocket::SRTMinorServoSocket(std::string ip_address, int port, double timeout) : m_ip_address(ip_address), m_port(port), m_timeout(timeout), m_socket_status(NOTREADY) +{ + try + { + connect(); + } + catch(...) + { + // Not yet connected, we catch the exception in order to go on + } +} + +SRTMinorServoSocket::~SRTMinorServoSocket() +{ + std::lock_guard guard(m_mutex); + Close(m_error); +} + +void SRTMinorServoSocket::connect() +{ + if(isConnected()) + { + return; + } + + std::lock_guard guard(m_mutex); + + Close(m_error); + m_error.Reset(); + if(Create(m_error, STREAM) == FAIL) + { + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot create the socket."); + throw impl.getMinorServoErrorsEx(); + } + + if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot connect the socket."); + throw impl.getMinorServoErrorsEx(); + } + + if(setSockMode(m_error, NONBLOCKING) != SUCCESS) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); + impl.setReason("Cannot set the socket to non-blocking."); + throw impl.getMinorServoErrorsEx(); + } + + m_socket_status = READY; +} + +const bool SRTMinorServoSocket::isConnected() const +{ + return m_socket_status == READY ? true : false; +} + +SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) +{ + std::lock_guard guard(m_mutex); + + connect(); + + double start_time = IRA::CIRATools::getUNIXEpoch(); + size_t sent_bytes = 0; + + while(sent_bytes < command.size()) + { + size_t sent_now; + + try + { + sent_now = Send(m_error, command.substr(sent_bytes, command.size() - sent_bytes).c_str(), command.size() - sent_bytes); + sent_bytes += sent_now; + } + catch(...) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); + impl.setReason("Something went wrong while sending some bytes."); + throw impl.getMinorServoErrorsEx(); + } + + if(sent_now > 0) + { + // Reset the timer + start_time = IRA::CIRATools::getUNIXEpoch(); + } + else if(IRA::CIRATools::getUNIXEpoch() - start_time >= m_timeout) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.setReason("Timeout when sending command."); + throw impl.getMinorServoErrorsEx(); + } + } + + start_time = IRA::CIRATools::getUNIXEpoch(); + std::string answer; + + while(answer.size() < 2 || !(answer.rfind(CLOSER) == answer.size() - CLOSER.size())) + { + char buf; + try + { + if(Receive(m_error, &buf, 1) == 1) + { + answer += buf; + + // Reset the timer + start_time = IRA::CIRATools::getUNIXEpoch(); + } + else if(IRA::CIRATools::getUNIXEpoch() - start_time >= m_timeout) + { + m_socket_status = TIMEOUT; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::sendCommand()"); + impl.setReason("Timeout when receiving answer."); + throw impl.getMinorServoErrorsEx(); + } + } + catch(...) + { + m_socket_status = NOTREADY; + Close(m_error); + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocker::sendCommand()"); + impl.setReason(("Something went wrong while receiving some bytes. Command: " + command).c_str()); + throw impl.getMinorServoErrorsEx(); + } + } + + SRTMinorServoAnswerMap map_answer = SRTMinorServoCommandLibrary::parseAnswer(answer); + map_answer.put("PLAIN_COMMAND", command); + if(map) + { + map->get() = map_answer; + } + + return map_answer; +} + +SRTMinorServoSocketConfiguration& SRTMinorServoSocketConfiguration::getInstance(maci::ContainerServices* containerServices) +{ + if(m_instance == nullptr) + { + m_instance = new SRTMinorServoSocketConfiguration(containerServices); + } + + return *m_instance; +} + +SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration(maci::ContainerServices* containerServices) +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + + IRA::CString _ip_address; + if(!IRA::CIRATools::getDBValue(containerServices, "IPAddress", _ip_address, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("IPAddress"); + throw impl.getComponentErrorsEx(); + } + m_ip_address = (std::string)_ip_address; + + DWORD port; + if(!IRA::CIRATools::getDBValue(containerServices, "Port", port, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("Port"); + throw impl.getComponentErrorsEx(); + } + else + { + m_port = port; + } + + if(!IRA::CIRATools::getDBValue(containerServices, "SocketTimeout", m_timeout, CONFIG_DOMAIN, CONFIG_DIRNAME)) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, impl, "SRTMinorServoSocketConfiguration::SRTMinorServoSocketConfiguration()"); + impl.setFieldName("SocketTimeout"); + throw impl.getComponentErrorsEx(); + } +} + +SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration() +{ + AUTO_TRACE("SRTMinorServoSocketConfiguration::~SRTMinorServoSocketConfiguration()"); + + delete m_instance; +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/.discos b/SRT/Libraries/SRTMinorServoLibrary/tests/.discos new file mode 100644 index 000000000..1ada672a9 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/.discos @@ -0,0 +1,5 @@ +This file is here to differentiate between ACS style test directory and discos-style test. + +This is a discos test directory + +DO NOT REMOVE THIS FILE diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile new file mode 100644 index 000000000..517c0d13a --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/Makefile @@ -0,0 +1,97 @@ +# CPP UNIT TESTING SETUP +#-------------- +GTEST_HOME=/usr/local/include/gtest +GMOCK_HOME=/usr/local/include/gmock +GTEST_LIBS=gtest gtest_main + +USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# SRTMinorServoCommandLibraryTest_OBJECTS = unittest +# SRTMinorServoCommandLibraryTest_LIBS = $(GTEST_LIBS) + +EXECUTABLES_L = SRTMinorServoCommandLibraryTest SRTMinorServoSocketTest + +SRTMinorServoCommandLibraryTest_OBJECTS = SRTMinorServoCommandLibraryTest +SRTMinorServoCommandLibraryTest_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoCommandLibraryTest_LIBS = $(GTEST_LIBS) SRTMinorServoCommandLibrary IRALibrary +SRTMinorServoCommandLibraryTest_LDFLAGS = -lstdc++ -lpthread + +SRTMinorServoSocketTest_OBJECTS = SRTMinorServoSocketTest +SRTMinorServoSocketTest_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoSocketTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary +SRTMinorServoSocketTest_LDFLAGS = -lstdc++ -lpthread + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp new file mode 100644 index 000000000..b0fb317e2 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoCommandLibraryTest.cpp @@ -0,0 +1,108 @@ +#include "gtest/gtest.h" +#include +#include "SRTMinorServoCommandLibrary.h" + +using namespace MinorServo; + +TEST(SRTMinorServoCommandLibraryTest, status) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::status(), "STATUS\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::status("PFP"), "STATUS=PFP\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, setup) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::setup("CCB"), "SETUP=CCB\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, stow) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::stow("PFP"), "STOW=PFP,1\r\n"); + EXPECT_EQ(SRTMinorServoCommandLibrary::stow("PFP", 2), "STOW=PFP,2\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, stop) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::stop("PFP"), "STOP=PFP\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, preset) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::preset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "PRESET=PFP,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, programTrack) +{ + double start_time = IRA::CIRATools::getUNIXEpoch() + 3; + unsigned long int trajectory_id = (unsigned long int)start_time; + std::stringstream expected_answer; + expected_answer << std::fixed << std::setprecision(6); + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << ",0," << start_time << ",0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"; + EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, 0, std::vector{0.,1.,2.,3.,4.,5.}, start_time), expected_answer.str()); + + for(unsigned int i = 1; i < 10; i++) + { + expected_answer.str(std::string()); + expected_answer << "PROGRAMTRACK=PFP," << trajectory_id << "," << i << ",*,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"; + EXPECT_EQ(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, i, std::vector{0.,1.,2.,3.,4.,5.}), expected_answer.str()); + } +} + +TEST(SRTMinorServoCommandLibraryTest, offset) +{ + EXPECT_EQ(SRTMinorServoCommandLibrary::offset("PFP", std::vector{0.,1.,2.,3.,4.,5.}), "OFFSET=PFP,0.000000,1.000000,2.000000,3.000000,4.000000,5.000000\r\n"); +} + +TEST(SRTMinorServoCommandLibraryTest, parseAnswer) +{ + // Minimal correct answer + std::string answer = "OUTPUT:GOOD,1665743366.654321\r\n"; + SRTMinorServoAnswerMap args; + args.put("OUTPUT", "GOOD"); + args.put("TIMESTAMP", 1665743366.654321); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + EXPECT_EQ(args.getTimestamp(), 138850361666543210); + EXPECT_TRUE(args.checkOutput()); + SRTMinorServoAnswerMap other; + other.put("OTHER", 123456); + args += other; + EXPECT_EQ(args.get("OTHER"), 123456); + EXPECT_EQ(args.getTimestamp(), 138850361666543210); + EXPECT_TRUE(args.checkOutput()); + + // Complete correct answer + answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; + args.clear(); + args.put("OUTPUT", "GOOD"); + args.put("TIMESTAMP", 1665743366.123456); + args.put("CURRENT_CONFIG", 21); + args.put("SIMULATION_ENABLED", 34); + args.put("PLC_TIME", 78); + args.put("PLC_VERSION", 69); + args.put("CONTROL", 14); + args.put("POWER", 38); + args.put("EMERGENCY", 69); + args.put("ENABLED", 51); + args.put("OPERATIVE_MODE", 94); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Missing timestamp + answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Wrong OUTPUT field + answer = "OUTPUT:123456\r\n"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Multiple values without key, cannot find the correct timestamp + answer = "OUTPUT:GOOD,12345,67890\r\n"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); + + // Wrong timestamp format + answer = "OUTPUT:GOOD,12345.ABCD\r\n"; + args.clear(); + EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args); +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp new file mode 100644 index 000000000..8fe3ba017 --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/SRTMinorServoSocketTest.cpp @@ -0,0 +1,214 @@ +/* These tests require a running simulator and were designed * + * to test the thread-safeness and singleton design pattern of the * + * SRTMinorServoSocket class. */ +#include "gtest/gtest.h" +#include +#include +#include +#include "SRTMinorServoUtils.h" +#include "SRTMinorServoCommandLibrary.h" +#include "SRTMinorServoTestingSocket.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define ADDRESS std::string("127.0.0.1") +#define PORT 12800 +//#define ADDRESS std::string("192.168.200.13") +//#define PORT 4758 + +using namespace MinorServo; + +class SRTMinorServoSocketTest : public ::testing::Test +{ +protected: + std::vector commands; + std::vector threads; + + void SetUp() override + { + // The following commands yield an articulated answer in return + commands.push_back(SRTMinorServoCommandLibrary::status()); + commands.push_back(SRTMinorServoCommandLibrary::status("PFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("SRP")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR1")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR2")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatoreGFR3")); + commands.push_back(SRTMinorServoCommandLibrary::status("DerotatorePFP")); + commands.push_back(SRTMinorServoCommandLibrary::status("M3R")); + commands.push_back(SRTMinorServoCommandLibrary::status("GFR")); + } + + void TearDown() override + { + SRTMinorServoTestingSocket::destroyInstance(); + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } +}; + +// This test passes the already created instance to some threads +TEST_F(SRTMinorServoSocketTest, instance_passed_to_threads) +{ + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT); + + if(!socket.isConnected()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; + } + + for(auto command : this->commands) + { + this->threads.push_back(std::thread([command, &socket]() + { + auto args = socket.sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_TRUE(args.checkOutput()); + })); + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); +} + +// This test spawns some threads, each one retrieves the instance. The first thread which tries to retrieve the instance will also generate it +TEST_F(SRTMinorServoSocketTest, instance_retrieved_in_threads) +{ + std::string error = ""; + + for(auto command : this->commands) + { + std::mutex mutex; + + this->threads.push_back(std::thread([command, &error, &mutex]() + { + try + { + auto args = SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT).sendCommand(command); + // By testing if the command was received correctly we also test if the socket is working properly + // and if the answer was received correctly without being interleaved with the answer from another thread + EXPECT_TRUE(args.checkOutput()); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + std::lock_guard guard(mutex); + + try + { + if(std::string(getReasonFromEx(ex)) == "Cannot connect the socket.") + { + error = "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } + } + catch(...) + { + } + + error = "Unexpected failure."; + } + })); + } + + std::for_each(this->threads.begin(), this->threads.end(), [](std::thread &t) + { + t.join(); + }); + + if(error != "") + { + FAIL() << error; + } +} + +// This test generates an instance on the given address and port, then tries to generate another instance with different address and port and fails +TEST_F(SRTMinorServoSocketTest, open_with_args_retrieve_without) +{ + try + { + // First let's open the socket with the chosen ADDRESS and PORT + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT); + + // Let's try to instance another socket on a different port + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT + 1); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + try + { + std::string reason(getReasonFromEx(ex)); + + if(reason == "Cannot connect the socket.") + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(reason, "Socket already open on '" + ADDRESS + ":" + std::to_string(PORT) + "' . Use getInstance() (no arguments) to retrieve the object."); + } + } + catch(...) + { + FAIL() << "Unexpected failure."; + } + } +} + +// This test tries to retrieve an instance which has not been generated yet, failing +TEST_F(SRTMinorServoSocketTest, try_open_without_args) +{ + try + { + SRTMinorServoTestingSocket::getInstance(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + try + { + std::string reason(getReasonFromEx(ex)); + + if(reason == "Cannot connect the socket.") + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached."; + return; + } + else + { + // Check if we got the correct exception + EXPECT_EQ(reason, "Socket not yet initialized. Use getInstance(std::string ip_address, int port) to initialize it and retrieve the object."); + } + } + catch(...) + { + FAIL() << "Unexpected failure."; + } + } +} + +// This test tries to generate an instance using a pair of address and port on which the socket fails to open +TEST_F(SRTMinorServoSocketTest, try_open_on_wrong_address) +{ + try + { + // The exception is raised only if the given port is wrong + SRTMinorServoTestingSocket::getInstance(ADDRESS, 0); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + try + { + std::string reason(getReasonFromEx(ex)); + + // Check if we got the correct exception + EXPECT_EQ(reason, "Cannot connect the socket."); + } + catch(...) + { + FAIL() << "Unexpected failure."; + } + } +} diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/external/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py new file mode 100644 index 000000000..e62ae691a --- /dev/null +++ b/SRT/Libraries/SRTMinorServoLibrary/tests/pyunit/__init__.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +import unittest +import time +import SRTMinorServoCommandLibrary + +class TestPySRTMinorServoCommandLibrary(unittest.TestCase): + + def test_status(self): + command = SRTMinorServoCommandLibrary.status() + expected_command = b'STATUS\r\n' + self.assertEqual(command, expected_command) + + def test_status_servo(self): + command = SRTMinorServoCommandLibrary.status('PFP') + expected_command = b'STATUS=PFP\r\n' + self.assertEqual(command, expected_command) + + def test_setup(self): + command = SRTMinorServoCommandLibrary.setup('KKG') + expected_command = b'SETUP=KKG\r\n' + self.assertEqual(command, expected_command) + + def test_stow(self): + command = SRTMinorServoCommandLibrary.stow('SRP') + expected_command = b'STOW=SRP,1\r\n' + self.assertEqual(command, expected_command) + + def test_stow_position(self): + command = SRTMinorServoCommandLibrary.stow('SRP', 2) + expected_command = b'STOW=SRP,2\r\n' + self.assertEqual(command, expected_command) + + def test_stop(self): + command = SRTMinorServoCommandLibrary.stop('SRP') + expected_command = b'STOP=SRP\r\n' + self.assertEqual(command, expected_command) + + def test_preset(self): + command = SRTMinorServoCommandLibrary.preset('PFP', [0.1, 1.1, 2.1]) + expected_command = b'PRESET=PFP,0.100000,1.100000,2.100000\r\n' + self.assertEqual(command, expected_command) + + def test_programTrack(self): + now = time.time() + command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, 0, [0.1, 1.1, 2.1], now) + expected_command = bytes(f'PROGRAMTRACK=PFP,0,0,{now:.6f},0.100000,1.100000,2.100000\r\n', encoding='latin-1') + self.assertEqual(command, expected_command) + for i in range(1, 10): + command = SRTMinorServoCommandLibrary.programTrack('PFP', 0, i, [0.1, 1.1, 2.1]) + expected_command = bytes(f'PROGRAMTRACK=PFP,0,{i},*,0.100000,1.100000,2.100000\r\n', encoding='latin-1') + self.assertEqual(command, expected_command) + + def test_offset(self): + command = SRTMinorServoCommandLibrary.offset('PFP', [0.1, 1.1, 2.1]) + expected_command = b'OFFSET=PFP,0.100000,1.100000,2.100000\r\n' + self.assertEqual(command, expected_command) + + def test_parseAnswer(self): + answer = 'OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94' + args = { + 'OUTPUT': 'GOOD', + 'TIMESTAMP': 1665743366.123456, + 'CURRENT_CONFIG': 21, + 'SIMULATION_ENABLED': 34, + 'PLC_TIME': 78, + 'PLC_VERSION': 69, + 'CONTROL': 14, + 'POWER': 38, + 'EMERGENCY': 69, + 'ENABLED': 51, + 'OPERATIVE_MODE': 94 + } + self.assertEqual( + SRTMinorServoCommandLibrary.parseAnswer(answer), + args + ) + + answer = "OUTPUT:GOOD,1665743366.654321" + args = { + "OUTPUT": "GOOD", + "TIMESTAMP": 1665743366.654321 + } + self.assertEqual( + SRTMinorServoCommandLibrary.parseAnswer(answer), + args + ) + + answer = b"OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = b"OUTPUT:123456" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = b"OUTPUT:GOOD,12345,67890" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + answer = b"OUTPUT:GOOD,12345.ABCD" + self.assertEqual(SRTMinorServoCommandLibrary.parseAnswer(answer), {}) + + +if __name__ == '__main__': + unittest.main() diff --git a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml index fe407ec9b..29c8a78a6 100644 --- a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml @@ -14,7 +14,7 @@ - + @@ -109,15 +109,6 @@ MASTERHOST discos - - MinorServoBossContainer - cpp - - true - 0 - MASTERHOST - discos - MinorServoContainer cpp diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index 3a6e4fd0b..55d8ba5ca 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -109,15 +109,6 @@ MASTERHOST discos - - MinorServoBossContainer - cpp - - true - 0 - MASTERHOST - discos - MinorServoContainer cpp diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd new file mode 100644 index 000000000..d3f3d966f --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd new file mode 100644 index 000000000..2d87a89a5 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd new file mode 100644 index 000000000..858936df2 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd new file mode 100644 index 000000000..e1f7c7a52 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoProperties.xsd @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd new file mode 100644 index 000000000..b37cfaedd --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoSocketConfiguration.xsd @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h new file mode 100644 index 000000000..330d3905d --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -0,0 +1,317 @@ +#ifndef _MSDEVIOS_H +#define _MSDEVIOS_H + +/** + * MSDevIOs.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include "SRTMinorServoContainers.h" +#include +#include +#include +#include "SRTMinorServoBossCore.h" + + +namespace MinorServo +{ + /** + * This class acts as a base class for all the SRTMinorServo DevIOs. + */ + template class MSBaseDevIO : public DevIO + { + public: + /** + * Destructor. + */ + ~MSBaseDevIO() + { + } + + /** + * Used to read the property value. + * This is pure virtual and has to be implemented in the derived DevIOs. + * @throw ComponentErrors::PropertyError. + * @param timestamp epoch when the operation completes. + */ + virtual T read(ACS::Time& timestamp); + + /** + * @return true to initialize the property with default value from CDB. + */ + bool initializeValue() + { + return false; + } + + /** + * It writes values into controller. Unused because all the properties are read-only. + */ + void write(const T& value, ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + return; + } + }; + + /** + * This class is used to read the status of the motion of the minor servo system. + */ + class MSMotionInfoDevIO : public MSBaseDevIO + { + public: + /** + * Constructor. + * @param motion_status the atomic status of the motion of the minor servo system. + * @param answer_map a reference to the SRTMinorServoAnswerMap object containing the status of the system. It is used to read the position of the gregorian cover. + * @param scanning a reference to the TBoolean indicating whether the system is scanning or not. + * @param current_scan a reference to the SRTMinorServoScan object containing the parameters for the current scan. It is used to read the servo name and axis involved in the scan. + */ + MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoGeneralStatus& boss_status, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : + m_motion_status(motion_status), + m_boss_status(boss_status), + m_scanning(scanning), + m_current_scan(current_scan) + {} + + /** + * Returns the property value. + * @param timestamp epoch when the operation completes. + * @return a string containing the information about the motion status of the minor servo system. + */ + ACE_CString read(ACS::Time& timestamp) + { + std::string motion_status; + + switch(m_motion_status.load()) + { + case MOTION_STATUS_UNCONFIGURED: + { + motion_status = "Unknown"; + break; + } + case MOTION_STATUS_STARTING: + { + motion_status = "Setup in progress..."; + break; + } + case MOTION_STATUS_CONFIGURED: + { + motion_status = "Elevation Track Mode Disabled"; + break; + } + case MOTION_STATUS_TRACKING: + { + motion_status = "Elevation Track Mode"; + break; + } + case MOTION_STATUS_PARKING: + { + motion_status = "Parking..."; + break; + } + case MOTION_STATUS_PARKED: + { + motion_status = "Parked"; + + try + { + // If I can read the status of the gregorian cover I will notify the user about it on the GUI + SRTMinorServoGregorianCoverStatus cover_position = m_boss_status.getGregorianCoverPosition(); + + if(cover_position == COVER_STATUS_OPEN) + { + motion_status += ", gregorian cover open"; + } + else if(cover_position == COVER_STATUS_CLOSED) + { + motion_status += ", gregorian cover closed"; + } + } + catch(...) + { + // If I can't, it doesn't matter + } + + break; + } + case MOTION_STATUS_ERROR: + { + motion_status = "Error"; + break; + } + } + + if(m_scanning.load() == Management::MNG_TRUE) + { + motion_status = "Scanning along " + m_current_scan.servo_name + " " + m_current_scan.axis_name + " axis"; + } + + return motion_status.c_str(); + } + private: + /** + * Reference to the motion status object of the Boss. + */ + const std::atomic& m_motion_status; + + /** + * Reference to the SRTMinorServoGeneralStatus object of the Boss. + */ + const SRTMinorServoGeneralStatus& m_boss_status; + + /** + * Reference to the boolean telling if the system is scanning. + */ + const std::atomic& m_scanning; + + /** + * Reference to the SRTMinorServoScan object of the Boss. + */ + const SRTMinorServoScan& m_current_scan; + }; + + /** + * This template class is used to retrieve values from a SRTMinorServoAnswerMap and provide them as properties. + * The templates is specialized for the types listed right below and compilation will fail if the developer attempts to use it for an unknown MSDevIO type. + */ + template + && is_any_v + >> + class MSAnswerMapDevIO : public MSBaseDevIO + { + public: + /** + * Constructor, accepting the SRTMinorServoAnswerMap derived object and a pointer to the method used to retrieve the DevIO value. + * @param map, the SRTMinorServoAnswerMap derived object. + * @param method, the method to call in order to retrieve the return value. + */ + MSAnswerMapDevIO(const std::string& property_name, const Y& map, X (Y::*method)() const) : m_property_name(property_name), m_map(map), m_method(method) {} + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes. + * @throw ComponentErrors::PropertyError. + * @return the property value as read from the SRTMinorServoAnswerMap object reference. + */ + X read(ACS::Time& timestamp) + { + timestamp = getTimeStamp(); + + try + { + return (m_map.*m_method)(); + } + catch(std::out_of_range& ex) + { + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSAnswerMapDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Property is missing from the map!"); + throw impl; + } + catch(std::bad_variant_access& ex) + { + _EXCPT(ComponentErrors::PropertyErrorExImpl, impl, "MSAnswerMapDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Attempt to access the property with the wrong variant type!"); + throw impl; + } + catch(ACSErr::ACSbaseExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::PropertyErrorExImpl, impl, ex, "MSAnswerMapDevIO::read()"); + impl.setPropertyName(m_property_name.c_str()); + impl.setReason("Property could not be read!"); + throw impl; + } + } + + private: + /** + * The name of the property. + */ + const std::string m_property_name; + + /** + * The reference to the SRTMinorServoAnswerMap in which the readings from the PLC appear. This could be either a SRTMinorServoGeneralStatus or a SRTMinorServoStatus. + */ + const Y& m_map; + + /** + * Pointer to the method of the SRTMinorServoAnswerMap to call in order to retrieve the DevIO return value. + */ + X (Y::*m_method)() const; + }; + + /** + * This template class represents a generic Minor Servo DevIO. + * It accepts 2 types, the DevIO type (the return type) and the type of the object reference which stores the original value to be returned by the read method. + * The templates is specialized for the combinations of types listed right below and the compilation will fail if the developer attempts to use it with any other types combination. + */ + template || (std::is_same_v && std::is_same_v>) + >> + class MSGenericDevIO : public MSBaseDevIO + { + public: + /** + * Default constructor. + * @param value a constant reference to the object from which the DevIO will read the value to be returned as property. + */ + MSGenericDevIO(const A& value) : m_value(value) {} + + /** + * Used to read the property value. + * @param timestamp epoch when the operation completes. + * @return the property value read from the original referenced object. + */ + C read(ACS::Time& timestamp) + { + timestamp = getTimeStamp(); //completion time + + if constexpr(std::is_same_v) + { + return m_value.c_str(); + } + else if constexpr(std::is_same_v) + { + ACS::doubleSeq_var sequence = new ACS::doubleSeq; + sequence->length(m_value.size()); + + for(size_t i = 0; i < m_value.size(); i++) + { + sequence[i] = m_value.operator[](i); + } + + return sequence; + } + else if constexpr(is_atomic_v) + { + return m_value.load(); + } + else + { + return m_value; + } + } + + /** + * The reference to the object containing the value to be returned as property. + */ + const A& m_value; + }; +} + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h new file mode 100644 index 000000000..157fe1f23 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -0,0 +1,437 @@ +#ifndef __SRTMINORSERVOBOSSCORE_H__ +#define __SRTMINORSERVOBOSSCORE_H__ + +/** + * SRTMinorServoBossCore.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" +#include "SRTMinorServoBossImpl.h" +#include "SRTMinorServoStatusThread.h" +#include "SRTMinorServoSetupThread.h" +#include "SRTMinorServoParkThread.h" +#include "SRTMinorServoTrackingThread.h" +#include "SRTMinorServoScanThread.h" +#include "SRTMinorServoContainers.h" + + +_IRA_LOGFILTER_IMPORT; + +using namespace MinorServo; + +class SRTMinorServoBossImpl; +class SRTMinorServoStatusThread; +class SRTMinorServoSetupThread; +class SRTMinorServoParkThread; +class SRTMinorServoTrackingThread; +class SRTMinorServoScanThread; + + +/** + * This class implements the core functionalities for the SRTMinorServoBoss. It is constructed during the SRTMinorServoBossImpl component's construction. + * It handles all the threads and the procedures necessary for the minor servo system to work properly. + */ +class SRTMinorServoBossCore +{ + /** + * These classes needs full access to the SRTMinorServoBossCore object methods and attributes in order for the system to work properly. + */ + friend class SRTMinorServoBossImpl; + friend class SRTMinorServoStatusThread; + friend class SRTMinorServoSetupThread; + friend class SRTMinorServoParkThread; + friend class SRTMinorServoTrackingThread; + friend class SRTMinorServoScanThread; + +public: + /** + * Constructor. + * @param component a reference to the component object. Used in order to access the properties. + * @throw ComponentErrors::ComponentErrorsEx when reading configurations from the CDB. + */ + SRTMinorServoBossCore(SRTMinorServoBossImpl& component); + + /** + * Destructor. + */ + virtual ~SRTMinorServoBossCore(); + +private: + /** + * Reads the overall status from the hardware. + * @return true when the status is OK, false otherwise. + */ + bool status(); + + /** + * Performs a setup procedure. + * @param configuration a mnemonic code identifying the desired configuration. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while performing the setup procedure or if checkLineStatus throws. + */ + void setup(std::string configuration); + + /** + * Performs a park procedure. + * @throw ManagementErrors::ParkingErrorEx when something went wrong while performing the park procedure or if checkLineStatus throws. + */ + void park(); + + /** + * Enables or disables the elevation tracking. + * @param configuration the desired elevation tracking configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + void setElevationTracking(std::string configuration); + + /** + * Enables or disables the use of ASACTIVE configurations. + * @param configuration the desired active surface configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + void setASConfiguration(std::string configuration); + + /** + * Opens or closes the gregorian cover. + * @param position the desired position for the gregorian cover, allowed values are 'open', 'OPEN', 'closed' or 'CLOSED'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded position is unknown, when the system is not parked or parking, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + void setGregorianCoverPosition(std::string position); + + /** + * Configures the whole minor servo system to a desired position. + * @param elevation the elevation to use for all the minor servo positions calculation. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system was not configured yet, + * when a single minor servo component raises an error or when checkLineStatus throws. + */ + void preset(double elevation); + + /** + * Resets the given servo user offsets to 0. + * @param servo_name the name of the minor servo the user offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + void clearUserOffsets(std::string servo_name); + + /** + * Sets the given axis' user offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + void setUserOffset(std::string servo_axis_name, double offset, bool log = false); + + /** + * Retrieves all the current user offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes user offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + ACS::doubleSeq* getUserOffsets(); + + /** + * Resets the given servo system offsets to 0. + * @param servo_name the name of the minor servo the system offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + void clearSystemOffsets(std::string servo_name); + + /** + * Sets the given axis' system offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired system offset to be loaded for the given axis. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + void setSystemOffset(std::string servo_axis_name, double offset); + + /** + * Retrieves all the current system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes system offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + ACS::doubleSeq* getSystemOffsets(); + + /** + * Retrieves all the current axes names and units of measure. + * @param axes_names_out a reference to the sequence in which the method will put all the axes names. + * @param axes_units_out a reference to the sequence in which the method will put all the axes units of measure. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + */ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out); + + /** + * Retrieves all the axes positions for a given epoch. + * @param acs_time the ACS::Time the user wants to retrieve all the axes positions for. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return an ACS::doubleSeq containing all the axes positions for the given time. + */ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time); + + /** + * This method performs the calculations necessary to check if a scan can be performed starting from the given parameters. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the given parameters or when the scan could not be performed for any reason. + * @return a SRTMinorServoScan object containing the parameters for a feasible scan. + */ + SRTMinorServoScan checkScanFeasibility(const ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + + /** + * This method checks if a scan with the given parameters is feasible by calling the checkScanFeasibility method. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @param ms_parameters a reference to the object containing the calculated parameters for the requested scan. + * @return true if the requested scan is feasible, false otherwise. + */ + bool checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters); + + /** + * This method commands the start of a scan to the minor servo system. It calls the checkScanFeasibility method again to be sure the scan can actually be performed, updating the starting time. + * @param start_time a reference to the ACS::Time object. This value will be written by this method and it will represent the earliest time the minor servo system can perform the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status, with the given parameters or when the scan could not be performed for any reason. + */ + void startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + + /** + * Requests a stop for the ongoing scan. + * @param close_time the closing time for the ongoing scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status. + */ + void closeScan(ACS::Time& close_time); + + /** + * Retrieve the antenna elevation from the AntennaBoss component for the given ACS::Time. + * @param acs_time the ACS::Time we want to know the antenna elevation for. + * @throw ComponentErrors::ComponentErrorsEx when the AntennaBoss component could not be retrieved. + * @return the antenna elevation for the given time, expressed in degrees. + */ + double getElevation(const ACS::Time& acs_time); + + /** + * Checks if the socket is connected, if the Leonardo minor servo system is currently controlled by DISCOS and if it is not in emergency status. + * @throw MinorServoErrors::MinorServoErrorsEx when any of the above is false. + */ + void checkLineStatus(); + + /** + * Method that creates and starts an ACS thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS thread object to be eventually created and started. + * @param sleep_time the optional thread sleep time, defaults to 0, meaning that this value will be ignored and internally the thread sleep time will be set to the default sleep time. + */ + template >> + void startThread(T*& thread, const ACS::TimeInterval& sleep_time = 0); + + /** + * Method that stops an ACS thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS thread object to be stopped. + */ + template >> + void stopThread(T*& thread); + + /** + * Method that destroys an ACS Thread object. + * It is a template specialized on the SRTMinorServoStatusThread, SRTMinorServoSetupThread, SRTMinorServoParkThread, SRTMinorServoTrackingThread and SRTMinorServoScanThread classes. + * @param thread pointer to the ACS Thread object to be destroyed. + */ + template >> + void destroyThread(T*& thread); + + /** + * Method that sets all the necessary variable to signal a failure of the minor servo system. + */ + void setFailure(); + + /** + * Method used to retrieve a configuration value from the CDB. + * @param configuration the name of the value to be read from the CDB. + */ + Management::TBoolean getCDBConfiguration(std::string configuration); + + /** + * Reference to the component object. + */ + SRTMinorServoBossImpl& m_component; + + /** + * Pointer to the status thread. + */ + SRTMinorServoStatusThread* m_status_thread; + + /** + * Pointer to the setup thread. + */ + SRTMinorServoSetupThread* m_setup_thread; + + /** + * Pointer to the park thread. + */ + SRTMinorServoParkThread* m_park_thread; + + /** + * Pointer to the tracking thread. + */ + SRTMinorServoTrackingThread* m_tracking_thread; + + /** + * Pointer to the scan thread. + */ + SRTMinorServoScanThread* m_scan_thread; + + /** + * Pointer to the AntennaBoss component. + */ + Antenna::AntennaBoss_proxy m_antennaBoss; + + /** + * SRTMinorServoGeneralStatus object containing the status read from the PLC. + */ + SRTMinorServoGeneralStatus m_status; + + /** + * Enumeration indicating the status of the motion of the minor servo system. + */ + std::atomic m_motion_status; + + /** + * String containing the commanded focal configuration. + */ + std::string m_commanded_setup; + + /** + * Enumeration containing the commanded focal configuration. + */ + std::atomic m_commanded_configuration; + + /** + * Enumeration containing the status of the subsystem. + */ + std::atomic m_subsystem_status; + + /** + * String containing the current focal configuration name. + */ + std::string m_actual_setup; + + /** + * Boolean indicating whether the system is ready or not. + */ + std::atomic m_ready; + + /** + * Boolean indicating whether the system is performing a setup procedure or not. + */ + std::atomic m_starting; + + /** + * Boolean indicating whether the system is using ASACTIVE configurations or not. + */ + std::atomic m_as_configuration; + + /** + * Boolean indicating whether the system is currently tracking the elevation. + */ + std::atomic m_elevation_tracking; + + /** + * Boolean indicating whether the tracking of the elevation is enabled. + */ + std::atomic m_elevation_tracking_enabled; + + /** + * Boolean indicating whether the system can perform scans or not. + */ + std::atomic m_scan_active; + + /** + * Boolean indicating whether the system is scanning or not. + */ + std::atomic m_scanning; + + /** + * Boolean indicating whether the system is tracking or not. + */ + std::atomic m_tracking; + + /** + * This boolean will be set to true every time the socket connects. + * When true it will trigger a procedure that will check if the minor servos offsets need to be reloaded because of a discrepancy between the DISCOS offsets (user + system) and the Leonardo offsets. + */ + bool m_reload_servo_offsets; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; + + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; + + /** + * Boolean indicating whether the socket is connected or not. + */ + std::atomic m_socket_connected; + + /** + * Map containing all the servos in the minor servo system. + */ + const std::map m_servos; + + /** + * Map containing all the tracking servos in the minor servo system. + */ + const std::map m_tracking_servos; + + /** + * Map that will dynamically be updated containing the current configuration's minor servos. + */ + std::map m_current_servos; + + /** + * Map that will dynamically be updated containing the current configuration's tracking minor servos. + */ + std::map m_current_tracking_servos; + + /** + * Current scan parameters. + */ + SRTMinorServoScan m_current_scan; + + /** + * Last scan parameters. + */ + SRTMinorServoScan m_last_scan; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h new file mode 100644 index 000000000..40eb0c828 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -0,0 +1,548 @@ +#ifndef __SRTMINORSERVOBOSSIMPL_H__ +#define __SRTMINORSERVOBOSSIMPL_H__ + +/** + * SRTMinorServoBossImpl.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "MinorServoErrors.h" +#include "SRTMinorServoBossCore.h" +#include "SRTMinorServoStatusThread.h" +#include "MSDevIOs.h" +#include "SRTMinorServoCommon.h" + +using namespace MinorServo; + +// Forward classes definitions +class SRTMinorServoBossCore; +class SRTMinorServoStatusThread; + +class SRTMinorServoBossImpl : public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTMinorServoBoss +{ + friend class SRTMinorServoBossCore; +public: + /** + * Constructor. + * @param component_name the name of the component. + * @param container_services the ACS container services. + */ + SRTMinorServoBossImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ + virtual ~SRTMinorServoBossImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + virtual void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ + virtual void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + virtual void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ + virtual void aboutToAbort(); + + /** + * Performs a setup procedure. + * @param configuration a mnemonic code identifying the desired configuration. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while calling the SRTMinorServoBossCore method implementation. + */ + virtual void setup(const char* configuration); + + /** + * Performs a park procedure. + * @throw ManagementErrors::ConfigurationErrorEx when something went wrong while calling the SRTMinorServoBossCore method implementation. + */ + virtual void park(); + + /** + * Method that tells if the elevation tracking is enabled. + * @return a CORBA::Boolean indicating if the elevation tracking is enabled or not. + */ + virtual CORBA::Boolean isElevationTrackingEn(); + + /** + * Method that tells if the elevation is being tracked. + * @return a CORBA::Boolean indicating if the system is currently tracking the elevation or not. + */ + virtual CORBA::Boolean isElevationTracking(); + + /** + * Method that tells if the system is currently tracking the commanded position. + * @return a CORBA::Boolean indicating if the system is currently tracking below the given error threshold or not. + */ + virtual CORBA::Boolean isTracking(); + + /** + * Method that tells if the system is currently performing a setup procedure. + * @return a CORBA::Boolean indicating if the system is currently performing a setup procedure or not. + */ + virtual CORBA::Boolean isStarting(); + + /** + * Method that tells if the system is using ASACTIVE lookup tables or not. + * @return a CORBA::Boolean indicating if the system is configured to use ASACTIVE lookup tables or not. + */ + virtual CORBA::Boolean isASConfiguration(); + + /** + * Method that tells if the system is currently performing a parking procedure. + * @return a CORBA::Boolean indicating if the system is currently performing a parking procedure or not. + */ + virtual CORBA::Boolean isParking(); + + /** + * Method that tells if the system was configured correctly. + * @return a CORBA::Boolean indicating if the system is ready to be moved or not. + */ + virtual CORBA::Boolean isReady(); + + /** + * Method that tells if the system is currently performing a scan. + * @return a CORBA::Boolean indicating if the system is currently performing a scan or not. + */ + virtual CORBA::Boolean isScanning(); + + /** + * Method that tells if the system can currently perform a scan or not. + * @return a CORBA::Boolean indicating if the system can perform a scan or not. + */ + virtual CORBA::Boolean isScanActive(); + + /** + * Returns the name of the current focal configuration. + * @return a string containing the current focal configuration name. + */ + virtual char* getActualSetup(); + + /** + * Returns the name of the commanded focal configuration. + * @return a string containing the commanded focal configuration name. + */ + virtual char* getCommandedSetup(); + + /** + * Returns the central position for the axis involved in the current or last scan. + * @return a CORBA::Double containing the central position for the current scan axis. + * @throw MinorServoErrors::MinorServoErrorsEx when no scan has been performed yet. + */ + virtual CORBA::Double getCentralScanPosition(); + + /** + * Clears the user defined offsets from all the minor servos. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void clearOffsets(); + + /** + * Resets the given servo user offsets to 0. + * @param servo_name the name of the minor servo the user offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void clearUserOffset(const char* servo_name); + + /** + * Sets the given axis' user offset. CORBA IDL implementation. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void setUserOffset(const char* servo_axis_name, CORBA::Double offset); + + /** + * Sets the given axis' user offset. SimpleParser implementation. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired user offset to be loaded for the given axis. + * @param log a boolean indicating whether the call comes from the SimpleParser or from outside sources. In case it comes from the SimpleParser, we will log the action, otherwise we won't. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void setUserOffset(const char* servo_axis_name, const double& offset); + + /** + * Retrieves all the current user offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes user offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + virtual ACS::doubleSeq* getUserOffset(); + + /** + * Resets the given servo system offsets to 0. + * @param servo_name the name of the minor servo the system offsets will be reset to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo_name is unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void clearSystemOffset(const char* servo_name); + + /** + * Sets the given axis' system offset. + * @param servo_axis_name the minor servo and axis names, connected by a _ character. + * @param offset the desired system offset to be loaded for the given axis. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system is not configured yet, when the given servo or axis name are unknown, + * when the given servo is not used in the current focal configuration or when checkLineStatus throws. + */ + virtual void setSystemOffset(const char* servo_axis_name, CORBA::Double offset); + + /** + * Retrieves all the current system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return a ACS::doubleSeq containing all the axes system offsets. The axes order is the same one retrieved with the getAxesInfo method. + */ + virtual ACS::doubleSeq* getSystemOffset(); + + /** + * Retrieves all the current axes names and units of measure. + * @param axes_names_out a reference to the sequence in which the method will put all the axes names. + * @param axes_units_out a reference to the sequence in which the method will put all the axes units of measure. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + */ + virtual void getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units); + + /** + * Gets the axis involved in the currently or last executed scan. + * @return a string containing the servo name and the axis name, connected by a _ character. + */ + virtual char* getScanAxis(); + + /** + * Retrieves all the axes positions for a given epoch. + * @param acs_time the ACS::Time the user wants to retrieve all the axes positions for. + * @throw MinorServoErrors::MinorServoErrorsEx when the system is not configured yet. + * @return an ACS::doubleSeq containing all the axes positions for the given time. + */ + virtual ACS::doubleSeq* getAxesPosition(ACS::Time acs_time); + + /** + * Enables or disables the elevation tracking. + * @param configuration the desired elevation tracking configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + virtual void setElevationTracking(const char* elevation_tracking); + + /** + * Enables or disables the use of ASACTIVE configurations. + * @param configuration the desired active surface configuration, allowed values are 'on', 'ON', 'off' and 'OFF'. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed or when the passed configuration is unknown. + */ + virtual void setASConfiguration(const char* as_configuration); + + /** + * Opens or closes the gregorian cover. + * @param position the desired position for the gregorian cover, allowed values are 'open', 'OPEN', 'closed' or 'CLOSED'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded position is unknown, when the system is not parked or parking, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + virtual void setGregorianCoverPosition(const char* position); + + /** + * This method checks if a scan with the given parameters is feasible. + * @param start_time the starting ACS::Time for the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @param ms_parameters a reference to the object containing the calculated parameters for the requested scan. + * @return true if the requested scan is feasible, false otherwise. + */ + virtual CORBA::Boolean checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters); + + /** + * This method commands the start of a scan to the minor servo system. + * @param start_time a reference to the ACS::Time object. This value will be written by this method and it will represent the earliest time the minor servo system can perform the requested scan. + * @param scan_info the minor servo scan parameters for the requested scan. + * @param antenna_info the antenna scan parameters for the requested scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status, with the given parameters or when the scan could not be performed for any reason. + */ + virtual void startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info); + + /** + * Requests a stop for the ongoing scan. + * @param close_time the closing time for the ongoing scan. + * @throw MinorServoErrors::MinorServoErrorsEx when there are issues with the line status. + */ + virtual void closeScan(ACS::Time& close_time); + + /** + * Configures the whole minor servo system to a desired position. + * @param elevation the elevation to use for all the minor servo positions calculation. + * @throw MinorServoErrors::MinorServoErrorsEx when a scan is waiting to be completed, when the system was not configured yet, + * when a single minor servo component raises an error or when checkLineStatus throws. + */ + virtual void preset(double elevation); + + /** + * Parser method. It executes the desired command. + */ + virtual CORBA::Boolean command(const char*, CORBA::String_out); + + /** + * Returns a reference to the status property implementation of the IDL interface. + * @return pointer to read-only TSystemStatus property status. + */ + virtual Management::ROTSystemStatus_ptr status(); + + /** + * Returns a reference to the ready property implementation of the IDL interface. + * @return pointer to read-only TBoolean property ready. + */ + virtual Management::ROTBoolean_ptr ready(); + + /** + * Returns a reference to the actualSetup property implementation of the IDL interface. + * @return pointer to read-only string property actualSetup. + */ + virtual ACS::ROstring_ptr actualSetup(); + + /** + * Returns a reference to the motionInfo property implementation of the IDL interface. + * @return pointer to read-only string property motionInfo. + */ + virtual ACS::ROstring_ptr motionInfo(); + + /** + * Returns a reference to the starting property implementation of the IDL interface. + * @return pointer to read-only TBoolean property starting. + */ + virtual Management::ROTBoolean_ptr starting(); + + /** + * Returns a reference to the asConfiguration property implementation of the IDL interface. + * @return pointer to read-only TBoolean property asConfiguration. + */ + virtual Management::ROTBoolean_ptr asConfiguration(); + + /** + * Returns a reference to the elevationTrack property implementation of the IDL interface. + * @return pointer to read-only TBoolean property elevationTrack. + */ + virtual Management::ROTBoolean_ptr elevationTrack(); + + /** + * Returns a reference to the scanActive property implementation of the IDL interface. + * @return pointer to read-only TBoolean property scanActive. + */ + virtual Management::ROTBoolean_ptr scanActive(); + + /** + * Returns a reference to the scanning property implementation of the IDL interface. + * @return pointer to read-only TBoolean property scanning. + */ + virtual Management::ROTBoolean_ptr scanning(); + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to read-only TBoolean property tracking. + */ + virtual Management::ROTBoolean_ptr tracking(); + + /** + * Returns a reference to the connected property implementation of the IDL interface. + * @return pointer to read-only TBoolean property connected. + */ + virtual Management::ROTBoolean_ptr connected(); + + /** + * Returns a reference to the current_configuration property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoFocalConfiguration property current_configuration. + */ + virtual ROSRTMinorServoFocalConfiguration_ptr current_configuration(); + + /** + * Returns a reference to the simulation_enabled property implementation of the IDL interface. + * @return pointer to read-only TBoolean property simulation_enabled. + */ + virtual Management::ROTBoolean_ptr simulation_enabled(); + + /** + * Returns a reference to the plc_time property implementation of the IDL interface. + * @return pointer to read-only double property plc_time. + */ + virtual ACS::ROdouble_ptr plc_time(); + + /** + * Returns a reference to the plc_version property implementation of the IDL interface. + * @return pointer to read-only string property plc_version. + */ + virtual ACS::ROstring_ptr plc_version(); + + /** + * Returns a reference to the control property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoControlStatus property control. + */ + virtual ROSRTMinorServoControlStatus_ptr control(); + + /** + * Returns a reference to the power property implementation of the IDL interface. + * @return pointer to read-only TBoolean property power. + */ + virtual Management::ROTBoolean_ptr power(); + + /** + * Returns a reference to the emergency property implementation of the IDL interface. + * @return pointer to read-only TBoolean property emergency. + */ + virtual Management::ROTBoolean_ptr emergency(); + + /** + * Returns a reference to the gregorian_cover property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoGregorianCoverStatus property gregorian_cover. + */ + virtual ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); + + /** + * Returns a reference to the last_executed_command property implementation of the IDL interface. + * @return pointer to read-only double property last_executed_command. + */ + virtual ACS::ROdouble_ptr last_executed_command(); + +private: + /** + * Component name. + */ + const std::string m_component_name; + + /** + * SRTMinorServoBossCore object pointer. No delete is needed since it is handled by the shared_ptr logic. + */ + const std::shared_ptr m_core_ptr; + + /** + * SRTMinorServoBossCore object reference. + */ + SRTMinorServoBossCore& m_core; + + /** + * Command line parser object. + */ + SimpleParser::CParser m_parser; + + /** + * Pointer to the connected property. + */ + baci::SmartPropertyPointer> m_connected_ptr; + + /** + * Pointer to the status property. + */ + baci::SmartPropertyPointer> m_status_ptr; + + /** + * Pointer to the ready property. + */ + baci::SmartPropertyPointer> m_ready_ptr; + + /** + * Pointer to the actual_setup property. + */ + baci::SmartPropertyPointer m_actual_setup_ptr; + + /** + * Pointer to the motion_info property. + */ + baci::SmartPropertyPointer m_motion_info_ptr; + + /** + * Pointer to the starting property. + */ + baci::SmartPropertyPointer> m_starting_ptr; + + /** + * Pointer to the as_configuration property. + */ + baci::SmartPropertyPointer> m_as_configuration_ptr; + + /** + * Pointer to the elevation_tracking property. + */ + baci::SmartPropertyPointer> m_elevation_tracking_ptr; + + /** + * Pointer to the scan_active property. + */ + baci::SmartPropertyPointer> m_scan_active_ptr; + + /** + * Pointer to the scanning property. + */ + baci::SmartPropertyPointer> m_scanning_ptr; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer> m_tracking_ptr; + + /** + * Pointer to the current_configuration property. + */ + baci::SmartPropertyPointer> m_current_configuration_ptr; + + /** + * Pointer to the simulation_enabled property. + */ + baci::SmartPropertyPointer> m_simulation_enabled_ptr; + + /** + * Pointer to the plc_time property. + */ + baci::SmartPropertyPointer m_plc_time_ptr; + + /** + * Pointer to the plc_version property. + */ + baci::SmartPropertyPointer m_plc_version_ptr; + + /** + * Pointer to the control property. + */ + baci::SmartPropertyPointer> m_control_ptr; + + /** + * Pointer to the power property. + */ + baci::SmartPropertyPointer> m_power_ptr; + + /** + * Pointer to the emergency property. + */ + baci::SmartPropertyPointer> m_emergency_ptr; + + /** + * Pointer to the gregorian_cover property. + */ + baci::SmartPropertyPointer> m_gregorian_cover_ptr; + + /** + * Pointer to the last_executed_command property. + */ + baci::SmartPropertyPointer m_last_executed_command_ptr; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h new file mode 100644 index 000000000..2048dbdf7 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoCommon.h @@ -0,0 +1,38 @@ +#ifndef __SRTMINORSERVOCOMMON_H__ +#define __SRTMINORSERVOCOMMON_H__ + +/** + * SRTMinorServoCommon.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +/** + * programTrack constants. The first indicates the time between two consecutive points, the second indicates the time we send each point in advance. + */ +#define PROGRAM_TRACK_TIMEGAP 2000000 //200 milliseconds, time between each programTrack point +#define PROGRAM_TRACK_FUTURE_TIME 26000000 //2.6 seconds, we send points this amount of time before their actual timestamp + +/** + * Macro used to link the properties pointers to their methods. + */ +#define GET_PROPERTY_REFERENCE(TYPE, CLASSNAME, PROPERTY, PROPERTYNAME) TYPE##_ptr CLASSNAME::PROPERTYNAME() \ +{ \ + if (PROPERTY==0) return TYPE::_nil(); \ + TYPE##_var tmp=TYPE::_narrow(PROPERTY->getCORBAReference()); \ + return tmp._retn(); \ +} + +/** + * Macro used to show the error on the operatorInput and on the jlog since the parser does not log Ex type exceptions + */ +#define LOG_EX(EXTYPE) \ +{ \ + EXTYPE##Impl impl(ex); \ + std::string _command(cmd); \ + std::string error = _command.substr(0, _command.find('=')) + "?"; \ + SP::CFormatter::exceptionToUser(impl, out); \ + error += out; \ + out = error.c_str(); \ +} + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h new file mode 100644 index 000000000..2a43122df --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -0,0 +1,745 @@ +#ifndef __SRTMINORSERVOIMPL_H__ +#define __SRTMINORSERVOIMPL_H__ + +/** + * SRTMinorServoImpl.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ManagementErrors.h" +#include "MinorServoErrors.h" +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" +#include "SRTMinorServoContainers.h" +#include "SRTMinorServoCommon.h" + + +using namespace MinorServo; + +/** + * This class implements the base ACS::CharacteristicComponent CORBA interface for a SRTMinorServo component. + * It is inherited by the other classes declared below. + */ +class SRTBaseMinorServoImpl : public baci::CharacteristicComponentImpl +{ +public: + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTBaseMinorServoImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ + virtual ~SRTBaseMinorServoImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ + void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ + void aboutToAbort(); + + /** + * Asks the hardware the status of the servo system and updates the component properties. + * @return true if the communication succeeded, false otherwise. + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware. + */ + bool status(); + + /** + * Asks the servo system to perform a STOW operation. + * @param stow_position the position to get stowed into. + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted. + */ + void stow(CORBA::Long stow_position = 1); + + /** + * Asks the servo system to perform a STOP operation. + * @throw MinorServoErrors::MinorServoErrorsEx if there has been a communication error or if the command was not accepted. + */ + void stop(); + + /** + * Asks the servo system to perform a PRESET operation. + * @param coordinates the sequence of coordinates to get into position to, the sequence length must be equal to the number of virtual axes of the servo system. + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted. + */ + void preset(const ACS::doubleSeq& coordinates); + + /** + * Asks the servo system to load the commanded configuration table. + * @param configuration_name the configuration the servo system should assume. + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. + * @return true if the servo is in use with the current configuration, false otherwise + */ + bool setup(const char* configuration_name = ""); + + /** + * Asks the component to calculate the servo system position starting from the given elevation. + * @param elevation the elevation we want to use to calculate and retrieve the servo system coordinates, expressed in degrees. + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation. + * @return a pointer to the double sequence object containing the calculated coordinates of the servo system. + */ + ACS::doubleSeq* calcCoordinates(CORBA::Double elevation); + + /** + * Asks the component the virtual axes user offsets. + * @return a pointer to the double sequence object containing the current virtual axes user offsets of the servo system. + */ + ACS::doubleSeq* getUserOffsets(); + + /** + * Load a single virtual axis user offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired user offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis_name is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + void setUserOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes user offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void clearUserOffsets(); + + /** + * Asks the component the virtual axes system offsets. + * @return a pointer to the double sequence object containing the current virtual axes system offsets of the servo system. + */ + ACS::doubleSeq* getSystemOffsets(); + + /** + * Load a single virtual axis system offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired system offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + void setSystemOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes system offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void clearSystemOffsets(); + + /** + * Reload the user and the system offsets to the minor servo when the Leonardo offsets do not correspond to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + void reloadOffsets(); + + /** + * Returns the name and the unit of each virtual axes of the servo system, as reference arguments. + * @param axes_names_out a string sequence object containing the names of the virtual axes of the servo system. + * @param axes_units_out a string sequence object containing the units of the virtual axes of the servo system. + */ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out); + + /** + * Returns the virtual axes positions to where the servo system was at the given time acs_time. + * @param acs_time the epoch we want to retrieve the axes virtual positions of the servo system. + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty. + * @return a pointer to the double sequence object containing the virtual axes positions at the given epoch. + */ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time); + + /** + * Returns the maximum travel time to get from a starting position to a destination position. + * @param start a double sequence containing the starting position. If the provided sequence is empty, the current axes positions are used for the calculation. + * @param dest a double sequence containing the destination position. + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + ACS::TimeInterval getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest); + + /** + * Returns the minimum and maximum range of the virtual axes of the servo system, as reference arguments. + * @param min_ranges_out a double sequence object containing the minimum ranges of the virtual axes of the servo system. + * @param max_ranges_out a double sequence object containing the maximum ranges of the virtual axes of the servo system. + */ + void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out); + + /** + * Returns a reference to the enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean property enabled. + */ + virtual Management::ROTBoolean_ptr enabled(); + + /** + * Returns a reference to the drive_cabinet_status property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. + */ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + + /** + * Returns a reference to the block property implementation of the IDL interface. + * @return pointer to the read-only boolean property block. + */ + virtual Management::ROTBoolean_ptr block(); + + /** + * Returns a reference to the operative_mode property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. + */ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode(); + + /** + * Returns a reference to the physical_axes_enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_axes_enabled. + */ + virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); + + /** + * Returns a reference to the physical_positions property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_positions. + */ + virtual ACS::ROdoubleSeq_ptr physical_positions(); + + /** + * Returns a reference to the virtual_axes property implementation of the IDL interface. + * @return pointer to the read-only long property virtual_axes. + */ + virtual ACS::ROlong_ptr virtual_axes(); + + /** + * Returns a reference to the plain_virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property plain_virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions(); + + /** + * Returns a reference to the virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr virtual_positions(); + + /** + * Returns a reference to the virtual_offsets property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_offsets. + */ + virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + + /** + * Returns a reference to the virtual_user_offsets property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_user_offsets. + */ + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets(); + + /** + * Returns a reference to the virtual_system_offsets property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_system_offsets. + */ + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets(); + + /** + * Returns a reference to the in_use property implementation of the IDL interface. + * @return pointer to the read-only boolean property in_use. + */ + virtual Management::ROTBoolean_ptr in_use(); + + /** + * Returns a reference to the current_setup property implementation of the IDL interface. + * @return pointer to the read-only string property current_setup. + */ + virtual ACS::ROstring_ptr current_setup(); + +protected: + /** + * Checks if the socket is connected and if the minor servo system is in a good state. + * @throw MinorServoErrors::MinorServoErrorsEx when the socket is not connected or when the minor servo system is blocked or the drive cabinet is in error state. + */ + void checkLineStatus(); + + /** + * Static function used to retrieve some constants from the component CDB xml schema. + * @param object the instance of this class, used inside the function logic. + * @param constant the name of the constants we want to retrieve from the CDB. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB or when it has a non meaningful value. + * @return a vector of doubles containing the retrieved constants, its length is the same as the number of virtual axes of the servo system. + */ + static std::vector getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant); + +private: + /** + * Static function used to retrieve a table from the CDB DataBlock directory. Used inside the initialization list. + * @param object the instance of this class, used inside the function logic. + * @param properties_name the name of the block to retrieve as written inside the DataBlock file. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB. + * @return a vector of strings containing the retrieved table fields. + */ + static std::vector getPropertiesTable(SRTBaseMinorServoImpl& object, const std::string& properties_name); + + /** + * Attributes. + * Keep the same order for the initialization list. + */ +protected: + /** + * Name of the component. + */ + const std::string m_component_name; + + /** + * Name of the servo system. + */ + const std::string m_servo_name; + + /** + * Number of virtual axes of the servo system. + */ + const size_t m_virtual_axes; +private: + /** + * Number of physical axes of the servo system. + */ + const size_t m_physical_axes; + + /** + * Name of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_names; + + /** + * Units of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_units; +protected: + /** + * Dictionary containing the last status retrieved form the servo system. + */ + SRTMinorServoStatus m_status; + + /** + * Commanded user offsets for each axis of the servo system. + */ + std::vector m_user_offsets; + + /** + * Commanded system offsets for each axis of the servo system. + */ + std::vector m_system_offsets; + + /** + * Queue of positions assumed by the servo system in time. + */ + SRTMinorServoPositionsQueue m_positions_queue; + + /** + * Minimum ranges of the axes of the servo system. + */ + const std::vector m_min; + + /** + * Maximum ranges of the axes of the servo system. + */ + const std::vector m_max; +private: + /** + * Maximum speeds of the axes of the servo system. + */ + const std::vector m_m_s; + + /** + * Accelerations of the axes of the servo system. + */ + const std::vector m_a; + + /** + * Times to perform a full acceleration ramp from 0 to maximum speed, for each axis. + */ + const std::vector m_r_t; + + /** + * Distances covered by a full acceleration ramp from 0 to maximum speed, for each axis. + */ + const std::vector m_r_d; + + /** + * Current speed of the axes of the servo system. + */ + std::vector m_c_s; + + /** + * Boolean indicating whether the servo system is used in the current focal configuration. + */ + std::atomic m_in_use; + + /** + * Current active setup name. + */ + std::string m_current_setup; + + /** + * Pointer to the enabled property. + */ + baci::SmartPropertyPointer> m_enabled_ptr; + + /** + * Pointer to the drive_cabinet_status property. + */ + baci::SmartPropertyPointer> m_drive_cabinet_status_ptr; + + /** + * Pointer to the block property. + */ + baci::SmartPropertyPointer> m_block_ptr; + + /** + * Pointer to the operative_mode property. + */ + baci::SmartPropertyPointer> m_operative_mode_ptr; + + /** + * Pointer to the physical_axes_enabled property. + */ + baci::SmartPropertyPointer m_physical_axes_enabled_ptr; + + /** + * Pointer to the physical_positions property. + */ + baci::SmartPropertyPointer m_physical_positions_ptr; + + /** + * Pointer to the virtual_axes property. + */ + baci::SmartPropertyPointer m_virtual_axes_ptr; + + /** + * Pointer to the plain_virtual_positions property. + */ + baci::SmartPropertyPointer m_plain_virtual_positions_ptr; + + /** + * Pointer to the virtual_positions property. + */ + baci::SmartPropertyPointer m_virtual_positions_ptr; + + /** + * Pointer to the virtual_offsets property. + */ + baci::SmartPropertyPointer m_virtual_offsets_ptr; + + /** + * Pointer to the virtual_user_offsets property. + */ + baci::SmartPropertyPointer m_virtual_user_offsets_ptr; + + /** + * Pointer to the virtual_system_offsets property. + */ + baci::SmartPropertyPointer m_virtual_system_offsets_ptr; + + /** + * Pointer to the in_use property. + */ + baci::SmartPropertyPointer> m_in_use_ptr; + + /** + * Pointer to the current_setup property. + */ + baci::SmartPropertyPointer m_current_setup_ptr; + + /** + * Table containing the coefficients for the positions calculations. + */ + SRTMinorServoLookupTable m_current_lookup_table; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; +protected: + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; +}; + +/** + * MACRO definition of child classes methods. + * This simplifies the declaration since these methods' implementations are the same for both SRTGenericMinorServo and SRTProgramTrackMinorServo classes. + * This was necessary since these are pure virtual methods in POA_MinorServo::SRTGenericMinorServo and POA_MinorServo::SRTProgramTrackMinorServo, + * and even if they are inherited from the SRTBaseMinorServo class they are not seen by the compiler and they must be declared inside the respective classes. + * Take a look to the SRTBaseMinorServoImpl class for more information for each of these methods. + */ +#define METHODS_DECLARATION \ + void stow(CORBA::Long stow_position = 1) { SRTBaseMinorServoImpl::stow(stow_position); }\ + void stop() { SRTBaseMinorServoImpl::stop(); }\ + void preset(const ACS::doubleSeq& coordinates) { SRTBaseMinorServoImpl::preset(coordinates); }\ + ACS::doubleSeq* calcCoordinates(CORBA::Double elevation) { return SRTBaseMinorServoImpl::calcCoordinates(elevation); }\ + ACS::doubleSeq* getUserOffsets() { return SRTBaseMinorServoImpl::getUserOffsets(); }\ + void setUserOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setUserOffset(axis_name, offset); }\ + void clearUserOffsets() { SRTBaseMinorServoImpl::clearUserOffsets(); }\ + ACS::doubleSeq* getSystemOffsets() { return SRTBaseMinorServoImpl::getSystemOffsets(); }\ + void setSystemOffset(const char* axis_name, CORBA::Double offset) { SRTBaseMinorServoImpl::setSystemOffset(axis_name, offset); }\ + void clearSystemOffsets() { SRTBaseMinorServoImpl::clearSystemOffsets(); }\ + void reloadOffsets() { SRTBaseMinorServoImpl::reloadOffsets(); }\ + void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { SRTBaseMinorServoImpl::getAxesInfo(axes_names_out, axes_units_out); }\ + ACS::doubleSeq* getAxesPositions(ACS::Time acs_time) { return SRTBaseMinorServoImpl::getAxesPositions(acs_time); }\ + long getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest) { return SRTBaseMinorServoImpl::getTravelTime(start, dest); }\ + void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) { SRTBaseMinorServoImpl::getAxesRanges(min_ranges_out, max_ranges_out); } + +/** + * MACRO definition of child classes properties methods. + * This simplifies the declaration since these properties' methods implementations are the same for both SRTGenericMinorServo and SRTProgramTrackMinorServo classes. + * This was necessary since these are pure virtual methods in POA_MinorServo::SRTGenericMinorServo and POA_MinorServo::SRTProgramTrackMinorServo, + * and even if they are inherited from the SRTBaseMinorServo class they are not seen by the compiler and they must be declared inside the respective classes. + * Take a look to the SRTBaseMinorServoImpl class for more information for each of these properties methods. + */ +#define PROPERTIES_DECLARATION \ + virtual Management::ROTBoolean_ptr enabled() { return SRTBaseMinorServoImpl::enabled(); }\ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status() { return SRTBaseMinorServoImpl::drive_cabinet_status(); }\ + virtual Management::ROTBoolean_ptr block() { return SRTBaseMinorServoImpl::block(); }\ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode() { return SRTBaseMinorServoImpl::operative_mode(); }\ + virtual ACS::RObooleanSeq_ptr physical_axes_enabled() { return SRTBaseMinorServoImpl::physical_axes_enabled(); }\ + virtual ACS::ROdoubleSeq_ptr physical_positions() { return SRTBaseMinorServoImpl::physical_positions(); }\ + virtual ACS::ROlong_ptr virtual_axes() { return SRTBaseMinorServoImpl::virtual_axes(); }\ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions() { return SRTBaseMinorServoImpl::plain_virtual_positions(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_positions() { return SRTBaseMinorServoImpl::virtual_positions(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }\ + virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }\ + virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }\ + virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); } + +/** + * This class implements the SRTGenericMinorServoImpl CORBA interface for a generic SRTMinorServo component. + * It inherits from the SRTBaseMinorServoImpl class. + * A SRTGenericMinorServo component does not need to implement any tracking feature. + */ +class SRTGenericMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTGenericMinorServo +{ +public: + /** + * Constructor + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + */ + SRTGenericMinorServoImpl(const ACE_CString &component_name, maci::ContainerServices *container_services); + + /** + * Destructor. + */ + ~SRTGenericMinorServoImpl(); + + /** + * Status method definition. It simply calls and returns the SRTBaseMinorServoImpl method. + */ + bool status() { return SRTBaseMinorServoImpl::status(); } + + /** + * Setup method definition. It simply calls the SRTBaseMinorServoImpl method. + */ + bool setup(const char* configuration_name = "") { return SRTBaseMinorServoImpl::setup(configuration_name); } + + /** + * Declaration of all the other inherited methods. + */ + METHODS_DECLARATION; + + /** + * Declaration of all the other inherited properties methods. + */ + PROPERTIES_DECLARATION; +}; + +/** + * This class implements the SRTProgramTrackMinorServoImpl CORBA interface for a tracking-capable SRTMinorServo component. + * It inherits from the SRTBaseMinorServoImpl class. + * A SRTProgramTrackMinorServo component is capable of commanding a trajectory to track to its related minor servo system. + */ +class SRTProgramTrackMinorServoImpl: public SRTBaseMinorServoImpl, public virtual POA_MinorServo::SRTProgramTrackMinorServo +{ +public: + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTProgramTrackMinorServoImpl(const ACE_CString &component_name, maci::ContainerServices *container_services); + + /** + * Destructor. + */ + ~SRTProgramTrackMinorServoImpl(); + + /** + * Overloaded initialize method. It calls the SRTBaseMinorServoImpl initialize method and performs some other initialization routines. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Overloaded status method. It calls the SRTBaseMinorServoImpl status method and performs some other routines. + * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware. + */ + bool status(); + + /** + * Overloaded setup method. It calls the SRTBaseMinorServoImpl status method and performs some other routines. + * @param configuration_name the configuration the servo system should assume. + * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. + */ + bool setup(const char* configuration_name = ""); + + /** + * Declaration of all the other inherited methods. + */ + METHODS_DECLARATION; + + /** + * Loads a set of tracking coordinates to the minor servo system. + * @param trajectory_id the ID of the trajectory. This defaults to UNIX Epoch * 1000 (milliseconds precision) of the starting time of the trajectory. + * @param point_id the ID of the point inside the current trajectory. + * @param point_time the timestamp associated with the given set of tracking coordinates. + * @coordinates the given set of tracking coordinates. + * @throw MinorServoErrors::MinorServoErrorsEx if the length of the coordinates sequence doesn't match the number of virtual axes of the servo, + * if the resulting position summing the offsets would go outside the accepted range of the servo, + * if there has been a communication error or if the command was not accepted. + */ + void programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& coordinates); + + /** + * Returns the tracking status of the minor servo. + * @return true if the minor servo is tracking within the tracking error, false otherwise + */ + bool isTracking() { return m_tracking.load() == Management::MNG_TRUE; } + + /** + * Declaration of all the other inherited properties methods. + */ + PROPERTIES_DECLARATION; + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to the read-only boolean property tracking. + */ + virtual Management::ROTBoolean_ptr tracking(); + + /** + * Returns a reference to the trajectory_id property implementation of the IDL interface. + * @return pointer to the read-only long property trajectory_id. + */ + virtual ACS::ROlong_ptr trajectory_id(); + + /** + * Returns a reference to the total_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property total_trajectory_points. + */ + virtual ACS::ROlong_ptr total_trajectory_points(); + + /** + * Returns a reference to the remaining_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property remaining_trajectory_points. + */ + virtual ACS::ROlong_ptr remaining_trajectory_points(); + + /** + * Returns a reference to the tracking_error property implementation of the IDL interface. + * @return pointer to the read-only double sequence property tracking_error. + */ + virtual ACS::ROdoubleSeq_ptr tracking_error(); + +private: + /** + * Queue of positions to be assumed by the servo system when tracking a trajectory. + */ + SRTMinorServoPositionsQueue m_tracking_queue; + + /** + * Tracking delta values for all minor servo system virtual axes. + */ + const std::vector m_tracking_delta; + + /** + * Tracking error values for all minor servo system virtual axes. + */ + std::vector m_tracking_error; + + /** + * Indicates if the servo system is tracking or not. It is tracking when the position error is lower than the tracking delta for all the virtual axes. + */ + std::atomic m_tracking; + + /** + * Current trajectory ID. + */ + std::atomic m_trajectory_id; + + /** + * Total trajectory points of the current trajectory. + */ + std::atomic m_total_trajectory_points; + + /** + * Remaining trajectory points of the current trajectory. + */ + std::atomic m_remaining_trajectory_points; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer> m_tracking_ptr; + + /** + * Pointer to the trajectory_id property. + */ + baci::SmartPropertyPointer m_trajectory_id_ptr; + + /** + * Pointer to the total_trajectory_points property. + */ + baci::SmartPropertyPointer m_total_trajectory_points_ptr; + + /** + * Pointer to the remaining_trajectory_points property. + */ + baci::SmartPropertyPointer m_remaining_trajectory_points_ptr; + + /** + * Pointer to the tracking_error property. + */ + baci::SmartPropertyPointer m_tracking_error_ptr; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h new file mode 100644 index 000000000..031e058a8 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoParkThread.h @@ -0,0 +1,78 @@ +#ifndef _SRTMINORSERVOPARKTHREAD_H_ +#define _SRTMINORSERVOPARKTHREAD_H_ + +/** + * SRTMinorServoParkThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoBossCore.h" + +// Same timeout as the one defined for the SETUP procedure +#define PARK_TIMEOUT 120 + +class SRTMinorServoBossCore; + + +/** + * This class implements a parking thread. This thread is in charge of checking the status of the minor servos parking procedure. + */ +class SRTMinorServoParkThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param core a reference to the SRTMinorServoBossCore object. + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoParkThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoParkThread"; + +private: + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current status of the finite-state machine. + */ + unsigned int m_status; + + /** + * The starting time of the park procedure. Used to check if we ran out of time. + */ + double m_start_time; +}; + +#endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h new file mode 100644 index 000000000..e5c26e67d --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoScanThread.h @@ -0,0 +1,96 @@ +#ifndef _SRTMINORSERVOSCANTHREAD_H_ +#define _SRTMINORSERVOSCANTHREAD_H_ + +/** + * SRTMinorServoScanThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoBossCore.h" +#include "SRTMinorServoContainers.h" + + +class SRTMinorServoBossCore; + + +/** + * This class implements a scan thread. This thread is in charge of positioning the minor servos during a scan operation. + */ +class SRTMinorServoScanThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoScanThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoScanThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoScanThread"; + +private: + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current trajectory ID. + */ + unsigned int m_trajectory_id; + + /** + * The current trajectory point ID. + */ + unsigned int m_point_id; + + /** + * The current trajectory point time. + */ + ACS::Time m_point_time; + + /** + * Boolean which indicates if the scan thread exited with an error or not. + */ + bool m_error; + + /** + * The queue of offsets to be added to the original tracking coordinates. + */ + MinorServo::SRTMinorServoPositionsQueue m_scan_offsets; + + /** + * The coordinates to which the minor servo involved in the scan was positioned before starting the scan itself. + */ + ACS::doubleSeq m_starting_coordinates; +}; + +#endif /*_SRTMINORSERVOSCANTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h new file mode 100644 index 000000000..2a1f4297f --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoSetupThread.h @@ -0,0 +1,87 @@ +#ifndef _SRTMINORSERVOSETUPTHREAD_H_ +#define _SRTMINORSERVOSETUPTHREAD_H_ + +/** + * SRTMinorServoSetupThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoBossCore.h" + +// GFR from -160 to 160 takes approximately 110 seconds +#define SETUP_TIMEOUT 120 + +class SRTMinorServoBossCore; + + +/** + * This class implements a setup thread. This thread is in charge of checking the status of the minor servos setup procedure. + */ +class SRTMinorServoSetupThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoSetupThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoSetupThread"; + +private: + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current status of the finite-state machine. + */ + unsigned int m_status; + + /** + * The starting time of the park procedure. Used to check if we ran out of time. + */ + double m_start_time; + + /** + * The requested Leonardo minor servo focal configuration. + */ + std::string m_LDO_configuration; + + /** + * The gregorian cover position to be reached for the requested focal configuration. + */ + MinorServo::SRTMinorServoGregorianCoverStatus m_gregorian_cover_position; +}; + +#endif /*_SRTMINORSERVOSETUPTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h new file mode 100644 index 000000000..fbe34f5ad --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoStatusThread.h @@ -0,0 +1,87 @@ +#ifndef _SRTMINORSERVOSTATUSTHREAD_H_ +#define _SRTMINORSERVOSTATUSTHREAD_H_ + +/** + * SRTMinorServoStatusThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoBossCore.h" +#include + +class SRTMinorServoBossCore; + + +/** + * This class implements a status thread. This thread is in charge of updating the status of the minor servo components. + */ +class SRTMinorServoStatusThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoStatusThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoStatusThread"; + +private: + /** + * Method that publishes the status onto the ACS notification channel. + */ + void publish(); + + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current status of the finite-state machine. + */ + unsigned int m_status; + + /** + * The sleeping time of the thread. + * The thread should be cycling at a constant rate, therefore the inner sleeping time is always updated taking into account this and the thread execution time. + */ + ACS::TimeInterval m_sleep_time; + + /** + * The ACS notification channel simple supplier object. + */ + nc::SimpleSupplier* m_notification_channel; +}; + +#endif /*_SRTMINORSERVOSTATUSTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h new file mode 100644 index 000000000..32ae15c9e --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h @@ -0,0 +1,85 @@ +#ifndef _SRTMINORSERVOTRACKINGTHREAD_H_ +#define _SRTMINORSERVOTRACKINGTHREAD_H_ + +/** + * SRTMinorServoTrackingThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoBossCore.h" + + +class SRTMinorServoBossCore; + + +/** + * This class implements a tracking thread. This thread is in charge of positioning the minor servos in time. + */ +class SRTMinorServoTrackingThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTMinorServoTrackingThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + + /** + * The name of this class of threads. Since a single instance of this thread class can only run it is ok to reuse the same name. + */ + static constexpr const char* c_thread_name = "SRTMinorServoTrackingThread"; + +private: + /** + * The reference to the SRTMinorServoBossCore object. + */ + SRTMinorServoBossCore& m_core; + + /** + * The current trajectory ID. + */ + unsigned int m_trajectory_id; + + /** + * The current trajectory point ID. + */ + unsigned int m_point_id; + + /** + * The current trajectory point time. + */ + ACS::Time m_point_time; + + /** + * Boolean which indicates if the tracking thread exited with an error or not. + */ + bool m_error; +}; + +#endif /*_SRTMINORSERVOTRACKINGTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h new file mode 100644 index 000000000..0dc0dd252 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SuppressWarnings.h @@ -0,0 +1,13 @@ +#ifndef __SUPPRESSWARNINGS_H__ +#define __SUPPRESSWARNINGS_H__ + +/** + * SuppressWarnings.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include +C11_IGNORE_WARNING_PUSH +C11_IGNORE_WARNING("-Wsequence-point") +C11_IGNORE_WARNING("-Wdeprecated-declarations") +#endif diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index 6c47bef42..c11de1645 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -1,35 +1,46 @@ -#***************************************** -#----------------------------------------- -# Marco Buttu -#----------------------------------------- -#***************************************** +#******************************************** +#-------------------------------------------- +# Giuseppe Carboni +#-------------------------------------------- +#******************************************** +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = -PY_PACKAGES = -PY_SCRIPTS = +PY_SCRIPTS = #_cover # On-Line Database Files # ---------------------- -CDB_SCHEMAS = MinorServo +CDB_SCHEMAS = SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoProperties SRTMinorServoLookupTable # ---------------------------- # Libraries (public and local) # ---------------------------- -LIBRARIES = WPServoImpl MinorServoBossImpl - -WPServoImpl_OBJECTS = WPServoImpl WPServoSocket WPServoTalker RequestDispatcher \ - WPStatusUpdater SocketListener utils libCom WPUtils -WPServoImpl_LIBS = MinorServoStubs IRALibrary ComponentErrors \ - SRTMinorServoLibrary MinorServoErrors - -MinorServoBossImpl_OBJECTS = MinorServoBossImpl utils SetupThread ParkThread \ - TrackingThread ScanThread MSBossPublisher libCom \ - MSBossConfiguration -MinorServoBossImpl_LIBS = MinorServoStubs MinorServoBossStubs SRTMinorServoLibrary \ - ManagmentDefinitionsStubs ManagementErrors \ - IRALibrary ComponentErrors MinorServoErrors acsnc \ - ParserErrors DiscosVersion AntennaDefinitionsStubs MountStubs \ - AntennaBossStubs AntennaErrors ActiveSurfaceBossStubs \ - SRTActiveSurfaceBossStubs MinorServoDefinitionsStubs +LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl + +USER_CFLAGS = + +SRTMinorServoBossImpl_OBJECTS = SRTMinorServoBossCore SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoScanThread SRTMinorServoBossImpl SRTMinorServoStatusThread +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc +SRTMinorServoBossImpl_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoBossCore_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoStatusThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoSetupThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoParkThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoTrackingThread_CFLAGS = -std=c++17 -fconcepts +SRTMinorServoScanThread_CFLAGS = -std=c++17 -fconcepts + +SRTBaseMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTGenericMinorServoImpl_OBJECTS = SRTGenericMinorServoImpl SRTBaseMinorServoImpl +SRTGenericMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion +SRTGenericMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl +SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion +SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 -fconcepts + + # ---------------------------------------------------------------------- # List of all possible C-sources (used to create automatic dependencies) # ---------------------------------------------------------------------- @@ -54,19 +65,12 @@ all: do_all @echo " . . . 'all' done" clean : clean_all - $(RM) *~ ../include/*~ ../idl/*~ ../*~ ../../*~ core - $(RM) ../doc/html - $(RM) tmp.txt acsexmplbeans.jar ../doc/abeans.log - $(RM) ../lib/python/site-packages/* - $(RM) $(INTROOT)/lib/python/site-packages/SRTMinorServoTest - $(RM) $(INTROOT)/bin/mscu-runserver @echo " . . . clean done" clean_dist : clean clean_dist_all @echo " . . . clean_dist done" man : do_man - # cp ../doc/html/group__ACSEXMPLDOC.html ../doc/html/main.html @echo " . . . man page(s) done" install : install_all diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp new file mode 100644 index 000000000..df2e50b72 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -0,0 +1,811 @@ +#include "SRTMinorServoImpl.h" + +using namespace MinorServo; + +SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, maci::ContainerServices* container_services): + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_servo_name(std::string(strchr(component_name.c_str(), '/') + 1)), + m_virtual_axes(getCDBValue(container_services, "virtual_axes")), + m_physical_axes(getCDBValue(container_services, "physical_axes")), + m_virtual_axes_names(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_positions")), + m_virtual_axes_units(SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_status( + m_servo_name, + SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_axes_enabled"), + SRTBaseMinorServoImpl::getPropertiesTable(*this, "physical_positions"), + m_virtual_axes_names, + SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets") + ), + m_user_offsets(m_virtual_axes, 0.0), + m_system_offsets(m_virtual_axes, 0.0), + m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), + m_min(SRTBaseMinorServoImpl::getMotionConstant(*this, "min_range")), + m_max(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_range")), + m_m_s(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_speed")), + m_a(SRTBaseMinorServoImpl::getMotionConstant(*this, "acceleration")), + m_r_t(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_times")), + m_r_d(SRTBaseMinorServoImpl::getMotionConstant(*this, "ramp_distances")), + m_c_s(m_virtual_axes, 0.0), + m_in_use(Management::MNG_FALSE), + m_current_setup(""), + m_enabled_ptr(this), + m_drive_cabinet_status_ptr(this), + m_block_ptr(this), + m_operative_mode_ptr(this), + m_physical_axes_enabled_ptr(this), + m_physical_positions_ptr(this), + m_virtual_axes_ptr(this), + m_plain_virtual_positions_ptr(this), + m_virtual_positions_ptr(this), + m_virtual_offsets_ptr(this), + m_virtual_user_offsets_ptr(this), + m_virtual_system_offsets_ptr(this), + m_in_use_ptr(this), + m_current_setup_ptr(this), + m_current_lookup_table(), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) +{ + AUTO_TRACE(m_servo_name + "::SRTBaseMinorServoImpl()"); +} + +SRTBaseMinorServoImpl::~SRTBaseMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTBaseMinorServoImpl()"); +} + +void SRTBaseMinorServoImpl::initialize() +{ + AUTO_TRACE(m_servo_name + "::initialize()"); + + try + { + m_enabled_ptr = new ROEnumImpl((m_component_name + ":enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("enabled", m_status, &SRTMinorServoStatus::isEnabled), true); + m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), + new MSAnswerMapDevIO("drive_cabinet_status", m_status, &SRTMinorServoStatus::getDriveCabinetStatus), true); + m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), + new MSAnswerMapDevIO("block", m_status, &SRTMinorServoStatus::isBlocked), true); + m_operative_mode_ptr = new ROEnumImpl((m_component_name + ":operative_mode").c_str(), getComponent(), + new MSAnswerMapDevIO("operative_mode", m_status, &SRTMinorServoStatus::getOperativeMode), true); + m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("physical_axes_enabled", m_status, &SRTMinorServoStatus::getPhysicalAxesEnabled), true); + m_physical_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":physical_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("physical_positions", m_status, &SRTMinorServoStatus::getPhysicalPositions), true); + m_virtual_axes_ptr = new baci::ROlong((m_component_name + ":virtual_axes").c_str(), getComponent(), + new MSGenericDevIO(m_virtual_axes), true); + m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("plain_virtual_positions", m_status, &SRTMinorServoStatus::getPlainVirtualPositions), true); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_positions", m_status, &SRTMinorServoStatus::getVirtualPositions), true); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_offsets", m_status, &SRTMinorServoStatus::getVirtualOffsets), true); + m_virtual_user_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_user_offsets").c_str(), getComponent(), + new MSGenericDevIO>(m_user_offsets), true); + m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_system_offsets").c_str(), getComponent(), + new MSGenericDevIO>(m_system_offsets), true); + m_in_use_ptr = new ROEnumImpl((m_component_name + ":in_use").c_str(), getComponent(), + new MSGenericDevIO>(m_in_use), true); + m_current_setup_ptr = new baci::ROstring((m_component_name + ":current_setup").c_str(), getComponent(), + new MSGenericDevIO(m_current_setup), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + // Try to read the current status of the servo + try + { + status(); + } + catch(...) + { + // This block is necessary since the socket might not be connected yet. If the Leonardo system is not reachable the status(); call will fail, but we want to instantiate the component anyway + // A non connected socket will try to connect every time a new command is sent, therefore the status thread will establish the connection as soon as possible. + } +} + +void SRTBaseMinorServoImpl::execute() +{ + AUTO_TRACE(m_servo_name + "::execute()"); +} + +void SRTBaseMinorServoImpl::cleanUp() +{ + AUTO_TRACE(m_servo_name + "::cleanUp()"); +} + +void SRTBaseMinorServoImpl::aboutToAbort() +{ + AUTO_TRACE(m_servo_name + "::aboutToAbort()"); +} + +/////////////////// PUBLIC methods +bool SRTBaseMinorServoImpl::status() +{ + AUTO_TRACE(m_servo_name + "::status()"); + + // We don't check if the socket is connected here since a status command will try to reconnect it automatically + try + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); + + ACS::doubleSeq current_point = m_status.getVirtualPositions(); + + // Calculate the current speed of the axes + try + { + std::pair> previous_point = m_positions_queue.get(m_status.getTimestamp()); + for(size_t i = 0; i < m_virtual_axes; i++) + { + m_c_s[i] = (current_point[i] - previous_point.second[i]) * ((double(m_status.getTimestamp() - previous_point.first)) / 10000000); + } + } + catch(...) + { + // Empty queue, first reading, skip the speed calculation + } + + m_positions_queue.put(m_status.getTimestamp(), current_point); + } + catch(...) + { + return false; + } + + return true; +} + +void SRTBaseMinorServoImpl::stow(CORBA::Long stow_position) +{ + AUTO_TRACE(m_servo_name + "::stow()"); + + checkLineStatus(); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow(m_servo_name, (unsigned int)stow_position)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stow()").c_str()); + ex.setReason("Received NAK in response to a STOW command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTBaseMinorServoImpl::stop() +{ + AUTO_TRACE(m_servo_name + "::stop()"); + + checkLineStatus(); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stop(m_servo_name)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stop()").c_str()); + ex.setReason("Received NAK in response to a STOP command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) +{ + AUTO_TRACE(m_servo_name + "::preset()"); + + checkLineStatus(); + + if(virtual_coordinates.length() != m_virtual_axes) + { + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.addData("Reason", "Wrong number of values for this servo system."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + ACS::doubleSeq offsets = m_status.getVirtualOffsets(); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + double coordinate = coordinates[i] + offsets[i]; + if(coordinate < m_min[i] || coordinate > m_max[i]) + { + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.addData("Reason", "Resulting position out of range, check the offsets."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, coordinates)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); + ex.setReason("Received NAK in response to a PRESET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +bool SRTBaseMinorServoImpl::setup(const char* configuration_name) +{ + AUTO_TRACE(m_servo_name + "::setup()"); + m_in_use.store(Management::MNG_FALSE); + m_current_lookup_table.clear(); + + m_current_setup = ""; + std::string setup_name(configuration_name); + std::transform(setup_name.begin(), setup_name.end(), setup_name.begin(), ::toupper); + + if(setup_name.empty()) + { + return false; + } + + IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "axis", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field axis", 0); + } + if(!table.addField(error, "coefficients", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field coefficients", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + std::string axis = std::string(table["axis"]->asString()); + + std::vector coefficients; + + std::string coefficient_str; + std::stringstream stream(std::string(table["coefficients"]->asString())); + + while(std::getline(stream, coefficient_str, ',')) + { + coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + } + + m_current_lookup_table[axis] = coefficients; + } + table.closeTable(); + + if(m_current_lookup_table.size() > 0) + { + m_current_setup = setup_name; + clearUserOffsets(); + clearSystemOffsets(); + m_in_use.store(Management::MNG_TRUE); + } + + return true; +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) +{ + AUTO_TRACE(m_servo_name + "::calcCoordinates()"); + + if(m_in_use.load() == Management::MNG_TRUE) + { + ACS::doubleSeq_var coordinates = new ACS::doubleSeq; + coordinates->length(m_virtual_axes); + + for(size_t axis = 0; axis < m_virtual_axes; axis++) + { + std::vector coefficients = m_current_lookup_table.at(m_virtual_axes_names[axis]); + + double coordinate = 0; + + for(size_t index = 0; index < coefficients.size(); index++) + { + coordinate += coefficients[index] * pow(elevation, index); + } + + coordinates[axis] = coordinate; + } + + return coordinates._retn(); + } + else + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::calcCoordinates()").c_str()); + ex.setReason("Unable to calculate the coordinates since the servo system has not been configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::getUserOffsets() +{ + AUTO_TRACE(m_servo_name + "::getUserOffsets()"); + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(m_user_offsets.size()); + std::copy(m_user_offsets.begin(), m_user_offsets.end(), offsets->begin()); + return offsets._retn(); +} + +void SRTBaseMinorServoImpl::setUserOffset(const char* axis_name, CORBA::Double offset) +{ + AUTO_TRACE(m_servo_name + "::setUserOffset()"); + + checkLineStatus(); + + std::string axis(axis_name); + std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); + + if(axis == "RZ" && m_virtual_axes == 1) + { + axis = "ROTATION"; + } + + unsigned int index = std::distance(m_virtual_axes_names.begin(), std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis)); + + if(index == m_virtual_axes) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", ("Unknown axis '" + axis + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + // Calculate the new offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + offsets[index] = m_system_offsets[index] + offset; + + if(offsets[index] < m_min[index] || offsets[index] > m_max[index]) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", "Sum of user and system offsets out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + m_user_offsets[index] = offset; +} + +void SRTBaseMinorServoImpl::clearUserOffsets() +{ + AUTO_TRACE(m_servo_name + "::clearUserOffsets()"); + + checkLineStatus(); + + m_user_offsets = std::vector(m_virtual_axes, 0.0); + + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearUserOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::getSystemOffsets() +{ + AUTO_TRACE(m_servo_name + "::getSystemOffsets()"); + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + offsets->length(m_system_offsets.size()); + std::copy(m_system_offsets.begin(), m_system_offsets.end(), offsets->begin()); + return offsets._retn(); +} + +void SRTBaseMinorServoImpl::setSystemOffset(const char* axis_name, CORBA::Double offset) +{ + AUTO_TRACE(m_servo_name + "::setSystemOffset()"); + + checkLineStatus(); + + std::string axis(axis_name); + std::transform(axis.begin(), axis.end(), axis.begin(), ::toupper); + + if(axis == "RZ" && m_virtual_axes == 1) + { + axis = "ROTATION"; + } + + unsigned int index = std::distance(m_virtual_axes_names.begin(), std::find(m_virtual_axes_names.begin(), m_virtual_axes_names.end(), axis)); + + if(index == m_virtual_axes) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setSystemOffset()").c_str()); + ex.addData("Reason", ("Unknown axis '" + axis + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + // Calculate the new offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + offsets[index] = m_user_offsets[index] + offset; + + if(offsets[index] < m_min[index] || offsets[index] > m_max[index]) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); + ex.addData("Reason", "Sum of user and system offsets out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setSystemOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + m_system_offsets[index] = offset; +} + +void SRTBaseMinorServoImpl::clearSystemOffsets() +{ + AUTO_TRACE(m_servo_name + "::clearSystemOffsets()"); + + checkLineStatus(); + + m_system_offsets = std::vector(m_virtual_axes, 0.0); + + // Update the offsets + std::vector offsets(m_virtual_axes, 0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), offsets.begin(), std::plus()); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearSystemOffset()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTBaseMinorServoImpl::reloadOffsets() +{ + AUTO_TRACE(m_servo_name + "::reloadOffsets()"); + + // Sum the user and system DISCOS offsets to check whether they correspond to the Leonardo offsets + std::vector DISCOS_offsets(m_virtual_axes, 0.0); + std::transform(m_user_offsets.begin(), m_user_offsets.end(), m_system_offsets.begin(), DISCOS_offsets.begin(), std::plus()); + + // Read the Leonardo offsets + ACS::doubleSeq sequence = m_status.getVirtualOffsets(); + std::vector LEONARDO_offsets(sequence.get_buffer(), sequence.get_buffer() + sequence.length()); + + // Check if the offsets correspond or not + if(!std::equal(DISCOS_offsets.begin(), DISCOS_offsets.end(), LEONARDO_offsets.begin())) + { + // Offsets do not correspond, should reset them by sending a offset command + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, DISCOS_offsets)).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::reloadOffsets()").c_str()); + ex.setReason("Received NAK in response to an OFFSET command."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, m_servo_name + "::reloadOffsets()", (LM_NOTICE, "Offsets discrepancy, reloading them")); + } +} + +void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) +{ + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesInfo()"); + + ACS::stringSeq_var axes_names = new ACS::stringSeq; + ACS::stringSeq_var axes_units = new ACS::stringSeq; + axes_names->length(m_virtual_axes); + axes_units->length(m_virtual_axes); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + axes_names[i] = (m_servo_name + "_" + m_virtual_axes_names[i] == "ROTATION" ? "RZ" : m_virtual_axes_names[i]).c_str(); + axes_units[i] = m_virtual_axes_units[i].c_str(); + } + + axes_names_out = axes_names._retn(); + axes_units_out = axes_units._retn(); +} + +ACS::doubleSeq* SRTBaseMinorServoImpl::getAxesPositions(ACS::Time acs_time) +{ + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesPositions()"); + + // Get the latest position + if(acs_time == 0) + { + acs_time = getTimeStamp(); + } + + try + { + std::vector p = m_positions_queue.get(acs_time).second; + + ACS::doubleSeq_var positions = new ACS::doubleSeq; + positions->length(m_virtual_axes); + std::copy(p.begin(), p.end(), positions->begin()); + return positions._retn(); + } + catch(std::logic_error& le) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::getAxesPositions()").c_str()); + ex.setReason("Positions history is empty!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +ACS::TimeInterval SRTBaseMinorServoImpl::getTravelTime(const ACS::doubleSeq& _s_p, const ACS::doubleSeq& d_p) +{ + AUTO_TRACE(m_servo_name + "::getTravelTime()"); + + std::vector c_s = m_c_s; // Current speed + + ACS::doubleSeq s_p(_s_p); + + // No starting coordinates, it means we have to start from the current position taking into account the current speed + if(_s_p.length() == 0) + { + s_p = *getAxesPositions(0); + } + else if(_s_p.length() != m_virtual_axes) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "getTravelTime()").c_str()); + ex.setReason("Wrong number of axes for starting_position."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + if(d_p.length() != m_virtual_axes) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "getTravelTime()").c_str()); + ex.setReason("Wrong number of axes for destination_position."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + // d = delta/distance + std::vector d(m_virtual_axes); + for(size_t i = 0; i < m_virtual_axes; i++) + { + d[i] = d_p[i] - s_p[i]; + + // If we sent a starting position, we are just checking the maximum time to get from the start to the desired position + // We take into account the worst case scenario for the speed, we assume we are moving away from the desired position at maximum speed for each axis + if(_s_p.length() != 0) + { + c_s[i] = m_m_s[i] * (d[i] < 0 ? 1 : (d[i] > 0 ? -1 : 0)); + } + } + + double total_time = 0; + + // Calculate the distance and time taken to get to the maximum speed towards the desired position + for(size_t i = 0; i < m_virtual_axes; i++) + { + double inversion_time = 0; + double inversion_distance = 0; + + // We are moving away from our desired position, this is the only case in which we need a deceleration ramp before even starting to move towards our destination + if(std::signbit(c_s[i]) != std::signbit(d[i]) && c_s[i] != 0) + { + inversion_time = std::abs(c_s[i]) / m_a[i]; + inversion_distance = std::abs(c_s[i]) * inversion_time + 0.5 * m_a[i] * std::pow(inversion_time, 2); + // In this case, we can calculate the next acceleration ramp using a starting speed of 0 + c_s = std::vector(c_s.size(), 0.0); + } + + double accel_ramp_time = (m_m_s[i] - std::abs(c_s[i])) / m_a[i]; + double accel_ramp_distance = std::abs(c_s[i]) * accel_ramp_time + 0.5 * m_a[i] * std::pow(accel_ramp_time, 2); + + // Total time = eventual inversion time + calculated acceleration ramp time + full deceleration time + linear movement time + // Linear movement time = linear movement distance / maximum speed + // Linear movement distance = distance + eventual inversion distance - acceleration ramp distance - full deceleration ramp distance + double t = inversion_time + accel_ramp_time + m_r_t[i] + (std::abs(d[i]) + inversion_distance - accel_ramp_distance - m_r_d[i]) / m_m_s[i]; + + total_time = std::max(total_time, t); + + // This does not take into account any dead time but: + // we're going to use this only for PROGRAMTRACK purposes and + // in PROGRAMTRACK mode the SRP servos move faster than the nominal max_speed + // i.e., IIRC, the max physical speed should be around 12mm/s instead of 4mm/s + // Therefore we might not need to add any guard time + } + + return ACS::TimeInterval(total_time * 10000000); +} + +void SRTBaseMinorServoImpl::getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) +{ + AUTO_TRACE("SRTBaseMinorServoImpl::getAxesRanges()"); + + ACS::doubleSeq_var min_ranges = new ACS::doubleSeq; + ACS::doubleSeq_var max_ranges = new ACS::doubleSeq; + min_ranges->length(m_virtual_axes); + max_ranges->length(m_virtual_axes); + std::copy(m_min.begin(), m_min.end(), min_ranges->begin()); + std::copy(m_max.begin(), m_max.end(), max_ranges->begin()); + min_ranges_out = min_ranges._retn(); + max_ranges_out = max_ranges._retn(); +} + +/////////////////// PROTECTED methods +void SRTBaseMinorServoImpl::checkLineStatus() +{ + if(!m_socket.isConnected()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "checkLineStatus()").c_str()); + ex.setReason("Socket not connected."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); + ex.setReason("Servo system blocked or drive cabinet error."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +std::vector SRTBaseMinorServoImpl::getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant) +{ + AUTO_STATIC_TRACE(object.m_servo_name + "::getMotionConstant()"); + + std::vector values; + + if(constant == "max_speed" || constant == "acceleration") + { + values = getCDBValue>(object.getContainerServices(), constant.c_str()); + if(values.size() != object.m_virtual_axes) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setFieldName(constant.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + else if(std::any_of(values.begin(), values.end(), [](double value) + { + return value == 0.0; + })) + { + _EXCPT(ComponentErrors::NotAllowedExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setReason(("A" + constant == "acceleration" ? "n " : " " + constant + " equals to 0 is not allowed.").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + } + else if(constant == "min_range" || constant == "max_range" || constant == "tracking_delta") + { + values = getCDBValue>(object.getContainerServices(), constant.c_str()); + if(values.size() != object.m_virtual_axes) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::getMotionConstant()").c_str()); + ex.setFieldName(constant.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + } + else if(constant == "ramp_times") // Acceleration ramp times, 0 to max_speed and vice versa + { + values = std::vector(object.m_virtual_axes); + std::transform(object.m_m_s.begin(), object.m_m_s.end(), object.m_a.begin(), values.begin(), std::divides()); + } + else if(constant == "ramp_distances") // Acceleration ramp distances, 0 to max_speed and vice versa + { + values = std::vector(object.m_virtual_axes); + std::transform(object.m_r_t.begin(), object.m_r_t.end(), object.m_a.begin(), values.begin(), [](double acceleration_ramp_time, double acceleration) + { + return 0.5 * acceleration * std::pow(acceleration_ramp_time, 2); + }); + } + + return values; +} + +/////////////////// PRIVATE methods +std::vector SRTBaseMinorServoImpl::getPropertiesTable(SRTBaseMinorServoImpl& object, const std::string& properties_name) +{ + AUTO_STATIC_TRACE(object.m_servo_name + "::getPropertiesTable()"); + + std::vector properties; + + IRA::CDBTable table(object.getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + object.m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field property_name", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + properties.push_back(std::string(table["property_name"]->asString())); + } + table.closeTable(); + + size_t expected_size = 0; + + if(properties_name.find("virtual_") == 0) + { + expected_size = object.m_virtual_axes; + } + else if(properties_name.find("physical_") == 0) + { + expected_size = object.m_physical_axes; + } + + if(expected_size == 0 || properties.size() != expected_size) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::initialize()").c_str()); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return properties; +} + + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(ROSRTMinorServoCabinetStatus, SRTBaseMinorServoImpl, m_drive_cabinet_status_ptr, drive_cabinet_status); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_block_ptr, block); +GET_PROPERTY_REFERENCE(ROSRTMinorServoOperativeMode, SRTBaseMinorServoImpl, m_operative_mode_ptr, operative_mode); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, SRTBaseMinorServoImpl, m_physical_axes_enabled_ptr, physical_axes_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTBaseMinorServoImpl, m_virtual_axes_ptr, virtual_axes); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_plain_virtual_positions_ptr, plain_virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_positions_ptr, virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_offsets_ptr, virtual_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_user_offsets_ptr, virtual_user_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_system_offsets_ptr, virtual_system_offsets); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_in_use_ptr, in_use); +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTBaseMinorServoImpl, m_current_setup_ptr, current_setup); diff --git a/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp new file mode 100644 index 000000000..1b3dad9ec --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTGenericMinorServoImpl.cpp @@ -0,0 +1,13 @@ +#include "SRTMinorServoImpl.h" + +SRTGenericMinorServoImpl::SRTGenericMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : SRTBaseMinorServoImpl(componentName, containerServices) +{ + AUTO_TRACE(m_servo_name + "::SRTGenericMinorServoImpl()"); +} + +SRTGenericMinorServoImpl::~SRTGenericMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTGenericMinorServoImpl()"); +} + +MACI_DLL_SUPPORT_FUNCTIONS(SRTGenericMinorServoImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp new file mode 100644 index 000000000..7c4052822 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -0,0 +1,1316 @@ +#include "SRTMinorServoBossCore.h" + +using namespace MinorServo; + +SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : + m_component(component), + m_status_thread(nullptr), + m_setup_thread(nullptr), + m_park_thread(nullptr), + m_tracking_thread(nullptr), + m_scan_thread(nullptr), + m_antennaBoss("IDL:alma/Antenna/AntennaBoss:1.0", m_component.getContainerServices()), + m_status(), + m_motion_status(MOTION_STATUS_UNCONFIGURED), + m_commanded_setup("Unknown"), + m_commanded_configuration(CONFIGURATION_UNKNOWN), + m_subsystem_status(Management::MNG_WARNING), + m_actual_setup("Unknown"), + m_ready(Management::MNG_FALSE), + m_starting(Management::MNG_FALSE), + m_as_configuration(getCDBConfiguration("active_surface_configuration")), + m_elevation_tracking(Management::MNG_FALSE), + m_elevation_tracking_enabled(getCDBConfiguration("elevation_tracking_enabled")), + m_scan_active(Management::MNG_FALSE), + m_scanning(Management::MNG_FALSE), + m_tracking(Management::MNG_FALSE), + m_reload_servo_offsets(true), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(m_component.getContainerServices())), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)), + m_socket_connected(m_socket.isConnected() ? Management::MNG_TRUE : Management::MNG_FALSE), + m_servos{ + //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") }, + { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") } + //{ "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } + }, + m_tracking_servos{ + //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, + { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } + } +{ + AUTO_TRACE("SRTMinorServoBossCore::SRTMinorServoBossCore()"); + + startThread(m_status_thread, (ACS::TimeInterval)(getCDBValue(m_component.getContainerServices(), "status_thread_period") * 10000000)); +} + +SRTMinorServoBossCore::~SRTMinorServoBossCore() +{ + AUTO_TRACE("SRTMinorServoBossCore::~SRTMinorServoBossCore()"); + + destroyThread(m_setup_thread); + destroyThread(m_park_thread); + destroyThread(m_tracking_thread); + destroyThread(m_scan_thread); + destroyThread(m_status_thread); +} + +bool SRTMinorServoBossCore::status() +{ + AUTO_TRACE("SRTMinorServoBossCore::status()"); + + try + { + // Attempt communication anyway + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(), m_status); + + if(m_socket_connected.load() == Management::MNG_FALSE) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_NOTICE, "Socket connected.")); + m_socket_connected.store(Management::MNG_TRUE); + m_subsystem_status.store(Management::MNG_WARNING); + } + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + if(m_socket_connected.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, (std::string("Socket disconnected: ") + getReasonFromEx(ex)).c_str())); + m_socket_connected.store(Management::MNG_FALSE); + + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + stopThread(m_scan_thread); + setFailure(); + + m_reload_servo_offsets = true; + } + + return false; + } + + try + { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoBossCore::status()", getReasonFromEx(ex)); + setFailure(); + return false; + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + /*if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) + { + // We only get here if the system is configured, therefore we check the correct position of the gregorian cover + SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_status.getFocalConfiguration() == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + if(m_status.getGregorianCoverPosition() != commanded_gregorian_cover_position) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Gregorian cover in wrong position.")); + setFailure(); + return false; + } + }*/ + + for(const auto& [name, servo] : m_servos) + { + if(!servo->status()) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, ("Error checking " + name + " status.").c_str())); + setFailure(); + return false; + } + + if(m_reload_servo_offsets) + { + servo->reloadOffsets(); + } + } + + m_reload_servo_offsets = false; + + if(motion_status == MOTION_STATUS_TRACKING) + { + if(std::all_of(m_current_tracking_servos.begin(), m_current_tracking_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->isTracking(); + })) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } + } + else if(motion_status == MOTION_STATUS_CONFIGURED) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } + + return true; +} + +void SRTMinorServoBossCore::setup(std::string commanded_setup) +{ + AUTO_TRACE("SRTMinorServoBossCore::setup()"); + + try + { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(getReasonFromEx(mse)); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + + if(m_scan_active.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, "THE SYSTEM IS PERFORMING A SCAN, CANNOT SETUP NOW")); + _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + + std::transform(commanded_setup.begin(), commanded_setup.end(), commanded_setup.begin(), ::toupper); + + std::pair cmd_configuration; + SRTMinorServoFocalConfiguration commanded_configuration; + + try + { + cmd_configuration = DiscosConfigurationNameTable.at(commanded_setup); + commanded_configuration = cmd_configuration.first; + if(m_as_configuration.load() == Management::MNG_TRUE && cmd_configuration.second) + { + commanded_setup += "_ASACTIVE"; + } + } + catch(std::out_of_range& oor) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("UNKNOWN CONFIGURATION '" + commanded_setup + "'").c_str())); + _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Unknown configuration '" + commanded_setup + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + + // Exit if commanded setup is already in place or is about to be + if(commanded_configuration == m_commanded_configuration.load() && commanded_setup == m_commanded_setup) + { + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status == MOTION_STATUS_STARTING) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("ALREADY SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + return; + } + else if(motion_status == MOTION_STATUS_CONFIGURED || motion_status == MOTION_STATUS_TRACKING) + { + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("CONFIGURATION '" + commanded_setup + "' ALREADY IN PLACE").c_str())); + return; + } + } + + ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); + + m_commanded_configuration.store(commanded_configuration); + m_commanded_setup = commanded_setup; + + // Stop the setup, park and tracking threads if running + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + + m_subsystem_status.store(Management::MNG_WARNING); + m_actual_setup = ""; + m_ready.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_TRUE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_STARTING); + m_current_servos.clear(); + m_current_tracking_servos.clear(); + + // Send the STOP command to all the servos + for(const auto& [servo_name, servo] : m_servos) + { + try + { + servo->stop(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, mse, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Error while sending the STOP command to " + servo_name + ".").c_str()); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + } + + // Start the setup thread + try + { + startThread(m_setup_thread); + } + catch(ComponentErrors::ComponentErrorsEx& ce) + { + _ADD_BACKTRACE(ManagementErrors::ConfigurationErrorExImpl, ex, ce, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while trying to start the setup_thread"); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } +} + +void SRTMinorServoBossCore::park() +{ + AUTO_TRACE("SRTMinorServoBossCore::park()"); + + try + { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason(getReasonFromEx(mse)); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + + if(m_scan_active.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "THE SYSTEM IS PERFORMING A SCAN, CANNOT PARK NOW")); + _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status == MOTION_STATUS_PARKING) + { + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "MINOR SERVOS ALREADY PARKING")); + return; + } + else if (motion_status == MOTION_STATUS_PARKED) + { + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "MINOR SERVOS ALREADY PARKED")); + return; + } + + ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "PARKING")); + + m_commanded_configuration.store(CONFIGURATION_PARK); + m_commanded_setup = "Park"; + + // Stop the setup, park and tracking threads if running + stopThread(m_setup_thread); + stopThread(m_park_thread); + stopThread(m_tracking_thread); + + m_subsystem_status.store(Management::MNG_WARNING); + m_actual_setup = ""; + m_ready.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_TRUE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_PARKING); + m_current_servos.clear(); + m_current_tracking_servos.clear(); + + /*try + { + // Send the STOW command to close the gregorian cover + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", COVER_STATUS_CLOSED)).checkOutput()) + { + _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while sending the STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + }*/ + + // Send the STOP command to all the servos + for(const auto& [servo_name, servo] : m_servos) + { + try + { + servo->stop(); + } + catch(MinorServoErrors::MinorServoErrorsEx& mse) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, mse, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason(("Error while sending the STOP command to " + servo_name + ".").c_str()); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + } + + // Start the park thread + try + { + startThread(m_park_thread); + } + catch(ComponentErrors::ComponentErrorsEx& ce) + { + _ADD_BACKTRACE(ManagementErrors::ParkingErrorExImpl, ex, ce, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("Error while trying to start the park_thread"); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } +} + +void SRTMinorServoBossCore::setElevationTracking(std::string configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::setElevationTracking()"); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setElevationTracking()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration != "ON" && configuration != "OFF") + { + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setElevationTracking()"); + ex.addData("Reason", ("Unknown setElevationTracking configuration '" + configuration + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "setServoElevationTracking", (LM_NOTICE, ("SETTING ELEVATION TRACKING TO " + configuration).c_str())); + + if(configuration == "ON" && m_elevation_tracking_enabled.load() != Management::MNG_TRUE) + { + m_elevation_tracking_enabled.store(Management::MNG_TRUE); + + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + { + m_motion_status.store(MOTION_STATUS_TRACKING); + startThread(m_tracking_thread); + } + } + else if(configuration == "OFF" && m_elevation_tracking_enabled.load() != Management::MNG_FALSE) + { + stopThread(m_tracking_thread); + m_elevation_tracking_enabled.store(Management::MNG_FALSE); + + if(m_motion_status.load() == MOTION_STATUS_TRACKING) + { + m_motion_status.store(MOTION_STATUS_CONFIGURED); + } + } +} + +void SRTMinorServoBossCore::setASConfiguration(std::string configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::setASConfiguration()"); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setASConfiguration()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration != "ON" && configuration != "OFF") + { + _EXCPT(MinorServoErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setASConfiguration()"); + ex.addData("Reason", ("Unknown setASConfiguration configuration '" + configuration + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "setServoASConfiguration", (LM_NOTICE, ("SETTING ACTIVE SURFACE CONFIGURATION TO " + configuration).c_str())); + + if(configuration == "ON" && m_as_configuration.load() != Management::MNG_TRUE) + { + m_as_configuration.store(Management::MNG_TRUE); + } + else if(configuration == "OFF" && m_as_configuration.load() != Management::MNG_FALSE) + { + m_as_configuration.store(Management::MNG_FALSE); + } + else + { + // We asked for the same configuration, nothing else to do + return; + } + + // Should reload the correct setup if the system was already configured or was about to be + if(!m_commanded_setup.empty()) + { + configuration = m_commanded_setup.substr(0, m_commanded_setup.find("_")); + try + { + setup(configuration); + } + catch(ManagementErrors::ConfigurationErrorEx& ce) + { + _ADD_BACKTRACE(MinorServoErrors::ConfigurationErrorExImpl, ex, ce, "SRTMinorServoBossCore::setASConfiguration()"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } +} + +void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) +{ + AUTO_TRACE("SRTMinorServoBossCore::setGregorianCoverPosition()"); + + checkLineStatus(); + + std::transform(position.begin(), position.end(), position.begin(), ::toupper); + + if(position != "OPEN" && position != "CLOSED") + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.addData("Reason", ("Unknown position '" + position + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_PARKING && motion_status != MOTION_STATUS_PARKED) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.setReason("You can set the gregorian cover position only when the system is parked or is parking."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_NOTICE, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTMinorServoBossCore::preset(double elevation) +{ + // Elevation is expressed in degrees + AUTO_TRACE("SRTMinorServoBossCore::preset()"); + + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::preset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + if(m_motion_status.load() != MOTION_STATUS_CONFIGURED) + { + _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, "SRTMinorServoBossCore::preset()"); + ex.addData("Reason", "Minor servos are tracking, cannot send a global preset command now."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + for(const auto& [servo_name, servo] : m_current_servos) + { + servo->preset(*servo->calcCoordinates(elevation)); + } +} + +void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) +{ + AUTO_TRACE("SRTMinorServoBossCore::clearUserOffsets()"); + + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + + if(servo_name == "ALL") + { + for(const auto& [servo_name, servo] : m_current_servos) + { + servo->clearUserOffsets(); + } + return; + } + else if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + try + { + auto servo = m_current_servos.at(servo_name); + servo->clearUserOffsets(); + } + catch(std::out_of_range& oor) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearUserOffsets()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double offset, bool log) +{ + AUTO_TRACE("SRTMinorServoBossCore::setUserOffset()"); + + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); + + std::stringstream ss(servo_axis_name); + std::string servo_name, axis_name; + std::getline(ss, servo_name, '_'); + ss >> axis_name; + + if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + try + { + auto servo = m_current_servos.at(servo_name); + if(log) + { + ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_NOTICE, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); + } + servo->setUserOffset(axis_name.c_str(), offset); + } + catch(std::out_of_range& oor) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setUserOffset()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +ACS::doubleSeq* SRTMinorServoBossCore::getUserOffsets() +{ + AUTO_TRACE("SRTMinorServoBossCore::getUserOffsets()"); + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getUserOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + + for(const auto& [servo_name, servo] : m_current_servos) + { + ACS::doubleSeq servo_offsets = *servo->getUserOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); + } + + return offsets._retn(); +} + +void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) +{ + AUTO_TRACE("SRTMinorServoBossCore::clearSystemOffsets()"); + + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(servo_name.begin(), servo_name.end(), servo_name.begin(), ::toupper); + + if(servo_name == "ALL") + { + for(const auto& [servo_name, servo] : m_current_servos) + { + servo->clearSystemOffsets(); + } + return; + } + else if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + try + { + auto servo = m_current_servos.at(servo_name); + servo->clearSystemOffsets(); + } + catch(std::out_of_range& oor) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::clearSystemOffsets()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double offset) +{ + AUTO_TRACE("SRTMinorServoBossCore::setSystemOffset()"); + + checkLineStatus(); + + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::transform(servo_axis_name.begin(), servo_axis_name.end(), servo_axis_name.begin(), ::toupper); + + std::stringstream ss(servo_axis_name); + std::string servo_name, axis_name; + std::getline(ss, servo_name, '_'); + ss >> axis_name; + + if(!m_servos.count(servo_name)) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.addData("Reason", ("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + try + { + auto servo = m_current_servos.at(servo_name); + servo->setSystemOffset(axis_name.c_str(), offset); + } + catch(std::out_of_range& oor) + { + _EXCPT(MinorServoErrors::OffsetErrorExImpl, ex, "SRTMinorServoBossCore::setSystemOffset()"); + ex.addData("Reason", ("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +ACS::doubleSeq* SRTMinorServoBossCore::getSystemOffsets() +{ + AUTO_TRACE("SRTMinorServoBossCore::getSystemOffsets()"); + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getSystemOffsets()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS::doubleSeq_var offsets = new ACS::doubleSeq; + + for(const auto& [servo_name, servo] : m_current_servos) + { + ACS::doubleSeq servo_offsets = *servo->getSystemOffsets(); + size_t start_index = offsets->length(); + offsets->length(start_index + servo_offsets.length()); + std::copy(servo_offsets.begin(), servo_offsets.end(), offsets->begin() + start_index); + } + + return offsets._retn(); +} + +void SRTMinorServoBossCore::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) +{ + AUTO_TRACE("SRTMinorServoBossCore::getAxesInfo()"); + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getAxesInfo()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::vector axes_names_vector, axes_units_vector; + + ACS::stringSeq_var axes_names = new ACS::stringSeq; + ACS::stringSeq_var axes_units = new ACS::stringSeq; + + for(const auto& [servo_name, servo] : m_current_servos) + { + ACS::stringSeq_var servo_axes_names; + ACS::stringSeq_var servo_axes_units; + servo->getAxesInfo(servo_axes_names, servo_axes_units); + + std::transform(servo_axes_names->begin(), servo_axes_names->end(), servo_axes_names->begin(), [servo_name](const char* axis_name) + { + return CORBA::string_dup((servo_name + "_" + axis_name).c_str()); + }); + + size_t names_index = axes_names->length(); + size_t units_index = axes_units->length(); + axes_names->length(names_index + servo_axes_names->length()); + axes_units->length(units_index + servo_axes_units->length()); + std::copy(servo_axes_names->begin(), servo_axes_names->end(), axes_names->begin() + names_index); + std::copy(servo_axes_units->begin(), servo_axes_units->end(), axes_units->begin() + units_index); + } + + axes_names_out = axes_names._retn(); + axes_units_out = axes_units._retn(); +} + +ACS::doubleSeq* SRTMinorServoBossCore::getAxesPositions(ACS::Time acs_time) +{ + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::getAxesPositions()"); + ex.setReason("The system is not configured yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + ACS::doubleSeq_var positions = new ACS::doubleSeq; + + for(const auto& [servo_name, servo] : m_current_servos) + { + ACS::doubleSeq servo_positions = *servo->getAxesPositions(acs_time); + size_t start_index = positions->length(); + positions->length(start_index + servo_positions.length()); + std::copy(servo_positions.begin(), servo_positions.end(), positions->begin() + start_index); + } + + return positions._retn(); +} + +SRTMinorServoScan SRTMinorServoBossCore::checkScanFeasibility(const ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +{ + // TODO: check whether to start from the left side or the right side, LOW priority + AUTO_TRACE("SRTMinorServoBossCore::checkScanFeasibility()"); + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkScanFeasibility()"); + + SRTMinorServoScan new_scan; + new_scan.scan_range = scan_info.range; + new_scan.scan_duration = scan_info.total_time; + new_scan.starting_elevation = antenna_info.elevation * DR2D; + + std::string axis_code(scan_info.axis_code); + // Get the axis that will have to be moved during the scan + std::transform(axis_code.begin(), axis_code.end(), axis_code.begin(), ::toupper); + std::string servo_name = axis_code.substr(0, axis_code.find("_")); + std::string axis_name = axis_code.substr(axis_code.find("_") + 1); + + new_scan.servo_name = servo_name; + new_scan.axis_name = axis_name; + + ACS::stringSeq_var servo_axes_names, servo_axes_units; + + if(!m_servos.count(servo_name)) + { + ex.setReason(("Unknown servo '" + servo_name + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(!m_tracking_servos.count(servo_name)) + { + ex.setReason(("Servo '" + servo_name + "' is not a tracking servo.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(!m_current_tracking_servos.count(servo_name)) + { + ex.setReason(("Servo '" + servo_name + "' not in use with the current configuration.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTProgramTrackMinorServo_ptr servo = m_current_tracking_servos.at(servo_name); + servo->getAxesInfo(servo_axes_names, servo_axes_units); + + size_t axis_index; + for(axis_index = 0; axis_index < servo_axes_names->length(); axis_index++) + { + if(std::string(servo_axes_names[axis_index]) == axis_name) + { + break; + } + } + + if(axis_index == servo_axes_names->length()) + { + ex.setReason(("Axis '" + axis_code + "' not found.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + new_scan.axis_index = axis_index; + + ACS::doubleSeq starting_position = *servo->calcCoordinates(new_scan.starting_elevation); + ACS::doubleSeq final_position = *servo->calcCoordinates(new_scan.starting_elevation); + // Don't be fooled by the name, starting position now still holds the central scan position + new_scan.central_position = starting_position[axis_index]; + + starting_position[axis_index] -= scan_info.range / 2; + final_position[axis_index] += scan_info.range / 2; + + /** + * Note, we perform the calculations with some degree of approximation, + * we know the expected elevation at the start of the scan, + * but the true elevation value is going to be known only inside the startScan, + * depending on how much time the minor servos take to get to position + * TBH, I don't really know if this will really matter, since we will be starting + * the movement of the SRP far from the peak of the gaussian. + * We will check this behavior later. + * In any case, the scan will simply add an offset to the elevation tracking expected position, + * the offset value depends on the time elapsed since the start of the scan, which, + * in the case of the focusScan, it's probably always decided by the minor servo system + */ + ACS::doubleSeq_var min_ranges, max_ranges; + servo->getAxesRanges(min_ranges, max_ranges); + + // Read the servo offsets + ACS::doubleSeq user_offsets = *servo->getUserOffsets(); + ACS::doubleSeq system_offsets = *servo->getSystemOffsets(); + + // Check if starting or final positions are outside the axes range (considering offsets) + for(size_t i = 0; i < starting_position.length(); i++) + { + if(starting_position[i] + user_offsets[i] + system_offsets[i] < min_ranges[i] || starting_position[i] + user_offsets[i] + system_offsets[i] > max_ranges[i]) + { + ex.setReason("Starting position out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(final_position[i] + user_offsets[i] + system_offsets[i] < min_ranges[i] || final_position[i] + user_offsets[i] + system_offsets[i] > max_ranges[i]) + { + ex.setReason("Final position out of range."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } + + // Time to reach the desired position if I were to start the movement now + ACS::Time min_starting_time = getTimeStamp() + servo->getTravelTime(ACS::doubleSeq(), starting_position) + PROGRAM_TRACK_FUTURE_TIME; + + if(start_time != 0 && min_starting_time > start_time) + { + ex.setReason("Not enough time to start the scan."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + else if(servo->getTravelTime(starting_position, final_position) > scan_info.total_time) // Check scan total time + { + ex.setReason("Not enough time to perform the scan."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + new_scan.start_time = min_starting_time; + return new_scan; +} + +bool SRTMinorServoBossCore::checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters) +{ + AUTO_TRACE("SRTMinorServoBossCore::checkScan()"); + + TRunTimeParameters_var ms_param_var = new TRunTimeParameters; + ms_param_var->onTheFly = !scan_info.is_empty_scan; + ms_param_var->scanAxis = CORBA::string_dup(scan_info.axis_code); + ms_param_var->startEpoch = 0; + ms_param_var->centerScan = 0; + ms_param_var->timeToStop = 0; + + try + { + checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + // Something is not working, return ASAP + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + ms_parameters = ms_param_var._retn(); + return false; + } + + // Check if we are already performing another scan + if(m_scan_active.load() == Management::MNG_TRUE) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::checkScan()", (LM_CRITICAL, "The system is waiting for a scan to be completed.")); + ms_parameters = ms_param_var._retn(); + return false; + } + + /** + * Empty scan, the old implementation always returned true + * Given the fact that we start the elevation tracking thread automatically + * and considering we will not have to move any axis because of the empty scan + * it is safe to return true in any situation. + * If the system is not configured this will not stop the antenna from starting to track a source + * If the system is about to be configured we will start tracking soon anyway + * The tracking flag will be set to true only when we are inside the tracking delta + * The change in status will be notified via the NotificationChannel + */ + if(scan_info.is_empty_scan) + { + ms_parameters = ms_param_var._retn(); + return true; + } + + // We need to be ready here, we cannot wait for a setup procedure to complete + // Check if the system is now configured and/or tracking + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_TRACKING && motion_status != MOTION_STATUS_CONFIGURED) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::checkScan()", (LM_CRITICAL, "The system is not ready yet.")); + ms_parameters = ms_param_var._retn(); + return false; + } + + SRTMinorServoScan scan; + try + { + scan = checkScanFeasibility(start_time, scan_info, antenna_info); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + ms_parameters = ms_param_var._retn(); + return false; + } + + ms_param_var->startEpoch = scan.start_time; + ms_param_var->centerScan = scan.central_position; + ms_param_var->timeToStop = ms_param_var->startEpoch + scan_info.total_time; + ms_parameters = ms_param_var._retn(); + return true; +} + +void SRTMinorServoBossCore::startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +{ + AUTO_TRACE("SRTMinorServoBossCore::startScan()"); + + // This will throw if anything is not working, no need to catch it since we will throw it again anyway + checkLineStatus(); + + // Check if we are already performing another scan + if(m_scan_active.load() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::startScan()"); + ex.setReason("The system is waiting for a scan to be completed."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + // Empty scan, OK in any case + if(scan_info.is_empty_scan) + { + start_time = getTimeStamp(); + return; + } + + // Check again, this should never block, otherwise something weird is happening + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + if(motion_status != MOTION_STATUS_TRACKING && motion_status != MOTION_STATUS_CONFIGURED) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::startScan()"); + ex.setReason("The system is not ready yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + // This will throw if anything is not working, no need to catch it since we will throw it again anyway + SRTMinorServoScan scan = checkScanFeasibility(start_time, scan_info, antenna_info); + + stopThread(m_tracking_thread); + + // If we got here we are safe to start the scan + m_current_scan = scan; + start_time = scan.start_time; + m_scan_active.store(Management::MNG_TRUE); + startThread(m_scan_thread); +} + +void SRTMinorServoBossCore::closeScan(ACS::Time& close_time) +{ + AUTO_TRACE("SRTMinorServoBossCore::closeScan()"); + + checkLineStatus(); + + if(m_scan_active.load() != Management::MNG_TRUE) + { + // Not scanning, or scan just stopped and the servo is still going back to the initial position + close_time = std::max(getTimeStamp(), m_last_scan.close_time); + return; + } + + // If we got here the scan was not complete, we need to update some values + // Update the scan_duration value. The scan thread will read the value and update the scan center point accordingly. + m_current_scan.scan_duration = getTimeStamp() - m_current_scan.start_time; + + // The thread might have already stopped, but we don't care + stopThread(m_scan_thread); + + // At this point the thread must have stopped, we waited at most 200ms for it to finish its execution, so we can safely assume it's done + // The thread also have updated m_last_scan with the final values + + // Set the close_time + close_time = std::max(getTimeStamp(), m_last_scan.close_time); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::closeScan()", (LM_NOTICE, "Scan closed.")); +} + +double SRTMinorServoBossCore::getElevation(const ACS::Time& acs_time) +{ + AUTO_TRACE("SRTMinorServoBossCore::getElevation()"); + + double azimuth, elevation; + + try + { + m_antennaBoss->getRawCoordinates(acs_time, azimuth, elevation); + elevation *= DR2D; + return elevation == 0.0 ? 45.0 : elevation; + } + catch(ComponentErrors::CouldntGetComponentExImpl& ex) + { + ex.addData("Reason", "Cannot get the ANTENNA/Boss component"); + throw ex.getComponentErrorsEx(); + } +} + +void SRTMinorServoBossCore::checkLineStatus() +{ + AUTO_TRACE("SRTMinorServoBossCore::checkLineStatus()"); + + if(!m_socket.isConnected()) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("Socket not connected."); + ex.log(LM_DEBUG); + setFailure(); + throw ex.getMinorServoErrorsEx(); + } + + if(m_status.getControl() != CONTROL_DISCOS) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("MinorServo system is not controlled by DISCOS."); + ex.log(LM_DEBUG); + setFailure(); + throw ex.getMinorServoErrorsEx(); + } + + if(m_status.emergencyPressed() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); + ex.setReason("MinorServo system in emergency status."); + ex.log(LM_DEBUG); + setFailure(); + throw ex.getMinorServoErrorsEx(); + } +} + +template >> +void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sleep_time) +{ + AUTO_TRACE("SRTMinorServoBossCore::startThread()"); + + try + { + if(thread != nullptr) + { + // We don't want to restart already active threads + if(!thread->isAlive()) + { + if(sleep_time != 0) + { + thread->setSleepTime(sleep_time); + } + thread->restart(); + } + } + else + { + thread = m_component.getContainerServices()->getThreadManager()->create(T::c_thread_name, *this); + if(sleep_time != 0) + { + thread->setSleepTime(sleep_time); + } + thread->resume(); + } + } + catch(acsthreadErrType::CanNotSpawnThreadExImpl& impl) + { + // The thread failed to start for some reason + _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, "SRTMinorServoBossCore::startThread()"); + ex.setThreadName(T::c_thread_name); + ex.log(LM_DEBUG); + setFailure(); + throw ex.getComponentErrorsEx(); + } +} + +template >> +void SRTMinorServoBossCore::stopThread(T*& thread) +{ + AUTO_TRACE("SRTMinorServoBossCore::stopThread()"); + + if(thread != nullptr && thread->isAlive()) + { + thread->stop(); + } +} + +template >> +void SRTMinorServoBossCore::destroyThread(T*& thread) +{ + AUTO_TRACE("SRTMinorServoBossCore::destroyThread()"); + + if(thread != nullptr) + { + thread->terminate(); + m_component.getContainerServices()->getThreadManager()->destroy(thread); + } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::destroyThread()", (LM_NOTICE, (std::string(T::c_thread_name) + " destroyed.").c_str())); +} + +void SRTMinorServoBossCore::setFailure() +{ + AUTO_TRACE("SRTMinorServoBossCore::setFailure()"); + + m_subsystem_status.store(Management::MNG_FAILURE); + m_ready.store(Management::MNG_FALSE); + m_elevation_tracking.store(Management::MNG_FALSE); + m_starting.store(Management::MNG_FALSE); + m_scan_active.store(Management::MNG_FALSE); + m_scanning.store(Management::MNG_FALSE); + m_tracking.store(Management::MNG_FALSE); + m_motion_status.store(MOTION_STATUS_ERROR); +} + +Management::TBoolean SRTMinorServoBossCore::getCDBConfiguration(std::string which_configuration) +{ + AUTO_TRACE("SRTMinorServoBossCore::getCDBConfiguration()"); + std::string configuration = getCDBValue(m_component.getContainerServices(), which_configuration); + std::transform(configuration.begin(), configuration.end(), configuration.begin(), ::toupper); + + if(configuration != "ON" && configuration != "OFF") + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, "SRTMinorServoBossCore::getCDBConfiguration()"); + ex.setFieldName(which_configuration.c_str()); + ex.addData("Reason", "Value should be 'ON' or 'OFF'"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return configuration == "ON" ? Management::MNG_TRUE : Management::MNG_FALSE; +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp new file mode 100644 index 000000000..8a8a55374 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -0,0 +1,422 @@ +#include "SRTMinorServoBossImpl.h" + +using namespace MinorServo; +namespace SP = SimpleParser; + +_IRA_LOGFILTER_DECLARE; + +SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, maci::ContainerServices* container_services) : + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_core_ptr(std::make_shared(*this)), + m_core(*m_core_ptr), + m_parser(SP::CParser(this, 2)), + m_connected_ptr(this), + m_status_ptr(this), + m_ready_ptr(this), + m_actual_setup_ptr(this), + m_motion_info_ptr(this), + m_starting_ptr(this), + m_as_configuration_ptr(this), + m_elevation_tracking_ptr(this), + m_scan_active_ptr(this), + m_scanning_ptr(this), + m_tracking_ptr(this), + m_current_configuration_ptr(this), + m_simulation_enabled_ptr(this), + m_plc_time_ptr(this), + m_plc_version_ptr(this), + m_control_ptr(this), + m_power_ptr(this), + m_emergency_ptr(this), + m_gregorian_cover_ptr(this), + m_last_executed_command_ptr(this) +{ + AUTO_TRACE("SRTMinorServoBossImpl::SRTMinorServoBossImpl()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "COMPONENT CREATED")); +} + +SRTMinorServoBossImpl::~SRTMinorServoBossImpl() +{ + AUTO_TRACE("SRTMinorServoBossImpl::~SRTMinorServoBossImpl()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::SRTMinorServoBossImpl()", (LM_NOTICE, "COMPONENT DESTROYED")); +} + +void SRTMinorServoBossImpl::initialize() +{ + AUTO_TRACE("SRTMinorServoBossImpl::initialize()"); + _IRA_LOGFILTER_ACTIVATE(10000000, 20000000); + + try + { + m_connected_ptr = new ROEnumImpl((m_component_name + ":connected").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_socket_connected), true); + m_status_ptr = new ROEnumImpl((m_component_name + ":status").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_subsystem_status), true); + m_ready_ptr = new ROEnumImpl((m_component_name + ":ready").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_ready), true); + m_actual_setup_ptr = new baci::ROstring((m_component_name + ":actualSetup").c_str(), getComponent(), + new MSGenericDevIO(m_core.m_actual_setup), true); + m_motion_info_ptr = new baci::ROstring((m_component_name + ":motionInfo").c_str(), getComponent(), + new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status, m_core.m_scanning, m_core.m_current_scan), true); + m_starting_ptr = new ROEnumImpl((m_component_name + ":starting").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_starting), true); + m_as_configuration_ptr = new ROEnumImpl((m_component_name + ":asConfiguration").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_as_configuration), true); + m_elevation_tracking_ptr = new ROEnumImpl((m_component_name + ":elevationTrack").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_elevation_tracking_enabled), true); + m_scan_active_ptr = new ROEnumImpl((m_component_name + ":scanActive").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_scan_active), true); + m_scanning_ptr = new ROEnumImpl((m_component_name + ":scanning").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_scanning), true); + m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_tracking), true); + m_current_configuration_ptr = new ROEnumImpl((m_component_name + ":current_configuration").c_str(), getComponent(), new MSAnswerMapDevIO("current_configuration", m_core.m_status, &SRTMinorServoGeneralStatus::getFocalConfiguration), true); + m_simulation_enabled_ptr = new ROEnumImpl((m_component_name + ":simulation_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("simulation_enabled", m_core.m_status, &SRTMinorServoGeneralStatus::isSimulationEnabled), true); + m_plc_time_ptr = new baci::ROdouble((m_component_name + ":plc_time").c_str(), getComponent(), + new MSAnswerMapDevIO("plc_time", m_core.m_status, &SRTMinorServoGeneralStatus::getPLCTime), true); + m_plc_version_ptr = new baci::ROstring((m_component_name + ":plc_version").c_str(), getComponent(), + new MSAnswerMapDevIO("plc_version", m_core.m_status, &SRTMinorServoGeneralStatus::getPLCVersion), true); + m_control_ptr = new ROEnumImpl((m_component_name + ":control").c_str(), getComponent(), + new MSAnswerMapDevIO("control", m_core.m_status, &SRTMinorServoGeneralStatus::getControl), true); + m_power_ptr = new ROEnumImpl((m_component_name + ":power").c_str(), getComponent(), + new MSAnswerMapDevIO("power", m_core.m_status, &SRTMinorServoGeneralStatus::hasPower), true); + m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), + new MSAnswerMapDevIO("emergency", m_core.m_status, &SRTMinorServoGeneralStatus::emergencyPressed), true); + m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), new MSAnswerMapDevIO("gregorian_cover", m_core.m_status, &SRTMinorServoGeneralStatus::getGregorianCoverPosition), true); + m_last_executed_command_ptr = new baci::ROdouble((m_component_name + ":last_executed_command").c_str(), getComponent(), + new MSAnswerMapDevIO("last_executed_command", m_core.m_status, &SRTMinorServoGeneralStatus::getLastExecutedCommand), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, "SRTMinorServoBossImpl::initialize()"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "PROPERTIES INITIALIZED")); + + m_parser.add("servoSetup", new SP::function1>(this, &SRTMinorServoBossImpl::setup), 1); + m_parser.add("servoPark", new SP::function0(this, &SRTMinorServoBossImpl::park), 0); + m_parser.add("setServoElevationTracking", new SP::function1>(this, &SRTMinorServoBossImpl::setElevationTracking), 1); + m_parser.add("setServoASConfiguration", new SP::function1>(this, &SRTMinorServoBossImpl::setASConfiguration), 1); + m_parser.add("setServoOffset", new SP::function2, SP::I>(this, &SRTMinorServoBossImpl::setUserOffset), 2); + m_parser.add("clearServoOffsets", new SP::function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); + //m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "PARSER INITIALIZED")); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "COMPONENT INITIALIZED")); +} + +void SRTMinorServoBossImpl::execute() +{ + AUTO_TRACE("SRTMinorServoBossImpl::execute()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::execute()", (LM_NOTICE, "STARTING TO ACCEPT FUNCTIONAL CALLS")); +} + +void SRTMinorServoBossImpl::cleanUp() +{ + AUTO_TRACE("SRTMinorServoBossImpl::cleanUp()"); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::cleanUp()", (LM_NOTICE, "CLEANING UP RESOURCES")); + stopPropertiesMonitoring(); + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; + CharacteristicComponentImpl::cleanUp(); +} + +void SRTMinorServoBossImpl::aboutToAbort() +{ + AUTO_TRACE("SRTMinorServoBossImpl::aboutToAbort()"); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::aboutToAbort()", (LM_NOTICE, "ATTEMPTING TO CLEAN UP RESOURCES")); + stopPropertiesMonitoring(); + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; + CharacteristicComponentImpl::aboutToAbort(); +} + +void SRTMinorServoBossImpl::setup(const char* configuration) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setup()"); + m_core.setup(std::string(configuration)); +} + +void SRTMinorServoBossImpl::park() +{ + AUTO_TRACE("SRTMinorServoBossImpl::park()"); + m_core.park(); +} + +CORBA::Boolean SRTMinorServoBossImpl::isElevationTrackingEn() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isElevationTrackingEn()"); + return m_core.m_elevation_tracking_enabled.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isElevationTracking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isElevationTracking()"); + return m_core.m_elevation_tracking.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isTracking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isTracking()"); + return m_core.m_tracking.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isStarting() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isStarting()"); + return m_core.m_starting.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isASConfiguration() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isASConfiguration()"); + return m_core.m_as_configuration.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isParking() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isParking()"); + return (m_core.m_starting.load() == Management::MNG_TRUE && m_core.m_commanded_configuration.load() == CONFIGURATION_PARK); +} + +CORBA::Boolean SRTMinorServoBossImpl::isReady() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isReady()"); + return m_core.m_ready.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isScanning() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isScanning()"); + return m_core.m_scanning.load() == Management::MNG_TRUE ? true : false; +} + +CORBA::Boolean SRTMinorServoBossImpl::isScanActive() +{ + AUTO_TRACE("SRTMinorServoBossImpl::isScanActive()"); + return m_core.m_scan_active.load() == Management::MNG_TRUE ? true : false; +} + +char* SRTMinorServoBossImpl::getActualSetup() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getActualSetup()"); + return CORBA::string_dup(m_core.m_actual_setup.c_str()); +} + +char* SRTMinorServoBossImpl::getCommandedSetup() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getCommandedSetup()"); + return CORBA::string_dup(m_core.m_commanded_setup.c_str()); +} + +CORBA::Double SRTMinorServoBossImpl::getCentralScanPosition() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getCentralScanPosition()"); + + if(m_core.m_scan_active.load() == Management::MNG_TRUE) + { + return CORBA::Double(m_core.m_current_scan.central_position); + } + else if(m_core.m_last_scan.servo_name != "") // We are not scanning now, but we performed a scan previously + { + return CORBA::Double(m_core.m_last_scan.central_position); + } + else + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossImpl::getCentralPosition()"); + ex.setReason("No scan has been performed yet."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } +} + +void SRTMinorServoBossImpl::clearOffsets() +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearOffsets()"); + ACS_LOG(LM_FULL_INFO, "clearServoOffsets", (LM_NOTICE, "CLEARING ALL USER OFFSETS")); + m_core.clearUserOffsets("ALL"); +} + +void SRTMinorServoBossImpl::clearUserOffset(const char* servo_name) +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearUserOffset()"); + m_core.clearUserOffsets(std::string(servo_name)); +} + +void SRTMinorServoBossImpl::setUserOffset(const char* servo_axis_name, CORBA::Double offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setUserOffset()"); + m_core.setUserOffset(std::string(servo_axis_name), (double)offset); +} + +void SRTMinorServoBossImpl::setUserOffset(const char* servo_axis_name, const double& offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setUserOffset()"); + m_core.setUserOffset(std::string(servo_axis_name), (double)offset, true); +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getUserOffset() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getUserOffset()"); + return m_core.getUserOffsets(); +} + +void SRTMinorServoBossImpl::clearSystemOffset(const char* servo_name) +{ + AUTO_TRACE("SRTMinorServoBossImpl::clearSystemOffset()"); + m_core.clearSystemOffsets(std::string(servo_name)); +} + +void SRTMinorServoBossImpl::setSystemOffset(const char* servo_axis_name, CORBA::Double offset) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setSystemOffset()"); + m_core.setSystemOffset(std::string(servo_axis_name), (double)offset); +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getSystemOffset() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getSystemOffset()"); + return m_core.getSystemOffsets(); +} + +void SRTMinorServoBossImpl::getAxesInfo(ACS::stringSeq_out axes_names, ACS::stringSeq_out axes_units) +{ + AUTO_TRACE("SRTMinorServoBossImpl::getAxesInfo()"); + m_core.getAxesInfo(axes_names, axes_units); +} + +char* SRTMinorServoBossImpl::getScanAxis() +{ + AUTO_TRACE("SRTMinorServoBossImpl::getScanAxis()"); + + if(m_core.m_scan_active.load() == Management::MNG_TRUE) + { + return CORBA::string_dup((m_core.m_current_scan.servo_name + "_" + m_core.m_current_scan.axis_name).c_str()); + } + else if(!m_core.m_last_scan.servo_name.empty()) + { + return CORBA::string_dup((m_core.m_last_scan.servo_name + "_" + m_core.m_last_scan.axis_name).c_str()); + } + else + { + return CORBA::string_dup(""); + } +} + +ACS::doubleSeq* SRTMinorServoBossImpl::getAxesPosition(ACS::Time acs_time) +{ + AUTO_TRACE("SRTMinorServoBossImpl::getAxesPositions()"); + return m_core.getAxesPositions(acs_time == 0 ? getTimeStamp() : acs_time); +} + +void SRTMinorServoBossImpl::setElevationTracking(const char* configuration) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setElevationTracking()"); + m_core.setElevationTracking(std::string(configuration)); +} + +void SRTMinorServoBossImpl::setASConfiguration(const char* configuration) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setASConfiguration()"); + m_core.setASConfiguration(std::string(configuration)); +} + +void SRTMinorServoBossImpl::setGregorianCoverPosition(const char* position) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setGregorianCoverPosition()"); + m_core.setGregorianCoverPosition(std::string(position)); +} + +CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters) +{ + AUTO_TRACE("SRTMinorServoBossImpl::checkScan()"); + return m_core.checkScan(start_time, scan_info, antenna_info, ms_parameters); +} + +void SRTMinorServoBossImpl::startScan(ACS::Time& start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info) +{ + AUTO_TRACE("SRTMinorServoBossImpl::startScan()"); + m_core.startScan(start_time, scan_info, antenna_info); +} + +void SRTMinorServoBossImpl::closeScan(ACS::Time& close_time) +{ + AUTO_TRACE("SRTMinorServoBossImpl::closeScan()"); + m_core.closeScan(close_time); +} + +void SRTMinorServoBossImpl::preset(double elevation) +{ + AUTO_TRACE("SRTMinorServoBossImpl::preset()"); + m_core.preset(elevation); +} + +CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out answer) +{ + AUTO_TRACE("SRTMinorServoBossImpl::command()"); + + IRA::CString out; + bool res = false; + + try + { + m_parser.run(cmd, out); + res = true; + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + LOG_EX(MinorServoErrors::MinorServoErrorsEx); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + LOG_EX(ComponentErrors::ComponentErrorsEx); + } + catch(ManagementErrors::ConfigurationErrorEx& ex) + { + LOG_EX(ManagementErrors::ConfigurationErrorEx); + } + catch(ManagementErrors::ParkingErrorEx& ex) + { + LOG_EX(ManagementErrors::ParkingErrorEx); + } + catch(...) // Unknown exception. If the above catch blocks are written correctly we should never get here. + { + ACS_SHORT_LOG((LM_ERROR, "SRTMinorServoBossImpl::command()")); + } + + answer = CORBA::string_dup((const char *)out); + return res; +} + + +GET_PROPERTY_REFERENCE(Management::ROTSystemStatus, SRTMinorServoBossImpl, m_status_ptr, status) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_ready_ptr, ready) +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_actual_setup_ptr, actualSetup) +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_motion_info_ptr, motionInfo) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_starting_ptr, starting) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_as_configuration_ptr, asConfiguration) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_elevation_tracking_ptr, elevationTrack) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_scan_active_ptr, scanActive) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_scanning_ptr, scanning) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_tracking_ptr, tracking) +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_connected_ptr, connected) +GET_PROPERTY_REFERENCE(ROSRTMinorServoFocalConfiguration, SRTMinorServoBossImpl, m_current_configuration_ptr, current_configuration); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_simulation_enabled_ptr, simulation_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTMinorServoBossImpl, m_plc_time_ptr, plc_time); +GET_PROPERTY_REFERENCE(ACS::ROstring, SRTMinorServoBossImpl, m_plc_version_ptr, plc_version); +GET_PROPERTY_REFERENCE(ROSRTMinorServoControlStatus, SRTMinorServoBossImpl, m_control_ptr, control); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_power_ptr, power); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_emergency_ptr, emergency); +GET_PROPERTY_REFERENCE(ROSRTMinorServoGregorianCoverStatus, SRTMinorServoBossImpl, m_gregorian_cover_ptr, gregorian_cover); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTMinorServoBossImpl, m_last_executed_command_ptr, last_executed_command); + +#include +MACI_DLL_SUPPORT_FUNCTIONS(SRTMinorServoBossImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp new file mode 100644 index 000000000..8afaab79f --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -0,0 +1,93 @@ +#include "SRTMinorServoParkThread.h" + +using namespace MinorServo; + +SRTMinorServoParkThread::SRTMinorServoParkThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_core(core) +{ + AUTO_TRACE("SRTMinorServoParkThread::SRTMinorServoParkThread()"); +} + +SRTMinorServoParkThread::~SRTMinorServoParkThread() +{ + AUTO_TRACE("SRTMinorServoParkThread::~SRTMinorServoParkThread()"); +} + +void SRTMinorServoParkThread::onStart() +{ + AUTO_TRACE("SRTMinorServoParkThread::onStart()"); + this->setSleepTime(500000); // 50 milliseconds + m_start_time = IRA::CIRATools::getUNIXEpoch(); + + m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_NOTICE, "PARK THREAD STARTED")); +} + +void SRTMinorServoParkThread::onStop() +{ + AUTO_TRACE("SRTMinorServoParkThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_NOTICE, "PARK THREAD STOPPED")); +} + +void SRTMinorServoParkThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoParkThread::runLoop()"); + + try + { + m_core.checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; + } + + if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::runLoop()", (LM_CRITICAL, "Timeout while performing a park operation.")); + m_core.setFailure(); + this->setStopped(); + return; + } + + switch(m_status) + { + case 0: + { + // First we check if the gregorian cover has closed + //bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is STOP + if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; + })) + { + m_status = 1; + } + + break; + } + case 1: + { + for(const auto& [name, servo] : m_core.m_servos) + { + servo->setup(""); + } + + m_core.m_actual_setup = m_core.m_commanded_setup; + m_core.m_starting.store(Management::MNG_FALSE); + m_core.m_motion_status.store(MOTION_STATUS_PARKED); + m_core.m_subsystem_status.store(Management::MNG_OK); + this->setStopped(); + break; + } + } +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp new file mode 100644 index 000000000..a70f66795 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -0,0 +1,237 @@ +#include "SRTMinorServoScanThread.h" + +using namespace MinorServo; + +SRTMinorServoScanThread::SRTMinorServoScanThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time): + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_error(false) +{ + AUTO_TRACE("SRTMinorServoScanThread::SRTMinorServoScanThread()"); +} + +SRTMinorServoScanThread::~SRTMinorServoScanThread() +{ + AUTO_TRACE("SRTMinorServoScanThread::~SRTMinorServoScanThread()"); +} + +void SRTMinorServoScanThread::onStart() +{ + AUTO_TRACE("SRTMinorServoScanThread::onStart()"); + + // We want to start moving the scan servo ASAP and bring its scan axis to the start position. + // The other servos will keep tracking normally. + // The general implementation accounts for derotators which will be integrated in the future. + // The requested scan will start at start_time by adding the correct scan offset to each point. + + // This will find the first useful time to send a point synchronized with the scan start time: m_core.m_current_scan.start_time - (PROGRAM_TRACK_TIMEGAP * N) > now + PROGRAM_TRACK_FUTURE_TIME + size_t pre_scan_points = std::floor((m_core.m_current_scan.start_time - (getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME)) / PROGRAM_TRACK_TIMEGAP); + m_point_time = m_core.m_current_scan.start_time - pre_scan_points * PROGRAM_TRACK_TIMEGAP; + m_point_id = 0; + m_trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(m_point_time)); + + // How many points in the scan trajectory? + // We don't check the modulo of the division, we assume all the scans duration is always expressed in seconds, therefore the modulo should always be 0 + size_t scan_points = m_core.m_current_scan.scan_duration / PROGRAM_TRACK_TIMEGAP + 1; + // How big is each offset step? We have N points but N-1 segments + double scan_delta = m_core.m_current_scan.scan_range / (scan_points - 1); + + m_scan_offsets = SRTMinorServoPositionsQueue(pre_scan_points + scan_points, 1); + for(size_t i = 0; i < pre_scan_points; i++) + { + m_scan_offsets.put(m_point_time + i * PROGRAM_TRACK_TIMEGAP, { -m_core.m_current_scan.scan_range / 2 }); + } + for(size_t i = 0; i < scan_points; i++) + { + m_scan_offsets.put(m_core.m_current_scan.start_time + i * PROGRAM_TRACK_TIMEGAP, {-m_core.m_current_scan.scan_range / 2 + i * scan_delta}); + } + + // We save the starting coordinates to return to them when the scan is finished + ACSErr::Completion_var comp; + auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); + m_starting_coordinates = *servo->getAxesPositions(0); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, + ("SCAN THREAD STARTED, SCANNING " + std::to_string((int)m_core.m_current_scan.scan_range) + "MM IN " + std::to_string((int)(m_core.m_current_scan.scan_duration / 10000000)) + " SECONDS ALONG " + m_core.m_current_scan.servo_name + " " + m_core.m_current_scan.axis_name + " AXIS").c_str() + )); +} + +void SRTMinorServoScanThread::onStop() +{ + AUTO_TRACE("SRTMinorServoScanThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_NOTICE, "SCAN THREAD STOPPED")); + + m_core.m_scanning.store(Management::MNG_FALSE); + + if(m_error) // We didn't reach the end of the scan because of some error + { + // Should we set everything to failure? + m_core.setFailure(); + return; + } + + m_core.m_scanning.store(Management::MNG_FALSE); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + + // Reset m_point_time + m_point_time -= PROGRAM_TRACK_FUTURE_TIME; + + auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); + + // Update the central scan position using the correct elevation (from the past) + m_core.m_current_scan.central_position = (*servo->calcCoordinates(m_core.getElevation((m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration) / 2)))[m_core.m_current_scan.axis_index]; + + ACS::doubleSeq return_coordinates; + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + // Restart the tracking + m_core.startThread(m_core.m_tracking_thread); + return_coordinates = *servo->calcCoordinates(m_core.getElevation(getTimeStamp())); + } + else + { + // We were not tracking, send the servo to the starting position + servo->preset(m_starting_coordinates); + return_coordinates = m_starting_coordinates; + } + + // Calculate the close_time again now that the servos are already moving back to their original position + m_core.m_current_scan.close_time = getTimeStamp() + servo->getTravelTime(ACS::doubleSeq(), return_coordinates); + + // Copy current_scan into last_scan + m_core.m_last_scan = m_core.m_current_scan; + + // Finally unlock the scan capabilities + m_core.m_scan_active.store(Management::MNG_FALSE); +} + +void SRTMinorServoScanThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoScanThread::runLoop()"); + + if(m_point_time == m_core.m_current_scan.start_time + PROGRAM_TRACK_FUTURE_TIME) // The system should be starting to scan right now + { + m_core.m_scanning.store(Management::MNG_TRUE); + } + else if(m_point_time == m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration + PROGRAM_TRACK_FUTURE_TIME) // The system should have finished to scan right now + { + this->setStopped(); + return; + } + else if(m_point_time > m_core.m_current_scan.start_time + m_core.m_current_scan.scan_duration) // All points were sent, we can stop sending but we'll wait for the scan to finish + { + m_point_time += PROGRAM_TRACK_TIMEGAP; + + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((m_point_time - PROGRAM_TRACK_FUTURE_TIME) - getTimeStamp()); + return; + } + + try + { + m_core.checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + + if(m_point_id == 1) + { + if(std::all_of(m_core.m_current_tracking_servos.begin(), m_core.m_current_tracking_servos.end(), [this](const std::pair& servo) -> bool + { + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo.first != m_core.m_current_scan.servo_name) + { + // Not tracking the elevation and this servo is not involved in the current scan + return true; + } + + ACSErr::Completion_var comp; + if(servo.second->operative_mode()->get_sync(comp.out()) != OPERATIVE_MODE_PROGRAMTRACK) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + return false; + } + return true; + })) + { + // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + m_core.m_elevation_tracking.store(Management::MNG_TRUE); + } + } + else + { + m_error = true; + this->setStopped(); + return; + } + } + + double elevation = m_core.m_current_scan.starting_elevation; + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) // We are in elevation tracking mode + { + try + { + elevation = m_core.getElevation(m_point_time); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getErrorFromEx(ex)) + " Using a fixed elevation of " + std::to_string(elevation) + "° as scan central coordinate!").c_str()); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + } + } + + for(const auto& [servo_name, servo] : m_core.m_current_tracking_servos) + { + if(m_core.m_motion_status.load() == MOTION_STATUS_CONFIGURED && servo_name != m_core.m_current_scan.servo_name) + { + // Not tracking the elevation and this servo is not involved in the current scan + continue; + } + + ACS::doubleSeq coordinates = m_starting_coordinates; + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + coordinates = *servo->calcCoordinates(elevation); + } + + if(servo_name == m_core.m_current_scan.servo_name) + { + try + { + // Ask for the offset in the exact m_point_time (we don't want to interpolate or retrieve any value before or after the scan time span) + coordinates[m_core.m_current_scan.axis_index] += m_scan_offsets.get(m_point_time, true).second[0]; + } + catch(...) + { + // No offset found for this point_time, ignore + } + } + + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, coordinates); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + } + + m_point_id++; + m_point_time += PROGRAM_TRACK_TIMEGAP; + + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((m_point_time - PROGRAM_TRACK_FUTURE_TIME) - getTimeStamp()); +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp new file mode 100644 index 000000000..1daa85968 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -0,0 +1,255 @@ +#include "SRTMinorServoSetupThread.h" + +using namespace MinorServo; + +SRTMinorServoSetupThread::SRTMinorServoSetupThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_core(core) +{ + AUTO_TRACE("SRTMinorServoSetupThread::SRTMinorServoSetupThread()"); +} + +SRTMinorServoSetupThread::~SRTMinorServoSetupThread() +{ + AUTO_TRACE("SRTMinorServoSetupThread::~SRTMinorServoSetupThread()"); +} + +void SRTMinorServoSetupThread::onStart() +{ + AUTO_TRACE("SRTMinorServoSetupThread::onStart()"); + + this->setSleepTime(500000); // 50 milliseconds + m_start_time = IRA::CIRATools::getUNIXEpoch(); + + m_status = 0; + + //SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); + //m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); + //m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_NOTICE, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); +} + +void SRTMinorServoSetupThread::onStop() +{ + AUTO_TRACE("SRTMinorServoSetupThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_NOTICE, "SETUP THREAD STOPPED")); + + if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) + { + try + { + m_core.startThread(m_core.m_tracking_thread); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + } + } +} + +void SRTMinorServoSetupThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoSetupThread::runLoop()"); + + try + { + m_core.checkLineStatus(); + } + catch(MinorServoErrors::StatusErrorEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; + } + + if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Timeout while performing a setup operation.")); + m_core.setFailure(); + this->setStopped(); + return; + } + + switch(m_status) + { + case 0: // Check if all the servos stopped + { + if(std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; + })) + { + m_status = 1; + } + + break; + } + case 1: // Set all the servo offsets to 0 + { + for(const auto& [name, servo] : m_core.m_servos) + { + // Not sure about this + servo->clearSystemOffsets(); + servo->clearUserOffsets(); + } + + //m_status = 2; + //m_status = 100; + m_status = 5; + break; + } + /*case 100: // Send the STOW command to the gregorian cover + { + if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", m_gregorian_cover_position)).checkOutput()) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK when setting the gregorian cover position.")); + m_core.setFailure(); + this->setStopped(); + return; + } + + m_status = 5; + break; + }*/ + /*case 2: // Send the SETUP command + { + try + { + if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration)).checkOutput()) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK in response to a SETUP command.")); + m_core.setFailure(); + this->setStopped(); + return; + } + else + { + m_status = 3; + } + } + catch(...) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Communication error while sending a SETUP command.")); + m_core.setFailure(); + this->setStopped(); + return; + } + + break; + } + case 3: // Wait for the system to show the commanded configuration + { + if(m_core.m_status.getFocalConfiguration() == m_core.m_commanded_configuration.load()) + { + m_status = 4; + } + + break; + } + case 4: // Wait for the whole system to reach the desired configuration + { + // First we check the status of the gregorian cover + bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; + + // Then we cycle through all the servos and make sure their operative mode is SETUP + if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_SETUP ? true : false; + })) + { + m_status = 5; + } + + break; + }*/ + case 5: // Load the servos coefficients and send a PRESET command + { + for(const auto& [servo_name, servo] : m_core.m_servos) + { + try + { + if(servo->setup(m_core.m_commanded_setup.c_str())) + { + m_core.m_current_servos[servo_name] = servo; + try + { + m_core.m_current_tracking_servos[servo_name] = m_core.m_tracking_servos.at(servo_name); + } + catch(...) + { + // Not a tracking servo, ignore + } + } + } + catch(...) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, ("Error while loading a SETUP to servo'" + servo_name + "'.").c_str())); + m_core.setFailure(); + this->setStopped(); + return; + } + } + + // This step is necessary because we have _ASACTIVE configurations that have a slightly different position from the commanded one + // Unfortunately, the Leonardo implementation accepts a fixed number of configurations, therefore we share the _ASACTIVE and AS not active configurations for each focal position + for(const auto& [servo_name, servo] : m_core.m_current_servos) + { + try + { + servo->preset(*servo->calcCoordinates(45)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setFailure(); + this->setStopped(); + return; + } + } + + m_status = 6; + break; + } + case 6: // Wait for the whole system to reach the PRESET configuration + { + // First we check the status of the gregorian cover + //bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; + + if(/*completed && */std::all_of(m_core.m_current_servos.begin(), m_core.m_current_servos.end(), [this](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PRESET ? true : false; + })) + { + m_status = 7; + } + + break; + } + case 7: // Finally set all the variables values and eventually start the elevation tracking thread + { + m_core.m_actual_setup = m_core.m_commanded_setup; + m_core.m_starting.store(Management::MNG_FALSE); + m_core.m_ready.store(Management::MNG_TRUE); + m_core.m_subsystem_status.store(Management::MNG_OK); + + if(m_core.m_elevation_tracking_enabled.load() == Management::MNG_TRUE) + { + m_core.m_motion_status.store(MOTION_STATUS_TRACKING); + } + else + { + m_core.m_motion_status.store(MOTION_STATUS_CONFIGURED); + } + + this->setStopped(); + break; + } + } +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp new file mode 100644 index 000000000..3cbedce9a --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoStatusThread.cpp @@ -0,0 +1,112 @@ +#include "SRTMinorServoStatusThread.h" + +using namespace MinorServo; + +SRTMinorServoStatusThread::SRTMinorServoStatusThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_sleep_time(this->getSleepTime()), + m_notification_channel(nullptr) +{ + AUTO_TRACE("SRTMinorServoStatusThread::SRTMinorServoStatusThread()"); +} + +SRTMinorServoStatusThread::~SRTMinorServoStatusThread() +{ + AUTO_TRACE("SRTMinorServoStatusThread::~SRTMinorServoStatusThread()"); +} + +void SRTMinorServoStatusThread::onStart() +{ + AUTO_TRACE("SRTMinorServoStatusThread::onStart()"); + + m_status = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStart()", (LM_NOTICE, "STATUS THREAD STARTED")); +} + +void SRTMinorServoStatusThread::onStop() +{ + AUTO_TRACE("SRTMinorServoStatusThread::onStop()"); + + if(m_notification_channel != nullptr) + { + m_notification_channel->disconnect(); + m_notification_channel = nullptr; + } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoStatusThread::onStop()", (LM_NOTICE, "STATUS THREAD STOPPED")); +} + +void SRTMinorServoStatusThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoStatusThread::runLoop()"); + + ACS::Time t0 = getTimeStamp(); + unsigned long sleep_time = 10000000; + + switch(m_status) + { + case 0: + { + // Wait for the properties to be monitored by the Boss component. + // This is necessary since this thread might start before the start of the properties monitoring. + if(m_core.m_component.isPropertiesMonitoringActive()) + { + m_status = 1; + } + + break; + } + case 1: + { + if(m_core.status()) + { + // Update the sleep time in order to not drift away by adding latency + sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + } + + break; + } + } + + publish(); + + this->setSleepTime(sleep_time); +} + +void SRTMinorServoStatusThread::publish() +{ + // TODO: maybe update only when anything changed + MinorServoDataBlock data; + TIMEVALUE now; + IRA::CIRATools::getTime(now); + data.timeMark = now.value().value; + data.tracking = m_core.m_tracking.load() == Management::MNG_TRUE; + data.starting = m_core.m_starting.load() == Management::MNG_TRUE; + data.parking = m_core.m_motion_status.load() == MOTION_STATUS_PARKING; + data.parked = m_core.m_motion_status.load() == MOTION_STATUS_PARKED; + data.status = m_core.m_subsystem_status.load(); + + if(m_notification_channel == nullptr) + { + try + { + m_notification_channel = new nc::SimpleSupplier(MINORSERVO_DATA_CHANNEL, &m_core.m_component); + } + catch(...) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoStatusThread::publish()", "cannot access the MinorServoData notification channel!"); + return; + } + } + + try + { + m_notification_channel->publishData(data); + } + catch(ComponentErrors::CORBAProblemEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoStatusThread::publish()", "cannot send MinorServoData over the notification channel!"); + } +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp new file mode 100644 index 000000000..7f4350101 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -0,0 +1,142 @@ +#include "SRTMinorServoTrackingThread.h" + +using namespace MinorServo; + +SRTMinorServoTrackingThread::SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time): + ACS::Thread(name, response_time, sleep_time), + m_core(core), + m_error(false) +{ + AUTO_TRACE("SRTMinorServoTrackingThread::SRTMinorServoTrackingThread()"); +} + +SRTMinorServoTrackingThread::~SRTMinorServoTrackingThread() +{ + AUTO_TRACE("SRTMinorServoTrackingThread::~SRTMinorServoTrackingThread()"); +} + +void SRTMinorServoTrackingThread::onStart() +{ + AUTO_TRACE("SRTMinorServoTrackingThread::onStart()"); + + this->setSleepTime(500000); // 50 milliseconds + m_point_id = 0; + m_point_time = 0; + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_NOTICE, "TRACKING THREAD STARTED")); +} + +void SRTMinorServoTrackingThread::onStop() +{ + AUTO_TRACE("SRTMinorServoTrackingThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); + + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + + if(m_error) + { + m_core.setFailure(); + } +} + +void SRTMinorServoTrackingThread::runLoop() +{ + AUTO_TRACE("SRTMinorServoTrackingThread::runLoop()"); + + try + { + m_core.checkLineStatus(); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + + if(m_core.m_motion_status.load() != MOTION_STATUS_TRACKING) + { + // System is not ready or is not configured for tracking yet, we wait, even though we should never get here + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", "Waiting for the system to be configured for tracking!"); + return; + } + + // All checks passed, we have to track + if(m_point_id == 0) + { + m_point_time = getTimeStamp() + PROGRAM_TRACK_FUTURE_TIME; + m_trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(m_point_time)); + } + else if(m_point_id == 1) + { + if(std::all_of(m_core.m_current_tracking_servos.begin(), m_core.m_current_tracking_servos.end(), [this](const std::pair& servo) -> bool + { + ACSErr::Completion_var comp; + if(servo.second->operative_mode()->get_sync(comp.out()) != OPERATIVE_MODE_PROGRAMTRACK) + { + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::runLoop()", (LM_CRITICAL, (servo.first + ": failed to set PROGRAM_TRACK operative mode!").c_str())); + return false; + } + return true; + })) + { + // All used servos are set to PROGRAMTRACK operative mode, we are tracking the elevation + m_core.m_elevation_tracking.store(Management::MNG_TRUE); + } + else + { + m_error = true; + this->setStopped(); + return; + } + } + + for(const auto& [servo_name, servo] : m_core.m_current_tracking_servos) + { + double elevation = 45.0; + + try + { + elevation = m_core.getElevation(m_point_time); + } + catch(ComponentErrors::ComponentErrorsEx& ex) + { + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); + m_core.m_elevation_tracking.store(Management::MNG_FALSE); + } + + try + { + servo->programTrack(m_trajectory_id, m_point_id, m_point_time, *servo->calcCoordinates(elevation)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_error = true; + this->setStopped(); + return; + } + catch(std::exception& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.what())); + m_error = true; + this->setStopped(); + return; + } + catch(CORBA::Exception& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex._info().c_str())); + m_error = true; + this->setStopped(); + return; + } + } + + m_point_id++; + m_point_time += PROGRAM_TRACK_TIMEGAP; + + // Sleep until the next point - PROGRAM_TRACK_FUTURE_TIME + this->setSleepTime((unsigned long)(m_point_time - PROGRAM_TRACK_FUTURE_TIME - getTimeStamp())); +} diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp new file mode 100644 index 000000000..16fa1ebd6 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -0,0 +1,173 @@ +#include "SRTMinorServoImpl.h" + +using namespace MinorServo; + +SRTProgramTrackMinorServoImpl::SRTProgramTrackMinorServoImpl(const ACE_CString &componentName, maci::ContainerServices *containerServices) : + SRTBaseMinorServoImpl(componentName, containerServices), + m_tracking_queue(1500, m_virtual_axes), + m_tracking_delta(SRTBaseMinorServoImpl::getMotionConstant(*this, "tracking_delta")), + m_tracking_error(m_virtual_axes, 0.0), + m_tracking(Management::MNG_FALSE), + m_trajectory_id(0), + m_total_trajectory_points(0), + m_remaining_trajectory_points(0), + m_tracking_ptr(this), + m_trajectory_id_ptr(this), + m_total_trajectory_points_ptr(this), + m_remaining_trajectory_points_ptr(this), + m_tracking_error_ptr(this) +{ + AUTO_TRACE(m_servo_name + "::SRTProgramTrackMinorServoImpl()"); +} + +SRTProgramTrackMinorServoImpl::~SRTProgramTrackMinorServoImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTProgramTrackMinorServoImpl()"); +} + +void SRTProgramTrackMinorServoImpl::initialize() +{ + SRTBaseMinorServoImpl::initialize(); + + try + { + m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO>(m_tracking), true); + m_trajectory_id_ptr = new baci::ROlong((m_component_name + ":trajectory_id").c_str(), getComponent(), + new MSGenericDevIO>(m_trajectory_id), true); + m_total_trajectory_points_ptr = new baci::ROlong((m_component_name + ":total_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_total_trajectory_points), true); + m_remaining_trajectory_points_ptr = new baci::ROlong((m_component_name + ":remaining_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_remaining_trajectory_points), true); + m_tracking_error_ptr = new baci::ROdoubleSeq((m_component_name + ":tracking_error").c_str(), getComponent(), + new MSGenericDevIO>(m_tracking_error), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +/////////////////// PUBLIC methods +bool SRTProgramTrackMinorServoImpl::status() +{ + bool status = SRTBaseMinorServoImpl::status(); + + try + { + ACS::Time last_timestamp = m_status.getTimestamp(); + + // The timestamp of the read positions always corresponds to the one we're asking since they both belong to the same STATUS command answer + // The tracking timestamp is interpolated instead + ACS::doubleSeq virtual_positions = m_status.getVirtualPositions(); + std::pair> tracking_point = m_tracking_queue.get(last_timestamp); + + m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); + + if(tracking_point.first < last_timestamp) + { + // We are past the last point of the trajectory, we concluded it + m_tracking.store(Management::MNG_FALSE); + m_tracking_queue.clear(); + m_tracking_error = std::vector(m_virtual_axes, 0.0); + } + else + { + bool is_tracking = true; + + std::transform(virtual_positions.begin(), virtual_positions.end(), tracking_point.second.begin(), m_tracking_error.begin(), [](double current_pos, double commanded_pos) + { + return std::fabs(current_pos - commanded_pos); + }); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + if(std::fabs(m_tracking_error[i]) > m_tracking_delta[i]) + { + is_tracking = false; + break; + } + } + + m_tracking.store(is_tracking ? Management::MNG_TRUE : Management::MNG_FALSE); + } + } + catch(...) + { + // We might get here if m_tracking_queue is empty + // So whenever we just got a new setup or if we are past the last point inside the trajectory + m_tracking.store(Management::MNG_FALSE); // May be redundant but who cares? + m_tracking_error = std::vector(m_virtual_axes, 0.0); + } + + return status; +} + +bool SRTProgramTrackMinorServoImpl::setup(const char* configuration_name) +{ + bool return_value = SRTBaseMinorServoImpl::setup(configuration_name); + + m_tracking_queue.clear(); + m_total_trajectory_points.store(0); + m_remaining_trajectory_points.store(0); + + return return_value; +} + +void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORBA::Long point_id, ACS::Time point_time, const ACS::doubleSeq& virtual_coordinates) +{ + AUTO_TRACE("SRTProgramTrackMinorServoImpl::programTrack()"); + + checkLineStatus(); + + if(virtual_coordinates.length() != m_virtual_axes) + { + _EXCPT(MinorServoErrors::TrackingErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.addData("Reason", "Wrong number of values for this servo system!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + std::vector coordinates(virtual_coordinates.get_buffer(), virtual_coordinates.get_buffer() + virtual_coordinates.length()); + ACS::doubleSeq offsets = m_status.getVirtualOffsets(); + + for(size_t i = 0; i < m_virtual_axes; i++) + { + double coordinate = coordinates[i] + offsets[i]; + if(coordinate < m_min[i] || coordinate > m_max[i]) + { + _EXCPT(MinorServoErrors::TrackingErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.addData("Reason", "Resulting position out of range, check the offsets!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coordinates, point_id > 0 ? 0 : IRA::CIRATools::ACSTime2UNIXEpoch(point_time))).checkOutput()) + { + _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); + ex.setReason("Received NAK in response to a PROGRAMTRACK command!"); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + m_trajectory_id.store(trajectory_id); + m_total_trajectory_points.store(point_id + 1); + if(point_id == 0) + { + // Clear the tracking queue to avoid interpolation between 2 different trajectories + m_tracking_queue.clear(); + } + m_tracking_queue.put(point_time, coordinates); +} + + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTProgramTrackMinorServoImpl, m_tracking_ptr, tracking); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_trajectory_id_ptr, trajectory_id); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_total_trajectory_points_ptr, total_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTProgramTrackMinorServoImpl, m_remaining_trajectory_points_ptr, remaining_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTProgramTrackMinorServoImpl, m_tracking_error_ptr, tracking_error); + +MACI_DLL_SUPPORT_FUNCTIONS(SRTProgramTrackMinorServoImpl) diff --git a/SRT/Servers/SRTMinorServo/src/_cover.py b/SRT/Servers/SRTMinorServo/src/_cover.py new file mode 100644 index 000000000..add318233 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/_cover.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# This is a python script that can be used to set the gregorian cover position +# who when what +# Giuseppe Carboni(giuseppe.carboni@inaf.it) 21/01/2024 Creation + +from Acspy.Clients.SimpleClient import PySimpleClient +import ACSLog +import maciErrType +import maciErrTypeImpl +import ClientErrorsImpl +import MinorServoErrors +import ManagementErrorsImpl +import sys +from SimpleParserPy import add_user_message + +def main(): + compName = 'MINORSERVO/Boss' + + simpleClient = PySimpleClient() + + try: + component = simpleClient.getComponent(compName) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName(compName) + add_user_message(newEx, 'MinorServoBoss not ready or not properly configured') + simpleClient.disconnect() + sys.exit(1) + + try: + inputs = component.setGregorianCoverPosition(sys.argv[1]) + except MinorServoErrors.MinorServoErrorsEx as ex: + newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) + newEx.setReason('MinorServoBoss gregorian cover position') + add_user_message(newEx, 'Unable to set the gregorian cover position') + simpleClient.disconnect() + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/SRT/Servers/SRTMinorServo/test/.gitignore b/SRT/Servers/SRTMinorServo/test/.gitignore new file mode 100644 index 000000000..d3a2a1447 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/.gitignore @@ -0,0 +1,3 @@ +TESTS/SRP/* +TESTS/COMBINED/* +TESTS/DEROTATOR* diff --git a/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp new file mode 100644 index 000000000..d53245b9f --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/CombinedProgramTrackTest.cpp @@ -0,0 +1,532 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif + +#define SOCKET_TIMEOUT 0.5 +#define NOISE_THRESHOLD 1 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 5 +#define STATUS_PERIOD 0.01 +#define EPSILON 0.00001 + +#define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } +#define SRP_MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } +#define SRP_MAX_SPEED std::vector{ 4.0, 4.0, 4.0, 0.04, 0.04, 0.04 } + +#define DEROTATOR std::string("GFR1") +#define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } +#define DEROTATOR_RANGES std::vector{ 10.0, 100.0 } +#define DEROTATOR_MAX_SPEED std::vector{ 3.3 } + + +std::atomic terminate = false; + + +class CombinedProgramTrackTest : public ::testing::Test +{ +protected: + std::vector SRPStartingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + std::vector DerotatorStartingCoordinates = { 10.0 }; + std::string directory; + std::thread statusThread; + + static void printStatus(std::string directory) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPStatusFile, DerotatorStatusFile; + SRPStatusFile.open(directory + "/SRP/status.txt", ios::out); + DerotatorStatusFile.open(directory + "/DEROTATOR/status.txt", ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string SRPStringStatus = serializeSRPStatus(SRPStatus); + std::string DerotatorStringStatus = serializeDerotatorStatus(DerotatorStatus); + + SRPStatusFile << SRPStringStatus << std::endl; + DerotatorStatusFile << DerotatorStringStatus << std::endl; + if(counter % 10 == 0) + { + std::cout << SRPStringStatus << std::endl; + std::cout << DerotatorStringStatus << std::endl; + } + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + SRPStatusFile.close(); + DerotatorStatusFile.close(); + } + + static void printSRPStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + std::string status = serializeSRPStatus(SRPStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void printDerotatorStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string status = serializeDerotatorStatus(DerotatorStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeSRPStatus(SRTMinorServoAnswerMap map) + { + std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, SRP_COORDINATES)); + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeDerotatorStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, DEROTATOR_COORDINATES)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus, std::vector coordinates) + { + std::vector currentCoordinates; + + for(std::string coordinate : coordinates) + { + auto value = SRPStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + auto value = SRPStatus[elongation]; + + try + { + currentElongations.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentElongations.push_back(10000.0); + } + } + + return currentElongations; + } + + static bool compareCoordinates(std::vector first, std::vector second) + { + if(first.size() != second.size()) + return false; + + for(size_t i = 0; i < first.size(); i++) + { + double diff = fabs(first[i] - second[i]); + if(diff > EPSILON) + return false; + } + + return true; + } + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "OK." << std::endl; + + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending initial SRP STATUS command..."; + + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_STATUS"]), 1); + EXPECT_EQ(std::get(SRPStatus["SRP_BLOCK"]), 2); + std::cout << "OK." << std::endl; + + for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + SRTMinorServoAnswerMap DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_STATUS"]), 1); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_BLOCK"]), 2); + + for(iterator = DerotatorStatus.begin(); iterator != DerotatorStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "OK." << std::endl; + std::cout << "Sending all axes to 0..." << std::endl; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", SRPStartingCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("Derotatore" + DEROTATOR, DerotatorStartingCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + signal(SIGINT, CombinedProgramTrackTest::sigintHandler); + + bool SRPReady = false, DerotatorReady = false; + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + std::cout << serializeSRPStatus(SRPStatus) << std::endl; + SRPReady = std::get(SRPStatus["SRP_OPERATIVE_MODE"]) == 40 ? true : false; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + std::cout << serializeDerotatorStatus(DerotatorStatus) << std::endl; + DerotatorReady = std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]) == 40 ? true : false; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + while(!SRPReady || !DerotatorReady); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 40); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); + + std::cout << "OK." << std::endl; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/COMBINED"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + boost::filesystem::create_directory(directory + "/SRP"); + boost::filesystem::create_directory(directory + "/DEROTATOR"); + + statusThread = std::thread(&CombinedProgramTrackTest::printStatus, directory); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(CombinedProgramTrackTest, SineWaveMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector SRPCoordinates = SRPStartingCoordinates; + std::vector DerotatorCoordinates = DerotatorStartingCoordinates; + + std::vector phase_shift; + std::vector period; + for(size_t axis = 0; axis < 6; axis++) + { + period.push_back(SRP_MAX_RANGES[axis] / SRP_MAX_SPEED[axis] * 4); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); + } + + double derotator_amplitude = (DEROTATOR_RANGES[1] - DEROTATOR_RANGES[0]) / 2; + double derotator_center = (DEROTATOR_RANGES[0] + DEROTATOR_RANGES[1]) / 2; + // Derotator period + period.push_back(80); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[6]); + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[6] * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream SRPProgramTrackFile; + SRPProgramTrackFile.open(directory + "/SRP/trajectory.txt", ios::out); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, SRPCoordinates) << std::endl; + + ofstream DerotatorProgramTrackFile; + DerotatorProgramTrackFile.open(directory + "/DEROTATOR/trajectory.txt", ios::out); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, DerotatorCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 6; axis++) + { + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); + } + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[6]) * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, SRPCoordinates) << std::endl; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, DerotatorCoordinates) << std::endl; + } + + SRPProgramTrackFile.close(); + DerotatorProgramTrackFile.close(); + statusThread.join(); +} + +TEST_F(CombinedProgramTrackTest, SineWaveSeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPProgramTrackFile; + SRPProgramTrackFile.open(directory + "/SRP/trajectory.txt", ios::out); + + ofstream DerotatorProgramTrackFile; + DerotatorProgramTrackFile.open(directory + "/DEROTATOR/trajectory.txt", ios::out); + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "Starting new trajectory with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector SRPCoordinates = SRPStartingCoordinates; + std::vector DerotatorCoordinates = DerotatorStartingCoordinates; + + std::vector phase_shift; + std::vector period; + for(size_t axis = 0; axis < 6; axis++) + { + period.push_back(SRP_MAX_RANGES[axis] / SRP_MAX_SPEED[axis] * 4); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); + } + + double derotator_amplitude = (DEROTATOR_RANGES[1] - DEROTATOR_RANGES[0]) / 2; + double derotator_center = (DEROTATOR_RANGES[0] + DEROTATOR_RANGES[1]) / 2; + // Derotator period + period.push_back(80); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[6]); + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin(phase_shift[6] * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates, start_time)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, SRPCoordinates) << std::endl; + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(start_time, DerotatorCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(SRPStatus["SRP_OPERATIVE_MODE"]), 50); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 6; axis++) + { + SRPCoordinates[axis] = SRP_MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); + } + DerotatorCoordinates[0] = derotator_center + derotator_amplitude * sin((time_delta + phase_shift[6]) * 2 * M_PI / period[6]); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, SRPCoordinates)); + EXPECT_EQ(std::get(SRPStatus["OUTPUT"]), "GOOD"); + SRPProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, SRPCoordinates) << std::endl; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, DerotatorCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + DerotatorProgramTrackFile << CombinedProgramTrackTest::serializeCoordinates(next_expected_time, DerotatorCoordinates) << std::endl; + + if(point_id == 1000) + break; + } + } + + SRPProgramTrackFile.close(); + DerotatorProgramTrackFile.close(); + statusThread.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp new file mode 100644 index 000000000..6f5f719da --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/DerotatorProgramTrackTest.cpp @@ -0,0 +1,495 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif +#define SOCKET_TIMEOUT 0.5 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 5 +#define EPSILON 0.00001 +#define STATUS_PERIOD 0.01 +#define RANGES std::vector{ 10.0, 50.0 } +#define DEROTATOR std::string("GFR1") + +std::atomic terminate = false; + + +class DerotatorProgramTrackTest : public ::testing::Test +{ +protected: + std::vector startingCoordinates = { RANGES[0] }; + std::string directory; + std::thread statusThread; + + static void printStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string status = serializeStatus(DerotatorStatus); + + statusFile << status << std::endl; + if(counter % (long unsigned int)(0.1 / STATUS_PERIOD) == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap DerotatorStatus) + { + std::vector currentCoordinates; + std::vector coordinates = { DEROTATOR + "_ROTATION" }; + + for(std::string coordinate : coordinates) + { + auto value = DerotatorStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + sign = sign / abs(sign); + double offset_to_add = 3.3 * TIMEGAP; + coordinates[axis_to_move] += sign * offset_to_add; + if(sign > 0) + { + coordinates[axis_to_move] = std::min(RANGES[1], coordinates[axis_to_move]); + } + else + { + coordinates[axis_to_move] = std::max(RANGES[0], coordinates[axis_to_move]); + } + if(coordinates[axis_to_move] == RANGES[0] || coordinates[axis_to_move] == RANGES[1]) + return true; + return false; + } + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_EQ(std::get(MSStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(MSStatus["CONTROL"]), 1); + EXPECT_EQ(std::get(MSStatus["POWER"]), 1); + EXPECT_EQ(std::get(MSStatus["EMERGENCY"]), 2); + EXPECT_EQ(std::get(MSStatus["ENABLED"]), 1); + std::cout << "OK." << std::endl; + + SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending initial Derotator STATUS command..."; + + SRTMinorServoAnswerMap DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_STATUS"]), 1); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_BLOCK"]), 2); + std::cout << "OK." << std::endl; + + for(iterator = DerotatorStatus.begin(); iterator != DerotatorStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + } + + std::cout << "Sending derotator to the initial position..." << std::endl; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("Derotatore" + DEROTATOR, startingCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + signal(SIGINT, DerotatorProgramTrackTest::sigintHandler); + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::cout << serializeStatus(DerotatorStatus) << std::endl; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + while(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]) != 40); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 40); + + std::cout << "OK." << std::endl; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/DEROTATOR"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + statusThread = std::thread(&DerotatorProgramTrackTest::printStatus, directory + "/status.txt"); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(DerotatorProgramTrackTest, ContinuousMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + std::string command = SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time); + std::cout << command << std::endl; + DerotatorStatus = socket.sendCommand(command); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + while(!terminate) + { + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 5) + { + idle_count = 0; + idle = false; + } + } + else if(moveAxis(programTrackCoordinates, 0, sign)) + { + sign *= -1; + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + if(round(programTrackCoordinates[0] * 100) == 10 && sign == 1) + { + programTrackCoordinates[0] = RANGES[0]; + break; + } + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(DerotatorProgramTrackTest, SineWaveMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + double phase_shift = (double)std::rand() / RAND_MAX * 60; + double amplitude = (RANGES[1] - RANGES[0]) / 2; + double center = (RANGES[0] + RANGES[1]) / 2; + double period = 80; + programTrackCoordinates[0] = center + amplitude * sin(phase_shift * 2 * M_PI / period); + + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + programTrackCoordinates[0] = center + amplitude * sin((time_delta + phase_shift) * 2 * M_PI / period); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(DerotatorProgramTrackTest, SeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + bool immediate = true; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + //if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP || immediate) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, 0, sign)) + { + sign *= -1; + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + //immediate = immediate ? false : true; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(DerotatorProgramTrackTest, RapidTrajectoryTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap DerotatorStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + int sign = -1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + + while(!terminate) + { + std::vector programTrackCoordinates = startingCoordinates; + programTrackCoordinates[0] = RANGES[1]; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + EXPECT_EQ(std::get(DerotatorStatus[DEROTATOR + "_OPERATIVE_MODE"]), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == (ADVANCE_TIMEGAP * 2) / TIMEGAP) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, 0, sign)) + { + idle = true; + } + + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("Derotatore" + DEROTATOR, trajectory_id, point_id, programTrackCoordinates)); + EXPECT_EQ(std::get(DerotatorStatus["OUTPUT"]), "GOOD"); + } + + //std::cout << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << DerotatorProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index cbc49a447..97a093eab 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -1,11 +1,10 @@ # CPP UNIT TESTING SETUP #-------------- -# GTEST_HOME=/usr/local/include/gtest -# GMOCK_HOME=/usr/local/include/gmock -# GTEST_LIBS=gtest gtest_main +GTEST_HOME=/usr/local/include/gtest +GMOCK_HOME=/usr/local/include/gmock +GTEST_LIBS=gtest gtest_main -# USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) -# USER_LIBS=C++ pthread +USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # END OF CPP UNIT TESTING SETUP #--------------------- @@ -15,9 +14,26 @@ # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -# EXECUTABLES_L = unittest -# unittest_OBJECTS = unittest -# unittest_LIBS = $(GTEST_LIBS) +EXECUTABLES_L = SRPProgramTrackTest #DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest + +SRPProgramTrackTest_OBJECTS = SRPProgramTrackTest +SRPProgramTrackTest_CFLAGS = -std=c++17 -fconcepts +SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem + +DerotatorProgramTrackTest_OBJECTS = DerotatorProgramTrackTest +DerotatorProgramTrackTest_CFLAGS = -std=c++17 +DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +DerotatorProgramTrackTest_LDFLAGS = -lstdc++ -lpthread + +CombinedProgramTrackTest_OBJECTS = CombinedProgramTrackTest +CombinedProgramTrackTest_CFLAGS = -std=c++17 +CombinedProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +CombinedProgramTrackTest_LDFLAGS = -lstdc++ -lpthread + +ReadStatusOnlyTest_OBJECTS = ReadStatusOnlyTest +ReadStatusOnlyTest_CFLAGS = -std=c++17 +ReadStatusOnlyTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +ReadStatusOnlyTest_LDFLAGS = -lstdc++ -lpthread # END OF CUSTOMIZATION # do not edit below this line @@ -39,7 +55,11 @@ endif do_unit: all @echo "running cpp unit tests" - ../bin/unittest --gtest_output=xml:results/cppunittest.xml + ../bin/SRTMinorServoSocketTest --gtest_output=xml:results/cppSRTMinorServoSocketTest.xml + ../bin/SRPProgramTrackTest --gtest_output=xml:results/cppSRPProgramTrackTest.xml + ../bin/DerotatorProgramTrackTest --gtest_output=xml:results/cppDerotatorProgramTrackTest.xml + ../bin/CombinedProgramTrackTest --gtest_output=xml:results/cppCombinedProgramTrackTest.xml + ../bin/ReadStatusOnlyTest --gtest_output=xml:results/cppReadStatusOnlyTest.xml do_pyunit: @echo "running python unit tests" diff --git a/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp b/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp new file mode 100644 index 000000000..833348bba --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/ReadStatusOnlyTest.cpp @@ -0,0 +1,216 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +//#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif + +#define SOCKET_TIMEOUT 0.5 +#define STATUS_PERIOD 0.1 +#define SRP_COORDINATES std::vector{ "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" } +#define DEROTATOR std::string("GFR1") +#define DEROTATOR_COORDINATES std::vector{ DEROTATOR + "_ROTATION" } + + +std::atomic terminate = false; + + +class ReadStatusOnlyTest : public ::testing::Test +{ +protected: + std::string directory; + + static void printStatus(std::string directory, bool timestamp_only=false) + { + SRTMinorServoSocket& socket = SRTMinorServoSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus, DerotatorStatus; + + ofstream SRPStatusFile, DerotatorStatusFile; + SRPStatusFile.open(directory + "/SRP/status.txt", ios::out); + SRPStatusFile << std::fixed << std::setprecision(6); + DerotatorStatusFile.open(directory + "/DEROTATOR/status.txt", ios::out); + DerotatorStatusFile << std::fixed << std::setprecision(6); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + DerotatorStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("Derotatore" + DEROTATOR)); + std::string SRPStringStatus = serializeSRPStatus(SRPStatus); + std::string DerotatorStringStatus = serializeDerotatorStatus(DerotatorStatus); + + if(timestamp_only) + { + SRPStatusFile << std::get(SRPStatus["TIMESTAMP"]) << std::endl; + DerotatorStatusFile << std::get(DerotatorStatus["TIMESTAMP"]) << std::endl; + } + else + { + SRPStatusFile << SRPStringStatus << std::endl; + DerotatorStatusFile << DerotatorStringStatus << std::endl; + } + + if(counter % 10 == 0) + { + std::cout << SRPStringStatus << std::endl; + std::cout << DerotatorStringStatus << std::endl; + } + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + SRPStatusFile.close(); + DerotatorStatusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeSRPStatus(SRTMinorServoAnswerMap map) + { + std::string status = serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, SRP_COORDINATES)); + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeDerotatorStatus(SRTMinorServoAnswerMap map) + { + return serializeCoordinates(std::get(map["TIMESTAMP"]), getCoordinates(map, DEROTATOR_COORDINATES)); + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus, std::vector coordinates) + { + std::vector currentCoordinates; + + for(std::string coordinate : coordinates) + { + auto value = SRPStatus[coordinate]; + + try + { + currentCoordinates.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentCoordinates.push_back(200.0); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + auto value = SRPStatus[elongation]; + + try + { + currentElongations.push_back(std::get(value)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << ex.what() << ", variant index: " << value.index() << std::endl; + currentElongations.push_back(10000.0); + } + } + + return currentElongations; + } + + void SetUp() override + { + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoSocket::getInstance(ADDRESS, PORT, SOCKET_TIMEOUT); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + signal(SIGINT, ReadStatusOnlyTest::sigintHandler); + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/COMBINED"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + boost::filesystem::create_directory(directory + "/SRP"); + boost::filesystem::create_directory(directory + "/DEROTATOR"); + } + + void TearDown() override + { + SRTMinorServoSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(ReadStatusOnlyTest, ReadStatusTest) +{ + ReadStatusOnlyTest::printStatus(directory, true); +} diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp new file mode 100644 index 000000000..e1033748e --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -0,0 +1,632 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoTestingSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +//#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif +#define NOISE_THRESHOLD 1 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 2.6 +#define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } +#define MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } +#define MAX_SPEED std::vector{ 4, 4, 4, 0.04, 0.04, 0.04 } +#define STATUS_PERIOD 0.01 + +std::atomic terminate = false; + +using namespace MinorServo; +using namespace IRA; + + +class SRPProgramTrackTest : public ::testing::Test +{ +protected: + std::vector startingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + std::string directory; + std::thread statusThread; + + static void printStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + std::string status = serializeStatus(SRPStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeStatus(SRTMinorServoAnswerMap map) + { + std::string status; + try + { + status = serializeCoordinates(CIRATools::ACSTime2UNIXEpoch(map.getTimestamp()), getCoordinates(map)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad timestamp!" << std::endl; + + /*SRTMinorServoAnswerMap::iterator iterator; + for(iterator = map.begin(); iterator != map.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + } + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentCoordinates; + std::vector coordinates = { "SRP_TX", "SRP_TY", "SRP_TZ", "SRP_RX", "SRP_RY", "SRP_RZ" }; + + for(std::string coordinate : coordinates) + { + try + { + currentCoordinates.push_back(SRPStatus.get(coordinate)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad floating point coordinate:" << SRPStatus.get(coordinate) << std::endl; + currentCoordinates.push_back(double(SRPStatus.get(coordinate))); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap SRPStatus) + { + std::vector currentElongations; + std::vector elongations = { "SRP_ELONG_Z1", "SRP_ELONG_Z2", "SRP_ELONG_Z3", "SRP_ELONG_Y1", "SRP_ELONG_Y2", "SRP_ELONG_X1" }; + + for(std::string elongation : elongations) + { + try + { + currentElongations.push_back(SRPStatus.get(elongation)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad floating point elongation:" << SRPStatus.get(elongation) << std::endl; + currentElongations.push_back(double(SRPStatus.get(elongation))); + } + } + + return currentElongations; + } + + static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + double starting_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + double offset_to_add = MAX_SPEED[axis_to_move] / 5; + coordinates[axis_to_move] += sign * offset_to_add; + double ending_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + if(starting_sign == -1 && ending_sign >= 0) + { + // Zero crossed + coordinates[axis_to_move] = 0.0; + return false; + } + if(fabs(coordinates[axis_to_move]) >= MAX_RANGES[axis_to_move]) + { + coordinates[axis_to_move] = sign * MAX_RANGES[axis_to_move]; + return true; + } + return false; + } + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + try + { + SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT, 0.2); + std::cout << "Socket connected." << std::endl; + } + catch(ComponentErrors::SocketErrorExImpl& ex) + { + if(ex.getData("Reason") == std::string("Cannot connect the socket.").c_str()) + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + else + FAIL() << "Unexpected failure." << std::endl; + } + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_TRUE(MSStatus.checkOutput()); + EXPECT_EQ(MSStatus.get("CONTROL"), 1); + //EXPECT_EQ(MSStatus.get("POWER"), 1); + EXPECT_EQ(MSStatus.get("EMERGENCY"), 2); + //EXPECT_EQ(MSStatus.get("ENABLED"), 1); + std::cout << "OK." << std::endl; + + /*SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + + std::cout << "Sending initial SRP STATUS command..."; + + SRTMinorServoAnswerMap SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + //EXPECT_EQ(SRPStatus.get("SRP_STATUS"), 1); + EXPECT_EQ(SRPStatus.get("SRP_BLOCK"), 2); + std::cout << "OK." << std::endl; + + /*for(iterator = SRPStatus.begin(); iterator != SRPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + + std::cout << "Sending all axes to the starting position..." << std::endl; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("SRP", startingCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + + signal(SIGINT, SRPProgramTrackTest::sigintHandler); + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + std::cout << serializeStatus(SRPStatus) << std::endl; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + while(SRPStatus.get("SRP_OPERATIVE_MODE") != 40); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 40); + + std::cout << "OK." << std::endl; + + startingCoordinates = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/SRP"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + statusThread = std::thread(&SRPProgramTrackTest::printStatus, directory + "/status.txt"); + } + + void TearDown() override + { + SRTMinorServoTestingSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(SRPProgramTrackTest, ContinuousMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(SRPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + while(!terminate) + { + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 5) + { + idle_count = 0; + idle = false; + } + } + else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + break; + } + } + + axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, AllAxesMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(SRPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + std::vector sign = { 1, 1, 1 }; + std::vector idle_count = { 0, 0, 0 }; + std::vector idle = { false, false, false }; + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + if(!idle[axis]) + { + if(moveAxis(programTrackCoordinates, axis, sign[axis])) + { + sign[axis] *= -1; + idle[axis] = true; + } + } + else + { + idle_count[axis]++; + if(idle_count[axis] == 5) + { + idle_count[axis] = 0; + idle[axis] = false; + } + } + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + for(size_t axis = 0; axis < 3; axis++) + { + if(round(programTrackCoordinates[axis] * 100) == 0 && sign[axis] == 1) + { + programTrackCoordinates[axis] = 0.0; + } + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, SineWaveMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + std::vector phase_shift; + std::vector period; + for(size_t axis = 0; axis < 6; axis++) + { + double period_multiplier = axis < 3 ? 4 : 4; + period.push_back(MAX_RANGES[axis] / MAX_SPEED[axis] * period_multiplier); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin(phase_shift[axis] * 2 * M_PI / period[axis]); + } + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(SRPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 6; axis++) + { + programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, SeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + bool immediate = true; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(SRPStatus.checkOutput()); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == (ADVANCE_TIMEGAP / TIMEGAP) || immediate) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + else if(programTrackCoordinates[axis_to_move] == 0.0 && sign == 1) + { + axis_to_move == 5 ? axis_to_move = 0 : axis_to_move++; + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + } + + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + //immediate = immediate ? false : true; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(SRPProgramTrackTest, RapidTrajectoryTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap SRPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 2; //Always Z + int sign = -1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + + while(!terminate) + { + std::vector programTrackCoordinates = startingCoordinates; + programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(SRPStatus.checkOutput()); + programTrackFile << SRPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("SRP")); + EXPECT_TRUE(SRPStatus.checkOutput()); + EXPECT_EQ(SRPStatus.get("SRP_OPERATIVE_MODE"), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + idle = true; + } + + SRPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("SRP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(SRPStatus.checkOutput()); + } + + //std::cout << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << SRPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py new file mode 100755 index 000000000..87127cccb --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotCombined.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +srp_status_time = [] +derotator_status_time = [] +status_tx = [] +status_ty = [] +status_tz = [] +status_rx = [] +status_ry = [] +status_rz = [] +status_rotation = [] +starttime = None + +with open(os.path.join(arguments.directory, 'SRP', 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + srp_status_time.append(float(args[0]) - starttime) + status_tx.append(float(args[1])) + status_ty.append(float(args[2])) + status_tz.append(float(args[3])) + status_rx.append(float(args[4])) + status_ry.append(float(args[5])) + status_rz.append(float(args[6])) + +with open(os.path.join(arguments.directory, 'DEROTATOR', 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + derotator_status_time.append(float(args[0]) - starttime) + status_rotation.append(float(args[1])) + +trajectory_time = [] +trajectory_tx = [] +trajectory_ty = [] +trajectory_tz = [] +trajectory_rx = [] +trajectory_ry = [] +trajectory_rz = [] +trajectory_rotation = [] + +with open(os.path.join(arguments.directory, 'SRP', 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_tx.append(float(args[1])) + trajectory_ty.append(float(args[2])) + trajectory_tz.append(float(args[3])) + trajectory_rx.append(float(args[4])) + trajectory_ry.append(float(args[5])) + trajectory_rz.append(float(args[6])) + +with open(os.path.join(arguments.directory, 'DEROTATOR', 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_rotation.append(float(args[1])) + +fig, axs = plt.subplots(7, sharex=True) +fig.canvas.manager.set_window_title('Program Track Positions') +fig.suptitle('Program Track Positions') + +axs[0].plot(srp_status_time, status_tx, 'r') +axs[0].plot(trajectory_time, trajectory_tx, 'b') +axs[0].set_ylabel('tx (mm)') +axs[0].sharey(axs[1]) + +axs[1].plot(srp_status_time, status_ty, 'r') +axs[1].plot(trajectory_time, trajectory_ty, 'b') +axs[1].set_ylabel('ty (mm)') +axs[1].sharey(axs[2]) + +axs[2].plot(srp_status_time, status_tz, 'r') +axs[2].plot(trajectory_time, trajectory_tz, 'b') +axs[2].set_ylabel('tz (mm)') + +axs[3].plot(srp_status_time, status_rx, 'r') +axs[3].plot(trajectory_time, trajectory_rx, 'b') +axs[3].set_ylabel('rx (deg)') +axs[3].sharey(axs[4]) + +axs[4].plot(srp_status_time, status_ry, 'r') +axs[4].plot(trajectory_time, trajectory_ry, 'b') +axs[4].set_ylabel('ry (deg)') +axs[4].sharey(axs[5]) + +axs[5].plot(srp_status_time, status_rz, 'r') +axs[5].plot(trajectory_time, trajectory_rz, 'b') +axs[5].set_ylabel('rz (deg)') + +axs[6].plot(derotator_status_time, status_rotation, 'r') +axs[6].plot(trajectory_time, trajectory_rotation, 'b') +axs[6].set_ylabel('derot (deg)') +axs[6].set_xlabel('time (s)') + + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +try: + plt.show() +except KeyboardInterrupt: + pass diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py new file mode 100755 index 000000000..649ae367a --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotDerotatorTrajectory.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +status_time = [] +status_rotation = [] +starttime = None + +with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + status_time.append(float(args[0]) - starttime) + status_rotation.append(float(args[1])) + +trajectory_time = [] +trajectory_rotation = [] + +with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_rotation.append(float(args[1])) + +#plt.canvas.manager.set_window_title('Derotator positions') +plt.suptitle('Derotator positions') +plt.plot(status_time, status_rotation, 'r') +plt.plot(trajectory_time, trajectory_rotation, 'b') +plt.ylabel('rot (deg)') +plt.xlabel('time (sec)') + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +try: + plt.show() +except KeyboardInterrupt: + pass diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py new file mode 100755 index 000000000..e2f39fe77 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotSRPTrajectories.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +status_time = [] +status_tx = [] +status_ty = [] +status_tz = [] +status_rx = [] +status_ry = [] +status_rz = [] +status_ez1 = [] +status_ez2 = [] +status_ez3 = [] +status_ey1 = [] +status_ey2 = [] +status_ex1 = [] +starttime = None + +with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + status_time.append(float(args[0]) - starttime) + status_tx.append(float(args[1])) + status_ty.append(float(args[2])) + status_tz.append(float(args[3])) + status_rx.append(float(args[4])) + status_ry.append(float(args[5])) + status_rz.append(float(args[6])) + status_ez1.append(float(args[7])) + status_ez2.append(float(args[8])) + status_ez3.append(float(args[9])) + status_ey1.append(float(args[10])) + status_ey2.append(float(args[11])) + status_ex1.append(float(args[12])) + +trajectory_time = [] +trajectory_tx = [] +trajectory_ty = [] +trajectory_tz = [] +trajectory_rx = [] +trajectory_ry = [] +trajectory_rz = [] + +with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_tx.append(float(args[1])) + trajectory_ty.append(float(args[2])) + trajectory_tz.append(float(args[3])) + trajectory_rx.append(float(args[4])) + trajectory_ry.append(float(args[5])) + trajectory_rz.append(float(args[6])) + +fig = plt.figure() +fig.canvas.manager.set_window_title('SRP Positions') +fig.suptitle('SRP Positions') + +gs = fig.add_gridspec(6, 2, hspace=0) +((tx, ex1), (ty, ey1), (tz, ey2), (rx, ez1), (ry, ez2), (rz, ez3)) = gs.subplots(sharex=True) + +tx.plot(status_time, status_tx, 'r') +tx.plot(trajectory_time, trajectory_tx, 'b') +tx.set_ylabel('tx (mm)') +tx.sharey(ty) + +ty.plot(status_time, status_ty, 'r') +ty.plot(trajectory_time, trajectory_ty, 'b') +ty.set_ylabel('ty (mm)') +ty.sharey(tz) + +tz.plot(status_time, status_tz, 'r') +tz.plot(trajectory_time, trajectory_tz, 'b') +tz.set_ylabel('tz (mm)') +tz.sharey(ex1) + +rx.plot(status_time, status_rx, 'r') +rx.plot(trajectory_time, trajectory_rx, 'b') +rx.set_ylabel('rx (deg)') +rx.sharey(ry) + +ry.plot(status_time, status_ry, 'r') +ry.plot(trajectory_time, trajectory_ry, 'b') +ry.set_ylabel('ry (deg)') +ry.sharey(rz) + +rz.plot(status_time, status_rz, 'r') +rz.plot(trajectory_time, trajectory_rz, 'b') +rz.set_ylabel('rz (deg)') +rz.set_xlabel('time (s)') + + +ex1.plot(status_time, status_ex1, 'g') +ex1.set_ylabel('ex1 (mm)') +ex1.sharey(ey1) + +ey1.plot(status_time, status_ey1, 'g') +ey1.set_ylabel('ey1 (mm)') +ey1.sharey(ey2) + +ey2.plot(status_time, status_ey2, 'g') +ey2.set_ylabel('ey2 (mm)') +ey2.sharey(ez1) + +ez1.plot(status_time, status_ez1, 'g') +ez1.set_ylabel('ez1 (mm)') +ez1.sharey(ez2) + +ez2.plot(status_time, status_ez2, 'g') +ez2.set_ylabel('ez2 (mm)') +ez2.sharey(ez3) + +ez3.plot(status_time, status_ez3, 'g') +ez3.set_ylabel('ez3 (mm)') +ez3.set_xlabel('time (s)') + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +try: + plt.show() +except KeyboardInterrupt: + pass diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/MinorServo.xsd b/SRT/Servers/SRTOldMinorServo/config/CDB/schemas/MinorServo.xsd similarity index 100% rename from SRT/Servers/SRTMinorServo/config/CDB/schemas/MinorServo.xsd rename to SRT/Servers/SRTOldMinorServo/config/CDB/schemas/MinorServo.xsd diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/derotator.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/derotator.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/derotator.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/derotator.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/icd.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/icd.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/icd.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/icd.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/icd_bus.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/icd_bus.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/icd_bus.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/icd_bus.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/derotator/sensor.pdf b/SRT/Servers/SRTOldMinorServo/doc/derotator/sensor.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/derotator/sensor.pdf rename to SRT/Servers/SRTOldMinorServo/doc/derotator/sensor.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/minor_servo/gimbal.pdf b/SRT/Servers/SRTOldMinorServo/doc/minor_servo/gimbal.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/minor_servo/gimbal.pdf rename to SRT/Servers/SRTOldMinorServo/doc/minor_servo/gimbal.pdf diff --git a/SRT/Servers/SRTMinorServo/doc/minor_servo/minor_servo_system.pdf b/SRT/Servers/SRTOldMinorServo/doc/minor_servo/minor_servo_system.pdf similarity index 100% rename from SRT/Servers/SRTMinorServo/doc/minor_servo/minor_servo_system.pdf rename to SRT/Servers/SRTOldMinorServo/doc/minor_servo/minor_servo_system.pdf diff --git a/SRT/Servers/SRTMinorServo/include/DerotatorImpl.h b/SRT/Servers/SRTOldMinorServo/include/DerotatorImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DerotatorImpl.h rename to SRT/Servers/SRTOldMinorServo/include/DerotatorImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOASConfiguration.h b/SRT/Servers/SRTOldMinorServo/include/DevIOASConfiguration.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOASConfiguration.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOASConfiguration.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOActualSetup.h b/SRT/Servers/SRTOldMinorServo/include/DevIOActualSetup.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOActualSetup.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOActualSetup.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOElevationTrack.h b/SRT/Servers/SRTOldMinorServo/include/DevIOElevationTrack.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOElevationTrack.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOElevationTrack.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOMotionInfo.h b/SRT/Servers/SRTOldMinorServo/include/DevIOMotionInfo.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOMotionInfo.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOMotionInfo.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOParking.h b/SRT/Servers/SRTOldMinorServo/include/DevIOParking.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOParking.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOParking.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOReady.h b/SRT/Servers/SRTOldMinorServo/include/DevIOReady.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOReady.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOReady.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOScanActive.h b/SRT/Servers/SRTOldMinorServo/include/DevIOScanActive.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOScanActive.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOScanActive.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOScanning.h b/SRT/Servers/SRTOldMinorServo/include/DevIOScanning.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOScanning.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOScanning.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOStarting.h b/SRT/Servers/SRTOldMinorServo/include/DevIOStarting.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOStarting.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOStarting.h diff --git a/SRT/Servers/SRTMinorServo/include/DevIOTracking.h b/SRT/Servers/SRTOldMinorServo/include/DevIOTracking.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/DevIOTracking.h rename to SRT/Servers/SRTOldMinorServo/include/DevIOTracking.h diff --git a/SRT/Servers/SRTMinorServo/include/MSBossConfiguration.h b/SRT/Servers/SRTOldMinorServo/include/MSBossConfiguration.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSBossConfiguration.h rename to SRT/Servers/SRTOldMinorServo/include/MSBossConfiguration.h diff --git a/SRT/Servers/SRTMinorServo/include/MSBossPublisher.h b/SRT/Servers/SRTOldMinorServo/include/MSBossPublisher.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSBossPublisher.h rename to SRT/Servers/SRTOldMinorServo/include/MSBossPublisher.h diff --git a/SRT/Servers/SRTMinorServo/include/MSParameters.h b/SRT/Servers/SRTOldMinorServo/include/MSParameters.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MSParameters.h rename to SRT/Servers/SRTOldMinorServo/include/MSParameters.h diff --git a/SRT/Servers/SRTMinorServo/include/MinorServoBossImpl.h b/SRT/Servers/SRTOldMinorServo/include/MinorServoBossImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/MinorServoBossImpl.h rename to SRT/Servers/SRTOldMinorServo/include/MinorServoBossImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/ParkThread.h b/SRT/Servers/SRTOldMinorServo/include/ParkThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/ParkThread.h rename to SRT/Servers/SRTOldMinorServo/include/ParkThread.h diff --git a/SRT/Servers/SRTMinorServo/include/PdoubleSeqDevIO.h b/SRT/Servers/SRTOldMinorServo/include/PdoubleSeqDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/PdoubleSeqDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/PdoubleSeqDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/RequestDispatcher.h b/SRT/Servers/SRTOldMinorServo/include/RequestDispatcher.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/RequestDispatcher.h rename to SRT/Servers/SRTOldMinorServo/include/RequestDispatcher.h diff --git a/SRT/Servers/SRTMinorServo/include/ScanThread.h b/SRT/Servers/SRTOldMinorServo/include/ScanThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/ScanThread.h rename to SRT/Servers/SRTOldMinorServo/include/ScanThread.h diff --git a/SRT/Servers/SRTMinorServo/include/SetupThread.h b/SRT/Servers/SRTOldMinorServo/include/SetupThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SetupThread.h rename to SRT/Servers/SRTOldMinorServo/include/SetupThread.h diff --git a/SRT/Servers/SRTMinorServo/include/SocketListener.h b/SRT/Servers/SRTOldMinorServo/include/SocketListener.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SocketListener.h rename to SRT/Servers/SRTOldMinorServo/include/SocketListener.h diff --git a/SRT/Servers/SRTMinorServo/include/SubsystemStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/SubsystemStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SubsystemStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/SubsystemStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/SubsystemVStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/SubsystemVStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/SubsystemVStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/SubsystemVStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/TrackingThread.h b/SRT/Servers/SRTOldMinorServo/include/TrackingThread.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/TrackingThread.h rename to SRT/Servers/SRTOldMinorServo/include/TrackingThread.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoImpl.h b/SRT/Servers/SRTOldMinorServo/include/WPServoImpl.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoImpl.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoImpl.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoSocket.h b/SRT/Servers/SRTOldMinorServo/include/WPServoSocket.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoSocket.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoSocket.h diff --git a/SRT/Servers/SRTMinorServo/include/WPServoTalker.h b/SRT/Servers/SRTOldMinorServo/include/WPServoTalker.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPServoTalker.h rename to SRT/Servers/SRTOldMinorServo/include/WPServoTalker.h diff --git a/SRT/Servers/SRTMinorServo/include/WPStatusDevIO.h b/SRT/Servers/SRTOldMinorServo/include/WPStatusDevIO.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPStatusDevIO.h rename to SRT/Servers/SRTOldMinorServo/include/WPStatusDevIO.h diff --git a/SRT/Servers/SRTMinorServo/include/WPStatusUpdater.h b/SRT/Servers/SRTOldMinorServo/include/WPStatusUpdater.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPStatusUpdater.h rename to SRT/Servers/SRTOldMinorServo/include/WPStatusUpdater.h diff --git a/SRT/Servers/SRTMinorServo/include/WPUtils.h b/SRT/Servers/SRTOldMinorServo/include/WPUtils.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/WPUtils.h rename to SRT/Servers/SRTOldMinorServo/include/WPUtils.h diff --git a/SRT/Servers/SRTMinorServo/include/libCom.h b/SRT/Servers/SRTOldMinorServo/include/libCom.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/libCom.h rename to SRT/Servers/SRTOldMinorServo/include/libCom.h diff --git a/SRT/Servers/SRTMinorServo/include/macros.def b/SRT/Servers/SRTOldMinorServo/include/macros.def similarity index 100% rename from SRT/Servers/SRTMinorServo/include/macros.def rename to SRT/Servers/SRTOldMinorServo/include/macros.def diff --git a/SRT/Servers/SRTMinorServo/include/utils.h b/SRT/Servers/SRTOldMinorServo/include/utils.h similarity index 100% rename from SRT/Servers/SRTMinorServo/include/utils.h rename to SRT/Servers/SRTOldMinorServo/include/utils.h diff --git a/SRT/Servers/SRTMinorServo/src/MSBossConfiguration.cpp b/SRT/Servers/SRTOldMinorServo/src/MSBossConfiguration.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MSBossConfiguration.cpp rename to SRT/Servers/SRTOldMinorServo/src/MSBossConfiguration.cpp diff --git a/SRT/Servers/SRTMinorServo/src/MSBossPublisher.cpp b/SRT/Servers/SRTOldMinorServo/src/MSBossPublisher.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MSBossPublisher.cpp rename to SRT/Servers/SRTOldMinorServo/src/MSBossPublisher.cpp diff --git a/SRT/Servers/SRTOldMinorServo/src/Makefile b/SRT/Servers/SRTOldMinorServo/src/Makefile new file mode 100644 index 000000000..6c47bef42 --- /dev/null +++ b/SRT/Servers/SRTOldMinorServo/src/Makefile @@ -0,0 +1,75 @@ +#***************************************** +#----------------------------------------- +# Marco Buttu +#----------------------------------------- +#***************************************** + +PY_PACKAGES = +PY_SCRIPTS = + +# On-Line Database Files +# ---------------------- +CDB_SCHEMAS = MinorServo + +# ---------------------------- +# Libraries (public and local) +# ---------------------------- +LIBRARIES = WPServoImpl MinorServoBossImpl + +WPServoImpl_OBJECTS = WPServoImpl WPServoSocket WPServoTalker RequestDispatcher \ + WPStatusUpdater SocketListener utils libCom WPUtils +WPServoImpl_LIBS = MinorServoStubs IRALibrary ComponentErrors \ + SRTMinorServoLibrary MinorServoErrors + +MinorServoBossImpl_OBJECTS = MinorServoBossImpl utils SetupThread ParkThread \ + TrackingThread ScanThread MSBossPublisher libCom \ + MSBossConfiguration +MinorServoBossImpl_LIBS = MinorServoStubs MinorServoBossStubs SRTMinorServoLibrary \ + ManagmentDefinitionsStubs ManagementErrors \ + IRALibrary ComponentErrors MinorServoErrors acsnc \ + ParserErrors DiscosVersion AntennaDefinitionsStubs MountStubs \ + AntennaBossStubs AntennaErrors ActiveSurfaceBossStubs \ + SRTActiveSurfaceBossStubs MinorServoDefinitionsStubs +# ---------------------------------------------------------------------- +# List of all possible C-sources (used to create automatic dependencies) +# ---------------------------------------------------------------------- +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + + +# ----------------- +# Include Standards +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + + +# TARGETS +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + $(RM) *~ ../include/*~ ../idl/*~ ../*~ ../../*~ core + $(RM) ../doc/html + $(RM) tmp.txt acsexmplbeans.jar ../doc/abeans.log + $(RM) ../lib/python/site-packages/* + $(RM) $(INTROOT)/lib/python/site-packages/SRTMinorServoTest + $(RM) $(INTROOT)/bin/mscu-runserver + @echo " . . . clean done" + +clean_dist : clean clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + # cp ../doc/html/group__ACSEXMPLDOC.html ../doc/html/main.html + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + +#___oOo___ diff --git a/SRT/Servers/SRTMinorServo/src/MinorServoBossImpl.cpp b/SRT/Servers/SRTOldMinorServo/src/MinorServoBossImpl.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/MinorServoBossImpl.cpp rename to SRT/Servers/SRTOldMinorServo/src/MinorServoBossImpl.cpp diff --git a/SRT/Servers/SRTMinorServo/src/ParkThread.cpp b/SRT/Servers/SRTOldMinorServo/src/ParkThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/ParkThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/ParkThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/RequestDispatcher.cpp b/SRT/Servers/SRTOldMinorServo/src/RequestDispatcher.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/RequestDispatcher.cpp rename to SRT/Servers/SRTOldMinorServo/src/RequestDispatcher.cpp diff --git a/SRT/Servers/SRTMinorServo/src/ScanThread.cpp b/SRT/Servers/SRTOldMinorServo/src/ScanThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/ScanThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/ScanThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/SetupThread.cpp b/SRT/Servers/SRTOldMinorServo/src/SetupThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/SetupThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/SetupThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/SocketListener.cpp b/SRT/Servers/SRTOldMinorServo/src/SocketListener.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/SocketListener.cpp rename to SRT/Servers/SRTOldMinorServo/src/SocketListener.cpp diff --git a/SRT/Servers/SRTMinorServo/src/TrackingThread.cpp b/SRT/Servers/SRTOldMinorServo/src/TrackingThread.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/TrackingThread.cpp rename to SRT/Servers/SRTOldMinorServo/src/TrackingThread.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoImpl.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoImpl.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoImpl.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoImpl.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoSocket.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoSocket.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoSocket.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoSocket.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPServoTalker.cpp b/SRT/Servers/SRTOldMinorServo/src/WPServoTalker.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPServoTalker.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPServoTalker.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPStatusUpdater.cpp b/SRT/Servers/SRTOldMinorServo/src/WPStatusUpdater.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPStatusUpdater.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPStatusUpdater.cpp diff --git a/SRT/Servers/SRTMinorServo/src/WPUtils.cpp b/SRT/Servers/SRTOldMinorServo/src/WPUtils.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/WPUtils.cpp rename to SRT/Servers/SRTOldMinorServo/src/WPUtils.cpp diff --git a/SRT/Servers/SRTMinorServo/src/libCom.cpp b/SRT/Servers/SRTOldMinorServo/src/libCom.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/libCom.cpp rename to SRT/Servers/SRTOldMinorServo/src/libCom.cpp diff --git a/SRT/Servers/SRTMinorServo/src/utils.cpp b/SRT/Servers/SRTOldMinorServo/src/utils.cpp similarity index 100% rename from SRT/Servers/SRTMinorServo/src/utils.cpp rename to SRT/Servers/SRTOldMinorServo/src/utils.cpp diff --git a/SRT/Servers/SRTOldMinorServo/test/Makefile b/SRT/Servers/SRTOldMinorServo/test/Makefile new file mode 100644 index 000000000..cbc49a447 --- /dev/null +++ b/SRT/Servers/SRTOldMinorServo/test/Makefile @@ -0,0 +1,90 @@ +# CPP UNIT TESTING SETUP +#-------------- +# GTEST_HOME=/usr/local/include/gtest +# GMOCK_HOME=/usr/local/include/gmock +# GTEST_LIBS=gtest gtest_main + +# USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) +# USER_LIBS=C++ pthread +# END OF CPP UNIT TESTING SETUP +#--------------------- + +# DEFINE YOUR CPP UNIT TEST EXECUTABLES HERE as: +# +# EXECTUABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# EXECUTABLES_L = unittest +# unittest_OBJECTS = unittest +# unittest_LIBS = $(GTEST_LIBS) + +# END OF CUSTOMIZATION +# do not edit below this line +#---------------------------- + +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# TEST TARGETS +#TODO: unittest(2) discover pyunit + +do_unit: all + @echo "running cpp unit tests" + ../bin/unittest --gtest_output=xml:results/cppunittest.xml + +do_pyunit: + @echo "running python unit tests" + python -m unittest pyunit + +do_functional: + @echo "running python functional tests" + python -m unittest functional + +do_external: + @echo "running python external tests" + python -m unittest external + +clean_test: + rm -f results/*.xml + rm -f functional/*.pyc + rm -f pyunit/*.pyc + rm -f external/*.pyc + +unit: do_unit + @echo " . . . 'unit' done" + +pyunit: do_pyunit + @echo " . . . 'pyunit' done" + +functional: do_functional + @echo " . . . 'functional' done" + +external: do_external + @echo " . . . 'external' done" + +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all clean_test + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all clean_test + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + diff --git a/SRT/Servers/SRTOldMinorServo/test/external/__init__.py b/SRT/Servers/SRTOldMinorServo/test/external/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTOldMinorServo/test/functional/__init__.py b/SRT/Servers/SRTOldMinorServo/test/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_container_crash.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_container_crash.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_container_crash.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_container_crash.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_failure.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_failure.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_failure.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_failure.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_setup.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_setup.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_setup.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_setup.py diff --git a/SRT/Servers/SRTMinorServo/test/functional/test_setup_after_manual_movement.py b/SRT/Servers/SRTOldMinorServo/test/functional/test_setup_after_manual_movement.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/functional/test_setup_after_manual_movement.py rename to SRT/Servers/SRTOldMinorServo/test/functional/test_setup_after_manual_movement.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/Makefile b/SRT/Servers/SRTOldMinorServo/test/no_auto/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/Makefile rename to SRT/Servers/SRTOldMinorServo/test/no_auto/Makefile diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/05082013.rst b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/05082013.rst similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/05082013.rst rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/05082013.rst diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/plot_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/SRP_linear/test_SRP_linear_movement.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/TODO.rst b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/TODO.rst similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/TODO.rst rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/TODO.rst diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/clean_test.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/clean_test.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/clean_test.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/clean_test.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/command_input.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/command_input.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/command_input.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/command_input.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPosition.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getAxesPosition/test_getAxesPositionSpeed.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/getFromHistory/test_getFromHistory.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_after_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/offsets/testSRP_before_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/parameters.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/parameters.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/parameters.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/parameters.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/plot_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/plot_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/plot_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/plot_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/property/property_sampler.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/property/property_sampler.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/property/property_sampler.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/property/property_sampler.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/sampling_time/test_getstatus_speed.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_checkMinPositioninTime.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_multiple_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_pointingDuringScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_startFocusScanNow.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/scan/testSRP_stopScan.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions1SRP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2PFP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/timed_pos/timed_positions2SRP.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/commissioning/tracking/test_SRP_elevation_tracking.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/performances/get_axes_positions.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/performances/get_axes_positions.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/performances/get_axes_positions.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/performances/get_axes_positions.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/real2virtual.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/real2virtual.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/real2virtual.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/real2virtual.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/send_command.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/send_command.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/send_command.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/send_command.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/simple_talk.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/simple_talk.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/simple_talk.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/simple_talk.py diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/Makefile diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexdata.txt diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/hexlib.h diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/real2virtual.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/hexlib/virtual2real.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw b/SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw rename to SRT/Servers/SRTOldMinorServo/test/no_auto/srp_refsystems/srp_refsystems.pyw diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/virtual2real.c b/SRT/Servers/SRTOldMinorServo/test/no_auto/virtual2real.c similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/virtual2real.c rename to SRT/Servers/SRTOldMinorServo/test/no_auto/virtual2real.c diff --git a/SRT/Servers/SRTMinorServo/test/no_auto/wpservo_test.py b/SRT/Servers/SRTOldMinorServo/test/no_auto/wpservo_test.py similarity index 100% rename from SRT/Servers/SRTMinorServo/test/no_auto/wpservo_test.py rename to SRT/Servers/SRTOldMinorServo/test/no_auto/wpservo_test.py diff --git a/SRT/Servers/SRTOldMinorServo/test/pyunit/__init__.py b/SRT/Servers/SRTOldMinorServo/test/pyunit/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/SRT/Servers/SRTOldMinorServo/test/unittest.cpp b/SRT/Servers/SRTOldMinorServo/test/unittest.cpp new file mode 100644 index 000000000..59cb6295f --- /dev/null +++ b/SRT/Servers/SRTOldMinorServo/test/unittest.cpp @@ -0,0 +1,6 @@ +#include "gtest/gtest.h" + +TEST(FakeTest, Success){ + EXPECT_EQ(1, 1); +} + diff --git a/SystemMake/Makefile b/SystemMake/Makefile index fe778c6be..32834ba76 100644 --- a/SystemMake/Makefile +++ b/SystemMake/Makefile @@ -49,7 +49,7 @@ COMMON_SIMULATORS:= TCPGenericProtocolSim ReceiverBoardSim SRT_DOC:=SRTDox SRT_ERRORS:= SRT_INTERFACES:=SRTAntennaInterface SRTActiveSurfaceInterface \ - SRTReceiversInterface + SRTMinorServoInterface SRTReceiversInterface SRT_LIBRARIES:=SRTMinorServoLibrary SRT_SERVERS:=SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver \ SRT7GHzReceiver SRT5GHzReceiver SRTLPBandReceiver SRTPyIFDistributor WeatherStation -- GitLab From d8759752ea2789173be5ab623a129ef3eefc21e6 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 10 Apr 2024 15:19:07 +0000 Subject: [PATCH 101/150] Various updates, see changelog below Fix #861, increased SRP virtual ranges Fix #860, added setupMISTRAL procedure Fix #859, increased fields length for minor servo boss TUI Fix #858, modified SRT telescopePark procedure --- .../src/MinorServoBossTextClient.cpp | 2 +- .../SRP/LookupTables/LookupTables.xml | 18 +++++----- .../DataBlock/PointingModel/PointingModel.xml | 35 +++++++++++++++++++ SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 4 +-- .../StationProcedures/StationProcedures.xml | 23 +++++++++--- .../SRP/LookupTables/LookupTables.xml | 18 +++++----- .../DataBlock/PointingModel/PointingModel.xml | 35 +++++++++++++++++++ .../CDB/alma/MINORSERVO/SRP/SRP.xml | 4 +-- .../StationProcedures/StationProcedures.xml | 23 +++++++++--- 9 files changed, 131 insertions(+), 31 deletions(-) diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp index c90158e95..9a5baeeab 100644 --- a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -279,7 +279,7 @@ int main(int argc, char *argv[]) { userInput=new TW::CInputCommand(); /** setting up the properties of the components of the frame controls */ - _TW_SET_COMPONENT(actualSetup_field,18,0,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(actualSetup_field,18,0,20,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); tracking_display->setPosition(CPoint(18,1)); tracking_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); tracking_display->setFormatFunction(boolFormat,NULL); diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml index 6869a5c77..0cabed4bb 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -80,18 +80,18 @@ RY0 RZ0 - TX38 - TY31 - TZ-12.788622422210521 - RX-0.005254963341757046 + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 RY-0.03611111111111111 RZ0 - TX38 - TY31 - TZ-12.788622422210521 - RX-0.005254963341757046 - RY-0.03611111111111111 + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 RZ0 TX-1.5 diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index 14a8fbca7..dfad02903 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -174,4 +174,39 @@ 0 0 + + MISTRAL + 90.0 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 + 0 0.0 + 1 0.0002358370 + 1 0.0000537828 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index eebfba2c7..d48d39ad4 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -11,8 +11,8 @@ virtual_axes="6" max_speed="4, 4, 4, 0.38, 0.38, 0.38" acceleration="8, 8, 8, 0.76, 0.76, 0.76" - min_range="-50, -110, -50, -0.25, -0.25, -0.25" - max_range="50, 110, 50, 0.25, 0.25, 0.25" + min_range="-125, -125, -125, -0.25, -0.25, -0.25" + max_range="125, 125, 125, 0.25, 0.25, 0.25" tracking_delta="1, 1, 1, 1, 1, 1"> diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 4d86ea178..4be2b1e2d 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -119,16 +119,31 @@
+ + + antennaSetup=MISTRAL + servoSetup=MISTRAL + receiversSetup=KKG + receiversMode=SINGLEDISH + chooseBackend=TotalPower + initialize=CCG + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d + + + - goTo=180d,89.8d + goTo=*,89.8d + receiversPark + servoPark + asPark waitOnSource antennaStop wait=1 antennaPark - receiversPark - servoPark - asPark logMessage=Telescope is now parked diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml index 6869a5c77..0cabed4bb 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml @@ -80,18 +80,18 @@ RY0 RZ0 - TX38 - TY31 - TZ-12.788622422210521 - RX-0.005254963341757046 + TX-1.5 + TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 + TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 + RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 RY-0.03611111111111111 RZ0 - TX38 - TY31 - TZ-12.788622422210521 - RX-0.005254963341757046 - RY-0.03611111111111111 + TX-1.5 + TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 + TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 + RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 + RY-0.036111111111111108 RZ0 TX-1.5 diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index 14a8fbca7..dfad02903 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -174,4 +174,39 @@ 0 0 + + MISTRAL + 90.0 + 1 -2.2956719398 + 0 0.0 + 1 -0.0056679383 + 1 -0.0074789114 + 1 -0.0008009398 + 1 -0.0015651340 + 1 0.0572288483 + 1 0.1136546656 + 0 0.0 + 0 0.0 + 1 -0.0004978125 + 0 0.0 + 1 0.0002358370 + 1 0.0000537828 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index eebfba2c7..d48d39ad4 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -11,8 +11,8 @@ virtual_axes="6" max_speed="4, 4, 4, 0.38, 0.38, 0.38" acceleration="8, 8, 8, 0.76, 0.76, 0.76" - min_range="-50, -110, -50, -0.25, -0.25, -0.25" - max_range="50, 110, 50, 0.25, 0.25, 0.25" + min_range="-125, -125, -125, -0.25, -0.25, -0.25" + max_range="125, 125, 125, 0.25, 0.25, 0.25" tracking_delta="1, 1, 1, 1, 1, 1"> diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 4d86ea178..4be2b1e2d 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -119,16 +119,31 @@ + + + antennaSetup=MISTRAL + servoSetup=MISTRAL + receiversSetup=KKG + receiversMode=SINGLEDISH + chooseBackend=TotalPower + initialize=CCG + device=0 + calOff + restFrequency=0 + azelOffsets=0d,0d + + + - goTo=180d,89.8d + goTo=*,89.8d + receiversPark + servoPark + asPark waitOnSource antennaStop wait=1 antennaPark - receiversPark - servoPark - asPark logMessage=Telescope is now parked -- GitLab From e23651846fe461409b3daa451aa515f254fead44 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 23 Apr 2024 10:53:42 +0000 Subject: [PATCH 102/150] Added tests for PFP --- SRT/Servers/SRTMinorServo/test/Makefile | 6 +- .../test/PFPProgramTrackTest.cpp | 633 ++++++++++++++++++ .../SRTMinorServo/test/TESTS/.gitignore | 3 + .../test/TESTS/plotPFPTrajectory.py | 65 ++ 4 files changed, 706 insertions(+), 1 deletion(-) create mode 100644 SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp create mode 100644 SRT/Servers/SRTMinorServo/test/TESTS/.gitignore create mode 100755 SRT/Servers/SRTMinorServo/test/TESTS/plotPFPTrajectory.py diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index 97a093eab..e58a7b680 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -14,12 +14,16 @@ USER_INC=-I$(GTEST_HOME) -I$(GMOCK_HOME) # unittest_OBJECTS = unittest # unittest_LIBS = $(GTEST_LIBS) -EXECUTABLES_L = SRPProgramTrackTest #DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest +EXECUTABLES_L = SRPProgramTrackTest PFPProgramTrackTest #DerotatorProgramTrackTest CombinedProgramTrackTest ReadStatusOnlyTest SRPProgramTrackTest_OBJECTS = SRPProgramTrackTest SRPProgramTrackTest_CFLAGS = -std=c++17 -fconcepts SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +PFPProgramTrackTest_OBJECTS = PFPProgramTrackTest +PFPProgramTrackTest_CFLAGS = -std=c++17 -fconcepts +PFPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem + DerotatorProgramTrackTest_OBJECTS = DerotatorProgramTrackTest DerotatorProgramTrackTest_CFLAGS = -std=c++17 DerotatorProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem diff --git a/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp new file mode 100644 index 000000000..c96faa26b --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp @@ -0,0 +1,633 @@ +#include "gtest/gtest.h" +#include +#include +#include +#include +#include +#include "SRTMinorServoTestingSocket.h" +#include "SRTMinorServoCommandLibrary.h" + +// This address and port are the ones set in the simulator +// In order for the test to properly be executed, the simulator should be launched with the following command: +// discos-simulator -s minor_servo start & +#define SIMULATION +#ifdef SIMULATION + #define ADDRESS std::string("127.0.0.1") + #define PORT 12800 +#else + #define ADDRESS std::string("192.168.200.13") + #define PORT 4758 +#endif +#define NOISE_THRESHOLD 1 +#define TIMEGAP 0.2 +#define ADVANCE_TIMEGAP 2.6 +#define MIN_RANGES std::vector{ -1490, -200, -1 } +#define MAX_RANGES std::vector{ 1490, 50, 76 } +#define MAX_SPEED std::vector{ 25, 5, 0.42 } +#define STATUS_PERIOD 0.01 + +std::atomic terminate = false; + +using namespace MinorServo; +using namespace IRA; + + +class PFPProgramTrackTest : public ::testing::Test +{ +protected: + std::vector startingCoordinates = { 0.0, 0.0, 0.0 }; + std::string directory; + std::thread statusThread; + + static void printStatus(std::string filename) + { + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + + ofstream statusFile; + statusFile.open(filename, ios::out); + + long unsigned int counter = 0; + + double tn = CIRATools::getUNIXEpoch(); + + while(!terminate) + { + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + std::string status = serializeStatus(PFPStatus); + + statusFile << status << std::endl; + if(counter % 10 == 0) + std::cout << status << std::endl; + counter++; + + tn += STATUS_PERIOD; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, tn - CIRATools::getUNIXEpoch())))); + } + + statusFile.close(); + } + + static void sigintHandler(int sig_num) + { + std::cout << std::endl << "Terminating..." << std::endl; + terminate = true; + } + + static std::string serializeStatus(SRTMinorServoAnswerMap map) + { + std::string status; + try + { + status = serializeCoordinates(CIRATools::ACSTime2UNIXEpoch(map.getTimestamp()), getCoordinates(map)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad timestamp!" << std::endl; + + /*SRTMinorServoAnswerMap::iterator iterator; + for(iterator = map.begin(); iterator != map.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + } + status += serializeElongations(getElongations(map)); + return status; + } + + static std::string serializeCoordinates(double timestamp, std::vector coordinates) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6) << timestamp; + for(double coordinate : coordinates) + stream << "\t" << coordinate; + return stream.str(); + } + + static std::string serializeElongations(std::vector elongations) + { + std::stringstream stream; + stream << std::fixed << std::setprecision(6); + for(double elongation : elongations) + stream << "\t" << elongation; + return stream.str(); + } + + static std::vector getCoordinates(SRTMinorServoAnswerMap PFPStatus) + { + std::vector currentCoordinates; + std::vector coordinates = { "PFP_TX", "PFP_TZ", "PFP_RTHETA" }; + + for(std::string coordinate : coordinates) + { + try + { + currentCoordinates.push_back(PFPStatus.get(coordinate)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad floating point coordinate:" << PFPStatus.get(coordinate) << std::endl; + currentCoordinates.push_back(double(PFPStatus.get(coordinate))); + } + } + + return currentCoordinates; + } + + static std::vector getElongations(SRTMinorServoAnswerMap PFPStatus) + { + std::vector currentElongations; + std::vector elongations = { "PFP_ELONG_X", "PFP_ELONG_Z_MASTER", "PFP_ELONG_Z_SLAVE", "PFP_ELONG_THETA_MASTER", "PFP_ELONG_THETA_SLAVE" }; + + for(std::string elongation : elongations) + { + try + { + currentElongations.push_back(PFPStatus.get(elongation)); + } + catch(std::bad_variant_access const& ex) + { + std::cout << "Bad floating point elongation:" << PFPStatus.get(elongation) << std::endl; + currentElongations.push_back(double(PFPStatus.get(elongation))); + } + } + + return currentElongations; + } + + static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + { + double starting_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + double offset_to_add = MAX_SPEED[axis_to_move] / 5; + coordinates[axis_to_move] += sign * offset_to_add; + double ending_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + if(starting_sign == -1 && ending_sign >= 0) + { + // Zero crossed + coordinates[axis_to_move] = 0.0; + return false; + } + if(coordinates[axis_to_move] >= MAX_RANGES[axis_to_move]) + { + coordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + return true; + } + else if(coordinates[axis_to_move] <= MIN_RANGES[axis_to_move]) + { + coordinates[axis_to_move] = MIN_RANGES[axis_to_move]; + return true; + } + return false; + } + + void SetUp() override + { + srand((int)CIRATools::getUNIXEpoch()); + std::cout << std::fixed << std::setprecision(6); + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(ADDRESS, PORT, 0.2); + if(!socket.isConnected()) + { + FAIL() << "Socket failed to connect. Check if the simulator or the hardware can be reached." << std::endl; + } + + std::cout << "Sending MS STATUS command..."; + + SRTMinorServoAnswerMap MSStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status()); + EXPECT_TRUE(MSStatus.checkOutput()); + EXPECT_EQ(MSStatus.get("CONTROL"), 1); + //EXPECT_EQ(MSStatus.get("POWER"), 1); + EXPECT_EQ(MSStatus.get("EMERGENCY"), 2); + //EXPECT_EQ(MSStatus.get("ENABLED"), 1); + std::cout << "OK." << std::endl; + + /*SRTMinorServoAnswerMap::iterator iterator; + for(iterator = MSStatus.begin(); iterator != MSStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + + std::cout << "Sending initial PFP STATUS command..."; + + SRTMinorServoAnswerMap PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + //EXPECT_EQ(PFPStatus.get("PFP_STATUS"), 1); + EXPECT_EQ(PFPStatus.get("PFP_BLOCK"), 2); + std::cout << "OK." << std::endl; + + /*for(iterator = PFPStatus.begin(); iterator != PFPStatus.end(); ++iterator) + { + std::visit([iterator](const auto& var) mutable { std::cout << iterator->first << ": " << var << std::endl; }, iterator->second); + }*/ + + std::cout << "Sending all axes to the starting position..." << std::endl; + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::preset("PFP", startingCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + + signal(SIGINT, PFPProgramTrackTest::sigintHandler); + + do + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + std::cout << serializeStatus(PFPStatus) << std::endl; + + if(terminate) + FAIL() << "Aborting test..." << std::endl; + } + while(PFPStatus.get("PFP_OPERATIVE_MODE") != 40); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 40); + + std::cout << "OK." << std::endl; + + startingCoordinates = { 0.0, 0.0, 0.0 }; + + std::time_t tn = std::time(0); + std::tm* now = std::localtime(&tn); + std::stringstream directory_ss; + directory_ss << "TESTS/PFP"; + boost::filesystem::create_directory(directory_ss.str()); + directory_ss << "/"; + directory_ss << ::testing::UnitTest::GetInstance()->current_test_info()->name(); + directory_ss << "-"; + directory_ss << 1900 + now->tm_year; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mon + 1; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_mday; + directory_ss << "-"; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_hour; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_min; + directory_ss << std::setfill('0') << std::setw(2) << now->tm_sec; + directory = directory_ss.str(); + boost::filesystem::create_directory(directory); + + statusThread = std::thread(&PFPProgramTrackTest::printStatus, directory + "/status.txt"); + } + + void TearDown() override + { + SRTMinorServoTestingSocket::destroyInstance(); + terminate = false; + } +}; + +TEST_F(PFPProgramTrackTest, ContinuousMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(PFPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + while(!terminate) + { + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == 5) + { + idle_count = 0; + idle = false; + } + } + else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + { + programTrackCoordinates[axis_to_move] = 0.0; + break; + } + } + + axis_to_move == 2 ? axis_to_move = 0 : axis_to_move++; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(PFPProgramTrackTest, AllAxesMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(PFPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + std::vector sign = { 1, 1, 1 }; + std::vector idle_count = { 0, 0, 0 }; + std::vector idle = { false, false, false }; + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + if(!idle[axis]) + { + if(moveAxis(programTrackCoordinates, axis, sign[axis])) + { + sign[axis] *= -1; + idle[axis] = true; + } + } + else + { + idle_count[axis]++; + if(idle_count[axis] == 5) + { + idle_count[axis] = 0; + idle[axis] = false; + } + } + } + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + + for(size_t axis = 0; axis < 3; axis++) + { + if(round(programTrackCoordinates[axis] * 100) == 0 && sign[axis] == 1) + { + programTrackCoordinates[axis] = 0.0; + } + } + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(PFPProgramTrackTest, SineWaveMovementTest) +{ + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "PRESET position reached, starting PROGRAMTRACK with start time: " << start_time << std::endl; + long unsigned int trajectory_id = int(start_time); + unsigned int point_id = 0; + std::vector programTrackCoordinates = startingCoordinates; + + std::vector phase_shift; + std::vector period; + for(size_t axis = 0; axis < 3; axis++) + { + double amplitude = (MAX_RANGES[axis] - MIN_RANGES[axis]) / 2; + double period_multiplier = 4; + period.push_back(2 * amplitude / MAX_SPEED[axis] * period_multiplier); + phase_shift.push_back((double)std::rand() / RAND_MAX * period[axis]); + double center = (MAX_RANGES[axis] + MIN_RANGES[axis]) / 2; + std::cout << center << std::endl; + programTrackCoordinates[axis] = center + amplitude * sin(phase_shift[axis] * 2 * M_PI / period[axis]); + } + + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(PFPStatus.checkOutput()); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + double next_expected_time = start_time; + + while(!terminate) + { + next_expected_time += TIMEGAP; + double time_delta = next_expected_time - start_time; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + for(size_t axis = 0; axis < 3; axis++) + { + double center = (MAX_RANGES[axis] + MIN_RANGES[axis]) / 2; + double amplitude = (MAX_RANGES[axis] - MIN_RANGES[axis]) / 2; + programTrackCoordinates[axis] = center + amplitude * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); + } + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(PFPProgramTrackTest, SeparateMovementTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 0; + int sign = 1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::vector programTrackCoordinates = startingCoordinates; + + bool immediate = true; + + while(!terminate) + { + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(PFPStatus.checkOutput()); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == (ADVANCE_TIMEGAP / TIMEGAP) || immediate) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + sign *= -1; + idle = true; + } + else if(programTrackCoordinates[axis_to_move] == 0.0 && sign == 1) + { + axis_to_move == 2 ? axis_to_move = 0 : axis_to_move++; + idle = true; + } + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + } + + //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + + //immediate = immediate ? false : true; + } + + programTrackFile.close(); + statusThread.join(); +} + +TEST_F(PFPProgramTrackTest, RapidTrajectoryTest) +{ + SRTMinorServoSocket& socket = SRTMinorServoTestingSocket::getInstance(); + SRTMinorServoAnswerMap PFPStatus; + + ofstream programTrackFile; + programTrackFile.open(directory + "/trajectory.txt", ios::out); + + unsigned int axis_to_move = 1; + int sign = -1; + unsigned int idle_count = 0; + bool idle = false; + + std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + + while(!terminate) + { + std::vector programTrackCoordinates = startingCoordinates; + programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; + + double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + long unsigned int trajectory_id = int(start_time); + double next_expected_time = start_time; + unsigned int point_id = 0; + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + EXPECT_TRUE(PFPStatus.checkOutput()); + programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + EXPECT_TRUE(PFPStatus.checkOutput()); + EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); + + while(!terminate) + { + next_expected_time += TIMEGAP; + + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; + + if(idle) + { + idle_count++; + if(idle_count == ADVANCE_TIMEGAP / TIMEGAP) + { + idle_count = 0; + idle = false; + break; + } + } + else + { + if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + idle = true; + } + + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + } + + //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + } + } + + programTrackFile.close(); + statusThread.join(); +} diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/.gitignore b/SRT/Servers/SRTMinorServo/test/TESTS/.gitignore new file mode 100644 index 000000000..f67fe34da --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/.gitignore @@ -0,0 +1,3 @@ +PFP/ +SRP/ +DEROTATOR/ diff --git a/SRT/Servers/SRTMinorServo/test/TESTS/plotPFPTrajectory.py b/SRT/Servers/SRTMinorServo/test/TESTS/plotPFPTrajectory.py new file mode 100755 index 000000000..86c44abb2 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/test/TESTS/plotPFPTrajectory.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python +import os +import numpy as np +import matplotlib.pyplot as plt +from argparse import ArgumentParser + +parser = ArgumentParser() +parser.add_argument( + 'directory', + help="Directory containing the 'status.txt' and 'trajectory.txt' files" +) + +arguments = parser.parse_args() + +status_time = [] +status_tx = [] +status_tz = [] +status_rt = [] +starttime = None + +with open(os.path.join(arguments.directory, 'status.txt'), 'r') as statusfile: + for line in statusfile: + args = line.strip().split() + if not starttime: + starttime = float(args[0]) + status_time.append(float(args[0]) - starttime) + status_tx.append(float(args[1])) + status_tz.append(float(args[2])) + status_rt.append(float(args[3])) + +trajectory_time = [] +trajectory_tx = [] +trajectory_tz = [] +trajectory_rt = [] + +with open(os.path.join(arguments.directory, 'trajectory.txt'), 'r') as trajectoryfile: + for line in trajectoryfile: + args = line.strip().split() + trajectory_time.append(float(args[0]) - starttime) + trajectory_tx.append(float(args[1])) + trajectory_tz.append(float(args[2])) + trajectory_rt.append(float(args[3])) + +fig, axs = plt.subplots(3, sharex=True) +fig.canvas.manager.set_window_title('PFP Positions') +fig.suptitle('PFP Positions') + +axs[0].plot(status_time, status_tx, 'r') +axs[0].plot(trajectory_time, trajectory_tx, 'b') +axs[0].set_ylabel('tx (mm)') + +axs[1].plot(status_time, status_tz, 'r') +axs[1].plot(trajectory_time, trajectory_tz, 'b') +axs[1].set_ylabel('tz (mm)') + +axs[2].plot(status_time, status_rt, 'r') +axs[2].plot(trajectory_time, trajectory_rt, 'b') +axs[2].set_ylabel('rt (deg)') +axs[2].set_xlabel('time (s)') + +plt.get_current_fig_manager().window.attributes('-zoomed', True) +try: + plt.show() +except KeyboardInterrupt: + pass -- GitLab From e1fe250df38bcd45bda3ad56737ce9bb0aa3785a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 3 May 2024 12:00:23 +0000 Subject: [PATCH 103/150] Updated PFP tests --- .../test/PFPProgramTrackTest.cpp | 166 +++++++++++------- 1 file changed, 99 insertions(+), 67 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp index c96faa26b..c0d12c2bf 100644 --- a/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp @@ -18,11 +18,12 @@ #define ADDRESS std::string("192.168.200.13") #define PORT 4758 #endif -#define NOISE_THRESHOLD 1 #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 2.6 -#define MIN_RANGES std::vector{ -1490, -200, -1 } -#define MAX_RANGES std::vector{ 1490, 50, 76 } +//#define MIN_RANGES std::vector{ -1490, -200, -1 } +//#define MAX_RANGES std::vector{ 1490, 50, 76 } +#define MIN_RANGES std::vector{ -1000, -100, 0 } +#define MAX_RANGES std::vector{ 1000, 25, 20 } #define MAX_SPEED std::vector{ 25, 5, 0.42 } #define STATUS_PERIOD 0.01 @@ -155,29 +156,82 @@ protected: return currentElongations; } - static bool moveAxis(std::vector &coordinates, int axis_to_move, int sign) + bool moveAxis(std::vector& coordinates, unsigned int& axis_to_move, int& sign) { - double starting_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); + bool last_segment = false; + bool go_idle = false; + double starting_position = coordinates[axis_to_move]; + + if(startingCoordinates[axis_to_move] == MIN_RANGES[axis_to_move] || startingCoordinates[axis_to_move] == MAX_RANGES[axis_to_move]) + { + if(starting_position == startingCoordinates[axis_to_move]) + { + // We just started the trajectory for the current axis, correct the sign eventually + if(startingCoordinates[axis_to_move] == MIN_RANGES[axis_to_move]) + { + // Only above + sign = 1; + } + else + { + // Only below + sign = -1; + } + } + else + { + // We are executing the trajectory, check if we are already headed towards the starting position + if((startingCoordinates[axis_to_move] == MIN_RANGES[axis_to_move] && sign < 0) || (startingCoordinates[axis_to_move] == MAX_RANGES[axis_to_move] && sign > 0)) + { + last_segment = true; + } + } + } + else if(starting_position < startingCoordinates[axis_to_move] && sign > 0) + { + last_segment = true; + } + double offset_to_add = MAX_SPEED[axis_to_move] / 5; - coordinates[axis_to_move] += sign * offset_to_add; - double ending_sign = coordinates[axis_to_move] > 0 ? 1 : (coordinates[axis_to_move] < 0 ? -1 : 0); - if(starting_sign == -1 && ending_sign >= 0) + double ending_position = starting_position + sign * offset_to_add; + + if(ending_position >= MAX_RANGES[axis_to_move]) { - // Zero crossed - coordinates[axis_to_move] = 0.0; - return false; + // Top reached, go down + ending_position = MAX_RANGES[axis_to_move]; + go_idle = true; } - if(coordinates[axis_to_move] >= MAX_RANGES[axis_to_move]) + else if(ending_position <= MIN_RANGES[axis_to_move]) { - coordinates[axis_to_move] = MAX_RANGES[axis_to_move]; - return true; + // Bottom reached, go up + ending_position = MIN_RANGES[axis_to_move]; + go_idle = true; } - else if(coordinates[axis_to_move] <= MIN_RANGES[axis_to_move]) + + // Check if we finished the current axis' trajectory + if(sign == 1 && starting_position < startingCoordinates[axis_to_move] && startingCoordinates[axis_to_move] <= ending_position) + { + // Crossed zero while going up, round to zero and change axis + ending_position = startingCoordinates[axis_to_move]; + go_idle = true; + } + + coordinates[axis_to_move] = ending_position; + + if(go_idle) { - coordinates[axis_to_move] = MIN_RANGES[axis_to_move]; - return true; + if(last_segment) + { + sign = 1; + axis_to_move == 2 ? axis_to_move = 0 : axis_to_move++; + } + else + { + sign *= -1; + } } - return false; + + return go_idle; } void SetUp() override @@ -303,41 +357,29 @@ TEST_F(PFPProgramTrackTest, ContinuousMovementTest) while(!terminate) { - while(!terminate) - { - next_expected_time += TIMEGAP; - - std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); - point_id++; - - if(idle) - { - idle_count++; - if(idle_count == 5) - { - idle_count = 0; - idle = false; - } - } - else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) - { - sign *= -1; - idle = true; - } + next_expected_time += TIMEGAP; - PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); - EXPECT_TRUE(PFPStatus.checkOutput()); - //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); + point_id++; - if(round(programTrackCoordinates[axis_to_move] * 100) == 0 && sign == 1) + if(idle) + { + idle_count++; + if(idle_count == 5) { - programTrackCoordinates[axis_to_move] = 0.0; - break; + idle_count = 0; + idle = false; } } + else if(moveAxis(programTrackCoordinates, axis_to_move, sign)) + { + idle = true; + } - axis_to_move == 2 ? axis_to_move = 0 : axis_to_move++; + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + EXPECT_TRUE(PFPStatus.checkOutput()); + //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; + programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; } programTrackFile.close(); @@ -383,10 +425,13 @@ TEST_F(PFPProgramTrackTest, AllAxesMovementTest) { if(!idle[axis]) { - if(moveAxis(programTrackCoordinates, axis, sign[axis])) + unsigned int axis_to_move = axis; + if(moveAxis(programTrackCoordinates, axis_to_move, sign[axis])) { - sign[axis] *= -1; - idle[axis] = true; + if(programTrackCoordinates[axis] != startingCoordinates[axis] || programTrackCoordinates[axis] == MIN_RANGES[axis] || programTrackCoordinates[axis] == MAX_RANGES[axis]) + { + idle[axis] = true; + } } } else @@ -404,14 +449,6 @@ TEST_F(PFPProgramTrackTest, AllAxesMovementTest) EXPECT_TRUE(PFPStatus.checkOutput()); //std::cout << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; programTrackFile << PFPProgramTrackTest::serializeCoordinates(next_expected_time, programTrackCoordinates) << std::endl; - - for(size_t axis = 0; axis < 3; axis++) - { - if(round(programTrackCoordinates[axis] * 100) == 0 && sign[axis] == 1) - { - programTrackCoordinates[axis] = 0.0; - } - } } programTrackFile.close(); @@ -496,7 +533,7 @@ TEST_F(PFPProgramTrackTest, SeparateMovementTest) std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; std::vector programTrackCoordinates = startingCoordinates; - bool immediate = true; + bool immediate = false; while(!terminate) { @@ -536,12 +573,6 @@ TEST_F(PFPProgramTrackTest, SeparateMovementTest) { if(moveAxis(programTrackCoordinates, axis_to_move, sign)) { - sign *= -1; - idle = true; - } - else if(programTrackCoordinates[axis_to_move] == 0.0 && sign == 1) - { - axis_to_move == 2 ? axis_to_move = 0 : axis_to_move++; idle = true; } @@ -568,8 +599,6 @@ TEST_F(PFPProgramTrackTest, RapidTrajectoryTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - unsigned int axis_to_move = 1; - int sign = -1; unsigned int idle_count = 0; bool idle = false; @@ -577,6 +606,9 @@ TEST_F(PFPProgramTrackTest, RapidTrajectoryTest) while(!terminate) { + unsigned int axis_to_move = 1; + int sign = -1; + std::vector programTrackCoordinates = startingCoordinates; programTrackCoordinates[axis_to_move] = MAX_RANGES[axis_to_move]; -- GitLab From 58b656b58a3fcef00bad2bf25fe5a5fdbeca0188 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 9 May 2024 18:20:46 +0200 Subject: [PATCH 104/150] Corrected SRT Minor Servos SETUP strings --- .../include/SRTMinorServoContainers.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index dfea1df66..4c32b5195 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -100,14 +100,14 @@ namespace MinorServo using LDOConfigurationNameTableType = boost::bimap; const LDOConfigurationNameTableType LDOConfigurationNameTable = boost::assign::list_of (CONFIGURATION_PRIMARY, "Primario") - (CONFIGURATION_GREGORIAN1, "Gregoriano 1") - (CONFIGURATION_GREGORIAN2, "Gregoriano 2") - (CONFIGURATION_GREGORIAN3, "Gregoriano 3") - (CONFIGURATION_GREGORIAN4, "Gregoriano 4") - (CONFIGURATION_GREGORIAN5, "Gregoriano 5") - (CONFIGURATION_GREGORIAN6, "Gregoriano 6") - (CONFIGURATION_GREGORIAN7, "Gregoriano 7") - (CONFIGURATION_GREGORIAN8, "Gregoriano 8") + (CONFIGURATION_GREGORIAN1, "Gregoriano1") + (CONFIGURATION_GREGORIAN2, "Gregoriano2") + (CONFIGURATION_GREGORIAN3, "Gregoriano3") + (CONFIGURATION_GREGORIAN4, "Gregoriano4") + (CONFIGURATION_GREGORIAN5, "Gregoriano5") + (CONFIGURATION_GREGORIAN6, "Gregoriano6") + (CONFIGURATION_GREGORIAN7, "Gregoriano7") + (CONFIGURATION_GREGORIAN8, "Gregoriano8") (CONFIGURATION_BWG1, "BWG1") (CONFIGURATION_BWG2, "BWG2") (CONFIGURATION_BWG3, "BWG3") -- GitLab From 3ada6b6451eea4d1d77e73deb37d60d0723a456e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 May 2024 18:47:59 +0200 Subject: [PATCH 105/150] Reduced the ranges of SRP. In today's tests we ended up activating a pre limit when 125 was commanded on one of the axes. I limited the range a bit. --- SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 4 ++-- SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index d48d39ad4..6dbe537fe 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -11,8 +11,8 @@ virtual_axes="6" max_speed="4, 4, 4, 0.38, 0.38, 0.38" acceleration="8, 8, 8, 0.76, 0.76, 0.76" - min_range="-125, -125, -125, -0.25, -0.25, -0.25" - max_range="125, 125, 125, 0.25, 0.25, 0.25" + min_range="-120, -120, -120, -0.25, -0.25, -0.25" + max_range="120, 120, 120, 0.25, 0.25, 0.25" tracking_delta="1, 1, 1, 1, 1, 1"> diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index d48d39ad4..6dbe537fe 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -11,8 +11,8 @@ virtual_axes="6" max_speed="4, 4, 4, 0.38, 0.38, 0.38" acceleration="8, 8, 8, 0.76, 0.76, 0.76" - min_range="-125, -125, -125, -0.25, -0.25, -0.25" - max_range="125, 125, 125, 0.25, 0.25, 0.25" + min_range="-120, -120, -120, -0.25, -0.25, -0.25" + max_range="120, 120, 120, 0.25, 0.25, 0.25" tracking_delta="1, 1, 1, 1, 1, 1"> -- GitLab From dc36846297fa4d8bbd26cc4fc9ee2ac62c2d7a03 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 15 May 2024 09:09:29 +0000 Subject: [PATCH 106/150] Updated Minor Servos tests --- SRT/Servers/SRTMinorServo/test/Makefile | 2 +- .../test/PFPProgramTrackTest.cpp | 57 ++++++++++++------- .../test/SRPProgramTrackTest.cpp | 6 +- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/test/Makefile b/SRT/Servers/SRTMinorServo/test/Makefile index e58a7b680..967e4ef9f 100644 --- a/SRT/Servers/SRTMinorServo/test/Makefile +++ b/SRT/Servers/SRTMinorServo/test/Makefile @@ -22,7 +22,7 @@ SRPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServ PFPProgramTrackTest_OBJECTS = PFPProgramTrackTest PFPProgramTrackTest_CFLAGS = -std=c++17 -fconcepts -PFPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors boost_filesystem +PFPProgramTrackTest_LIBS = $(GTEST_LIBS) SRTMinorServoSocketLibrary SRTMinorServoCommandLibrary IRALibrary ComponentErrors MinorServoErrors boost_filesystem DerotatorProgramTrackTest_OBJECTS = DerotatorProgramTrackTest DerotatorProgramTrackTest_CFLAGS = -std=c++17 diff --git a/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp index c0d12c2bf..de84214f7 100644 --- a/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/PFPProgramTrackTest.cpp @@ -4,13 +4,15 @@ #include #include #include +#include +#include "SRTMinorServoUtils.h" #include "SRTMinorServoTestingSocket.h" #include "SRTMinorServoCommandLibrary.h" // This address and port are the ones set in the simulator // In order for the test to properly be executed, the simulator should be launched with the following command: // discos-simulator -s minor_servo start & -#define SIMULATION +//#define SIMULATION #ifdef SIMULATION #define ADDRESS std::string("127.0.0.1") #define PORT 12800 @@ -22,8 +24,8 @@ #define ADVANCE_TIMEGAP 2.6 //#define MIN_RANGES std::vector{ -1490, -200, -1 } //#define MAX_RANGES std::vector{ 1490, 50, 76 } -#define MIN_RANGES std::vector{ -1000, -100, 0 } -#define MAX_RANGES std::vector{ 1000, 25, 20 } +#define MIN_RANGES std::vector{ -1000, -150, 0 } +#define MAX_RANGES std::vector{ 1000, 40, 70 } #define MAX_SPEED std::vector{ 25, 5, 0.42 } #define STATUS_PERIOD 0.01 @@ -52,9 +54,20 @@ protected: double tn = CIRATools::getUNIXEpoch(); - while(!terminate) + while(!terminate.load()) { - PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + try + { + PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::status("PFP")); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + //MinorServoErrors::MinorServoErrorsExImpl impl(ex); + std::cout << getErrorFromEx(ex) << std::endl; + terminate.store(true); + break; + } + std::string status = serializeStatus(PFPStatus); statusFile << status << std::endl; @@ -72,7 +85,7 @@ protected: static void sigintHandler(int sig_num) { std::cout << std::endl << "Terminating..." << std::endl; - terminate = true; + terminate.store(true); } static std::string serializeStatus(SRTMinorServoAnswerMap map) @@ -288,7 +301,7 @@ protected: EXPECT_TRUE(PFPStatus.checkOutput()); std::cout << serializeStatus(PFPStatus) << std::endl; - if(terminate) + if(terminate.load()) FAIL() << "Aborting test..." << std::endl; } while(PFPStatus.get("PFP_OPERATIVE_MODE") != 40); @@ -322,7 +335,7 @@ protected: void TearDown() override { SRTMinorServoTestingSocket::destroyInstance(); - terminate = false; + terminate.store(false); } }; @@ -355,7 +368,7 @@ TEST_F(PFPProgramTrackTest, ContinuousMovementTest) unsigned int idle_count = 0; bool idle = false; - while(!terminate) + while(!terminate.load()) { next_expected_time += TIMEGAP; @@ -414,7 +427,7 @@ TEST_F(PFPProgramTrackTest, AllAxesMovementTest) std::vector idle_count = { 0, 0, 0 }; std::vector idle = { false, false, false }; - while(!terminate) + while(!terminate.load()) { next_expected_time += TIMEGAP; @@ -493,7 +506,7 @@ TEST_F(PFPProgramTrackTest, SineWaveMovementTest) double next_expected_time = start_time; - while(!terminate) + while(!terminate.load()) { next_expected_time += TIMEGAP; double time_delta = next_expected_time - start_time; @@ -525,24 +538,27 @@ TEST_F(PFPProgramTrackTest, SeparateMovementTest) ofstream programTrackFile; programTrackFile.open(directory + "/trajectory.txt", ios::out); - unsigned int axis_to_move = 0; + unsigned int axis_to_move = 1; int sign = 1; unsigned int idle_count = 0; bool idle = false; - std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; + std::cout << "PRESET position reached" << std::endl; std::vector programTrackCoordinates = startingCoordinates; bool immediate = false; - while(!terminate) + while(!terminate.load()) { double start_time = CIRATools::getUNIXEpoch() + ADVANCE_TIMEGAP; + std::cout << "starting PROGRAMTRACK with timestamp " << std::to_string(start_time) << std::endl; long unsigned int trajectory_id = int(start_time); double next_expected_time = start_time; unsigned int point_id = 0; - PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time)); + std::string command = SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates, start_time); + //std::cout << command; + PFPStatus = socket.sendCommand(command); EXPECT_TRUE(PFPStatus.checkOutput()); programTrackFile << PFPProgramTrackTest::serializeCoordinates(start_time, programTrackCoordinates) << std::endl; @@ -552,7 +568,7 @@ TEST_F(PFPProgramTrackTest, SeparateMovementTest) EXPECT_TRUE(PFPStatus.checkOutput()); EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); - while(!terminate) + while(!terminate.load()) { next_expected_time += TIMEGAP; @@ -576,7 +592,10 @@ TEST_F(PFPProgramTrackTest, SeparateMovementTest) idle = true; } - PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); + command = SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates); + PFPStatus = socket.sendCommand(command); + //std::cout << command; + //PFPStatus = socket.sendCommand(SRTMinorServoCommandLibrary::programTrack("PFP", trajectory_id, point_id, programTrackCoordinates)); EXPECT_TRUE(PFPStatus.checkOutput()); } @@ -604,7 +623,7 @@ TEST_F(PFPProgramTrackTest, RapidTrajectoryTest) std::cout << "PRESET position reached, starting PROGRAMTRACK" << std::endl; - while(!terminate) + while(!terminate.load()) { unsigned int axis_to_move = 1; int sign = -1; @@ -627,7 +646,7 @@ TEST_F(PFPProgramTrackTest, RapidTrajectoryTest) EXPECT_TRUE(PFPStatus.checkOutput()); EXPECT_EQ(PFPStatus.get("PFP_OPERATIVE_MODE"), 50); - while(!terminate) + while(!terminate.load()) { next_expected_time += TIMEGAP; diff --git a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp index e1033748e..9d2b46c44 100644 --- a/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp +++ b/SRT/Servers/SRTMinorServo/test/SRPProgramTrackTest.cpp @@ -22,7 +22,7 @@ #define TIMEGAP 0.2 #define ADVANCE_TIMEGAP 2.6 #define MAX_RANGES std::vector{ 40, 40, 40, 0.2, 0.2, 0.2 } -#define MAX_RANGES std::vector{ 50, 110, 50, 0.25, 0.25, 0.25 } +#define MAX_RANGES std::vector{ 50, 120, 120, 0.25, 0.25, 0.25 } #define MAX_SPEED std::vector{ 4, 4, 4, 0.04, 0.04, 0.04 } #define STATUS_PERIOD 0.01 @@ -432,7 +432,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) std::vector phase_shift; std::vector period; - for(size_t axis = 0; axis < 6; axis++) + for(size_t axis = 0; axis < 3; axis++) { double period_multiplier = axis < 3 ? 4 : 4; period.push_back(MAX_RANGES[axis] / MAX_SPEED[axis] * period_multiplier); @@ -465,7 +465,7 @@ TEST_F(SRPProgramTrackTest, SineWaveMovementTest) std::this_thread::sleep_for(std::chrono::microseconds((int)round(1000000 * std::max(0.0, next_expected_time - ADVANCE_TIMEGAP - CIRATools::getUNIXEpoch())))); point_id++; - for(size_t axis = 0; axis < 6; axis++) + for(size_t axis = 0; axis < 3; axis++) { programTrackCoordinates[axis] = MAX_RANGES[axis] * sin((time_delta + phase_shift[axis]) * 2 * M_PI / period[axis]); } -- GitLab From 3eacc92681c4119693955f723ede933eb72b0b43 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 16 May 2024 14:35:21 +0200 Subject: [PATCH 107/150] Fix #864, fixed small bug in SRTMount/CommonData.cpp --- SRT/Servers/SRTMount/src/CommonData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SRT/Servers/SRTMount/src/CommonData.cpp b/SRT/Servers/SRTMount/src/CommonData.cpp index 73d181389..0035d6db9 100644 --- a/SRT/Servers/SRTMount/src/CommonData.cpp +++ b/SRT/Servers/SRTMount/src/CommonData.cpp @@ -356,7 +356,7 @@ void CCommonData::reBind() setElevationStatusWord(BRAKE_ERROR,m_elevationStatus->errors().brakeError()); setElevationStatusWord(SERVO_ERROR,m_elevationStatus->errors().servoError()); setElevationStatusWord(AXIS_READY,m_elevationStatus->axisReady()); - setElevationStatusWord(ACTIVE,m_azimuthStatus->axisState()==CACUProtocol::STATE_ACTIVE); + setElevationStatusWord(ACTIVE,m_elevationStatus->axisState()==CACUProtocol::STATE_ACTIVE); setElevationStatusWord(LOW_POWER_MODE,m_elevationStatus->lowPowerMode()); setElevationStatusWord(STOWED,m_elevationStatus->stowed()); //bind motors status word -- GitLab From ebeaefc4cbf6b16d29b18ab20713f0bfcd6e265f Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 16 May 2024 15:45:50 +0200 Subject: [PATCH 108/150] Fix #868, replaced `.getchildren()` with `list()` --- Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py | 3 +-- .../Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py | 4 ++-- Common/Tests/test/cdb/test_procedures.py | 2 +- .../src/IFDistributor14/SRTIFDistributor14Impl.py | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py b/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py index 099156d30..389f52ab9 100644 --- a/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py +++ b/Common/Servers/PyCalmux/src/Calmux/PyCalmuxImpl.py @@ -197,8 +197,7 @@ class PyCalmuxImpl(CalMux, cc, services, lcycle): raise exc try: - children = ElementTree.fromstring(dao).getchildren() - for child in children: + for child in list(ElementTree.fromstring(dao)): backend, channel, polarity = [c.text.strip() for c in child] backend = backend.lower() value = (int(channel), int(polarity)) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py index e0c3ec63b..e31369e9e 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py @@ -210,7 +210,7 @@ class CDBConf(object): try: dal = ACSCorba.cdb() dao = dal.get_DAO(path) - children = ElementTree.fromstring(dao).getchildren() + children = list(ElementTree.fromstring(dao)) except cdbErrType.CDBRecordDoesNotExistEx: raeson = "CDB record %s does not exists" %path logger.logError(raeson) @@ -218,7 +218,7 @@ class CDBConf(object): exc.setReason(raeson) raise exc except Exception as ex: - children = () + children = [] setattr(self, dictName, {}) d = getattr(self, dictName) diff --git a/Common/Tests/test/cdb/test_procedures.py b/Common/Tests/test/cdb/test_procedures.py index fa6c6b3fd..690667552 100644 --- a/Common/Tests/test/cdb/test_procedures.py +++ b/Common/Tests/test/cdb/test_procedures.py @@ -7,7 +7,7 @@ class TestProcedures(unittest.TestCase): def setUp(self): dal = ACSCorba.cdb() dao = dal.get_DAO('alma/Procedures/StationProcedures') - self.procedures = ElementTree.fromstring(dao).getchildren() + self.procedures = list(ElementTree.fromstring(dao)) def test_reset_not_allowed_in_setup(self): """Vefify the setup does not execute the antennaReset command""" diff --git a/SRT/Servers/SRTPyIFDistributor14/src/IFDistributor14/SRTIFDistributor14Impl.py b/SRT/Servers/SRTPyIFDistributor14/src/IFDistributor14/SRTIFDistributor14Impl.py index c292225d7..f5ffae436 100644 --- a/SRT/Servers/SRTPyIFDistributor14/src/IFDistributor14/SRTIFDistributor14Impl.py +++ b/SRT/Servers/SRTPyIFDistributor14/src/IFDistributor14/SRTIFDistributor14Impl.py @@ -210,8 +210,7 @@ class SRTIFDistributor14Impl(SRTIFDistributor14, cc, services, lcycle): raise exc try: - children = ElementTree.fromstring(dao).getchildren() - for child in children: + for child in list(ElementTree.fromstring(dao)) backend, channel, address = [c.text.strip() for c in child] value = {int(channel): int(address)} if backend in self.mapping: -- GitLab From d8d4b64bb7a848c42bc0935c3cc20a926490cf84 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 17 May 2024 13:32:13 +0000 Subject: [PATCH 109/150] Fix #866, focus offsets are now applied when not tracking the elev. Also, fixed an issue with the Python customlogger --- .../IRALibrary/src/IRAPy/customlogging.py | 1 + SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 1 + SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 1 + SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + .../CDB/alma/MINORSERVO/GFR/GFR.xml | 1 + .../CDB/alma/MINORSERVO/M3R/M3R.xml | 1 + .../CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + .../CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + .../idl/SRTMinorServo.idl | 6 ++++ .../config/CDB/schemas/SRTMinorServo.xsd | 1 + .../SRTMinorServo/include/SRTMinorServoImpl.h | 19 +++++++++- .../src/SRTBaseMinorServoImpl.cpp | 28 ++++++++++++++- .../src/SRTMinorServoBossCore.cpp | 36 +++++++++++++++++-- 14 files changed, 95 insertions(+), 4 deletions(-) diff --git a/Common/Libraries/IRALibrary/src/IRAPy/customlogging.py b/Common/Libraries/IRALibrary/src/IRAPy/customlogging.py index 3cd47d96d..8bd0b8e82 100644 --- a/Common/Libraries/IRALibrary/src/IRAPy/customlogging.py +++ b/Common/Libraries/IRALibrary/src/IRAPy/customlogging.py @@ -2,6 +2,7 @@ This module is intended to extend the ACS Logging module in our python code. """ import logging +logging._srcfile = None import sys from Acspy.Common import Log from ACSLog import ACS_LOG_CRITICAL diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index 75f01dc18..656043cef 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -27,6 +27,7 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index 83ebde14b..abf4e296e 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -27,6 +27,7 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 6fdbf0722..3d22653f9 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -28,6 +28,7 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index 6dbe537fe..693ae9163 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -28,6 +28,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml index 75f01dc18..656043cef 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -27,6 +27,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml index 83ebde14b..abf4e296e 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -27,6 +27,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml index 6fdbf0722..3d22653f9 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -28,6 +28,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index 6dbe537fe..693ae9163 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -28,6 +28,7 @@ + diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 5c3eb142a..f6680cf78 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -82,6 +82,12 @@ module MinorServo */ readonly attribute ACS::ROdoubleSeq virtual_system_offsets; + /** + * This property returns the latest virtual positions commanded with a preset command. + * Offsets are not taken into account since they are added by the LDO system. + */ + readonly attribute ACS::ROdoubleSeq commanded_virtual_positions; + /** * This property indicates whether the servo is in use in the current configuration */ diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index d3f3d966f..c6e235928 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -54,6 +54,7 @@ + diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index 2a43122df..a286b5395 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -100,7 +100,7 @@ public: * if the resulting position summing the offsets would go outside the accepted range of the servo, * if there has been a communication error or if the command was not accepted. */ - void preset(const ACS::doubleSeq& coordinates); + void preset(const ACS::doubleSeq& virtual_coords); /** * Asks the servo system to load the commanded configuration table. @@ -270,6 +270,12 @@ public: */ virtual ACS::ROdoubleSeq_ptr virtual_system_offsets(); + /** + * Returns a reference to the commanded_virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property commanded_virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr commanded_virtual_positions(); + /** * Returns a reference to the in_use property implementation of the IDL interface. * @return pointer to the read-only boolean property in_use. @@ -342,6 +348,11 @@ private: * Units of the virtual axes of the servo system. */ const std::vector m_virtual_axes_units; + + /** + * Latest commanded virtual positions. It only takes into account the preset command. + */ + std::vector m_commanded_virtual_positions; protected: /** * Dictionary containing the last status retrieved form the servo system. @@ -468,6 +479,11 @@ private: */ baci::SmartPropertyPointer m_virtual_system_offsets_ptr; + /** + * Pointer to the commanded_virtual_positions property. + */ + baci::SmartPropertyPointer m_commanded_virtual_positions_ptr; + /** * Pointer to the in_use property. */ @@ -538,6 +554,7 @@ protected: virtual ACS::ROdoubleSeq_ptr virtual_offsets() { return SRTBaseMinorServoImpl::virtual_offsets(); }\ virtual ACS::ROdoubleSeq_ptr virtual_user_offsets() { return SRTBaseMinorServoImpl::virtual_user_offsets(); }\ virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }\ + virtual ACS::ROdoubleSeq_ptr commanded_virtual_positions() { return SRTBaseMinorServoImpl::commanded_virtual_positions(); }\ virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }\ virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); } diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index df2e50b72..dea56af00 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -41,6 +41,7 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_virtual_offsets_ptr(this), m_virtual_user_offsets_ptr(this), m_virtual_system_offsets_ptr(this), + m_commanded_virtual_positions_ptr(this), m_in_use_ptr(this), m_current_setup_ptr(this), m_current_lookup_table(), @@ -85,6 +86,8 @@ void SRTBaseMinorServoImpl::initialize() new MSGenericDevIO>(m_user_offsets), true); m_virtual_system_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_system_offsets").c_str(), getComponent(), new MSGenericDevIO>(m_system_offsets), true); + m_commanded_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":commanded_virtual_positions").c_str(), getComponent(), + new MSGenericDevIO>(m_commanded_virtual_positions), true); m_in_use_ptr = new ROEnumImpl((m_component_name + ":in_use").c_str(), getComponent(), new MSGenericDevIO>(m_in_use), true); m_current_setup_ptr = new baci::ROstring((m_component_name + ":current_setup").c_str(), getComponent(), @@ -190,12 +193,28 @@ void SRTBaseMinorServoImpl::stop() } } -void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) +void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coords) { AUTO_TRACE(m_servo_name + "::preset()"); checkLineStatus(); + ACS::doubleSeq virtual_coordinates; + virtual_coordinates.length(virtual_coords.length()); + std::copy(virtual_coords.begin(), virtual_coords.end(), virtual_coordinates.begin()); + + if(virtual_coordinates.length() == 0) + { + // It means we want to command the latest coordinates again, to apply the offset in the LDO servo system + // We execute the copy only if we already commanded a set of coordinates, otherwise we let the flow go to the next + // if which will raise regardless + if(!m_commanded_virtual_positions.empty()) + { + virtual_coordinates.length(m_commanded_virtual_positions.size()); + std::copy(m_commanded_virtual_positions.begin(), m_commanded_virtual_positions.end(), virtual_coordinates.begin()); + } + } + if(virtual_coordinates.length() != m_virtual_axes) { _EXCPT(MinorServoErrors::PositioningErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); @@ -226,6 +245,12 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coordinates) ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } + + if(m_commanded_virtual_positions.empty()) + { + m_commanded_virtual_positions.resize(m_virtual_axes); + } + std::copy(coordinates.begin(), coordinates.end(), m_commanded_virtual_positions.begin()); } bool SRTBaseMinorServoImpl::setup(const char* configuration_name) @@ -807,5 +832,6 @@ GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_positi GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_offsets_ptr, virtual_offsets); GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_user_offsets_ptr, virtual_user_offsets); GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_system_offsets_ptr, virtual_system_offsets); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_commanded_virtual_positions_ptr, commanded_virtual_positions); GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_in_use_ptr, in_use); GET_PROPERTY_REFERENCE(ACS::ROstring, SRTBaseMinorServoImpl, m_current_setup_ptr, current_setup); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 7c4052822..c529b0b0c 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -135,7 +135,6 @@ bool SRTMinorServoBossCore::status() { if(std::all_of(m_current_tracking_servos.begin(), m_current_tracking_servos.end(), [](const std::pair& servo) -> bool { - ACSErr::Completion_var comp; return servo.second->isTracking(); })) { @@ -194,6 +193,7 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) { cmd_configuration = DiscosConfigurationNameTable.at(commanded_setup); commanded_configuration = cmd_configuration.first; + if(m_as_configuration.load() == Management::MNG_TRUE && cmd_configuration.second) { commanded_setup += "_ASACTIVE"; @@ -586,7 +586,12 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) { for(const auto& [servo_name, servo] : m_current_servos) { - servo->clearUserOffsets(); + servo->clearUserOffsets(); + if(motion_status == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } return; } @@ -602,6 +607,11 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) { auto servo = m_current_servos.at(servo_name); servo->clearUserOffsets(); + if(motion_status == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } catch(std::out_of_range& oor) { @@ -658,6 +668,12 @@ void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double of ACS_LOG(LM_FULL_INFO, "setServoOffset", (LM_NOTICE, ("SETTING '" + servo_name + "' '" + axis_name + "' OFFSET TO " + std::to_string(offset)).c_str())); } servo->setUserOffset(axis_name.c_str(), offset); + + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } catch(std::out_of_range& oor) { @@ -724,6 +740,11 @@ void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) for(const auto& [servo_name, servo] : m_current_servos) { servo->clearSystemOffsets(); + if(motion_status == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } return; } @@ -739,6 +760,11 @@ void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) { auto servo = m_current_servos.at(servo_name); servo->clearSystemOffsets(); + if(motion_status == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } catch(std::out_of_range& oor) { @@ -791,6 +817,12 @@ void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double { auto servo = m_current_servos.at(servo_name); servo->setSystemOffset(axis_name.c_str(), offset); + + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + { + // We are not tracking but we need to update the servo position to load the offsets + servo->preset(ACS::doubleSeq()); + } } catch(std::out_of_range& oor) { -- GitLab From 4b6050ebba250b94ff2e7ea73a8d282953f9c915 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sat, 1 Jun 2024 10:45:43 +0200 Subject: [PATCH 110/150] Updated minor servos (#871) * Fix #865, fix #869, updated SRTMinorServo component The component now handles correctly a SETUP command. The component is also capable of commanding the gregorian air blade with the 'setGregorianAirBladeStatus' command. A few bugs were fixed here and there. This branch MUST be tested with the real hardware before merging it onto the centos_7_compatibility branch. * Fixed small bug * Various upgrades * Updated _airBlade.py and _servoReset.py * Updated _servoReset * Updated telescopePark procedure commands order With this order, the gregorian cover is started parking when the antenna is already at 89.8 degrees of elevation. This will avoid getting an error on a gregorian cover axis pre limit. Unfortunately, this will not fix a change in configuration from primary to gregorian or BWG and vice versa. That will need to be addressed by opening a ticket. * Upgraded _servoReset behahviour --- .../src/MinorServoBossTextClient.cpp | 2 +- .../SystemTerminal/src/nuraghe_commands.py | 41 ++++- Common/Servers/Scheduler/src/Core.cpp | 3 + .../GFR/LookupTables/LookupTables.xml | 10 +- .../DataBlock/MinorServo/Tabella Setup.csv | 14 ++ SRT/CDB/alma/MINORSERVO/Boss/Boss.xml | 4 +- SRT/CDB/alma/MINORSERVO/GFR/GFR.xml | 1 + SRT/CDB/alma/MINORSERVO/M3R/M3R.xml | 1 + SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + SRT/CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + SRT/CDB/alma/MINORSERVO/VBrain/VBrain.xml | 13 ++ .../StationProcedures/StationProcedures.xml | 6 +- .../GFR/LookupTables/LookupTables.xml | 10 +- .../CDB/alma/MINORSERVO/Boss/Boss.xml | 4 +- .../CDB/alma/MINORSERVO/GFR/GFR.xml | 1 + .../CDB/alma/MINORSERVO/M3R/M3R.xml | 1 + .../CDB/alma/MINORSERVO/PFP/PFP.xml | 1 + .../CDB/alma/MINORSERVO/SRP/SRP.xml | 1 + .../CDB/alma/MINORSERVO/VBrain/VBrain.xml | 13 ++ .../StationProcedures/StationProcedures.xml | 6 +- .../idl/SRTMinorServo.idl | 16 ++ .../idl/SRTMinorServoBoss.idl | 26 ++- .../idl/SRTMinorServoCommon.midl | 28 ++++ .../include/SRTMinorServoContainers.h | 20 ++- .../src/SRTMinorServoSocket.cpp | 16 +- .../config/CDB/schemas/SRTMinorServo.xsd | 27 +-- .../config/CDB/schemas/SRTMinorServoBoss.xsd | 40 +---- .../CDB/schemas/SRTMinorServoCommon.xsd | 90 ++++++++++ .../SRTMinorServoVBrainConfiguration.xsd | 33 ++++ SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 75 ++++++++- .../include/SRTMinorServoBossCore.h | 22 ++- .../include/SRTMinorServoBossImpl.h | 35 ++++ .../SRTMinorServo/include/SRTMinorServoImpl.h | 44 ++++- .../include/SRTMinorServoTrackingThread.h | 5 - SRT/Servers/SRTMinorServo/src/Makefile | 4 +- .../src/SRTBaseMinorServoImpl.cpp | 63 +++++-- .../src/SRTMinorServoBossCore.cpp | 156 ++++++++++++++---- .../src/SRTMinorServoBossImpl.cpp | 26 ++- .../src/SRTMinorServoParkThread.cpp | 9 +- .../src/SRTMinorServoScanThread.cpp | 3 +- .../src/SRTMinorServoSetupThread.cpp | 100 ++++++----- .../src/SRTMinorServoTrackingThread.cpp | 21 +-- .../src/SRTProgramTrackMinorServoImpl.cpp | 86 ++++++---- SRT/Servers/SRTMinorServo/src/_airBlade.py | 42 +++++ SRT/Servers/SRTMinorServo/src/_servoReset.py | 91 ++++++++++ 45 files changed, 951 insertions(+), 261 deletions(-) create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv create mode 100644 SRT/CDB/alma/MINORSERVO/VBrain/VBrain.xml create mode 100644 SRT/Configuration/CDB/alma/MINORSERVO/VBrain/VBrain.xml create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCommon.xsd create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoVBrainConfiguration.xsd create mode 100644 SRT/Servers/SRTMinorServo/src/_airBlade.py create mode 100644 SRT/Servers/SRTMinorServo/src/_servoReset.py diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp index 9a5baeeab..0bd15151b 100644 --- a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -289,7 +289,7 @@ int main(int argc, char *argv[]) { status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); - _TW_SET_COMPONENT(motionInfo_field,18,3,30,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(motionInfo_field,18,3,40,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); /* ****************************************************************** */ _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); diff --git a/Common/Clients/SystemTerminal/src/nuraghe_commands.py b/Common/Clients/SystemTerminal/src/nuraghe_commands.py index 9931cce9f..4b1723e37 100755 --- a/Common/Clients/SystemTerminal/src/nuraghe_commands.py +++ b/Common/Clients/SystemTerminal/src/nuraghe_commands.py @@ -2,6 +2,9 @@ from __future__ import print_function # Marco Buttu # Doctrings from the "Observing at the SRT with Nuraghe, Issue n.8, 21/10/14", # by Simona Righini and Andrea Orlati" +# 21/05/2024 G. Carboni: commands prependend with SRT_, Medicina_, Noto_ are +# only added to the operator input according to the STATION environment +# variable def antennaPark(): @@ -538,6 +541,12 @@ def servoSetup(): (CCB, KKG, LLP, PLP, PPP) configures the minor servos in ordet to put on focus the receiver """ +def SRT_servoReset(): + """ + servoReset + sends the emergency and alarm reset command to OR7 VBrain server, SRT only + """ + def setAttenuation(): """ setAttenuation=sect,att @@ -584,6 +593,29 @@ def setServoOffset(): setServoOffset=SRP_TY,5 """ +def SRT_setGregorianCoverPosition(): + """ + setGregorianCoverPosition=POSITION + It sets the gregorian cover position + Allowed POSITIONs + CLOSED, closed + OPEN, open + """ + +def SRT_setGregorianAirBladeStatus(): + """ + setGregorianAirBladeStatus=STATUS + It sets the gregorian air blade status + Allowed STATUSes: + AUTO, auto + OFF, off + ON, on + If a ON status is commanded, the air blade stays on for 30 seconds. + It can be toggled off manually. + Sending setGregorianAirBladeStatus=ON again will toggle the air blade to + turn on again. + """ + def setupCCB(): """ The setup command sets the antenna mount, the minor servos, @@ -694,6 +726,9 @@ def wx(): atmospheric pressure (hPa), wind speed (km/h). """ +stations = ['SRT', 'Medicina', 'Noto'] +import os +station = os.environ.get('STATION') import copy myself = __import__(__name__) # Create the commands dictionary @@ -701,10 +736,14 @@ commands = myself.__dict__.copy() # Shallow copy, but we do not mind for cmd in list(commands.keys()): if cmd.startswith('__'): del commands[cmd] + elif any(cmd.startswith(s) for s in stations): + command = commands.pop(cmd) + s, cmd = cmd.split('_') + if s == station: + commands[cmd] = command # Make the setupXXX.__doc__ for cmd in commands: if cmd.startswith('setup'): setupXXX = getattr(myself, cmd) setupXXX.__doc__ = setupCCB.__doc__ - diff --git a/Common/Servers/Scheduler/src/Core.cpp b/Common/Servers/Scheduler/src/Core.cpp index 888b55ddc..7e8566567 100644 --- a/Common/Servers/Scheduler/src/Core.cpp +++ b/Common/Servers/Scheduler/src/Core.cpp @@ -217,6 +217,9 @@ void CCore::execute() throw(ComponentErrors::TimerErrorExImpl, ComponentErrors:: m_parser->add("setServoASConfiguration", "minorservo", 4, &CCore::remoteCall); m_parser->add("clearServoOffsets", "minorservo", 4, &CCore::remoteCall); m_parser->add("setServoOffset", "minorservo", 4, &CCore::remoteCall); + m_parser->add("servoReset", "_servoReset", 0, "SRT"); + m_parser->add("setGregorianCoverPosition", "_cover", 1, "SRT"); + m_parser->add("setGregorianAirBladeStatus", "_airBlade", 1, "SRT"); // active surface m_parser->add("asSetup", "activesurface", 5, &CCore::remoteCall); diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml index 00e681dfa..9481f7890 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -23,10 +23,10 @@ ROTATION -51.821170 ROTATION -51.821170 - - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 + + + + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv new file mode 100644 index 000000000..18e70dd49 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv @@ -0,0 +1,14 @@ +CONFIGURATION;PFP_TX;PFP_TZ;PFP_RTHETA;SRP_TX;SRP_TY;SRP_TZ;SRP_RX;SRP_RY;SRP_RZ;M3R_RZ;GFR_RZ;DR_GFR1;DR_GFR2;DR_GFR3;DR_PFP;GREGORIAN_CAP; +Primario;0;0;0;-5;5;-120;0;0;0;*;*;*;*;*;*;1; +Gregoriano1;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-88.70659;*;*;*;*;3; +Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;*;*;*;*;3; +Gregoriano3;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;90.97161;*;*;*;*;3; +Gregoriano4;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;162.771;*;*;*;*;3; +Gregoriano5;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;55.373967;*;*;*;*;3; +Gregoriano6;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-51.82117;*;*;*;*;3; +Gregoriano7;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; +Gregoriano8;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; +BWG1;0;0;0;-1.5;11.1393650793988;0.358165166130078;0.049894179898239;-0.036111111111111;0;10;0;*;*;*;*;3; +BWG2;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; +BWG3;0;0;0;-1.5;11.1393650793988;-3.77159716192807;0.049894179898239;-0.036111111111111;0;20;0;*;*;*;*;3; +BWG4;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; diff --git a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml index 4dab29cf9..4fb06c72f 100644 --- a/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -31,7 +31,9 @@ - + + + diff --git a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml index 656043cef..f34f6a21c 100644 --- a/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -30,5 +30,6 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml index abf4e296e..8dfa3aa1c 100644 --- a/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -30,5 +30,6 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml index 3d22653f9..5503ee2fd 100644 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -31,6 +31,7 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml index 693ae9163..d783896b4 100644 --- a/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -31,6 +31,7 @@ + diff --git a/SRT/CDB/alma/MINORSERVO/VBrain/VBrain.xml b/SRT/CDB/alma/MINORSERVO/VBrain/VBrain.xml new file mode 100644 index 000000000..32131b046 --- /dev/null +++ b/SRT/CDB/alma/MINORSERVO/VBrain/VBrain.xml @@ -0,0 +1,13 @@ + + + + diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 4be2b1e2d..ef34edabf 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -137,11 +137,11 @@ goTo=*,89.8d - receiversPark - servoPark - asPark waitOnSource antennaStop + servoPark + asPark + receiversPark wait=1 antennaPark logMessage=Telescope is now parked diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml index 00e681dfa..9481f7890 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -23,10 +23,10 @@ ROTATION -51.821170 ROTATION -51.821170 - - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 + + + + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml index 4dab29cf9..4fb06c72f 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/Boss/Boss.xml @@ -31,7 +31,9 @@ - + + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml index 656043cef..f34f6a21c 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/GFR/GFR.xml @@ -30,5 +30,6 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml index abf4e296e..8dfa3aa1c 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/M3R/M3R.xml @@ -30,5 +30,6 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml index 3d22653f9..5503ee2fd 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml @@ -31,6 +31,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml index 693ae9163..d783896b4 100644 --- a/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml +++ b/SRT/Configuration/CDB/alma/MINORSERVO/SRP/SRP.xml @@ -31,6 +31,7 @@ + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/VBrain/VBrain.xml b/SRT/Configuration/CDB/alma/MINORSERVO/VBrain/VBrain.xml new file mode 100644 index 000000000..8d4815e2e --- /dev/null +++ b/SRT/Configuration/CDB/alma/MINORSERVO/VBrain/VBrain.xml @@ -0,0 +1,13 @@ + + + + diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 4be2b1e2d..ef34edabf 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -137,11 +137,11 @@ goTo=*,89.8d - receiversPark - servoPark - asPark waitOnSource antennaStop + servoPark + asPark + receiversPark wait=1 antennaPark logMessage=Telescope is now parked diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index f6680cf78..293610d47 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -98,6 +98,11 @@ module MinorServo */ readonly attribute ACS::ROstring current_setup; + /** + * This property returns the current eventual error code. + */ + readonly attribute ROSRTMinorServoError error_code; + /** * This method asks the PLC the status for the corresponding servo * @throw MinorServoErrors::MinorServoErrorsEx when trying to reset the offsets when they don't match the ones loaded into the hardware @@ -225,6 +230,17 @@ module MinorServo * @param max_ranges the maximum range of the servo axes */ void getAxesRanges(out ACS::doubleSeq min_ranges, out ACS::doubleSeq max_ranges); + + /* + * This method returns the current eventual error code + * @return the current eventual error code + */ + SRTMinorServoError getErrorCode(); + + /** + * This command resets the error status inside the component. + */ + void reset(); }; /** diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl index 9748e827e..746365e31 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoBoss.idl @@ -62,11 +62,21 @@ module MinorServo */ readonly attribute ROSRTMinorServoGregorianCoverStatus gregorian_cover; + /** + * Status of the gregorian air blade + */ + readonly attribute ROSRTMinorServoGregorianAirBladeStatus air_blade; + /** * UNIX Epoch of the last executed command (STATUS commands are not shown here) */ readonly attribute ACS::ROdouble last_executed_command; + /** + * This property returns the current eventual error code. + */ + readonly attribute ROSRTMinorServoError error_code; + /** * This command sets all the minor servos involved in the current focal configuration to their position calculated from the elevation argument * @param elevation, the elevation the minor servos should use to calculate their position @@ -79,7 +89,21 @@ module MinorServo * @param value, the desired gregorian cover position, accepted values are 'open', 'OPEN', 'closed' or 'CLOSED' * @throw MinorServoErrors::MinorServoErrorsEx */ - //void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); + void setGregorianCoverPosition(in string value) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This command turns the gregorian air blade on or off, or sets it to automatic mode + * @param value, the desired air blade status, accepted values are 'on', 'ON', 'off', 'OFF', 'auto' or 'AUTO' + * @throw MinorServoErrors::MinorServoErrorsEx + */ + void setGregorianAirBladeStatus(in string value) raises (MinorServoErrors::MinorServoErrorsEx); + + /** + * This command resets the error status inside the component. It DOES NOT send a reset command to the Leonardo minor servo system. + * In order to reset emergencies and alarms inside the Leonardo minor servo system the user has to call the servoReset command from operatorInput. + * The servoReset command sends a reset to the Leonardo minnor servo system and then calls this method to clear the component error status. + */ + void reset(); }; }; diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 6addf4c0d..45980430f 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -59,6 +59,17 @@ module MinorServo }; ACS_ENUM(SRTMinorServoGregorianCoverStatus); + /** + * Enumerator which indicates the status of the gregorian air blade + */ + enum SRTMinorServoGregorianAirBladeStatus + { + AIR_BLADE_STATUS_AUTO, + AIR_BLADE_STATUS_OFF, + AIR_BLADE_STATUS_ON + }; + ACS_ENUM(SRTMinorServoGregorianAirBladeStatus); + /** * Enumerator which indicates the status of a servo drive cabinet */ @@ -98,5 +109,22 @@ module MinorServo MOTION_STATUS_ERROR }; ACS_ENUM(SRTMinorServoMotionStatus); + + /** + * Enumerator which indicates what type of error is present on the component + */ + enum SRTMinorServoError + { + ERROR_NO_ERROR, + ERROR_NOT_CONNECTED, + ERROR_MAINTENANCE, + ERROR_EMERGENCY_STOP, + ERROR_COVER_WRONG_POSITION, + ERROR_CONFIG_ERROR, + ERROR_COMMAND_ERROR, + ERROR_SERVO_BLOCKED, + ERROR_DRIVE_CABINET + }; + ACS_ENUM(SRTMinorServoError); }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index 4c32b5195..3c5446638 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -702,7 +702,25 @@ namespace MinorServo */ SRTMinorServoGregorianCoverStatus getGregorianCoverPosition() const { - return SRTMinorServoGregorianCoverStatus(this->get("GREGORIAN_CAP")); + return SRTMinorServoGregorianCoverStatus(std::min(this->get("GREGORIAN_CAP"), (unsigned int)COVER_STATUS_OPEN)); + } + + /** + * Returns the status of the gregorian air blade. + * @return an enum indicating the status of the gregorian air blade. + */ + SRTMinorServoGregorianAirBladeStatus getGregorianAirBladeStatus() const + { + unsigned int status = this->get("GREGORIAN_CAP"); + if(status <= COVER_STATUS_CLOSED) + { + status = AIR_BLADE_STATUS_OFF; + } + else + { + status -= 2; + } + return SRTMinorServoGregorianAirBladeStatus(status); } /** diff --git a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp index f0606fe29..1f182d455 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp +++ b/SRT/Libraries/SRTMinorServoLibrary/src/SRTMinorServoSocket.cpp @@ -74,21 +74,21 @@ void SRTMinorServoSocket::connect() throw impl.getMinorServoErrorsEx(); } - if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) + if(setSockMode(m_error, NONBLOCKING) != SUCCESS) { - m_socket_status = TIMEOUT; + m_socket_status = NOTREADY; Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); - impl.setReason("Cannot connect the socket."); + impl.setReason("Cannot set the socket to non-blocking."); throw impl.getMinorServoErrorsEx(); } - if(setSockMode(m_error, NONBLOCKING) != SUCCESS) + if(Connect(m_error, m_ip_address.c_str(), m_port) == FAIL) { - m_socket_status = NOTREADY; + m_socket_status = TIMEOUT; Close(m_error); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, impl, "SRTMinorServoSocket::SRTMinorServoSocket()"); - impl.setReason("Cannot set the socket to non-blocking."); + impl.setReason("Cannot connect the socket."); throw impl.getMinorServoErrorsEx(); } @@ -102,10 +102,10 @@ const bool SRTMinorServoSocket::isConnected() const SRTMinorServoAnswerMap SRTMinorServoSocket::sendCommand(std::string command, std::optional> map) { - std::lock_guard guard(m_mutex); - connect(); + std::lock_guard guard(m_mutex); + double start_time = IRA::CIRATools::getUNIXEpoch(); size_t sent_bytes = 0; diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index c6e235928..88b054568 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -10,41 +10,23 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" + xmlns:ms="urn:schemas-cosylab-com:SRTMinorServoCommon:1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> - - - - - - - - - - - - - - - - - - - - + - + - + @@ -57,6 +39,7 @@ + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd index 2d87a89a5..153014681 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -9,42 +9,14 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:mng="urn:schemas-cosylab-com:Managment:1.0" + xmlns:ms="urn:schemas-cosylab-com:SRTMinorServoCommon:1.0" elementFormDefault="qualified" attributeFormDefault="unqualified"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -61,15 +33,17 @@ - + - + - + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCommon.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCommon.xsd new file mode 100644 index 000000000..d1458353c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCommon.xsd @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoVBrainConfiguration.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoVBrainConfiguration.xsd new file mode 100644 index 000000000..722053f54 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoVBrainConfiguration.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index 330d3905d..49749dc7f 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -68,9 +68,10 @@ namespace MinorServo * @param scanning a reference to the TBoolean indicating whether the system is scanning or not. * @param current_scan a reference to the SRTMinorServoScan object containing the parameters for the current scan. It is used to read the servo name and axis involved in the scan. */ - MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoGeneralStatus& boss_status, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : + MSMotionInfoDevIO(const std::atomic& motion_status, const SRTMinorServoGeneralStatus& boss_status, const std::atomic& error, const std::atomic& scanning, const SRTMinorServoScan& current_scan) : m_motion_status(motion_status), m_boss_status(boss_status), + m_error(error), m_scanning(scanning), m_current_scan(current_scan) {} @@ -120,13 +121,13 @@ namespace MinorServo // If I can read the status of the gregorian cover I will notify the user about it on the GUI SRTMinorServoGregorianCoverStatus cover_position = m_boss_status.getGregorianCoverPosition(); - if(cover_position == COVER_STATUS_OPEN) + if(cover_position == COVER_STATUS_CLOSED) { - motion_status += ", gregorian cover open"; + motion_status += ", gregorian cover closed"; } - else if(cover_position == COVER_STATUS_CLOSED) + if(cover_position == COVER_STATUS_OPEN) { - motion_status += ", gregorian cover closed"; + motion_status += ", gregorian cover open"; } } catch(...) @@ -138,7 +139,61 @@ namespace MinorServo } case MOTION_STATUS_ERROR: { - motion_status = "Error"; + switch(m_error.load()) + { + case ERROR_NO_ERROR: + { + // Should never get here, leave empty + motion_status = ""; + break; + } + case ERROR_NOT_CONNECTED: + { + motion_status = "Socket not connected"; + break; + } + case ERROR_MAINTENANCE: + { + motion_status = "System in maintenance mode"; + break; + } + case ERROR_EMERGENCY_STOP: + { + motion_status = "Emergency stop pressed"; + break; + } + case ERROR_COVER_WRONG_POSITION: + { + motion_status = "Gregorian cover in wrong position"; + break; + } + case ERROR_CONFIG_ERROR: + { + motion_status = "Error while configuring the system"; + break; + } + case ERROR_COMMAND_ERROR: + { + motion_status = "Error while executing a remote command"; + break; + } + case ERROR_SERVO_BLOCKED: + { + motion_status = "Minor servo group is blocked"; + break; + } + case ERROR_DRIVE_CABINET: + { + motion_status = "Minor servo group drive cabinet error"; + break; + } + default: + { + // Should never get here, unknown error condition + motion_status = "Unknown error"; + break; + } + } break; } } @@ -161,6 +216,11 @@ namespace MinorServo */ const SRTMinorServoGeneralStatus& m_boss_status; + /** + * Reference to the SRTMinorServoError object of the Boss. + */ + const std::atomic& m_error; + /** * Reference to the boolean telling if the system is scanning. */ @@ -187,6 +247,7 @@ namespace MinorServo SRTMinorServoFocalConfiguration, SRTMinorServoControlStatus, SRTMinorServoGregorianCoverStatus, + SRTMinorServoGregorianAirBladeStatus, SRTMinorServoCabinetStatus, SRTMinorServoOperativeMode > @@ -261,7 +322,7 @@ namespace MinorServo * The templates is specialized for the combinations of types listed right below and the compilation will fail if the developer attempts to use it with any other types combination. */ template || (std::is_same_v && std::is_same_v>) + is_any_v || (std::is_same_v && std::is_same_v>) >> class MSGenericDevIO : public MSBaseDevIO { diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index 157fe1f23..b315443a8 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -118,6 +118,14 @@ private: */ void setGregorianCoverPosition(std::string position); + /** + * Sets the gregorian air blade status. + * @param status the desired status for the gregorian air blade, allowed value are 'on', 'ON', 'off', 'OFF', 'auto' or 'AUTO'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded status is unknown or the gregorian cover is currently closed, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + void setGregorianAirBladeStatus(std::string status); + /** * Configures the whole minor servo system to a desired position. * @param elevation the elevation to use for all the minor servo positions calculation. @@ -268,8 +276,15 @@ private: /** * Method that sets all the necessary variable to signal a failure of the minor servo system. + * @param error the type of error the system should display + */ + void setError(SRTMinorServoError error); + + /** + * Method that clears the error status from the system. + * This will show the system cleared the error status and is ready to be configured again. */ - void setFailure(); + void reset(bool force=false); /** * Method used to retrieve a configuration value from the CDB. @@ -382,6 +397,11 @@ private: */ std::atomic m_tracking; + /** + * Enumerator containing the error code. + */ + std::atomic m_error_code; + /** * This boolean will be set to true every time the socket connects. * When true it will trigger a procedure that will check if the minor servos offsets need to be reloaded because of a discrepancy between the DISCOS offsets (user + system) and the Leonardo offsets. diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index 40eb0c828..a22cceb6b 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -264,6 +264,14 @@ public: */ virtual void setGregorianCoverPosition(const char* position); + /** + * Sets the gregorian air blade status. + * @param status the desired status of the gregorian air blade, allowed values are 'on', 'ON', 'off', 'OFF', 'auto' or 'AUTO'. + * @throw MinorServoErrors::MinorServoErrorsEx when the commanded status is unknown or the gregorian cover is currently closed, + * when anything goes wrong in the lower communication level or if checkLineStatus throws. + */ + virtual void setGregorianAirBladeStatus(const char* status); + /** * This method checks if a scan with the given parameters is feasible. * @param start_time the starting ACS::Time for the requested scan. @@ -298,6 +306,11 @@ public: */ virtual void preset(double elevation); + /** + * This command clears the error status from the component. + */ + void reset(); + /** * Parser method. It executes the desired command. */ @@ -417,12 +430,24 @@ public: */ virtual ROSRTMinorServoGregorianCoverStatus_ptr gregorian_cover(); + /** + * Returns a reference to the air_blade property implementation of the IDL interface. + * @return pointer to read-only SRTMinorServoGregorianAirBladeStatus property air_blade. + */ + virtual ROSRTMinorServoGregorianAirBladeStatus_ptr air_blade(); + /** * Returns a reference to the last_executed_command property implementation of the IDL interface. * @return pointer to read-only double property last_executed_command. */ virtual ACS::ROdouble_ptr last_executed_command(); + /** + * Returns a reference to the error_code property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoError property error_code. + */ + virtual ROSRTMinorServoError_ptr error_code(); + private: /** * Component name. @@ -539,10 +564,20 @@ private: */ baci::SmartPropertyPointer> m_gregorian_cover_ptr; + /** + * Pointer to the air_blade property. + */ + baci::SmartPropertyPointer> m_air_blade_ptr; + /** * Pointer to the last_executed_command property. */ baci::SmartPropertyPointer m_last_executed_command_ptr; + + /** + * Pointer to the error_code property. + */ + baci::SmartPropertyPointer> m_error_code_ptr; }; #endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index a286b5395..a8254f7dd 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -173,6 +173,17 @@ public: */ void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out); + /** + * Returns the current error code. + * @return the current SRTMinorServoError code. + */ + SRTMinorServoError getErrorCode() { return m_error_code.load(); }; + + /** + * Resets the component error code to ERROR_NO_ERROR. + */ + void reset(); + /** * Returns the virtual axes positions to where the servo system was at the given time acs_time. * @param acs_time the epoch we want to retrieve the axes virtual positions of the servo system. @@ -288,6 +299,12 @@ public: */ virtual ACS::ROstring_ptr current_setup(); + /** + * Returns a reference to the error_code property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoError property error_code. + */ + virtual ROSRTMinorServoError_ptr error_code(); + protected: /** * Checks if the socket is connected and if the minor servo system is in a good state. @@ -348,17 +365,17 @@ private: * Units of the virtual axes of the servo system. */ const std::vector m_virtual_axes_units; - - /** - * Latest commanded virtual positions. It only takes into account the preset command. - */ - std::vector m_commanded_virtual_positions; protected: /** * Dictionary containing the last status retrieved form the servo system. */ SRTMinorServoStatus m_status; + /** + * Current error code. + */ + std::atomic m_error_code; + /** * Commanded user offsets for each axis of the servo system. */ @@ -369,6 +386,11 @@ protected: */ std::vector m_system_offsets; + /** + * Latest commanded virtual positions. It only takes into account the preset command. + */ + std::vector m_commanded_virtual_positions; + /** * Queue of positions assumed by the servo system in time. */ @@ -494,6 +516,11 @@ private: */ baci::SmartPropertyPointer m_current_setup_ptr; + /** + * Pointer to the error_code property. + */ + baci::SmartPropertyPointer> m_error_code_ptr; + /** * Table containing the coefficients for the positions calculations. */ @@ -532,7 +559,9 @@ protected: void getAxesInfo(ACS::stringSeq_out axes_names_out, ACS::stringSeq_out axes_units_out) { SRTBaseMinorServoImpl::getAxesInfo(axes_names_out, axes_units_out); }\ ACS::doubleSeq* getAxesPositions(ACS::Time acs_time) { return SRTBaseMinorServoImpl::getAxesPositions(acs_time); }\ long getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest) { return SRTBaseMinorServoImpl::getTravelTime(start, dest); }\ - void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) { SRTBaseMinorServoImpl::getAxesRanges(min_ranges_out, max_ranges_out); } + void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out) { SRTBaseMinorServoImpl::getAxesRanges(min_ranges_out, max_ranges_out); }\ + SRTMinorServoError getErrorCode() { return SRTBaseMinorServoImpl::getErrorCode(); }\ + void reset() { SRTBaseMinorServoImpl::reset(); } /** * MACRO definition of child classes properties methods. @@ -556,7 +585,8 @@ protected: virtual ACS::ROdoubleSeq_ptr virtual_system_offsets() { return SRTBaseMinorServoImpl::virtual_system_offsets(); }\ virtual ACS::ROdoubleSeq_ptr commanded_virtual_positions() { return SRTBaseMinorServoImpl::commanded_virtual_positions(); }\ virtual Management::ROTBoolean_ptr in_use() { return SRTBaseMinorServoImpl::in_use(); }\ - virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); } + virtual ACS::ROstring_ptr current_setup() { return SRTBaseMinorServoImpl::current_setup(); }\ + virtual ROSRTMinorServoError_ptr error_code() { return SRTBaseMinorServoImpl::error_code(); } /** * This class implements the SRTGenericMinorServoImpl CORBA interface for a generic SRTMinorServo component. diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h index 32ae15c9e..c5160b019 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoTrackingThread.h @@ -75,11 +75,6 @@ private: * The current trajectory point time. */ ACS::Time m_point_time; - - /** - * Boolean which indicates if the tracking thread exited with an error or not. - */ - bool m_error; }; #endif /*_SRTMINORSERVOTRACKINGTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index c11de1645..a61ed3645 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -9,11 +9,11 @@ EXECUTABLES = EXECUTABLES_L = -PY_SCRIPTS = #_cover +PY_SCRIPTS = _cover _airBlade _servoReset # On-Line Database Files # ---------------------- -CDB_SCHEMAS = SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoProperties SRTMinorServoLookupTable +CDB_SCHEMAS = SRTMinorServoCommon SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoVBrainConfiguration SRTMinorServoProperties SRTMinorServoLookupTable # ---------------------------- # Libraries (public and local) diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index dea56af00..8371127f0 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -17,8 +17,10 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_virtual_axes_names, SRTBaseMinorServoImpl::getPropertiesTable(*this, "virtual_offsets") ), + m_error_code(ERROR_NO_ERROR), m_user_offsets(m_virtual_axes, 0.0), m_system_offsets(m_virtual_axes, 0.0), + m_commanded_virtual_positions(m_virtual_axes, 0.0), m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), m_min(SRTBaseMinorServoImpl::getMotionConstant(*this, "min_range")), m_max(SRTBaseMinorServoImpl::getMotionConstant(*this, "max_range")), @@ -44,6 +46,7 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_commanded_virtual_positions_ptr(this), m_in_use_ptr(this), m_current_setup_ptr(this), + m_error_code_ptr(this), m_current_lookup_table(), m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) @@ -92,6 +95,8 @@ void SRTBaseMinorServoImpl::initialize() new MSGenericDevIO>(m_in_use), true); m_current_setup_ptr = new baci::ROstring((m_component_name + ":current_setup").c_str(), getComponent(), new MSGenericDevIO(m_current_setup), true); + m_error_code_ptr = new ROEnumImpl((m_component_name + ":error_code").c_str(), getComponent(), + new MSGenericDevIO>(m_error_code), true); } catch(std::bad_alloc& ba) { @@ -157,6 +162,8 @@ bool SRTBaseMinorServoImpl::status() } catch(...) { + // Something went wrong when sending the status command + m_error_code.store(ERROR_COMMAND_ERROR); return false; } @@ -171,6 +178,7 @@ void SRTBaseMinorServoImpl::stow(CORBA::Long stow_position) if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow(m_servo_name, (unsigned int)stow_position)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stow()").c_str()); ex.setReason("Received NAK in response to a STOW command."); ex.log(LM_DEBUG); @@ -186,6 +194,7 @@ void SRTBaseMinorServoImpl::stop() if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stop(m_servo_name)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::stop()").c_str()); ex.setReason("Received NAK in response to a STOP command."); ex.log(LM_DEBUG); @@ -206,13 +215,8 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coords) if(virtual_coordinates.length() == 0) { // It means we want to command the latest coordinates again, to apply the offset in the LDO servo system - // We execute the copy only if we already commanded a set of coordinates, otherwise we let the flow go to the next - // if which will raise regardless - if(!m_commanded_virtual_positions.empty()) - { - virtual_coordinates.length(m_commanded_virtual_positions.size()); - std::copy(m_commanded_virtual_positions.begin(), m_commanded_virtual_positions.end(), virtual_coordinates.begin()); - } + virtual_coordinates.length(m_commanded_virtual_positions.size()); + std::copy(m_commanded_virtual_positions.begin(), m_commanded_virtual_positions.end(), virtual_coordinates.begin()); } if(virtual_coordinates.length() != m_virtual_axes) @@ -240,16 +244,13 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coords) if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, coordinates)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::preset()").c_str()); ex.setReason("Received NAK in response to a PRESET command."); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } - if(m_commanded_virtual_positions.empty()) - { - m_commanded_virtual_positions.resize(m_virtual_axes); - } std::copy(coordinates.begin(), coordinates.end(), m_commanded_virtual_positions.begin()); } @@ -320,9 +321,16 @@ bool SRTBaseMinorServoImpl::setup(const char* configuration_name) clearUserOffsets(); clearSystemOffsets(); m_in_use.store(Management::MNG_TRUE); + // The positions tables inside the Leonardo minor servo systems are calculated with an elevation of 45 degrees. + // We need to be sure the values are correct otherwise there will be a discrepancy. + ACS::doubleSeq commanded_coordinates = *calcCoordinates(45); + std::copy(commanded_coordinates.begin(), commanded_coordinates.end(), m_commanded_virtual_positions.begin()); + return true; + } + else + { + return false; } - - return true; } ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) @@ -408,6 +416,7 @@ void SRTBaseMinorServoImpl::setUserOffset(const char* axis_name, CORBA::Double o if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setUserOffset()").c_str()); ex.setReason("Received NAK in response to an OFFSET command."); ex.log(LM_DEBUG); @@ -430,6 +439,7 @@ void SRTBaseMinorServoImpl::clearUserOffsets() if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearUserOffset()").c_str()); ex.setReason("Received NAK in response to an OFFSET command."); ex.log(LM_DEBUG); @@ -486,6 +496,7 @@ void SRTBaseMinorServoImpl::setSystemOffset(const char* axis_name, CORBA::Double if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setSystemOffset()").c_str()); ex.setReason("Received NAK in response to an OFFSET command."); ex.log(LM_DEBUG); @@ -509,6 +520,7 @@ void SRTBaseMinorServoImpl::clearSystemOffsets() if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, offsets)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::clearSystemOffset()").c_str()); ex.setReason("Received NAK in response to an OFFSET command."); ex.log(LM_DEBUG); @@ -534,6 +546,7 @@ void SRTBaseMinorServoImpl::reloadOffsets() // Offsets do not correspond, should reset them by sending a offset command if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, DISCOS_offsets)).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::reloadOffsets()").c_str()); ex.setReason("Received NAK in response to an OFFSET command."); ex.log(LM_DEBUG); @@ -555,7 +568,7 @@ void SRTBaseMinorServoImpl::getAxesInfo(ACS::stringSeq_out axes_names_out, ACS:: for(size_t i = 0; i < m_virtual_axes; i++) { - axes_names[i] = (m_servo_name + "_" + m_virtual_axes_names[i] == "ROTATION" ? "RZ" : m_virtual_axes_names[i]).c_str(); + axes_names[i] = (m_virtual_axes_names[i] == "ROTATION" ? "RZ" : m_virtual_axes_names[i]).c_str(); axes_units[i] = m_virtual_axes_units[i].c_str(); } @@ -684,6 +697,12 @@ void SRTBaseMinorServoImpl::getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS max_ranges_out = max_ranges._retn(); } +void SRTBaseMinorServoImpl::reset() +{ + AUTO_TRACE("SRTBaseMinorServoImpl::reset()"); + m_error_code.store(ERROR_NO_ERROR); +} + /////////////////// PROTECTED methods void SRTBaseMinorServoImpl::checkLineStatus() { @@ -692,14 +711,25 @@ void SRTBaseMinorServoImpl::checkLineStatus() _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "checkLineStatus()").c_str()); ex.setReason("Socket not connected."); ex.log(LM_DEBUG); + m_error_code.store(ERROR_NOT_CONNECTED); + throw ex.getMinorServoErrorsEx(); + } + + if(m_status.isBlocked() == Management::MNG_TRUE) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); + ex.setReason("Servo system blocked."); + ex.log(LM_DEBUG); + m_error_code.store(ERROR_SERVO_BLOCKED); throw ex.getMinorServoErrorsEx(); } - if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + if(m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) { _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); - ex.setReason("Servo system blocked or drive cabinet error."); + ex.setReason("Drive cabinet error."); ex.log(LM_DEBUG); + m_error_code.store(ERROR_DRIVE_CABINET); throw ex.getMinorServoErrorsEx(); } } @@ -835,3 +865,4 @@ GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_virtual_system GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTBaseMinorServoImpl, m_commanded_virtual_positions_ptr, commanded_virtual_positions); GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTBaseMinorServoImpl, m_in_use_ptr, in_use); GET_PROPERTY_REFERENCE(ACS::ROstring, SRTBaseMinorServoImpl, m_current_setup_ptr, current_setup); +GET_PROPERTY_REFERENCE(ROSRTMinorServoError, SRTBaseMinorServoImpl, m_error_code_ptr, error_code); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index c529b0b0c..3e8120561 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -24,6 +24,7 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_scan_active(Management::MNG_FALSE), m_scanning(Management::MNG_FALSE), m_tracking(Management::MNG_FALSE), + m_error_code(ERROR_NO_ERROR), m_reload_servo_offsets(true), m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(m_component.getContainerServices())), m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)), @@ -31,8 +32,8 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_servos{ //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") }, - { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") } - //{ "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } + { "GFR", m_component.getContainerServices()->getComponent("MINORSERVO/GFR") }, + { "M3R", m_component.getContainerServices()->getComponent("MINORSERVO/M3R") } }, m_tracking_servos{ //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, @@ -62,13 +63,18 @@ bool SRTMinorServoBossCore::status() try { // Attempt communication anyway - m_socket.sendCommand(SRTMinorServoCommandLibrary::status(), m_status); + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::status(), m_status).checkOutput()) + { + setError(ERROR_COMMAND_ERROR); + return false; + } if(m_socket_connected.load() == Management::MNG_FALSE) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_NOTICE, "Socket connected.")); + // We just reconnected, we can try to reset the error automatically, if there is another error in the following code the reset will simply be overridden m_socket_connected.store(Management::MNG_TRUE); - m_subsystem_status.store(Management::MNG_WARNING); + reset(true); } } catch(MinorServoErrors::MinorServoErrorsEx& ex) @@ -82,7 +88,7 @@ bool SRTMinorServoBossCore::status() stopThread(m_park_thread); stopThread(m_tracking_thread); stopThread(m_scan_thread); - setFailure(); + setError(ERROR_NOT_CONNECTED); m_reload_servo_offsets = true; } @@ -97,29 +103,28 @@ bool SRTMinorServoBossCore::status() catch(MinorServoErrors::MinorServoErrorsEx& ex) { _IRA_LOGFILTER_LOG(LM_ERROR, "SRTMinorServoBossCore::status()", getReasonFromEx(ex)); - setFailure(); return false; } SRTMinorServoMotionStatus motion_status = m_motion_status.load(); - /*if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) + if(motion_status == MOTION_STATUS_TRACKING || motion_status == MOTION_STATUS_CONFIGURED) { // We only get here if the system is configured, therefore we check the correct position of the gregorian cover SRTMinorServoGregorianCoverStatus commanded_gregorian_cover_position = m_status.getFocalConfiguration() == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; if(m_status.getGregorianCoverPosition() != commanded_gregorian_cover_position) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, "Gregorian cover in wrong position.")); - setFailure(); + setError(ERROR_COVER_WRONG_POSITION); return false; } - }*/ + } for(const auto& [name, servo] : m_servos) { if(!servo->status()) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::status()", (LM_CRITICAL, ("Error checking " + name + " status.").c_str())); - setFailure(); + setError(servo->getErrorCode()); return false; } @@ -131,7 +136,7 @@ bool SRTMinorServoBossCore::status() m_reload_servo_offsets = false; - if(motion_status == MOTION_STATUS_TRACKING) + if(motion_status == MOTION_STATUS_CONFIGURED || motion_status == MOTION_STATUS_TRACKING) { if(std::all_of(m_current_tracking_servos.begin(), m_current_tracking_servos.end(), [](const std::pair& servo) -> bool { @@ -145,10 +150,6 @@ bool SRTMinorServoBossCore::status() m_tracking.store(Management::MNG_FALSE); } } - else if(motion_status == MOTION_STATUS_CONFIGURED) - { - m_tracking.store(Management::MNG_TRUE); - } else { m_tracking.store(Management::MNG_FALSE); @@ -338,10 +339,10 @@ void SRTMinorServoBossCore::park() m_current_servos.clear(); m_current_tracking_servos.clear(); - /*try + try { // Send the STOW command to close the gregorian cover - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", COVER_STATUS_CLOSED)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", COVER_STATUS_CLOSED)).checkOutput()) { _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); ex.setSubsystem("MinorServo"); @@ -357,7 +358,7 @@ void SRTMinorServoBossCore::park() ex.setReason("Error while sending the STOW command to the gregorian cover."); ex.log(LM_DEBUG); throw ex.getParkingErrorEx(); - }*/ + } // Send the STOP command to all the servos for(const auto& [servo_name, servo] : m_servos) @@ -433,6 +434,14 @@ void SRTMinorServoBossCore::setElevationTracking(std::string configuration) if(m_motion_status.load() == MOTION_STATUS_TRACKING) { m_motion_status.store(MOTION_STATUS_CONFIGURED); + + try + { + preset(getElevation(getTimeStamp())); + } + catch(...) + { + } } } } @@ -517,15 +526,82 @@ void SRTMinorServoBossCore::setGregorianCoverPosition(std::string position) throw ex.getMinorServoErrorsEx(); } - ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_NOTICE, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); + SRTMinorServoGregorianCoverStatus desired_position; + if(position == "OPEN") + { + desired_position = COVER_STATUS_OPEN; + } + else + { + desired_position = COVER_STATUS_CLOSED; + } + + if(desired_position != m_status.getGregorianCoverPosition()) + { + ACS_LOG(LM_FULL_INFO, "setGregorianCoverPosition", (LM_NOTICE, ("SETTING GREGORIAN COVER POSITION TO " + position).c_str())); - if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", position == "OPEN" ? COVER_STATUS_OPEN : COVER_STATUS_CLOSED)).checkOutput()) + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", desired_position)).checkOutput()) + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); + ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } +} + +void SRTMinorServoBossCore::setGregorianAirBladeStatus(std::string status) +{ + AUTO_TRACE("SRTMinorServoBossCore::setGregorianAirBladeStatus()"); + + checkLineStatus(); + + std::transform(status.begin(), status.end(), status.begin(), ::toupper); + + if(status != "ON" && status != "OFF" && status != "AUTO") { - _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianCoverPosition()"); - ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianAirBladeStatus()"); + ex.addData("Reason", ("Unknown status '" + status + "'.").c_str()); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + + SRTMinorServoMotionStatus motion_status = m_motion_status.load(); + SRTMinorServoGregorianCoverStatus cover_status = m_status.getGregorianCoverPosition(); + if((motion_status != MOTION_STATUS_CONFIGURED && motion_status != MOTION_STATUS_TRACKING) || cover_status == COVER_STATUS_CLOSED) + { + _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianAirBladeStatus()"); + ex.setReason("You can set the gregorian cover air blade status only when the system is configured or tracking and the gregorian cover is open."); ex.log(LM_DEBUG); throw ex.getMinorServoErrorsEx(); } + + SRTMinorServoGregorianAirBladeStatus desired_status; + if(status == "ON") + { + desired_status = AIR_BLADE_STATUS_ON; + } + else if(status == "OFF") + { + desired_status = AIR_BLADE_STATUS_OFF; + } + else + { + desired_status = AIR_BLADE_STATUS_AUTO; + } + + if(desired_status != m_status.getGregorianAirBladeStatus()) + { + ACS_LOG(LM_FULL_INFO, "setGregorianAirBladeStatus", (LM_NOTICE, ("SETTING AIR BLADE STATUS TO " + status).c_str())); + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", 2 + (unsigned int)desired_status)).checkOutput()) + { + _EXCPT(MinorServoErrors::StowErrorExImpl, ex, "SRTMinorServoBossCore::setGregorianAirBladeStatus()"); + ex.addData("Reason", "Error while sending a STOW command to the gregorian cover."); + ex.log(LM_DEBUG); + throw ex.getMinorServoErrorsEx(); + } + } } void SRTMinorServoBossCore::preset(double elevation) @@ -1227,7 +1303,7 @@ void SRTMinorServoBossCore::checkLineStatus() _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("Socket not connected."); ex.log(LM_DEBUG); - setFailure(); + setError(ERROR_NOT_CONNECTED); throw ex.getMinorServoErrorsEx(); } @@ -1236,7 +1312,7 @@ void SRTMinorServoBossCore::checkLineStatus() _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system is not controlled by DISCOS."); ex.log(LM_DEBUG); - setFailure(); + setError(ERROR_MAINTENANCE); throw ex.getMinorServoErrorsEx(); } @@ -1245,7 +1321,7 @@ void SRTMinorServoBossCore::checkLineStatus() _EXCPT(MinorServoErrors::StatusErrorExImpl, ex, "SRTMinorServoBossCore::checkLineStatus()"); ex.setReason("MinorServo system in emergency status."); ex.log(LM_DEBUG); - setFailure(); + setError(ERROR_EMERGENCY_STOP); throw ex.getMinorServoErrorsEx(); } } @@ -1285,7 +1361,7 @@ void SRTMinorServoBossCore::startThread(T*& thread, const ACS::TimeInterval& sle _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, "SRTMinorServoBossCore::startThread()"); ex.setThreadName(T::c_thread_name); ex.log(LM_DEBUG); - setFailure(); + setError(ERROR_CONFIG_ERROR); throw ex.getComponentErrorsEx(); } } @@ -1315,10 +1391,12 @@ void SRTMinorServoBossCore::destroyThread(T*& thread) ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossCore::destroyThread()", (LM_NOTICE, (std::string(T::c_thread_name) + " destroyed.").c_str())); } -void SRTMinorServoBossCore::setFailure() +void SRTMinorServoBossCore::setError(SRTMinorServoError error) { - AUTO_TRACE("SRTMinorServoBossCore::setFailure()"); + AUTO_TRACE("SRTMinorServoBossCore::setError()"); + m_commanded_setup = ""; + m_actual_setup = "Error"; m_subsystem_status.store(Management::MNG_FAILURE); m_ready.store(Management::MNG_FALSE); m_elevation_tracking.store(Management::MNG_FALSE); @@ -1327,6 +1405,28 @@ void SRTMinorServoBossCore::setFailure() m_scanning.store(Management::MNG_FALSE); m_tracking.store(Management::MNG_FALSE); m_motion_status.store(MOTION_STATUS_ERROR); + m_error_code.store(error); +} + +void SRTMinorServoBossCore::reset(bool force) +{ + AUTO_TRACE("SRTMinorServoBossCore::reset()"); + + if(m_error_code.load() == ERROR_NOT_CONNECTED && !force) + { + // If we are still not connected we should not proceed with the reset + return; + } + + for(const auto& [servo_name, servo] : m_servos) + { + servo->reset(); + } + + m_actual_setup = "Unknown"; + m_subsystem_status.store(Management::MNG_WARNING); + m_motion_status.store(MOTION_STATUS_UNCONFIGURED); + m_error_code.store(ERROR_NO_ERROR); } Management::TBoolean SRTMinorServoBossCore::getCDBConfiguration(std::string which_configuration) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp index 8a8a55374..ee9f13f24 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossImpl.cpp @@ -30,7 +30,9 @@ SRTMinorServoBossImpl::SRTMinorServoBossImpl(const ACE_CString& component_name, m_power_ptr(this), m_emergency_ptr(this), m_gregorian_cover_ptr(this), - m_last_executed_command_ptr(this) + m_air_blade_ptr(this), + m_last_executed_command_ptr(this), + m_error_code_ptr(this) { AUTO_TRACE("SRTMinorServoBossImpl::SRTMinorServoBossImpl()"); @@ -60,7 +62,7 @@ void SRTMinorServoBossImpl::initialize() m_actual_setup_ptr = new baci::ROstring((m_component_name + ":actualSetup").c_str(), getComponent(), new MSGenericDevIO(m_core.m_actual_setup), true); m_motion_info_ptr = new baci::ROstring((m_component_name + ":motionInfo").c_str(), getComponent(), - new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status, m_core.m_scanning, m_core.m_current_scan), true); + new MSMotionInfoDevIO(m_core.m_motion_status, m_core.m_status, m_core.m_error_code, m_core.m_scanning, m_core.m_current_scan), true); m_starting_ptr = new ROEnumImpl((m_component_name + ":starting").c_str(), getComponent(), new MSGenericDevIO>(m_core.m_starting), true); m_as_configuration_ptr = new ROEnumImpl((m_component_name + ":asConfiguration").c_str(), getComponent(), @@ -87,8 +89,11 @@ void SRTMinorServoBossImpl::initialize() m_emergency_ptr = new ROEnumImpl((m_component_name + ":emergency").c_str(), getComponent(), new MSAnswerMapDevIO("emergency", m_core.m_status, &SRTMinorServoGeneralStatus::emergencyPressed), true); m_gregorian_cover_ptr = new ROEnumImpl((m_component_name + ":gregorian_cover").c_str(), getComponent(), new MSAnswerMapDevIO("gregorian_cover", m_core.m_status, &SRTMinorServoGeneralStatus::getGregorianCoverPosition), true); + m_air_blade_ptr = new ROEnumImpl((m_component_name + ":air_blade").c_str(), getComponent(), new MSAnswerMapDevIO("air_blade", m_core.m_status, &SRTMinorServoGeneralStatus::getGregorianAirBladeStatus), true); m_last_executed_command_ptr = new baci::ROdouble((m_component_name + ":last_executed_command").c_str(), getComponent(), new MSAnswerMapDevIO("last_executed_command", m_core.m_status, &SRTMinorServoGeneralStatus::getLastExecutedCommand), true); + m_error_code_ptr = new ROEnumImpl((m_component_name + ":error_code").c_str(), getComponent(), + new MSGenericDevIO>(m_core.m_error_code), true); } catch(std::bad_alloc& ba) { @@ -105,7 +110,8 @@ void SRTMinorServoBossImpl::initialize() m_parser.add("setServoASConfiguration", new SP::function1>(this, &SRTMinorServoBossImpl::setASConfiguration), 1); m_parser.add("setServoOffset", new SP::function2, SP::I>(this, &SRTMinorServoBossImpl::setUserOffset), 2); m_parser.add("clearServoOffsets", new SP::function0(this, &SRTMinorServoBossImpl::clearOffsets), 0); - //m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); + m_parser.add("setGregorianCoverPosition", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianCoverPosition), 1); + m_parser.add("setGregorianAirBladeStatus", new SP::function1>(this, &SRTMinorServoBossImpl::setGregorianAirBladeStatus), 1); ACS_LOG(LM_FULL_INFO, "SRTMinorServoBossImpl::initialize()", (LM_NOTICE, "PARSER INITIALIZED")); @@ -335,6 +341,12 @@ void SRTMinorServoBossImpl::setGregorianCoverPosition(const char* position) m_core.setGregorianCoverPosition(std::string(position)); } +void SRTMinorServoBossImpl::setGregorianAirBladeStatus(const char* status) +{ + AUTO_TRACE("SRTMinorServoBossImpl::setGregorianAirBladeStatus()"); + m_core.setGregorianAirBladeStatus(std::string(status)); +} + CORBA::Boolean SRTMinorServoBossImpl::checkScan(const ACS::Time start_time, const MinorServoScan& scan_info, const Antenna::TRunTimeParameters& antenna_info, TRunTimeParameters_out ms_parameters) { AUTO_TRACE("SRTMinorServoBossImpl::checkScan()"); @@ -359,6 +371,12 @@ void SRTMinorServoBossImpl::preset(double elevation) m_core.preset(elevation); } +void SRTMinorServoBossImpl::reset() +{ + AUTO_TRACE("SRTMinorServoBossImpl::reset()"); + m_core.reset(); +} + CORBA::Boolean SRTMinorServoBossImpl::command(const char* cmd, CORBA::String_out answer) { AUTO_TRACE("SRTMinorServoBossImpl::command()"); @@ -416,7 +434,9 @@ GET_PROPERTY_REFERENCE(ROSRTMinorServoControlStatus, SRTMinorServoBossImpl, m_co GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_power_ptr, power); GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTMinorServoBossImpl, m_emergency_ptr, emergency); GET_PROPERTY_REFERENCE(ROSRTMinorServoGregorianCoverStatus, SRTMinorServoBossImpl, m_gregorian_cover_ptr, gregorian_cover); +GET_PROPERTY_REFERENCE(ROSRTMinorServoGregorianAirBladeStatus, SRTMinorServoBossImpl, m_air_blade_ptr, air_blade); GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTMinorServoBossImpl, m_last_executed_command_ptr, last_executed_command); +GET_PROPERTY_REFERENCE(ROSRTMinorServoError, SRTMinorServoBossImpl, m_error_code_ptr, error_code); #include MACI_DLL_SUPPORT_FUNCTIONS(SRTMinorServoBossImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 8afaab79f..f13092fb3 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -43,7 +43,6 @@ void SRTMinorServoParkThread::runLoop() catch(MinorServoErrors::MinorServoErrorsEx& ex) { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); this->setStopped(); return; } @@ -51,7 +50,7 @@ void SRTMinorServoParkThread::runLoop() if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= PARK_TIMEOUT) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::runLoop()", (LM_CRITICAL, "Timeout while performing a park operation.")); - m_core.setFailure(); + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -61,13 +60,13 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - //bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED ? true : false; + bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED; // Then we cycle through all the servos and make sure their operative mode is STOP - if(/*completed && */std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP ? true : false; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_STOP; })) { m_status = 1; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index a70f66795..d195b2bf1 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -67,7 +67,6 @@ void SRTMinorServoScanThread::onStop() if(m_error) // We didn't reach the end of the scan because of some error { // Should we set everything to failure? - m_core.setFailure(); return; } @@ -168,6 +167,7 @@ void SRTMinorServoScanThread::runLoop() else { m_error = true; + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -224,6 +224,7 @@ void SRTMinorServoScanThread::runLoop() { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); m_error = true; + m_core.setError(ERROR_COMMAND_ERROR); this->setStopped(); return; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index 1daa85968..c48f98d14 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -23,9 +23,9 @@ void SRTMinorServoSetupThread::onStart() m_status = 0; - //SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); - //m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); - //m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; + SRTMinorServoFocalConfiguration commanded_configuration = m_core.m_commanded_configuration.load(); + m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); + m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_NOTICE, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); } @@ -45,7 +45,6 @@ void SRTMinorServoSetupThread::onStop() catch(ComponentErrors::ComponentErrorsEx& ex) { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); } } } @@ -61,7 +60,6 @@ void SRTMinorServoSetupThread::runLoop() catch(MinorServoErrors::StatusErrorEx& ex) { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); this->setStopped(); return; } @@ -69,7 +67,7 @@ void SRTMinorServoSetupThread::runLoop() if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Timeout while performing a setup operation.")); - m_core.setFailure(); + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -98,32 +96,17 @@ void SRTMinorServoSetupThread::runLoop() servo->clearUserOffsets(); } - //m_status = 2; - //m_status = 100; - m_status = 5; + m_status = 2; break; } - /*case 100: // Send the STOW command to the gregorian cover - { - if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("Gregoriano", m_gregorian_cover_position)).checkOutput()) - { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK when setting the gregorian cover position.")); - m_core.setFailure(); - this->setStopped(); - return; - } - - m_status = 5; - break; - }*/ - /*case 2: // Send the SETUP command + case 2: // Send the SETUP command { try { if(!m_core.m_socket.sendCommand(SRTMinorServoCommandLibrary::setup(m_LDO_configuration)).checkOutput()) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Received NAK in response to a SETUP command.")); - m_core.setFailure(); + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -135,7 +118,7 @@ void SRTMinorServoSetupThread::runLoop() catch(...) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Communication error while sending a SETUP command.")); - m_core.setFailure(); + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -151,24 +134,21 @@ void SRTMinorServoSetupThread::runLoop() break; } - case 4: // Wait for the whole system to reach the desired configuration + case 4: // Wait for all the servos to reach the desired configuration { - // First we check the status of the gregorian cover - bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; - // Then we cycle through all the servos and make sure their operative mode is SETUP - if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool + if(std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool { ACSErr::Completion_var comp; - return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_SETUP ? true : false; + return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_SETUP; })) { m_status = 5; } break; - }*/ - case 5: // Load the servos coefficients and send a PRESET command + } + case 5: // Load the servos coefficients { for(const auto& [servo_name, servo] : m_core.m_servos) { @@ -190,38 +170,43 @@ void SRTMinorServoSetupThread::runLoop() catch(...) { ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, ("Error while loading a SETUP to servo'" + servo_name + "'.").c_str())); - m_core.setFailure(); + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } } - // This step is necessary because we have _ASACTIVE configurations that have a slightly different position from the commanded one - // Unfortunately, the Leonardo implementation accepts a fixed number of configurations, therefore we share the _ASACTIVE and AS not active configurations for each focal position - for(const auto& [servo_name, servo] : m_core.m_current_servos) + if(m_core.m_commanded_setup.find("_ASACTIVE") == std::string::npos) { - try - { - servo->preset(*servo->calcCoordinates(45)); - } - catch(MinorServoErrors::MinorServoErrorsEx& ex) + // We commanded a configuration which does not use the active surface, therefore we need to send some slightly different coordinates with a preset command + + for(const auto& [servo_name, servo] : m_core.m_current_servos) { - ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_core.setFailure(); - this->setStopped(); - return; + try + { + servo->preset(*servo->calcCoordinates(45)); + } + catch(MinorServoErrors::MinorServoErrorsEx& ex) + { + ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); + m_core.setError(ERROR_COMMAND_ERROR); + this->setStopped(); + return; + } } + m_status = 6; + } + else + { + // _ASACTIVE configuration, jump directly to state 7 + m_status = 7; } - m_status = 6; break; } - case 6: // Wait for the whole system to reach the PRESET configuration + case 6: // Wait for the used servos to reach the PRESET configuration { - // First we check the status of the gregorian cover - //bool completed = m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position ? true : false; - - if(/*completed && */std::all_of(m_core.m_current_servos.begin(), m_core.m_current_servos.end(), [this](const std::pair& servo) -> bool + if(std::all_of(m_core.m_current_servos.begin(), m_core.m_current_servos.end(), [this](const std::pair& servo) -> bool { ACSErr::Completion_var comp; return servo.second->operative_mode()->get_sync(comp.out()) == OPERATIVE_MODE_PRESET ? true : false; @@ -232,7 +217,16 @@ void SRTMinorServoSetupThread::runLoop() break; } - case 7: // Finally set all the variables values and eventually start the elevation tracking thread + case 7: // Check the status of the gregorian cover + { + if(m_core.m_status.getGregorianCoverPosition() == m_gregorian_cover_position) + { + m_status = 8; + } + + break; + } + case 8: // Finally set all the variables values and eventually start the elevation tracking thread { m_core.m_actual_setup = m_core.m_commanded_setup; m_core.m_starting.store(Management::MNG_FALSE); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index 7f4350101..b45fb40e5 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -4,8 +4,7 @@ using namespace MinorServo; SRTMinorServoTrackingThread::SRTMinorServoTrackingThread(const ACE_CString& name, SRTMinorServoBossCore& core, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time): ACS::Thread(name, response_time, sleep_time), - m_core(core), - m_error(false) + m_core(core) { AUTO_TRACE("SRTMinorServoTrackingThread::SRTMinorServoTrackingThread()"); } @@ -33,11 +32,6 @@ void SRTMinorServoTrackingThread::onStop() ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); m_core.m_elevation_tracking.store(Management::MNG_FALSE); - - if(m_error) - { - m_core.setFailure(); - } } void SRTMinorServoTrackingThread::runLoop() @@ -51,7 +45,6 @@ void SRTMinorServoTrackingThread::runLoop() catch(MinorServoErrors::MinorServoErrorsEx& ex) { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_error = true; this->setStopped(); return; } @@ -59,7 +52,7 @@ void SRTMinorServoTrackingThread::runLoop() if(m_core.m_motion_status.load() != MOTION_STATUS_TRACKING) { // System is not ready or is not configured for tracking yet, we wait, even though we should never get here - _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", "Waiting for the system to be configured for tracking!"); + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoTrackingThread::runLoop()", "Waiting for the system to be configured for tracking!"); return; } @@ -87,7 +80,7 @@ void SRTMinorServoTrackingThread::runLoop() } else { - m_error = true; + m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; } @@ -103,7 +96,7 @@ void SRTMinorServoTrackingThread::runLoop() } catch(ComponentErrors::ComponentErrorsEx& ex) { - _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoScanThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); + _IRA_LOGFILTER_LOG(LM_WARNING, "SRTMinorServoTrackingThread::runLoop()", (std::string(getReasonFromEx(ex)) + ": using a fixed elevation of 45° for tracking!").c_str()); m_core.m_elevation_tracking.store(Management::MNG_FALSE); } @@ -114,21 +107,21 @@ void SRTMinorServoTrackingThread::runLoop() catch(MinorServoErrors::MinorServoErrorsEx& ex) { ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); - m_error = true; + m_core.setError(ERROR_COMMAND_ERROR); this->setStopped(); return; } catch(std::exception& ex) { ACS_SHORT_LOG((LM_ERROR, ex.what())); - m_error = true; + m_core.setError(ERROR_COMMAND_ERROR); this->setStopped(); return; } catch(CORBA::Exception& ex) { ACS_SHORT_LOG((LM_ERROR, ex._info().c_str())); - m_error = true; + m_core.setError(ERROR_COMMAND_ERROR); this->setStopped(); return; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index 16fa1ebd6..ddad515e1 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -55,53 +55,70 @@ bool SRTProgramTrackMinorServoImpl::status() { bool status = SRTBaseMinorServoImpl::status(); - try + ACS::doubleSeq virtual_positions = m_status.getVirtualPositions(); + std::vector commanded_positions; + + SRTMinorServoOperativeMode operative_mode = m_status.getOperativeMode(); + if(operative_mode == OPERATIVE_MODE_PROGRAMTRACK) { - ACS::Time last_timestamp = m_status.getTimestamp(); + try + { + ACS::Time last_timestamp = m_status.getTimestamp(); - // The timestamp of the read positions always corresponds to the one we're asking since they both belong to the same STATUS command answer - // The tracking timestamp is interpolated instead - ACS::doubleSeq virtual_positions = m_status.getVirtualPositions(); - std::pair> tracking_point = m_tracking_queue.get(last_timestamp); + // The timestamp of the read positions always corresponds to the one we're asking since they both belong to the same STATUS command answer + // The tracking timestamp is interpolated instead + std::pair> tracking_point = m_tracking_queue.get(last_timestamp); + commanded_positions = tracking_point.second; - m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); + m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); - if(tracking_point.first < last_timestamp) + if(tracking_point.first < last_timestamp) + { + // We are past the last point of the trajectory, we concluded it + m_tracking.store(Management::MNG_FALSE); + m_tracking_queue.clear(); + m_tracking_error = std::vector(m_virtual_axes, 0.0); + return status; + } + } + catch(...) { - // We are past the last point of the trajectory, we concluded it - m_tracking.store(Management::MNG_FALSE); - m_tracking_queue.clear(); + // We might get here if m_tracking_queue is empty + // So whenever we just got a new setup or if we are past the last point inside the trajectory + m_tracking.store(Management::MNG_FALSE); // May be redundant but who cares? m_tracking_error = std::vector(m_virtual_axes, 0.0); + return status; } - else - { - bool is_tracking = true; + } + else if(operative_mode == OPERATIVE_MODE_SETUP || operative_mode == OPERATIVE_MODE_PRESET) + { + commanded_positions = m_commanded_virtual_positions; + } + else + { + m_tracking.store(Management::MNG_FALSE); + m_tracking_error = std::vector(m_virtual_axes, 0.0); + return status; + } - std::transform(virtual_positions.begin(), virtual_positions.end(), tracking_point.second.begin(), m_tracking_error.begin(), [](double current_pos, double commanded_pos) - { - return std::fabs(current_pos - commanded_pos); - }); + bool is_tracking = true; - for(size_t i = 0; i < m_virtual_axes; i++) - { - if(std::fabs(m_tracking_error[i]) > m_tracking_delta[i]) - { - is_tracking = false; - break; - } - } + std::transform(virtual_positions.begin(), virtual_positions.end(), commanded_positions.begin(), m_tracking_error.begin(), [](double current_pos, double commanded_pos) + { + return std::fabs(current_pos - commanded_pos); + }); - m_tracking.store(is_tracking ? Management::MNG_TRUE : Management::MNG_FALSE); - } - } - catch(...) + for(size_t i = 0; i < m_virtual_axes; i++) { - // We might get here if m_tracking_queue is empty - // So whenever we just got a new setup or if we are past the last point inside the trajectory - m_tracking.store(Management::MNG_FALSE); // May be redundant but who cares? - m_tracking_error = std::vector(m_virtual_axes, 0.0); + if(std::fabs(m_tracking_error[i]) > m_tracking_delta[i]) + { + is_tracking = false; + break; + } } + m_tracking.store(is_tracking ? Management::MNG_TRUE : Management::MNG_FALSE); + return status; } @@ -147,6 +164,7 @@ void SRTProgramTrackMinorServoImpl::programTrack(CORBA::Long trajectory_id, CORB if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, coordinates, point_id > 0 ? 0 : IRA::CIRATools::ACSTime2UNIXEpoch(point_time))).checkOutput()) { + m_error_code.store(ERROR_COMMAND_ERROR); _EXCPT(MinorServoErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::programTrack()").c_str()); ex.setReason("Received NAK in response to a PROGRAMTRACK command!"); ex.log(LM_DEBUG); diff --git a/SRT/Servers/SRTMinorServo/src/_airBlade.py b/SRT/Servers/SRTMinorServo/src/_airBlade.py new file mode 100644 index 000000000..820e945cf --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/_airBlade.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +# This is a python script that can be used to set the air blade status +# who when what +# Giuseppe Carboni(giuseppe.carboni@inaf.it) 18/05/2024 Creation + +from Acspy.Clients.SimpleClient import PySimpleClient +import ACSLog +import maciErrType +import maciErrTypeImpl +import ClientErrorsImpl +import MinorServoErrors +import ManagementErrorsImpl +import sys +from SimpleParserPy import add_user_message + +def main(): + compName = 'MINORSERVO/Boss' + + simpleClient = PySimpleClient() + + try: + component = simpleClient.getComponent(compName) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName(compName) + add_user_message(newEx, 'MinorServoBoss not ready or not properly configured') + simpleClient.disconnect() + sys.exit(1) + + try: + inputs = component.setGregorianAirBladeStatus(sys.argv[1]) + except MinorServoErrors.MinorServoErrorsEx as ex: + newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) + newEx.setReason('MinorServoBoss gregorian air blade status') + add_user_message(newEx, 'Unable to set the gregorian air blade status') + simpleClient.disconnect() + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/SRT/Servers/SRTMinorServo/src/_servoReset.py b/SRT/Servers/SRTMinorServo/src/_servoReset.py new file mode 100644 index 000000000..ab95fdc16 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/_servoReset.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +# This is a python script that can be used to send OR7 VBrain an emergency and +# alarms reset command +# who when what +# Giuseppe Carboni(giuseppe.carboni@inaf.it) 21/05/2024 Creation + +import sys +import time +import requests +import urllib3 +import cdbErrType +import ComponentErrorsImpl +import ClientErrorsImpl +from IRAPy import logger +from SimpleParserPy import add_user_message +from Acspy.Clients.SimpleClient import PySimpleClient +from Acspy.Util import ACSCorba +from MinorServo import ERROR_NO_ERROR + + +def get_cdb_args(): + try: + path = 'alma/MINORSERVO/VBrain' + dal = ACSCorba.cdb() + dao = dal.get_DAO_Servant(path) + field = 'Protocol' + protocol = dao.get_field_data(field).strip() + field = 'IPAddress' + address = dao.get_field_data(field).strip() + field = 'Port' + port = dao.get_field_data(field).strip() + except cdbErrType.CDBRecordDoesNotExistEx: + reason = f'CDB record {path} does not exist' + logger.logError(reason) + exc = ComponentErrorsImpl.CouldntGetAttributeExImpl() + exc.setData('Reason', reason) + raise exc + except cdbErrType.CDBFieldDoesNotExistEx: + reason = f'CDB field {field} does not exist' + logger.logError(reasong) + exc = ComponentErrorsImpl.ValidationErrorExImpl() + exc.setReason(reason) + raise exc + return protocol, address, port + + +def send_requests(protocol, address, port): + url = \ + f'{protocol}://{address}:{port}/Exporting/json/ExecuteCommand?name' + emergency = f'{url}=INAF_SRT_OR7_EMG_RESET_CMD' + alarms = f'{url}=INAF_SRT_OR7_RESET_CMD' + urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + try: + # We just try to send the commands, if it fails, we do nothing, it + # means there is a problem reaching the VBrain server so we cannot + # reset the status anyway + response = requests.get(emergency, verify=False, timeout=3) + time.sleep(3) + response = requests.get(alarms, verify=False, timeout=3) + except: + pass + + +if __name__ == "__main__": + # Retrieve the CDB attributes + protocol, address, port = get_cdb_args() + + # Retrieve the component + compName = 'MINORSERVO/Boss' + + simpleClient = PySimpleClient() + + try: + component = simpleClient.getComponent(compName) + # Check if we have an error, if not we just exit immediately + error_code = component.error_code.get_sync()[0] + if error_code == ERROR_NO_ERROR: + sys.exit(0) + except Exception as ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) + newEx.setComponentName(compName) + add_user_message(newEx, 'MinorServoBoss not ready or not properly configured') + simpleClient.disconnect() + sys.exit(1) + + # Send the reset commands to VBrain + send_requests(protocol, address, port) + + # Send the reset command to the component + component.reset() -- GitLab From 7de27f52318fd74f103faaff58981c456b95e750 Mon Sep 17 00:00:00 2001 From: Andrea Orlati Date: Tue, 4 Jun 2024 11:01:50 +0200 Subject: [PATCH 111/150] Added configuration files for Noto Active Surface (#872) --- .../ActiveSurfaceLan/src/.lanImpl.cpp.swo | Bin 0 -> 16384 bytes .../ActiveSurfaceLan/src/lanSocket.cpp | 2 +- .../src/ActiveSurfaceUSDImpl.cpp | 4 +- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR01/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR01/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR01/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR01/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR01/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR01/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR01/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR02/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR02/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR02/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR02/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR02/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR02/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR02/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR02/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR02/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR03/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR03/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR03/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR03/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR03/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR03/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR03/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR03/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR04/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR04/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR04/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR04/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR04/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR04/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR04/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR04/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR04/LAN12/LAN12.xml | 10 +- .../NotoActiveSurfaceContainer01.xml | 2 +- .../NotoActiveSurfaceContainer02.xml | 2 +- .../NotoActiveSurfaceContainer03.xml | 2 +- .../NotoActiveSurfaceContainer04.xml | 2 +- Noto/CDB/MACI/Managers/Manager/Manager.xml | 8 +- Noto/CDB/alma/AS/Boss/Boss.xml | 19 +- Noto/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml | 4 +- Noto/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml | 4 +- Noto/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml | 2 +- Noto/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml | 2 +- Noto/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml | 2 +- Noto/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml | 2 +- Noto/CDB/alma/AS/act_Noto_rev01.txt | 268 + Noto/CDB/alma/AS/act_Noto_rev02.txt | 244 + Noto/CDB/alma/AS/set_calibrate.py | 0 Noto/CDB/alma/AS/tab_convUSD.txt | 24 - Noto/CDB/alma/AS/tab_convUSD.txt.orig | 268 + Noto/CDB/alma/AS/tab_convUSD_S1.txt | 8 +- Noto/CDB/alma/AS/tab_convUSD_S2.txt | 8 +- Noto/CDB/alma/AS/tab_convUSD_S3.txt | 8 +- Noto/CDB/alma/AS/tab_convUSD_S4.txt | 8 +- .../include/NotoActiveSurfaceGUI.h | 3086 +- .../src/NotoActiveSurfaceCore.cpp | 52 +- .../src/NotoActiveSurfaceGUI.ui | 8624 +- .../src/NotoActiveSurfaceGUI.ui.17012024 | 161729 +++++++++++++++ .../CDB/MACI/Components/AS/Boss/Boss.xml | 5 +- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 14 + .../Components/AS/SECTOR01/LAN02/LAN02.xml | 13 + .../Components/AS/SECTOR01/LAN03/LAN03.xml | 14 + .../Components/AS/SECTOR01/LAN04/LAN04.xml | 13 + .../Components/AS/SECTOR01/LAN05/LAN05.xml | 14 + .../Components/AS/SECTOR01/LAN06/LAN06.xml | 13 + .../Components/AS/SECTOR01/LAN07/LAN07.xml | 15 + .../Components/AS/SECTOR01/LAN08/LAN08.xml | 13 + .../Components/AS/SECTOR01/LAN09/LAN09.xml | 14 + .../Components/AS/SECTOR01/LAN10/LAN10.xml | 13 + .../Components/AS/SECTOR01/LAN11/LAN11.xml | 14 + .../Components/AS/SECTOR01/LAN12/LAN12.xml | 13 + .../Components/AS/SECTOR02/LAN01/LAN01.xml | 14 + .../Components/AS/SECTOR02/LAN02/LAN02.xml | 13 + .../Components/AS/SECTOR02/LAN03/LAN03.xml | 14 + .../Components/AS/SECTOR02/LAN04/LAN04.xml | 13 + .../Components/AS/SECTOR02/LAN05/LAN05.xml | 14 + .../Components/AS/SECTOR02/LAN06/LAN06.xml | 13 + .../Components/AS/SECTOR02/LAN07/LAN07.xml | 15 + .../Components/AS/SECTOR02/LAN08/LAN08.xml | 13 + .../Components/AS/SECTOR02/LAN09/LAN09.xml | 14 + .../Components/AS/SECTOR02/LAN10/LAN10.xml | 13 + .../Components/AS/SECTOR02/LAN11/LAN11.xml | 14 + .../Components/AS/SECTOR02/LAN12/LAN12.xml | 13 + .../Components/AS/SECTOR03/LAN01/LAN01.xml | 14 + .../Components/AS/SECTOR03/LAN02/LAN02.xml | 13 + .../Components/AS/SECTOR03/LAN03/LAN03.xml | 14 + .../Components/AS/SECTOR03/LAN04/LAN04.xml | 13 + .../Components/AS/SECTOR03/LAN05/LAN05.xml | 14 + .../Components/AS/SECTOR03/LAN06/LAN06.xml | 13 + .../Components/AS/SECTOR03/LAN07/LAN07.xml | 15 + .../Components/AS/SECTOR03/LAN08/LAN08.xml | 13 + .../Components/AS/SECTOR03/LAN09/LAN09.xml | 14 + .../Components/AS/SECTOR03/LAN10/LAN10.xml | 13 + .../Components/AS/SECTOR03/LAN11/LAN11.xml | 14 + .../Components/AS/SECTOR03/LAN12/LAN12.xml | 13 + .../Components/AS/SECTOR04/LAN01/LAN01.xml | 14 + .../Components/AS/SECTOR04/LAN02/LAN02.xml | 13 + .../Components/AS/SECTOR04/LAN03/LAN03.xml | 14 + .../Components/AS/SECTOR04/LAN04/LAN04.xml | 13 + .../Components/AS/SECTOR04/LAN05/LAN05.xml | 14 + .../Components/AS/SECTOR04/LAN06/LAN06.xml | 13 + .../Components/AS/SECTOR04/LAN07/LAN07.xml | 15 + .../Components/AS/SECTOR04/LAN08/LAN08.xml | 13 + .../Components/AS/SECTOR04/LAN09/LAN09.xml | 14 + .../Components/AS/SECTOR04/LAN10/LAN10.xml | 13 + .../Components/AS/SECTOR04/LAN11/LAN11.xml | 14 + .../Components/AS/SECTOR04/LAN12/LAN12.xml | 13 + .../NotoActiveSurfaceContainer.xml | 2 +- .../NotoActiveSurfaceContainer01.xml | 27 + .../NotoActiveSurfaceContainer02.xml | 26 + .../NotoActiveSurfaceContainer03.xml | 26 + .../NotoActiveSurfaceContainer04.xml | 26 + Noto/Configuration/CDB/alma/AS/Boss/Boss.xml | 48 +- .../CDB/alma/AS/SECTOR01/LAN01/LAN01.xml | 6 + .../alma/AS/SECTOR01/LAN01/USD01/USD01.xml | 34 + .../alma/AS/SECTOR01/LAN01/USD02/USD02.xml | 34 + .../alma/AS/SECTOR01/LAN01/USD03/USD03.xml | 34 + .../alma/AS/SECTOR01/LAN01/USD04/USD04.xml | 368 + .../alma/AS/SECTOR01/LAN01/USD05/USD05.xml | 359 + .../alma/AS/SECTOR01/LAN01/USD06/USD06.xml | 349 + .../CDB/alma/AS/SECTOR01/LAN02/LAN02.xml | 6 + .../alma/AS/SECTOR01/LAN02/USD02/USD02.xml | 263 + .../alma/AS/SECTOR01/LAN02/USD03/USD03.xml | 260 + .../alma/AS/SECTOR01/LAN02/USD04/USD04.xml | 261 + .../alma/AS/SECTOR01/LAN02/USD05/USD05.xml | 261 + .../alma/AS/SECTOR01/LAN02/USD06/USD06.xml | 260 + .../CDB/alma/AS/SECTOR01/LAN03/LAN03.xml | 6 + .../alma/AS/SECTOR01/LAN03/USD01/USD01.xml | 274 + .../alma/AS/SECTOR01/LAN03/USD02/USD02.xml | 257 + .../alma/AS/SECTOR01/LAN03/USD03/USD03.xml | 258 + .../alma/AS/SECTOR01/LAN03/USD04/USD04.xml | 255 + .../alma/AS/SECTOR01/LAN03/USD05/USD05.xml | 255 + .../alma/AS/SECTOR01/LAN03/USD06/USD06.xml | 256 + .../CDB/alma/AS/SECTOR01/LAN04/LAN04.xml | 6 + .../alma/AS/SECTOR01/LAN04/USD02/USD02.xml | 240 + .../alma/AS/SECTOR01/LAN04/USD03/USD03.xml | 236 + .../alma/AS/SECTOR01/LAN04/USD04/USD04.xml | 235 + .../alma/AS/SECTOR01/LAN04/USD05/USD05.xml | 236 + .../alma/AS/SECTOR01/LAN04/USD06/USD06.xml | 235 + .../CDB/alma/AS/SECTOR01/LAN05/LAN05.xml | 6 + .../alma/AS/SECTOR01/LAN05/USD01/USD01.xml | 230 + .../alma/AS/SECTOR01/LAN05/USD02/USD02.xml | 230 + .../alma/AS/SECTOR01/LAN05/USD03/USD03.xml | 230 + .../alma/AS/SECTOR01/LAN05/USD04/USD04.xml | 230 + .../alma/AS/SECTOR01/LAN05/USD05/USD05.xml | 227 + .../alma/AS/SECTOR01/LAN05/USD06/USD06.xml | 225 + .../CDB/alma/AS/SECTOR01/LAN06/LAN06.xml | 6 + .../alma/AS/SECTOR01/LAN06/USD02/USD02.xml | 221 + .../alma/AS/SECTOR01/LAN06/USD03/USD03.xml | 220 + .../alma/AS/SECTOR01/LAN06/USD04/USD04.xml | 217 + .../alma/AS/SECTOR01/LAN06/USD05/USD05.xml | 217 + .../alma/AS/SECTOR01/LAN06/USD06/USD06.xml | 216 + .../CDB/alma/AS/SECTOR01/LAN07/LAN07.xml | 6 + .../alma/AS/SECTOR01/LAN07/USD01/USD01.xml | 219 + .../alma/AS/SECTOR01/LAN07/USD02/USD02.xml | 210 + .../alma/AS/SECTOR01/LAN07/USD03/USD03.xml | 211 + .../alma/AS/SECTOR01/LAN07/USD04/USD04.xml | 212 + .../alma/AS/SECTOR01/LAN07/USD05/USD05.xml | 212 + .../alma/AS/SECTOR01/LAN07/USD06/USD06.xml | 210 + .../alma/AS/SECTOR01/LAN07/USD07/USD07.xml | 209 + .../CDB/alma/AS/SECTOR01/LAN08/LAN08.xml | 6 + .../alma/AS/SECTOR01/LAN08/USD02/USD02.xml | 204 + .../alma/AS/SECTOR01/LAN08/USD03/USD03.xml | 204 + .../alma/AS/SECTOR01/LAN08/USD04/USD04.xml | 202 + .../alma/AS/SECTOR01/LAN08/USD05/USD05.xml | 202 + .../alma/AS/SECTOR01/LAN08/USD06/USD06.xml | 204 + .../CDB/alma/AS/SECTOR01/LAN09/LAN09.xml | 6 + .../alma/AS/SECTOR01/LAN09/USD01/USD01.xml | 200 + .../alma/AS/SECTOR01/LAN09/USD02/USD02.xml | 200 + .../alma/AS/SECTOR01/LAN09/USD03/USD03.xml | 200 + .../alma/AS/SECTOR01/LAN09/USD04/USD04.xml | 202 + .../alma/AS/SECTOR01/LAN09/USD05/USD05.xml | 200 + .../alma/AS/SECTOR01/LAN09/USD06/USD06.xml | 200 + .../CDB/alma/AS/SECTOR01/LAN10/LAN10.xml | 6 + .../alma/AS/SECTOR01/LAN10/USD02/USD02.xml | 195 + .../alma/AS/SECTOR01/LAN10/USD03/USD03.xml | 196 + .../alma/AS/SECTOR01/LAN10/USD04/USD04.xml | 195 + .../alma/AS/SECTOR01/LAN10/USD05/USD05.xml | 194 + .../alma/AS/SECTOR01/LAN10/USD06/USD06.xml | 194 + .../CDB/alma/AS/SECTOR01/LAN11/LAN11.xml | 6 + .../alma/AS/SECTOR01/LAN11/USD01/USD01.xml | 184 + .../alma/AS/SECTOR01/LAN11/USD02/USD02.xml | 195 + .../alma/AS/SECTOR01/LAN11/USD03/USD03.xml | 195 + .../alma/AS/SECTOR01/LAN11/USD04/USD04.xml | 194 + .../alma/AS/SECTOR01/LAN11/USD05/USD05.xml | 192 + .../alma/AS/SECTOR01/LAN11/USD06/USD06.xml | 190 + .../CDB/alma/AS/SECTOR01/LAN12/LAN12.xml | 6 + .../alma/AS/SECTOR01/LAN12/USD02/USD02.xml | 178 + .../alma/AS/SECTOR01/LAN12/USD03/USD03.xml | 175 + .../alma/AS/SECTOR01/LAN12/USD04/USD04.xml | 173 + .../alma/AS/SECTOR01/LAN12/USD05/USD05.xml | 173 + .../alma/AS/SECTOR01/LAN12/USD06/USD06.xml | 172 + .../CDB/alma/AS/SECTOR02/LAN01/LAN01.xml | 6 + .../alma/AS/SECTOR02/LAN01/USD01/USD01.xml | 34 + .../alma/AS/SECTOR02/LAN01/USD02/USD02.xml | 34 + .../alma/AS/SECTOR02/LAN01/USD03/USD03.xml | 34 + .../alma/AS/SECTOR02/LAN01/USD04/USD04.xml | 368 + .../alma/AS/SECTOR02/LAN01/USD05/USD05.xml | 359 + .../alma/AS/SECTOR02/LAN01/USD06/USD06.xml | 349 + .../CDB/alma/AS/SECTOR02/LAN02/LAN02.xml | 6 + .../alma/AS/SECTOR02/LAN02/USD02/USD02.xml | 263 + .../alma/AS/SECTOR02/LAN02/USD03/USD03.xml | 260 + .../alma/AS/SECTOR02/LAN02/USD04/USD04.xml | 261 + .../alma/AS/SECTOR02/LAN02/USD05/USD05.xml | 261 + .../alma/AS/SECTOR02/LAN02/USD06/USD06.xml | 260 + .../CDB/alma/AS/SECTOR02/LAN03/LAN03.xml | 6 + .../alma/AS/SECTOR02/LAN03/USD01/USD01.xml | 274 + .../alma/AS/SECTOR02/LAN03/USD02/USD02.xml | 257 + .../alma/AS/SECTOR02/LAN03/USD03/USD03.xml | 258 + .../alma/AS/SECTOR02/LAN03/USD04/USD04.xml | 255 + .../alma/AS/SECTOR02/LAN03/USD05/USD05.xml | 255 + .../alma/AS/SECTOR02/LAN03/USD06/USD06.xml | 256 + .../CDB/alma/AS/SECTOR02/LAN04/LAN04.xml | 6 + .../alma/AS/SECTOR02/LAN04/USD02/USD02.xml | 240 + .../alma/AS/SECTOR02/LAN04/USD03/USD03.xml | 236 + .../alma/AS/SECTOR02/LAN04/USD04/USD04.xml | 235 + .../alma/AS/SECTOR02/LAN04/USD05/USD05.xml | 236 + .../alma/AS/SECTOR02/LAN04/USD06/USD06.xml | 235 + .../CDB/alma/AS/SECTOR02/LAN05/LAN05.xml | 6 + .../alma/AS/SECTOR02/LAN05/USD01/USD01.xml | 230 + .../alma/AS/SECTOR02/LAN05/USD02/USD02.xml | 230 + .../alma/AS/SECTOR02/LAN05/USD03/USD03.xml | 230 + .../alma/AS/SECTOR02/LAN05/USD04/USD04.xml | 230 + .../alma/AS/SECTOR02/LAN05/USD05/USD05.xml | 227 + .../alma/AS/SECTOR02/LAN05/USD06/USD06.xml | 225 + .../CDB/alma/AS/SECTOR02/LAN06/LAN06.xml | 6 + .../alma/AS/SECTOR02/LAN06/USD02/USD02.xml | 221 + .../alma/AS/SECTOR02/LAN06/USD03/USD03.xml | 220 + .../alma/AS/SECTOR02/LAN06/USD04/USD04.xml | 217 + .../alma/AS/SECTOR02/LAN06/USD05/USD05.xml | 217 + .../alma/AS/SECTOR02/LAN06/USD06/USD06.xml | 216 + .../CDB/alma/AS/SECTOR02/LAN07/LAN07.xml | 6 + .../alma/AS/SECTOR02/LAN07/USD01/USD01.xml | 219 + .../alma/AS/SECTOR02/LAN07/USD02/USD02.xml | 210 + .../alma/AS/SECTOR02/LAN07/USD03/USD03.xml | 211 + .../alma/AS/SECTOR02/LAN07/USD04/USD04.xml | 212 + .../alma/AS/SECTOR02/LAN07/USD05/USD05.xml | 212 + .../alma/AS/SECTOR02/LAN07/USD06/USD06.xml | 210 + .../alma/AS/SECTOR02/LAN07/USD07/USD07.xml | 209 + .../CDB/alma/AS/SECTOR02/LAN08/LAN08.xml | 6 + .../alma/AS/SECTOR02/LAN08/USD02/USD02.xml | 204 + .../alma/AS/SECTOR02/LAN08/USD03/USD03.xml | 204 + .../alma/AS/SECTOR02/LAN08/USD04/USD04.xml | 202 + .../alma/AS/SECTOR02/LAN08/USD05/USD05.xml | 202 + .../alma/AS/SECTOR02/LAN08/USD06/USD06.xml | 204 + .../CDB/alma/AS/SECTOR02/LAN09/LAN09.xml | 6 + .../alma/AS/SECTOR02/LAN09/USD01/USD01.xml | 200 + .../alma/AS/SECTOR02/LAN09/USD02/USD02.xml | 200 + .../alma/AS/SECTOR02/LAN09/USD03/USD03.xml | 200 + .../alma/AS/SECTOR02/LAN09/USD04/USD04.xml | 202 + .../alma/AS/SECTOR02/LAN09/USD05/USD05.xml | 200 + .../alma/AS/SECTOR02/LAN09/USD06/USD06.xml | 200 + .../CDB/alma/AS/SECTOR02/LAN10/LAN10.xml | 6 + .../alma/AS/SECTOR02/LAN10/USD02/USD02.xml | 195 + .../alma/AS/SECTOR02/LAN10/USD03/USD03.xml | 196 + .../alma/AS/SECTOR02/LAN10/USD04/USD04.xml | 195 + .../alma/AS/SECTOR02/LAN10/USD05/USD05.xml | 194 + .../alma/AS/SECTOR02/LAN10/USD06/USD06.xml | 194 + .../CDB/alma/AS/SECTOR02/LAN11/LAN11.xml | 6 + .../alma/AS/SECTOR02/LAN11/USD01/USD01.xml | 184 + .../alma/AS/SECTOR02/LAN11/USD02/USD02.xml | 195 + .../alma/AS/SECTOR02/LAN11/USD03/USD03.xml | 195 + .../alma/AS/SECTOR02/LAN11/USD04/USD04.xml | 194 + .../alma/AS/SECTOR02/LAN11/USD05/USD05.xml | 192 + .../alma/AS/SECTOR02/LAN11/USD06/USD06.xml | 190 + .../CDB/alma/AS/SECTOR02/LAN12/LAN12.xml | 6 + .../alma/AS/SECTOR02/LAN12/USD02/USD02.xml | 178 + .../alma/AS/SECTOR02/LAN12/USD03/USD03.xml | 175 + .../alma/AS/SECTOR02/LAN12/USD04/USD04.xml | 173 + .../alma/AS/SECTOR02/LAN12/USD05/USD05.xml | 173 + .../alma/AS/SECTOR02/LAN12/USD06/USD06.xml | 172 + .../CDB/alma/AS/SECTOR03/LAN01/LAN01.xml | 6 + .../alma/AS/SECTOR03/LAN01/USD01/USD01.xml | 34 + .../alma/AS/SECTOR03/LAN01/USD02/USD02.xml | 34 + .../alma/AS/SECTOR03/LAN01/USD03/USD03.xml | 34 + .../alma/AS/SECTOR03/LAN01/USD04/USD04.xml | 368 + .../alma/AS/SECTOR03/LAN01/USD05/USD05.xml | 359 + .../alma/AS/SECTOR03/LAN01/USD06/USD06.xml | 349 + .../CDB/alma/AS/SECTOR03/LAN02/LAN02.xml | 6 + .../alma/AS/SECTOR03/LAN02/USD02/USD02.xml | 263 + .../alma/AS/SECTOR03/LAN02/USD03/USD03.xml | 260 + .../alma/AS/SECTOR03/LAN02/USD04/USD04.xml | 261 + .../alma/AS/SECTOR03/LAN02/USD05/USD05.xml | 261 + .../alma/AS/SECTOR03/LAN02/USD06/USD06.xml | 260 + .../CDB/alma/AS/SECTOR03/LAN03/LAN03.xml | 6 + .../alma/AS/SECTOR03/LAN03/USD01/USD01.xml | 274 + .../alma/AS/SECTOR03/LAN03/USD02/USD02.xml | 257 + .../alma/AS/SECTOR03/LAN03/USD03/USD03.xml | 258 + .../alma/AS/SECTOR03/LAN03/USD04/USD04.xml | 255 + .../alma/AS/SECTOR03/LAN03/USD05/USD05.xml | 255 + .../alma/AS/SECTOR03/LAN03/USD06/USD06.xml | 256 + .../CDB/alma/AS/SECTOR03/LAN04/LAN04.xml | 6 + .../alma/AS/SECTOR03/LAN04/USD02/USD02.xml | 240 + .../alma/AS/SECTOR03/LAN04/USD03/USD03.xml | 236 + .../alma/AS/SECTOR03/LAN04/USD04/USD04.xml | 235 + .../alma/AS/SECTOR03/LAN04/USD05/USD05.xml | 236 + .../alma/AS/SECTOR03/LAN04/USD06/USD06.xml | 235 + .../CDB/alma/AS/SECTOR03/LAN05/LAN05.xml | 6 + .../alma/AS/SECTOR03/LAN05/USD01/USD01.xml | 230 + .../alma/AS/SECTOR03/LAN05/USD02/USD02.xml | 230 + .../alma/AS/SECTOR03/LAN05/USD03/USD03.xml | 230 + .../alma/AS/SECTOR03/LAN05/USD04/USD04.xml | 230 + .../alma/AS/SECTOR03/LAN05/USD05/USD05.xml | 227 + .../alma/AS/SECTOR03/LAN05/USD06/USD06.xml | 225 + .../CDB/alma/AS/SECTOR03/LAN06/LAN06.xml | 6 + .../alma/AS/SECTOR03/LAN06/USD02/USD02.xml | 221 + .../alma/AS/SECTOR03/LAN06/USD03/USD03.xml | 220 + .../alma/AS/SECTOR03/LAN06/USD04/USD04.xml | 217 + .../alma/AS/SECTOR03/LAN06/USD05/USD05.xml | 217 + .../alma/AS/SECTOR03/LAN06/USD06/USD06.xml | 216 + .../CDB/alma/AS/SECTOR03/LAN07/LAN07.xml | 6 + .../alma/AS/SECTOR03/LAN07/USD01/USD01.xml | 219 + .../alma/AS/SECTOR03/LAN07/USD02/USD02.xml | 210 + .../alma/AS/SECTOR03/LAN07/USD03/USD03.xml | 211 + .../alma/AS/SECTOR03/LAN07/USD04/USD04.xml | 212 + .../alma/AS/SECTOR03/LAN07/USD05/USD05.xml | 212 + .../alma/AS/SECTOR03/LAN07/USD06/USD06.xml | 210 + .../alma/AS/SECTOR03/LAN07/USD07/USD07.xml | 209 + .../CDB/alma/AS/SECTOR03/LAN08/LAN08.xml | 6 + .../alma/AS/SECTOR03/LAN08/USD02/USD02.xml | 204 + .../alma/AS/SECTOR03/LAN08/USD03/USD03.xml | 204 + .../alma/AS/SECTOR03/LAN08/USD04/USD04.xml | 202 + .../alma/AS/SECTOR03/LAN08/USD05/USD05.xml | 202 + .../alma/AS/SECTOR03/LAN08/USD06/USD06.xml | 204 + .../CDB/alma/AS/SECTOR03/LAN09/LAN09.xml | 6 + .../alma/AS/SECTOR03/LAN09/USD01/USD01.xml | 200 + .../alma/AS/SECTOR03/LAN09/USD02/USD02.xml | 200 + .../alma/AS/SECTOR03/LAN09/USD03/USD03.xml | 200 + .../alma/AS/SECTOR03/LAN09/USD04/USD04.xml | 202 + .../alma/AS/SECTOR03/LAN09/USD05/USD05.xml | 200 + .../alma/AS/SECTOR03/LAN09/USD06/USD06.xml | 200 + .../CDB/alma/AS/SECTOR03/LAN10/LAN10.xml | 6 + .../alma/AS/SECTOR03/LAN10/USD02/USD02.xml | 195 + .../alma/AS/SECTOR03/LAN10/USD03/USD03.xml | 196 + .../alma/AS/SECTOR03/LAN10/USD04/USD04.xml | 195 + .../alma/AS/SECTOR03/LAN10/USD05/USD05.xml | 194 + .../alma/AS/SECTOR03/LAN10/USD06/USD06.xml | 194 + .../CDB/alma/AS/SECTOR03/LAN11/LAN11.xml | 6 + .../alma/AS/SECTOR03/LAN11/USD01/USD01.xml | 184 + .../alma/AS/SECTOR03/LAN11/USD02/USD02.xml | 195 + .../alma/AS/SECTOR03/LAN11/USD03/USD03.xml | 195 + .../alma/AS/SECTOR03/LAN11/USD04/USD04.xml | 194 + .../alma/AS/SECTOR03/LAN11/USD05/USD05.xml | 192 + .../alma/AS/SECTOR03/LAN11/USD06/USD06.xml | 190 + .../CDB/alma/AS/SECTOR03/LAN12/LAN12.xml | 6 + .../alma/AS/SECTOR03/LAN12/USD02/USD02.xml | 178 + .../alma/AS/SECTOR03/LAN12/USD03/USD03.xml | 175 + .../alma/AS/SECTOR03/LAN12/USD04/USD04.xml | 173 + .../alma/AS/SECTOR03/LAN12/USD05/USD05.xml | 173 + .../alma/AS/SECTOR03/LAN12/USD06/USD06.xml | 172 + .../CDB/alma/AS/SECTOR03/set_calibrate.py | 24 + .../CDB/alma/AS/SECTOR04/LAN01/LAN01.xml | 6 + .../alma/AS/SECTOR04/LAN01/USD01/USD01.xml | 34 + .../alma/AS/SECTOR04/LAN01/USD02/USD02.xml | 34 + .../alma/AS/SECTOR04/LAN01/USD03/USD03.xml | 34 + .../alma/AS/SECTOR04/LAN01/USD04/USD04.xml | 368 + .../alma/AS/SECTOR04/LAN01/USD05/USD05.xml | 359 + .../alma/AS/SECTOR04/LAN01/USD06/USD06.xml | 349 + .../CDB/alma/AS/SECTOR04/LAN02/LAN02.xml | 6 + .../alma/AS/SECTOR04/LAN02/USD02/USD02.xml | 263 + .../alma/AS/SECTOR04/LAN02/USD03/USD03.xml | 260 + .../alma/AS/SECTOR04/LAN02/USD04/USD04.xml | 261 + .../alma/AS/SECTOR04/LAN02/USD05/USD05.xml | 261 + .../alma/AS/SECTOR04/LAN02/USD06/USD06.xml | 260 + .../CDB/alma/AS/SECTOR04/LAN03/LAN03.xml | 6 + .../alma/AS/SECTOR04/LAN03/USD01/USD01.xml | 274 + .../alma/AS/SECTOR04/LAN03/USD02/USD02.xml | 257 + .../alma/AS/SECTOR04/LAN03/USD03/USD03.xml | 258 + .../alma/AS/SECTOR04/LAN03/USD04/USD04.xml | 255 + .../alma/AS/SECTOR04/LAN03/USD05/USD05.xml | 255 + .../alma/AS/SECTOR04/LAN03/USD06/USD06.xml | 256 + .../CDB/alma/AS/SECTOR04/LAN04/LAN04.xml | 6 + .../alma/AS/SECTOR04/LAN04/USD02/USD02.xml | 240 + .../alma/AS/SECTOR04/LAN04/USD03/USD03.xml | 236 + .../alma/AS/SECTOR04/LAN04/USD04/USD04.xml | 235 + .../alma/AS/SECTOR04/LAN04/USD05/USD05.xml | 236 + .../alma/AS/SECTOR04/LAN04/USD06/USD06.xml | 235 + .../CDB/alma/AS/SECTOR04/LAN05/LAN05.xml | 6 + .../alma/AS/SECTOR04/LAN05/USD01/USD01.xml | 230 + .../alma/AS/SECTOR04/LAN05/USD02/USD02.xml | 230 + .../alma/AS/SECTOR04/LAN05/USD03/USD03.xml | 230 + .../alma/AS/SECTOR04/LAN05/USD04/USD04.xml | 230 + .../alma/AS/SECTOR04/LAN05/USD05/USD05.xml | 227 + .../alma/AS/SECTOR04/LAN05/USD06/USD06.xml | 225 + .../CDB/alma/AS/SECTOR04/LAN06/LAN06.xml | 6 + .../alma/AS/SECTOR04/LAN06/USD02/USD02.xml | 221 + .../alma/AS/SECTOR04/LAN06/USD03/USD03.xml | 220 + .../alma/AS/SECTOR04/LAN06/USD04/USD04.xml | 217 + .../alma/AS/SECTOR04/LAN06/USD05/USD05.xml | 217 + .../alma/AS/SECTOR04/LAN06/USD06/USD06.xml | 216 + .../CDB/alma/AS/SECTOR04/LAN07/LAN07.xml | 6 + .../alma/AS/SECTOR04/LAN07/USD01/USD01.xml | 219 + .../alma/AS/SECTOR04/LAN07/USD02/USD02.xml | 210 + .../alma/AS/SECTOR04/LAN07/USD03/USD03.xml | 211 + .../alma/AS/SECTOR04/LAN07/USD04/USD04.xml | 212 + .../alma/AS/SECTOR04/LAN07/USD05/USD05.xml | 212 + .../alma/AS/SECTOR04/LAN07/USD06/USD06.xml | 210 + .../alma/AS/SECTOR04/LAN07/USD07/USD07.xml | 209 + .../CDB/alma/AS/SECTOR04/LAN08/LAN08.xml | 6 + .../alma/AS/SECTOR04/LAN08/USD02/USD02.xml | 204 + .../alma/AS/SECTOR04/LAN08/USD03/USD03.xml | 204 + .../alma/AS/SECTOR04/LAN08/USD04/USD04.xml | 202 + .../alma/AS/SECTOR04/LAN08/USD05/USD05.xml | 202 + .../alma/AS/SECTOR04/LAN08/USD06/USD06.xml | 204 + .../CDB/alma/AS/SECTOR04/LAN09/LAN09.xml | 6 + .../alma/AS/SECTOR04/LAN09/USD01/USD01.xml | 200 + .../alma/AS/SECTOR04/LAN09/USD02/USD02.xml | 200 + .../alma/AS/SECTOR04/LAN09/USD03/USD03.xml | 200 + .../alma/AS/SECTOR04/LAN09/USD04/USD04.xml | 202 + .../alma/AS/SECTOR04/LAN09/USD05/USD05.xml | 200 + .../alma/AS/SECTOR04/LAN09/USD06/USD06.xml | 200 + .../CDB/alma/AS/SECTOR04/LAN10/LAN10.xml | 6 + .../alma/AS/SECTOR04/LAN10/USD02/USD02.xml | 195 + .../alma/AS/SECTOR04/LAN10/USD03/USD03.xml | 196 + .../alma/AS/SECTOR04/LAN10/USD04/USD04.xml | 195 + .../alma/AS/SECTOR04/LAN10/USD05/USD05.xml | 194 + .../alma/AS/SECTOR04/LAN10/USD06/USD06.xml | 194 + .../CDB/alma/AS/SECTOR04/LAN11/LAN11.xml | 6 + .../alma/AS/SECTOR04/LAN11/USD01/USD01.xml | 184 + .../alma/AS/SECTOR04/LAN11/USD02/USD02.xml | 195 + .../alma/AS/SECTOR04/LAN11/USD03/USD03.xml | 195 + .../alma/AS/SECTOR04/LAN11/USD04/USD04.xml | 194 + .../alma/AS/SECTOR04/LAN11/USD05/USD05.xml | 192 + .../alma/AS/SECTOR04/LAN11/USD06/USD06.xml | 190 + .../CDB/alma/AS/SECTOR04/LAN12/LAN12.xml | 6 + .../alma/AS/SECTOR04/LAN12/USD02/USD02.xml | 178 + .../alma/AS/SECTOR04/LAN12/USD03/USD03.xml | 175 + .../alma/AS/SECTOR04/LAN12/USD04/USD04.xml | 173 + .../alma/AS/SECTOR04/LAN12/USD05/USD05.xml | 173 + .../alma/AS/SECTOR04/LAN12/USD06/USD06.xml | 172 + .../CDB/alma/AS/SECTOR04/set_calibrate.py | 24 + .../CDB/alma/AS/act_Noto_rev01.txt | 268 + .../CDB/alma/AS/act_Noto_rev02.txt | 244 + .../Configuration/CDB/alma/AS/act_new_lut.txt | 1116 + Noto/Configuration/CDB/alma/AS/act_rev02.txt | 1116 + .../CDB/alma/AS/actuatorsCorrections.txt | 100440 +++++++++ .../CDB/alma/AS/actuatorsCorrections_FEM.txt | 5580 + .../AS/actuatorsCorrections_FEM_Initial.txt | 1116 + .../Configuration/CDB/alma/AS/default_lut.txt | 1116 + Noto/Configuration/CDB/alma/AS/make_lan.py | 16 + Noto/Configuration/CDB/alma/AS/new_lut.txt | 1116 + .../CDB/alma/AS/set_calibrate.py | 24 + .../Configuration/CDB/alma/AS/tab_convUSD.txt | 244 + .../CDB/alma/AS/tab_convUSD.txt.Circles | 1116 + .../CDB/alma/AS/tab_convUSD.txt.Sectors | 1116 + .../CDB/alma/AS/tab_convUSD.txt.orig | 268 + .../CDB/alma/AS/tab_convUSD_S1.txt | 61 + .../CDB/alma/AS/tab_convUSD_S2.txt | 61 + .../CDB/alma/AS/tab_convUSD_S3.txt | 61 + .../CDB/alma/AS/tab_convUSD_S4.txt | 61 + Noto/Configuration/CDB/alma/AS/usd_pos.txt | 24 + .../include/NotoActiveSurfaceBossCore.h | 6 +- .../src/NotoActiveSurfaceBossCore.cpp | 43 +- .../src/NotoActiveSurfaceBossImpl.cpp | 4 +- .../src/NotoActiveSurfaceBossSectorThread.cpp | 7 +- 515 files changed, 343735 insertions(+), 5177 deletions(-) create mode 100644 Common/Servers/ActiveSurfaceLan/src/.lanImpl.cpp.swo create mode 100644 Noto/CDB/alma/AS/act_Noto_rev01.txt create mode 100644 Noto/CDB/alma/AS/act_Noto_rev02.txt mode change 100644 => 100755 Noto/CDB/alma/AS/set_calibrate.py create mode 100644 Noto/CDB/alma/AS/tab_convUSD.txt.orig create mode 100755 Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui.17012024 create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml create mode 100644 Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer02/NotoActiveSurfaceContainer02.xml create mode 100644 Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer03/NotoActiveSurfaceContainer03.xml create mode 100644 Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer04/NotoActiveSurfaceContainer04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD07/USD07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD07/USD07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD07/USD07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD06/USD06.xml create mode 100755 Noto/Configuration/CDB/alma/AS/SECTOR03/set_calibrate.py create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD07/USD07.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD01/USD01.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD06/USD06.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD02/USD02.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD03/USD03.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD04/USD04.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD05/USD05.xml create mode 100644 Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD06/USD06.xml create mode 100755 Noto/Configuration/CDB/alma/AS/SECTOR04/set_calibrate.py create mode 100644 Noto/Configuration/CDB/alma/AS/act_Noto_rev01.txt create mode 100644 Noto/Configuration/CDB/alma/AS/act_Noto_rev02.txt create mode 100644 Noto/Configuration/CDB/alma/AS/act_new_lut.txt create mode 100644 Noto/Configuration/CDB/alma/AS/act_rev02.txt create mode 100644 Noto/Configuration/CDB/alma/AS/actuatorsCorrections.txt create mode 100644 Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM.txt create mode 100644 Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM_Initial.txt create mode 100644 Noto/Configuration/CDB/alma/AS/default_lut.txt create mode 100755 Noto/Configuration/CDB/alma/AS/make_lan.py create mode 100644 Noto/Configuration/CDB/alma/AS/new_lut.txt create mode 100755 Noto/Configuration/CDB/alma/AS/set_calibrate.py create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD.txt create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Circles create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Sectors create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.orig create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD_S1.txt create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD_S2.txt create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD_S3.txt create mode 100644 Noto/Configuration/CDB/alma/AS/tab_convUSD_S4.txt create mode 100644 Noto/Configuration/CDB/alma/AS/usd_pos.txt diff --git a/Common/Servers/ActiveSurfaceLan/src/.lanImpl.cpp.swo b/Common/Servers/ActiveSurfaceLan/src/.lanImpl.cpp.swo new file mode 100644 index 0000000000000000000000000000000000000000..b0168aaf16d292964df33b58f1e854804813340b GIT binary patch literal 16384 zcmYc?2=nw+FxN9-U|?VnU|?9#kdZq5GdGJ02NOd|W^r1-$sQwQaaQllX-8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OgD?aVQy3V685kJEK?48+3=FXT|7(5*hEx0u3@7;+7%KP~7|Qq=7>xND7!3It z7{vG)7%uWLFs$NZU|7z_z_5&ufkA?gf#C)(1H(*S28J2D3=GqF85p8?85kmX85qKO z85rbv85pE_85mykFfhF2VPLq;!@zKohk;=?4+Fz`9tMWBJPZu0c^DYdco-Ozco-Oj zc^DY@c^DX2c^DYhaWgP@b2Biwax*YEaWgRdTK5;NGeB@wY*v-Mfu!Dnvp__w&p_7Awp@V~gp@4&d zA&-NBA%=s2!Igu7L63uhL4$*VL5+ifL6w7nfrEpAfsKQK;R`zh!(Da;hGXmu3= z28MVx28K8`1_os|1_lK-28J)J3=E%H85j<;GBC8UGBAX&GBEsNVPLq#!oX0@!oc9e z!ocv6nSo&&GXp~$GXsMGGXukACI*I0ObiT(ObiSjOprJe1H~Kl(-kKtCunhoZC+}* zf`X%Suxn9KNM%8)zqgeYgy-+=oS$2elUkCQpQoW|&A`c7tB{&goT`wSrcsnyTwrVK z=Mf^1Sy;MCXmbM(e#qi0@OVoqjCP-<~OeqM1Z)oj-_(Nw5bP~ha$*U!uY z1zJvONvc9oYC%pVE~f{a95P(6{RNUm!%dZCgr3m6oc(jC@9KL z%1O;FX5i#hP*6|+xf2?>@F;<}D#X9EgnF(r0=r6qQ$b%J=8}^9(h@wb2n}`#$;?g7 zr=}|mkz5fP?4kg50wjqmfYP`lS||jiCgV4wiDn^Rw30c*UZ78T_e zF>rD^ItRzQxH^Tp#|JnDIr?f~PyZU4N;*oQ>}92zqND?2fHMS$p4jsyH{kI6t@~u|&bvRv{-b50VC~ ztb$w}T_Pdbmx0qcI5pX^C^a!CwK%`DC^lsi^d2otpwKu!jk zi(E!%IQs`VIa*oyz0cKusWpPPru4_ed zY5}Ow(_~;^sD-#5SG?6hOE4uJ1tpi%;*z5L%FMiU1=V6bJv}8Ig}lVvR1Hl~1cD+T zGYH_?!QO|OWn~2u*3bkw0F;?)89*cmLxNwyR>3dS$Hy8joRSJIlOVDXVNeo)@IkR$ z%}|z~nSuz-#H9Svl8}7Ir2L{1TH2GGlbVP0s)w zkOVlhfKqO1Q4uKFa;6p)feRgQ3_|16Ge8Gy3MgYi;}#la@bU^&G=WnauAB=EEF~Q! z&j1C-l$4^>;$kZW)nX+bG-rV5adJ#fPAvu{jQk=Bq6*q} z1GUyb362vK*tRJpsksH9mK`X>ojrpbL-O-;imj~DQ%hW&!V+^zQ#I04OPurbN)j{k zQj0+Ab~BSxi#0TLltB8Gbif8^f+LD_BRm73;jX0P82~YaffG`3q!ty~8dx)MhWiJ( zfTJ4B^9*vdvT_bCDFUS_&j4!%P8YBOuq&)Vda)O?(73izK+hN$MGUe6B1#zo)`8P^ zQ7Nc&v33TfbqE`r?W-9WKvii;Vo7Ond~tyWsHh0?&&khA*N6vI8`?@%#b8M#9R+Y4 zASd^Gtl3J8mT#}g#s>{I+2bIkbr|Bf4 zCn!xF1_mvC1}z15UtduAS5Q#MD$P+aGB7X&wPcG@6G8PcCnvaN%b=y83k3>TSWqbf z6oZyRc}70euJVl3JP5NqBe8@*i$P04$w5O|Q$fWu#R^tsf)=FflqneM87deV7#ivt z80#9DC>U5;8Jby{7%3#{Ex$iN`P3|apVo8OxT@G>y8 z@-i?a@iH(Z@G>xH^D;1;;$dJ|%)`Lo$iu)O!Nb6?jhlg?hMR#wmYad$6Bh$R9~T2d zAr}LKBo_k%0~Z6sA5I2_i<}G$`#2dGVmKKX961>n9&#`+9OGbMNaJ8&@aAA(c+Jkh zaDknHp@5x%A%&fR!G)cH;X4}x!v{77hI4ET4Ebyf4B2c942f(E4F6df82*6z+pG)> zKUovtoz#z=R!0?xuf#EkZ1H&(728N%^3=Er@85sJQ85pvd85mTU85oqA z85oq985l&E85o3_Az>{D3UBK7+eb~LLI~(<#mC3z`{&2U$7|^`FfiyN$`k?x2To}% zeFk4gXU}*SAD{T((0~9?qsT4P&pE`?-!E7LnjbZhvM4AAJ30r$3rLsLw9LHJVo;XF zbdEx_0?2d)7at#m;?e?8?W>ShnwJbJ7mF2Q;pHIQd0=nVGH@29mXsFdfttAmdhtc6 zC6J*UN9SNGD@b({UzS(|mbOI_w6coNODrnNFW1P8hg3uH#Ra-{po$38^$JQ&OD#&x zONMrCGSiTi+1eUtDnPA8Gcq#=)Gh;e^x)PPloY{=SSx6ir=ba}d!fBHEFCjY&kSlw zK~X-Y-=LKty6>RE$o>OYlLWm7Q-$d}BqLG%2bG9N@gdk8B0Pwh1RznX5Ul_X6oulF z(zG;eF%MP;i+*s+723T(v??L3f4}^app;5Tn-W{QA8CB9C^b1W*d-vbNJ&#KJ+%a8 zl4}JhK4Ig6@U|tSg$z>!>A5@SrnnYC8?Y2v2Dc4TV}pjB{2aX%@{1JmOEOZ6K*L|0 zwF(NLfjQ2!{2~p|I7Fr`q|2{uXswW`V5eYcovEv!)u6#gtX3n&7-?lSXv7h#)sO&(3@=i}a_D$F zD4GqxT`f*d(7+mEIIt)+IW@B^)u}WsEwxAkl$Ldha#Hg^Jy%XnyyN!h>C`VVn;K4r zb~d37x3z^2--BF(Q5vBQ+tb1U;Oqe#!A~s9%t=8E-=l{CB>t$CVbFs@7nEBRK;;b9 z!D6&QeC%$cR*u4O8z?&|fE@=Nv4IYwgNj;or%*SCVK@bpy+GFL>nk9S=cBs<5?R#C zY|tdDU~3B<)&~a%G&Eq5qo)9xe#y%N58{D_9nkV4`tUqBBa$>G5Arz$qw<^#44mMa z2|R29s;U$~r9!k*sGFN>P_So|Yb??TJ-D!d)sV(`#!=v{0LZW+`j9e08r(u5c6=UE zHR~YhQBwdrUK2V#k7IaVM*-2ofU#UFAj7}VmLX^kOxF&=0kyM{CNseeBL(ne1@>7o zNb3km7nYGxq!tn=&XHy?q3O9A6p - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index 4b3522963..050e8e306 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index a3932fb0f..7cdb94929 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index c9a433cf6..dcbbe593d 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index d74ed9e86..dc5602949 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index 993fa350a..652a3c061 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index 3a1c154f3..35c89cbb4 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index 0324beead..392fc44f2 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index e8bf90c0a..b7f32fe60 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index 3431d017a..5a59ce0fc 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index 69e644c5e..0be50246b 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index a6c92eccb..dfe371f22 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index cf23890bc..8df995439 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index 89ad64b72..f26f17573 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index a54a36e50..dc8f7877a 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index ae52cdb6f..c4dbba796 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 6189e0314..ab8433fc2 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index b045adcb8..735eb4dd9 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index c4d533abb..c74135584 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index 562c49a0c..987b353b0 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index d4d2218ad..5e3dd19e8 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index 55b2ca192..2d4b33798 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index 8dd92a804..6486358ab 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index 1191c5290..576db0031 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 51df6da54..770f2d052 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index c65f8e2fc..08d3df69d 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index 63553faec..dec3ad7f5 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index 76556b57d..8d93e132c 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index 92fbd9c0f..796706d57 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index f32fd14c7..d03322121 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index 4851ddb06..5770ce189 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index ab77560a7..6f5f95a7a 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index bf4571f66..62a2e5acd 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index 553d4f875..fe5ec5d7f 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index 4bee18c9e..75ce4fbf2 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index cc2912b0f..d24d7d837 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index e127e03f2..0a5287093 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index e4721cfea..4b4a8bdf9 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index fd2b65796..0f0526838 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index adccb6705..4ec04d4fc 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index 2cba33a2c..79f0b6b69 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index dda36e18f..0d1a086be 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index 7ca66d0a7..28eb5bddc 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index 3d8a12d9c..09308e304 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index 800bd5580..9b1ea6108 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index fe8b561ec..b76305566 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 283a5148a..52c2bca08 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 9fad44b79..b888dceb6 100644 --- a/Noto/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/Noto/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="NotoActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Noto/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml b/Noto/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml index 62ca03e37..9fecba35d 100644 --- a/Noto/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml +++ b/Noto/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml @@ -11,7 +11,7 @@ ImplLang="cpp"> - + - + - + - + - - + - + \ No newline at end of file diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml b/Noto/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml index b6fbe43e5..a354d4a3c 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml b/Noto/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml index 1b334a0fa..73d025de4 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml b/Noto/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml index 91cdfe7d5..28d947e10 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml b/Noto/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml index efb60ef7f..57ae9510d 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml b/Noto/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml index 1a8419940..c34ec41d4 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml b/Noto/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml index bcb69e43f..c6448ad13 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml b/Noto/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml index d968e82a9..1e978e459 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml b/Noto/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml index ff0db82c6..f29a4c334 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml b/Noto/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml index 31ffa7f95..03f1e2ae4 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml b/Noto/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml index a19bbe92b..677e6cd1b 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml b/Noto/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml index 8636caa7c..79b661ddc 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml b/Noto/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml index 8fa8b7b4b..a62a80c7a 100644 --- a/Noto/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml +++ b/Noto/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml @@ -1,6 +1,6 @@ - + - \ No newline at end of file + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml b/Noto/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml index f7a54191a..9a7000514 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml b/Noto/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml index f9645aa41..49a1274e9 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml b/Noto/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml index e5ee2228b..0cf6161f1 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml b/Noto/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml index 9f91f3325..2f253082d 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml b/Noto/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml index 7ed468cd1..e7a7e499b 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml b/Noto/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml index 6e00158e1..8fb681373 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml b/Noto/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml index 8cbd935f7..fd124292c 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml b/Noto/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml index c3a35ad08..6c9232eae 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml b/Noto/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml index b3e85d087..3a107a429 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml b/Noto/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml index cf75c96c4..0446f8f7e 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml b/Noto/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml index 24a3e7c80..098500d9f 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml b/Noto/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml index a24d765b9..decc024bc 100644 --- a/Noto/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml +++ b/Noto/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml b/Noto/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml index ae9ab42e8..6634b168f 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml b/Noto/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml index a67ec98c6..ad7363dae 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml b/Noto/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml index 927e02d61..ccbadf57e 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml b/Noto/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml index 56eed4404..0b19775c0 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml b/Noto/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml index d5de759f2..d41d490b1 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml b/Noto/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml index 6d67a1002..a6868d954 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml b/Noto/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml index 27b9525d1..8014987fc 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml b/Noto/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml index 042417667..9efb9e5a9 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml b/Noto/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml index 64c31f2a4..9d6d12b40 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml b/Noto/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml index e7a2c9a62..1850e83c8 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml b/Noto/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml index 8009885a8..32d556537 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml b/Noto/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml index b09da450b..6a7b82286 100644 --- a/Noto/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml +++ b/Noto/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml b/Noto/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml index 520bb5658..816857770 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml b/Noto/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml index 05a88b247..4013ff03b 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml b/Noto/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml index 19fa270a2..a7535d0fd 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml b/Noto/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml index 29480c555..cbf40b8f1 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml b/Noto/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml index 0be38ab8c..86a008a2a 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml b/Noto/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml index e6e49a272..5081bc647 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml b/Noto/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml index 7c147935a..5c0a8d4d3 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml b/Noto/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml index 91d95e217..c61ce2391 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml b/Noto/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml index b50fb501a..4d6f09032 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml b/Noto/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml index 05e546d7d..08432c4be 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml b/Noto/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml index e7222cde7..b73771eb6 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml b/Noto/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml index eb5749789..d6151cecf 100644 --- a/Noto/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml +++ b/Noto/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml @@ -1,6 +1,6 @@ - + diff --git a/Noto/CDB/alma/AS/act_Noto_rev01.txt b/Noto/CDB/alma/AS/act_Noto_rev01.txt new file mode 100644 index 000000000..9dc044a0b --- /dev/null +++ b/Noto/CDB/alma/AS/act_Noto_rev01.txt @@ -0,0 +1,268 @@ +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.104 0.003 -0.309 -0.422 -0.567 -0.696 0.000 +0.110 -0.150 -0.506 -0.652 -0.876 -1.127 0.000 +0.171 0.108 -0.152 -0.367 -0.466 -0.738 0.000 +0.101 -0.122 -0.252 -0.492 -0.660 -0.900 0.000 +0.008 0.027 -0.075 -0.154 -0.300 -0.523 0.000 +-0.193 -0.267 -0.042 -0.085 -0.184 -0.295 0.000 +-0.154 -0.152 -0.063 -0.055 -0.071 -0.146 0.000 +-0.145 -0.084 0.043 0.055 0.035 0.081 0.000 +-0.399 -0.239 0.056 0.192 0.314 0.411 0.000 +-0.424 -0.403 -0.218 -0.062 0.208 0.154 0.000 +-0.242 -0.074 -0.091 0.133 0.347 0.522 0.000 +-0.200 -0.210 0.110 0.290 0.485 0.560 0.000 +-0.225 -0.179 -0.052 0.172 0.345 0.492 0.000 +-0.253 -0.237 -0.032 0.157 0.271 0.305 0.000 +-0.011 0.009 0.016 0.040 0.170 0.196 0.000 +0.091 0.066 0.067 0.183 0.142 0.145 0.000 +0.425 0.341 -0.143 -0.195 -0.323 -0.505 0.000 +0.382 0.423 0.161 0.045 -0.082 -0.240 0.000 +0.509 0.493 -0.093 -0.290 -0.437 -0.570 0.000 +0.406 0.449 0.269 0.062 -0.029 -0.136 0.000 +0.253 0.244 -0.130 -0.368 -0.493 -0.663 0.000 +0.225 0.360 0.184 0.123 0.016 -0.107 0.000 +0.049 0.088 -0.250 -0.340 -0.467 -0.659 0.000 +0.375 0.468 0.409 0.365 0.356 0.112 0.000 +0.218 0.175 -0.024 -0.233 -0.346 -0.433 0.000 +0.391 0.507 0.362 0.267 0.175 0.104 0.000 +0.249 0.237 -0.059 -0.170 -0.392 -0.439 0.000 +0.440 0.652 0.203 0.205 0.053 -0.131 0.000 +0.289 0.366 -0.157 -0.329 -0.560 -0.740 0.000 +0.747 0.525 0.482 0.424 0.128 -0.041 0.000 +0.481 0.365 0.118 0.031 -0.273 -0.455 0.000 +0.850 0.878 0.675 0.466 0.258 0.095 0.000 +0.391 0.202 0.055 -0.108 -0.214 -0.398 0.000 +0.412 0.402 0.388 0.455 0.460 0.418 0.000 +0.020 0.000 -0.123 0.047 0.014 0.077 0.000 +0.033 0.126 0.165 0.327 0.579 0.612 0.000 +-0.219 -0.308 -0.278 -0.035 0.258 0.339 0.000 +-0.026 0.133 0.036 0.248 0.526 0.585 0.000 +-0.039 -0.069 -0.125 0.060 0.303 0.443 0.000 +-0.097 -0.062 -0.076 0.117 0.291 0.386 0.000 +-0.320 -0.233 -0.182 0.098 0.277 0.288 0.000 +-0.288 -0.107 -0.064 -0.013 -0.148 -0.089 0.000 +-0.258 -0.162 -0.328 -0.167 -0.153 -0.196 0.000 +0.044 0.048 -0.176 -0.224 -0.227 -0.303 0.000 +0.162 0.101 -0.005 -0.132 -0.305 -0.317 0.000 +0.220 0.104 -0.209 -0.331 -0.528 -0.691 0.000 +0.219 0.113 -0.115 -0.269 -0.471 -0.550 0.000 +0.213 0.097 -0.195 -0.383 -0.610 -0.744 0.000 +0.692 0.475 -0.020 -0.365 -0.704 -1.251 0.000 +0.339 0.261 -0.274 -0.604 -0.969 -1.409 0.000 +0.605 0.363 0.037 -0.364 -0.725 -1.105 0.000 +0.382 0.203 -0.041 -0.350 -0.665 -0.989 0.000 +0.543 0.293 0.170 -0.222 -0.517 -0.811 0.000 +0.023 0.039 0.019 -0.109 -0.290 -0.530 0.000 +0.182 0.191 0.239 0.034 -0.121 -0.352 0.000 +-0.524 -0.250 0.228 0.368 0.513 0.435 0.000 +-0.560 -0.340 0.193 0.347 0.495 0.509 0.000 +-0.983 -0.575 -0.008 0.405 0.660 0.767 0.000 +-0.635 -0.455 0.184 0.456 0.605 0.600 0.000 +-0.861 -0.533 -0.298 -0.063 0.025 0.109 0.000 +-0.152 -0.166 0.075 0.223 0.205 0.170 0.000 +0.102 0.054 0.020 0.065 -0.014 -0.180 0.000 +0.687 0.405 0.252 0.182 -0.014 -0.159 0.000 +0.636 0.426 -0.043 -0.173 -0.414 -0.534 0.000 +0.616 0.444 0.118 -0.067 -0.454 -0.689 0.000 +0.762 0.550 -0.121 -0.357 -0.730 -0.904 0.000 +0.486 0.137 0.092 -0.048 -0.425 -0.670 0.000 +0.333 0.041 0.035 -0.123 -0.502 -0.768 0.000 +0.055 -0.270 0.034 -0.051 -0.336 -0.485 0.000 +-0.026 -0.061 -0.050 -0.162 -0.411 -0.660 0.000 +-0.215 -0.477 -0.198 -0.269 -0.463 -0.643 0.000 +-0.218 -0.558 -0.146 -0.266 -0.476 -0.676 0.000 +-0.200 -0.528 -0.048 -0.170 -0.257 -0.451 0.000 +-0.068 -0.201 -0.137 -0.269 -0.453 -0.667 0.000 +-0.039 -0.379 0.004 -0.156 -0.330 -0.535 0.000 +0.097 -0.248 0.010 -0.105 -0.348 -0.622 0.000 +0.189 -0.340 0.057 -0.121 -0.452 -0.781 0.000 +0.433 -0.014 -0.160 -0.367 -0.656 -0.929 0.000 +0.599 0.078 0.057 -0.264 -0.602 -0.916 0.000 +0.856 0.527 0.059 -0.260 -0.512 -0.874 0.000 +0.952 0.515 0.140 -0.150 -0.474 -0.700 0.000 +1.149 0.552 0.300 0.072 -0.196 -0.400 0.000 +0.951 0.744 0.270 0.122 -0.036 -0.295 0.000 +0.601 0.562 0.255 0.300 0.253 0.153 0.000 +0.076 -0.065 -0.015 0.071 0.059 0.097 0.000 +-0.240 -0.331 0.148 0.273 0.452 0.542 0.000 +-0.239 -0.239 0.143 0.385 0.484 0.511 0.000 +-0.606 -0.385 0.272 0.612 0.761 0.971 0.000 +-0.393 -0.234 -0.020 0.246 0.324 0.356 0.000 +-0.374 -0.128 0.008 0.343 0.456 0.444 0.000 +0.310 0.322 0.184 0.162 -0.074 -0.335 0.000 +0.125 0.010 -0.042 -0.121 -0.298 -0.489 0.000 +0.680 0.467 0.156 -0.139 -0.455 -0.730 0.000 +0.506 0.383 0.048 -0.203 -0.588 -0.772 0.000 +0.683 0.436 0.019 -0.352 -0.786 -1.028 0.000 +0.453 0.305 -0.112 -0.401 -0.839 -0.976 0.000 +1.230 0.691 0.067 -0.662 -1.261 -1.565 0.000 +1.001 0.581 -0.047 -0.790 -1.392 -1.758 0.000 +1.447 0.962 0.390 -0.423 -1.121 -1.389 0.000 +1.107 0.673 0.261 -0.499 -1.260 -1.575 0.000 +1.332 0.876 0.559 -0.236 -0.898 -1.356 0.000 +1.166 0.860 0.518 -0.144 -0.756 -1.308 0.000 +1.378 1.355 1.026 0.336 -0.379 -1.015 0.000 +0.634 0.459 0.561 0.310 -0.130 -0.495 0.000 +0.348 0.292 0.837 0.771 0.525 0.312 0.000 +0.065 0.125 0.677 0.779 0.743 0.559 0.000 +-0.029 0.088 0.635 0.829 0.815 0.649 0.000 +0.104 0.349 0.660 0.707 0.723 0.460 0.000 +0.346 0.290 0.461 0.499 0.424 0.162 0.000 +0.348 0.493 0.317 0.305 0.185 -0.154 0.000 +0.346 0.347 0.034 -0.089 -0.400 -0.613 0.000 +0.697 0.523 0.041 -0.140 -0.496 -0.904 0.000 +0.298 0.217 -0.109 -0.311 -0.646 -1.095 0.000 +0.204 0.174 -0.195 -0.396 -0.845 -1.333 0.000 +-0.138 0.669 -0.304 -0.382 -1.005 -1.558 0.000 +-0.258 -0.097 -0.325 -0.367 -0.924 -1.437 0.000 +-0.508 -0.364 -0.276 -0.277 -0.681 -1.088 0.000 +-0.257 -0.102 -0.065 -0.110 -0.382 -0.649 0.000 +-0.667 -0.262 -0.342 -0.242 -0.431 -0.614 0.000 +-0.323 -0.234 0.029 -0.033 -0.161 -0.368 0.000 +-0.868 -0.519 -0.444 -0.347 -0.417 -0.530 0.000 +-0.643 -0.478 -0.395 -0.387 -0.525 -0.863 0.000 +-1.074 -0.475 -0.635 -0.494 -0.624 -0.917 0.000 +-0.385 0.037 -0.177 -0.234 -0.464 -0.848 0.000 +-1.022 -0.506 -0.888 -0.995 -1.245 -1.738 0.000 +0.253 0.366 -0.249 -0.300 -0.684 -1.176 0.000 +0.586 0.692 0.154 -0.174 -0.561 -1.244 0.000 +0.708 0.606 0.131 -0.234 -0.554 -1.210 0.000 +0.541 0.504 -0.191 -0.470 -0.822 -1.268 0.000 +0.965 0.946 0.033 -0.175 -0.506 -0.896 0.000 +0.764 0.528 -0.009 -0.172 -0.373 -0.700 0.000 +0.563 0.546 0.203 0.051 -0.084 -0.344 0.000 +0.418 0.383 0.288 0.323 0.289 -0.020 0.000 +0.365 0.475 0.620 0.647 0.542 0.493 0.000 +0.021 0.216 0.534 0.614 0.613 0.559 0.000 +0.031 0.193 0.294 0.377 0.360 0.166 0.000 +0.421 0.255 0.597 0.527 0.389 0.204 0.000 +0.811 0.785 0.757 0.544 0.254 -0.171 0.000 +1.070 1.132 0.259 -0.354 -0.972 -1.494 0.000 +1.097 0.908 0.331 -0.146 -0.787 -1.249 0.000 +1.655 1.243 0.523 -0.181 -0.939 -1.281 0.000 +1.081 0.903 0.249 -0.537 -1.187 -1.551 0.000 +1.359 1.008 0.315 -0.417 -1.101 -1.362 0.000 +1.418 0.976 0.322 -0.392 -1.055 -1.362 0.000 +1.989 1.250 0.166 -0.794 -1.640 -1.989 0.000 +2.044 1.176 0.135 -0.863 -1.707 -2.253 0.000 +2.011 1.165 0.029 -0.910 -1.801 -2.322 0.000 +1.921 1.211 0.154 -0.966 -1.913 -2.665 0.000 +2.389 1.721 0.566 -0.605 -1.547 -2.401 0.000 +2.181 1.477 0.379 -0.871 -2.011 -3.160 0.000 +2.476 1.750 1.421 0.020 -1.232 -2.509 0.000 +3.019 2.057 0.319 -1.077 -2.334 -3.610 0.000 +2.062 1.480 1.172 0.335 -0.601 -1.545 0.000 +1.476 0.857 1.103 0.808 0.459 -0.213 0.000 +1.057 0.850 1.199 1.120 0.940 0.443 0.000 +0.720 0.594 1.017 1.186 1.215 0.886 0.000 +0.849 0.801 0.990 0.838 0.783 0.485 0.000 +0.906 0.592 0.715 0.660 0.641 0.331 0.000 +0.637 0.590 0.559 0.372 0.158 -0.220 0.000 +0.655 0.596 0.519 0.382 0.100 -0.229 0.000 +0.744 0.718 0.356 0.106 -0.386 -0.879 0.000 +0.339 0.391 -0.050 -0.132 -0.619 -1.176 0.000 +0.132 0.506 0.033 -0.148 -0.726 -1.518 0.000 +-0.251 -0.142 -0.401 -0.510 -0.776 -1.664 0.000 +-0.504 0.135 0.909 0.820 0.534 -0.354 0.000 +-0.823 -0.352 -0.536 -0.663 -1.251 -2.077 0.000 +-1.532 -0.899 -0.656 -0.548 -0.890 -1.311 0.000 +-1.096 -0.706 -0.271 -0.159 -0.491 -0.845 0.000 +-1.665 -1.114 -0.535 -0.296 -0.352 -0.475 0.000 +-1.132 -0.782 -0.099 0.040 -0.013 -0.200 0.000 +-1.531 -0.317 -0.395 -0.110 -0.003 0.023 0.000 +-0.881 -0.596 0.228 0.400 0.397 0.131 0.000 +-1.094 -0.641 0.036 0.248 0.304 0.106 0.000 +-0.433 0.276 0.414 0.404 0.233 -0.286 0.000 +-0.585 0.229 0.181 0.227 -0.032 -0.488 0.000 +0.186 0.739 0.536 0.330 -0.238 -0.944 0.000 +-0.525 -0.820 -1.162 -1.250 -1.535 -2.422 0.000 +-0.519 0.408 -0.158 -0.247 -0.531 -1.422 0.000 +0.661 1.412 0.706 0.354 -0.112 -1.060 0.000 +0.720 1.131 0.341 0.144 -0.248 -0.913 0.000 +1.123 1.203 0.416 0.185 -0.184 -0.822 0.000 +1.022 0.751 0.455 0.390 0.087 -0.276 0.000 +1.089 0.798 0.712 0.598 0.247 -0.106 0.000 +0.716 0.448 0.587 0.562 0.358 0.076 0.000 +0.987 0.894 1.129 1.026 0.888 0.562 0.000 +0.476 0.490 1.006 0.977 0.956 0.632 0.000 +1.059 0.831 1.252 1.069 0.863 0.345 0.000 +1.348 0.935 1.130 0.736 0.338 -0.230 0.000 +1.924 1.354 0.745 -0.048 -0.881 -1.834 0.000 +2.411 1.758 1.231 -0.010 -1.191 -2.367 0.000 +2.759 1.528 0.107 -1.116 -2.308 -3.475 0.000 +2.609 1.991 0.603 -0.472 -1.557 -2.600 0.000 +2.640 1.887 0.660 -0.333 -1.296 -2.021 0.000 +2.355 1.724 0.377 -0.600 -1.635 -2.167 0.000 +2.252 1.392 0.166 -0.810 -1.676 -2.097 0.000 +2.057 1.383 0.114 -0.884 -1.734 -2.233 0.000 +3.646 2.585 0.837 -0.478 -1.338 -1.788 0.000 +3.574 2.528 0.830 -0.666 -1.725 -2.450 0.000 +3.779 2.629 0.775 -0.554 -1.544 -2.149 0.000 +3.859 2.781 1.135 -0.484 -1.720 -2.766 0.000 +4.301 3.063 1.424 -0.242 -1.543 -2.725 0.000 +4.613 3.443 1.665 -0.307 -1.747 -3.279 0.000 +3.508 2.758 0.583 -1.196 -2.546 -4.081 0.000 +3.052 2.282 1.264 -0.128 -1.174 -2.530 0.000 +2.232 1.848 1.375 0.841 0.325 -0.534 0.000 +1.908 1.531 1.603 1.215 0.881 0.206 0.000 +1.120 0.968 1.195 1.184 1.164 0.972 0.000 +1.405 1.237 1.121 1.017 0.923 0.469 0.000 +0.996 1.091 0.761 0.665 0.642 0.244 0.000 +1.065 0.969 0.528 0.304 0.139 -0.491 0.000 +0.738 0.767 0.120 -0.012 -0.138 -0.720 0.000 +0.625 0.689 0.389 -0.047 -0.462 -1.232 0.000 +-0.102 0.280 -0.477 -0.551 -1.021 -1.780 0.000 +-0.360 0.282 -0.474 -0.649 -1.557 -2.346 0.000 +-1.433 -0.818 -0.956 -1.049 -1.911 -2.745 0.000 +-1.492 -0.718 -0.624 -0.811 -1.481 -2.425 0.000 +-2.124 -1.293 -0.943 -0.771 -0.979 -1.509 0.000 +-2.457 -1.707 -0.538 -0.515 -0.885 -1.221 0.000 +-3.017 -2.083 -1.229 -0.822 -0.822 -1.501 0.000 +-2.700 -2.115 -0.791 -0.598 -0.547 -0.515 0.000 +-3.643 -2.160 -1.655 -1.206 -0.933 -0.720 0.000 +-2.817 -2.032 -0.684 -0.577 -0.530 -0.792 0.000 +-2.905 -2.133 -1.145 -0.890 -0.725 -0.914 0.000 +-2.337 -1.194 -0.533 -0.530 -0.616 -0.936 0.000 +-2.281 -0.955 -0.945 -0.809 -0.947 -0.941 0.000 +-1.452 -0.496 -0.653 -0.858 -1.430 -2.387 0.000 +-1.783 -0.720 -1.329 -1.483 -2.099 -3.165 0.000 +-0.954 -0.244 -0.436 -0.710 -1.414 -2.624 0.000 +-0.305 0.157 -0.554 -0.656 -1.051 -1.900 0.000 +0.219 0.420 -0.298 -0.526 -0.907 -1.728 0.000 +0.614 0.523 -0.037 0.031 -0.213 -0.773 0.000 +0.839 0.457 0.519 0.456 0.180 -0.466 0.000 +0.778 0.486 0.464 0.548 0.328 0.027 0.000 +1.120 0.889 1.030 0.880 0.615 0.131 0.000 +1.020 0.737 1.214 1.258 1.170 0.840 0.000 +1.586 1.257 1.436 0.954 0.534 -0.117 0.000 +2.082 1.604 1.412 0.715 0.060 -0.610 0.000 +3.359 2.411 1.453 0.163 -1.026 -2.266 0.000 +3.441 2.429 0.289 -1.277 -2.725 -4.154 0.000 +4.110 2.790 0.950 -0.764 -2.411 -3.781 0.000 +4.224 3.070 1.173 -0.272 -1.597 -2.532 0.000 +3.943 2.720 1.065 -0.507 -1.791 -2.544 0.000 +3.239 2.770 1.913 0.660 -0.295 -0.786 0.000 +3.585 2.488 0.730 -0.688 -1.660 -2.319 0.000 diff --git a/Noto/CDB/alma/AS/act_Noto_rev02.txt b/Noto/CDB/alma/AS/act_Noto_rev02.txt new file mode 100644 index 000000000..6367ed04e --- /dev/null +++ b/Noto/CDB/alma/AS/act_Noto_rev02.txt @@ -0,0 +1,244 @@ +-0.696 -0.567 -0.422 -0.309 0.003 0.104 0.000 +-1.127 -0.876 -0.652 -0.506 -0.150 0.110 0.000 +-0.738 -0.466 -0.367 -0.152 0.108 0.171 0.000 +-0.900 -0.660 -0.492 -0.252 -0.122 0.101 0.000 +-0.523 -0.300 -0.154 -0.075 0.027 0.008 0.000 +-0.295 -0.184 -0.085 -0.042 -0.267 -0.193 0.000 +-0.146 -0.071 -0.055 -0.063 -0.152 -0.154 0.000 +0.081 0.035 0.055 0.043 -0.084 -0.145 0.000 +0.411 0.314 0.192 0.056 -0.239 -0.399 0.000 +0.154 0.208 -0.062 -0.218 -0.403 -0.424 0.000 +0.522 0.347 0.133 -0.091 -0.074 -0.242 0.000 +0.560 0.485 0.290 0.110 -0.210 -0.200 0.000 +0.492 0.345 0.172 -0.052 -0.179 -0.225 0.000 +0.305 0.271 0.157 -0.032 -0.237 -0.253 0.000 +0.196 0.170 0.040 0.016 0.009 -0.011 0.000 +0.145 0.142 0.183 0.067 0.066 0.091 0.000 +-0.505 -0.323 -0.195 -0.143 0.341 0.425 0.000 +-0.240 -0.082 0.045 0.161 0.423 0.382 0.000 +-0.570 -0.437 -0.290 -0.093 0.493 0.509 0.000 +-0.136 -0.029 0.062 0.269 0.449 0.406 0.000 +-0.663 -0.493 -0.368 -0.130 0.244 0.253 0.000 +-0.107 0.016 0.123 0.184 0.360 0.225 0.000 +-0.659 -0.467 -0.340 -0.250 0.088 0.049 0.000 +0.112 0.356 0.365 0.409 0.468 0.375 0.000 +-0.433 -0.346 -0.233 -0.024 0.175 0.218 0.000 +0.104 0.175 0.267 0.362 0.507 0.391 0.000 +-0.439 -0.392 -0.170 -0.059 0.237 0.249 0.000 +-0.131 0.053 0.205 0.203 0.652 0.440 0.000 +-0.740 -0.560 -0.329 -0.157 0.366 0.289 0.000 +-0.041 0.128 0.424 0.482 0.525 0.747 0.000 +-0.455 -0.273 0.031 0.118 0.365 0.481 0.000 +0.095 0.258 0.466 0.675 0.878 0.850 0.000 +-0.398 -0.214 -0.108 0.055 0.202 0.391 0.000 +0.418 0.460 0.455 0.388 0.402 0.412 0.000 +0.077 0.014 0.047 -0.123 0.000 0.020 0.000 +0.612 0.579 0.327 0.165 0.126 0.033 0.000 +0.339 0.258 -0.035 -0.278 -0.308 -0.219 0.000 +0.585 0.526 0.248 0.036 0.133 -0.026 0.000 +0.443 0.303 0.060 -0.125 -0.069 -0.039 0.000 +0.386 0.291 0.117 -0.076 -0.062 -0.097 0.000 +0.288 0.277 0.098 -0.182 -0.233 -0.320 0.000 +-0.089 -0.148 -0.013 -0.064 -0.107 -0.288 0.000 +-0.196 -0.153 -0.167 -0.328 -0.162 -0.258 0.000 +-0.303 -0.227 -0.224 -0.176 0.048 0.044 0.000 +-0.317 -0.305 -0.132 -0.005 0.101 0.162 0.000 +-0.691 -0.528 -0.331 -0.209 0.104 0.220 0.000 +-0.550 -0.471 -0.269 -0.115 0.113 0.219 0.000 +-0.744 -0.610 -0.383 -0.195 0.097 0.213 0.000 +-1.251 -0.704 -0.365 -0.020 0.475 0.692 0.000 +-1.409 -0.969 -0.604 -0.274 0.261 0.339 0.000 +-1.105 -0.725 -0.364 0.037 0.363 0.605 0.000 +-0.989 -0.665 -0.350 -0.041 0.203 0.382 0.000 +-0.811 -0.517 -0.222 0.170 0.293 0.543 0.000 +-0.530 -0.290 -0.109 0.019 0.039 0.023 0.000 +-0.352 -0.121 0.034 0.239 0.191 0.182 0.000 +0.435 0.513 0.368 0.228 -0.250 -0.524 0.000 +0.509 0.495 0.347 0.193 -0.340 -0.560 0.000 +0.767 0.660 0.405 -0.008 -0.575 -0.983 0.000 +0.600 0.605 0.456 0.184 -0.455 -0.635 0.000 +0.109 0.025 -0.063 -0.298 -0.533 -0.861 0.000 +0.170 0.205 0.223 0.075 -0.166 -0.152 0.000 +-0.180 -0.014 0.065 0.020 0.054 0.102 0.000 +-0.159 -0.014 0.182 0.252 0.405 0.687 0.000 +-0.534 -0.414 -0.173 -0.043 0.426 0.636 0.000 +-0.689 -0.454 -0.067 0.118 0.444 0.616 0.000 +-0.904 -0.730 -0.357 -0.121 0.550 0.762 0.000 +-0.670 -0.425 -0.048 0.092 0.137 0.486 0.000 +-0.768 -0.502 -0.123 0.035 0.041 0.333 0.000 +-0.485 -0.336 -0.051 0.034 -0.270 0.055 0.000 +-0.660 -0.411 -0.162 -0.050 -0.061 -0.026 0.000 +-0.643 -0.463 -0.269 -0.198 -0.477 -0.215 0.000 +-0.676 -0.476 -0.266 -0.146 -0.558 -0.218 0.000 +-0.451 -0.257 -0.170 -0.048 -0.528 -0.200 0.000 +-0.667 -0.453 -0.269 -0.137 -0.201 -0.068 0.000 +-0.535 -0.330 -0.156 0.004 -0.379 -0.039 0.000 +-0.622 -0.348 -0.105 0.010 -0.248 0.097 0.000 +-0.781 -0.452 -0.121 0.057 -0.340 0.189 0.000 +-0.929 -0.656 -0.367 -0.160 -0.014 0.433 0.000 +-0.916 -0.602 -0.264 0.057 0.078 0.599 0.000 +-0.874 -0.512 -0.260 0.059 0.527 0.856 0.000 +-0.700 -0.474 -0.150 0.140 0.515 0.952 0.000 +-0.400 -0.196 0.072 0.300 0.552 1.149 0.000 +-0.295 -0.036 0.122 0.270 0.744 0.951 0.000 +0.153 0.253 0.300 0.255 0.562 0.601 0.000 +0.097 0.059 0.071 -0.015 -0.065 0.076 0.000 +0.542 0.452 0.273 0.148 -0.331 -0.240 0.000 +0.511 0.484 0.385 0.143 -0.239 -0.239 0.000 +0.971 0.761 0.612 0.272 -0.385 -0.606 0.000 +0.356 0.324 0.246 -0.020 -0.234 -0.393 0.000 +0.444 0.456 0.343 0.008 -0.128 -0.374 0.000 +-0.335 -0.074 0.162 0.184 0.322 0.310 0.000 +-0.489 -0.298 -0.121 -0.042 0.010 0.125 0.000 +-0.730 -0.455 -0.139 0.156 0.467 0.680 0.000 +-0.772 -0.588 -0.203 0.048 0.383 0.506 0.000 +-1.028 -0.786 -0.352 0.019 0.436 0.683 0.000 +-0.976 -0.839 -0.401 -0.112 0.305 0.453 0.000 +-1.565 -1.261 -0.662 0.067 0.691 1.230 0.000 +-1.758 -1.392 -0.790 -0.047 0.581 1.001 0.000 +-1.389 -1.121 -0.423 0.390 0.962 1.447 0.000 +-1.575 -1.260 -0.499 0.261 0.673 1.107 0.000 +-1.356 -0.898 -0.236 0.559 0.876 1.332 0.000 +-1.308 -0.756 -0.144 0.518 0.860 1.166 0.000 +-1.015 -0.379 0.336 1.026 1.355 1.378 0.000 +-0.495 -0.130 0.310 0.561 0.459 0.634 0.000 +0.312 0.525 0.771 0.837 0.292 0.348 0.000 +0.559 0.743 0.779 0.677 0.125 0.065 0.000 +0.649 0.815 0.829 0.635 0.088 -0.029 0.000 +0.460 0.723 0.707 0.660 0.349 0.104 0.000 +0.162 0.424 0.499 0.461 0.290 0.346 0.000 +-0.154 0.185 0.305 0.317 0.493 0.348 0.000 +-0.613 -0.400 -0.089 0.034 0.347 0.346 0.000 +-0.904 -0.496 -0.140 0.041 0.523 0.697 0.000 +-1.095 -0.646 -0.311 -0.109 0.217 0.298 0.000 +-1.333 -0.845 -0.396 -0.195 0.174 0.204 0.000 +-1.558 -1.005 -0.382 -0.304 0.669 -0.138 0.000 +-1.437 -0.924 -0.367 -0.325 -0.097 -0.258 0.000 +-1.088 -0.681 -0.277 -0.276 -0.364 -0.508 0.000 +-0.649 -0.382 -0.110 -0.065 -0.102 -0.257 0.000 +-0.614 -0.431 -0.242 -0.342 -0.262 -0.667 0.000 +-0.368 -0.161 -0.033 0.029 -0.234 -0.323 0.000 +-0.530 -0.417 -0.347 -0.444 -0.519 -0.868 0.000 +-0.863 -0.525 -0.387 -0.395 -0.478 -0.643 0.000 +-0.917 -0.624 -0.494 -0.635 -0.475 -1.074 0.000 +-0.848 -0.464 -0.234 -0.177 0.037 -0.385 0.000 +-1.738 -1.245 -0.995 -0.888 -0.506 -1.022 0.000 +-1.176 -0.684 -0.300 -0.249 0.366 0.253 0.000 +-1.244 -0.561 -0.174 0.154 0.692 0.586 0.000 +-1.210 -0.554 -0.234 0.131 0.606 0.708 0.000 +-1.268 -0.822 -0.470 -0.191 0.504 0.541 0.000 +-0.896 -0.506 -0.175 0.033 0.946 0.965 0.000 +-0.700 -0.373 -0.172 -0.009 0.528 0.764 0.000 +-0.344 -0.084 0.051 0.203 0.546 0.563 0.000 +-0.020 0.289 0.323 0.288 0.383 0.418 0.000 +0.493 0.542 0.647 0.620 0.475 0.365 0.000 +0.559 0.613 0.614 0.534 0.216 0.021 0.000 +0.166 0.360 0.377 0.294 0.193 0.031 0.000 +0.204 0.389 0.527 0.597 0.255 0.421 0.000 +-0.171 0.254 0.544 0.757 0.785 0.811 0.000 +-1.494 -0.972 -0.354 0.259 1.132 1.070 0.000 +-1.249 -0.787 -0.146 0.331 0.908 1.097 0.000 +-1.281 -0.939 -0.181 0.523 1.243 1.655 0.000 +-1.551 -1.187 -0.537 0.249 0.903 1.081 0.000 +-1.362 -1.101 -0.417 0.315 1.008 1.359 0.000 +-1.362 -1.055 -0.392 0.322 0.976 1.418 0.000 +-1.989 -1.640 -0.794 0.166 1.250 1.989 0.000 +-2.253 -1.707 -0.863 0.135 1.176 2.044 0.000 +-2.322 -1.801 -0.910 0.029 1.165 2.011 0.000 +-2.665 -1.913 -0.966 0.154 1.211 1.921 0.000 +-2.401 -1.547 -0.605 0.566 1.721 2.389 0.000 +-3.160 -2.011 -0.871 0.379 1.477 2.181 0.000 +-2.509 -1.232 0.020 1.421 1.750 2.476 0.000 +-1.545 -0.601 0.335 1.172 1.480 2.062 0.000 +-0.213 0.459 0.808 1.103 0.857 1.476 0.000 +0.443 0.940 1.120 1.199 0.850 1.057 0.000 +0.886 1.215 1.186 1.017 0.594 0.720 0.000 +0.485 0.783 0.838 0.990 0.801 0.849 0.000 +0.331 0.641 0.660 0.715 0.592 0.906 0.000 +-0.220 0.158 0.372 0.559 0.590 0.637 0.000 +-0.229 0.100 0.382 0.519 0.596 0.655 0.000 +-0.879 -0.386 0.106 0.356 0.718 0.744 0.000 +-1.176 -0.619 -0.132 -0.050 0.391 0.339 0.000 +-1.518 -0.726 -0.148 0.033 0.506 0.132 0.000 +-1.664 -0.776 -0.510 -0.401 -0.142 -0.251 0.000 +-2.077 -1.251 -0.663 -0.536 -0.352 -0.823 0.000 +-1.311 -0.890 -0.548 -0.656 -0.899 -1.532 0.000 +-0.845 -0.491 -0.159 -0.271 -0.706 -1.096 0.000 +-0.475 -0.352 -0.296 -0.535 -1.114 -1.665 0.000 +-0.200 -0.013 0.040 -0.099 -0.782 -1.132 0.000 +0.023 -0.003 -0.110 -0.395 -0.317 -1.531 0.000 +0.131 0.397 0.400 0.228 -0.596 -0.881 0.000 +0.106 0.304 0.248 0.036 -0.641 -1.094 0.000 +-0.286 0.233 0.404 0.414 0.276 -0.433 0.000 +-0.488 -0.032 0.227 0.181 0.229 -0.585 0.000 +-0.944 -0.238 0.330 0.536 0.739 0.186 0.000 +-2.422 -1.535 -1.250 -1.162 -0.820 -0.525 0.000 +-1.060 -0.112 0.354 0.706 1.412 0.661 0.000 +-0.913 -0.248 0.144 0.341 1.131 0.720 0.000 +-0.822 -0.184 0.185 0.416 1.203 1.123 0.000 +-0.276 0.087 0.390 0.455 0.751 1.022 0.000 +-0.106 0.247 0.598 0.712 0.798 1.089 0.000 +0.076 0.358 0.562 0.587 0.448 0.716 0.000 +0.562 0.888 1.026 1.129 0.894 0.987 0.000 +0.632 0.956 0.977 1.006 0.490 0.476 0.000 +0.345 0.863 1.069 1.252 0.831 1.059 0.000 +-0.230 0.338 0.736 1.130 0.935 1.348 0.000 +-1.834 -0.881 -0.048 0.745 1.354 1.924 0.000 +-2.367 -1.191 -0.010 1.231 1.758 2.411 0.000 +-2.600 -1.557 -0.472 0.603 1.991 2.609 0.000 +-2.021 -1.296 -0.333 0.660 1.887 2.640 0.000 +-2.167 -1.635 -0.600 0.377 1.724 2.355 0.000 +-2.097 -1.676 -0.810 0.166 1.392 2.252 0.000 +-2.233 -1.734 -0.884 0.114 1.383 2.057 0.000 +-1.788 -1.338 -0.478 0.837 2.585 3.646 0.000 +-2.450 -1.725 -0.666 0.830 2.528 3.574 0.000 +-2.149 -1.544 -0.554 0.775 2.629 3.779 0.000 +-2.766 -1.720 -0.484 1.135 2.781 3.859 0.000 +-2.725 -1.543 -0.242 1.424 3.063 4.301 0.000 +-3.279 -1.747 -0.307 1.665 3.443 4.613 0.000 +-4.081 -2.546 -1.196 0.583 2.758 3.508 0.000 +-2.530 -1.174 -0.128 1.264 2.282 3.052 0.000 +-0.534 0.325 0.841 1.375 1.848 2.232 0.000 +0.206 0.881 1.215 1.603 1.531 1.908 0.000 +0.972 1.164 1.184 1.195 0.968 1.120 0.000 +0.469 0.923 1.017 1.121 1.237 1.405 0.000 +0.244 0.642 0.665 0.761 1.091 0.996 0.000 +-0.491 0.139 0.304 0.528 0.969 1.065 0.000 +-0.720 -0.138 -0.012 0.120 0.767 0.738 0.000 +-1.232 -0.462 -0.047 0.389 0.689 0.625 0.000 +-1.780 -1.021 -0.551 -0.477 0.280 -0.102 0.000 +-2.346 -1.557 -0.649 -0.474 0.282 -0.360 0.000 +-2.745 -1.911 -1.049 -0.956 -0.818 -1.433 0.000 +-2.425 -1.481 -0.811 -0.624 -0.718 -1.492 0.000 +-1.509 -0.979 -0.771 -0.943 -1.293 -2.124 0.000 +-1.221 -0.885 -0.515 -0.538 -1.707 -2.457 0.000 +-1.501 -0.822 -0.822 -1.229 -2.083 -3.017 0.000 +-0.515 -0.547 -0.598 -0.791 -2.115 -2.700 0.000 +-0.720 -0.933 -1.206 -1.655 -2.160 -3.643 0.000 +-0.792 -0.530 -0.577 -0.684 -2.032 -2.817 0.000 +-0.914 -0.725 -0.890 -1.145 -2.133 -2.905 0.000 +-0.936 -0.616 -0.530 -0.533 -1.194 -2.337 0.000 +-0.941 -0.947 -0.809 -0.945 -0.955 -2.281 0.000 +-2.387 -1.430 -0.858 -0.653 -0.496 -1.452 0.000 +-3.165 -2.099 -1.483 -1.329 -0.720 -1.783 0.000 +-2.624 -1.414 -0.710 -0.436 -0.244 -0.954 0.000 +-1.900 -1.051 -0.656 -0.554 0.157 -0.305 0.000 +-1.728 -0.907 -0.526 -0.298 0.420 0.219 0.000 +-0.773 -0.213 0.031 -0.037 0.523 0.614 0.000 +-0.466 0.180 0.456 0.519 0.457 0.839 0.000 +0.027 0.328 0.548 0.464 0.486 0.778 0.000 +0.131 0.615 0.880 1.030 0.889 1.120 0.000 +0.840 1.170 1.258 1.214 0.737 1.020 0.000 +-0.117 0.534 0.954 1.436 1.257 1.586 0.000 +-0.610 0.060 0.715 1.412 1.604 2.082 0.000 +-2.266 -1.026 0.163 1.453 2.411 3.359 0.000 +-4.154 -2.725 -1.277 0.289 2.429 3.441 0.000 +-3.781 -2.411 -0.764 0.950 2.790 4.110 0.000 +-2.532 -1.597 -0.272 1.173 3.070 4.224 0.000 +-2.544 -1.791 -0.507 1.065 2.720 3.943 0.000 +-0.786 -0.295 0.660 1.913 2.770 3.239 0.000 +-2.319 -1.660 -0.688 0.730 2.488 3.585 0.000 +-3.610 -2.334 -1.077 0.319 2.057 3.019 0.000 +-0.354 0.534 0.820 0.909 0.135 -0.504 0.000 +-1.422 -0.531 -0.247 -0.158 0.408 -0.519 0.000 +-3.475 -2.308 -1.116 0.107 1.528 2.759 0.000 diff --git a/Noto/CDB/alma/AS/set_calibrate.py b/Noto/CDB/alma/AS/set_calibrate.py old mode 100644 new mode 100755 diff --git a/Noto/CDB/alma/AS/tab_convUSD.txt b/Noto/CDB/alma/AS/tab_convUSD.txt index f2943296e..e6a99e17c 100644 --- a/Noto/CDB/alma/AS/tab_convUSD.txt +++ b/Noto/CDB/alma/AS/tab_convUSD.txt @@ -1,4 +1,3 @@ -1 1 1 AS/SECTOR01/LAN01/USD01 "1,1" 0101 1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 @@ -9,7 +8,6 @@ 2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 -3 1 2 AS/SECTOR01/LAN03/USD01 "1,2" 0102 3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 @@ -20,7 +18,6 @@ 4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 -5 1 3 AS/SECTOR01/LAN05/USD01 "1,3" 0103 5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 @@ -31,7 +28,6 @@ 6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 -7 1 4 AS/SECTOR01/LAN07/USD01 "1,4" 0104 7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 @@ -43,7 +39,6 @@ 8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 -9 1 5 AS/SECTOR01/LAN09/USD01 "1,5" 0105 9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 @@ -54,7 +49,6 @@ 10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 -11 1 6 AS/SECTOR01/LAN11/USD01 "1,6" 0106 11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 @@ -65,7 +59,6 @@ 12 4 12 AS/SECTOR01/LAN12/USD04 "4,12" 0412 12 5 12 AS/SECTOR01/LAN12/USD05 "5,12" 0512 12 6 12 AS/SECTOR01/LAN12/USD06 "6,12" 0612 -13 1 7 AS/SECTOR02/LAN01/USD01 "1,7" 0107 13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 @@ -76,7 +69,6 @@ 14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 -15 1 8 AS/SECTOR02/LAN03/USD01 "1,8" 0108 15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 @@ -87,7 +79,6 @@ 16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 -17 1 9 AS/SECTOR02/LAN05/USD01 "1,9" 0109 17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 @@ -98,7 +89,6 @@ 18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 -19 1 10 AS/SECTOR02/LAN07/USD01 "1,10" 0110 19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 @@ -110,7 +100,6 @@ 20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 -21 1 11 AS/SECTOR02/LAN09/USD01 "1,11" 0111 21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 @@ -121,7 +110,6 @@ 22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 -23 1 12 AS/SECTOR02/LAN11/USD01 "1,12" 0112 23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 @@ -132,7 +120,6 @@ 24 4 24 AS/SECTOR02/LAN12/USD04 "4,24" 0424 24 5 24 AS/SECTOR02/LAN12/USD05 "5,24" 0524 24 6 24 AS/SECTOR02/LAN12/USD06 "6,24" 0624 -25 1 13 AS/SECTOR03/LAN01/USD01 "1,13" 0113 25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 @@ -143,7 +130,6 @@ 26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 -27 1 14 AS/SECTOR03/LAN03/USD01 "1,14" 0114 27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 @@ -154,7 +140,6 @@ 28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 -29 1 15 AS/SECTOR03/LAN05/USD01 "1,15" 0115 29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 @@ -165,7 +150,6 @@ 30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 -31 1 16 AS/SECTOR03/LAN07/USD01 "1,16" 0116 31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 @@ -177,7 +161,6 @@ 32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 -33 1 17 AS/SECTOR03/LAN09/USD01 "1,17" 0117 33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 @@ -188,7 +171,6 @@ 34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 -35 1 18 AS/SECTOR03/LAN11/USD01 "1,18" 0118 35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 @@ -199,7 +181,6 @@ 36 4 36 AS/SECTOR03/LAN12/USD04 "4,36" 0436 36 5 36 AS/SECTOR03/LAN12/USD05 "5,36" 0536 36 6 36 AS/SECTOR03/LAN12/USD06 "6,36" 0636 -37 1 19 AS/SECTOR04/LAN01/USD01 "1,19" 0119 37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 @@ -210,7 +191,6 @@ 38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 -39 1 20 AS/SECTOR04/LAN03/USD01 "1,20" 0120 39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 @@ -221,7 +201,6 @@ 40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 -41 1 21 AS/SECTOR04/LAN05/USD01 "1,21" 0121 41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 @@ -232,7 +211,6 @@ 42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 -43 1 22 AS/SECTOR04/LAN07/USD01 "1,22" 0122 43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 @@ -244,7 +222,6 @@ 44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 -45 1 23 AS/SECTOR04/LAN09/USD01 "1,23" 0123 45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 @@ -255,7 +232,6 @@ 46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 -47 1 24 AS/SECTOR04/LAN11/USD01 "1,24" 0124 47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 diff --git a/Noto/CDB/alma/AS/tab_convUSD.txt.orig b/Noto/CDB/alma/AS/tab_convUSD.txt.orig new file mode 100644 index 000000000..f2943296e --- /dev/null +++ b/Noto/CDB/alma/AS/tab_convUSD.txt.orig @@ -0,0 +1,268 @@ +1 1 1 AS/SECTOR01/LAN01/USD01 "1,1" 0101 +1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +2 2 2 AS/SECTOR01/LAN02/USD02 "2,2" 0202 +2 3 2 AS/SECTOR01/LAN02/USD03 "3,2" 0302 +2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 +2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 +2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 +3 1 2 AS/SECTOR01/LAN03/USD01 "1,2" 0102 +3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 +3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 +3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 +3 5 3 AS/SECTOR01/LAN03/USD05 "5,3" 0503 +3 6 3 AS/SECTOR01/LAN03/USD06 "6,3" 0603 +4 2 4 AS/SECTOR01/LAN04/USD02 "2,4" 0204 +4 3 4 AS/SECTOR01/LAN04/USD03 "3,4" 0304 +4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 +4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 +4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 +5 1 3 AS/SECTOR01/LAN05/USD01 "1,3" 0103 +5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 +5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 +5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 +5 5 5 AS/SECTOR01/LAN05/USD05 "5,5" 0505 +5 6 5 AS/SECTOR01/LAN05/USD06 "6,5" 0605 +6 2 6 AS/SECTOR01/LAN06/USD02 "2,6" 0206 +6 3 6 AS/SECTOR01/LAN06/USD03 "3,6" 0306 +6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 +6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 +6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 +7 1 4 AS/SECTOR01/LAN07/USD01 "1,4" 0104 +7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 +7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 +7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 +7 5 7 AS/SECTOR01/LAN07/USD05 "5,7" 0507 +7 6 7 AS/SECTOR01/LAN07/USD06 "6,7" 0607 +7 7 7 AS/SECTOR01/LAN07/USD07 "7,1" 0701 +8 2 8 AS/SECTOR01/LAN08/USD02 "2,8" 0208 +8 3 8 AS/SECTOR01/LAN08/USD03 "3,8" 0308 +8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 +8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 +8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 +9 1 5 AS/SECTOR01/LAN09/USD01 "1,5" 0105 +9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 +9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 +9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 +9 5 9 AS/SECTOR01/LAN09/USD05 "5,9" 0509 +9 6 9 AS/SECTOR01/LAN09/USD06 "6,9" 0609 +10 2 10 AS/SECTOR01/LAN10/USD02 "2,10" 0210 +10 3 10 AS/SECTOR01/LAN10/USD03 "3,10" 0310 +10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 +10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 +10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 +11 1 6 AS/SECTOR01/LAN11/USD01 "1,6" 0106 +11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 +11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 +11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 +11 5 11 AS/SECTOR01/LAN11/USD05 "5,11" 0511 +11 6 11 AS/SECTOR01/LAN11/USD06 "6,11" 0611 +12 2 12 AS/SECTOR01/LAN12/USD02 "2,12" 0212 +12 3 12 AS/SECTOR01/LAN12/USD03 "3,12" 0312 +12 4 12 AS/SECTOR01/LAN12/USD04 "4,12" 0412 +12 5 12 AS/SECTOR01/LAN12/USD05 "5,12" 0512 +12 6 12 AS/SECTOR01/LAN12/USD06 "6,12" 0612 +13 1 7 AS/SECTOR02/LAN01/USD01 "1,7" 0107 +13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 +13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 +13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 +13 5 13 AS/SECTOR02/LAN01/USD05 "5,13" 0513 +13 6 13 AS/SECTOR02/LAN01/USD06 "6,13" 0613 +14 2 14 AS/SECTOR02/LAN02/USD02 "2,14" 0214 +14 3 14 AS/SECTOR02/LAN02/USD03 "3,14" 0314 +14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 +14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 +14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 +15 1 8 AS/SECTOR02/LAN03/USD01 "1,8" 0108 +15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 +15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 +15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 +15 5 15 AS/SECTOR02/LAN03/USD05 "5,15" 0515 +15 6 15 AS/SECTOR02/LAN03/USD06 "6,15" 0615 +16 2 16 AS/SECTOR02/LAN04/USD02 "2,16" 0216 +16 3 16 AS/SECTOR02/LAN04/USD03 "3,16" 0316 +16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 +16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 +16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 +17 1 9 AS/SECTOR02/LAN05/USD01 "1,9" 0109 +17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 +17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 +17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 +17 5 17 AS/SECTOR02/LAN05/USD05 "5,17" 0517 +17 6 17 AS/SECTOR02/LAN05/USD06 "6,17" 0617 +18 2 18 AS/SECTOR02/LAN06/USD02 "2,18" 0218 +18 3 18 AS/SECTOR02/LAN06/USD03 "3,18" 0318 +18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 +18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 +18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 +19 1 10 AS/SECTOR02/LAN07/USD01 "1,10" 0110 +19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 +19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 +19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 +19 5 19 AS/SECTOR02/LAN07/USD05 "5,19" 0519 +19 6 19 AS/SECTOR02/LAN07/USD06 "6,19" 0619 +19 7 19 AS/SECTOR02/LAN07/USD07 "7,2" 0702 +20 2 20 AS/SECTOR02/LAN08/USD02 "2,20" 0220 +20 3 20 AS/SECTOR02/LAN08/USD03 "3,20" 0320 +20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 +20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 +20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 +21 1 11 AS/SECTOR02/LAN09/USD01 "1,11" 0111 +21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 +21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 +21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 +21 5 21 AS/SECTOR02/LAN09/USD05 "5,21" 0521 +21 6 21 AS/SECTOR02/LAN09/USD06 "6,21" 0621 +22 2 22 AS/SECTOR02/LAN10/USD02 "2,22" 0222 +22 3 22 AS/SECTOR02/LAN10/USD03 "3,22" 0322 +22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 +22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 +22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 +23 1 12 AS/SECTOR02/LAN11/USD01 "1,12" 0112 +23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 +23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 +23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 +23 5 23 AS/SECTOR02/LAN11/USD05 "5,23" 0523 +23 6 23 AS/SECTOR02/LAN11/USD06 "6,23" 0623 +24 2 24 AS/SECTOR02/LAN12/USD02 "2,24" 0224 +24 3 24 AS/SECTOR02/LAN12/USD03 "3,24" 0324 +24 4 24 AS/SECTOR02/LAN12/USD04 "4,24" 0424 +24 5 24 AS/SECTOR02/LAN12/USD05 "5,24" 0524 +24 6 24 AS/SECTOR02/LAN12/USD06 "6,24" 0624 +25 1 13 AS/SECTOR03/LAN01/USD01 "1,13" 0113 +25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 +25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 +25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 +25 5 25 AS/SECTOR03/LAN01/USD05 "5,25" 0525 +25 6 25 AS/SECTOR03/LAN01/USD06 "6,25" 0625 +26 2 26 AS/SECTOR03/LAN02/USD02 "2,26" 0226 +26 3 26 AS/SECTOR03/LAN02/USD03 "3,26" 0326 +26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 +26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 +26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 +27 1 14 AS/SECTOR03/LAN03/USD01 "1,14" 0114 +27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 +27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 +27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 +27 5 27 AS/SECTOR03/LAN03/USD05 "5,27" 0527 +27 6 27 AS/SECTOR03/LAN03/USD06 "6,27" 0627 +28 2 28 AS/SECTOR03/LAN04/USD02 "2,28" 0228 +28 3 28 AS/SECTOR03/LAN04/USD03 "3,28" 0328 +28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 +28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 +28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 +29 1 15 AS/SECTOR03/LAN05/USD01 "1,15" 0115 +29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 +29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 +29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 +29 5 29 AS/SECTOR03/LAN05/USD05 "5,29" 0529 +29 6 29 AS/SECTOR03/LAN05/USD06 "6,29" 0629 +30 2 30 AS/SECTOR03/LAN06/USD02 "2,30" 0230 +30 3 30 AS/SECTOR03/LAN06/USD03 "3,30" 0330 +30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 +30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 +30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 +31 1 16 AS/SECTOR03/LAN07/USD01 "1,16" 0116 +31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 +31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 +31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 +31 5 31 AS/SECTOR03/LAN07/USD05 "5,31" 0531 +31 6 31 AS/SECTOR03/LAN07/USD06 "6,31" 0631 +31 7 31 AS/SECTOR03/LAN07/USD07 "7,3" 0703 +32 2 32 AS/SECTOR03/LAN08/USD02 "2,32" 0232 +32 3 32 AS/SECTOR03/LAN08/USD03 "3,32" 0332 +32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 +32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 +32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 +33 1 17 AS/SECTOR03/LAN09/USD01 "1,17" 0117 +33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 +33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 +33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 +33 5 33 AS/SECTOR03/LAN09/USD05 "5,33" 0533 +33 6 33 AS/SECTOR03/LAN09/USD06 "6,33" 0633 +34 2 34 AS/SECTOR03/LAN10/USD02 "2,34" 0234 +34 3 34 AS/SECTOR03/LAN10/USD03 "3,34" 0334 +34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 +34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 +34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 +35 1 18 AS/SECTOR03/LAN11/USD01 "1,18" 0118 +35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 +35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 +35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 +35 5 35 AS/SECTOR03/LAN11/USD05 "5,35" 0535 +35 6 35 AS/SECTOR03/LAN11/USD06 "6,35" 0635 +36 2 36 AS/SECTOR03/LAN12/USD02 "2,36" 0236 +36 3 36 AS/SECTOR03/LAN12/USD03 "3,36" 0336 +36 4 36 AS/SECTOR03/LAN12/USD04 "4,36" 0436 +36 5 36 AS/SECTOR03/LAN12/USD05 "5,36" 0536 +36 6 36 AS/SECTOR03/LAN12/USD06 "6,36" 0636 +37 1 19 AS/SECTOR04/LAN01/USD01 "1,19" 0119 +37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 +37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 +37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 +37 5 37 AS/SECTOR04/LAN01/USD05 "5,37" 0537 +37 6 37 AS/SECTOR04/LAN01/USD06 "6,37" 0637 +38 2 38 AS/SECTOR04/LAN02/USD02 "2,38" 0238 +38 3 38 AS/SECTOR04/LAN02/USD03 "3,38" 0338 +38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 +38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 +38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 +39 1 20 AS/SECTOR04/LAN03/USD01 "1,20" 0120 +39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 +39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 +39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 +39 5 39 AS/SECTOR04/LAN03/USD05 "5,39" 0539 +39 6 39 AS/SECTOR04/LAN03/USD06 "6,39" 0639 +40 2 40 AS/SECTOR04/LAN04/USD02 "2,40" 0240 +40 3 40 AS/SECTOR04/LAN04/USD03 "3,40" 0340 +40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 +40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 +40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 +41 1 21 AS/SECTOR04/LAN05/USD01 "1,21" 0121 +41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 +41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 +41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 +41 5 41 AS/SECTOR04/LAN05/USD05 "5,41" 0541 +41 6 41 AS/SECTOR04/LAN05/USD06 "6,41" 0641 +42 2 42 AS/SECTOR04/LAN06/USD02 "2,42" 0242 +42 3 42 AS/SECTOR04/LAN06/USD03 "3,42" 0342 +42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 +42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 +42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 +43 1 22 AS/SECTOR04/LAN07/USD01 "1,22" 0122 +43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 +43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 +43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 +43 5 43 AS/SECTOR04/LAN07/USD05 "5,43" 0543 +43 6 43 AS/SECTOR04/LAN07/USD06 "6,43" 0643 +43 7 43 AS/SECTOR04/LAN07/USD07 "7,4" 0704 +44 2 44 AS/SECTOR04/LAN08/USD02 "2,44" 0244 +44 3 44 AS/SECTOR04/LAN08/USD03 "3,44" 0344 +44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 +44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 +44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 +45 1 23 AS/SECTOR04/LAN09/USD01 "1,23" 0123 +45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 +45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 +45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 +45 5 45 AS/SECTOR04/LAN09/USD05 "5,45" 0545 +45 6 45 AS/SECTOR04/LAN09/USD06 "6,45" 0645 +46 2 46 AS/SECTOR04/LAN10/USD02 "2,46" 0246 +46 3 46 AS/SECTOR04/LAN10/USD03 "3,46" 0346 +46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 +46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 +46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 +47 1 24 AS/SECTOR04/LAN11/USD01 "1,24" 0124 +47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 +47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 +47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 +47 5 47 AS/SECTOR04/LAN11/USD05 "5,47" 0547 +47 6 47 AS/SECTOR04/LAN11/USD06 "6,47" 0647 +48 2 48 AS/SECTOR04/LAN12/USD02 "2,48" 0248 +48 3 48 AS/SECTOR04/LAN12/USD03 "3,48" 0348 +48 4 48 AS/SECTOR04/LAN12/USD04 "4,48" 0448 +48 5 48 AS/SECTOR04/LAN12/USD05 "5,48" 0548 +48 6 48 AS/SECTOR04/LAN12/USD06 "6,48" 0648 diff --git a/Noto/CDB/alma/AS/tab_convUSD_S1.txt b/Noto/CDB/alma/AS/tab_convUSD_S1.txt index 3c30f9a80..181e31f47 100644 --- a/Noto/CDB/alma/AS/tab_convUSD_S1.txt +++ b/Noto/CDB/alma/AS/tab_convUSD_S1.txt @@ -1,4 +1,3 @@ -1 1 1 AS/SECTOR01/LAN01/USD01 "1,1" 0101 1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 @@ -9,7 +8,6 @@ 2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 -3 1 2 AS/SECTOR01/LAN03/USD01 "1,2" 0102 3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 @@ -20,7 +18,6 @@ 4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 -5 1 3 AS/SECTOR01/LAN05/USD01 "1,3" 0103 5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 @@ -31,19 +28,17 @@ 6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 -7 1 4 AS/SECTOR01/LAN07/USD01 "1,4" 0104 7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 7 5 7 AS/SECTOR01/LAN07/USD05 "5,7" 0507 7 6 7 AS/SECTOR01/LAN07/USD06 "6,7" 0607 -7 7 7 AS/SECTOR01/LAN07/USD07 "7,1" 0701 +7 7 1 AS/SECTOR01/LAN07/USD07 "7,1" 0701 8 2 8 AS/SECTOR01/LAN08/USD02 "2,8" 0208 8 3 8 AS/SECTOR01/LAN08/USD03 "3,8" 0308 8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 -9 1 5 AS/SECTOR01/LAN09/USD01 "1,5" 0105 9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 @@ -54,7 +49,6 @@ 10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 -11 1 6 AS/SECTOR01/LAN11/USD01 "1,6" 0106 11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 diff --git a/Noto/CDB/alma/AS/tab_convUSD_S2.txt b/Noto/CDB/alma/AS/tab_convUSD_S2.txt index 593993b05..70811a8ba 100644 --- a/Noto/CDB/alma/AS/tab_convUSD_S2.txt +++ b/Noto/CDB/alma/AS/tab_convUSD_S2.txt @@ -1,4 +1,3 @@ -13 1 7 AS/SECTOR02/LAN01/USD01 "1,7" 0107 13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 @@ -9,7 +8,6 @@ 14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 -15 1 8 AS/SECTOR02/LAN03/USD01 "1,8" 0108 15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 @@ -20,7 +18,6 @@ 16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 -17 1 9 AS/SECTOR02/LAN05/USD01 "1,9" 0109 17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 @@ -31,19 +28,17 @@ 18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 -19 1 10 AS/SECTOR02/LAN07/USD01 "1,10" 0110 19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 19 5 19 AS/SECTOR02/LAN07/USD05 "5,19" 0519 19 6 19 AS/SECTOR02/LAN07/USD06 "6,19" 0619 -19 7 19 AS/SECTOR02/LAN07/USD07 "7,2" 0702 +19 7 2 AS/SECTOR02/LAN07/USD07 "7,2" 0702 20 2 20 AS/SECTOR02/LAN08/USD02 "2,20" 0220 20 3 20 AS/SECTOR02/LAN08/USD03 "3,20" 0320 20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 -21 1 11 AS/SECTOR02/LAN09/USD01 "1,11" 0111 21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 @@ -54,7 +49,6 @@ 22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 -23 1 12 AS/SECTOR02/LAN11/USD01 "1,12" 0112 23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 diff --git a/Noto/CDB/alma/AS/tab_convUSD_S3.txt b/Noto/CDB/alma/AS/tab_convUSD_S3.txt index 7360da979..1cc2c6195 100644 --- a/Noto/CDB/alma/AS/tab_convUSD_S3.txt +++ b/Noto/CDB/alma/AS/tab_convUSD_S3.txt @@ -1,4 +1,3 @@ -25 1 13 AS/SECTOR03/LAN01/USD01 "1,13" 0113 25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 @@ -9,7 +8,6 @@ 26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 -27 1 14 AS/SECTOR03/LAN03/USD01 "1,14" 0114 27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 @@ -20,7 +18,6 @@ 28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 -29 1 15 AS/SECTOR03/LAN05/USD01 "1,15" 0115 29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 @@ -31,19 +28,17 @@ 30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 -31 1 16 AS/SECTOR03/LAN07/USD01 "1,16" 0116 31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 31 5 31 AS/SECTOR03/LAN07/USD05 "5,31" 0531 31 6 31 AS/SECTOR03/LAN07/USD06 "6,31" 0631 -31 7 31 AS/SECTOR03/LAN07/USD07 "7,3" 0703 +31 7 3 AS/SECTOR03/LAN07/USD07 "7,3" 0703 32 2 32 AS/SECTOR03/LAN08/USD02 "2,32" 0232 32 3 32 AS/SECTOR03/LAN08/USD03 "3,32" 0332 32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 -33 1 17 AS/SECTOR03/LAN09/USD01 "1,17" 0117 33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 @@ -54,7 +49,6 @@ 34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 -35 1 18 AS/SECTOR03/LAN11/USD01 "1,18" 0118 35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 diff --git a/Noto/CDB/alma/AS/tab_convUSD_S4.txt b/Noto/CDB/alma/AS/tab_convUSD_S4.txt index bdd16e63d..07ed2389c 100644 --- a/Noto/CDB/alma/AS/tab_convUSD_S4.txt +++ b/Noto/CDB/alma/AS/tab_convUSD_S4.txt @@ -1,4 +1,3 @@ -37 1 19 AS/SECTOR04/LAN01/USD01 "1,19" 0119 37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 @@ -9,7 +8,6 @@ 38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 -39 1 20 AS/SECTOR04/LAN03/USD01 "1,20" 0120 39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 @@ -20,7 +18,6 @@ 40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 -41 1 21 AS/SECTOR04/LAN05/USD01 "1,21" 0121 41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 @@ -31,19 +28,17 @@ 42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 -43 1 22 AS/SECTOR04/LAN07/USD01 "1,22" 0122 43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 43 5 43 AS/SECTOR04/LAN07/USD05 "5,43" 0543 43 6 43 AS/SECTOR04/LAN07/USD06 "6,43" 0643 -43 7 43 AS/SECTOR04/LAN07/USD07 "7,4" 0704 +43 7 4 AS/SECTOR04/LAN07/USD07 "7,4" 0704 44 2 44 AS/SECTOR04/LAN08/USD02 "2,44" 0244 44 3 44 AS/SECTOR04/LAN08/USD03 "3,44" 0344 44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 -45 1 23 AS/SECTOR04/LAN09/USD01 "1,23" 0123 45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 @@ -54,7 +49,6 @@ 46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 -47 1 24 AS/SECTOR04/LAN11/USD01 "1,24" 0124 47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/include/NotoActiveSurfaceGUI.h b/Noto/Clients/NotoActiveSurfaceGUIClient/include/NotoActiveSurfaceGUI.h index 68d9f8573..39d0f1642 100644 --- a/Noto/Clients/NotoActiveSurfaceGUIClient/include/NotoActiveSurfaceGUI.h +++ b/Noto/Clients/NotoActiveSurfaceGUIClient/include/NotoActiveSurfaceGUI.h @@ -59,7 +59,11 @@ public: QLabel *BussolatextLabel; QPushButton *ActuatorButton01_01; QPushButton *ActuatorButton01_02; + QPushButton *ActuatorButton07_01; + QPushButton *ActuatorButton07_02; QPushButton *ActuatorButton01_03; + QPushButton *ActuatorButton07_03; + QPushButton *ActuatorButton07_04; QPushButton *ActuatorButton01_04; QPushButton *ActuatorButton01_05; QPushButton *ActuatorButton01_06; @@ -672,6 +676,7 @@ public: BussolatextLabel->setWordWrap(false); ActuatorButton01_01 = new QPushButton(frame); ActuatorButton01_01->setObjectName(QString::fromUtf8("ActuatorButton01_01")); + ActuatorButton01_01->setEnabled(false); ActuatorButton01_01->setGeometry(QRect(471, 358, 10, 10)); QPalette palette1; palette1.setBrush(QPalette::Active, QPalette::WindowText, brush); @@ -725,6 +730,7 @@ public: ActuatorButton01_01->setPalette(palette1); ActuatorButton01_02 = new QPushButton(frame); ActuatorButton01_02->setObjectName(QString::fromUtf8("ActuatorButton01_02")); + ActuatorButton01_02->setEnabled(false); ActuatorButton01_02->setGeometry(QRect(501, 361, 10, 10)); QPalette palette2; palette2.setBrush(QPalette::Active, QPalette::WindowText, brush); @@ -776,9 +782,10 @@ public: palette2.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette2.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); ActuatorButton01_02->setPalette(palette2); - ActuatorButton01_03 = new QPushButton(frame); - ActuatorButton01_03->setObjectName(QString::fromUtf8("ActuatorButton01_03")); - ActuatorButton01_03->setGeometry(QRect(528, 372, 10, 10)); + ActuatorButton07_01 = new QPushButton(frame); + ActuatorButton07_01->setObjectName(QString::fromUtf8("ActuatorButton07_01")); + ActuatorButton07_01->setEnabled(true); + ActuatorButton07_01->setGeometry(QRect(690, 250, 10, 10)); QPalette palette3; palette3.setBrush(QPalette::Active, QPalette::WindowText, brush); palette3.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -828,10 +835,11 @@ public: palette3.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette3.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette3.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_03->setPalette(palette3); - ActuatorButton01_04 = new QPushButton(frame); - ActuatorButton01_04->setObjectName(QString::fromUtf8("ActuatorButton01_04")); - ActuatorButton01_04->setGeometry(QRect(552, 390, 10, 10)); + ActuatorButton07_01->setPalette(palette3); + ActuatorButton07_02 = new QPushButton(frame); + ActuatorButton07_02->setObjectName(QString::fromUtf8("ActuatorButton07_02")); + ActuatorButton07_02->setEnabled(true); + ActuatorButton07_02->setGeometry(QRect(690, 690, 10, 10)); QPalette palette4; palette4.setBrush(QPalette::Active, QPalette::WindowText, brush); palette4.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -881,10 +889,11 @@ public: palette4.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette4.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette4.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_04->setPalette(palette4); - ActuatorButton01_05 = new QPushButton(frame); - ActuatorButton01_05->setObjectName(QString::fromUtf8("ActuatorButton01_05")); - ActuatorButton01_05->setGeometry(QRect(569, 414, 10, 10)); + ActuatorButton07_02->setPalette(palette4); + ActuatorButton01_03 = new QPushButton(frame); + ActuatorButton01_03->setObjectName(QString::fromUtf8("ActuatorButton01_03")); + ActuatorButton01_03->setEnabled(false); + ActuatorButton01_03->setGeometry(QRect(528, 372, 10, 10)); QPalette palette5; palette5.setBrush(QPalette::Active, QPalette::WindowText, brush); palette5.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -934,10 +943,11 @@ public: palette5.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette5.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette5.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_05->setPalette(palette5); - ActuatorButton01_06 = new QPushButton(frame); - ActuatorButton01_06->setObjectName(QString::fromUtf8("ActuatorButton01_06")); - ActuatorButton01_06->setGeometry(QRect(580, 442, 10, 10)); + ActuatorButton01_03->setPalette(palette5); + ActuatorButton07_03 = new QPushButton(frame); + ActuatorButton07_03->setObjectName(QString::fromUtf8("ActuatorButton07_03")); + ActuatorButton07_03->setEnabled(true); + ActuatorButton07_03->setGeometry(QRect(250, 690, 10, 10)); QPalette palette6; palette6.setBrush(QPalette::Active, QPalette::WindowText, brush); palette6.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -987,10 +997,11 @@ public: palette6.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette6.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette6.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_06->setPalette(palette6); - ActuatorButton01_07 = new QPushButton(frame); - ActuatorButton01_07->setObjectName(QString::fromUtf8("ActuatorButton01_07")); - ActuatorButton01_07->setGeometry(QRect(584, 471, 10, 10)); + ActuatorButton07_03->setPalette(palette6); + ActuatorButton07_04 = new QPushButton(frame); + ActuatorButton07_04->setObjectName(QString::fromUtf8("ActuatorButton07_04")); + ActuatorButton07_04->setEnabled(true); + ActuatorButton07_04->setGeometry(QRect(250, 250, 10, 10)); QPalette palette7; palette7.setBrush(QPalette::Active, QPalette::WindowText, brush); palette7.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1040,10 +1051,11 @@ public: palette7.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette7.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette7.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_07->setPalette(palette7); - ActuatorButton01_08 = new QPushButton(frame); - ActuatorButton01_08->setObjectName(QString::fromUtf8("ActuatorButton01_08")); - ActuatorButton01_08->setGeometry(QRect(581, 500, 10, 10)); + ActuatorButton07_04->setPalette(palette7); + ActuatorButton01_04 = new QPushButton(frame); + ActuatorButton01_04->setObjectName(QString::fromUtf8("ActuatorButton01_04")); + ActuatorButton01_04->setEnabled(false); + ActuatorButton01_04->setGeometry(QRect(552, 390, 10, 10)); QPalette palette8; palette8.setBrush(QPalette::Active, QPalette::WindowText, brush); palette8.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1093,10 +1105,11 @@ public: palette8.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette8.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette8.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_08->setPalette(palette8); - ActuatorButton01_09 = new QPushButton(frame); - ActuatorButton01_09->setObjectName(QString::fromUtf8("ActuatorButton01_09")); - ActuatorButton01_09->setGeometry(QRect(571, 528, 10, 10)); + ActuatorButton01_04->setPalette(palette8); + ActuatorButton01_05 = new QPushButton(frame); + ActuatorButton01_05->setObjectName(QString::fromUtf8("ActuatorButton01_05")); + ActuatorButton01_05->setEnabled(false); + ActuatorButton01_05->setGeometry(QRect(569, 414, 10, 10)); QPalette palette9; palette9.setBrush(QPalette::Active, QPalette::WindowText, brush); palette9.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1146,10 +1159,11 @@ public: palette9.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette9.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette9.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_09->setPalette(palette9); - ActuatorButton01_10 = new QPushButton(frame); - ActuatorButton01_10->setObjectName(QString::fromUtf8("ActuatorButton01_10")); - ActuatorButton01_10->setGeometry(QRect(552, 552, 10, 10)); + ActuatorButton01_05->setPalette(palette9); + ActuatorButton01_06 = new QPushButton(frame); + ActuatorButton01_06->setObjectName(QString::fromUtf8("ActuatorButton01_06")); + ActuatorButton01_06->setEnabled(false); + ActuatorButton01_06->setGeometry(QRect(580, 442, 10, 10)); QPalette palette10; palette10.setBrush(QPalette::Active, QPalette::WindowText, brush); palette10.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1199,10 +1213,11 @@ public: palette10.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette10.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette10.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_10->setPalette(palette10); - ActuatorButton01_11 = new QPushButton(frame); - ActuatorButton01_11->setObjectName(QString::fromUtf8("ActuatorButton01_11")); - ActuatorButton01_11->setGeometry(QRect(528, 570, 10, 10)); + ActuatorButton01_06->setPalette(palette10); + ActuatorButton01_07 = new QPushButton(frame); + ActuatorButton01_07->setObjectName(QString::fromUtf8("ActuatorButton01_07")); + ActuatorButton01_07->setEnabled(false); + ActuatorButton01_07->setGeometry(QRect(584, 471, 10, 10)); QPalette palette11; palette11.setBrush(QPalette::Active, QPalette::WindowText, brush); palette11.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1252,10 +1267,11 @@ public: palette11.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette11.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette11.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_11->setPalette(palette11); - ActuatorButton01_12 = new QPushButton(frame); - ActuatorButton01_12->setObjectName(QString::fromUtf8("ActuatorButton01_12")); - ActuatorButton01_12->setGeometry(QRect(500, 581, 10, 10)); + ActuatorButton01_07->setPalette(palette11); + ActuatorButton01_08 = new QPushButton(frame); + ActuatorButton01_08->setObjectName(QString::fromUtf8("ActuatorButton01_08")); + ActuatorButton01_08->setEnabled(false); + ActuatorButton01_08->setGeometry(QRect(581, 500, 10, 10)); QPalette palette12; palette12.setBrush(QPalette::Active, QPalette::WindowText, brush); palette12.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1305,10 +1321,11 @@ public: palette12.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette12.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette12.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_12->setPalette(palette12); - ActuatorButton01_13 = new QPushButton(frame); - ActuatorButton01_13->setObjectName(QString::fromUtf8("ActuatorButton01_13")); - ActuatorButton01_13->setGeometry(QRect(470, 585, 10, 10)); + ActuatorButton01_08->setPalette(palette12); + ActuatorButton01_09 = new QPushButton(frame); + ActuatorButton01_09->setObjectName(QString::fromUtf8("ActuatorButton01_09")); + ActuatorButton01_09->setEnabled(false); + ActuatorButton01_09->setGeometry(QRect(571, 528, 10, 10)); QPalette palette13; palette13.setBrush(QPalette::Active, QPalette::WindowText, brush); palette13.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1358,10 +1375,11 @@ public: palette13.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette13.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette13.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_13->setPalette(palette13); - ActuatorButton01_14 = new QPushButton(frame); - ActuatorButton01_14->setObjectName(QString::fromUtf8("ActuatorButton01_14")); - ActuatorButton01_14->setGeometry(QRect(441, 581, 10, 10)); + ActuatorButton01_09->setPalette(palette13); + ActuatorButton01_10 = new QPushButton(frame); + ActuatorButton01_10->setObjectName(QString::fromUtf8("ActuatorButton01_10")); + ActuatorButton01_10->setEnabled(false); + ActuatorButton01_10->setGeometry(QRect(552, 552, 10, 10)); QPalette palette14; palette14.setBrush(QPalette::Active, QPalette::WindowText, brush); palette14.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1411,10 +1429,11 @@ public: palette14.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette14.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette14.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_14->setPalette(palette14); - ActuatorButton01_15 = new QPushButton(frame); - ActuatorButton01_15->setObjectName(QString::fromUtf8("ActuatorButton01_15")); - ActuatorButton01_15->setGeometry(QRect(413, 570, 10, 10)); + ActuatorButton01_10->setPalette(palette14); + ActuatorButton01_11 = new QPushButton(frame); + ActuatorButton01_11->setObjectName(QString::fromUtf8("ActuatorButton01_11")); + ActuatorButton01_11->setEnabled(false); + ActuatorButton01_11->setGeometry(QRect(528, 570, 10, 10)); QPalette palette15; palette15.setBrush(QPalette::Active, QPalette::WindowText, brush); palette15.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1464,10 +1483,11 @@ public: palette15.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette15.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette15.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_15->setPalette(palette15); - ActuatorButton01_16 = new QPushButton(frame); - ActuatorButton01_16->setObjectName(QString::fromUtf8("ActuatorButton01_16")); - ActuatorButton01_16->setGeometry(QRect(390, 552, 10, 10)); + ActuatorButton01_11->setPalette(palette15); + ActuatorButton01_12 = new QPushButton(frame); + ActuatorButton01_12->setObjectName(QString::fromUtf8("ActuatorButton01_12")); + ActuatorButton01_12->setEnabled(false); + ActuatorButton01_12->setGeometry(QRect(500, 581, 10, 10)); QPalette palette16; palette16.setBrush(QPalette::Active, QPalette::WindowText, brush); palette16.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1517,10 +1537,11 @@ public: palette16.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette16.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette16.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_16->setPalette(palette16); - ActuatorButton01_17 = new QPushButton(frame); - ActuatorButton01_17->setObjectName(QString::fromUtf8("ActuatorButton01_17")); - ActuatorButton01_17->setGeometry(QRect(372, 528, 10, 10)); + ActuatorButton01_12->setPalette(palette16); + ActuatorButton01_13 = new QPushButton(frame); + ActuatorButton01_13->setObjectName(QString::fromUtf8("ActuatorButton01_13")); + ActuatorButton01_13->setEnabled(false); + ActuatorButton01_13->setGeometry(QRect(470, 585, 10, 10)); QPalette palette17; palette17.setBrush(QPalette::Active, QPalette::WindowText, brush); palette17.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1570,10 +1591,11 @@ public: palette17.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette17.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette17.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_17->setPalette(palette17); - ActuatorButton01_18 = new QPushButton(frame); - ActuatorButton01_18->setObjectName(QString::fromUtf8("ActuatorButton01_18")); - ActuatorButton01_18->setGeometry(QRect(362, 500, 10, 10)); + ActuatorButton01_13->setPalette(palette17); + ActuatorButton01_14 = new QPushButton(frame); + ActuatorButton01_14->setObjectName(QString::fromUtf8("ActuatorButton01_14")); + ActuatorButton01_14->setEnabled(false); + ActuatorButton01_14->setGeometry(QRect(441, 581, 10, 10)); QPalette palette18; palette18.setBrush(QPalette::Active, QPalette::WindowText, brush); palette18.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1623,10 +1645,11 @@ public: palette18.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette18.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette18.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_18->setPalette(palette18); - ActuatorButton01_19 = new QPushButton(frame); - ActuatorButton01_19->setObjectName(QString::fromUtf8("ActuatorButton01_19")); - ActuatorButton01_19->setGeometry(QRect(357, 471, 10, 10)); + ActuatorButton01_14->setPalette(palette18); + ActuatorButton01_15 = new QPushButton(frame); + ActuatorButton01_15->setObjectName(QString::fromUtf8("ActuatorButton01_15")); + ActuatorButton01_15->setEnabled(false); + ActuatorButton01_15->setGeometry(QRect(413, 570, 10, 10)); QPalette palette19; palette19.setBrush(QPalette::Active, QPalette::WindowText, brush); palette19.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1676,10 +1699,11 @@ public: palette19.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette19.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette19.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_19->setPalette(palette19); - ActuatorButton01_20 = new QPushButton(frame); - ActuatorButton01_20->setObjectName(QString::fromUtf8("ActuatorButton01_20")); - ActuatorButton01_20->setGeometry(QRect(361, 442, 10, 10)); + ActuatorButton01_15->setPalette(palette19); + ActuatorButton01_16 = new QPushButton(frame); + ActuatorButton01_16->setObjectName(QString::fromUtf8("ActuatorButton01_16")); + ActuatorButton01_16->setEnabled(false); + ActuatorButton01_16->setGeometry(QRect(390, 552, 10, 10)); QPalette palette20; palette20.setBrush(QPalette::Active, QPalette::WindowText, brush); palette20.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1729,10 +1753,11 @@ public: palette20.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette20.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette20.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_20->setPalette(palette20); - ActuatorButton01_21 = new QPushButton(frame); - ActuatorButton01_21->setObjectName(QString::fromUtf8("ActuatorButton01_21")); - ActuatorButton01_21->setGeometry(QRect(371, 413, 10, 10)); + ActuatorButton01_16->setPalette(palette20); + ActuatorButton01_17 = new QPushButton(frame); + ActuatorButton01_17->setObjectName(QString::fromUtf8("ActuatorButton01_17")); + ActuatorButton01_17->setEnabled(false); + ActuatorButton01_17->setGeometry(QRect(372, 528, 10, 10)); QPalette palette21; palette21.setBrush(QPalette::Active, QPalette::WindowText, brush); palette21.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1782,10 +1807,11 @@ public: palette21.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette21.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette21.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_21->setPalette(palette21); - ActuatorButton01_22 = new QPushButton(frame); - ActuatorButton01_22->setObjectName(QString::fromUtf8("ActuatorButton01_22")); - ActuatorButton01_22->setGeometry(QRect(390, 391, 10, 10)); + ActuatorButton01_17->setPalette(palette21); + ActuatorButton01_18 = new QPushButton(frame); + ActuatorButton01_18->setObjectName(QString::fromUtf8("ActuatorButton01_18")); + ActuatorButton01_18->setEnabled(false); + ActuatorButton01_18->setGeometry(QRect(362, 500, 10, 10)); QPalette palette22; palette22.setBrush(QPalette::Active, QPalette::WindowText, brush); palette22.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1835,10 +1861,11 @@ public: palette22.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette22.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette22.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_22->setPalette(palette22); - ActuatorButton01_23 = new QPushButton(frame); - ActuatorButton01_23->setObjectName(QString::fromUtf8("ActuatorButton01_23")); - ActuatorButton01_23->setGeometry(QRect(414, 373, 10, 10)); + ActuatorButton01_18->setPalette(palette22); + ActuatorButton01_19 = new QPushButton(frame); + ActuatorButton01_19->setObjectName(QString::fromUtf8("ActuatorButton01_19")); + ActuatorButton01_19->setEnabled(false); + ActuatorButton01_19->setGeometry(QRect(357, 471, 10, 10)); QPalette palette23; palette23.setBrush(QPalette::Active, QPalette::WindowText, brush); palette23.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1888,10 +1915,11 @@ public: palette23.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette23.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette23.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_23->setPalette(palette23); - ActuatorButton01_24 = new QPushButton(frame); - ActuatorButton01_24->setObjectName(QString::fromUtf8("ActuatorButton01_24")); - ActuatorButton01_24->setGeometry(QRect(442, 361, 10, 10)); + ActuatorButton01_19->setPalette(palette23); + ActuatorButton01_20 = new QPushButton(frame); + ActuatorButton01_20->setObjectName(QString::fromUtf8("ActuatorButton01_20")); + ActuatorButton01_20->setEnabled(false); + ActuatorButton01_20->setGeometry(QRect(361, 442, 10, 10)); QPalette palette24; palette24.setBrush(QPalette::Active, QPalette::WindowText, brush); palette24.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1941,10 +1969,11 @@ public: palette24.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette24.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette24.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton01_24->setPalette(palette24); - ActuatorButton02_01 = new QPushButton(frame); - ActuatorButton02_01->setObjectName(QString::fromUtf8("ActuatorButton02_01")); - ActuatorButton02_01->setGeometry(QRect(471, 298, 10, 10)); + ActuatorButton01_20->setPalette(palette24); + ActuatorButton01_21 = new QPushButton(frame); + ActuatorButton01_21->setObjectName(QString::fromUtf8("ActuatorButton01_21")); + ActuatorButton01_21->setEnabled(false); + ActuatorButton01_21->setGeometry(QRect(371, 413, 10, 10)); QPalette palette25; palette25.setBrush(QPalette::Active, QPalette::WindowText, brush); palette25.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -1994,10 +2023,11 @@ public: palette25.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette25.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette25.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_01->setPalette(palette25); - ActuatorButton02_02 = new QPushButton(frame); - ActuatorButton02_02->setObjectName(QString::fromUtf8("ActuatorButton02_02")); - ActuatorButton02_02->setGeometry(QRect(494, 300, 10, 10)); + ActuatorButton01_21->setPalette(palette25); + ActuatorButton01_22 = new QPushButton(frame); + ActuatorButton01_22->setObjectName(QString::fromUtf8("ActuatorButton01_22")); + ActuatorButton01_22->setEnabled(false); + ActuatorButton01_22->setGeometry(QRect(390, 391, 10, 10)); QPalette palette26; palette26.setBrush(QPalette::Active, QPalette::WindowText, brush); palette26.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2047,10 +2077,11 @@ public: palette26.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette26.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette26.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_02->setPalette(palette26); - ActuatorButton02_03 = new QPushButton(frame); - ActuatorButton02_03->setObjectName(QString::fromUtf8("ActuatorButton02_03")); - ActuatorButton02_03->setGeometry(QRect(516, 304, 10, 10)); + ActuatorButton01_22->setPalette(palette26); + ActuatorButton01_23 = new QPushButton(frame); + ActuatorButton01_23->setObjectName(QString::fromUtf8("ActuatorButton01_23")); + ActuatorButton01_23->setEnabled(false); + ActuatorButton01_23->setGeometry(QRect(414, 373, 10, 10)); QPalette palette27; palette27.setBrush(QPalette::Active, QPalette::WindowText, brush); palette27.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2100,10 +2131,11 @@ public: palette27.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette27.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette27.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_03->setPalette(palette27); - ActuatorButton02_04 = new QPushButton(frame); - ActuatorButton02_04->setObjectName(QString::fromUtf8("ActuatorButton02_04")); - ActuatorButton02_04->setGeometry(QRect(537, 312, 10, 10)); + ActuatorButton01_23->setPalette(palette27); + ActuatorButton01_24 = new QPushButton(frame); + ActuatorButton01_24->setObjectName(QString::fromUtf8("ActuatorButton01_24")); + ActuatorButton01_24->setEnabled(false); + ActuatorButton01_24->setGeometry(QRect(442, 361, 10, 10)); QPalette palette28; palette28.setBrush(QPalette::Active, QPalette::WindowText, brush); palette28.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2153,10 +2185,10 @@ public: palette28.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette28.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette28.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_04->setPalette(palette28); - ActuatorButton02_05 = new QPushButton(frame); - ActuatorButton02_05->setObjectName(QString::fromUtf8("ActuatorButton02_05")); - ActuatorButton02_05->setGeometry(QRect(557, 321, 10, 10)); + ActuatorButton01_24->setPalette(palette28); + ActuatorButton02_01 = new QPushButton(frame); + ActuatorButton02_01->setObjectName(QString::fromUtf8("ActuatorButton02_01")); + ActuatorButton02_01->setGeometry(QRect(471, 298, 10, 10)); QPalette palette29; palette29.setBrush(QPalette::Active, QPalette::WindowText, brush); palette29.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2206,10 +2238,10 @@ public: palette29.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette29.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette29.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_05->setPalette(palette29); - ActuatorButton02_06 = new QPushButton(frame); - ActuatorButton02_06->setObjectName(QString::fromUtf8("ActuatorButton02_06")); - ActuatorButton02_06->setGeometry(QRect(576, 334, 10, 10)); + ActuatorButton02_01->setPalette(palette29); + ActuatorButton02_02 = new QPushButton(frame); + ActuatorButton02_02->setObjectName(QString::fromUtf8("ActuatorButton02_02")); + ActuatorButton02_02->setGeometry(QRect(494, 300, 10, 10)); QPalette palette30; palette30.setBrush(QPalette::Active, QPalette::WindowText, brush); palette30.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2259,10 +2291,10 @@ public: palette30.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette30.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette30.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_06->setPalette(palette30); - ActuatorButton02_07 = new QPushButton(frame); - ActuatorButton02_07->setObjectName(QString::fromUtf8("ActuatorButton02_07")); - ActuatorButton02_07->setGeometry(QRect(594, 349, 10, 10)); + ActuatorButton02_02->setPalette(palette30); + ActuatorButton02_03 = new QPushButton(frame); + ActuatorButton02_03->setObjectName(QString::fromUtf8("ActuatorButton02_03")); + ActuatorButton02_03->setGeometry(QRect(516, 304, 10, 10)); QPalette palette31; palette31.setBrush(QPalette::Active, QPalette::WindowText, brush); palette31.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2312,10 +2344,10 @@ public: palette31.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette31.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette31.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_07->setPalette(palette31); - ActuatorButton02_08 = new QPushButton(frame); - ActuatorButton02_08->setObjectName(QString::fromUtf8("ActuatorButton02_08")); - ActuatorButton02_08->setGeometry(QRect(607, 365, 10, 10)); + ActuatorButton02_03->setPalette(palette31); + ActuatorButton02_04 = new QPushButton(frame); + ActuatorButton02_04->setObjectName(QString::fromUtf8("ActuatorButton02_04")); + ActuatorButton02_04->setGeometry(QRect(537, 312, 10, 10)); QPalette palette32; palette32.setBrush(QPalette::Active, QPalette::WindowText, brush); palette32.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2365,10 +2397,10 @@ public: palette32.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette32.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette32.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_08->setPalette(palette32); - ActuatorButton02_09 = new QPushButton(frame); - ActuatorButton02_09->setObjectName(QString::fromUtf8("ActuatorButton02_09")); - ActuatorButton02_09->setGeometry(QRect(620, 385, 10, 10)); + ActuatorButton02_04->setPalette(palette32); + ActuatorButton02_05 = new QPushButton(frame); + ActuatorButton02_05->setObjectName(QString::fromUtf8("ActuatorButton02_05")); + ActuatorButton02_05->setGeometry(QRect(557, 321, 10, 10)); QPalette palette33; palette33.setBrush(QPalette::Active, QPalette::WindowText, brush); palette33.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2418,10 +2450,10 @@ public: palette33.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette33.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette33.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_09->setPalette(palette33); - ActuatorButton02_10 = new QPushButton(frame); - ActuatorButton02_10->setObjectName(QString::fromUtf8("ActuatorButton02_10")); - ActuatorButton02_10->setGeometry(QRect(630, 405, 10, 10)); + ActuatorButton02_05->setPalette(palette33); + ActuatorButton02_06 = new QPushButton(frame); + ActuatorButton02_06->setObjectName(QString::fromUtf8("ActuatorButton02_06")); + ActuatorButton02_06->setGeometry(QRect(576, 334, 10, 10)); QPalette palette34; palette34.setBrush(QPalette::Active, QPalette::WindowText, brush); palette34.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2471,10 +2503,10 @@ public: palette34.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette34.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette34.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_10->setPalette(palette34); - ActuatorButton02_11 = new QPushButton(frame); - ActuatorButton02_11->setObjectName(QString::fromUtf8("ActuatorButton02_11")); - ActuatorButton02_11->setGeometry(QRect(637, 426, 10, 10)); + ActuatorButton02_06->setPalette(palette34); + ActuatorButton02_07 = new QPushButton(frame); + ActuatorButton02_07->setObjectName(QString::fromUtf8("ActuatorButton02_07")); + ActuatorButton02_07->setGeometry(QRect(594, 349, 10, 10)); QPalette palette35; palette35.setBrush(QPalette::Active, QPalette::WindowText, brush); palette35.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2524,10 +2556,10 @@ public: palette35.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette35.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette35.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_11->setPalette(palette35); - ActuatorButton02_12 = new QPushButton(frame); - ActuatorButton02_12->setObjectName(QString::fromUtf8("ActuatorButton02_12")); - ActuatorButton02_12->setGeometry(QRect(642, 448, 10, 10)); + ActuatorButton02_07->setPalette(palette35); + ActuatorButton02_08 = new QPushButton(frame); + ActuatorButton02_08->setObjectName(QString::fromUtf8("ActuatorButton02_08")); + ActuatorButton02_08->setGeometry(QRect(607, 365, 10, 10)); QPalette palette36; palette36.setBrush(QPalette::Active, QPalette::WindowText, brush); palette36.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2577,10 +2609,10 @@ public: palette36.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette36.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette36.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_12->setPalette(palette36); - ActuatorButton02_13 = new QPushButton(frame); - ActuatorButton02_13->setObjectName(QString::fromUtf8("ActuatorButton02_13")); - ActuatorButton02_13->setGeometry(QRect(643, 472, 10, 10)); + ActuatorButton02_08->setPalette(palette36); + ActuatorButton02_09 = new QPushButton(frame); + ActuatorButton02_09->setObjectName(QString::fromUtf8("ActuatorButton02_09")); + ActuatorButton02_09->setGeometry(QRect(620, 385, 10, 10)); QPalette palette37; palette37.setBrush(QPalette::Active, QPalette::WindowText, brush); palette37.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2630,10 +2662,10 @@ public: palette37.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette37.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette37.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_13->setPalette(palette37); - ActuatorButton02_14 = new QPushButton(frame); - ActuatorButton02_14->setObjectName(QString::fromUtf8("ActuatorButton02_14")); - ActuatorButton02_14->setGeometry(QRect(642, 494, 10, 10)); + ActuatorButton02_09->setPalette(palette37); + ActuatorButton02_10 = new QPushButton(frame); + ActuatorButton02_10->setObjectName(QString::fromUtf8("ActuatorButton02_10")); + ActuatorButton02_10->setGeometry(QRect(630, 405, 10, 10)); QPalette palette38; palette38.setBrush(QPalette::Active, QPalette::WindowText, brush); palette38.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2683,10 +2715,10 @@ public: palette38.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette38.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette38.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_14->setPalette(palette38); - ActuatorButton02_15 = new QPushButton(frame); - ActuatorButton02_15->setObjectName(QString::fromUtf8("ActuatorButton02_15")); - ActuatorButton02_15->setGeometry(QRect(638, 516, 10, 10)); + ActuatorButton02_10->setPalette(palette38); + ActuatorButton02_11 = new QPushButton(frame); + ActuatorButton02_11->setObjectName(QString::fromUtf8("ActuatorButton02_11")); + ActuatorButton02_11->setGeometry(QRect(637, 426, 10, 10)); QPalette palette39; palette39.setBrush(QPalette::Active, QPalette::WindowText, brush); palette39.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2736,10 +2768,10 @@ public: palette39.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette39.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette39.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_15->setPalette(palette39); - ActuatorButton02_16 = new QPushButton(frame); - ActuatorButton02_16->setObjectName(QString::fromUtf8("ActuatorButton02_16")); - ActuatorButton02_16->setGeometry(QRect(630, 537, 10, 10)); + ActuatorButton02_11->setPalette(palette39); + ActuatorButton02_12 = new QPushButton(frame); + ActuatorButton02_12->setObjectName(QString::fromUtf8("ActuatorButton02_12")); + ActuatorButton02_12->setGeometry(QRect(642, 448, 10, 10)); QPalette palette40; palette40.setBrush(QPalette::Active, QPalette::WindowText, brush); palette40.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2789,10 +2821,10 @@ public: palette40.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette40.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette40.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_16->setPalette(palette40); - ActuatorButton02_17 = new QPushButton(frame); - ActuatorButton02_17->setObjectName(QString::fromUtf8("ActuatorButton02_17")); - ActuatorButton02_17->setGeometry(QRect(620, 557, 10, 10)); + ActuatorButton02_12->setPalette(palette40); + ActuatorButton02_13 = new QPushButton(frame); + ActuatorButton02_13->setObjectName(QString::fromUtf8("ActuatorButton02_13")); + ActuatorButton02_13->setGeometry(QRect(643, 472, 10, 10)); QPalette palette41; palette41.setBrush(QPalette::Active, QPalette::WindowText, brush); palette41.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2842,10 +2874,10 @@ public: palette41.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette41.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette41.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_17->setPalette(palette41); - ActuatorButton02_18 = new QPushButton(frame); - ActuatorButton02_18->setObjectName(QString::fromUtf8("ActuatorButton02_18")); - ActuatorButton02_18->setGeometry(QRect(608, 576, 10, 10)); + ActuatorButton02_13->setPalette(palette41); + ActuatorButton02_14 = new QPushButton(frame); + ActuatorButton02_14->setObjectName(QString::fromUtf8("ActuatorButton02_14")); + ActuatorButton02_14->setGeometry(QRect(642, 494, 10, 10)); QPalette palette42; palette42.setBrush(QPalette::Active, QPalette::WindowText, brush); palette42.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2895,10 +2927,10 @@ public: palette42.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette42.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette42.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_18->setPalette(palette42); - ActuatorButton02_19 = new QPushButton(frame); - ActuatorButton02_19->setObjectName(QString::fromUtf8("ActuatorButton02_19")); - ActuatorButton02_19->setGeometry(QRect(593, 593, 10, 10)); + ActuatorButton02_14->setPalette(palette42); + ActuatorButton02_15 = new QPushButton(frame); + ActuatorButton02_15->setObjectName(QString::fromUtf8("ActuatorButton02_15")); + ActuatorButton02_15->setGeometry(QRect(638, 516, 10, 10)); QPalette palette43; palette43.setBrush(QPalette::Active, QPalette::WindowText, brush); palette43.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -2948,10 +2980,10 @@ public: palette43.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette43.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette43.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_19->setPalette(palette43); - ActuatorButton02_20 = new QPushButton(frame); - ActuatorButton02_20->setObjectName(QString::fromUtf8("ActuatorButton02_20")); - ActuatorButton02_20->setGeometry(QRect(576, 607, 10, 10)); + ActuatorButton02_15->setPalette(palette43); + ActuatorButton02_16 = new QPushButton(frame); + ActuatorButton02_16->setObjectName(QString::fromUtf8("ActuatorButton02_16")); + ActuatorButton02_16->setGeometry(QRect(630, 537, 10, 10)); QPalette palette44; palette44.setBrush(QPalette::Active, QPalette::WindowText, brush); palette44.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3001,10 +3033,10 @@ public: palette44.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette44.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette44.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_20->setPalette(palette44); - ActuatorButton02_21 = new QPushButton(frame); - ActuatorButton02_21->setObjectName(QString::fromUtf8("ActuatorButton02_21")); - ActuatorButton02_21->setGeometry(QRect(557, 620, 10, 10)); + ActuatorButton02_16->setPalette(palette44); + ActuatorButton02_17 = new QPushButton(frame); + ActuatorButton02_17->setObjectName(QString::fromUtf8("ActuatorButton02_17")); + ActuatorButton02_17->setGeometry(QRect(620, 557, 10, 10)); QPalette palette45; palette45.setBrush(QPalette::Active, QPalette::WindowText, brush); palette45.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3054,10 +3086,10 @@ public: palette45.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette45.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette45.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_21->setPalette(palette45); - ActuatorButton02_22 = new QPushButton(frame); - ActuatorButton02_22->setObjectName(QString::fromUtf8("ActuatorButton02_22")); - ActuatorButton02_22->setGeometry(QRect(536, 630, 10, 10)); + ActuatorButton02_17->setPalette(palette45); + ActuatorButton02_18 = new QPushButton(frame); + ActuatorButton02_18->setObjectName(QString::fromUtf8("ActuatorButton02_18")); + ActuatorButton02_18->setGeometry(QRect(608, 576, 10, 10)); QPalette palette46; palette46.setBrush(QPalette::Active, QPalette::WindowText, brush); palette46.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3107,11 +3139,11 @@ public: palette46.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette46.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette46.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_22->setPalette(palette46); - ActuatorButton02_23 = new QPushButton(frame); - ActuatorButton02_23->setObjectName(QString::fromUtf8("ActuatorButton02_23")); - ActuatorButton02_23->setGeometry(QRect(515, 637, 10, 10)); - QPalette palette47; + ActuatorButton02_18->setPalette(palette46); + ActuatorButton02_19 = new QPushButton(frame); + ActuatorButton02_19->setObjectName(QString::fromUtf8("ActuatorButton02_19")); + ActuatorButton02_19->setGeometry(QRect(593, 593, 10, 10)); + QPalette palette47; palette47.setBrush(QPalette::Active, QPalette::WindowText, brush); palette47.setBrush(QPalette::Active, QPalette::Button, brush1); palette47.setBrush(QPalette::Active, QPalette::Light, brush2); @@ -3160,10 +3192,10 @@ public: palette47.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette47.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette47.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_23->setPalette(palette47); - ActuatorButton02_24 = new QPushButton(frame); - ActuatorButton02_24->setObjectName(QString::fromUtf8("ActuatorButton02_24")); - ActuatorButton02_24->setGeometry(QRect(493, 642, 10, 10)); + ActuatorButton02_19->setPalette(palette47); + ActuatorButton02_20 = new QPushButton(frame); + ActuatorButton02_20->setObjectName(QString::fromUtf8("ActuatorButton02_20")); + ActuatorButton02_20->setGeometry(QRect(576, 607, 10, 10)); QPalette palette48; palette48.setBrush(QPalette::Active, QPalette::WindowText, brush); palette48.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3213,10 +3245,10 @@ public: palette48.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette48.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette48.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_24->setPalette(palette48); - ActuatorButton02_25 = new QPushButton(frame); - ActuatorButton02_25->setObjectName(QString::fromUtf8("ActuatorButton02_25")); - ActuatorButton02_25->setGeometry(QRect(471, 644, 10, 10)); + ActuatorButton02_20->setPalette(palette48); + ActuatorButton02_21 = new QPushButton(frame); + ActuatorButton02_21->setObjectName(QString::fromUtf8("ActuatorButton02_21")); + ActuatorButton02_21->setGeometry(QRect(557, 620, 10, 10)); QPalette palette49; palette49.setBrush(QPalette::Active, QPalette::WindowText, brush); palette49.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3266,10 +3298,10 @@ public: palette49.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette49.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette49.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_25->setPalette(palette49); - ActuatorButton02_26 = new QPushButton(frame); - ActuatorButton02_26->setObjectName(QString::fromUtf8("ActuatorButton02_26")); - ActuatorButton02_26->setGeometry(QRect(449, 642, 10, 10)); + ActuatorButton02_21->setPalette(palette49); + ActuatorButton02_22 = new QPushButton(frame); + ActuatorButton02_22->setObjectName(QString::fromUtf8("ActuatorButton02_22")); + ActuatorButton02_22->setGeometry(QRect(536, 630, 10, 10)); QPalette palette50; palette50.setBrush(QPalette::Active, QPalette::WindowText, brush); palette50.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3319,10 +3351,10 @@ public: palette50.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette50.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette50.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_26->setPalette(palette50); - ActuatorButton02_27 = new QPushButton(frame); - ActuatorButton02_27->setObjectName(QString::fromUtf8("ActuatorButton02_27")); - ActuatorButton02_27->setGeometry(QRect(427, 637, 10, 10)); + ActuatorButton02_22->setPalette(palette50); + ActuatorButton02_23 = new QPushButton(frame); + ActuatorButton02_23->setObjectName(QString::fromUtf8("ActuatorButton02_23")); + ActuatorButton02_23->setGeometry(QRect(515, 637, 10, 10)); QPalette palette51; palette51.setBrush(QPalette::Active, QPalette::WindowText, brush); palette51.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3372,10 +3404,10 @@ public: palette51.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette51.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette51.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_27->setPalette(palette51); - ActuatorButton02_28 = new QPushButton(frame); - ActuatorButton02_28->setObjectName(QString::fromUtf8("ActuatorButton02_28")); - ActuatorButton02_28->setGeometry(QRect(405, 631, 10, 10)); + ActuatorButton02_23->setPalette(palette51); + ActuatorButton02_24 = new QPushButton(frame); + ActuatorButton02_24->setObjectName(QString::fromUtf8("ActuatorButton02_24")); + ActuatorButton02_24->setGeometry(QRect(493, 642, 10, 10)); QPalette palette52; palette52.setBrush(QPalette::Active, QPalette::WindowText, brush); palette52.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3425,10 +3457,10 @@ public: palette52.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette52.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette52.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_28->setPalette(palette52); - ActuatorButton02_29 = new QPushButton(frame); - ActuatorButton02_29->setObjectName(QString::fromUtf8("ActuatorButton02_29")); - ActuatorButton02_29->setGeometry(QRect(385, 620, 10, 10)); + ActuatorButton02_24->setPalette(palette52); + ActuatorButton02_25 = new QPushButton(frame); + ActuatorButton02_25->setObjectName(QString::fromUtf8("ActuatorButton02_25")); + ActuatorButton02_25->setGeometry(QRect(471, 644, 10, 10)); QPalette palette53; palette53.setBrush(QPalette::Active, QPalette::WindowText, brush); palette53.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3478,10 +3510,10 @@ public: palette53.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette53.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette53.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_29->setPalette(palette53); - ActuatorButton02_30 = new QPushButton(frame); - ActuatorButton02_30->setObjectName(QString::fromUtf8("ActuatorButton02_30")); - ActuatorButton02_30->setGeometry(QRect(365, 607, 10, 10)); + ActuatorButton02_25->setPalette(palette53); + ActuatorButton02_26 = new QPushButton(frame); + ActuatorButton02_26->setObjectName(QString::fromUtf8("ActuatorButton02_26")); + ActuatorButton02_26->setGeometry(QRect(449, 642, 10, 10)); QPalette palette54; palette54.setBrush(QPalette::Active, QPalette::WindowText, brush); palette54.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3531,10 +3563,10 @@ public: palette54.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette54.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette54.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_30->setPalette(palette54); - ActuatorButton02_31 = new QPushButton(frame); - ActuatorButton02_31->setObjectName(QString::fromUtf8("ActuatorButton02_31")); - ActuatorButton02_31->setGeometry(QRect(349, 592, 10, 10)); + ActuatorButton02_26->setPalette(palette54); + ActuatorButton02_27 = new QPushButton(frame); + ActuatorButton02_27->setObjectName(QString::fromUtf8("ActuatorButton02_27")); + ActuatorButton02_27->setGeometry(QRect(427, 637, 10, 10)); QPalette palette55; palette55.setBrush(QPalette::Active, QPalette::WindowText, brush); palette55.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3584,10 +3616,10 @@ public: palette55.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette55.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette55.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_31->setPalette(palette55); - ActuatorButton02_32 = new QPushButton(frame); - ActuatorButton02_32->setObjectName(QString::fromUtf8("ActuatorButton02_32")); - ActuatorButton02_32->setGeometry(QRect(333, 576, 10, 10)); + ActuatorButton02_27->setPalette(palette55); + ActuatorButton02_28 = new QPushButton(frame); + ActuatorButton02_28->setObjectName(QString::fromUtf8("ActuatorButton02_28")); + ActuatorButton02_28->setGeometry(QRect(405, 631, 10, 10)); QPalette palette56; palette56.setBrush(QPalette::Active, QPalette::WindowText, brush); palette56.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3637,10 +3669,10 @@ public: palette56.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette56.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette56.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_32->setPalette(palette56); - ActuatorButton02_33 = new QPushButton(frame); - ActuatorButton02_33->setObjectName(QString::fromUtf8("ActuatorButton02_33")); - ActuatorButton02_33->setGeometry(QRect(321, 557, 10, 10)); + ActuatorButton02_28->setPalette(palette56); + ActuatorButton02_29 = new QPushButton(frame); + ActuatorButton02_29->setObjectName(QString::fromUtf8("ActuatorButton02_29")); + ActuatorButton02_29->setGeometry(QRect(385, 620, 10, 10)); QPalette palette57; palette57.setBrush(QPalette::Active, QPalette::WindowText, brush); palette57.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3690,10 +3722,10 @@ public: palette57.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette57.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette57.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_33->setPalette(palette57); - ActuatorButton02_34 = new QPushButton(frame); - ActuatorButton02_34->setObjectName(QString::fromUtf8("ActuatorButton02_34")); - ActuatorButton02_34->setGeometry(QRect(312, 536, 10, 10)); + ActuatorButton02_29->setPalette(palette57); + ActuatorButton02_30 = new QPushButton(frame); + ActuatorButton02_30->setObjectName(QString::fromUtf8("ActuatorButton02_30")); + ActuatorButton02_30->setGeometry(QRect(365, 607, 10, 10)); QPalette palette58; palette58.setBrush(QPalette::Active, QPalette::WindowText, brush); palette58.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3743,10 +3775,10 @@ public: palette58.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette58.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette58.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_34->setPalette(palette58); - ActuatorButton02_35 = new QPushButton(frame); - ActuatorButton02_35->setObjectName(QString::fromUtf8("ActuatorButton02_35")); - ActuatorButton02_35->setGeometry(QRect(304, 515, 10, 10)); + ActuatorButton02_30->setPalette(palette58); + ActuatorButton02_31 = new QPushButton(frame); + ActuatorButton02_31->setObjectName(QString::fromUtf8("ActuatorButton02_31")); + ActuatorButton02_31->setGeometry(QRect(349, 592, 10, 10)); QPalette palette59; palette59.setBrush(QPalette::Active, QPalette::WindowText, brush); palette59.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3796,10 +3828,10 @@ public: palette59.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette59.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette59.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_35->setPalette(palette59); - ActuatorButton02_36 = new QPushButton(frame); - ActuatorButton02_36->setObjectName(QString::fromUtf8("ActuatorButton02_36")); - ActuatorButton02_36->setGeometry(QRect(300, 493, 10, 10)); + ActuatorButton02_31->setPalette(palette59); + ActuatorButton02_32 = new QPushButton(frame); + ActuatorButton02_32->setObjectName(QString::fromUtf8("ActuatorButton02_32")); + ActuatorButton02_32->setGeometry(QRect(333, 576, 10, 10)); QPalette palette60; palette60.setBrush(QPalette::Active, QPalette::WindowText, brush); palette60.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3849,10 +3881,10 @@ public: palette60.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette60.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette60.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_36->setPalette(palette60); - ActuatorButton02_37 = new QPushButton(frame); - ActuatorButton02_37->setObjectName(QString::fromUtf8("ActuatorButton02_37")); - ActuatorButton02_37->setGeometry(QRect(299, 471, 10, 10)); + ActuatorButton02_32->setPalette(palette60); + ActuatorButton02_33 = new QPushButton(frame); + ActuatorButton02_33->setObjectName(QString::fromUtf8("ActuatorButton02_33")); + ActuatorButton02_33->setGeometry(QRect(321, 557, 10, 10)); QPalette palette61; palette61.setBrush(QPalette::Active, QPalette::WindowText, brush); palette61.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3902,10 +3934,10 @@ public: palette61.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette61.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette61.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_37->setPalette(palette61); - ActuatorButton02_38 = new QPushButton(frame); - ActuatorButton02_38->setObjectName(QString::fromUtf8("ActuatorButton02_38")); - ActuatorButton02_38->setGeometry(QRect(300, 449, 10, 10)); + ActuatorButton02_33->setPalette(palette61); + ActuatorButton02_34 = new QPushButton(frame); + ActuatorButton02_34->setObjectName(QString::fromUtf8("ActuatorButton02_34")); + ActuatorButton02_34->setGeometry(QRect(312, 536, 10, 10)); QPalette palette62; palette62.setBrush(QPalette::Active, QPalette::WindowText, brush); palette62.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -3955,10 +3987,10 @@ public: palette62.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette62.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette62.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_38->setPalette(palette62); - ActuatorButton02_39 = new QPushButton(frame); - ActuatorButton02_39->setObjectName(QString::fromUtf8("ActuatorButton02_39")); - ActuatorButton02_39->setGeometry(QRect(304, 427, 10, 10)); + ActuatorButton02_34->setPalette(palette62); + ActuatorButton02_35 = new QPushButton(frame); + ActuatorButton02_35->setObjectName(QString::fromUtf8("ActuatorButton02_35")); + ActuatorButton02_35->setGeometry(QRect(304, 515, 10, 10)); QPalette palette63; palette63.setBrush(QPalette::Active, QPalette::WindowText, brush); palette63.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4008,10 +4040,10 @@ public: palette63.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette63.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette63.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_39->setPalette(palette63); - ActuatorButton02_40 = new QPushButton(frame); - ActuatorButton02_40->setObjectName(QString::fromUtf8("ActuatorButton02_40")); - ActuatorButton02_40->setGeometry(QRect(312, 405, 10, 10)); + ActuatorButton02_35->setPalette(palette63); + ActuatorButton02_36 = new QPushButton(frame); + ActuatorButton02_36->setObjectName(QString::fromUtf8("ActuatorButton02_36")); + ActuatorButton02_36->setGeometry(QRect(300, 493, 10, 10)); QPalette palette64; palette64.setBrush(QPalette::Active, QPalette::WindowText, brush); palette64.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4061,10 +4093,10 @@ public: palette64.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette64.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette64.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_40->setPalette(palette64); - ActuatorButton02_41 = new QPushButton(frame); - ActuatorButton02_41->setObjectName(QString::fromUtf8("ActuatorButton02_41")); - ActuatorButton02_41->setGeometry(QRect(321, 385, 10, 10)); + ActuatorButton02_36->setPalette(palette64); + ActuatorButton02_37 = new QPushButton(frame); + ActuatorButton02_37->setObjectName(QString::fromUtf8("ActuatorButton02_37")); + ActuatorButton02_37->setGeometry(QRect(299, 471, 10, 10)); QPalette palette65; palette65.setBrush(QPalette::Active, QPalette::WindowText, brush); palette65.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4114,10 +4146,10 @@ public: palette65.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette65.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette65.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_41->setPalette(palette65); - ActuatorButton02_42 = new QPushButton(frame); - ActuatorButton02_42->setObjectName(QString::fromUtf8("ActuatorButton02_42")); - ActuatorButton02_42->setGeometry(QRect(334, 366, 10, 10)); + ActuatorButton02_37->setPalette(palette65); + ActuatorButton02_38 = new QPushButton(frame); + ActuatorButton02_38->setObjectName(QString::fromUtf8("ActuatorButton02_38")); + ActuatorButton02_38->setGeometry(QRect(300, 449, 10, 10)); QPalette palette66; palette66.setBrush(QPalette::Active, QPalette::WindowText, brush); palette66.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4167,10 +4199,10 @@ public: palette66.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette66.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette66.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_42->setPalette(palette66); - ActuatorButton02_43 = new QPushButton(frame); - ActuatorButton02_43->setObjectName(QString::fromUtf8("ActuatorButton02_43")); - ActuatorButton02_43->setGeometry(QRect(349, 350, 10, 10)); + ActuatorButton02_38->setPalette(palette66); + ActuatorButton02_39 = new QPushButton(frame); + ActuatorButton02_39->setObjectName(QString::fromUtf8("ActuatorButton02_39")); + ActuatorButton02_39->setGeometry(QRect(304, 427, 10, 10)); QPalette palette67; palette67.setBrush(QPalette::Active, QPalette::WindowText, brush); palette67.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4220,10 +4252,10 @@ public: palette67.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette67.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette67.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_43->setPalette(palette67); - ActuatorButton02_44 = new QPushButton(frame); - ActuatorButton02_44->setObjectName(QString::fromUtf8("ActuatorButton02_44")); - ActuatorButton02_44->setGeometry(QRect(366, 334, 10, 10)); + ActuatorButton02_39->setPalette(palette67); + ActuatorButton02_40 = new QPushButton(frame); + ActuatorButton02_40->setObjectName(QString::fromUtf8("ActuatorButton02_40")); + ActuatorButton02_40->setGeometry(QRect(312, 405, 10, 10)); QPalette palette68; palette68.setBrush(QPalette::Active, QPalette::WindowText, brush); palette68.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4273,10 +4305,10 @@ public: palette68.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette68.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette68.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_44->setPalette(palette68); - ActuatorButton02_45 = new QPushButton(frame); - ActuatorButton02_45->setObjectName(QString::fromUtf8("ActuatorButton02_45")); - ActuatorButton02_45->setGeometry(QRect(384, 322, 10, 10)); + ActuatorButton02_40->setPalette(palette68); + ActuatorButton02_41 = new QPushButton(frame); + ActuatorButton02_41->setObjectName(QString::fromUtf8("ActuatorButton02_41")); + ActuatorButton02_41->setGeometry(QRect(321, 385, 10, 10)); QPalette palette69; palette69.setBrush(QPalette::Active, QPalette::WindowText, brush); palette69.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4326,10 +4358,10 @@ public: palette69.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette69.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette69.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_45->setPalette(palette69); - ActuatorButton02_46 = new QPushButton(frame); - ActuatorButton02_46->setObjectName(QString::fromUtf8("ActuatorButton02_46")); - ActuatorButton02_46->setGeometry(QRect(404, 311, 10, 10)); + ActuatorButton02_41->setPalette(palette69); + ActuatorButton02_42 = new QPushButton(frame); + ActuatorButton02_42->setObjectName(QString::fromUtf8("ActuatorButton02_42")); + ActuatorButton02_42->setGeometry(QRect(334, 366, 10, 10)); QPalette palette70; palette70.setBrush(QPalette::Active, QPalette::WindowText, brush); palette70.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4379,10 +4411,10 @@ public: palette70.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette70.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette70.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_46->setPalette(palette70); - ActuatorButton02_47 = new QPushButton(frame); - ActuatorButton02_47->setObjectName(QString::fromUtf8("ActuatorButton02_47")); - ActuatorButton02_47->setGeometry(QRect(427, 305, 10, 10)); + ActuatorButton02_42->setPalette(palette70); + ActuatorButton02_43 = new QPushButton(frame); + ActuatorButton02_43->setObjectName(QString::fromUtf8("ActuatorButton02_43")); + ActuatorButton02_43->setGeometry(QRect(349, 350, 10, 10)); QPalette palette71; palette71.setBrush(QPalette::Active, QPalette::WindowText, brush); palette71.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4432,10 +4464,10 @@ public: palette71.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette71.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette71.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_47->setPalette(palette71); - ActuatorButton02_48 = new QPushButton(frame); - ActuatorButton02_48->setObjectName(QString::fromUtf8("ActuatorButton02_48")); - ActuatorButton02_48->setGeometry(QRect(448, 300, 10, 10)); + ActuatorButton02_43->setPalette(palette71); + ActuatorButton02_44 = new QPushButton(frame); + ActuatorButton02_44->setObjectName(QString::fromUtf8("ActuatorButton02_44")); + ActuatorButton02_44->setGeometry(QRect(366, 334, 10, 10)); QPalette palette72; palette72.setBrush(QPalette::Active, QPalette::WindowText, brush); palette72.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4485,10 +4517,10 @@ public: palette72.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette72.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette72.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton02_48->setPalette(palette72); - ActuatorButton03_01 = new QPushButton(frame); - ActuatorButton03_01->setObjectName(QString::fromUtf8("ActuatorButton03_01")); - ActuatorButton03_01->setGeometry(QRect(471, 239, 10, 10)); + ActuatorButton02_44->setPalette(palette72); + ActuatorButton02_45 = new QPushButton(frame); + ActuatorButton02_45->setObjectName(QString::fromUtf8("ActuatorButton02_45")); + ActuatorButton02_45->setGeometry(QRect(384, 322, 10, 10)); QPalette palette73; palette73.setBrush(QPalette::Active, QPalette::WindowText, brush); palette73.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4538,10 +4570,10 @@ public: palette73.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette73.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette73.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_01->setPalette(palette73); - ActuatorButton03_02 = new QPushButton(frame); - ActuatorButton03_02->setObjectName(QString::fromUtf8("ActuatorButton03_02")); - ActuatorButton03_02->setGeometry(QRect(502, 241, 10, 10)); + ActuatorButton02_45->setPalette(palette73); + ActuatorButton02_46 = new QPushButton(frame); + ActuatorButton02_46->setObjectName(QString::fromUtf8("ActuatorButton02_46")); + ActuatorButton02_46->setGeometry(QRect(404, 311, 10, 10)); QPalette palette74; palette74.setBrush(QPalette::Active, QPalette::WindowText, brush); palette74.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4591,10 +4623,10 @@ public: palette74.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette74.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette74.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_02->setPalette(palette74); - ActuatorButton03_03 = new QPushButton(frame); - ActuatorButton03_03->setObjectName(QString::fromUtf8("ActuatorButton03_03")); - ActuatorButton03_03->setGeometry(QRect(532, 248, 10, 10)); + ActuatorButton02_46->setPalette(palette74); + ActuatorButton02_47 = new QPushButton(frame); + ActuatorButton02_47->setObjectName(QString::fromUtf8("ActuatorButton02_47")); + ActuatorButton02_47->setGeometry(QRect(427, 305, 10, 10)); QPalette palette75; palette75.setBrush(QPalette::Active, QPalette::WindowText, brush); palette75.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4644,10 +4676,10 @@ public: palette75.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette75.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette75.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_03->setPalette(palette75); - ActuatorButton03_04 = new QPushButton(frame); - ActuatorButton03_04->setObjectName(QString::fromUtf8("ActuatorButton03_04")); - ActuatorButton03_04->setGeometry(QRect(560, 257, 10, 10)); + ActuatorButton02_47->setPalette(palette75); + ActuatorButton02_48 = new QPushButton(frame); + ActuatorButton02_48->setObjectName(QString::fromUtf8("ActuatorButton02_48")); + ActuatorButton02_48->setGeometry(QRect(448, 300, 10, 10)); QPalette palette76; palette76.setBrush(QPalette::Active, QPalette::WindowText, brush); palette76.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4697,10 +4729,10 @@ public: palette76.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette76.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette76.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_04->setPalette(palette76); - ActuatorButton03_05 = new QPushButton(frame); - ActuatorButton03_05->setObjectName(QString::fromUtf8("ActuatorButton03_05")); - ActuatorButton03_05->setGeometry(QRect(588, 270, 10, 10)); + ActuatorButton02_48->setPalette(palette76); + ActuatorButton03_01 = new QPushButton(frame); + ActuatorButton03_01->setObjectName(QString::fromUtf8("ActuatorButton03_01")); + ActuatorButton03_01->setGeometry(QRect(471, 239, 10, 10)); QPalette palette77; palette77.setBrush(QPalette::Active, QPalette::WindowText, brush); palette77.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4750,10 +4782,10 @@ public: palette77.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette77.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette77.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_05->setPalette(palette77); - ActuatorButton03_06 = new QPushButton(frame); - ActuatorButton03_06->setObjectName(QString::fromUtf8("ActuatorButton03_06")); - ActuatorButton03_06->setGeometry(QRect(612, 288, 10, 10)); + ActuatorButton03_01->setPalette(palette77); + ActuatorButton03_02 = new QPushButton(frame); + ActuatorButton03_02->setObjectName(QString::fromUtf8("ActuatorButton03_02")); + ActuatorButton03_02->setGeometry(QRect(502, 241, 10, 10)); QPalette palette78; palette78.setBrush(QPalette::Active, QPalette::WindowText, brush); palette78.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4803,10 +4835,10 @@ public: palette78.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette78.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette78.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_06->setPalette(palette78); - ActuatorButton03_07 = new QPushButton(frame); - ActuatorButton03_07->setObjectName(QString::fromUtf8("ActuatorButton03_07")); - ActuatorButton03_07->setGeometry(QRect(635, 307, 10, 10)); + ActuatorButton03_02->setPalette(palette78); + ActuatorButton03_03 = new QPushButton(frame); + ActuatorButton03_03->setObjectName(QString::fromUtf8("ActuatorButton03_03")); + ActuatorButton03_03->setGeometry(QRect(532, 248, 10, 10)); QPalette palette79; palette79.setBrush(QPalette::Active, QPalette::WindowText, brush); palette79.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4856,10 +4888,10 @@ public: palette79.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette79.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette79.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_07->setPalette(palette79); - ActuatorButton03_08 = new QPushButton(frame); - ActuatorButton03_08->setObjectName(QString::fromUtf8("ActuatorButton03_08")); - ActuatorButton03_08->setGeometry(QRect(654, 330, 10, 10)); + ActuatorButton03_03->setPalette(palette79); + ActuatorButton03_04 = new QPushButton(frame); + ActuatorButton03_04->setObjectName(QString::fromUtf8("ActuatorButton03_04")); + ActuatorButton03_04->setGeometry(QRect(560, 257, 10, 10)); QPalette palette80; palette80.setBrush(QPalette::Active, QPalette::WindowText, brush); palette80.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4909,10 +4941,10 @@ public: palette80.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette80.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette80.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_08->setPalette(palette80); - ActuatorButton03_09 = new QPushButton(frame); - ActuatorButton03_09->setObjectName(QString::fromUtf8("ActuatorButton03_09")); - ActuatorButton03_09->setGeometry(QRect(672, 355, 10, 10)); + ActuatorButton03_04->setPalette(palette80); + ActuatorButton03_05 = new QPushButton(frame); + ActuatorButton03_05->setObjectName(QString::fromUtf8("ActuatorButton03_05")); + ActuatorButton03_05->setGeometry(QRect(588, 270, 10, 10)); QPalette palette81; palette81.setBrush(QPalette::Active, QPalette::WindowText, brush); palette81.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -4962,10 +4994,10 @@ public: palette81.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette81.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette81.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_09->setPalette(palette81); - ActuatorButton03_10 = new QPushButton(frame); - ActuatorButton03_10->setObjectName(QString::fromUtf8("ActuatorButton03_10")); - ActuatorButton03_10->setGeometry(QRect(685, 382, 10, 10)); + ActuatorButton03_05->setPalette(palette81); + ActuatorButton03_06 = new QPushButton(frame); + ActuatorButton03_06->setObjectName(QString::fromUtf8("ActuatorButton03_06")); + ActuatorButton03_06->setGeometry(QRect(612, 288, 10, 10)); QPalette palette82; palette82.setBrush(QPalette::Active, QPalette::WindowText, brush); palette82.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5015,10 +5047,10 @@ public: palette82.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette82.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette82.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_10->setPalette(palette82); - ActuatorButton03_11 = new QPushButton(frame); - ActuatorButton03_11->setObjectName(QString::fromUtf8("ActuatorButton03_11")); - ActuatorButton03_11->setGeometry(QRect(695, 411, 10, 10)); + ActuatorButton03_06->setPalette(palette82); + ActuatorButton03_07 = new QPushButton(frame); + ActuatorButton03_07->setObjectName(QString::fromUtf8("ActuatorButton03_07")); + ActuatorButton03_07->setGeometry(QRect(635, 307, 10, 10)); QPalette palette83; palette83.setBrush(QPalette::Active, QPalette::WindowText, brush); palette83.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5068,10 +5100,10 @@ public: palette83.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette83.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette83.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_11->setPalette(palette83); - ActuatorButton03_12 = new QPushButton(frame); - ActuatorButton03_12->setObjectName(QString::fromUtf8("ActuatorButton03_12")); - ActuatorButton03_12->setGeometry(QRect(701, 441, 10, 10)); + ActuatorButton03_07->setPalette(palette83); + ActuatorButton03_08 = new QPushButton(frame); + ActuatorButton03_08->setObjectName(QString::fromUtf8("ActuatorButton03_08")); + ActuatorButton03_08->setGeometry(QRect(654, 330, 10, 10)); QPalette palette84; palette84.setBrush(QPalette::Active, QPalette::WindowText, brush); palette84.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5121,10 +5153,10 @@ public: palette84.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette84.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette84.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_12->setPalette(palette84); - ActuatorButton03_13 = new QPushButton(frame); - ActuatorButton03_13->setObjectName(QString::fromUtf8("ActuatorButton03_13")); - ActuatorButton03_13->setGeometry(QRect(703, 471, 10, 10)); + ActuatorButton03_08->setPalette(palette84); + ActuatorButton03_09 = new QPushButton(frame); + ActuatorButton03_09->setObjectName(QString::fromUtf8("ActuatorButton03_09")); + ActuatorButton03_09->setGeometry(QRect(672, 355, 10, 10)); QPalette palette85; palette85.setBrush(QPalette::Active, QPalette::WindowText, brush); palette85.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5174,10 +5206,10 @@ public: palette85.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette85.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette85.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_13->setPalette(palette85); - ActuatorButton03_14 = new QPushButton(frame); - ActuatorButton03_14->setObjectName(QString::fromUtf8("ActuatorButton03_14")); - ActuatorButton03_14->setGeometry(QRect(701, 502, 10, 10)); + ActuatorButton03_09->setPalette(palette85); + ActuatorButton03_10 = new QPushButton(frame); + ActuatorButton03_10->setObjectName(QString::fromUtf8("ActuatorButton03_10")); + ActuatorButton03_10->setGeometry(QRect(685, 382, 10, 10)); QPalette palette86; palette86.setBrush(QPalette::Active, QPalette::WindowText, brush); palette86.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5227,10 +5259,10 @@ public: palette86.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette86.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette86.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_14->setPalette(palette86); - ActuatorButton03_15 = new QPushButton(frame); - ActuatorButton03_15->setObjectName(QString::fromUtf8("ActuatorButton03_15")); - ActuatorButton03_15->setGeometry(QRect(695, 532, 10, 10)); + ActuatorButton03_10->setPalette(palette86); + ActuatorButton03_11 = new QPushButton(frame); + ActuatorButton03_11->setObjectName(QString::fromUtf8("ActuatorButton03_11")); + ActuatorButton03_11->setGeometry(QRect(695, 411, 10, 10)); QPalette palette87; palette87.setBrush(QPalette::Active, QPalette::WindowText, brush); palette87.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5280,10 +5312,10 @@ public: palette87.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette87.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette87.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_15->setPalette(palette87); - ActuatorButton03_16 = new QPushButton(frame); - ActuatorButton03_16->setObjectName(QString::fromUtf8("ActuatorButton03_16")); - ActuatorButton03_16->setGeometry(QRect(685, 560, 10, 10)); + ActuatorButton03_11->setPalette(palette87); + ActuatorButton03_12 = new QPushButton(frame); + ActuatorButton03_12->setObjectName(QString::fromUtf8("ActuatorButton03_12")); + ActuatorButton03_12->setGeometry(QRect(701, 441, 10, 10)); QPalette palette88; palette88.setBrush(QPalette::Active, QPalette::WindowText, brush); palette88.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5333,10 +5365,10 @@ public: palette88.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette88.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette88.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_16->setPalette(palette88); - ActuatorButton03_17 = new QPushButton(frame); - ActuatorButton03_17->setObjectName(QString::fromUtf8("ActuatorButton03_17")); - ActuatorButton03_17->setGeometry(QRect(672, 588, 10, 10)); + ActuatorButton03_12->setPalette(palette88); + ActuatorButton03_13 = new QPushButton(frame); + ActuatorButton03_13->setObjectName(QString::fromUtf8("ActuatorButton03_13")); + ActuatorButton03_13->setGeometry(QRect(703, 471, 10, 10)); QPalette palette89; palette89.setBrush(QPalette::Active, QPalette::WindowText, brush); palette89.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5386,10 +5418,10 @@ public: palette89.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette89.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette89.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_17->setPalette(palette89); - ActuatorButton03_18 = new QPushButton(frame); - ActuatorButton03_18->setObjectName(QString::fromUtf8("ActuatorButton03_18")); - ActuatorButton03_18->setGeometry(QRect(655, 613, 10, 10)); + ActuatorButton03_13->setPalette(palette89); + ActuatorButton03_14 = new QPushButton(frame); + ActuatorButton03_14->setObjectName(QString::fromUtf8("ActuatorButton03_14")); + ActuatorButton03_14->setGeometry(QRect(701, 502, 10, 10)); QPalette palette90; palette90.setBrush(QPalette::Active, QPalette::WindowText, brush); palette90.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5439,10 +5471,10 @@ public: palette90.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette90.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette90.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_18->setPalette(palette90); - ActuatorButton03_19 = new QPushButton(frame); - ActuatorButton03_19->setObjectName(QString::fromUtf8("ActuatorButton03_19")); - ActuatorButton03_19->setGeometry(QRect(635, 636, 10, 10)); + ActuatorButton03_14->setPalette(palette90); + ActuatorButton03_15 = new QPushButton(frame); + ActuatorButton03_15->setObjectName(QString::fromUtf8("ActuatorButton03_15")); + ActuatorButton03_15->setGeometry(QRect(695, 532, 10, 10)); QPalette palette91; palette91.setBrush(QPalette::Active, QPalette::WindowText, brush); palette91.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5492,10 +5524,10 @@ public: palette91.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette91.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette91.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_19->setPalette(palette91); - ActuatorButton03_20 = new QPushButton(frame); - ActuatorButton03_20->setObjectName(QString::fromUtf8("ActuatorButton03_20")); - ActuatorButton03_20->setGeometry(QRect(612, 656, 10, 10)); + ActuatorButton03_15->setPalette(palette91); + ActuatorButton03_16 = new QPushButton(frame); + ActuatorButton03_16->setObjectName(QString::fromUtf8("ActuatorButton03_16")); + ActuatorButton03_16->setGeometry(QRect(685, 560, 10, 10)); QPalette palette92; palette92.setBrush(QPalette::Active, QPalette::WindowText, brush); palette92.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5545,10 +5577,10 @@ public: palette92.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette92.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette92.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_20->setPalette(palette92); - ActuatorButton03_21 = new QPushButton(frame); - ActuatorButton03_21->setObjectName(QString::fromUtf8("ActuatorButton03_21")); - ActuatorButton03_21->setGeometry(QRect(587, 673, 10, 10)); + ActuatorButton03_16->setPalette(palette92); + ActuatorButton03_17 = new QPushButton(frame); + ActuatorButton03_17->setObjectName(QString::fromUtf8("ActuatorButton03_17")); + ActuatorButton03_17->setGeometry(QRect(672, 588, 10, 10)); QPalette palette93; palette93.setBrush(QPalette::Active, QPalette::WindowText, brush); palette93.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5598,10 +5630,10 @@ public: palette93.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette93.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette93.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_21->setPalette(palette93); - ActuatorButton03_22 = new QPushButton(frame); - ActuatorButton03_22->setObjectName(QString::fromUtf8("ActuatorButton03_22")); - ActuatorButton03_22->setGeometry(QRect(560, 687, 10, 10)); + ActuatorButton03_17->setPalette(palette93); + ActuatorButton03_18 = new QPushButton(frame); + ActuatorButton03_18->setObjectName(QString::fromUtf8("ActuatorButton03_18")); + ActuatorButton03_18->setGeometry(QRect(655, 613, 10, 10)); QPalette palette94; palette94.setBrush(QPalette::Active, QPalette::WindowText, brush); palette94.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5651,10 +5683,10 @@ public: palette94.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette94.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette94.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_22->setPalette(palette94); - ActuatorButton03_23 = new QPushButton(frame); - ActuatorButton03_23->setObjectName(QString::fromUtf8("ActuatorButton03_23")); - ActuatorButton03_23->setGeometry(QRect(531, 696, 10, 10)); + ActuatorButton03_18->setPalette(palette94); + ActuatorButton03_19 = new QPushButton(frame); + ActuatorButton03_19->setObjectName(QString::fromUtf8("ActuatorButton03_19")); + ActuatorButton03_19->setGeometry(QRect(635, 636, 10, 10)); QPalette palette95; palette95.setBrush(QPalette::Active, QPalette::WindowText, brush); palette95.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5704,10 +5736,10 @@ public: palette95.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette95.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette95.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_23->setPalette(palette95); - ActuatorButton03_24 = new QPushButton(frame); - ActuatorButton03_24->setObjectName(QString::fromUtf8("ActuatorButton03_24")); - ActuatorButton03_24->setGeometry(QRect(501, 701, 10, 10)); + ActuatorButton03_19->setPalette(palette95); + ActuatorButton03_20 = new QPushButton(frame); + ActuatorButton03_20->setObjectName(QString::fromUtf8("ActuatorButton03_20")); + ActuatorButton03_20->setGeometry(QRect(612, 656, 10, 10)); QPalette palette96; palette96.setBrush(QPalette::Active, QPalette::WindowText, brush); palette96.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5757,10 +5789,10 @@ public: palette96.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette96.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette96.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_24->setPalette(palette96); - ActuatorButton03_25 = new QPushButton(frame); - ActuatorButton03_25->setObjectName(QString::fromUtf8("ActuatorButton03_25")); - ActuatorButton03_25->setGeometry(QRect(471, 704, 10, 10)); + ActuatorButton03_20->setPalette(palette96); + ActuatorButton03_21 = new QPushButton(frame); + ActuatorButton03_21->setObjectName(QString::fromUtf8("ActuatorButton03_21")); + ActuatorButton03_21->setGeometry(QRect(587, 673, 10, 10)); QPalette palette97; palette97.setBrush(QPalette::Active, QPalette::WindowText, brush); palette97.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5810,10 +5842,10 @@ public: palette97.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette97.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette97.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_25->setPalette(palette97); - ActuatorButton03_26 = new QPushButton(frame); - ActuatorButton03_26->setObjectName(QString::fromUtf8("ActuatorButton03_26")); - ActuatorButton03_26->setGeometry(QRect(440, 702, 10, 10)); + ActuatorButton03_21->setPalette(palette97); + ActuatorButton03_22 = new QPushButton(frame); + ActuatorButton03_22->setObjectName(QString::fromUtf8("ActuatorButton03_22")); + ActuatorButton03_22->setGeometry(QRect(560, 687, 10, 10)); QPalette palette98; palette98.setBrush(QPalette::Active, QPalette::WindowText, brush); palette98.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5863,10 +5895,10 @@ public: palette98.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette98.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette98.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_26->setPalette(palette98); - ActuatorButton03_27 = new QPushButton(frame); - ActuatorButton03_27->setObjectName(QString::fromUtf8("ActuatorButton03_27")); - ActuatorButton03_27->setGeometry(QRect(410, 695, 10, 10)); + ActuatorButton03_22->setPalette(palette98); + ActuatorButton03_23 = new QPushButton(frame); + ActuatorButton03_23->setObjectName(QString::fromUtf8("ActuatorButton03_23")); + ActuatorButton03_23->setGeometry(QRect(531, 696, 10, 10)); QPalette palette99; palette99.setBrush(QPalette::Active, QPalette::WindowText, brush); palette99.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5916,10 +5948,10 @@ public: palette99.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette99.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette99.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_27->setPalette(palette99); - ActuatorButton03_28 = new QPushButton(frame); - ActuatorButton03_28->setObjectName(QString::fromUtf8("ActuatorButton03_28")); - ActuatorButton03_28->setGeometry(QRect(382, 686, 10, 10)); + ActuatorButton03_23->setPalette(palette99); + ActuatorButton03_24 = new QPushButton(frame); + ActuatorButton03_24->setObjectName(QString::fromUtf8("ActuatorButton03_24")); + ActuatorButton03_24->setGeometry(QRect(501, 701, 10, 10)); QPalette palette100; palette100.setBrush(QPalette::Active, QPalette::WindowText, brush); palette100.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -5969,10 +6001,10 @@ public: palette100.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette100.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette100.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_28->setPalette(palette100); - ActuatorButton03_29 = new QPushButton(frame); - ActuatorButton03_29->setObjectName(QString::fromUtf8("ActuatorButton03_29")); - ActuatorButton03_29->setGeometry(QRect(354, 672, 10, 10)); + ActuatorButton03_24->setPalette(palette100); + ActuatorButton03_25 = new QPushButton(frame); + ActuatorButton03_25->setObjectName(QString::fromUtf8("ActuatorButton03_25")); + ActuatorButton03_25->setGeometry(QRect(471, 704, 10, 10)); QPalette palette101; palette101.setBrush(QPalette::Active, QPalette::WindowText, brush); palette101.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6022,10 +6054,10 @@ public: palette101.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette101.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette101.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_29->setPalette(palette101); - ActuatorButton03_30 = new QPushButton(frame); - ActuatorButton03_30->setObjectName(QString::fromUtf8("ActuatorButton03_30")); - ActuatorButton03_30->setGeometry(QRect(329, 656, 10, 10)); + ActuatorButton03_25->setPalette(palette101); + ActuatorButton03_26 = new QPushButton(frame); + ActuatorButton03_26->setObjectName(QString::fromUtf8("ActuatorButton03_26")); + ActuatorButton03_26->setGeometry(QRect(440, 702, 10, 10)); QPalette palette102; palette102.setBrush(QPalette::Active, QPalette::WindowText, brush); palette102.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6075,10 +6107,10 @@ public: palette102.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette102.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette102.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_30->setPalette(palette102); - ActuatorButton03_31 = new QPushButton(frame); - ActuatorButton03_31->setObjectName(QString::fromUtf8("ActuatorButton03_31")); - ActuatorButton03_31->setGeometry(QRect(306, 635, 10, 10)); + ActuatorButton03_26->setPalette(palette102); + ActuatorButton03_27 = new QPushButton(frame); + ActuatorButton03_27->setObjectName(QString::fromUtf8("ActuatorButton03_27")); + ActuatorButton03_27->setGeometry(QRect(410, 695, 10, 10)); QPalette palette103; palette103.setBrush(QPalette::Active, QPalette::WindowText, brush); palette103.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6128,10 +6160,10 @@ public: palette103.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette103.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette103.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_31->setPalette(palette103); - ActuatorButton03_32 = new QPushButton(frame); - ActuatorButton03_32->setObjectName(QString::fromUtf8("ActuatorButton03_32")); - ActuatorButton03_32->setGeometry(QRect(286, 613, 10, 10)); + ActuatorButton03_27->setPalette(palette103); + ActuatorButton03_28 = new QPushButton(frame); + ActuatorButton03_28->setObjectName(QString::fromUtf8("ActuatorButton03_28")); + ActuatorButton03_28->setGeometry(QRect(382, 686, 10, 10)); QPalette palette104; palette104.setBrush(QPalette::Active, QPalette::WindowText, brush); palette104.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6181,10 +6213,10 @@ public: palette104.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette104.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette104.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_32->setPalette(palette104); - ActuatorButton03_33 = new QPushButton(frame); - ActuatorButton03_33->setObjectName(QString::fromUtf8("ActuatorButton03_33")); - ActuatorButton03_33->setGeometry(QRect(269, 587, 10, 10)); + ActuatorButton03_28->setPalette(palette104); + ActuatorButton03_29 = new QPushButton(frame); + ActuatorButton03_29->setObjectName(QString::fromUtf8("ActuatorButton03_29")); + ActuatorButton03_29->setGeometry(QRect(354, 672, 10, 10)); QPalette palette105; palette105.setBrush(QPalette::Active, QPalette::WindowText, brush); palette105.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6234,10 +6266,10 @@ public: palette105.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette105.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette105.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_33->setPalette(palette105); - ActuatorButton03_34 = new QPushButton(frame); - ActuatorButton03_34->setObjectName(QString::fromUtf8("ActuatorButton03_34")); - ActuatorButton03_34->setGeometry(QRect(257, 559, 10, 10)); + ActuatorButton03_29->setPalette(palette105); + ActuatorButton03_30 = new QPushButton(frame); + ActuatorButton03_30->setObjectName(QString::fromUtf8("ActuatorButton03_30")); + ActuatorButton03_30->setGeometry(QRect(329, 656, 10, 10)); QPalette palette106; palette106.setBrush(QPalette::Active, QPalette::WindowText, brush); palette106.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6287,10 +6319,10 @@ public: palette106.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette106.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette106.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_34->setPalette(palette106); - ActuatorButton03_35 = new QPushButton(frame); - ActuatorButton03_35->setObjectName(QString::fromUtf8("ActuatorButton03_35")); - ActuatorButton03_35->setGeometry(QRect(247, 531, 10, 10)); + ActuatorButton03_30->setPalette(palette106); + ActuatorButton03_31 = new QPushButton(frame); + ActuatorButton03_31->setObjectName(QString::fromUtf8("ActuatorButton03_31")); + ActuatorButton03_31->setGeometry(QRect(306, 635, 10, 10)); QPalette palette107; palette107.setBrush(QPalette::Active, QPalette::WindowText, brush); palette107.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6340,10 +6372,10 @@ public: palette107.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette107.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette107.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_35->setPalette(palette107); - ActuatorButton03_36 = new QPushButton(frame); - ActuatorButton03_36->setObjectName(QString::fromUtf8("ActuatorButton03_36")); - ActuatorButton03_36->setGeometry(QRect(240, 501, 10, 10)); + ActuatorButton03_31->setPalette(palette107); + ActuatorButton03_32 = new QPushButton(frame); + ActuatorButton03_32->setObjectName(QString::fromUtf8("ActuatorButton03_32")); + ActuatorButton03_32->setGeometry(QRect(286, 613, 10, 10)); QPalette palette108; palette108.setBrush(QPalette::Active, QPalette::WindowText, brush); palette108.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6393,10 +6425,10 @@ public: palette108.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette108.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette108.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_36->setPalette(palette108); - ActuatorButton03_37 = new QPushButton(frame); - ActuatorButton03_37->setObjectName(QString::fromUtf8("ActuatorButton03_37")); - ActuatorButton03_37->setGeometry(QRect(238, 471, 10, 10)); + ActuatorButton03_32->setPalette(palette108); + ActuatorButton03_33 = new QPushButton(frame); + ActuatorButton03_33->setObjectName(QString::fromUtf8("ActuatorButton03_33")); + ActuatorButton03_33->setGeometry(QRect(269, 587, 10, 10)); QPalette palette109; palette109.setBrush(QPalette::Active, QPalette::WindowText, brush); palette109.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6446,10 +6478,10 @@ public: palette109.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette109.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette109.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_37->setPalette(palette109); - ActuatorButton03_38 = new QPushButton(frame); - ActuatorButton03_38->setObjectName(QString::fromUtf8("ActuatorButton03_38")); - ActuatorButton03_38->setGeometry(QRect(240, 441, 10, 10)); + ActuatorButton03_33->setPalette(palette109); + ActuatorButton03_34 = new QPushButton(frame); + ActuatorButton03_34->setObjectName(QString::fromUtf8("ActuatorButton03_34")); + ActuatorButton03_34->setGeometry(QRect(257, 559, 10, 10)); QPalette palette110; palette110.setBrush(QPalette::Active, QPalette::WindowText, brush); palette110.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6499,10 +6531,10 @@ public: palette110.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette110.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette110.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_38->setPalette(palette110); - ActuatorButton03_39 = new QPushButton(frame); - ActuatorButton03_39->setObjectName(QString::fromUtf8("ActuatorButton03_39")); - ActuatorButton03_39->setGeometry(QRect(246, 411, 10, 10)); + ActuatorButton03_34->setPalette(palette110); + ActuatorButton03_35 = new QPushButton(frame); + ActuatorButton03_35->setObjectName(QString::fromUtf8("ActuatorButton03_35")); + ActuatorButton03_35->setGeometry(QRect(247, 531, 10, 10)); QPalette palette111; palette111.setBrush(QPalette::Active, QPalette::WindowText, brush); palette111.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6552,10 +6584,10 @@ public: palette111.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette111.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette111.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_39->setPalette(palette111); - ActuatorButton03_40 = new QPushButton(frame); - ActuatorButton03_40->setObjectName(QString::fromUtf8("ActuatorButton03_40")); - ActuatorButton03_40->setGeometry(QRect(256, 383, 10, 10)); + ActuatorButton03_35->setPalette(palette111); + ActuatorButton03_36 = new QPushButton(frame); + ActuatorButton03_36->setObjectName(QString::fromUtf8("ActuatorButton03_36")); + ActuatorButton03_36->setGeometry(QRect(240, 501, 10, 10)); QPalette palette112; palette112.setBrush(QPalette::Active, QPalette::WindowText, brush); palette112.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6605,10 +6637,10 @@ public: palette112.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette112.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette112.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_40->setPalette(palette112); - ActuatorButton03_41 = new QPushButton(frame); - ActuatorButton03_41->setObjectName(QString::fromUtf8("ActuatorButton03_41")); - ActuatorButton03_41->setGeometry(QRect(269, 355, 10, 10)); + ActuatorButton03_36->setPalette(palette112); + ActuatorButton03_37 = new QPushButton(frame); + ActuatorButton03_37->setObjectName(QString::fromUtf8("ActuatorButton03_37")); + ActuatorButton03_37->setGeometry(QRect(238, 471, 10, 10)); QPalette palette113; palette113.setBrush(QPalette::Active, QPalette::WindowText, brush); palette113.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6658,10 +6690,10 @@ public: palette113.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette113.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette113.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_41->setPalette(palette113); - ActuatorButton03_42 = new QPushButton(frame); - ActuatorButton03_42->setObjectName(QString::fromUtf8("ActuatorButton03_42")); - ActuatorButton03_42->setGeometry(QRect(287, 330, 10, 10)); + ActuatorButton03_37->setPalette(palette113); + ActuatorButton03_38 = new QPushButton(frame); + ActuatorButton03_38->setObjectName(QString::fromUtf8("ActuatorButton03_38")); + ActuatorButton03_38->setGeometry(QRect(240, 441, 10, 10)); QPalette palette114; palette114.setBrush(QPalette::Active, QPalette::WindowText, brush); palette114.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6711,10 +6743,10 @@ public: palette114.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette114.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette114.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_42->setPalette(palette114); - ActuatorButton03_43 = new QPushButton(frame); - ActuatorButton03_43->setObjectName(QString::fromUtf8("ActuatorButton03_43")); - ActuatorButton03_43->setGeometry(QRect(306, 307, 10, 10)); + ActuatorButton03_38->setPalette(palette114); + ActuatorButton03_39 = new QPushButton(frame); + ActuatorButton03_39->setObjectName(QString::fromUtf8("ActuatorButton03_39")); + ActuatorButton03_39->setGeometry(QRect(246, 411, 10, 10)); QPalette palette115; palette115.setBrush(QPalette::Active, QPalette::WindowText, brush); palette115.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6764,10 +6796,10 @@ public: palette115.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette115.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette115.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_43->setPalette(palette115); - ActuatorButton03_44 = new QPushButton(frame); - ActuatorButton03_44->setObjectName(QString::fromUtf8("ActuatorButton03_44")); - ActuatorButton03_44->setGeometry(QRect(329, 287, 10, 10)); + ActuatorButton03_39->setPalette(palette115); + ActuatorButton03_40 = new QPushButton(frame); + ActuatorButton03_40->setObjectName(QString::fromUtf8("ActuatorButton03_40")); + ActuatorButton03_40->setGeometry(QRect(256, 383, 10, 10)); QPalette palette116; palette116.setBrush(QPalette::Active, QPalette::WindowText, brush); palette116.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6817,10 +6849,10 @@ public: palette116.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette116.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette116.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_44->setPalette(palette116); - ActuatorButton03_45 = new QPushButton(frame); - ActuatorButton03_45->setObjectName(QString::fromUtf8("ActuatorButton03_45")); - ActuatorButton03_45->setGeometry(QRect(354, 270, 10, 10)); + ActuatorButton03_40->setPalette(palette116); + ActuatorButton03_41 = new QPushButton(frame); + ActuatorButton03_41->setObjectName(QString::fromUtf8("ActuatorButton03_41")); + ActuatorButton03_41->setGeometry(QRect(269, 355, 10, 10)); QPalette palette117; palette117.setBrush(QPalette::Active, QPalette::WindowText, brush); palette117.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6870,10 +6902,10 @@ public: palette117.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette117.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette117.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_45->setPalette(palette117); - ActuatorButton03_46 = new QPushButton(frame); - ActuatorButton03_46->setObjectName(QString::fromUtf8("ActuatorButton03_46")); - ActuatorButton03_46->setGeometry(QRect(382, 257, 10, 10)); + ActuatorButton03_41->setPalette(palette117); + ActuatorButton03_42 = new QPushButton(frame); + ActuatorButton03_42->setObjectName(QString::fromUtf8("ActuatorButton03_42")); + ActuatorButton03_42->setGeometry(QRect(287, 330, 10, 10)); QPalette palette118; palette118.setBrush(QPalette::Active, QPalette::WindowText, brush); palette118.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6923,10 +6955,10 @@ public: palette118.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette118.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette118.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_46->setPalette(palette118); - ActuatorButton03_47 = new QPushButton(frame); - ActuatorButton03_47->setObjectName(QString::fromUtf8("ActuatorButton03_47")); - ActuatorButton03_47->setGeometry(QRect(410, 247, 10, 10)); + ActuatorButton03_42->setPalette(palette118); + ActuatorButton03_43 = new QPushButton(frame); + ActuatorButton03_43->setObjectName(QString::fromUtf8("ActuatorButton03_43")); + ActuatorButton03_43->setGeometry(QRect(306, 307, 10, 10)); QPalette palette119; palette119.setBrush(QPalette::Active, QPalette::WindowText, brush); palette119.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -6976,10 +7008,10 @@ public: palette119.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette119.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette119.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_47->setPalette(palette119); - ActuatorButton03_48 = new QPushButton(frame); - ActuatorButton03_48->setObjectName(QString::fromUtf8("ActuatorButton03_48")); - ActuatorButton03_48->setGeometry(QRect(440, 241, 10, 10)); + ActuatorButton03_43->setPalette(palette119); + ActuatorButton03_44 = new QPushButton(frame); + ActuatorButton03_44->setObjectName(QString::fromUtf8("ActuatorButton03_44")); + ActuatorButton03_44->setGeometry(QRect(329, 287, 10, 10)); QPalette palette120; palette120.setBrush(QPalette::Active, QPalette::WindowText, brush); palette120.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7029,10 +7061,10 @@ public: palette120.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette120.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette120.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton03_48->setPalette(palette120); - ActuatorButton04_02 = new QPushButton(frame); - ActuatorButton04_02->setObjectName(QString::fromUtf8("ActuatorButton04_02")); - ActuatorButton04_02->setGeometry(QRect(509, 183, 10, 10)); + ActuatorButton03_44->setPalette(palette120); + ActuatorButton03_45 = new QPushButton(frame); + ActuatorButton03_45->setObjectName(QString::fromUtf8("ActuatorButton03_45")); + ActuatorButton03_45->setGeometry(QRect(354, 270, 10, 10)); QPalette palette121; palette121.setBrush(QPalette::Active, QPalette::WindowText, brush); palette121.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7082,10 +7114,10 @@ public: palette121.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette121.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette121.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_02->setPalette(palette121); - ActuatorButton04_03 = new QPushButton(frame); - ActuatorButton04_03->setObjectName(QString::fromUtf8("ActuatorButton04_03")); - ActuatorButton04_03->setGeometry(QRect(546, 190, 10, 10)); + ActuatorButton03_45->setPalette(palette121); + ActuatorButton03_46 = new QPushButton(frame); + ActuatorButton03_46->setObjectName(QString::fromUtf8("ActuatorButton03_46")); + ActuatorButton03_46->setGeometry(QRect(382, 257, 10, 10)); QPalette palette122; palette122.setBrush(QPalette::Active, QPalette::WindowText, brush); palette122.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7135,10 +7167,10 @@ public: palette122.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette122.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette122.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_03->setPalette(palette122); - ActuatorButton04_04 = new QPushButton(frame); - ActuatorButton04_04->setObjectName(QString::fromUtf8("ActuatorButton04_04")); - ActuatorButton04_04->setGeometry(QRect(582, 202, 10, 10)); + ActuatorButton03_46->setPalette(palette122); + ActuatorButton03_47 = new QPushButton(frame); + ActuatorButton03_47->setObjectName(QString::fromUtf8("ActuatorButton03_47")); + ActuatorButton03_47->setGeometry(QRect(410, 247, 10, 10)); QPalette palette123; palette123.setBrush(QPalette::Active, QPalette::WindowText, brush); palette123.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7188,10 +7220,10 @@ public: palette123.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette123.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette123.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_04->setPalette(palette123); - ActuatorButton04_05 = new QPushButton(frame); - ActuatorButton04_05->setObjectName(QString::fromUtf8("ActuatorButton04_05")); - ActuatorButton04_05->setGeometry(QRect(616, 220, 10, 10)); + ActuatorButton03_47->setPalette(palette123); + ActuatorButton03_48 = new QPushButton(frame); + ActuatorButton03_48->setObjectName(QString::fromUtf8("ActuatorButton03_48")); + ActuatorButton03_48->setGeometry(QRect(440, 241, 10, 10)); QPalette palette124; palette124.setBrush(QPalette::Active, QPalette::WindowText, brush); palette124.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7241,10 +7273,10 @@ public: palette124.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette124.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette124.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_05->setPalette(palette124); - ActuatorButton04_07 = new QPushButton(frame); - ActuatorButton04_07->setObjectName(QString::fromUtf8("ActuatorButton04_07")); - ActuatorButton04_07->setGeometry(QRect(677, 265, 10, 10)); + ActuatorButton03_48->setPalette(palette124); + ActuatorButton04_02 = new QPushButton(frame); + ActuatorButton04_02->setObjectName(QString::fromUtf8("ActuatorButton04_02")); + ActuatorButton04_02->setGeometry(QRect(509, 183, 10, 10)); QPalette palette125; palette125.setBrush(QPalette::Active, QPalette::WindowText, brush); palette125.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7294,10 +7326,10 @@ public: palette125.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette125.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette125.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_07->setPalette(palette125); - ActuatorButton04_09 = new QPushButton(frame); - ActuatorButton04_09->setObjectName(QString::fromUtf8("ActuatorButton04_09")); - ActuatorButton04_09->setGeometry(QRect(723, 326, 10, 10)); + ActuatorButton04_02->setPalette(palette125); + ActuatorButton04_03 = new QPushButton(frame); + ActuatorButton04_03->setObjectName(QString::fromUtf8("ActuatorButton04_03")); + ActuatorButton04_03->setGeometry(QRect(546, 190, 10, 10)); QPalette palette126; palette126.setBrush(QPalette::Active, QPalette::WindowText, brush); palette126.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7347,10 +7379,10 @@ public: palette126.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette126.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette126.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_09->setPalette(palette126); - ActuatorButton04_10 = new QPushButton(frame); - ActuatorButton04_10->setObjectName(QString::fromUtf8("ActuatorButton04_10")); - ActuatorButton04_10->setGeometry(QRect(740, 360, 10, 10)); + ActuatorButton04_03->setPalette(palette126); + ActuatorButton04_04 = new QPushButton(frame); + ActuatorButton04_04->setObjectName(QString::fromUtf8("ActuatorButton04_04")); + ActuatorButton04_04->setGeometry(QRect(582, 202, 10, 10)); QPalette palette127; palette127.setBrush(QPalette::Active, QPalette::WindowText, brush); palette127.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7400,10 +7432,10 @@ public: palette127.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette127.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette127.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_10->setPalette(palette127); - ActuatorButton04_11 = new QPushButton(frame); - ActuatorButton04_11->setObjectName(QString::fromUtf8("ActuatorButton04_11")); - ActuatorButton04_11->setGeometry(QRect(752, 395, 10, 10)); + ActuatorButton04_04->setPalette(palette127); + ActuatorButton04_05 = new QPushButton(frame); + ActuatorButton04_05->setObjectName(QString::fromUtf8("ActuatorButton04_05")); + ActuatorButton04_05->setGeometry(QRect(616, 220, 10, 10)); QPalette palette128; palette128.setBrush(QPalette::Active, QPalette::WindowText, brush); palette128.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7453,10 +7485,10 @@ public: palette128.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette128.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette128.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_11->setPalette(palette128); - ActuatorButton04_12 = new QPushButton(frame); - ActuatorButton04_12->setObjectName(QString::fromUtf8("ActuatorButton04_12")); - ActuatorButton04_12->setGeometry(QRect(759, 433, 10, 10)); + ActuatorButton04_05->setPalette(palette128); + ActuatorButton04_07 = new QPushButton(frame); + ActuatorButton04_07->setObjectName(QString::fromUtf8("ActuatorButton04_07")); + ActuatorButton04_07->setGeometry(QRect(677, 265, 10, 10)); QPalette palette129; palette129.setBrush(QPalette::Active, QPalette::WindowText, brush); palette129.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7506,10 +7538,10 @@ public: palette129.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette129.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette129.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_12->setPalette(palette129); - ActuatorButton04_13 = new QPushButton(frame); - ActuatorButton04_13->setObjectName(QString::fromUtf8("ActuatorButton04_13")); - ActuatorButton04_13->setGeometry(QRect(762, 471, 10, 10)); + ActuatorButton04_07->setPalette(palette129); + ActuatorButton04_09 = new QPushButton(frame); + ActuatorButton04_09->setObjectName(QString::fromUtf8("ActuatorButton04_09")); + ActuatorButton04_09->setGeometry(QRect(723, 326, 10, 10)); QPalette palette130; palette130.setBrush(QPalette::Active, QPalette::WindowText, brush); palette130.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7559,10 +7591,10 @@ public: palette130.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette130.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette130.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_13->setPalette(palette130); - ActuatorButton04_14 = new QPushButton(frame); - ActuatorButton04_14->setObjectName(QString::fromUtf8("ActuatorButton04_14")); - ActuatorButton04_14->setGeometry(QRect(760, 509, 10, 10)); + ActuatorButton04_09->setPalette(palette130); + ActuatorButton04_10 = new QPushButton(frame); + ActuatorButton04_10->setObjectName(QString::fromUtf8("ActuatorButton04_10")); + ActuatorButton04_10->setGeometry(QRect(740, 360, 10, 10)); QPalette palette131; palette131.setBrush(QPalette::Active, QPalette::WindowText, brush); palette131.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7612,11 +7644,11 @@ public: palette131.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette131.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette131.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_14->setPalette(palette131); - ActuatorButton04_15 = new QPushButton(frame); - ActuatorButton04_15->setObjectName(QString::fromUtf8("ActuatorButton04_15")); - ActuatorButton04_15->setGeometry(QRect(752, 547, 10, 10)); - QPalette palette132; + ActuatorButton04_10->setPalette(palette131); + ActuatorButton04_11 = new QPushButton(frame); + ActuatorButton04_11->setObjectName(QString::fromUtf8("ActuatorButton04_11")); + ActuatorButton04_11->setGeometry(QRect(752, 395, 10, 10)); + QPalette palette132; palette132.setBrush(QPalette::Active, QPalette::WindowText, brush); palette132.setBrush(QPalette::Active, QPalette::Button, brush1); palette132.setBrush(QPalette::Active, QPalette::Light, brush2); @@ -7665,10 +7697,10 @@ public: palette132.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette132.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette132.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_15->setPalette(palette132); - ActuatorButton04_16 = new QPushButton(frame); - ActuatorButton04_16->setObjectName(QString::fromUtf8("ActuatorButton04_16")); - ActuatorButton04_16->setGeometry(QRect(740, 582, 10, 10)); + ActuatorButton04_11->setPalette(palette132); + ActuatorButton04_12 = new QPushButton(frame); + ActuatorButton04_12->setObjectName(QString::fromUtf8("ActuatorButton04_12")); + ActuatorButton04_12->setGeometry(QRect(759, 433, 10, 10)); QPalette palette133; palette133.setBrush(QPalette::Active, QPalette::WindowText, brush); palette133.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7718,10 +7750,10 @@ public: palette133.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette133.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette133.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_16->setPalette(palette133); - ActuatorButton04_17 = new QPushButton(frame); - ActuatorButton04_17->setObjectName(QString::fromUtf8("ActuatorButton04_17")); - ActuatorButton04_17->setGeometry(QRect(723, 616, 10, 10)); + ActuatorButton04_12->setPalette(palette133); + ActuatorButton04_13 = new QPushButton(frame); + ActuatorButton04_13->setObjectName(QString::fromUtf8("ActuatorButton04_13")); + ActuatorButton04_13->setGeometry(QRect(762, 471, 10, 10)); QPalette palette134; palette134.setBrush(QPalette::Active, QPalette::WindowText, brush); palette134.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7771,10 +7803,10 @@ public: palette134.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette134.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette134.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_17->setPalette(palette134); - ActuatorButton04_19 = new QPushButton(frame); - ActuatorButton04_19->setObjectName(QString::fromUtf8("ActuatorButton04_19")); - ActuatorButton04_19->setGeometry(QRect(677, 677, 10, 10)); + ActuatorButton04_13->setPalette(palette134); + ActuatorButton04_14 = new QPushButton(frame); + ActuatorButton04_14->setObjectName(QString::fromUtf8("ActuatorButton04_14")); + ActuatorButton04_14->setGeometry(QRect(760, 509, 10, 10)); QPalette palette135; palette135.setBrush(QPalette::Active, QPalette::WindowText, brush); palette135.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7824,10 +7856,10 @@ public: palette135.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette135.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette135.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_19->setPalette(palette135); - ActuatorButton04_21 = new QPushButton(frame); - ActuatorButton04_21->setObjectName(QString::fromUtf8("ActuatorButton04_21")); - ActuatorButton04_21->setGeometry(QRect(616, 724, 10, 10)); + ActuatorButton04_14->setPalette(palette135); + ActuatorButton04_15 = new QPushButton(frame); + ActuatorButton04_15->setObjectName(QString::fromUtf8("ActuatorButton04_15")); + ActuatorButton04_15->setGeometry(QRect(752, 547, 10, 10)); QPalette palette136; palette136.setBrush(QPalette::Active, QPalette::WindowText, brush); palette136.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7877,10 +7909,10 @@ public: palette136.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette136.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette136.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_21->setPalette(palette136); - ActuatorButton04_22 = new QPushButton(frame); - ActuatorButton04_22->setObjectName(QString::fromUtf8("ActuatorButton04_22")); - ActuatorButton04_22->setGeometry(QRect(583, 740, 10, 10)); + ActuatorButton04_15->setPalette(palette136); + ActuatorButton04_16 = new QPushButton(frame); + ActuatorButton04_16->setObjectName(QString::fromUtf8("ActuatorButton04_16")); + ActuatorButton04_16->setGeometry(QRect(740, 582, 10, 10)); QPalette palette137; palette137.setBrush(QPalette::Active, QPalette::WindowText, brush); palette137.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7930,10 +7962,10 @@ public: palette137.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette137.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette137.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_22->setPalette(palette137); - ActuatorButton04_23 = new QPushButton(frame); - ActuatorButton04_23->setObjectName(QString::fromUtf8("ActuatorButton04_23")); - ActuatorButton04_23->setGeometry(QRect(546, 753, 10, 10)); + ActuatorButton04_16->setPalette(palette137); + ActuatorButton04_17 = new QPushButton(frame); + ActuatorButton04_17->setObjectName(QString::fromUtf8("ActuatorButton04_17")); + ActuatorButton04_17->setGeometry(QRect(723, 616, 10, 10)); QPalette palette138; palette138.setBrush(QPalette::Active, QPalette::WindowText, brush); palette138.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -7983,10 +8015,10 @@ public: palette138.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette138.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette138.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_23->setPalette(palette138); - ActuatorButton04_24 = new QPushButton(frame); - ActuatorButton04_24->setObjectName(QString::fromUtf8("ActuatorButton04_24")); - ActuatorButton04_24->setGeometry(QRect(508, 760, 10, 10)); + ActuatorButton04_17->setPalette(palette138); + ActuatorButton04_19 = new QPushButton(frame); + ActuatorButton04_19->setObjectName(QString::fromUtf8("ActuatorButton04_19")); + ActuatorButton04_19->setGeometry(QRect(677, 677, 10, 10)); QPalette palette139; palette139.setBrush(QPalette::Active, QPalette::WindowText, brush); palette139.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8036,10 +8068,10 @@ public: palette139.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette139.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette139.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_24->setPalette(palette139); - ActuatorButton04_25 = new QPushButton(frame); - ActuatorButton04_25->setObjectName(QString::fromUtf8("ActuatorButton04_25")); - ActuatorButton04_25->setGeometry(QRect(470, 763, 10, 10)); + ActuatorButton04_19->setPalette(palette139); + ActuatorButton04_21 = new QPushButton(frame); + ActuatorButton04_21->setObjectName(QString::fromUtf8("ActuatorButton04_21")); + ActuatorButton04_21->setGeometry(QRect(616, 724, 10, 10)); QPalette palette140; palette140.setBrush(QPalette::Active, QPalette::WindowText, brush); palette140.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8089,10 +8121,10 @@ public: palette140.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette140.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette140.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_25->setPalette(palette140); - ActuatorButton04_26 = new QPushButton(frame); - ActuatorButton04_26->setObjectName(QString::fromUtf8("ActuatorButton04_26")); - ActuatorButton04_26->setGeometry(QRect(433, 760, 10, 10)); + ActuatorButton04_21->setPalette(palette140); + ActuatorButton04_22 = new QPushButton(frame); + ActuatorButton04_22->setObjectName(QString::fromUtf8("ActuatorButton04_22")); + ActuatorButton04_22->setGeometry(QRect(583, 740, 10, 10)); QPalette palette141; palette141.setBrush(QPalette::Active, QPalette::WindowText, brush); palette141.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8142,10 +8174,10 @@ public: palette141.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette141.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette141.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_26->setPalette(palette141); - ActuatorButton04_27 = new QPushButton(frame); - ActuatorButton04_27->setObjectName(QString::fromUtf8("ActuatorButton04_27")); - ActuatorButton04_27->setGeometry(QRect(395, 753, 10, 10)); + ActuatorButton04_22->setPalette(palette141); + ActuatorButton04_23 = new QPushButton(frame); + ActuatorButton04_23->setObjectName(QString::fromUtf8("ActuatorButton04_23")); + ActuatorButton04_23->setGeometry(QRect(546, 753, 10, 10)); QPalette palette142; palette142.setBrush(QPalette::Active, QPalette::WindowText, brush); palette142.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8195,10 +8227,10 @@ public: palette142.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette142.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette142.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_27->setPalette(palette142); - ActuatorButton04_28 = new QPushButton(frame); - ActuatorButton04_28->setObjectName(QString::fromUtf8("ActuatorButton04_28")); - ActuatorButton04_28->setGeometry(QRect(359, 741, 10, 10)); + ActuatorButton04_23->setPalette(palette142); + ActuatorButton04_24 = new QPushButton(frame); + ActuatorButton04_24->setObjectName(QString::fromUtf8("ActuatorButton04_24")); + ActuatorButton04_24->setGeometry(QRect(508, 760, 10, 10)); QPalette palette143; palette143.setBrush(QPalette::Active, QPalette::WindowText, brush); palette143.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8248,10 +8280,10 @@ public: palette143.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette143.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette143.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_28->setPalette(palette143); - ActuatorButton04_29 = new QPushButton(frame); - ActuatorButton04_29->setObjectName(QString::fromUtf8("ActuatorButton04_29")); - ActuatorButton04_29->setGeometry(QRect(325, 723, 10, 10)); + ActuatorButton04_24->setPalette(palette143); + ActuatorButton04_25 = new QPushButton(frame); + ActuatorButton04_25->setObjectName(QString::fromUtf8("ActuatorButton04_25")); + ActuatorButton04_25->setGeometry(QRect(470, 763, 10, 10)); QPalette palette144; palette144.setBrush(QPalette::Active, QPalette::WindowText, brush); palette144.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8301,10 +8333,10 @@ public: palette144.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette144.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette144.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_29->setPalette(palette144); - ActuatorButton04_31 = new QPushButton(frame); - ActuatorButton04_31->setObjectName(QString::fromUtf8("ActuatorButton04_31")); - ActuatorButton04_31->setGeometry(QRect(264, 677, 10, 10)); + ActuatorButton04_25->setPalette(palette144); + ActuatorButton04_26 = new QPushButton(frame); + ActuatorButton04_26->setObjectName(QString::fromUtf8("ActuatorButton04_26")); + ActuatorButton04_26->setGeometry(QRect(433, 760, 10, 10)); QPalette palette145; palette145.setBrush(QPalette::Active, QPalette::WindowText, brush); palette145.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8354,10 +8386,10 @@ public: palette145.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette145.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette145.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_31->setPalette(palette145); - ActuatorButton04_33 = new QPushButton(frame); - ActuatorButton04_33->setObjectName(QString::fromUtf8("ActuatorButton04_33")); - ActuatorButton04_33->setGeometry(QRect(218, 616, 10, 10)); + ActuatorButton04_26->setPalette(palette145); + ActuatorButton04_27 = new QPushButton(frame); + ActuatorButton04_27->setObjectName(QString::fromUtf8("ActuatorButton04_27")); + ActuatorButton04_27->setGeometry(QRect(395, 753, 10, 10)); QPalette palette146; palette146.setBrush(QPalette::Active, QPalette::WindowText, brush); palette146.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8407,10 +8439,10 @@ public: palette146.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette146.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette146.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_33->setPalette(palette146); - ActuatorButton04_34 = new QPushButton(frame); - ActuatorButton04_34->setObjectName(QString::fromUtf8("ActuatorButton04_34")); - ActuatorButton04_34->setGeometry(QRect(201, 582, 10, 10)); + ActuatorButton04_27->setPalette(palette146); + ActuatorButton04_28 = new QPushButton(frame); + ActuatorButton04_28->setObjectName(QString::fromUtf8("ActuatorButton04_28")); + ActuatorButton04_28->setGeometry(QRect(359, 741, 10, 10)); QPalette palette147; palette147.setBrush(QPalette::Active, QPalette::WindowText, brush); palette147.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8460,10 +8492,10 @@ public: palette147.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette147.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette147.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_34->setPalette(palette147); - ActuatorButton04_35 = new QPushButton(frame); - ActuatorButton04_35->setObjectName(QString::fromUtf8("ActuatorButton04_35")); - ActuatorButton04_35->setGeometry(QRect(189, 546, 10, 10)); + ActuatorButton04_28->setPalette(palette147); + ActuatorButton04_29 = new QPushButton(frame); + ActuatorButton04_29->setObjectName(QString::fromUtf8("ActuatorButton04_29")); + ActuatorButton04_29->setGeometry(QRect(325, 723, 10, 10)); QPalette palette148; palette148.setBrush(QPalette::Active, QPalette::WindowText, brush); palette148.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8513,10 +8545,10 @@ public: palette148.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette148.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette148.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_35->setPalette(palette148); - ActuatorButton04_36 = new QPushButton(frame); - ActuatorButton04_36->setObjectName(QString::fromUtf8("ActuatorButton04_36")); - ActuatorButton04_36->setGeometry(QRect(182, 509, 10, 10)); + ActuatorButton04_29->setPalette(palette148); + ActuatorButton04_31 = new QPushButton(frame); + ActuatorButton04_31->setObjectName(QString::fromUtf8("ActuatorButton04_31")); + ActuatorButton04_31->setGeometry(QRect(264, 677, 10, 10)); QPalette palette149; palette149.setBrush(QPalette::Active, QPalette::WindowText, brush); palette149.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8566,10 +8598,10 @@ public: palette149.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette149.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette149.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_36->setPalette(palette149); - ActuatorButton04_37 = new QPushButton(frame); - ActuatorButton04_37->setObjectName(QString::fromUtf8("ActuatorButton04_37")); - ActuatorButton04_37->setGeometry(QRect(179, 471, 10, 10)); + ActuatorButton04_31->setPalette(palette149); + ActuatorButton04_33 = new QPushButton(frame); + ActuatorButton04_33->setObjectName(QString::fromUtf8("ActuatorButton04_33")); + ActuatorButton04_33->setGeometry(QRect(218, 616, 10, 10)); QPalette palette150; palette150.setBrush(QPalette::Active, QPalette::WindowText, brush); palette150.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8619,10 +8651,10 @@ public: palette150.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette150.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette150.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_37->setPalette(palette150); - ActuatorButton04_38 = new QPushButton(frame); - ActuatorButton04_38->setObjectName(QString::fromUtf8("ActuatorButton04_38")); - ActuatorButton04_38->setGeometry(QRect(181, 433, 10, 10)); + ActuatorButton04_33->setPalette(palette150); + ActuatorButton04_34 = new QPushButton(frame); + ActuatorButton04_34->setObjectName(QString::fromUtf8("ActuatorButton04_34")); + ActuatorButton04_34->setGeometry(QRect(201, 582, 10, 10)); QPalette palette151; palette151.setBrush(QPalette::Active, QPalette::WindowText, brush); palette151.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8672,10 +8704,10 @@ public: palette151.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette151.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette151.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_38->setPalette(palette151); - ActuatorButton04_39 = new QPushButton(frame); - ActuatorButton04_39->setObjectName(QString::fromUtf8("ActuatorButton04_39")); - ActuatorButton04_39->setGeometry(QRect(189, 396, 10, 10)); + ActuatorButton04_34->setPalette(palette151); + ActuatorButton04_35 = new QPushButton(frame); + ActuatorButton04_35->setObjectName(QString::fromUtf8("ActuatorButton04_35")); + ActuatorButton04_35->setGeometry(QRect(189, 546, 10, 10)); QPalette palette152; palette152.setBrush(QPalette::Active, QPalette::WindowText, brush); palette152.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8725,10 +8757,10 @@ public: palette152.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette152.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette152.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_39->setPalette(palette152); - ActuatorButton04_40 = new QPushButton(frame); - ActuatorButton04_40->setObjectName(QString::fromUtf8("ActuatorButton04_40")); - ActuatorButton04_40->setGeometry(QRect(201, 360, 10, 10)); + ActuatorButton04_35->setPalette(palette152); + ActuatorButton04_36 = new QPushButton(frame); + ActuatorButton04_36->setObjectName(QString::fromUtf8("ActuatorButton04_36")); + ActuatorButton04_36->setGeometry(QRect(182, 509, 10, 10)); QPalette palette153; palette153.setBrush(QPalette::Active, QPalette::WindowText, brush); palette153.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8778,10 +8810,10 @@ public: palette153.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette153.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette153.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_40->setPalette(palette153); - ActuatorButton04_41 = new QPushButton(frame); - ActuatorButton04_41->setObjectName(QString::fromUtf8("ActuatorButton04_41")); - ActuatorButton04_41->setGeometry(QRect(218, 325, 10, 10)); + ActuatorButton04_36->setPalette(palette153); + ActuatorButton04_37 = new QPushButton(frame); + ActuatorButton04_37->setObjectName(QString::fromUtf8("ActuatorButton04_37")); + ActuatorButton04_37->setGeometry(QRect(179, 471, 10, 10)); QPalette palette154; palette154.setBrush(QPalette::Active, QPalette::WindowText, brush); palette154.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8831,10 +8863,10 @@ public: palette154.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette154.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette154.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_41->setPalette(palette154); - ActuatorButton04_43 = new QPushButton(frame); - ActuatorButton04_43->setObjectName(QString::fromUtf8("ActuatorButton04_43")); - ActuatorButton04_43->setGeometry(QRect(264, 265, 10, 10)); + ActuatorButton04_37->setPalette(palette154); + ActuatorButton04_38 = new QPushButton(frame); + ActuatorButton04_38->setObjectName(QString::fromUtf8("ActuatorButton04_38")); + ActuatorButton04_38->setGeometry(QRect(181, 433, 10, 10)); QPalette palette155; palette155.setBrush(QPalette::Active, QPalette::WindowText, brush); palette155.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8884,10 +8916,10 @@ public: palette155.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette155.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette155.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_43->setPalette(palette155); - ActuatorButton04_45 = new QPushButton(frame); - ActuatorButton04_45->setObjectName(QString::fromUtf8("ActuatorButton04_45")); - ActuatorButton04_45->setGeometry(QRect(325, 219, 10, 10)); + ActuatorButton04_38->setPalette(palette155); + ActuatorButton04_39 = new QPushButton(frame); + ActuatorButton04_39->setObjectName(QString::fromUtf8("ActuatorButton04_39")); + ActuatorButton04_39->setGeometry(QRect(189, 396, 10, 10)); QPalette palette156; palette156.setBrush(QPalette::Active, QPalette::WindowText, brush); palette156.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8937,10 +8969,10 @@ public: palette156.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette156.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette156.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_45->setPalette(palette156); - ActuatorButton04_46 = new QPushButton(frame); - ActuatorButton04_46->setObjectName(QString::fromUtf8("ActuatorButton04_46")); - ActuatorButton04_46->setGeometry(QRect(359, 202, 10, 10)); + ActuatorButton04_39->setPalette(palette156); + ActuatorButton04_40 = new QPushButton(frame); + ActuatorButton04_40->setObjectName(QString::fromUtf8("ActuatorButton04_40")); + ActuatorButton04_40->setGeometry(QRect(201, 360, 10, 10)); QPalette palette157; palette157.setBrush(QPalette::Active, QPalette::WindowText, brush); palette157.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -8990,10 +9022,10 @@ public: palette157.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette157.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette157.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_46->setPalette(palette157); - ActuatorButton04_47 = new QPushButton(frame); - ActuatorButton04_47->setObjectName(QString::fromUtf8("ActuatorButton04_47")); - ActuatorButton04_47->setGeometry(QRect(395, 189, 10, 10)); + ActuatorButton04_40->setPalette(palette157); + ActuatorButton04_41 = new QPushButton(frame); + ActuatorButton04_41->setObjectName(QString::fromUtf8("ActuatorButton04_41")); + ActuatorButton04_41->setGeometry(QRect(218, 325, 10, 10)); QPalette palette158; palette158.setBrush(QPalette::Active, QPalette::WindowText, brush); palette158.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9043,10 +9075,10 @@ public: palette158.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette158.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette158.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_47->setPalette(palette158); - ActuatorButton04_48 = new QPushButton(frame); - ActuatorButton04_48->setObjectName(QString::fromUtf8("ActuatorButton04_48")); - ActuatorButton04_48->setGeometry(QRect(433, 182, 10, 10)); + ActuatorButton04_41->setPalette(palette158); + ActuatorButton04_43 = new QPushButton(frame); + ActuatorButton04_43->setObjectName(QString::fromUtf8("ActuatorButton04_43")); + ActuatorButton04_43->setGeometry(QRect(264, 265, 10, 10)); QPalette palette159; palette159.setBrush(QPalette::Active, QPalette::WindowText, brush); palette159.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9096,10 +9128,10 @@ public: palette159.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette159.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette159.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_48->setPalette(palette159); - C1ActuatorsButton = new QPushButton(frame); - C1ActuatorsButton->setObjectName(QString::fromUtf8("C1ActuatorsButton")); - C1ActuatorsButton->setGeometry(QRect(468, 370, 20, 15)); + ActuatorButton04_43->setPalette(palette159); + ActuatorButton04_45 = new QPushButton(frame); + ActuatorButton04_45->setObjectName(QString::fromUtf8("ActuatorButton04_45")); + ActuatorButton04_45->setGeometry(QRect(325, 219, 10, 10)); QPalette palette160; palette160.setBrush(QPalette::Active, QPalette::WindowText, brush); palette160.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9149,13 +9181,10 @@ public: palette160.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette160.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette160.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C1ActuatorsButton->setPalette(palette160); - QFont font4; - font4.setPointSize(8); - C1ActuatorsButton->setFont(font4); - C2ActuatorsButton = new QPushButton(frame); - C2ActuatorsButton->setObjectName(QString::fromUtf8("C2ActuatorsButton")); - C2ActuatorsButton->setGeometry(QRect(470, 310, 20, 15)); + ActuatorButton04_45->setPalette(palette160); + ActuatorButton04_46 = new QPushButton(frame); + ActuatorButton04_46->setObjectName(QString::fromUtf8("ActuatorButton04_46")); + ActuatorButton04_46->setGeometry(QRect(359, 202, 10, 10)); QPalette palette161; palette161.setBrush(QPalette::Active, QPalette::WindowText, brush); palette161.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9205,11 +9234,10 @@ public: palette161.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette161.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette161.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C2ActuatorsButton->setPalette(palette161); - C2ActuatorsButton->setFont(font4); - C3ActuatorsButton = new QPushButton(frame); - C3ActuatorsButton->setObjectName(QString::fromUtf8("C3ActuatorsButton")); - C3ActuatorsButton->setGeometry(QRect(470, 252, 20, 15)); + ActuatorButton04_46->setPalette(palette161); + ActuatorButton04_47 = new QPushButton(frame); + ActuatorButton04_47->setObjectName(QString::fromUtf8("ActuatorButton04_47")); + ActuatorButton04_47->setGeometry(QRect(395, 189, 10, 10)); QPalette palette162; palette162.setBrush(QPalette::Active, QPalette::WindowText, brush); palette162.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9259,11 +9287,10 @@ public: palette162.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette162.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette162.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C3ActuatorsButton->setPalette(palette162); - C3ActuatorsButton->setFont(font4); - ActuatorButton05_01 = new QPushButton(frame); - ActuatorButton05_01->setObjectName(QString::fromUtf8("ActuatorButton05_01")); - ActuatorButton05_01->setGeometry(QRect(471, 129, 10, 10)); + ActuatorButton04_47->setPalette(palette162); + ActuatorButton04_48 = new QPushButton(frame); + ActuatorButton04_48->setObjectName(QString::fromUtf8("ActuatorButton04_48")); + ActuatorButton04_48->setGeometry(QRect(433, 182, 10, 10)); QPalette palette163; palette163.setBrush(QPalette::Active, QPalette::WindowText, brush); palette163.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9313,10 +9340,10 @@ public: palette163.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette163.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette163.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_01->setPalette(palette163); - ActuatorButton05_02 = new QPushButton(frame); - ActuatorButton05_02->setObjectName(QString::fromUtf8("ActuatorButton05_02")); - ActuatorButton05_02->setGeometry(QRect(516, 132, 10, 10)); + ActuatorButton04_48->setPalette(palette163); + C1ActuatorsButton = new QPushButton(frame); + C1ActuatorsButton->setObjectName(QString::fromUtf8("C1ActuatorsButton")); + C1ActuatorsButton->setGeometry(QRect(468, 370, 20, 15)); QPalette palette164; palette164.setBrush(QPalette::Active, QPalette::WindowText, brush); palette164.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9366,10 +9393,13 @@ public: palette164.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette164.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette164.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_02->setPalette(palette164); - ActuatorButton05_03 = new QPushButton(frame); - ActuatorButton05_03->setObjectName(QString::fromUtf8("ActuatorButton05_03")); - ActuatorButton05_03->setGeometry(QRect(559, 142, 10, 10)); + C1ActuatorsButton->setPalette(palette164); + QFont font4; + font4.setPointSize(8); + C1ActuatorsButton->setFont(font4); + C2ActuatorsButton = new QPushButton(frame); + C2ActuatorsButton->setObjectName(QString::fromUtf8("C2ActuatorsButton")); + C2ActuatorsButton->setGeometry(QRect(470, 310, 20, 15)); QPalette palette165; palette165.setBrush(QPalette::Active, QPalette::WindowText, brush); palette165.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9419,10 +9449,11 @@ public: palette165.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette165.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette165.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_03->setPalette(palette165); - ActuatorButton05_04 = new QPushButton(frame); - ActuatorButton05_04->setObjectName(QString::fromUtf8("ActuatorButton05_04")); - ActuatorButton05_04->setGeometry(QRect(602, 155, 10, 10)); + C2ActuatorsButton->setPalette(palette165); + C2ActuatorsButton->setFont(font4); + C3ActuatorsButton = new QPushButton(frame); + C3ActuatorsButton->setObjectName(QString::fromUtf8("C3ActuatorsButton")); + C3ActuatorsButton->setGeometry(QRect(470, 252, 20, 15)); QPalette palette166; palette166.setBrush(QPalette::Active, QPalette::WindowText, brush); palette166.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9472,10 +9503,11 @@ public: palette166.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette166.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette166.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_04->setPalette(palette166); - ActuatorButton05_05 = new QPushButton(frame); - ActuatorButton05_05->setObjectName(QString::fromUtf8("ActuatorButton05_05")); - ActuatorButton05_05->setGeometry(QRect(642, 175, 10, 10)); + C3ActuatorsButton->setPalette(palette166); + C3ActuatorsButton->setFont(font4); + ActuatorButton05_01 = new QPushButton(frame); + ActuatorButton05_01->setObjectName(QString::fromUtf8("ActuatorButton05_01")); + ActuatorButton05_01->setGeometry(QRect(471, 129, 10, 10)); QPalette palette167; palette167.setBrush(QPalette::Active, QPalette::WindowText, brush); palette167.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9525,10 +9557,10 @@ public: palette167.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette167.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette167.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_05->setPalette(palette167); - ActuatorButton05_06 = new QPushButton(frame); - ActuatorButton05_06->setObjectName(QString::fromUtf8("ActuatorButton05_06")); - ActuatorButton05_06->setGeometry(QRect(680, 200, 10, 10)); + ActuatorButton05_01->setPalette(palette167); + ActuatorButton05_02 = new QPushButton(frame); + ActuatorButton05_02->setObjectName(QString::fromUtf8("ActuatorButton05_02")); + ActuatorButton05_02->setGeometry(QRect(516, 132, 10, 10)); QPalette palette168; palette168.setBrush(QPalette::Active, QPalette::WindowText, brush); palette168.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9578,10 +9610,10 @@ public: palette168.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette168.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette168.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_06->setPalette(palette168); - ActuatorButton05_08 = new QPushButton(frame); - ActuatorButton05_08->setObjectName(QString::fromUtf8("ActuatorButton05_08")); - ActuatorButton05_08->setGeometry(QRect(743, 264, 10, 10)); + ActuatorButton05_02->setPalette(palette168); + ActuatorButton05_03 = new QPushButton(frame); + ActuatorButton05_03->setObjectName(QString::fromUtf8("ActuatorButton05_03")); + ActuatorButton05_03->setGeometry(QRect(559, 142, 10, 10)); QPalette palette169; palette169.setBrush(QPalette::Active, QPalette::WindowText, brush); palette169.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9631,10 +9663,10 @@ public: palette169.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette169.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette169.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_08->setPalette(palette169); - ActuatorButton05_09 = new QPushButton(frame); - ActuatorButton05_09->setObjectName(QString::fromUtf8("ActuatorButton05_09")); - ActuatorButton05_09->setGeometry(QRect(767, 300, 10, 10)); + ActuatorButton05_03->setPalette(palette169); + ActuatorButton05_04 = new QPushButton(frame); + ActuatorButton05_04->setObjectName(QString::fromUtf8("ActuatorButton05_04")); + ActuatorButton05_04->setGeometry(QRect(602, 155, 10, 10)); QPalette palette170; palette170.setBrush(QPalette::Active, QPalette::WindowText, brush); palette170.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9684,10 +9716,10 @@ public: palette170.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette170.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette170.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_09->setPalette(palette170); - ActuatorButton05_10 = new QPushButton(frame); - ActuatorButton05_10->setObjectName(QString::fromUtf8("ActuatorButton05_10")); - ActuatorButton05_10->setGeometry(QRect(787, 340, 10, 10)); + ActuatorButton05_04->setPalette(palette170); + ActuatorButton05_05 = new QPushButton(frame); + ActuatorButton05_05->setObjectName(QString::fromUtf8("ActuatorButton05_05")); + ActuatorButton05_05->setGeometry(QRect(642, 175, 10, 10)); QPalette palette171; palette171.setBrush(QPalette::Active, QPalette::WindowText, brush); palette171.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9737,10 +9769,10 @@ public: palette171.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette171.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette171.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_10->setPalette(palette171); - ActuatorButton05_11 = new QPushButton(frame); - ActuatorButton05_11->setObjectName(QString::fromUtf8("ActuatorButton05_11")); - ActuatorButton05_11->setGeometry(QRect(801, 383, 10, 10)); + ActuatorButton05_05->setPalette(palette171); + ActuatorButton05_06 = new QPushButton(frame); + ActuatorButton05_06->setObjectName(QString::fromUtf8("ActuatorButton05_06")); + ActuatorButton05_06->setGeometry(QRect(680, 200, 10, 10)); QPalette palette172; palette172.setBrush(QPalette::Active, QPalette::WindowText, brush); palette172.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9790,10 +9822,10 @@ public: palette172.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette172.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette172.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_11->setPalette(palette172); - ActuatorButton05_12 = new QPushButton(frame); - ActuatorButton05_12->setObjectName(QString::fromUtf8("ActuatorButton05_12")); - ActuatorButton05_12->setGeometry(QRect(810, 426, 10, 10)); + ActuatorButton05_06->setPalette(palette172); + ActuatorButton05_08 = new QPushButton(frame); + ActuatorButton05_08->setObjectName(QString::fromUtf8("ActuatorButton05_08")); + ActuatorButton05_08->setGeometry(QRect(743, 264, 10, 10)); QPalette palette173; palette173.setBrush(QPalette::Active, QPalette::WindowText, brush); palette173.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9843,10 +9875,10 @@ public: palette173.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette173.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette173.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_12->setPalette(palette173); - ActuatorButton05_13 = new QPushButton(frame); - ActuatorButton05_13->setObjectName(QString::fromUtf8("ActuatorButton05_13")); - ActuatorButton05_13->setGeometry(QRect(813, 471, 10, 10)); + ActuatorButton05_08->setPalette(palette173); + ActuatorButton05_09 = new QPushButton(frame); + ActuatorButton05_09->setObjectName(QString::fromUtf8("ActuatorButton05_09")); + ActuatorButton05_09->setGeometry(QRect(767, 300, 10, 10)); QPalette palette174; palette174.setBrush(QPalette::Active, QPalette::WindowText, brush); palette174.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9896,10 +9928,10 @@ public: palette174.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette174.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette174.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_13->setPalette(palette174); - ActuatorButton05_14 = new QPushButton(frame); - ActuatorButton05_14->setObjectName(QString::fromUtf8("ActuatorButton05_14")); - ActuatorButton05_14->setGeometry(QRect(810, 516, 10, 10)); + ActuatorButton05_09->setPalette(palette174); + ActuatorButton05_10 = new QPushButton(frame); + ActuatorButton05_10->setObjectName(QString::fromUtf8("ActuatorButton05_10")); + ActuatorButton05_10->setGeometry(QRect(787, 340, 10, 10)); QPalette palette175; palette175.setBrush(QPalette::Active, QPalette::WindowText, brush); palette175.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -9949,10 +9981,10 @@ public: palette175.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette175.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette175.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_14->setPalette(palette175); - ActuatorButton05_15 = new QPushButton(frame); - ActuatorButton05_15->setObjectName(QString::fromUtf8("ActuatorButton05_15")); - ActuatorButton05_15->setGeometry(QRect(801, 560, 10, 10)); + ActuatorButton05_10->setPalette(palette175); + ActuatorButton05_11 = new QPushButton(frame); + ActuatorButton05_11->setObjectName(QString::fromUtf8("ActuatorButton05_11")); + ActuatorButton05_11->setGeometry(QRect(801, 383, 10, 10)); QPalette palette176; palette176.setBrush(QPalette::Active, QPalette::WindowText, brush); palette176.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10002,10 +10034,10 @@ public: palette176.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette176.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette176.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_15->setPalette(palette176); - ActuatorButton05_16 = new QPushButton(frame); - ActuatorButton05_16->setObjectName(QString::fromUtf8("ActuatorButton05_16")); - ActuatorButton05_16->setGeometry(QRect(787, 602, 10, 10)); + ActuatorButton05_11->setPalette(palette176); + ActuatorButton05_12 = new QPushButton(frame); + ActuatorButton05_12->setObjectName(QString::fromUtf8("ActuatorButton05_12")); + ActuatorButton05_12->setGeometry(QRect(810, 426, 10, 10)); QPalette palette177; palette177.setBrush(QPalette::Active, QPalette::WindowText, brush); palette177.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10055,10 +10087,10 @@ public: palette177.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette177.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette177.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_16->setPalette(palette177); - ActuatorButton05_17 = new QPushButton(frame); - ActuatorButton05_17->setObjectName(QString::fromUtf8("ActuatorButton05_17")); - ActuatorButton05_17->setGeometry(QRect(767, 642, 10, 10)); + ActuatorButton05_12->setPalette(palette177); + ActuatorButton05_13 = new QPushButton(frame); + ActuatorButton05_13->setObjectName(QString::fromUtf8("ActuatorButton05_13")); + ActuatorButton05_13->setGeometry(QRect(813, 471, 10, 10)); QPalette palette178; palette178.setBrush(QPalette::Active, QPalette::WindowText, brush); palette178.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10108,10 +10140,10 @@ public: palette178.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette178.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette178.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_17->setPalette(palette178); - ActuatorButton05_18 = new QPushButton(frame); - ActuatorButton05_18->setObjectName(QString::fromUtf8("ActuatorButton05_18")); - ActuatorButton05_18->setGeometry(QRect(742, 679, 10, 10)); + ActuatorButton05_13->setPalette(palette178); + ActuatorButton05_14 = new QPushButton(frame); + ActuatorButton05_14->setObjectName(QString::fromUtf8("ActuatorButton05_14")); + ActuatorButton05_14->setGeometry(QRect(810, 516, 10, 10)); QPalette palette179; palette179.setBrush(QPalette::Active, QPalette::WindowText, brush); palette179.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10161,10 +10193,10 @@ public: palette179.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette179.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette179.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_18->setPalette(palette179); - ActuatorButton05_20 = new QPushButton(frame); - ActuatorButton05_20->setObjectName(QString::fromUtf8("ActuatorButton05_20")); - ActuatorButton05_20->setGeometry(QRect(679, 743, 10, 10)); + ActuatorButton05_14->setPalette(palette179); + ActuatorButton05_15 = new QPushButton(frame); + ActuatorButton05_15->setObjectName(QString::fromUtf8("ActuatorButton05_15")); + ActuatorButton05_15->setGeometry(QRect(801, 560, 10, 10)); QPalette palette180; palette180.setBrush(QPalette::Active, QPalette::WindowText, brush); palette180.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10214,10 +10246,10 @@ public: palette180.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette180.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette180.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_20->setPalette(palette180); - ActuatorButton05_21 = new QPushButton(frame); - ActuatorButton05_21->setObjectName(QString::fromUtf8("ActuatorButton05_21")); - ActuatorButton05_21->setGeometry(QRect(642, 768, 10, 10)); + ActuatorButton05_15->setPalette(palette180); + ActuatorButton05_16 = new QPushButton(frame); + ActuatorButton05_16->setObjectName(QString::fromUtf8("ActuatorButton05_16")); + ActuatorButton05_16->setGeometry(QRect(787, 602, 10, 10)); QPalette palette181; palette181.setBrush(QPalette::Active, QPalette::WindowText, brush); palette181.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10267,10 +10299,10 @@ public: palette181.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette181.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette181.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_21->setPalette(palette181); - ActuatorButton05_22 = new QPushButton(frame); - ActuatorButton05_22->setObjectName(QString::fromUtf8("ActuatorButton05_22")); - ActuatorButton05_22->setGeometry(QRect(602, 788, 10, 10)); + ActuatorButton05_16->setPalette(palette181); + ActuatorButton05_17 = new QPushButton(frame); + ActuatorButton05_17->setObjectName(QString::fromUtf8("ActuatorButton05_17")); + ActuatorButton05_17->setGeometry(QRect(767, 642, 10, 10)); QPalette palette182; palette182.setBrush(QPalette::Active, QPalette::WindowText, brush); palette182.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10320,10 +10352,10 @@ public: palette182.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette182.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette182.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_22->setPalette(palette182); - ActuatorButton05_23 = new QPushButton(frame); - ActuatorButton05_23->setObjectName(QString::fromUtf8("ActuatorButton05_23")); - ActuatorButton05_23->setGeometry(QRect(559, 801, 10, 10)); + ActuatorButton05_17->setPalette(palette182); + ActuatorButton05_18 = new QPushButton(frame); + ActuatorButton05_18->setObjectName(QString::fromUtf8("ActuatorButton05_18")); + ActuatorButton05_18->setGeometry(QRect(742, 679, 10, 10)); QPalette palette183; palette183.setBrush(QPalette::Active, QPalette::WindowText, brush); palette183.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10373,10 +10405,10 @@ public: palette183.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette183.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette183.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_23->setPalette(palette183); - ActuatorButton05_24 = new QPushButton(frame); - ActuatorButton05_24->setObjectName(QString::fromUtf8("ActuatorButton05_24")); - ActuatorButton05_24->setGeometry(QRect(516, 811, 10, 10)); + ActuatorButton05_18->setPalette(palette183); + ActuatorButton05_20 = new QPushButton(frame); + ActuatorButton05_20->setObjectName(QString::fromUtf8("ActuatorButton05_20")); + ActuatorButton05_20->setGeometry(QRect(679, 743, 10, 10)); QPalette palette184; palette184.setBrush(QPalette::Active, QPalette::WindowText, brush); palette184.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10426,10 +10458,10 @@ public: palette184.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette184.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette184.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_24->setPalette(palette184); - ActuatorButton05_25 = new QPushButton(frame); - ActuatorButton05_25->setObjectName(QString::fromUtf8("ActuatorButton05_25")); - ActuatorButton05_25->setGeometry(QRect(471, 813, 10, 10)); + ActuatorButton05_20->setPalette(palette184); + ActuatorButton05_21 = new QPushButton(frame); + ActuatorButton05_21->setObjectName(QString::fromUtf8("ActuatorButton05_21")); + ActuatorButton05_21->setGeometry(QRect(642, 768, 10, 10)); QPalette palette185; palette185.setBrush(QPalette::Active, QPalette::WindowText, brush); palette185.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10479,10 +10511,10 @@ public: palette185.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette185.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette185.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_25->setPalette(palette185); - ActuatorButton05_26 = new QPushButton(frame); - ActuatorButton05_26->setObjectName(QString::fromUtf8("ActuatorButton05_26")); - ActuatorButton05_26->setGeometry(QRect(426, 811, 10, 10)); + ActuatorButton05_21->setPalette(palette185); + ActuatorButton05_22 = new QPushButton(frame); + ActuatorButton05_22->setObjectName(QString::fromUtf8("ActuatorButton05_22")); + ActuatorButton05_22->setGeometry(QRect(602, 788, 10, 10)); QPalette palette186; palette186.setBrush(QPalette::Active, QPalette::WindowText, brush); palette186.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10532,10 +10564,10 @@ public: palette186.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette186.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette186.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_26->setPalette(palette186); - ActuatorButton05_27 = new QPushButton(frame); - ActuatorButton05_27->setObjectName(QString::fromUtf8("ActuatorButton05_27")); - ActuatorButton05_27->setGeometry(QRect(382, 802, 10, 10)); + ActuatorButton05_22->setPalette(palette186); + ActuatorButton05_23 = new QPushButton(frame); + ActuatorButton05_23->setObjectName(QString::fromUtf8("ActuatorButton05_23")); + ActuatorButton05_23->setGeometry(QRect(559, 801, 10, 10)); QPalette palette187; palette187.setBrush(QPalette::Active, QPalette::WindowText, brush); palette187.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10585,10 +10617,10 @@ public: palette187.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette187.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette187.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_27->setPalette(palette187); - ActuatorButton05_28 = new QPushButton(frame); - ActuatorButton05_28->setObjectName(QString::fromUtf8("ActuatorButton05_28")); - ActuatorButton05_28->setGeometry(QRect(339, 787, 10, 10)); + ActuatorButton05_23->setPalette(palette187); + ActuatorButton05_24 = new QPushButton(frame); + ActuatorButton05_24->setObjectName(QString::fromUtf8("ActuatorButton05_24")); + ActuatorButton05_24->setGeometry(QRect(516, 811, 10, 10)); QPalette palette188; palette188.setBrush(QPalette::Active, QPalette::WindowText, brush); palette188.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10638,10 +10670,10 @@ public: palette188.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette188.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette188.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_28->setPalette(palette188); - ActuatorButton05_29 = new QPushButton(frame); - ActuatorButton05_29->setObjectName(QString::fromUtf8("ActuatorButton05_29")); - ActuatorButton05_29->setGeometry(QRect(299, 767, 10, 10)); + ActuatorButton05_24->setPalette(palette188); + ActuatorButton05_25 = new QPushButton(frame); + ActuatorButton05_25->setObjectName(QString::fromUtf8("ActuatorButton05_25")); + ActuatorButton05_25->setGeometry(QRect(471, 813, 10, 10)); QPalette palette189; palette189.setBrush(QPalette::Active, QPalette::WindowText, brush); palette189.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10691,10 +10723,10 @@ public: palette189.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette189.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette189.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_29->setPalette(palette189); - ActuatorButton05_30 = new QPushButton(frame); - ActuatorButton05_30->setObjectName(QString::fromUtf8("ActuatorButton05_30")); - ActuatorButton05_30->setGeometry(QRect(262, 743, 10, 10)); + ActuatorButton05_25->setPalette(palette189); + ActuatorButton05_26 = new QPushButton(frame); + ActuatorButton05_26->setObjectName(QString::fromUtf8("ActuatorButton05_26")); + ActuatorButton05_26->setGeometry(QRect(426, 811, 10, 10)); QPalette palette190; palette190.setBrush(QPalette::Active, QPalette::WindowText, brush); palette190.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10744,10 +10776,10 @@ public: palette190.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette190.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette190.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_30->setPalette(palette190); - ActuatorButton05_32 = new QPushButton(frame); - ActuatorButton05_32->setObjectName(QString::fromUtf8("ActuatorButton05_32")); - ActuatorButton05_32->setGeometry(QRect(198, 679, 10, 10)); + ActuatorButton05_26->setPalette(palette190); + ActuatorButton05_27 = new QPushButton(frame); + ActuatorButton05_27->setObjectName(QString::fromUtf8("ActuatorButton05_27")); + ActuatorButton05_27->setGeometry(QRect(382, 802, 10, 10)); QPalette palette191; palette191.setBrush(QPalette::Active, QPalette::WindowText, brush); palette191.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10797,10 +10829,10 @@ public: palette191.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette191.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette191.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_32->setPalette(palette191); - ActuatorButton05_33 = new QPushButton(frame); - ActuatorButton05_33->setObjectName(QString::fromUtf8("ActuatorButton05_33")); - ActuatorButton05_33->setGeometry(QRect(173, 642, 10, 10)); + ActuatorButton05_27->setPalette(palette191); + ActuatorButton05_28 = new QPushButton(frame); + ActuatorButton05_28->setObjectName(QString::fromUtf8("ActuatorButton05_28")); + ActuatorButton05_28->setGeometry(QRect(339, 787, 10, 10)); QPalette palette192; palette192.setBrush(QPalette::Active, QPalette::WindowText, brush); palette192.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10850,10 +10882,10 @@ public: palette192.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette192.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette192.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_33->setPalette(palette192); - ActuatorButton05_34 = new QPushButton(frame); - ActuatorButton05_34->setObjectName(QString::fromUtf8("ActuatorButton05_34")); - ActuatorButton05_34->setGeometry(QRect(154, 602, 10, 10)); + ActuatorButton05_28->setPalette(palette192); + ActuatorButton05_29 = new QPushButton(frame); + ActuatorButton05_29->setObjectName(QString::fromUtf8("ActuatorButton05_29")); + ActuatorButton05_29->setGeometry(QRect(299, 767, 10, 10)); QPalette palette193; palette193.setBrush(QPalette::Active, QPalette::WindowText, brush); palette193.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10903,10 +10935,10 @@ public: palette193.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette193.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette193.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_34->setPalette(palette193); - ActuatorButton05_35 = new QPushButton(frame); - ActuatorButton05_35->setObjectName(QString::fromUtf8("ActuatorButton05_35")); - ActuatorButton05_35->setGeometry(QRect(140, 559, 10, 10)); + ActuatorButton05_29->setPalette(palette193); + ActuatorButton05_30 = new QPushButton(frame); + ActuatorButton05_30->setObjectName(QString::fromUtf8("ActuatorButton05_30")); + ActuatorButton05_30->setGeometry(QRect(262, 743, 10, 10)); QPalette palette194; palette194.setBrush(QPalette::Active, QPalette::WindowText, brush); palette194.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -10956,10 +10988,10 @@ public: palette194.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette194.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette194.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_35->setPalette(palette194); - ActuatorButton05_36 = new QPushButton(frame); - ActuatorButton05_36->setObjectName(QString::fromUtf8("ActuatorButton05_36")); - ActuatorButton05_36->setGeometry(QRect(131, 516, 10, 10)); + ActuatorButton05_30->setPalette(palette194); + ActuatorButton05_32 = new QPushButton(frame); + ActuatorButton05_32->setObjectName(QString::fromUtf8("ActuatorButton05_32")); + ActuatorButton05_32->setGeometry(QRect(198, 679, 10, 10)); QPalette palette195; palette195.setBrush(QPalette::Active, QPalette::WindowText, brush); palette195.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11009,10 +11041,10 @@ public: palette195.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette195.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette195.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_36->setPalette(palette195); - ActuatorButton05_37 = new QPushButton(frame); - ActuatorButton05_37->setObjectName(QString::fromUtf8("ActuatorButton05_37")); - ActuatorButton05_37->setGeometry(QRect(128, 471, 10, 10)); + ActuatorButton05_32->setPalette(palette195); + ActuatorButton05_33 = new QPushButton(frame); + ActuatorButton05_33->setObjectName(QString::fromUtf8("ActuatorButton05_33")); + ActuatorButton05_33->setGeometry(QRect(173, 642, 10, 10)); QPalette palette196; palette196.setBrush(QPalette::Active, QPalette::WindowText, brush); palette196.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11062,10 +11094,10 @@ public: palette196.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette196.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette196.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_37->setPalette(palette196); - ActuatorButton05_38 = new QPushButton(frame); - ActuatorButton05_38->setObjectName(QString::fromUtf8("ActuatorButton05_38")); - ActuatorButton05_38->setGeometry(QRect(131, 427, 10, 10)); + ActuatorButton05_33->setPalette(palette196); + ActuatorButton05_34 = new QPushButton(frame); + ActuatorButton05_34->setObjectName(QString::fromUtf8("ActuatorButton05_34")); + ActuatorButton05_34->setGeometry(QRect(154, 602, 10, 10)); QPalette palette197; palette197.setBrush(QPalette::Active, QPalette::WindowText, brush); palette197.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11115,10 +11147,10 @@ public: palette197.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette197.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette197.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_38->setPalette(palette197); - ActuatorButton05_39 = new QPushButton(frame); - ActuatorButton05_39->setObjectName(QString::fromUtf8("ActuatorButton05_39")); - ActuatorButton05_39->setGeometry(QRect(140, 383, 10, 10)); + ActuatorButton05_34->setPalette(palette197); + ActuatorButton05_35 = new QPushButton(frame); + ActuatorButton05_35->setObjectName(QString::fromUtf8("ActuatorButton05_35")); + ActuatorButton05_35->setGeometry(QRect(140, 559, 10, 10)); QPalette palette198; palette198.setBrush(QPalette::Active, QPalette::WindowText, brush); palette198.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11168,10 +11200,10 @@ public: palette198.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette198.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette198.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_39->setPalette(palette198); - ActuatorButton05_40 = new QPushButton(frame); - ActuatorButton05_40->setObjectName(QString::fromUtf8("ActuatorButton05_40")); - ActuatorButton05_40->setGeometry(QRect(154, 341, 10, 10)); + ActuatorButton05_35->setPalette(palette198); + ActuatorButton05_36 = new QPushButton(frame); + ActuatorButton05_36->setObjectName(QString::fromUtf8("ActuatorButton05_36")); + ActuatorButton05_36->setGeometry(QRect(131, 516, 10, 10)); QPalette palette199; palette199.setBrush(QPalette::Active, QPalette::WindowText, brush); palette199.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11221,10 +11253,10 @@ public: palette199.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette199.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette199.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_40->setPalette(palette199); - ActuatorButton05_41 = new QPushButton(frame); - ActuatorButton05_41->setObjectName(QString::fromUtf8("ActuatorButton05_41")); - ActuatorButton05_41->setGeometry(QRect(174, 300, 10, 10)); + ActuatorButton05_36->setPalette(palette199); + ActuatorButton05_37 = new QPushButton(frame); + ActuatorButton05_37->setObjectName(QString::fromUtf8("ActuatorButton05_37")); + ActuatorButton05_37->setGeometry(QRect(128, 471, 10, 10)); QPalette palette200; palette200.setBrush(QPalette::Active, QPalette::WindowText, brush); palette200.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11274,10 +11306,10 @@ public: palette200.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette200.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette200.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_41->setPalette(palette200); - ActuatorButton05_42 = new QPushButton(frame); - ActuatorButton05_42->setObjectName(QString::fromUtf8("ActuatorButton05_42")); - ActuatorButton05_42->setGeometry(QRect(199, 263, 10, 10)); + ActuatorButton05_37->setPalette(palette200); + ActuatorButton05_38 = new QPushButton(frame); + ActuatorButton05_38->setObjectName(QString::fromUtf8("ActuatorButton05_38")); + ActuatorButton05_38->setGeometry(QRect(131, 427, 10, 10)); QPalette palette201; palette201.setBrush(QPalette::Active, QPalette::WindowText, brush); palette201.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11327,10 +11359,10 @@ public: palette201.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette201.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette201.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_42->setPalette(palette201); - ActuatorButton05_44 = new QPushButton(frame); - ActuatorButton05_44->setObjectName(QString::fromUtf8("ActuatorButton05_44")); - ActuatorButton05_44->setGeometry(QRect(262, 199, 10, 10)); + ActuatorButton05_38->setPalette(palette201); + ActuatorButton05_39 = new QPushButton(frame); + ActuatorButton05_39->setObjectName(QString::fromUtf8("ActuatorButton05_39")); + ActuatorButton05_39->setGeometry(QRect(140, 383, 10, 10)); QPalette palette202; palette202.setBrush(QPalette::Active, QPalette::WindowText, brush); palette202.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11380,10 +11412,10 @@ public: palette202.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette202.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette202.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_44->setPalette(palette202); - ActuatorButton05_45 = new QPushButton(frame); - ActuatorButton05_45->setObjectName(QString::fromUtf8("ActuatorButton05_45")); - ActuatorButton05_45->setGeometry(QRect(299, 175, 10, 10)); + ActuatorButton05_39->setPalette(palette202); + ActuatorButton05_40 = new QPushButton(frame); + ActuatorButton05_40->setObjectName(QString::fromUtf8("ActuatorButton05_40")); + ActuatorButton05_40->setGeometry(QRect(154, 341, 10, 10)); QPalette palette203; palette203.setBrush(QPalette::Active, QPalette::WindowText, brush); palette203.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11433,10 +11465,10 @@ public: palette203.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette203.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette203.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_45->setPalette(palette203); - ActuatorButton05_46 = new QPushButton(frame); - ActuatorButton05_46->setObjectName(QString::fromUtf8("ActuatorButton05_46")); - ActuatorButton05_46->setGeometry(QRect(339, 155, 10, 10)); + ActuatorButton05_40->setPalette(palette203); + ActuatorButton05_41 = new QPushButton(frame); + ActuatorButton05_41->setObjectName(QString::fromUtf8("ActuatorButton05_41")); + ActuatorButton05_41->setGeometry(QRect(174, 300, 10, 10)); QPalette palette204; palette204.setBrush(QPalette::Active, QPalette::WindowText, brush); palette204.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11486,10 +11518,10 @@ public: palette204.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette204.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette204.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_46->setPalette(palette204); - ActuatorButton05_47 = new QPushButton(frame); - ActuatorButton05_47->setObjectName(QString::fromUtf8("ActuatorButton05_47")); - ActuatorButton05_47->setGeometry(QRect(382, 140, 10, 10)); + ActuatorButton05_41->setPalette(palette204); + ActuatorButton05_42 = new QPushButton(frame); + ActuatorButton05_42->setObjectName(QString::fromUtf8("ActuatorButton05_42")); + ActuatorButton05_42->setGeometry(QRect(199, 263, 10, 10)); QPalette palette205; palette205.setBrush(QPalette::Active, QPalette::WindowText, brush); palette205.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11539,10 +11571,10 @@ public: palette205.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette205.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette205.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_47->setPalette(palette205); - ActuatorButton05_48 = new QPushButton(frame); - ActuatorButton05_48->setObjectName(QString::fromUtf8("ActuatorButton05_48")); - ActuatorButton05_48->setGeometry(QRect(426, 131, 10, 10)); + ActuatorButton05_42->setPalette(palette205); + ActuatorButton05_44 = new QPushButton(frame); + ActuatorButton05_44->setObjectName(QString::fromUtf8("ActuatorButton05_44")); + ActuatorButton05_44->setGeometry(QRect(262, 199, 10, 10)); QPalette palette206; palette206.setBrush(QPalette::Active, QPalette::WindowText, brush); palette206.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11592,10 +11624,10 @@ public: palette206.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette206.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette206.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_48->setPalette(palette206); - C5ActuatorsButton = new QPushButton(frame); - C5ActuatorsButton->setObjectName(QString::fromUtf8("C5ActuatorsButton")); - C5ActuatorsButton->setGeometry(QRect(470, 140, 25, 15)); + ActuatorButton05_44->setPalette(palette206); + ActuatorButton05_45 = new QPushButton(frame); + ActuatorButton05_45->setObjectName(QString::fromUtf8("ActuatorButton05_45")); + ActuatorButton05_45->setGeometry(QRect(299, 175, 10, 10)); QPalette palette207; palette207.setBrush(QPalette::Active, QPalette::WindowText, brush); palette207.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11645,11 +11677,10 @@ public: palette207.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette207.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette207.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C5ActuatorsButton->setPalette(palette207); - C5ActuatorsButton->setFont(font4); - C4ActuatorsButton = new QPushButton(frame); - C4ActuatorsButton->setObjectName(QString::fromUtf8("C4ActuatorsButton")); - C4ActuatorsButton->setGeometry(QRect(471, 192, 20, 15)); + ActuatorButton05_45->setPalette(palette207); + ActuatorButton05_46 = new QPushButton(frame); + ActuatorButton05_46->setObjectName(QString::fromUtf8("ActuatorButton05_46")); + ActuatorButton05_46->setGeometry(QRect(339, 155, 10, 10)); QPalette palette208; palette208.setBrush(QPalette::Active, QPalette::WindowText, brush); palette208.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11699,11 +11730,10 @@ public: palette208.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette208.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette208.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C4ActuatorsButton->setPalette(palette208); - C4ActuatorsButton->setFont(font4); - ActuatorButton06_01 = new QPushButton(frame); - ActuatorButton06_01->setObjectName(QString::fromUtf8("ActuatorButton06_01")); - ActuatorButton06_01->setGeometry(QRect(471, 77, 10, 10)); + ActuatorButton05_46->setPalette(palette208); + ActuatorButton05_47 = new QPushButton(frame); + ActuatorButton05_47->setObjectName(QString::fromUtf8("ActuatorButton05_47")); + ActuatorButton05_47->setGeometry(QRect(382, 140, 10, 10)); QPalette palette209; palette209.setBrush(QPalette::Active, QPalette::WindowText, brush); palette209.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11753,10 +11783,10 @@ public: palette209.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette209.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette209.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_01->setPalette(palette209); - ActuatorButton06_02 = new QPushButton(frame); - ActuatorButton06_02->setObjectName(QString::fromUtf8("ActuatorButton06_02")); - ActuatorButton06_02->setGeometry(QRect(522, 81, 10, 10)); + ActuatorButton05_47->setPalette(palette209); + ActuatorButton05_48 = new QPushButton(frame); + ActuatorButton05_48->setObjectName(QString::fromUtf8("ActuatorButton05_48")); + ActuatorButton05_48->setGeometry(QRect(426, 131, 10, 10)); QPalette palette210; palette210.setBrush(QPalette::Active, QPalette::WindowText, brush); palette210.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11806,10 +11836,10 @@ public: palette210.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette210.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette210.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_02->setPalette(palette210); - ActuatorButton06_03 = new QPushButton(frame); - ActuatorButton06_03->setObjectName(QString::fromUtf8("ActuatorButton06_03")); - ActuatorButton06_03->setGeometry(QRect(573, 92, 10, 10)); + ActuatorButton05_48->setPalette(palette210); + C5ActuatorsButton = new QPushButton(frame); + C5ActuatorsButton->setObjectName(QString::fromUtf8("C5ActuatorsButton")); + C5ActuatorsButton->setGeometry(QRect(470, 140, 25, 15)); QPalette palette211; palette211.setBrush(QPalette::Active, QPalette::WindowText, brush); palette211.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11859,10 +11889,11 @@ public: palette211.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette211.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette211.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_03->setPalette(palette211); - ActuatorButton06_04 = new QPushButton(frame); - ActuatorButton06_04->setObjectName(QString::fromUtf8("ActuatorButton06_04")); - ActuatorButton06_04->setGeometry(QRect(621, 108, 10, 10)); + C5ActuatorsButton->setPalette(palette211); + C5ActuatorsButton->setFont(font4); + C4ActuatorsButton = new QPushButton(frame); + C4ActuatorsButton->setObjectName(QString::fromUtf8("C4ActuatorsButton")); + C4ActuatorsButton->setGeometry(QRect(471, 192, 20, 15)); QPalette palette212; palette212.setBrush(QPalette::Active, QPalette::WindowText, brush); palette212.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11912,10 +11943,11 @@ public: palette212.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette212.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette212.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_04->setPalette(palette212); - ActuatorButton06_05 = new QPushButton(frame); - ActuatorButton06_05->setObjectName(QString::fromUtf8("ActuatorButton06_05")); - ActuatorButton06_05->setGeometry(QRect(667, 131, 10, 10)); + C4ActuatorsButton->setPalette(palette212); + C4ActuatorsButton->setFont(font4); + ActuatorButton06_01 = new QPushButton(frame); + ActuatorButton06_01->setObjectName(QString::fromUtf8("ActuatorButton06_01")); + ActuatorButton06_01->setGeometry(QRect(471, 77, 10, 10)); QPalette palette213; palette213.setBrush(QPalette::Active, QPalette::WindowText, brush); palette213.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -11965,10 +11997,10 @@ public: palette213.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette213.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette213.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_05->setPalette(palette213); - ActuatorButton06_06 = new QPushButton(frame); - ActuatorButton06_06->setObjectName(QString::fromUtf8("ActuatorButton06_06")); - ActuatorButton06_06->setGeometry(QRect(711, 159, 10, 10)); + ActuatorButton06_01->setPalette(palette213); + ActuatorButton06_02 = new QPushButton(frame); + ActuatorButton06_02->setObjectName(QString::fromUtf8("ActuatorButton06_02")); + ActuatorButton06_02->setGeometry(QRect(522, 81, 10, 10)); QPalette palette214; palette214.setBrush(QPalette::Active, QPalette::WindowText, brush); palette214.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12018,10 +12050,10 @@ public: palette214.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette214.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette214.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_06->setPalette(palette214); - ActuatorButton06_07 = new QPushButton(frame); - ActuatorButton06_07->setObjectName(QString::fromUtf8("ActuatorButton06_07")); - ActuatorButton06_07->setGeometry(QRect(749, 193, 10, 10)); + ActuatorButton06_02->setPalette(palette214); + ActuatorButton06_03 = new QPushButton(frame); + ActuatorButton06_03->setObjectName(QString::fromUtf8("ActuatorButton06_03")); + ActuatorButton06_03->setGeometry(QRect(573, 92, 10, 10)); QPalette palette215; palette215.setBrush(QPalette::Active, QPalette::WindowText, brush); palette215.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12071,10 +12103,10 @@ public: palette215.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette215.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette215.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_07->setPalette(palette215); - ActuatorButton06_08 = new QPushButton(frame); - ActuatorButton06_08->setObjectName(QString::fromUtf8("ActuatorButton06_08")); - ActuatorButton06_08->setGeometry(QRect(783, 232, 10, 10)); + ActuatorButton06_03->setPalette(palette215); + ActuatorButton06_04 = new QPushButton(frame); + ActuatorButton06_04->setObjectName(QString::fromUtf8("ActuatorButton06_04")); + ActuatorButton06_04->setGeometry(QRect(621, 108, 10, 10)); QPalette palette216; palette216.setBrush(QPalette::Active, QPalette::WindowText, brush); palette216.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12124,10 +12156,10 @@ public: palette216.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette216.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette216.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_08->setPalette(palette216); - ActuatorButton06_09 = new QPushButton(frame); - ActuatorButton06_09->setObjectName(QString::fromUtf8("ActuatorButton06_09")); - ActuatorButton06_09->setGeometry(QRect(811, 275, 10, 10)); + ActuatorButton06_04->setPalette(palette216); + ActuatorButton06_05 = new QPushButton(frame); + ActuatorButton06_05->setObjectName(QString::fromUtf8("ActuatorButton06_05")); + ActuatorButton06_05->setGeometry(QRect(667, 131, 10, 10)); QPalette palette217; palette217.setBrush(QPalette::Active, QPalette::WindowText, brush); palette217.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12177,10 +12209,10 @@ public: palette217.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette217.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette217.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_09->setPalette(palette217); - ActuatorButton06_10 = new QPushButton(frame); - ActuatorButton06_10->setObjectName(QString::fromUtf8("ActuatorButton06_10")); - ActuatorButton06_10->setGeometry(QRect(834, 320, 10, 10)); + ActuatorButton06_05->setPalette(palette217); + ActuatorButton06_06 = new QPushButton(frame); + ActuatorButton06_06->setObjectName(QString::fromUtf8("ActuatorButton06_06")); + ActuatorButton06_06->setGeometry(QRect(711, 159, 10, 10)); QPalette palette218; palette218.setBrush(QPalette::Active, QPalette::WindowText, brush); palette218.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12230,10 +12262,10 @@ public: palette218.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette218.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette218.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_10->setPalette(palette218); - ActuatorButton06_12 = new QPushButton(frame); - ActuatorButton06_12->setObjectName(QString::fromUtf8("ActuatorButton06_12")); - ActuatorButton06_12->setGeometry(QRect(861, 420, 10, 10)); + ActuatorButton06_06->setPalette(palette218); + ActuatorButton06_07 = new QPushButton(frame); + ActuatorButton06_07->setObjectName(QString::fromUtf8("ActuatorButton06_07")); + ActuatorButton06_07->setGeometry(QRect(749, 193, 10, 10)); QPalette palette219; palette219.setBrush(QPalette::Active, QPalette::WindowText, brush); palette219.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12283,10 +12315,10 @@ public: palette219.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette219.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette219.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_12->setPalette(palette219); - ActuatorButton06_13 = new QPushButton(frame); - ActuatorButton06_13->setObjectName(QString::fromUtf8("ActuatorButton06_13")); - ActuatorButton06_13->setGeometry(QRect(865, 471, 10, 10)); + ActuatorButton06_07->setPalette(palette219); + ActuatorButton06_08 = new QPushButton(frame); + ActuatorButton06_08->setObjectName(QString::fromUtf8("ActuatorButton06_08")); + ActuatorButton06_08->setGeometry(QRect(783, 232, 10, 10)); QPalette palette220; palette220.setBrush(QPalette::Active, QPalette::WindowText, brush); palette220.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12336,10 +12368,10 @@ public: palette220.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette220.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette220.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_13->setPalette(palette220); - ActuatorButton06_14 = new QPushButton(frame); - ActuatorButton06_14->setObjectName(QString::fromUtf8("ActuatorButton06_14")); - ActuatorButton06_14->setGeometry(QRect(862, 522, 10, 10)); + ActuatorButton06_08->setPalette(palette220); + ActuatorButton06_09 = new QPushButton(frame); + ActuatorButton06_09->setObjectName(QString::fromUtf8("ActuatorButton06_09")); + ActuatorButton06_09->setGeometry(QRect(811, 275, 10, 10)); QPalette palette221; palette221.setBrush(QPalette::Active, QPalette::WindowText, brush); palette221.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12389,10 +12421,10 @@ public: palette221.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette221.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette221.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_14->setPalette(palette221); - ActuatorButton06_15 = new QPushButton(frame); - ActuatorButton06_15->setObjectName(QString::fromUtf8("ActuatorButton06_15")); - ActuatorButton06_15->setGeometry(QRect(850, 573, 10, 10)); + ActuatorButton06_09->setPalette(palette221); + ActuatorButton06_10 = new QPushButton(frame); + ActuatorButton06_10->setObjectName(QString::fromUtf8("ActuatorButton06_10")); + ActuatorButton06_10->setGeometry(QRect(834, 320, 10, 10)); QPalette palette222; palette222.setBrush(QPalette::Active, QPalette::WindowText, brush); palette222.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12442,10 +12474,10 @@ public: palette222.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette222.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette222.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_15->setPalette(palette222); - ActuatorButton06_16 = new QPushButton(frame); - ActuatorButton06_16->setObjectName(QString::fromUtf8("ActuatorButton06_16")); - ActuatorButton06_16->setGeometry(QRect(834, 622, 10, 10)); + ActuatorButton06_10->setPalette(palette222); + ActuatorButton06_12 = new QPushButton(frame); + ActuatorButton06_12->setObjectName(QString::fromUtf8("ActuatorButton06_12")); + ActuatorButton06_12->setGeometry(QRect(861, 420, 10, 10)); QPalette palette223; palette223.setBrush(QPalette::Active, QPalette::WindowText, brush); palette223.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12495,10 +12527,10 @@ public: palette223.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette223.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette223.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_16->setPalette(palette223); - ActuatorButton06_17 = new QPushButton(frame); - ActuatorButton06_17->setObjectName(QString::fromUtf8("ActuatorButton06_17")); - ActuatorButton06_17->setGeometry(QRect(811, 668, 10, 10)); + ActuatorButton06_12->setPalette(palette223); + ActuatorButton06_13 = new QPushButton(frame); + ActuatorButton06_13->setObjectName(QString::fromUtf8("ActuatorButton06_13")); + ActuatorButton06_13->setGeometry(QRect(865, 471, 10, 10)); QPalette palette224; palette224.setBrush(QPalette::Active, QPalette::WindowText, brush); palette224.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12548,10 +12580,10 @@ public: palette224.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette224.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette224.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_17->setPalette(palette224); - ActuatorButton06_18 = new QPushButton(frame); - ActuatorButton06_18->setObjectName(QString::fromUtf8("ActuatorButton06_18")); - ActuatorButton06_18->setGeometry(QRect(783, 710, 10, 10)); + ActuatorButton06_13->setPalette(palette224); + ActuatorButton06_14 = new QPushButton(frame); + ActuatorButton06_14->setObjectName(QString::fromUtf8("ActuatorButton06_14")); + ActuatorButton06_14->setGeometry(QRect(862, 522, 10, 10)); QPalette palette225; palette225.setBrush(QPalette::Active, QPalette::WindowText, brush); palette225.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12601,10 +12633,10 @@ public: palette225.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette225.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette225.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_18->setPalette(palette225); - ActuatorButton06_19 = new QPushButton(frame); - ActuatorButton06_19->setObjectName(QString::fromUtf8("ActuatorButton06_19")); - ActuatorButton06_19->setGeometry(QRect(749, 749, 10, 10)); + ActuatorButton06_14->setPalette(palette225); + ActuatorButton06_15 = new QPushButton(frame); + ActuatorButton06_15->setObjectName(QString::fromUtf8("ActuatorButton06_15")); + ActuatorButton06_15->setGeometry(QRect(850, 573, 10, 10)); QPalette palette226; palette226.setBrush(QPalette::Active, QPalette::WindowText, brush); palette226.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12654,10 +12686,10 @@ public: palette226.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette226.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette226.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_19->setPalette(palette226); - ActuatorButton06_20 = new QPushButton(frame); - ActuatorButton06_20->setObjectName(QString::fromUtf8("ActuatorButton06_20")); - ActuatorButton06_20->setGeometry(QRect(709, 783, 10, 10)); + ActuatorButton06_15->setPalette(palette226); + ActuatorButton06_16 = new QPushButton(frame); + ActuatorButton06_16->setObjectName(QString::fromUtf8("ActuatorButton06_16")); + ActuatorButton06_16->setGeometry(QRect(834, 622, 10, 10)); QPalette palette227; palette227.setBrush(QPalette::Active, QPalette::WindowText, brush); palette227.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12707,10 +12739,10 @@ public: palette227.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette227.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette227.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_20->setPalette(palette227); - ActuatorButton06_21 = new QPushButton(frame); - ActuatorButton06_21->setObjectName(QString::fromUtf8("ActuatorButton06_21")); - ActuatorButton06_21->setGeometry(QRect(668, 812, 10, 10)); + ActuatorButton06_16->setPalette(palette227); + ActuatorButton06_17 = new QPushButton(frame); + ActuatorButton06_17->setObjectName(QString::fromUtf8("ActuatorButton06_17")); + ActuatorButton06_17->setGeometry(QRect(811, 668, 10, 10)); QPalette palette228; palette228.setBrush(QPalette::Active, QPalette::WindowText, brush); palette228.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12760,10 +12792,10 @@ public: palette228.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette228.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette228.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_21->setPalette(palette228); - ActuatorButton06_22 = new QPushButton(frame); - ActuatorButton06_22->setObjectName(QString::fromUtf8("ActuatorButton06_22")); - ActuatorButton06_22->setGeometry(QRect(621, 835, 10, 10)); + ActuatorButton06_17->setPalette(palette228); + ActuatorButton06_18 = new QPushButton(frame); + ActuatorButton06_18->setObjectName(QString::fromUtf8("ActuatorButton06_18")); + ActuatorButton06_18->setGeometry(QRect(783, 710, 10, 10)); QPalette palette229; palette229.setBrush(QPalette::Active, QPalette::WindowText, brush); palette229.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12813,10 +12845,10 @@ public: palette229.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette229.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette229.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_22->setPalette(palette229); - ActuatorButton06_23 = new QPushButton(frame); - ActuatorButton06_23->setObjectName(QString::fromUtf8("ActuatorButton06_23")); - ActuatorButton06_23->setGeometry(QRect(572, 851, 10, 10)); + ActuatorButton06_18->setPalette(palette229); + ActuatorButton06_19 = new QPushButton(frame); + ActuatorButton06_19->setObjectName(QString::fromUtf8("ActuatorButton06_19")); + ActuatorButton06_19->setGeometry(QRect(749, 749, 10, 10)); QPalette palette230; palette230.setBrush(QPalette::Active, QPalette::WindowText, brush); palette230.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12866,10 +12898,10 @@ public: palette230.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette230.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette230.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_23->setPalette(palette230); - ActuatorButton06_24 = new QPushButton(frame); - ActuatorButton06_24->setObjectName(QString::fromUtf8("ActuatorButton06_24")); - ActuatorButton06_24->setGeometry(QRect(522, 861, 10, 10)); + ActuatorButton06_19->setPalette(palette230); + ActuatorButton06_20 = new QPushButton(frame); + ActuatorButton06_20->setObjectName(QString::fromUtf8("ActuatorButton06_20")); + ActuatorButton06_20->setGeometry(QRect(709, 783, 10, 10)); QPalette palette231; palette231.setBrush(QPalette::Active, QPalette::WindowText, brush); palette231.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12919,10 +12951,10 @@ public: palette231.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette231.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette231.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_24->setPalette(palette231); - ActuatorButton06_25 = new QPushButton(frame); - ActuatorButton06_25->setObjectName(QString::fromUtf8("ActuatorButton06_25")); - ActuatorButton06_25->setGeometry(QRect(471, 864, 10, 10)); + ActuatorButton06_20->setPalette(palette231); + ActuatorButton06_21 = new QPushButton(frame); + ActuatorButton06_21->setObjectName(QString::fromUtf8("ActuatorButton06_21")); + ActuatorButton06_21->setGeometry(QRect(668, 812, 10, 10)); QPalette palette232; palette232.setBrush(QPalette::Active, QPalette::WindowText, brush); palette232.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -12972,10 +13004,10 @@ public: palette232.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette232.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette232.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_25->setPalette(palette232); - ActuatorButton06_26 = new QPushButton(frame); - ActuatorButton06_26->setObjectName(QString::fromUtf8("ActuatorButton06_26")); - ActuatorButton06_26->setGeometry(QRect(419, 861, 10, 10)); + ActuatorButton06_21->setPalette(palette232); + ActuatorButton06_22 = new QPushButton(frame); + ActuatorButton06_22->setObjectName(QString::fromUtf8("ActuatorButton06_22")); + ActuatorButton06_22->setGeometry(QRect(621, 835, 10, 10)); QPalette palette233; palette233.setBrush(QPalette::Active, QPalette::WindowText, brush); palette233.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13025,10 +13057,10 @@ public: palette233.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette233.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette233.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_26->setPalette(palette233); - ActuatorButton06_27 = new QPushButton(frame); - ActuatorButton06_27->setObjectName(QString::fromUtf8("ActuatorButton06_27")); - ActuatorButton06_27->setGeometry(QRect(369, 851, 10, 10)); + ActuatorButton06_22->setPalette(palette233); + ActuatorButton06_23 = new QPushButton(frame); + ActuatorButton06_23->setObjectName(QString::fromUtf8("ActuatorButton06_23")); + ActuatorButton06_23->setGeometry(QRect(572, 851, 10, 10)); QPalette palette234; palette234.setBrush(QPalette::Active, QPalette::WindowText, brush); palette234.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13078,10 +13110,10 @@ public: palette234.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette234.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette234.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_27->setPalette(palette234); - ActuatorButton06_28 = new QPushButton(frame); - ActuatorButton06_28->setObjectName(QString::fromUtf8("ActuatorButton06_28")); - ActuatorButton06_28->setGeometry(QRect(320, 835, 10, 10)); + ActuatorButton06_23->setPalette(palette234); + ActuatorButton06_24 = new QPushButton(frame); + ActuatorButton06_24->setObjectName(QString::fromUtf8("ActuatorButton06_24")); + ActuatorButton06_24->setGeometry(QRect(522, 861, 10, 10)); QPalette palette235; palette235.setBrush(QPalette::Active, QPalette::WindowText, brush); palette235.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13131,10 +13163,10 @@ public: palette235.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette235.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette235.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_28->setPalette(palette235); - ActuatorButton06_29 = new QPushButton(frame); - ActuatorButton06_29->setObjectName(QString::fromUtf8("ActuatorButton06_29")); - ActuatorButton06_29->setGeometry(QRect(274, 812, 10, 10)); + ActuatorButton06_24->setPalette(palette235); + ActuatorButton06_25 = new QPushButton(frame); + ActuatorButton06_25->setObjectName(QString::fromUtf8("ActuatorButton06_25")); + ActuatorButton06_25->setGeometry(QRect(471, 864, 10, 10)); QPalette palette236; palette236.setBrush(QPalette::Active, QPalette::WindowText, brush); palette236.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13184,10 +13216,10 @@ public: palette236.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette236.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette236.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_29->setPalette(palette236); - ActuatorButton06_30 = new QPushButton(frame); - ActuatorButton06_30->setObjectName(QString::fromUtf8("ActuatorButton06_30")); - ActuatorButton06_30->setGeometry(QRect(231, 783, 10, 10)); + ActuatorButton06_25->setPalette(palette236); + ActuatorButton06_26 = new QPushButton(frame); + ActuatorButton06_26->setObjectName(QString::fromUtf8("ActuatorButton06_26")); + ActuatorButton06_26->setGeometry(QRect(419, 861, 10, 10)); QPalette palette237; palette237.setBrush(QPalette::Active, QPalette::WindowText, brush); palette237.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13237,10 +13269,10 @@ public: palette237.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette237.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette237.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_30->setPalette(palette237); - ActuatorButton06_31 = new QPushButton(frame); - ActuatorButton06_31->setObjectName(QString::fromUtf8("ActuatorButton06_31")); - ActuatorButton06_31->setGeometry(QRect(192, 750, 10, 10)); + ActuatorButton06_26->setPalette(palette237); + ActuatorButton06_27 = new QPushButton(frame); + ActuatorButton06_27->setObjectName(QString::fromUtf8("ActuatorButton06_27")); + ActuatorButton06_27->setGeometry(QRect(369, 851, 10, 10)); QPalette palette238; palette238.setBrush(QPalette::Active, QPalette::WindowText, brush); palette238.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13290,10 +13322,10 @@ public: palette238.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette238.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette238.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_31->setPalette(palette238); - ActuatorButton06_32 = new QPushButton(frame); - ActuatorButton06_32->setObjectName(QString::fromUtf8("ActuatorButton06_32")); - ActuatorButton06_32->setGeometry(QRect(158, 711, 10, 10)); + ActuatorButton06_27->setPalette(palette238); + ActuatorButton06_28 = new QPushButton(frame); + ActuatorButton06_28->setObjectName(QString::fromUtf8("ActuatorButton06_28")); + ActuatorButton06_28->setGeometry(QRect(320, 835, 10, 10)); QPalette palette239; palette239.setBrush(QPalette::Active, QPalette::WindowText, brush); palette239.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13343,10 +13375,10 @@ public: palette239.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette239.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette239.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_32->setPalette(palette239); - ActuatorButton06_33 = new QPushButton(frame); - ActuatorButton06_33->setObjectName(QString::fromUtf8("ActuatorButton06_33")); - ActuatorButton06_33->setGeometry(QRect(129, 668, 10, 10)); + ActuatorButton06_28->setPalette(palette239); + ActuatorButton06_29 = new QPushButton(frame); + ActuatorButton06_29->setObjectName(QString::fromUtf8("ActuatorButton06_29")); + ActuatorButton06_29->setGeometry(QRect(274, 812, 10, 10)); QPalette palette240; palette240.setBrush(QPalette::Active, QPalette::WindowText, brush); palette240.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13396,10 +13428,10 @@ public: palette240.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette240.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette240.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_33->setPalette(palette240); - ActuatorButton06_34 = new QPushButton(frame); - ActuatorButton06_34->setObjectName(QString::fromUtf8("ActuatorButton06_34")); - ActuatorButton06_34->setGeometry(QRect(107, 622, 10, 10)); + ActuatorButton06_29->setPalette(palette240); + ActuatorButton06_30 = new QPushButton(frame); + ActuatorButton06_30->setObjectName(QString::fromUtf8("ActuatorButton06_30")); + ActuatorButton06_30->setGeometry(QRect(231, 783, 10, 10)); QPalette palette241; palette241.setBrush(QPalette::Active, QPalette::WindowText, brush); palette241.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13449,10 +13481,10 @@ public: palette241.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette241.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette241.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_34->setPalette(palette241); - ActuatorButton06_35 = new QPushButton(frame); - ActuatorButton06_35->setObjectName(QString::fromUtf8("ActuatorButton06_35")); - ActuatorButton06_35->setGeometry(QRect(90, 573, 10, 10)); + ActuatorButton06_30->setPalette(palette241); + ActuatorButton06_31 = new QPushButton(frame); + ActuatorButton06_31->setObjectName(QString::fromUtf8("ActuatorButton06_31")); + ActuatorButton06_31->setGeometry(QRect(192, 750, 10, 10)); QPalette palette242; palette242.setBrush(QPalette::Active, QPalette::WindowText, brush); palette242.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13502,10 +13534,10 @@ public: palette242.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette242.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette242.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_35->setPalette(palette242); - ActuatorButton06_36 = new QPushButton(frame); - ActuatorButton06_36->setObjectName(QString::fromUtf8("ActuatorButton06_36")); - ActuatorButton06_36->setGeometry(QRect(80, 523, 10, 10)); + ActuatorButton06_31->setPalette(palette242); + ActuatorButton06_32 = new QPushButton(frame); + ActuatorButton06_32->setObjectName(QString::fromUtf8("ActuatorButton06_32")); + ActuatorButton06_32->setGeometry(QRect(158, 711, 10, 10)); QPalette palette243; palette243.setBrush(QPalette::Active, QPalette::WindowText, brush); palette243.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13555,10 +13587,10 @@ public: palette243.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette243.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette243.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_36->setPalette(palette243); - ActuatorButton06_37 = new QPushButton(frame); - ActuatorButton06_37->setObjectName(QString::fromUtf8("ActuatorButton06_37")); - ActuatorButton06_37->setGeometry(QRect(77, 471, 10, 10)); + ActuatorButton06_32->setPalette(palette243); + ActuatorButton06_33 = new QPushButton(frame); + ActuatorButton06_33->setObjectName(QString::fromUtf8("ActuatorButton06_33")); + ActuatorButton06_33->setGeometry(QRect(129, 668, 10, 10)); QPalette palette244; palette244.setBrush(QPalette::Active, QPalette::WindowText, brush); palette244.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13608,10 +13640,10 @@ public: palette244.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette244.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette244.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_37->setPalette(palette244); - ActuatorButton06_38 = new QPushButton(frame); - ActuatorButton06_38->setObjectName(QString::fromUtf8("ActuatorButton06_38")); - ActuatorButton06_38->setGeometry(QRect(80, 420, 10, 10)); + ActuatorButton06_33->setPalette(palette244); + ActuatorButton06_34 = new QPushButton(frame); + ActuatorButton06_34->setObjectName(QString::fromUtf8("ActuatorButton06_34")); + ActuatorButton06_34->setGeometry(QRect(107, 622, 10, 10)); QPalette palette245; palette245.setBrush(QPalette::Active, QPalette::WindowText, brush); palette245.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13661,10 +13693,10 @@ public: palette245.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette245.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette245.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_38->setPalette(palette245); - ActuatorButton06_39 = new QPushButton(frame); - ActuatorButton06_39->setObjectName(QString::fromUtf8("ActuatorButton06_39")); - ActuatorButton06_39->setGeometry(QRect(90, 370, 10, 10)); + ActuatorButton06_34->setPalette(palette245); + ActuatorButton06_35 = new QPushButton(frame); + ActuatorButton06_35->setObjectName(QString::fromUtf8("ActuatorButton06_35")); + ActuatorButton06_35->setGeometry(QRect(90, 573, 10, 10)); QPalette palette246; palette246.setBrush(QPalette::Active, QPalette::WindowText, brush); palette246.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13714,10 +13746,10 @@ public: palette246.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette246.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette246.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_39->setPalette(palette246); - ActuatorButton06_40 = new QPushButton(frame); - ActuatorButton06_40->setObjectName(QString::fromUtf8("ActuatorButton06_40")); - ActuatorButton06_40->setGeometry(QRect(107, 321, 10, 10)); + ActuatorButton06_35->setPalette(palette246); + ActuatorButton06_36 = new QPushButton(frame); + ActuatorButton06_36->setObjectName(QString::fromUtf8("ActuatorButton06_36")); + ActuatorButton06_36->setGeometry(QRect(80, 523, 10, 10)); QPalette palette247; palette247.setBrush(QPalette::Active, QPalette::WindowText, brush); palette247.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13767,10 +13799,10 @@ public: palette247.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette247.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette247.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_40->setPalette(palette247); - ActuatorButton06_41 = new QPushButton(frame); - ActuatorButton06_41->setObjectName(QString::fromUtf8("ActuatorButton06_41")); - ActuatorButton06_41->setGeometry(QRect(130, 275, 10, 10)); + ActuatorButton06_36->setPalette(palette247); + ActuatorButton06_37 = new QPushButton(frame); + ActuatorButton06_37->setObjectName(QString::fromUtf8("ActuatorButton06_37")); + ActuatorButton06_37->setGeometry(QRect(77, 471, 10, 10)); QPalette palette248; palette248.setBrush(QPalette::Active, QPalette::WindowText, brush); palette248.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13820,10 +13852,10 @@ public: palette248.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette248.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette248.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_41->setPalette(palette248); - ActuatorButton06_42 = new QPushButton(frame); - ActuatorButton06_42->setObjectName(QString::fromUtf8("ActuatorButton06_42")); - ActuatorButton06_42->setGeometry(QRect(159, 232, 10, 10)); + ActuatorButton06_37->setPalette(palette248); + ActuatorButton06_38 = new QPushButton(frame); + ActuatorButton06_38->setObjectName(QString::fromUtf8("ActuatorButton06_38")); + ActuatorButton06_38->setGeometry(QRect(80, 420, 10, 10)); QPalette palette249; palette249.setBrush(QPalette::Active, QPalette::WindowText, brush); palette249.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13873,10 +13905,10 @@ public: palette249.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette249.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette249.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_42->setPalette(palette249); - ActuatorButton06_43 = new QPushButton(frame); - ActuatorButton06_43->setObjectName(QString::fromUtf8("ActuatorButton06_43")); - ActuatorButton06_43->setGeometry(QRect(192, 193, 10, 10)); + ActuatorButton06_38->setPalette(palette249); + ActuatorButton06_39 = new QPushButton(frame); + ActuatorButton06_39->setObjectName(QString::fromUtf8("ActuatorButton06_39")); + ActuatorButton06_39->setGeometry(QRect(90, 370, 10, 10)); QPalette palette250; palette250.setBrush(QPalette::Active, QPalette::WindowText, brush); palette250.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13926,10 +13958,10 @@ public: palette250.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette250.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette250.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_43->setPalette(palette250); - ActuatorButton06_44 = new QPushButton(frame); - ActuatorButton06_44->setObjectName(QString::fromUtf8("ActuatorButton06_44")); - ActuatorButton06_44->setGeometry(QRect(231, 159, 10, 10)); + ActuatorButton06_39->setPalette(palette250); + ActuatorButton06_40 = new QPushButton(frame); + ActuatorButton06_40->setObjectName(QString::fromUtf8("ActuatorButton06_40")); + ActuatorButton06_40->setGeometry(QRect(107, 321, 10, 10)); QPalette palette251; palette251.setBrush(QPalette::Active, QPalette::WindowText, brush); palette251.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -13979,10 +14011,10 @@ public: palette251.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette251.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette251.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_44->setPalette(palette251); - ActuatorButton06_45 = new QPushButton(frame); - ActuatorButton06_45->setObjectName(QString::fromUtf8("ActuatorButton06_45")); - ActuatorButton06_45->setGeometry(QRect(273, 131, 10, 10)); + ActuatorButton06_40->setPalette(palette251); + ActuatorButton06_41 = new QPushButton(frame); + ActuatorButton06_41->setObjectName(QString::fromUtf8("ActuatorButton06_41")); + ActuatorButton06_41->setGeometry(QRect(130, 275, 10, 10)); QPalette palette252; palette252.setBrush(QPalette::Active, QPalette::WindowText, brush); palette252.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14032,10 +14064,10 @@ public: palette252.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette252.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette252.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_45->setPalette(palette252); - ActuatorButton06_46 = new QPushButton(frame); - ActuatorButton06_46->setObjectName(QString::fromUtf8("ActuatorButton06_46")); - ActuatorButton06_46->setGeometry(QRect(320, 107, 10, 10)); + ActuatorButton06_41->setPalette(palette252); + ActuatorButton06_42 = new QPushButton(frame); + ActuatorButton06_42->setObjectName(QString::fromUtf8("ActuatorButton06_42")); + ActuatorButton06_42->setGeometry(QRect(159, 232, 10, 10)); QPalette palette253; palette253.setBrush(QPalette::Active, QPalette::WindowText, brush); palette253.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14085,10 +14117,10 @@ public: palette253.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette253.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette253.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_46->setPalette(palette253); - ActuatorButton06_47 = new QPushButton(frame); - ActuatorButton06_47->setObjectName(QString::fromUtf8("ActuatorButton06_47")); - ActuatorButton06_47->setGeometry(QRect(368, 91, 10, 10)); + ActuatorButton06_42->setPalette(palette253); + ActuatorButton06_43 = new QPushButton(frame); + ActuatorButton06_43->setObjectName(QString::fromUtf8("ActuatorButton06_43")); + ActuatorButton06_43->setGeometry(QRect(192, 193, 10, 10)); QPalette palette254; palette254.setBrush(QPalette::Active, QPalette::WindowText, brush); palette254.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14138,10 +14170,10 @@ public: palette254.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette254.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette254.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_47->setPalette(palette254); - ActuatorButton06_48 = new QPushButton(frame); - ActuatorButton06_48->setObjectName(QString::fromUtf8("ActuatorButton06_48")); - ActuatorButton06_48->setGeometry(QRect(420, 81, 10, 10)); + ActuatorButton06_43->setPalette(palette254); + ActuatorButton06_44 = new QPushButton(frame); + ActuatorButton06_44->setObjectName(QString::fromUtf8("ActuatorButton06_44")); + ActuatorButton06_44->setGeometry(QRect(231, 159, 10, 10)); QPalette palette255; palette255.setBrush(QPalette::Active, QPalette::WindowText, brush); palette255.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14191,10 +14223,10 @@ public: palette255.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette255.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette255.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_48->setPalette(palette255); - C6ActuatorsButton = new QPushButton(frame); - C6ActuatorsButton->setObjectName(QString::fromUtf8("C6ActuatorsButton")); - C6ActuatorsButton->setGeometry(QRect(470, 88, 25, 15)); + ActuatorButton06_44->setPalette(palette255); + ActuatorButton06_45 = new QPushButton(frame); + ActuatorButton06_45->setObjectName(QString::fromUtf8("ActuatorButton06_45")); + ActuatorButton06_45->setGeometry(QRect(273, 131, 10, 10)); QPalette palette256; palette256.setBrush(QPalette::Active, QPalette::WindowText, brush); palette256.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14244,13 +14276,12 @@ public: palette256.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette256.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette256.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - C6ActuatorsButton->setPalette(palette256); - C6ActuatorsButton->setFont(font4); - R1ActuatorsButton = new QPushButton(frame); - R1ActuatorsButton->setObjectName(QString::fromUtf8("R1ActuatorsButton")); - R1ActuatorsButton->setGeometry(QRect(465, 40, 20, 20)); - QPalette palette257; - palette257.setBrush(QPalette::Active, QPalette::WindowText, brush); + ActuatorButton06_45->setPalette(palette256); + ActuatorButton06_46 = new QPushButton(frame); + ActuatorButton06_46->setObjectName(QString::fromUtf8("ActuatorButton06_46")); + ActuatorButton06_46->setGeometry(QRect(320, 107, 10, 10)); + QPalette palette257; + palette257.setBrush(QPalette::Active, QPalette::WindowText, brush); palette257.setBrush(QPalette::Active, QPalette::Button, brush1); palette257.setBrush(QPalette::Active, QPalette::Light, brush2); palette257.setBrush(QPalette::Active, QPalette::Midlight, brush3); @@ -14298,10 +14329,10 @@ public: palette257.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette257.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette257.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R1ActuatorsButton->setPalette(palette257); - R2ActuatorsButton = new QPushButton(frame); - R2ActuatorsButton->setObjectName(QString::fromUtf8("R2ActuatorsButton")); - R2ActuatorsButton->setGeometry(QRect(520, 50, 20, 20)); + ActuatorButton06_46->setPalette(palette257); + ActuatorButton06_47 = new QPushButton(frame); + ActuatorButton06_47->setObjectName(QString::fromUtf8("ActuatorButton06_47")); + ActuatorButton06_47->setGeometry(QRect(368, 91, 10, 10)); QPalette palette258; palette258.setBrush(QPalette::Active, QPalette::WindowText, brush); palette258.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14351,10 +14382,10 @@ public: palette258.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette258.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette258.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R2ActuatorsButton->setPalette(palette258); - R3ActuatorsButton = new QPushButton(frame); - R3ActuatorsButton->setObjectName(QString::fromUtf8("R3ActuatorsButton")); - R3ActuatorsButton->setGeometry(QRect(570, 60, 20, 20)); + ActuatorButton06_47->setPalette(palette258); + ActuatorButton06_48 = new QPushButton(frame); + ActuatorButton06_48->setObjectName(QString::fromUtf8("ActuatorButton06_48")); + ActuatorButton06_48->setGeometry(QRect(420, 81, 10, 10)); QPalette palette259; palette259.setBrush(QPalette::Active, QPalette::WindowText, brush); palette259.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14404,10 +14435,10 @@ public: palette259.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette259.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette259.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R3ActuatorsButton->setPalette(palette259); - R4ActuatorsButton = new QPushButton(frame); - R4ActuatorsButton->setObjectName(QString::fromUtf8("R4ActuatorsButton")); - R4ActuatorsButton->setGeometry(QRect(620, 80, 20, 20)); + ActuatorButton06_48->setPalette(palette259); + C6ActuatorsButton = new QPushButton(frame); + C6ActuatorsButton->setObjectName(QString::fromUtf8("C6ActuatorsButton")); + C6ActuatorsButton->setGeometry(QRect(470, 88, 25, 15)); QPalette palette260; palette260.setBrush(QPalette::Active, QPalette::WindowText, brush); palette260.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14457,10 +14488,11 @@ public: palette260.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette260.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette260.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R4ActuatorsButton->setPalette(palette260); - R5ActuatorsButton = new QPushButton(frame); - R5ActuatorsButton->setObjectName(QString::fromUtf8("R5ActuatorsButton")); - R5ActuatorsButton->setGeometry(QRect(680, 100, 20, 20)); + C6ActuatorsButton->setPalette(palette260); + C6ActuatorsButton->setFont(font4); + R1ActuatorsButton = new QPushButton(frame); + R1ActuatorsButton->setObjectName(QString::fromUtf8("R1ActuatorsButton")); + R1ActuatorsButton->setGeometry(QRect(465, 40, 20, 20)); QPalette palette261; palette261.setBrush(QPalette::Active, QPalette::WindowText, brush); palette261.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14510,10 +14542,10 @@ public: palette261.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette261.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette261.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R5ActuatorsButton->setPalette(palette261); - R6ActuatorsButton = new QPushButton(frame); - R6ActuatorsButton->setObjectName(QString::fromUtf8("R6ActuatorsButton")); - R6ActuatorsButton->setGeometry(QRect(730, 130, 20, 20)); + R1ActuatorsButton->setPalette(palette261); + R2ActuatorsButton = new QPushButton(frame); + R2ActuatorsButton->setObjectName(QString::fromUtf8("R2ActuatorsButton")); + R2ActuatorsButton->setGeometry(QRect(520, 50, 20, 20)); QPalette palette262; palette262.setBrush(QPalette::Active, QPalette::WindowText, brush); palette262.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14563,10 +14595,10 @@ public: palette262.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette262.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette262.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R6ActuatorsButton->setPalette(palette262); - R7ActuatorsButton = new QPushButton(frame); - R7ActuatorsButton->setObjectName(QString::fromUtf8("R7ActuatorsButton")); - R7ActuatorsButton->setGeometry(QRect(770, 160, 20, 20)); + R2ActuatorsButton->setPalette(palette262); + R3ActuatorsButton = new QPushButton(frame); + R3ActuatorsButton->setObjectName(QString::fromUtf8("R3ActuatorsButton")); + R3ActuatorsButton->setGeometry(QRect(570, 60, 20, 20)); QPalette palette263; palette263.setBrush(QPalette::Active, QPalette::WindowText, brush); palette263.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14616,10 +14648,10 @@ public: palette263.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette263.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette263.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R7ActuatorsButton->setPalette(palette263); - R8ActuatorsButton = new QPushButton(frame); - R8ActuatorsButton->setObjectName(QString::fromUtf8("R8ActuatorsButton")); - R8ActuatorsButton->setGeometry(QRect(800, 210, 20, 20)); + R3ActuatorsButton->setPalette(palette263); + R4ActuatorsButton = new QPushButton(frame); + R4ActuatorsButton->setObjectName(QString::fromUtf8("R4ActuatorsButton")); + R4ActuatorsButton->setGeometry(QRect(620, 80, 20, 20)); QPalette palette264; palette264.setBrush(QPalette::Active, QPalette::WindowText, brush); palette264.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14669,10 +14701,10 @@ public: palette264.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette264.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette264.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R8ActuatorsButton->setPalette(palette264); - R9ActuatorsButton = new QPushButton(frame); - R9ActuatorsButton->setObjectName(QString::fromUtf8("R9ActuatorsButton")); - R9ActuatorsButton->setGeometry(QRect(830, 250, 20, 20)); + R4ActuatorsButton->setPalette(palette264); + R5ActuatorsButton = new QPushButton(frame); + R5ActuatorsButton->setObjectName(QString::fromUtf8("R5ActuatorsButton")); + R5ActuatorsButton->setGeometry(QRect(680, 100, 20, 20)); QPalette palette265; palette265.setBrush(QPalette::Active, QPalette::WindowText, brush); palette265.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14722,10 +14754,10 @@ public: palette265.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette265.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette265.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R9ActuatorsButton->setPalette(palette265); - R10ActuatorsButton = new QPushButton(frame); - R10ActuatorsButton->setObjectName(QString::fromUtf8("R10ActuatorsButton")); - R10ActuatorsButton->setGeometry(QRect(860, 300, 20, 20)); + R5ActuatorsButton->setPalette(palette265); + R6ActuatorsButton = new QPushButton(frame); + R6ActuatorsButton->setObjectName(QString::fromUtf8("R6ActuatorsButton")); + R6ActuatorsButton->setGeometry(QRect(730, 130, 20, 20)); QPalette palette266; palette266.setBrush(QPalette::Active, QPalette::WindowText, brush); palette266.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14775,10 +14807,10 @@ public: palette266.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette266.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette266.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R10ActuatorsButton->setPalette(palette266); - R11ActuatorsButton = new QPushButton(frame); - R11ActuatorsButton->setObjectName(QString::fromUtf8("R11ActuatorsButton")); - R11ActuatorsButton->setGeometry(QRect(870, 360, 20, 20)); + R6ActuatorsButton->setPalette(palette266); + R7ActuatorsButton = new QPushButton(frame); + R7ActuatorsButton->setObjectName(QString::fromUtf8("R7ActuatorsButton")); + R7ActuatorsButton->setGeometry(QRect(770, 160, 20, 20)); QPalette palette267; palette267.setBrush(QPalette::Active, QPalette::WindowText, brush); palette267.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14828,10 +14860,10 @@ public: palette267.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette267.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette267.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R11ActuatorsButton->setPalette(palette267); - R12ActuatorsButton = new QPushButton(frame); - R12ActuatorsButton->setObjectName(QString::fromUtf8("R12ActuatorsButton")); - R12ActuatorsButton->setGeometry(QRect(880, 410, 20, 20)); + R7ActuatorsButton->setPalette(palette267); + R8ActuatorsButton = new QPushButton(frame); + R8ActuatorsButton->setObjectName(QString::fromUtf8("R8ActuatorsButton")); + R8ActuatorsButton->setGeometry(QRect(800, 210, 20, 20)); QPalette palette268; palette268.setBrush(QPalette::Active, QPalette::WindowText, brush); palette268.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14881,10 +14913,10 @@ public: palette268.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette268.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette268.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R12ActuatorsButton->setPalette(palette268); - R13ActuatorsButton = new QPushButton(frame); - R13ActuatorsButton->setObjectName(QString::fromUtf8("R13ActuatorsButton")); - R13ActuatorsButton->setGeometry(QRect(890, 470, 20, 20)); + R8ActuatorsButton->setPalette(palette268); + R9ActuatorsButton = new QPushButton(frame); + R9ActuatorsButton->setObjectName(QString::fromUtf8("R9ActuatorsButton")); + R9ActuatorsButton->setGeometry(QRect(830, 250, 20, 20)); QPalette palette269; palette269.setBrush(QPalette::Active, QPalette::WindowText, brush); palette269.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14934,10 +14966,10 @@ public: palette269.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette269.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette269.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R13ActuatorsButton->setPalette(palette269); - R14ActuatorsButton = new QPushButton(frame); - R14ActuatorsButton->setObjectName(QString::fromUtf8("R14ActuatorsButton")); - R14ActuatorsButton->setGeometry(QRect(890, 520, 20, 20)); + R9ActuatorsButton->setPalette(palette269); + R10ActuatorsButton = new QPushButton(frame); + R10ActuatorsButton->setObjectName(QString::fromUtf8("R10ActuatorsButton")); + R10ActuatorsButton->setGeometry(QRect(860, 300, 20, 20)); QPalette palette270; palette270.setBrush(QPalette::Active, QPalette::WindowText, brush); palette270.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -14987,10 +15019,10 @@ public: palette270.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette270.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette270.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R14ActuatorsButton->setPalette(palette270); - R15ActuatorsButton = new QPushButton(frame); - R15ActuatorsButton->setObjectName(QString::fromUtf8("R15ActuatorsButton")); - R15ActuatorsButton->setGeometry(QRect(870, 580, 20, 20)); + R10ActuatorsButton->setPalette(palette270); + R11ActuatorsButton = new QPushButton(frame); + R11ActuatorsButton->setObjectName(QString::fromUtf8("R11ActuatorsButton")); + R11ActuatorsButton->setGeometry(QRect(870, 360, 20, 20)); QPalette palette271; palette271.setBrush(QPalette::Active, QPalette::WindowText, brush); palette271.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15040,10 +15072,10 @@ public: palette271.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette271.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette271.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R15ActuatorsButton->setPalette(palette271); - R16ActuatorsButton = new QPushButton(frame); - R16ActuatorsButton->setObjectName(QString::fromUtf8("R16ActuatorsButton")); - R16ActuatorsButton->setGeometry(QRect(855, 630, 20, 20)); + R11ActuatorsButton->setPalette(palette271); + R12ActuatorsButton = new QPushButton(frame); + R12ActuatorsButton->setObjectName(QString::fromUtf8("R12ActuatorsButton")); + R12ActuatorsButton->setGeometry(QRect(880, 410, 20, 20)); QPalette palette272; palette272.setBrush(QPalette::Active, QPalette::WindowText, brush); palette272.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15093,10 +15125,10 @@ public: palette272.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette272.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette272.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R16ActuatorsButton->setPalette(palette272); - R17ActuatorsButton = new QPushButton(frame); - R17ActuatorsButton->setObjectName(QString::fromUtf8("R17ActuatorsButton")); - R17ActuatorsButton->setGeometry(QRect(830, 680, 20, 20)); + R12ActuatorsButton->setPalette(palette272); + R13ActuatorsButton = new QPushButton(frame); + R13ActuatorsButton->setObjectName(QString::fromUtf8("R13ActuatorsButton")); + R13ActuatorsButton->setGeometry(QRect(890, 470, 20, 20)); QPalette palette273; palette273.setBrush(QPalette::Active, QPalette::WindowText, brush); palette273.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15146,10 +15178,10 @@ public: palette273.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette273.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette273.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R17ActuatorsButton->setPalette(palette273); - R24ActuatorsButton = new QPushButton(frame); - R24ActuatorsButton->setObjectName(QString::fromUtf8("R24ActuatorsButton")); - R24ActuatorsButton->setGeometry(QRect(520, 880, 20, 20)); + R13ActuatorsButton->setPalette(palette273); + R14ActuatorsButton = new QPushButton(frame); + R14ActuatorsButton->setObjectName(QString::fromUtf8("R14ActuatorsButton")); + R14ActuatorsButton->setGeometry(QRect(890, 520, 20, 20)); QPalette palette274; palette274.setBrush(QPalette::Active, QPalette::WindowText, brush); palette274.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15199,11 +15231,10 @@ public: palette274.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette274.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette274.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R24ActuatorsButton->setPalette(palette274); - R24ActuatorsButton->setFont(font1); - R25ActuatorsButton = new QPushButton(frame); - R25ActuatorsButton->setObjectName(QString::fromUtf8("R25ActuatorsButton")); - R25ActuatorsButton->setGeometry(QRect(470, 890, 20, 20)); + R14ActuatorsButton->setPalette(palette274); + R15ActuatorsButton = new QPushButton(frame); + R15ActuatorsButton->setObjectName(QString::fromUtf8("R15ActuatorsButton")); + R15ActuatorsButton->setGeometry(QRect(870, 580, 20, 20)); QPalette palette275; palette275.setBrush(QPalette::Active, QPalette::WindowText, brush); palette275.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15253,11 +15284,10 @@ public: palette275.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette275.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette275.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R25ActuatorsButton->setPalette(palette275); - R25ActuatorsButton->setFont(font1); - R26ActuatorsButton = new QPushButton(frame); - R26ActuatorsButton->setObjectName(QString::fromUtf8("R26ActuatorsButton")); - R26ActuatorsButton->setGeometry(QRect(410, 880, 20, 20)); + R15ActuatorsButton->setPalette(palette275); + R16ActuatorsButton = new QPushButton(frame); + R16ActuatorsButton->setObjectName(QString::fromUtf8("R16ActuatorsButton")); + R16ActuatorsButton->setGeometry(QRect(855, 630, 20, 20)); QPalette palette276; palette276.setBrush(QPalette::Active, QPalette::WindowText, brush); palette276.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15307,11 +15337,10 @@ public: palette276.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette276.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette276.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R26ActuatorsButton->setPalette(palette276); - R26ActuatorsButton->setFont(font1); - R27ActuatorsButton = new QPushButton(frame); - R27ActuatorsButton->setObjectName(QString::fromUtf8("R27ActuatorsButton")); - R27ActuatorsButton->setGeometry(QRect(350, 870, 20, 20)); + R16ActuatorsButton->setPalette(palette276); + R17ActuatorsButton = new QPushButton(frame); + R17ActuatorsButton->setObjectName(QString::fromUtf8("R17ActuatorsButton")); + R17ActuatorsButton->setGeometry(QRect(830, 680, 20, 20)); QPalette palette277; palette277.setBrush(QPalette::Active, QPalette::WindowText, brush); palette277.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15361,11 +15390,10 @@ public: palette277.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette277.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette277.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R27ActuatorsButton->setPalette(palette277); - R27ActuatorsButton->setFont(font1); - R47ActuatorsButton = new QPushButton(frame); - R47ActuatorsButton->setObjectName(QString::fromUtf8("R47ActuatorsButton")); - R47ActuatorsButton->setGeometry(QRect(350, 60, 20, 20)); + R17ActuatorsButton->setPalette(palette277); + R24ActuatorsButton = new QPushButton(frame); + R24ActuatorsButton->setObjectName(QString::fromUtf8("R24ActuatorsButton")); + R24ActuatorsButton->setGeometry(QRect(520, 880, 20, 20)); QPalette palette278; palette278.setBrush(QPalette::Active, QPalette::WindowText, brush); palette278.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15415,11 +15443,11 @@ public: palette278.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette278.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette278.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R47ActuatorsButton->setPalette(palette278); - R47ActuatorsButton->setFont(font1); - R48ActuatorsButton = new QPushButton(frame); - R48ActuatorsButton->setObjectName(QString::fromUtf8("R48ActuatorsButton")); - R48ActuatorsButton->setGeometry(QRect(410, 50, 20, 20)); + R24ActuatorsButton->setPalette(palette278); + R24ActuatorsButton->setFont(font1); + R25ActuatorsButton = new QPushButton(frame); + R25ActuatorsButton->setObjectName(QString::fromUtf8("R25ActuatorsButton")); + R25ActuatorsButton->setGeometry(QRect(470, 890, 20, 20)); QPalette palette279; palette279.setBrush(QPalette::Active, QPalette::WindowText, brush); palette279.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15469,11 +15497,11 @@ public: palette279.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette279.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette279.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R48ActuatorsButton->setPalette(palette279); - R48ActuatorsButton->setFont(font1); - R18ActuatorsButton = new QPushButton(frame); - R18ActuatorsButton->setObjectName(QString::fromUtf8("R18ActuatorsButton")); - R18ActuatorsButton->setGeometry(QRect(800, 730, 20, 20)); + R25ActuatorsButton->setPalette(palette279); + R25ActuatorsButton->setFont(font1); + R26ActuatorsButton = new QPushButton(frame); + R26ActuatorsButton->setObjectName(QString::fromUtf8("R26ActuatorsButton")); + R26ActuatorsButton->setGeometry(QRect(410, 880, 20, 20)); QPalette palette280; palette280.setBrush(QPalette::Active, QPalette::WindowText, brush); palette280.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15523,11 +15551,11 @@ public: palette280.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette280.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette280.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R18ActuatorsButton->setPalette(palette280); - R18ActuatorsButton->setFont(font1); - R19ActuatorsButton = new QPushButton(frame); - R19ActuatorsButton->setObjectName(QString::fromUtf8("R19ActuatorsButton")); - R19ActuatorsButton->setGeometry(QRect(770, 770, 20, 20)); + R26ActuatorsButton->setPalette(palette280); + R26ActuatorsButton->setFont(font1); + R27ActuatorsButton = new QPushButton(frame); + R27ActuatorsButton->setObjectName(QString::fromUtf8("R27ActuatorsButton")); + R27ActuatorsButton->setGeometry(QRect(350, 870, 20, 20)); QPalette palette281; palette281.setBrush(QPalette::Active, QPalette::WindowText, brush); palette281.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15577,11 +15605,11 @@ public: palette281.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette281.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette281.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R19ActuatorsButton->setPalette(palette281); - R19ActuatorsButton->setFont(font1); - R23ActuatorsButton = new QPushButton(frame); - R23ActuatorsButton->setObjectName(QString::fromUtf8("R23ActuatorsButton")); - R23ActuatorsButton->setGeometry(QRect(580, 870, 20, 20)); + R27ActuatorsButton->setPalette(palette281); + R27ActuatorsButton->setFont(font1); + R47ActuatorsButton = new QPushButton(frame); + R47ActuatorsButton->setObjectName(QString::fromUtf8("R47ActuatorsButton")); + R47ActuatorsButton->setGeometry(QRect(350, 60, 20, 20)); QPalette palette282; palette282.setBrush(QPalette::Active, QPalette::WindowText, brush); palette282.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15631,11 +15659,11 @@ public: palette282.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette282.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette282.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R23ActuatorsButton->setPalette(palette282); - R23ActuatorsButton->setFont(font1); - R22ActuatorsButton = new QPushButton(frame); - R22ActuatorsButton->setObjectName(QString::fromUtf8("R22ActuatorsButton")); - R22ActuatorsButton->setGeometry(QRect(630, 850, 20, 20)); + R47ActuatorsButton->setPalette(palette282); + R47ActuatorsButton->setFont(font1); + R48ActuatorsButton = new QPushButton(frame); + R48ActuatorsButton->setObjectName(QString::fromUtf8("R48ActuatorsButton")); + R48ActuatorsButton->setGeometry(QRect(410, 50, 20, 20)); QPalette palette283; palette283.setBrush(QPalette::Active, QPalette::WindowText, brush); palette283.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15685,11 +15713,11 @@ public: palette283.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette283.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette283.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R22ActuatorsButton->setPalette(palette283); - R22ActuatorsButton->setFont(font1); - R21ActuatorsButton = new QPushButton(frame); - R21ActuatorsButton->setObjectName(QString::fromUtf8("R21ActuatorsButton")); - R21ActuatorsButton->setGeometry(QRect(680, 830, 20, 20)); + R48ActuatorsButton->setPalette(palette283); + R48ActuatorsButton->setFont(font1); + R18ActuatorsButton = new QPushButton(frame); + R18ActuatorsButton->setObjectName(QString::fromUtf8("R18ActuatorsButton")); + R18ActuatorsButton->setGeometry(QRect(800, 730, 20, 20)); QPalette palette284; palette284.setBrush(QPalette::Active, QPalette::WindowText, brush); palette284.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15739,11 +15767,11 @@ public: palette284.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette284.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette284.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R21ActuatorsButton->setPalette(palette284); - R21ActuatorsButton->setFont(font1); - R20ActuatorsButton = new QPushButton(frame); - R20ActuatorsButton->setObjectName(QString::fromUtf8("R20ActuatorsButton")); - R20ActuatorsButton->setGeometry(QRect(730, 800, 20, 20)); + R18ActuatorsButton->setPalette(palette284); + R18ActuatorsButton->setFont(font1); + R19ActuatorsButton = new QPushButton(frame); + R19ActuatorsButton->setObjectName(QString::fromUtf8("R19ActuatorsButton")); + R19ActuatorsButton->setGeometry(QRect(770, 770, 20, 20)); QPalette palette285; palette285.setBrush(QPalette::Active, QPalette::WindowText, brush); palette285.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15793,11 +15821,11 @@ public: palette285.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette285.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette285.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R20ActuatorsButton->setPalette(palette285); - R20ActuatorsButton->setFont(font1); - R28ActuatorsButton = new QPushButton(frame); - R28ActuatorsButton->setObjectName(QString::fromUtf8("R28ActuatorsButton")); - R28ActuatorsButton->setGeometry(QRect(300, 850, 20, 20)); + R19ActuatorsButton->setPalette(palette285); + R19ActuatorsButton->setFont(font1); + R23ActuatorsButton = new QPushButton(frame); + R23ActuatorsButton->setObjectName(QString::fromUtf8("R23ActuatorsButton")); + R23ActuatorsButton->setGeometry(QRect(580, 870, 20, 20)); QPalette palette286; palette286.setBrush(QPalette::Active, QPalette::WindowText, brush); palette286.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15847,11 +15875,11 @@ public: palette286.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette286.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette286.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R28ActuatorsButton->setPalette(palette286); - R28ActuatorsButton->setFont(font1); - R29ActuatorsButton = new QPushButton(frame); - R29ActuatorsButton->setObjectName(QString::fromUtf8("R29ActuatorsButton")); - R29ActuatorsButton->setGeometry(QRect(250, 830, 20, 20)); + R23ActuatorsButton->setPalette(palette286); + R23ActuatorsButton->setFont(font1); + R22ActuatorsButton = new QPushButton(frame); + R22ActuatorsButton->setObjectName(QString::fromUtf8("R22ActuatorsButton")); + R22ActuatorsButton->setGeometry(QRect(630, 850, 20, 20)); QPalette palette287; palette287.setBrush(QPalette::Active, QPalette::WindowText, brush); palette287.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15901,11 +15929,11 @@ public: palette287.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette287.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette287.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R29ActuatorsButton->setPalette(palette287); - R29ActuatorsButton->setFont(font1); - R30ActuatorsButton = new QPushButton(frame); - R30ActuatorsButton->setObjectName(QString::fromUtf8("R30ActuatorsButton")); - R30ActuatorsButton->setGeometry(QRect(200, 790, 20, 20)); + R22ActuatorsButton->setPalette(palette287); + R22ActuatorsButton->setFont(font1); + R21ActuatorsButton = new QPushButton(frame); + R21ActuatorsButton->setObjectName(QString::fromUtf8("R21ActuatorsButton")); + R21ActuatorsButton->setGeometry(QRect(680, 830, 20, 20)); QPalette palette288; palette288.setBrush(QPalette::Active, QPalette::WindowText, brush); palette288.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -15955,11 +15983,11 @@ public: palette288.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette288.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette288.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R30ActuatorsButton->setPalette(palette288); - R30ActuatorsButton->setFont(font1); - R31ActuatorsButton = new QPushButton(frame); - R31ActuatorsButton->setObjectName(QString::fromUtf8("R31ActuatorsButton")); - R31ActuatorsButton->setGeometry(QRect(160, 760, 20, 20)); + R21ActuatorsButton->setPalette(palette288); + R21ActuatorsButton->setFont(font1); + R20ActuatorsButton = new QPushButton(frame); + R20ActuatorsButton->setObjectName(QString::fromUtf8("R20ActuatorsButton")); + R20ActuatorsButton->setGeometry(QRect(730, 800, 20, 20)); QPalette palette289; palette289.setBrush(QPalette::Active, QPalette::WindowText, brush); palette289.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16009,11 +16037,11 @@ public: palette289.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette289.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette289.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R31ActuatorsButton->setPalette(palette289); - R31ActuatorsButton->setFont(font1); - R32ActuatorsButton = new QPushButton(frame); - R32ActuatorsButton->setObjectName(QString::fromUtf8("R32ActuatorsButton")); - R32ActuatorsButton->setGeometry(QRect(130, 720, 20, 20)); + R20ActuatorsButton->setPalette(palette289); + R20ActuatorsButton->setFont(font1); + R28ActuatorsButton = new QPushButton(frame); + R28ActuatorsButton->setObjectName(QString::fromUtf8("R28ActuatorsButton")); + R28ActuatorsButton->setGeometry(QRect(300, 850, 20, 20)); QPalette palette290; palette290.setBrush(QPalette::Active, QPalette::WindowText, brush); palette290.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16063,11 +16091,11 @@ public: palette290.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette290.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette290.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R32ActuatorsButton->setPalette(palette290); - R32ActuatorsButton->setFont(font1); - R33ActuatorsButton = new QPushButton(frame); - R33ActuatorsButton->setObjectName(QString::fromUtf8("R33ActuatorsButton")); - R33ActuatorsButton->setGeometry(QRect(100, 680, 20, 20)); + R28ActuatorsButton->setPalette(palette290); + R28ActuatorsButton->setFont(font1); + R29ActuatorsButton = new QPushButton(frame); + R29ActuatorsButton->setObjectName(QString::fromUtf8("R29ActuatorsButton")); + R29ActuatorsButton->setGeometry(QRect(250, 830, 20, 20)); QPalette palette291; palette291.setBrush(QPalette::Active, QPalette::WindowText, brush); palette291.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16117,11 +16145,11 @@ public: palette291.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette291.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette291.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R33ActuatorsButton->setPalette(palette291); - R33ActuatorsButton->setFont(font1); - R34ActuatorsButton = new QPushButton(frame); - R34ActuatorsButton->setObjectName(QString::fromUtf8("R34ActuatorsButton")); - R34ActuatorsButton->setGeometry(QRect(80, 630, 20, 20)); + R29ActuatorsButton->setPalette(palette291); + R29ActuatorsButton->setFont(font1); + R30ActuatorsButton = new QPushButton(frame); + R30ActuatorsButton->setObjectName(QString::fromUtf8("R30ActuatorsButton")); + R30ActuatorsButton->setGeometry(QRect(200, 790, 20, 20)); QPalette palette292; palette292.setBrush(QPalette::Active, QPalette::WindowText, brush); palette292.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16171,11 +16199,11 @@ public: palette292.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette292.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette292.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R34ActuatorsButton->setPalette(palette292); - R34ActuatorsButton->setFont(font1); - R35ActuatorsButton = new QPushButton(frame); - R35ActuatorsButton->setObjectName(QString::fromUtf8("R35ActuatorsButton")); - R35ActuatorsButton->setGeometry(QRect(60, 580, 20, 20)); + R30ActuatorsButton->setPalette(palette292); + R30ActuatorsButton->setFont(font1); + R31ActuatorsButton = new QPushButton(frame); + R31ActuatorsButton->setObjectName(QString::fromUtf8("R31ActuatorsButton")); + R31ActuatorsButton->setGeometry(QRect(160, 760, 20, 20)); QPalette palette293; palette293.setBrush(QPalette::Active, QPalette::WindowText, brush); palette293.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16225,11 +16253,11 @@ public: palette293.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette293.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette293.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R35ActuatorsButton->setPalette(palette293); - R35ActuatorsButton->setFont(font1); - R36ActuatorsButton = new QPushButton(frame); - R36ActuatorsButton->setObjectName(QString::fromUtf8("R36ActuatorsButton")); - R36ActuatorsButton->setGeometry(QRect(50, 520, 20, 20)); + R31ActuatorsButton->setPalette(palette293); + R31ActuatorsButton->setFont(font1); + R32ActuatorsButton = new QPushButton(frame); + R32ActuatorsButton->setObjectName(QString::fromUtf8("R32ActuatorsButton")); + R32ActuatorsButton->setGeometry(QRect(130, 720, 20, 20)); QPalette palette294; palette294.setBrush(QPalette::Active, QPalette::WindowText, brush); palette294.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16279,11 +16307,11 @@ public: palette294.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette294.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette294.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R36ActuatorsButton->setPalette(palette294); - R36ActuatorsButton->setFont(font1); - R37ActuatorsButton = new QPushButton(frame); - R37ActuatorsButton->setObjectName(QString::fromUtf8("R37ActuatorsButton")); - R37ActuatorsButton->setGeometry(QRect(50, 470, 20, 20)); + R32ActuatorsButton->setPalette(palette294); + R32ActuatorsButton->setFont(font1); + R33ActuatorsButton = new QPushButton(frame); + R33ActuatorsButton->setObjectName(QString::fromUtf8("R33ActuatorsButton")); + R33ActuatorsButton->setGeometry(QRect(100, 680, 20, 20)); QPalette palette295; palette295.setBrush(QPalette::Active, QPalette::WindowText, brush); palette295.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16333,11 +16361,11 @@ public: palette295.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette295.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette295.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R37ActuatorsButton->setPalette(palette295); - R37ActuatorsButton->setFont(font1); - R38ActuatorsButton = new QPushButton(frame); - R38ActuatorsButton->setObjectName(QString::fromUtf8("R38ActuatorsButton")); - R38ActuatorsButton->setGeometry(QRect(50, 410, 20, 20)); + R33ActuatorsButton->setPalette(palette295); + R33ActuatorsButton->setFont(font1); + R34ActuatorsButton = new QPushButton(frame); + R34ActuatorsButton->setObjectName(QString::fromUtf8("R34ActuatorsButton")); + R34ActuatorsButton->setGeometry(QRect(80, 630, 20, 20)); QPalette palette296; palette296.setBrush(QPalette::Active, QPalette::WindowText, brush); palette296.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16387,11 +16415,11 @@ public: palette296.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette296.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette296.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R38ActuatorsButton->setPalette(palette296); - R38ActuatorsButton->setFont(font1); - R39ActuatorsButton = new QPushButton(frame); - R39ActuatorsButton->setObjectName(QString::fromUtf8("R39ActuatorsButton")); - R39ActuatorsButton->setGeometry(QRect(60, 350, 20, 20)); + R34ActuatorsButton->setPalette(palette296); + R34ActuatorsButton->setFont(font1); + R35ActuatorsButton = new QPushButton(frame); + R35ActuatorsButton->setObjectName(QString::fromUtf8("R35ActuatorsButton")); + R35ActuatorsButton->setGeometry(QRect(60, 580, 20, 20)); QPalette palette297; palette297.setBrush(QPalette::Active, QPalette::WindowText, brush); palette297.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16441,11 +16469,11 @@ public: palette297.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette297.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette297.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R39ActuatorsButton->setPalette(palette297); - R39ActuatorsButton->setFont(font1); - R40ActuatorsButton = new QPushButton(frame); - R40ActuatorsButton->setObjectName(QString::fromUtf8("R40ActuatorsButton")); - R40ActuatorsButton->setGeometry(QRect(70, 300, 20, 20)); + R35ActuatorsButton->setPalette(palette297); + R35ActuatorsButton->setFont(font1); + R36ActuatorsButton = new QPushButton(frame); + R36ActuatorsButton->setObjectName(QString::fromUtf8("R36ActuatorsButton")); + R36ActuatorsButton->setGeometry(QRect(50, 520, 20, 20)); QPalette palette298; palette298.setBrush(QPalette::Active, QPalette::WindowText, brush); palette298.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16495,11 +16523,11 @@ public: palette298.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette298.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette298.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R40ActuatorsButton->setPalette(palette298); - R40ActuatorsButton->setFont(font1); - R41ActuatorsButton = new QPushButton(frame); - R41ActuatorsButton->setObjectName(QString::fromUtf8("R41ActuatorsButton")); - R41ActuatorsButton->setGeometry(QRect(100, 250, 20, 20)); + R36ActuatorsButton->setPalette(palette298); + R36ActuatorsButton->setFont(font1); + R37ActuatorsButton = new QPushButton(frame); + R37ActuatorsButton->setObjectName(QString::fromUtf8("R37ActuatorsButton")); + R37ActuatorsButton->setGeometry(QRect(50, 470, 20, 20)); QPalette palette299; palette299.setBrush(QPalette::Active, QPalette::WindowText, brush); palette299.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16549,11 +16577,11 @@ public: palette299.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette299.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette299.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R41ActuatorsButton->setPalette(palette299); - R41ActuatorsButton->setFont(font1); - R42ActuatorsButton = new QPushButton(frame); - R42ActuatorsButton->setObjectName(QString::fromUtf8("R42ActuatorsButton")); - R42ActuatorsButton->setGeometry(QRect(130, 210, 20, 20)); + R37ActuatorsButton->setPalette(palette299); + R37ActuatorsButton->setFont(font1); + R38ActuatorsButton = new QPushButton(frame); + R38ActuatorsButton->setObjectName(QString::fromUtf8("R38ActuatorsButton")); + R38ActuatorsButton->setGeometry(QRect(50, 410, 20, 20)); QPalette palette300; palette300.setBrush(QPalette::Active, QPalette::WindowText, brush); palette300.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16603,11 +16631,11 @@ public: palette300.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette300.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette300.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R42ActuatorsButton->setPalette(palette300); - R42ActuatorsButton->setFont(font1); - R43ActuatorsButton = new QPushButton(frame); - R43ActuatorsButton->setObjectName(QString::fromUtf8("R43ActuatorsButton")); - R43ActuatorsButton->setGeometry(QRect(160, 160, 20, 20)); + R38ActuatorsButton->setPalette(palette300); + R38ActuatorsButton->setFont(font1); + R39ActuatorsButton = new QPushButton(frame); + R39ActuatorsButton->setObjectName(QString::fromUtf8("R39ActuatorsButton")); + R39ActuatorsButton->setGeometry(QRect(60, 350, 20, 20)); QPalette palette301; palette301.setBrush(QPalette::Active, QPalette::WindowText, brush); palette301.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16657,11 +16685,11 @@ public: palette301.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette301.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette301.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R43ActuatorsButton->setPalette(palette301); - R43ActuatorsButton->setFont(font1); - R44ActuatorsButton = new QPushButton(frame); - R44ActuatorsButton->setObjectName(QString::fromUtf8("R44ActuatorsButton")); - R44ActuatorsButton->setGeometry(QRect(210, 130, 20, 20)); + R39ActuatorsButton->setPalette(palette301); + R39ActuatorsButton->setFont(font1); + R40ActuatorsButton = new QPushButton(frame); + R40ActuatorsButton->setObjectName(QString::fromUtf8("R40ActuatorsButton")); + R40ActuatorsButton->setGeometry(QRect(70, 300, 20, 20)); QPalette palette302; palette302.setBrush(QPalette::Active, QPalette::WindowText, brush); palette302.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16711,11 +16739,11 @@ public: palette302.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette302.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette302.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R44ActuatorsButton->setPalette(palette302); - R44ActuatorsButton->setFont(font1); - R45ActuatorsButton = new QPushButton(frame); - R45ActuatorsButton->setObjectName(QString::fromUtf8("R45ActuatorsButton")); - R45ActuatorsButton->setGeometry(QRect(250, 100, 20, 20)); + R40ActuatorsButton->setPalette(palette302); + R40ActuatorsButton->setFont(font1); + R41ActuatorsButton = new QPushButton(frame); + R41ActuatorsButton->setObjectName(QString::fromUtf8("R41ActuatorsButton")); + R41ActuatorsButton->setGeometry(QRect(100, 250, 20, 20)); QPalette palette303; palette303.setBrush(QPalette::Active, QPalette::WindowText, brush); palette303.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16765,11 +16793,11 @@ public: palette303.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette303.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette303.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R45ActuatorsButton->setPalette(palette303); - R45ActuatorsButton->setFont(font1); - R46ActuatorsButton = new QPushButton(frame); - R46ActuatorsButton->setObjectName(QString::fromUtf8("R46ActuatorsButton")); - R46ActuatorsButton->setGeometry(QRect(300, 80, 20, 20)); + R41ActuatorsButton->setPalette(palette303); + R41ActuatorsButton->setFont(font1); + R42ActuatorsButton = new QPushButton(frame); + R42ActuatorsButton->setObjectName(QString::fromUtf8("R42ActuatorsButton")); + R42ActuatorsButton->setGeometry(QRect(130, 210, 20, 20)); QPalette palette304; palette304.setBrush(QPalette::Active, QPalette::WindowText, brush); palette304.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16819,11 +16847,11 @@ public: palette304.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette304.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette304.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - R46ActuatorsButton->setPalette(palette304); - R46ActuatorsButton->setFont(font1); - ActuatorButton04_01 = new QPushButton(frame); - ActuatorButton04_01->setObjectName(QString::fromUtf8("ActuatorButton04_01")); - ActuatorButton04_01->setGeometry(QRect(471, 181, 10, 10)); + R42ActuatorsButton->setPalette(palette304); + R42ActuatorsButton->setFont(font1); + R43ActuatorsButton = new QPushButton(frame); + R43ActuatorsButton->setObjectName(QString::fromUtf8("R43ActuatorsButton")); + R43ActuatorsButton->setGeometry(QRect(160, 160, 20, 20)); QPalette palette305; palette305.setBrush(QPalette::Active, QPalette::WindowText, brush); palette305.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16873,10 +16901,11 @@ public: palette305.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette305.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette305.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_01->setPalette(palette305); - ActuatorButton04_06 = new QPushButton(frame); - ActuatorButton04_06->setObjectName(QString::fromUtf8("ActuatorButton04_06")); - ActuatorButton04_06->setGeometry(QRect(648, 240, 10, 10)); + R43ActuatorsButton->setPalette(palette305); + R43ActuatorsButton->setFont(font1); + R44ActuatorsButton = new QPushButton(frame); + R44ActuatorsButton->setObjectName(QString::fromUtf8("R44ActuatorsButton")); + R44ActuatorsButton->setGeometry(QRect(210, 130, 20, 20)); QPalette palette306; palette306.setBrush(QPalette::Active, QPalette::WindowText, brush); palette306.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16926,10 +16955,11 @@ public: palette306.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette306.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette306.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_06->setPalette(palette306); - ActuatorButton04_08 = new QPushButton(frame); - ActuatorButton04_08->setObjectName(QString::fromUtf8("ActuatorButton04_08")); - ActuatorButton04_08->setGeometry(QRect(702, 294, 10, 10)); + R44ActuatorsButton->setPalette(palette306); + R44ActuatorsButton->setFont(font1); + R45ActuatorsButton = new QPushButton(frame); + R45ActuatorsButton->setObjectName(QString::fromUtf8("R45ActuatorsButton")); + R45ActuatorsButton->setGeometry(QRect(250, 100, 20, 20)); QPalette palette307; palette307.setBrush(QPalette::Active, QPalette::WindowText, brush); palette307.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -16979,10 +17009,11 @@ public: palette307.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette307.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette307.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_08->setPalette(palette307); - ActuatorButton04_18 = new QPushButton(frame); - ActuatorButton04_18->setObjectName(QString::fromUtf8("ActuatorButton04_18")); - ActuatorButton04_18->setGeometry(QRect(702, 649, 10, 10)); + R45ActuatorsButton->setPalette(palette307); + R45ActuatorsButton->setFont(font1); + R46ActuatorsButton = new QPushButton(frame); + R46ActuatorsButton->setObjectName(QString::fromUtf8("R46ActuatorsButton")); + R46ActuatorsButton->setGeometry(QRect(300, 80, 20, 20)); QPalette palette308; palette308.setBrush(QPalette::Active, QPalette::WindowText, brush); palette308.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17032,10 +17063,11 @@ public: palette308.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette308.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette308.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_18->setPalette(palette308); - ActuatorButton04_20 = new QPushButton(frame); - ActuatorButton04_20->setObjectName(QString::fromUtf8("ActuatorButton04_20")); - ActuatorButton04_20->setGeometry(QRect(648, 702, 10, 10)); + R46ActuatorsButton->setPalette(palette308); + R46ActuatorsButton->setFont(font1); + ActuatorButton04_01 = new QPushButton(frame); + ActuatorButton04_01->setObjectName(QString::fromUtf8("ActuatorButton04_01")); + ActuatorButton04_01->setGeometry(QRect(471, 181, 10, 10)); QPalette palette309; palette309.setBrush(QPalette::Active, QPalette::WindowText, brush); palette309.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17085,10 +17117,10 @@ public: palette309.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette309.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette309.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_20->setPalette(palette309); - ActuatorButton04_30 = new QPushButton(frame); - ActuatorButton04_30->setObjectName(QString::fromUtf8("ActuatorButton04_30")); - ActuatorButton04_30->setGeometry(QRect(293, 702, 10, 10)); + ActuatorButton04_01->setPalette(palette309); + ActuatorButton04_06 = new QPushButton(frame); + ActuatorButton04_06->setObjectName(QString::fromUtf8("ActuatorButton04_06")); + ActuatorButton04_06->setGeometry(QRect(648, 240, 10, 10)); QPalette palette310; palette310.setBrush(QPalette::Active, QPalette::WindowText, brush); palette310.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17138,10 +17170,10 @@ public: palette310.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette310.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette310.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_30->setPalette(palette310); - ActuatorButton04_32 = new QPushButton(frame); - ActuatorButton04_32->setObjectName(QString::fromUtf8("ActuatorButton04_32")); - ActuatorButton04_32->setGeometry(QRect(240, 648, 10, 10)); + ActuatorButton04_06->setPalette(palette310); + ActuatorButton04_08 = new QPushButton(frame); + ActuatorButton04_08->setObjectName(QString::fromUtf8("ActuatorButton04_08")); + ActuatorButton04_08->setGeometry(QRect(702, 294, 10, 10)); QPalette palette311; palette311.setBrush(QPalette::Active, QPalette::WindowText, brush); palette311.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17191,10 +17223,10 @@ public: palette311.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette311.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette311.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_32->setPalette(palette311); - ActuatorButton04_42 = new QPushButton(frame); - ActuatorButton04_42->setObjectName(QString::fromUtf8("ActuatorButton04_42")); - ActuatorButton04_42->setGeometry(QRect(240, 294, 10, 10)); + ActuatorButton04_08->setPalette(palette311); + ActuatorButton04_18 = new QPushButton(frame); + ActuatorButton04_18->setObjectName(QString::fromUtf8("ActuatorButton04_18")); + ActuatorButton04_18->setGeometry(QRect(702, 649, 10, 10)); QPalette palette312; palette312.setBrush(QPalette::Active, QPalette::WindowText, brush); palette312.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17244,10 +17276,10 @@ public: palette312.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette312.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette312.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_42->setPalette(palette312); - ActuatorButton04_44 = new QPushButton(frame); - ActuatorButton04_44->setObjectName(QString::fromUtf8("ActuatorButton04_44")); - ActuatorButton04_44->setGeometry(QRect(293, 240, 10, 10)); + ActuatorButton04_18->setPalette(palette312); + ActuatorButton04_20 = new QPushButton(frame); + ActuatorButton04_20->setObjectName(QString::fromUtf8("ActuatorButton04_20")); + ActuatorButton04_20->setGeometry(QRect(648, 702, 10, 10)); QPalette palette313; palette313.setBrush(QPalette::Active, QPalette::WindowText, brush); palette313.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17297,10 +17329,10 @@ public: palette313.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette313.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette313.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton04_44->setPalette(palette313); - ActuatorButton05_07 = new QPushButton(frame); - ActuatorButton05_07->setObjectName(QString::fromUtf8("ActuatorButton05_07")); - ActuatorButton05_07->setGeometry(QRect(713, 229, 10, 10)); + ActuatorButton04_20->setPalette(palette313); + ActuatorButton04_30 = new QPushButton(frame); + ActuatorButton04_30->setObjectName(QString::fromUtf8("ActuatorButton04_30")); + ActuatorButton04_30->setGeometry(QRect(293, 702, 10, 10)); QPalette palette314; palette314.setBrush(QPalette::Active, QPalette::WindowText, brush); palette314.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17350,10 +17382,10 @@ public: palette314.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette314.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette314.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_07->setPalette(palette314); - ActuatorButton05_19 = new QPushButton(frame); - ActuatorButton05_19->setObjectName(QString::fromUtf8("ActuatorButton05_19")); - ActuatorButton05_19->setGeometry(QRect(712, 713, 10, 10)); + ActuatorButton04_30->setPalette(palette314); + ActuatorButton04_32 = new QPushButton(frame); + ActuatorButton04_32->setObjectName(QString::fromUtf8("ActuatorButton04_32")); + ActuatorButton04_32->setGeometry(QRect(240, 648, 10, 10)); QPalette palette315; palette315.setBrush(QPalette::Active, QPalette::WindowText, brush); palette315.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17403,10 +17435,10 @@ public: palette315.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette315.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette315.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_19->setPalette(palette315); - ActuatorButton05_31 = new QPushButton(frame); - ActuatorButton05_31->setObjectName(QString::fromUtf8("ActuatorButton05_31")); - ActuatorButton05_31->setGeometry(QRect(229, 713, 10, 10)); + ActuatorButton04_32->setPalette(palette315); + ActuatorButton04_42 = new QPushButton(frame); + ActuatorButton04_42->setObjectName(QString::fromUtf8("ActuatorButton04_42")); + ActuatorButton04_42->setGeometry(QRect(240, 294, 10, 10)); QPalette palette316; palette316.setBrush(QPalette::Active, QPalette::WindowText, brush); palette316.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17456,10 +17488,10 @@ public: palette316.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette316.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette316.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_31->setPalette(palette316); - ActuatorButton05_43 = new QPushButton(frame); - ActuatorButton05_43->setObjectName(QString::fromUtf8("ActuatorButton05_43")); - ActuatorButton05_43->setGeometry(QRect(229, 229, 10, 10)); + ActuatorButton04_42->setPalette(palette316); + ActuatorButton04_44 = new QPushButton(frame); + ActuatorButton04_44->setObjectName(QString::fromUtf8("ActuatorButton04_44")); + ActuatorButton04_44->setGeometry(QRect(293, 240, 10, 10)); QPalette palette317; palette317.setBrush(QPalette::Active, QPalette::WindowText, brush); palette317.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17509,10 +17541,10 @@ public: palette317.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette317.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette317.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton05_43->setPalette(palette317); - AllActuatorsButton = new QPushButton(frame); - AllActuatorsButton->setObjectName(QString::fromUtf8("AllActuatorsButton")); - AllActuatorsButton->setGeometry(QRect(450, 443, 50, 50)); + ActuatorButton04_44->setPalette(palette317); + ActuatorButton05_07 = new QPushButton(frame); + ActuatorButton05_07->setObjectName(QString::fromUtf8("ActuatorButton05_07")); + ActuatorButton05_07->setGeometry(QRect(713, 229, 10, 10)); QPalette palette318; palette318.setBrush(QPalette::Active, QPalette::WindowText, brush); palette318.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17562,10 +17594,10 @@ public: palette318.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette318.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette318.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - AllActuatorsButton->setPalette(palette318); - ActuatorButton06_11 = new QPushButton(frame); - ActuatorButton06_11->setObjectName(QString::fromUtf8("ActuatorButton06_11")); - ActuatorButton06_11->setGeometry(QRect(851, 370, 10, 10)); + ActuatorButton05_07->setPalette(palette318); + ActuatorButton05_19 = new QPushButton(frame); + ActuatorButton05_19->setObjectName(QString::fromUtf8("ActuatorButton05_19")); + ActuatorButton05_19->setGeometry(QRect(712, 713, 10, 10)); QPalette palette319; palette319.setBrush(QPalette::Active, QPalette::WindowText, brush); palette319.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17615,10 +17647,10 @@ public: palette319.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette319.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette319.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ActuatorButton06_11->setPalette(palette319); - QuitButton = new QPushButton(NotoActiveSurfaceGUI); - QuitButton->setObjectName(QString::fromUtf8("QuitButton")); - QuitButton->setGeometry(QRect(1070, 880, 91, 31)); + ActuatorButton05_19->setPalette(palette319); + ActuatorButton05_31 = new QPushButton(frame); + ActuatorButton05_31->setObjectName(QString::fromUtf8("ActuatorButton05_31")); + ActuatorButton05_31->setGeometry(QRect(229, 713, 10, 10)); QPalette palette320; palette320.setBrush(QPalette::Active, QPalette::WindowText, brush); palette320.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17668,14 +17700,10 @@ public: palette320.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette320.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette320.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - QuitButton->setPalette(palette320); - buttonGroup1 = new Q3ButtonGroup(NotoActiveSurfaceGUI); - buttonGroup1->setObjectName(QString::fromUtf8("buttonGroup1")); - buttonGroup1->setEnabled(false); - buttonGroup1->setGeometry(QRect(970, 448, 288, 291)); - CalibrateButton = new QPushButton(buttonGroup1); - CalibrateButton->setObjectName(QString::fromUtf8("CalibrateButton")); - CalibrateButton->setGeometry(QRect(192, 45, 90, 35)); + ActuatorButton05_31->setPalette(palette320); + ActuatorButton05_43 = new QPushButton(frame); + ActuatorButton05_43->setObjectName(QString::fromUtf8("ActuatorButton05_43")); + ActuatorButton05_43->setGeometry(QRect(229, 229, 10, 10)); QPalette palette321; palette321.setBrush(QPalette::Active, QPalette::WindowText, brush); palette321.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17725,10 +17753,10 @@ public: palette321.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette321.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette321.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - CalibrateButton->setPalette(palette321); - StopButton = new QPushButton(buttonGroup1); - StopButton->setObjectName(QString::fromUtf8("StopButton")); - StopButton->setGeometry(QRect(4, 5, 90, 35)); + ActuatorButton05_43->setPalette(palette321); + AllActuatorsButton = new QPushButton(frame); + AllActuatorsButton->setObjectName(QString::fromUtf8("AllActuatorsButton")); + AllActuatorsButton->setGeometry(QRect(450, 443, 50, 50)); QPalette palette322; palette322.setBrush(QPalette::Active, QPalette::WindowText, brush); palette322.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17778,10 +17806,10 @@ public: palette322.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette322.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette322.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - StopButton->setPalette(palette322); - ResetButton = new QPushButton(buttonGroup1); - ResetButton->setObjectName(QString::fromUtf8("ResetButton")); - ResetButton->setGeometry(QRect(98, 5, 90, 35)); + AllActuatorsButton->setPalette(palette322); + ActuatorButton06_11 = new QPushButton(frame); + ActuatorButton06_11->setObjectName(QString::fromUtf8("ActuatorButton06_11")); + ActuatorButton06_11->setGeometry(QRect(851, 370, 10, 10)); QPalette palette323; palette323.setBrush(QPalette::Active, QPalette::WindowText, brush); palette323.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17831,10 +17859,10 @@ public: palette323.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette323.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette323.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ResetButton->setPalette(palette323); - RefPosButton = new QPushButton(buttonGroup1); - RefPosButton->setObjectName(QString::fromUtf8("RefPosButton")); - RefPosButton->setGeometry(QRect(4, 45, 90, 35)); + ActuatorButton06_11->setPalette(palette323); + QuitButton = new QPushButton(NotoActiveSurfaceGUI); + QuitButton->setObjectName(QString::fromUtf8("QuitButton")); + QuitButton->setGeometry(QRect(1070, 880, 91, 31)); QPalette palette324; palette324.setBrush(QPalette::Active, QPalette::WindowText, brush); palette324.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17884,10 +17912,14 @@ public: palette324.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette324.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette324.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - RefPosButton->setPalette(palette324); - TopButton = new QPushButton(buttonGroup1); - TopButton->setObjectName(QString::fromUtf8("TopButton")); - TopButton->setGeometry(QRect(5, 125, 90, 35)); + QuitButton->setPalette(palette324); + buttonGroup1 = new Q3ButtonGroup(NotoActiveSurfaceGUI); + buttonGroup1->setObjectName(QString::fromUtf8("buttonGroup1")); + buttonGroup1->setEnabled(false); + buttonGroup1->setGeometry(QRect(970, 448, 288, 291)); + CalibrateButton = new QPushButton(buttonGroup1); + CalibrateButton->setObjectName(QString::fromUtf8("CalibrateButton")); + CalibrateButton->setGeometry(QRect(192, 45, 90, 35)); QPalette palette325; palette325.setBrush(QPalette::Active, QPalette::WindowText, brush); palette325.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17937,10 +17969,10 @@ public: palette325.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette325.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette325.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - TopButton->setPalette(palette325); - StowButton = new QPushButton(buttonGroup1); - StowButton->setObjectName(QString::fromUtf8("StowButton")); - StowButton->setGeometry(QRect(98, 45, 90, 35)); + CalibrateButton->setPalette(palette325); + StopButton = new QPushButton(buttonGroup1); + StopButton->setObjectName(QString::fromUtf8("StopButton")); + StopButton->setGeometry(QRect(4, 5, 90, 35)); QPalette palette326; palette326.setBrush(QPalette::Active, QPalette::WindowText, brush); palette326.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -17990,10 +18022,10 @@ public: palette326.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette326.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette326.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - StowButton->setPalette(palette326); - BottomButton = new QPushButton(buttonGroup1); - BottomButton->setObjectName(QString::fromUtf8("BottomButton")); - BottomButton->setGeometry(QRect(98, 125, 90, 35)); + StopButton->setPalette(palette326); + ResetButton = new QPushButton(buttonGroup1); + ResetButton->setObjectName(QString::fromUtf8("ResetButton")); + ResetButton->setGeometry(QRect(98, 5, 90, 35)); QPalette palette327; palette327.setBrush(QPalette::Active, QPalette::WindowText, brush); palette327.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18043,10 +18075,10 @@ public: palette327.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette327.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette327.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - BottomButton->setPalette(palette327); - SetupButton = new QPushButton(buttonGroup1); - SetupButton->setObjectName(QString::fromUtf8("SetupButton")); - SetupButton->setGeometry(QRect(192, 5, 90, 35)); + ResetButton->setPalette(palette327); + RefPosButton = new QPushButton(buttonGroup1); + RefPosButton->setObjectName(QString::fromUtf8("RefPosButton")); + RefPosButton->setGeometry(QRect(4, 45, 90, 35)); QPalette palette328; palette328.setBrush(QPalette::Active, QPalette::WindowText, brush); palette328.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18096,10 +18128,10 @@ public: palette328.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette328.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette328.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - SetupButton->setPalette(palette328); - DownButton = new QPushButton(buttonGroup1); - DownButton->setObjectName(QString::fromUtf8("DownButton")); - DownButton->setGeometry(QRect(98, 85, 90, 35)); + RefPosButton->setPalette(palette328); + TopButton = new QPushButton(buttonGroup1); + TopButton->setObjectName(QString::fromUtf8("TopButton")); + TopButton->setGeometry(QRect(5, 125, 90, 35)); QPalette palette329; palette329.setBrush(QPalette::Active, QPalette::WindowText, brush); palette329.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18149,10 +18181,10 @@ public: palette329.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette329.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette329.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - DownButton->setPalette(palette329); - UpButton = new QPushButton(buttonGroup1); - UpButton->setObjectName(QString::fromUtf8("UpButton")); - UpButton->setGeometry(QRect(4, 85, 90, 35)); + TopButton->setPalette(palette329); + StowButton = new QPushButton(buttonGroup1); + StowButton->setObjectName(QString::fromUtf8("StowButton")); + StowButton->setGeometry(QRect(98, 45, 90, 35)); QPalette palette330; palette330.setBrush(QPalette::Active, QPalette::WindowText, brush); palette330.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18202,10 +18234,10 @@ public: palette330.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette330.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette330.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - UpButton->setPalette(palette330); - MoveButton = new QPushButton(buttonGroup1); - MoveButton->setObjectName(QString::fromUtf8("MoveButton")); - MoveButton->setGeometry(QRect(5, 165, 90, 35)); + StowButton->setPalette(palette330); + BottomButton = new QPushButton(buttonGroup1); + BottomButton->setObjectName(QString::fromUtf8("BottomButton")); + BottomButton->setGeometry(QRect(98, 125, 90, 35)); QPalette palette331; palette331.setBrush(QPalette::Active, QPalette::WindowText, brush); palette331.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18255,18 +18287,10 @@ public: palette331.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette331.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette331.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - MoveButton->setPalette(palette331); - ActuatorMovelineEdit = new QLineEdit(buttonGroup1); - ActuatorMovelineEdit->setObjectName(QString::fromUtf8("ActuatorMovelineEdit")); - ActuatorMovelineEdit->setGeometry(QRect(140, 165, 100, 35)); - QFont font5; - font5.setPointSize(12); - ActuatorMovelineEdit->setFont(font5); - ActuatorMovelineEdit->setAlignment(Qt::AlignRight); - ActuatorMovelineEdit->setReadOnly(false); - CorrectionButton = new QPushButton(buttonGroup1); - CorrectionButton->setObjectName(QString::fromUtf8("CorrectionButton")); - CorrectionButton->setGeometry(QRect(5, 205, 90, 35)); + BottomButton->setPalette(palette331); + SetupButton = new QPushButton(buttonGroup1); + SetupButton->setObjectName(QString::fromUtf8("SetupButton")); + SetupButton->setGeometry(QRect(192, 5, 90, 35)); QPalette palette332; palette332.setBrush(QPalette::Active, QPalette::WindowText, brush); palette332.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18316,16 +18340,10 @@ public: palette332.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette332.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette332.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - CorrectionButton->setPalette(palette332); - ActuatorCorrectionlineEdit = new QLineEdit(buttonGroup1); - ActuatorCorrectionlineEdit->setObjectName(QString::fromUtf8("ActuatorCorrectionlineEdit")); - ActuatorCorrectionlineEdit->setGeometry(QRect(140, 205, 100, 35)); - ActuatorCorrectionlineEdit->setFont(font5); - ActuatorCorrectionlineEdit->setAlignment(Qt::AlignRight); - ActuatorCorrectionlineEdit->setReadOnly(false); - UpdateButton = new QPushButton(buttonGroup1); - UpdateButton->setObjectName(QString::fromUtf8("UpdateButton")); - UpdateButton->setGeometry(QRect(5, 245, 90, 35)); + SetupButton->setPalette(palette332); + DownButton = new QPushButton(buttonGroup1); + DownButton->setObjectName(QString::fromUtf8("DownButton")); + DownButton->setGeometry(QRect(98, 85, 90, 35)); QPalette palette333; palette333.setBrush(QPalette::Active, QPalette::WindowText, brush); palette333.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18375,22 +18393,10 @@ public: palette333.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette333.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette333.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - UpdateButton->setPalette(palette333); - ActuatorUpdatelineEdit = new QLineEdit(buttonGroup1); - ActuatorUpdatelineEdit->setObjectName(QString::fromUtf8("ActuatorUpdatelineEdit")); - ActuatorUpdatelineEdit->setGeometry(QRect(140, 245, 100, 35)); - ActuatorUpdatelineEdit->setFont(font5); - ActuatorUpdatelineEdit->setAlignment(Qt::AlignRight); - ActuatorUpdatelineEdit->setReadOnly(false); - lineEdit = new QLineEdit(NotoActiveSurfaceGUI); - lineEdit->setObjectName(QString::fromUtf8("lineEdit")); - lineEdit->setGeometry(QRect(970, 750, 288, 40)); - lineEdit->setAutoFillBackground(false); - lineEdit->setAlignment(Qt::AlignCenter); - lineEdit->setReadOnly(true); - ParabolicProfilebutton = new QPushButton(NotoActiveSurfaceGUI); - ParabolicProfilebutton->setObjectName(QString::fromUtf8("ParabolicProfilebutton")); - ParabolicProfilebutton->setGeometry(QRect(970, 800, 90, 30)); + DownButton->setPalette(palette333); + UpButton = new QPushButton(buttonGroup1); + UpButton->setObjectName(QString::fromUtf8("UpButton")); + UpButton->setGeometry(QRect(4, 85, 90, 35)); QPalette palette334; palette334.setBrush(QPalette::Active, QPalette::WindowText, brush); palette334.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18440,10 +18446,10 @@ public: palette334.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette334.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette334.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ParabolicProfilebutton->setPalette(palette334); - stowASbutton = new QPushButton(NotoActiveSurfaceGUI); - stowASbutton->setObjectName(QString::fromUtf8("stowASbutton")); - stowASbutton->setGeometry(QRect(1193, 800, 61, 30)); + UpButton->setPalette(palette334); + MoveButton = new QPushButton(buttonGroup1); + MoveButton->setObjectName(QString::fromUtf8("MoveButton")); + MoveButton->setGeometry(QRect(5, 165, 90, 35)); QPalette palette335; palette335.setBrush(QPalette::Active, QPalette::WindowText, brush); palette335.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18493,10 +18499,18 @@ public: palette335.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette335.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette335.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - stowASbutton->setPalette(palette335); - ParabolicFixedProfileSbutton = new QPushButton(NotoActiveSurfaceGUI); - ParabolicFixedProfileSbutton->setObjectName(QString::fromUtf8("ParabolicFixedProfileSbutton")); - ParabolicFixedProfileSbutton->setGeometry(QRect(1067, 800, 111, 30)); + MoveButton->setPalette(palette335); + ActuatorMovelineEdit = new QLineEdit(buttonGroup1); + ActuatorMovelineEdit->setObjectName(QString::fromUtf8("ActuatorMovelineEdit")); + ActuatorMovelineEdit->setGeometry(QRect(140, 165, 100, 35)); + QFont font5; + font5.setPointSize(12); + ActuatorMovelineEdit->setFont(font5); + ActuatorMovelineEdit->setAlignment(Qt::AlignRight); + ActuatorMovelineEdit->setReadOnly(false); + CorrectionButton = new QPushButton(buttonGroup1); + CorrectionButton->setObjectName(QString::fromUtf8("CorrectionButton")); + CorrectionButton->setGeometry(QRect(5, 205, 90, 35)); QPalette palette336; palette336.setBrush(QPalette::Active, QPalette::WindowText, brush); palette336.setBrush(QPalette::Active, QPalette::Button, brush1); @@ -18546,7 +18560,237 @@ public: palette336.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); palette336.setBrush(QPalette::Disabled, QPalette::Link, brush9); palette336.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); - ParabolicFixedProfileSbutton->setPalette(palette336); + CorrectionButton->setPalette(palette336); + ActuatorCorrectionlineEdit = new QLineEdit(buttonGroup1); + ActuatorCorrectionlineEdit->setObjectName(QString::fromUtf8("ActuatorCorrectionlineEdit")); + ActuatorCorrectionlineEdit->setGeometry(QRect(140, 205, 100, 35)); + ActuatorCorrectionlineEdit->setFont(font5); + ActuatorCorrectionlineEdit->setAlignment(Qt::AlignRight); + ActuatorCorrectionlineEdit->setReadOnly(false); + UpdateButton = new QPushButton(buttonGroup1); + UpdateButton->setObjectName(QString::fromUtf8("UpdateButton")); + UpdateButton->setGeometry(QRect(5, 245, 90, 35)); + QPalette palette337; + palette337.setBrush(QPalette::Active, QPalette::WindowText, brush); + palette337.setBrush(QPalette::Active, QPalette::Button, brush1); + palette337.setBrush(QPalette::Active, QPalette::Light, brush2); + palette337.setBrush(QPalette::Active, QPalette::Midlight, brush3); + palette337.setBrush(QPalette::Active, QPalette::Dark, brush4); + palette337.setBrush(QPalette::Active, QPalette::Mid, brush5); + palette337.setBrush(QPalette::Active, QPalette::Text, brush); + palette337.setBrush(QPalette::Active, QPalette::BrightText, brush6); + palette337.setBrush(QPalette::Active, QPalette::ButtonText, brush); + palette337.setBrush(QPalette::Active, QPalette::Base, brush1); + palette337.setBrush(QPalette::Active, QPalette::Window, brush1); + palette337.setBrush(QPalette::Active, QPalette::Shadow, brush); + palette337.setBrush(QPalette::Active, QPalette::Highlight, brush7); + palette337.setBrush(QPalette::Active, QPalette::HighlightedText, brush6); + palette337.setBrush(QPalette::Active, QPalette::Link, brush); + palette337.setBrush(QPalette::Active, QPalette::LinkVisited, brush); + palette337.setBrush(QPalette::Inactive, QPalette::WindowText, brush); + palette337.setBrush(QPalette::Inactive, QPalette::Button, brush1); + palette337.setBrush(QPalette::Inactive, QPalette::Light, brush2); + palette337.setBrush(QPalette::Inactive, QPalette::Midlight, brush8); + palette337.setBrush(QPalette::Inactive, QPalette::Dark, brush4); + palette337.setBrush(QPalette::Inactive, QPalette::Mid, brush5); + palette337.setBrush(QPalette::Inactive, QPalette::Text, brush); + palette337.setBrush(QPalette::Inactive, QPalette::BrightText, brush6); + palette337.setBrush(QPalette::Inactive, QPalette::ButtonText, brush); + palette337.setBrush(QPalette::Inactive, QPalette::Base, brush1); + palette337.setBrush(QPalette::Inactive, QPalette::Window, brush1); + palette337.setBrush(QPalette::Inactive, QPalette::Shadow, brush); + palette337.setBrush(QPalette::Inactive, QPalette::Highlight, brush7); + palette337.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush6); + palette337.setBrush(QPalette::Inactive, QPalette::Link, brush9); + palette337.setBrush(QPalette::Inactive, QPalette::LinkVisited, brush10); + palette337.setBrush(QPalette::Disabled, QPalette::WindowText, brush11); + palette337.setBrush(QPalette::Disabled, QPalette::Button, brush1); + palette337.setBrush(QPalette::Disabled, QPalette::Light, brush2); + palette337.setBrush(QPalette::Disabled, QPalette::Midlight, brush8); + palette337.setBrush(QPalette::Disabled, QPalette::Dark, brush4); + palette337.setBrush(QPalette::Disabled, QPalette::Mid, brush5); + palette337.setBrush(QPalette::Disabled, QPalette::Text, brush11); + palette337.setBrush(QPalette::Disabled, QPalette::BrightText, brush6); + palette337.setBrush(QPalette::Disabled, QPalette::ButtonText, brush11); + palette337.setBrush(QPalette::Disabled, QPalette::Base, brush1); + palette337.setBrush(QPalette::Disabled, QPalette::Window, brush1); + palette337.setBrush(QPalette::Disabled, QPalette::Shadow, brush); + palette337.setBrush(QPalette::Disabled, QPalette::Highlight, brush7); + palette337.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); + palette337.setBrush(QPalette::Disabled, QPalette::Link, brush9); + palette337.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); + UpdateButton->setPalette(palette337); + ActuatorUpdatelineEdit = new QLineEdit(buttonGroup1); + ActuatorUpdatelineEdit->setObjectName(QString::fromUtf8("ActuatorUpdatelineEdit")); + ActuatorUpdatelineEdit->setGeometry(QRect(140, 245, 100, 35)); + ActuatorUpdatelineEdit->setFont(font5); + ActuatorUpdatelineEdit->setAlignment(Qt::AlignRight); + ActuatorUpdatelineEdit->setReadOnly(false); + lineEdit = new QLineEdit(NotoActiveSurfaceGUI); + lineEdit->setObjectName(QString::fromUtf8("lineEdit")); + lineEdit->setGeometry(QRect(970, 750, 288, 40)); + lineEdit->setAutoFillBackground(false); + lineEdit->setAlignment(Qt::AlignCenter); + lineEdit->setReadOnly(true); + ParabolicProfilebutton = new QPushButton(NotoActiveSurfaceGUI); + ParabolicProfilebutton->setObjectName(QString::fromUtf8("ParabolicProfilebutton")); + ParabolicProfilebutton->setGeometry(QRect(970, 800, 90, 30)); + QPalette palette338; + palette338.setBrush(QPalette::Active, QPalette::WindowText, brush); + palette338.setBrush(QPalette::Active, QPalette::Button, brush1); + palette338.setBrush(QPalette::Active, QPalette::Light, brush2); + palette338.setBrush(QPalette::Active, QPalette::Midlight, brush3); + palette338.setBrush(QPalette::Active, QPalette::Dark, brush4); + palette338.setBrush(QPalette::Active, QPalette::Mid, brush5); + palette338.setBrush(QPalette::Active, QPalette::Text, brush); + palette338.setBrush(QPalette::Active, QPalette::BrightText, brush6); + palette338.setBrush(QPalette::Active, QPalette::ButtonText, brush); + palette338.setBrush(QPalette::Active, QPalette::Base, brush1); + palette338.setBrush(QPalette::Active, QPalette::Window, brush1); + palette338.setBrush(QPalette::Active, QPalette::Shadow, brush); + palette338.setBrush(QPalette::Active, QPalette::Highlight, brush7); + palette338.setBrush(QPalette::Active, QPalette::HighlightedText, brush6); + palette338.setBrush(QPalette::Active, QPalette::Link, brush); + palette338.setBrush(QPalette::Active, QPalette::LinkVisited, brush); + palette338.setBrush(QPalette::Inactive, QPalette::WindowText, brush); + palette338.setBrush(QPalette::Inactive, QPalette::Button, brush1); + palette338.setBrush(QPalette::Inactive, QPalette::Light, brush2); + palette338.setBrush(QPalette::Inactive, QPalette::Midlight, brush8); + palette338.setBrush(QPalette::Inactive, QPalette::Dark, brush4); + palette338.setBrush(QPalette::Inactive, QPalette::Mid, brush5); + palette338.setBrush(QPalette::Inactive, QPalette::Text, brush); + palette338.setBrush(QPalette::Inactive, QPalette::BrightText, brush6); + palette338.setBrush(QPalette::Inactive, QPalette::ButtonText, brush); + palette338.setBrush(QPalette::Inactive, QPalette::Base, brush1); + palette338.setBrush(QPalette::Inactive, QPalette::Window, brush1); + palette338.setBrush(QPalette::Inactive, QPalette::Shadow, brush); + palette338.setBrush(QPalette::Inactive, QPalette::Highlight, brush7); + palette338.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush6); + palette338.setBrush(QPalette::Inactive, QPalette::Link, brush9); + palette338.setBrush(QPalette::Inactive, QPalette::LinkVisited, brush10); + palette338.setBrush(QPalette::Disabled, QPalette::WindowText, brush11); + palette338.setBrush(QPalette::Disabled, QPalette::Button, brush1); + palette338.setBrush(QPalette::Disabled, QPalette::Light, brush2); + palette338.setBrush(QPalette::Disabled, QPalette::Midlight, brush8); + palette338.setBrush(QPalette::Disabled, QPalette::Dark, brush4); + palette338.setBrush(QPalette::Disabled, QPalette::Mid, brush5); + palette338.setBrush(QPalette::Disabled, QPalette::Text, brush11); + palette338.setBrush(QPalette::Disabled, QPalette::BrightText, brush6); + palette338.setBrush(QPalette::Disabled, QPalette::ButtonText, brush11); + palette338.setBrush(QPalette::Disabled, QPalette::Base, brush1); + palette338.setBrush(QPalette::Disabled, QPalette::Window, brush1); + palette338.setBrush(QPalette::Disabled, QPalette::Shadow, brush); + palette338.setBrush(QPalette::Disabled, QPalette::Highlight, brush7); + palette338.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); + palette338.setBrush(QPalette::Disabled, QPalette::Link, brush9); + palette338.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); + ParabolicProfilebutton->setPalette(palette338); + stowASbutton = new QPushButton(NotoActiveSurfaceGUI); + stowASbutton->setObjectName(QString::fromUtf8("stowASbutton")); + stowASbutton->setGeometry(QRect(1193, 800, 61, 30)); + QPalette palette339; + palette339.setBrush(QPalette::Active, QPalette::WindowText, brush); + palette339.setBrush(QPalette::Active, QPalette::Button, brush1); + palette339.setBrush(QPalette::Active, QPalette::Light, brush2); + palette339.setBrush(QPalette::Active, QPalette::Midlight, brush3); + palette339.setBrush(QPalette::Active, QPalette::Dark, brush4); + palette339.setBrush(QPalette::Active, QPalette::Mid, brush5); + palette339.setBrush(QPalette::Active, QPalette::Text, brush); + palette339.setBrush(QPalette::Active, QPalette::BrightText, brush6); + palette339.setBrush(QPalette::Active, QPalette::ButtonText, brush); + palette339.setBrush(QPalette::Active, QPalette::Base, brush1); + palette339.setBrush(QPalette::Active, QPalette::Window, brush1); + palette339.setBrush(QPalette::Active, QPalette::Shadow, brush); + palette339.setBrush(QPalette::Active, QPalette::Highlight, brush7); + palette339.setBrush(QPalette::Active, QPalette::HighlightedText, brush6); + palette339.setBrush(QPalette::Active, QPalette::Link, brush); + palette339.setBrush(QPalette::Active, QPalette::LinkVisited, brush); + palette339.setBrush(QPalette::Inactive, QPalette::WindowText, brush); + palette339.setBrush(QPalette::Inactive, QPalette::Button, brush1); + palette339.setBrush(QPalette::Inactive, QPalette::Light, brush2); + palette339.setBrush(QPalette::Inactive, QPalette::Midlight, brush8); + palette339.setBrush(QPalette::Inactive, QPalette::Dark, brush4); + palette339.setBrush(QPalette::Inactive, QPalette::Mid, brush5); + palette339.setBrush(QPalette::Inactive, QPalette::Text, brush); + palette339.setBrush(QPalette::Inactive, QPalette::BrightText, brush6); + palette339.setBrush(QPalette::Inactive, QPalette::ButtonText, brush); + palette339.setBrush(QPalette::Inactive, QPalette::Base, brush1); + palette339.setBrush(QPalette::Inactive, QPalette::Window, brush1); + palette339.setBrush(QPalette::Inactive, QPalette::Shadow, brush); + palette339.setBrush(QPalette::Inactive, QPalette::Highlight, brush7); + palette339.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush6); + palette339.setBrush(QPalette::Inactive, QPalette::Link, brush9); + palette339.setBrush(QPalette::Inactive, QPalette::LinkVisited, brush10); + palette339.setBrush(QPalette::Disabled, QPalette::WindowText, brush11); + palette339.setBrush(QPalette::Disabled, QPalette::Button, brush1); + palette339.setBrush(QPalette::Disabled, QPalette::Light, brush2); + palette339.setBrush(QPalette::Disabled, QPalette::Midlight, brush8); + palette339.setBrush(QPalette::Disabled, QPalette::Dark, brush4); + palette339.setBrush(QPalette::Disabled, QPalette::Mid, brush5); + palette339.setBrush(QPalette::Disabled, QPalette::Text, brush11); + palette339.setBrush(QPalette::Disabled, QPalette::BrightText, brush6); + palette339.setBrush(QPalette::Disabled, QPalette::ButtonText, brush11); + palette339.setBrush(QPalette::Disabled, QPalette::Base, brush1); + palette339.setBrush(QPalette::Disabled, QPalette::Window, brush1); + palette339.setBrush(QPalette::Disabled, QPalette::Shadow, brush); + palette339.setBrush(QPalette::Disabled, QPalette::Highlight, brush7); + palette339.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); + palette339.setBrush(QPalette::Disabled, QPalette::Link, brush9); + palette339.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); + stowASbutton->setPalette(palette339); + ParabolicFixedProfileSbutton = new QPushButton(NotoActiveSurfaceGUI); + ParabolicFixedProfileSbutton->setObjectName(QString::fromUtf8("ParabolicFixedProfileSbutton")); + ParabolicFixedProfileSbutton->setGeometry(QRect(1067, 800, 111, 30)); + QPalette palette340; + palette340.setBrush(QPalette::Active, QPalette::WindowText, brush); + palette340.setBrush(QPalette::Active, QPalette::Button, brush1); + palette340.setBrush(QPalette::Active, QPalette::Light, brush2); + palette340.setBrush(QPalette::Active, QPalette::Midlight, brush3); + palette340.setBrush(QPalette::Active, QPalette::Dark, brush4); + palette340.setBrush(QPalette::Active, QPalette::Mid, brush5); + palette340.setBrush(QPalette::Active, QPalette::Text, brush); + palette340.setBrush(QPalette::Active, QPalette::BrightText, brush6); + palette340.setBrush(QPalette::Active, QPalette::ButtonText, brush); + palette340.setBrush(QPalette::Active, QPalette::Base, brush1); + palette340.setBrush(QPalette::Active, QPalette::Window, brush1); + palette340.setBrush(QPalette::Active, QPalette::Shadow, brush); + palette340.setBrush(QPalette::Active, QPalette::Highlight, brush7); + palette340.setBrush(QPalette::Active, QPalette::HighlightedText, brush6); + palette340.setBrush(QPalette::Active, QPalette::Link, brush); + palette340.setBrush(QPalette::Active, QPalette::LinkVisited, brush); + palette340.setBrush(QPalette::Inactive, QPalette::WindowText, brush); + palette340.setBrush(QPalette::Inactive, QPalette::Button, brush1); + palette340.setBrush(QPalette::Inactive, QPalette::Light, brush2); + palette340.setBrush(QPalette::Inactive, QPalette::Midlight, brush8); + palette340.setBrush(QPalette::Inactive, QPalette::Dark, brush4); + palette340.setBrush(QPalette::Inactive, QPalette::Mid, brush5); + palette340.setBrush(QPalette::Inactive, QPalette::Text, brush); + palette340.setBrush(QPalette::Inactive, QPalette::BrightText, brush6); + palette340.setBrush(QPalette::Inactive, QPalette::ButtonText, brush); + palette340.setBrush(QPalette::Inactive, QPalette::Base, brush1); + palette340.setBrush(QPalette::Inactive, QPalette::Window, brush1); + palette340.setBrush(QPalette::Inactive, QPalette::Shadow, brush); + palette340.setBrush(QPalette::Inactive, QPalette::Highlight, brush7); + palette340.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush6); + palette340.setBrush(QPalette::Inactive, QPalette::Link, brush9); + palette340.setBrush(QPalette::Inactive, QPalette::LinkVisited, brush10); + palette340.setBrush(QPalette::Disabled, QPalette::WindowText, brush11); + palette340.setBrush(QPalette::Disabled, QPalette::Button, brush1); + palette340.setBrush(QPalette::Disabled, QPalette::Light, brush2); + palette340.setBrush(QPalette::Disabled, QPalette::Midlight, brush8); + palette340.setBrush(QPalette::Disabled, QPalette::Dark, brush4); + palette340.setBrush(QPalette::Disabled, QPalette::Mid, brush5); + palette340.setBrush(QPalette::Disabled, QPalette::Text, brush11); + palette340.setBrush(QPalette::Disabled, QPalette::BrightText, brush6); + palette340.setBrush(QPalette::Disabled, QPalette::ButtonText, brush11); + palette340.setBrush(QPalette::Disabled, QPalette::Base, brush1); + palette340.setBrush(QPalette::Disabled, QPalette::Window, brush1); + palette340.setBrush(QPalette::Disabled, QPalette::Shadow, brush); + palette340.setBrush(QPalette::Disabled, QPalette::Highlight, brush7); + palette340.setBrush(QPalette::Disabled, QPalette::HighlightedText, brush6); + palette340.setBrush(QPalette::Disabled, QPalette::Link, brush9); + palette340.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); + ParabolicFixedProfileSbutton->setPalette(palette340); StatuslineEdit_2 = new QLineEdit(NotoActiveSurfaceGUI); StatuslineEdit_2->setObjectName(QString::fromUtf8("StatuslineEdit_2")); StatuslineEdit_2->setGeometry(QRect(1129, 840, 131, 30)); @@ -18625,6 +18869,10 @@ public: QObject::connect(ActuatorButton01_09, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); QObject::connect(ActuatorButton01_10, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); QObject::connect(ActuatorButton01_05, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); + QObject::connect(ActuatorButton07_01, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); + QObject::connect(ActuatorButton07_02, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); + QObject::connect(ActuatorButton07_03, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); + QObject::connect(ActuatorButton07_04, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); QObject::connect(ActuatorButton01_02, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); QObject::connect(ActuatorButton01_18, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); QObject::connect(ActuatorButton01_17, SIGNAL(clicked()), NotoActiveSurfaceGUI, SLOT(setactuator())); @@ -18986,11 +19234,31 @@ public: #endif // QT_NO_TOOLTIP ActuatorButton01_02->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); ActuatorButton01_02->setText(QString()); +#ifndef QT_NO_TOOLTIP + ActuatorButton07_01->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "07_01", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + ActuatorButton07_01->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); + ActuatorButton07_01->setText(QString()); +#ifndef QT_NO_TOOLTIP + ActuatorButton07_02->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "07_02", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + ActuatorButton07_02->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); + ActuatorButton07_02->setText(QString()); #ifndef QT_NO_TOOLTIP ActuatorButton01_03->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "01_03", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP ActuatorButton01_03->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); ActuatorButton01_03->setText(QString()); +#ifndef QT_NO_TOOLTIP + ActuatorButton07_03->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "07_03", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + ActuatorButton07_03->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); + ActuatorButton07_03->setText(QString()); +#ifndef QT_NO_TOOLTIP + ActuatorButton07_04->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "07_04", 0, QApplication::UnicodeUTF8)); +#endif // QT_NO_TOOLTIP + ActuatorButton07_04->setStyleSheet(QApplication::translate("NotoActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); + ActuatorButton07_04->setText(QString()); #ifndef QT_NO_TOOLTIP ActuatorButton01_04->setToolTip(QApplication::translate("NotoActiveSurfaceGUI", "01_04", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceCore.cpp b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceCore.cpp index 7b261c822..ff44bff1b 100644 --- a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceCore.cpp +++ b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceCore.cpp @@ -59,8 +59,6 @@ void NotoActiveSurfaceCore::run(void) Management::ROTSystemStatus_var bossStatus_var; ActiveSurface::ROTASProfile_var asProfile_var; - ACS_SHORT_LOG((LM_INFO, "NotoActiveSurfaceCore %s ","UNO")); - while (monitor == true) { TIMEVALUE clock; @@ -73,10 +71,12 @@ void NotoActiveSurfaceCore::run(void) asProfile_var = tASBoss->pprofile(); emit setGUIasProfileCode((int)asProfile_var->get_sync(completion.out())); - ACS::longSeq_var asStatus; - tASBoss->asStatus4GUIClient(asStatus); + //ACS::longSeq_var asStatus; + CORBA::Long usdStatus; + //tASBoss->asStatus4GUIClient(asStatus); + //tASBoss->usdStatus4GUIClient(asStatus); - for(unsigned int actuator = 1, i, l; actuator < 265; actuator++, l++) + for(unsigned int actuator = 1, i, l; actuator < 269; actuator++, l++) { if (actuator >= 1 && actuator <= 24) // 1 circle i = 1; @@ -90,28 +90,52 @@ void NotoActiveSurfaceCore::run(void) i = 5; if (actuator >= 217 && actuator <= 264) // 6 circle i = 6; + if (actuator >= 265 && actuator <= 268) // 7 circle + i = 7; if (actuator == 1 || actuator == 25 || actuator == 73 || - actuator == 121 || actuator == 169 || actuator == 217) + actuator == 121 || actuator == 169 || actuator == 217 || actuator == 265) { l = 1; CIRATools::Wait(100000); //100ms } - CORBA::Long status = asStatus[actuator - 1]; + //CORBA::Long status; + //if (i > 1) + // status = asStatus[actuator - 1 - 24]; bool active; - if ((status & ENBL) == 0) + try { + tASBoss->usdStatus4GUIClient(i, l, usdStatus); + if ((usdStatus & ENBL) == 0) + active = false; + else + active = true; + } + catch (ComponentErrors::ComponentNotActiveExImpl& ex) { + active = false; + ex.log(LM_DEBUG); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + active = false; + ex.log(LM_DEBUG); + } + catch (CORBA::SystemException& sysEx) { + active = false; + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"NotoActiveSurfaceGUIClient::NotoActiveSurfaceCore::setactuator()"); + impl.setName(sysEx._name()); + impl.setMinor(sysEx.minor()); + impl.log(); + } + catch (...) { active = false; - else + _EXCPT(ClientErrors::UnknownExImpl,impl,"NotoActiveSurfaceGUIClient::NotoActiveSurfaceCore::setactuator()"); + impl.log(); + } + if (i == 1) active = true; - emit setGUIActuatorColor(i, l, active, true); - - ACS_SHORT_LOG((LM_INFO, "NotoActiveSurfaceCore %s ","DUE")); } - ACS_SHORT_LOG((LM_INFO, "NotoActiveSurfaceCore %s ","TRE")); - /*CIRATools::getTime(clock); ACS::Time t1 = clock.value().value; int elapsed = (t1 - t0) / 10; diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui index 43ba300a6..1c5e7b0e1 100755 --- a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui +++ b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui @@ -1096,6 +1096,9 @@ + + false + 471 @@ -1557,6 +1560,9 @@ + + false + 501 @@ -2017,11 +2023,14 @@ - + + + true + - 528 - 372 + 690 + 250 10 10 @@ -2469,7 +2478,7 @@ - 01_03 + 07_01 background-color: rgb(0, 85, 255); @@ -2478,11 +2487,14 @@ - + + + true + - 552 - 390 + 690 + 690 10 10 @@ -2930,7 +2942,7 @@ - 01_04 + 07_02 background-color: rgb(0, 85, 255); @@ -2939,11 +2951,14 @@ - + + + false + - 569 - 414 + 528 + 372 10 10 @@ -3391,7 +3406,7 @@ - 01_05 + 01_03 background-color: rgb(0, 85, 255); @@ -3400,11 +3415,14 @@ - + + + true + - 580 - 442 + 250 + 690 10 10 @@ -3852,7 +3870,7 @@ - 01_06 + 07_03 background-color: rgb(0, 85, 255); @@ -3861,11 +3879,14 @@ - + + + true + - 584 - 471 + 250 + 250 10 10 @@ -4313,7 +4334,7 @@ - 01_07 + 07_04 background-color: rgb(0, 85, 255); @@ -4322,11 +4343,14 @@ - + + + false + - 581 - 500 + 552 + 390 10 10 @@ -4774,7 +4798,7 @@ - 01_08 + 01_04 background-color: rgb(0, 85, 255); @@ -4783,11 +4807,14 @@ - + + + false + - 571 - 528 + 569 + 414 10 10 @@ -5235,7 +5262,7 @@ - 01_09 + 01_05 background-color: rgb(0, 85, 255); @@ -5244,11 +5271,14 @@ - + + + false + - 552 - 552 + 580 + 442 10 10 @@ -5696,7 +5726,7 @@ - 01_10 + 01_06 background-color: rgb(0, 85, 255); @@ -5705,11 +5735,14 @@ - + + + false + - 528 - 570 + 584 + 471 10 10 @@ -6157,7 +6190,7 @@ - 01_11 + 01_07 background-color: rgb(0, 85, 255); @@ -6166,11 +6199,14 @@ - + + + false + - 500 - 581 + 581 + 500 10 10 @@ -6618,7 +6654,7 @@ - 01_12 + 01_08 background-color: rgb(0, 85, 255); @@ -6627,11 +6663,14 @@ - + + + false + - 470 - 585 + 571 + 528 10 10 @@ -7079,7 +7118,7 @@ - 01_13 + 01_09 background-color: rgb(0, 85, 255); @@ -7088,11 +7127,14 @@ - + + + false + - 441 - 581 + 552 + 552 10 10 @@ -7540,7 +7582,7 @@ - 01_14 + 01_10 background-color: rgb(0, 85, 255); @@ -7549,10 +7591,13 @@ - + + + false + - 413 + 528 570 10 10 @@ -8001,7 +8046,7 @@ - 01_15 + 01_11 background-color: rgb(0, 85, 255); @@ -8010,11 +8055,14 @@ - + + + false + - 390 - 552 + 500 + 581 10 10 @@ -8462,7 +8510,7 @@ - 01_16 + 01_12 background-color: rgb(0, 85, 255); @@ -8471,11 +8519,14 @@ - + + + false + - 372 - 528 + 470 + 585 10 10 @@ -8923,7 +8974,7 @@ - 01_17 + 01_13 background-color: rgb(0, 85, 255); @@ -8932,11 +8983,14 @@ - + + + false + - 362 - 500 + 441 + 581 10 10 @@ -9384,7 +9438,7 @@ - 01_18 + 01_14 background-color: rgb(0, 85, 255); @@ -9393,11 +9447,14 @@ - + + + false + - 357 - 471 + 413 + 570 10 10 @@ -9845,7 +9902,7 @@ - 01_19 + 01_15 background-color: rgb(0, 85, 255); @@ -9854,11 +9911,14 @@ - + + + false + - 361 - 442 + 390 + 552 10 10 @@ -10306,7 +10366,7 @@ - 01_20 + 01_16 background-color: rgb(0, 85, 255); @@ -10315,11 +10375,14 @@ - + + + false + - 371 - 413 + 372 + 528 10 10 @@ -10767,7 +10830,7 @@ - 01_21 + 01_17 background-color: rgb(0, 85, 255); @@ -10776,11 +10839,14 @@ - + + + false + - 390 - 391 + 362 + 500 10 10 @@ -11228,7 +11294,7 @@ - 01_22 + 01_18 background-color: rgb(0, 85, 255); @@ -11237,11 +11303,14 @@ - + + + false + - 414 - 373 + 357 + 471 10 10 @@ -11689,7 +11758,7 @@ - 01_23 + 01_19 background-color: rgb(0, 85, 255); @@ -11698,11 +11767,14 @@ - + + + false + - 442 - 361 + 361 + 442 10 10 @@ -12150,7 +12222,7 @@ - 01_24 + 01_20 background-color: rgb(0, 85, 255); @@ -12159,11 +12231,14 @@ - + + + false + - 471 - 298 + 371 + 413 10 10 @@ -12611,7 +12686,7 @@ - 02_01 + 01_21 background-color: rgb(0, 85, 255); @@ -12620,11 +12695,14 @@ - + + + false + - 494 - 300 + 390 + 391 10 10 @@ -13072,7 +13150,7 @@ - 02_02 + 01_22 background-color: rgb(0, 85, 255); @@ -13081,11 +13159,14 @@ - + + + false + - 516 - 304 + 414 + 373 10 10 @@ -13533,7 +13614,7 @@ - 02_03 + 01_23 background-color: rgb(0, 85, 255); @@ -13542,11 +13623,14 @@ - + + + false + - 537 - 312 + 442 + 361 10 10 @@ -13994,7 +14078,7 @@ - 02_04 + 01_24 background-color: rgb(0, 85, 255); @@ -14003,11 +14087,11 @@ - + - 557 - 321 + 471 + 298 10 10 @@ -14455,7 +14539,7 @@ - 02_05 + 02_01 background-color: rgb(0, 85, 255); @@ -14464,11 +14548,11 @@ - + - 576 - 334 + 494 + 300 10 10 @@ -14916,7 +15000,7 @@ - 02_06 + 02_02 background-color: rgb(0, 85, 255); @@ -14925,11 +15009,11 @@ - + - 594 - 349 + 516 + 304 10 10 @@ -15377,7 +15461,7 @@ - 02_07 + 02_03 background-color: rgb(0, 85, 255); @@ -15386,11 +15470,11 @@ - + - 607 - 365 + 537 + 312 10 10 @@ -15838,7 +15922,7 @@ - 02_08 + 02_04 background-color: rgb(0, 85, 255); @@ -15847,11 +15931,11 @@ - + - 620 - 385 + 557 + 321 10 10 @@ -16299,7 +16383,7 @@ - 02_09 + 02_05 background-color: rgb(0, 85, 255); @@ -16308,11 +16392,11 @@ - + - 630 - 405 + 576 + 334 10 10 @@ -16760,7 +16844,7 @@ - 02_10 + 02_06 background-color: rgb(0, 85, 255); @@ -16769,11 +16853,11 @@ - + - 637 - 426 + 594 + 349 10 10 @@ -17221,7 +17305,7 @@ - 02_11 + 02_07 background-color: rgb(0, 85, 255); @@ -17230,11 +17314,11 @@ - + - 642 - 448 + 607 + 365 10 10 @@ -17682,7 +17766,7 @@ - 02_12 + 02_08 background-color: rgb(0, 85, 255); @@ -17691,11 +17775,11 @@ - + - 643 - 472 + 620 + 385 10 10 @@ -18143,7 +18227,7 @@ - 02_13 + 02_09 background-color: rgb(0, 85, 255); @@ -18152,11 +18236,11 @@ - + - 642 - 494 + 630 + 405 10 10 @@ -18604,7 +18688,7 @@ - 02_14 + 02_10 background-color: rgb(0, 85, 255); @@ -18613,11 +18697,11 @@ - + - 638 - 516 + 637 + 426 10 10 @@ -19065,7 +19149,7 @@ - 02_15 + 02_11 background-color: rgb(0, 85, 255); @@ -19074,11 +19158,11 @@ - + - 630 - 537 + 642 + 448 10 10 @@ -19526,7 +19610,7 @@ - 02_16 + 02_12 background-color: rgb(0, 85, 255); @@ -19535,11 +19619,11 @@ - + - 620 - 557 + 643 + 472 10 10 @@ -19987,7 +20071,7 @@ - 02_17 + 02_13 background-color: rgb(0, 85, 255); @@ -19996,11 +20080,11 @@ - + - 608 - 576 + 642 + 494 10 10 @@ -20448,7 +20532,7 @@ - 02_18 + 02_14 background-color: rgb(0, 85, 255); @@ -20457,11 +20541,11 @@ - + - 593 - 593 + 638 + 516 10 10 @@ -20909,7 +20993,7 @@ - 02_19 + 02_15 background-color: rgb(0, 85, 255); @@ -20918,11 +21002,11 @@ - + - 576 - 607 + 630 + 537 10 10 @@ -21370,7 +21454,7 @@ - 02_20 + 02_16 background-color: rgb(0, 85, 255); @@ -21379,11 +21463,11 @@ - + - 557 - 620 + 620 + 557 10 10 @@ -21831,7 +21915,7 @@ - 02_21 + 02_17 background-color: rgb(0, 85, 255); @@ -21840,11 +21924,11 @@ - + - 536 - 630 + 608 + 576 10 10 @@ -22292,7 +22376,7 @@ - 02_22 + 02_18 background-color: rgb(0, 85, 255); @@ -22301,11 +22385,11 @@ - + - 515 - 637 + 593 + 593 10 10 @@ -22753,7 +22837,7 @@ - 02_23 + 02_19 background-color: rgb(0, 85, 255); @@ -22762,11 +22846,11 @@ - + - 493 - 642 + 576 + 607 10 10 @@ -23214,7 +23298,7 @@ - 02_24 + 02_20 background-color: rgb(0, 85, 255); @@ -23223,11 +23307,11 @@ - + - 471 - 644 + 557 + 620 10 10 @@ -23675,7 +23759,7 @@ - 02_25 + 02_21 background-color: rgb(0, 85, 255); @@ -23684,11 +23768,11 @@ - + - 449 - 642 + 536 + 630 10 10 @@ -24136,7 +24220,7 @@ - 02_26 + 02_22 background-color: rgb(0, 85, 255); @@ -24145,10 +24229,10 @@ - + - 427 + 515 637 10 10 @@ -24597,7 +24681,7 @@ - 02_27 + 02_23 background-color: rgb(0, 85, 255); @@ -24606,11 +24690,11 @@ - + - 405 - 631 + 493 + 642 10 10 @@ -25058,7 +25142,7 @@ - 02_28 + 02_24 background-color: rgb(0, 85, 255); @@ -25067,11 +25151,11 @@ - + - 385 - 620 + 471 + 644 10 10 @@ -25519,7 +25603,7 @@ - 02_29 + 02_25 background-color: rgb(0, 85, 255); @@ -25528,11 +25612,11 @@ - + - 365 - 607 + 449 + 642 10 10 @@ -25980,7 +26064,7 @@ - 02_30 + 02_26 background-color: rgb(0, 85, 255); @@ -25989,11 +26073,11 @@ - + - 349 - 592 + 427 + 637 10 10 @@ -26441,7 +26525,7 @@ - 02_31 + 02_27 background-color: rgb(0, 85, 255); @@ -26450,11 +26534,11 @@ - + - 333 - 576 + 405 + 631 10 10 @@ -26902,7 +26986,7 @@ - 02_32 + 02_28 background-color: rgb(0, 85, 255); @@ -26911,11 +26995,11 @@ - + - 321 - 557 + 385 + 620 10 10 @@ -27363,7 +27447,7 @@ - 02_33 + 02_29 background-color: rgb(0, 85, 255); @@ -27372,11 +27456,11 @@ - + - 312 - 536 + 365 + 607 10 10 @@ -27824,7 +27908,7 @@ - 02_34 + 02_30 background-color: rgb(0, 85, 255); @@ -27833,11 +27917,11 @@ - + - 304 - 515 + 349 + 592 10 10 @@ -28285,7 +28369,7 @@ - 02_35 + 02_31 background-color: rgb(0, 85, 255); @@ -28294,11 +28378,11 @@ - + - 300 - 493 + 333 + 576 10 10 @@ -28746,7 +28830,7 @@ - 02_36 + 02_32 background-color: rgb(0, 85, 255); @@ -28755,11 +28839,11 @@ - + - 299 - 471 + 321 + 557 10 10 @@ -29207,7 +29291,7 @@ - 02_37 + 02_33 background-color: rgb(0, 85, 255); @@ -29216,11 +29300,11 @@ - + - 300 - 449 + 312 + 536 10 10 @@ -29668,7 +29752,7 @@ - 02_38 + 02_34 background-color: rgb(0, 85, 255); @@ -29677,11 +29761,11 @@ - + 304 - 427 + 515 10 10 @@ -30129,7 +30213,7 @@ - 02_39 + 02_35 background-color: rgb(0, 85, 255); @@ -30138,11 +30222,11 @@ - + - 312 - 405 + 300 + 493 10 10 @@ -30590,7 +30674,7 @@ - 02_40 + 02_36 background-color: rgb(0, 85, 255); @@ -30599,11 +30683,11 @@ - + - 321 - 385 + 299 + 471 10 10 @@ -31051,7 +31135,7 @@ - 02_41 + 02_37 background-color: rgb(0, 85, 255); @@ -31060,11 +31144,11 @@ - + - 334 - 366 + 300 + 449 10 10 @@ -31512,7 +31596,7 @@ - 02_42 + 02_38 background-color: rgb(0, 85, 255); @@ -31521,11 +31605,11 @@ - + - 349 - 350 + 304 + 427 10 10 @@ -31973,7 +32057,7 @@ - 02_43 + 02_39 background-color: rgb(0, 85, 255); @@ -31982,11 +32066,11 @@ - + - 366 - 334 + 312 + 405 10 10 @@ -32434,7 +32518,7 @@ - 02_44 + 02_40 background-color: rgb(0, 85, 255); @@ -32443,11 +32527,11 @@ - + - 384 - 322 + 321 + 385 10 10 @@ -32895,7 +32979,7 @@ - 02_45 + 02_41 background-color: rgb(0, 85, 255); @@ -32904,11 +32988,11 @@ - + - 404 - 311 + 334 + 366 10 10 @@ -33356,7 +33440,7 @@ - 02_46 + 02_42 background-color: rgb(0, 85, 255); @@ -33365,11 +33449,11 @@ - + - 427 - 305 + 349 + 350 10 10 @@ -33817,7 +33901,7 @@ - 02_47 + 02_43 background-color: rgb(0, 85, 255); @@ -33826,11 +33910,11 @@ - + - 448 - 300 + 366 + 334 10 10 @@ -34278,7 +34362,7 @@ - 02_48 + 02_44 background-color: rgb(0, 85, 255); @@ -34287,11 +34371,11 @@ - + - 471 - 239 + 384 + 322 10 10 @@ -34739,7 +34823,7 @@ - 03_01 + 02_45 background-color: rgb(0, 85, 255); @@ -34748,11 +34832,11 @@ - + - 502 - 241 + 404 + 311 10 10 @@ -35200,7 +35284,7 @@ - 03_02 + 02_46 background-color: rgb(0, 85, 255); @@ -35209,11 +35293,11 @@ - + - 532 - 248 + 427 + 305 10 10 @@ -35661,7 +35745,7 @@ - 03_03 + 02_47 background-color: rgb(0, 85, 255); @@ -35670,11 +35754,11 @@ - + - 560 - 257 + 448 + 300 10 10 @@ -36122,7 +36206,7 @@ - 03_04 + 02_48 background-color: rgb(0, 85, 255); @@ -36131,11 +36215,11 @@ - + - 588 - 270 + 471 + 239 10 10 @@ -36583,7 +36667,7 @@ - 03_05 + 03_01 background-color: rgb(0, 85, 255); @@ -36592,11 +36676,11 @@ - + - 612 - 288 + 502 + 241 10 10 @@ -37044,7 +37128,7 @@ - 03_06 + 03_02 background-color: rgb(0, 85, 255); @@ -37053,11 +37137,11 @@ - + - 635 - 307 + 532 + 248 10 10 @@ -37505,7 +37589,7 @@ - 03_07 + 03_03 background-color: rgb(0, 85, 255); @@ -37514,11 +37598,11 @@ - + - 654 - 330 + 560 + 257 10 10 @@ -37966,7 +38050,7 @@ - 03_08 + 03_04 background-color: rgb(0, 85, 255); @@ -37975,11 +38059,11 @@ - + - 672 - 355 + 588 + 270 10 10 @@ -38427,7 +38511,7 @@ - 03_09 + 03_05 background-color: rgb(0, 85, 255); @@ -38436,11 +38520,11 @@ - + - 685 - 382 + 612 + 288 10 10 @@ -38888,7 +38972,7 @@ - 03_10 + 03_06 background-color: rgb(0, 85, 255); @@ -38897,11 +38981,11 @@ - + - 695 - 411 + 635 + 307 10 10 @@ -39349,7 +39433,7 @@ - 03_11 + 03_07 background-color: rgb(0, 85, 255); @@ -39358,11 +39442,11 @@ - + - 701 - 441 + 654 + 330 10 10 @@ -39810,7 +39894,7 @@ - 03_12 + 03_08 background-color: rgb(0, 85, 255); @@ -39819,11 +39903,11 @@ - + - 703 - 471 + 672 + 355 10 10 @@ -40271,7 +40355,7 @@ - 03_13 + 03_09 background-color: rgb(0, 85, 255); @@ -40280,11 +40364,11 @@ - + - 701 - 502 + 685 + 382 10 10 @@ -40732,7 +40816,7 @@ - 03_14 + 03_10 background-color: rgb(0, 85, 255); @@ -40741,11 +40825,11 @@ - + 695 - 532 + 411 10 10 @@ -41193,7 +41277,7 @@ - 03_15 + 03_11 background-color: rgb(0, 85, 255); @@ -41202,11 +41286,11 @@ - + - 685 - 560 + 701 + 441 10 10 @@ -41654,7 +41738,7 @@ - 03_16 + 03_12 background-color: rgb(0, 85, 255); @@ -41663,11 +41747,11 @@ - + - 672 - 588 + 703 + 471 10 10 @@ -42115,7 +42199,7 @@ - 03_17 + 03_13 background-color: rgb(0, 85, 255); @@ -42124,11 +42208,11 @@ - + - 655 - 613 + 701 + 502 10 10 @@ -42576,7 +42660,7 @@ - 03_18 + 03_14 background-color: rgb(0, 85, 255); @@ -42585,11 +42669,11 @@ - + - 635 - 636 + 695 + 532 10 10 @@ -43037,7 +43121,7 @@ - 03_19 + 03_15 background-color: rgb(0, 85, 255); @@ -43046,11 +43130,11 @@ - + - 612 - 656 + 685 + 560 10 10 @@ -43498,7 +43582,7 @@ - 03_20 + 03_16 background-color: rgb(0, 85, 255); @@ -43507,11 +43591,11 @@ - + - 587 - 673 + 672 + 588 10 10 @@ -43959,7 +44043,7 @@ - 03_21 + 03_17 background-color: rgb(0, 85, 255); @@ -43968,11 +44052,11 @@ - + - 560 - 687 + 655 + 613 10 10 @@ -44420,7 +44504,7 @@ - 03_22 + 03_18 background-color: rgb(0, 85, 255); @@ -44429,11 +44513,11 @@ - + - 531 - 696 + 635 + 636 10 10 @@ -44881,7 +44965,7 @@ - 03_23 + 03_19 background-color: rgb(0, 85, 255); @@ -44890,11 +44974,11 @@ - + - 501 - 701 + 612 + 656 10 10 @@ -45342,7 +45426,7 @@ - 03_24 + 03_20 background-color: rgb(0, 85, 255); @@ -45351,11 +45435,11 @@ - + - 471 - 704 + 587 + 673 10 10 @@ -45803,7 +45887,7 @@ - 03_25 + 03_21 background-color: rgb(0, 85, 255); @@ -45812,11 +45896,11 @@ - + - 440 - 702 + 560 + 687 10 10 @@ -46264,7 +46348,7 @@ - 03_26 + 03_22 background-color: rgb(0, 85, 255); @@ -46273,11 +46357,11 @@ - + - 410 - 695 + 531 + 696 10 10 @@ -46725,7 +46809,7 @@ - 03_27 + 03_23 background-color: rgb(0, 85, 255); @@ -46734,11 +46818,11 @@ - + - 382 - 686 + 501 + 701 10 10 @@ -47186,7 +47270,7 @@ - 03_28 + 03_24 background-color: rgb(0, 85, 255); @@ -47195,11 +47279,11 @@ - + - 354 - 672 + 471 + 704 10 10 @@ -47647,7 +47731,7 @@ - 03_29 + 03_25 background-color: rgb(0, 85, 255); @@ -47656,11 +47740,11 @@ - + - 329 - 656 + 440 + 702 10 10 @@ -48108,7 +48192,7 @@ - 03_30 + 03_26 background-color: rgb(0, 85, 255); @@ -48117,11 +48201,11 @@ - + - 306 - 635 + 410 + 695 10 10 @@ -48569,7 +48653,7 @@ - 03_31 + 03_27 background-color: rgb(0, 85, 255); @@ -48578,11 +48662,11 @@ - + - 286 - 613 + 382 + 686 10 10 @@ -49030,7 +49114,7 @@ - 03_32 + 03_28 background-color: rgb(0, 85, 255); @@ -49039,11 +49123,11 @@ - + - 269 - 587 + 354 + 672 10 10 @@ -49491,7 +49575,7 @@ - 03_33 + 03_29 background-color: rgb(0, 85, 255); @@ -49500,11 +49584,11 @@ - + - 257 - 559 + 329 + 656 10 10 @@ -49952,7 +50036,7 @@ - 03_34 + 03_30 background-color: rgb(0, 85, 255); @@ -49961,11 +50045,11 @@ - + - 247 - 531 + 306 + 635 10 10 @@ -50413,7 +50497,7 @@ - 03_35 + 03_31 background-color: rgb(0, 85, 255); @@ -50422,11 +50506,11 @@ - + - 240 - 501 + 286 + 613 10 10 @@ -50874,7 +50958,7 @@ - 03_36 + 03_32 background-color: rgb(0, 85, 255); @@ -50883,11 +50967,11 @@ - + - 238 - 471 + 269 + 587 10 10 @@ -51335,7 +51419,7 @@ - 03_37 + 03_33 background-color: rgb(0, 85, 255); @@ -51344,11 +51428,11 @@ - + - 240 - 441 + 257 + 559 10 10 @@ -51796,7 +51880,7 @@ - 03_38 + 03_34 background-color: rgb(0, 85, 255); @@ -51805,11 +51889,11 @@ - + - 246 - 411 + 247 + 531 10 10 @@ -52257,7 +52341,7 @@ - 03_39 + 03_35 background-color: rgb(0, 85, 255); @@ -52266,11 +52350,11 @@ - + - 256 - 383 + 240 + 501 10 10 @@ -52718,7 +52802,7 @@ - 03_40 + 03_36 background-color: rgb(0, 85, 255); @@ -52727,11 +52811,11 @@ - + - 269 - 355 + 238 + 471 10 10 @@ -53179,7 +53263,7 @@ - 03_41 + 03_37 background-color: rgb(0, 85, 255); @@ -53188,11 +53272,11 @@ - + - 287 - 330 + 240 + 441 10 10 @@ -53640,7 +53724,7 @@ - 03_42 + 03_38 background-color: rgb(0, 85, 255); @@ -53649,11 +53733,11 @@ - + - 306 - 307 + 246 + 411 10 10 @@ -54101,7 +54185,7 @@ - 03_43 + 03_39 background-color: rgb(0, 85, 255); @@ -54110,11 +54194,11 @@ - + - 329 - 287 + 256 + 383 10 10 @@ -54562,7 +54646,7 @@ - 03_44 + 03_40 background-color: rgb(0, 85, 255); @@ -54571,11 +54655,11 @@ - + - 354 - 270 + 269 + 355 10 10 @@ -55023,7 +55107,7 @@ - 03_45 + 03_41 background-color: rgb(0, 85, 255); @@ -55032,11 +55116,11 @@ - + - 382 - 257 + 287 + 330 10 10 @@ -55484,7 +55568,7 @@ - 03_46 + 03_42 background-color: rgb(0, 85, 255); @@ -55493,11 +55577,11 @@ - + - 410 - 247 + 306 + 307 10 10 @@ -55945,7 +56029,7 @@ - 03_47 + 03_43 background-color: rgb(0, 85, 255); @@ -55954,11 +56038,11 @@ - + - 440 - 241 + 329 + 287 10 10 @@ -56406,7 +56490,7 @@ - 03_48 + 03_44 background-color: rgb(0, 85, 255); @@ -56415,11 +56499,11 @@ - + - 509 - 183 + 354 + 270 10 10 @@ -56867,7 +56951,7 @@ - 04_02 + 03_45 background-color: rgb(0, 85, 255); @@ -56876,11 +56960,11 @@ - + - 546 - 190 + 382 + 257 10 10 @@ -57328,7 +57412,7 @@ - 04_03 + 03_46 background-color: rgb(0, 85, 255); @@ -57337,11 +57421,11 @@ - + - 582 - 202 + 410 + 247 10 10 @@ -57789,7 +57873,7 @@ - 04_04 + 03_47 background-color: rgb(0, 85, 255); @@ -57798,11 +57882,11 @@ - + - 616 - 220 + 440 + 241 10 10 @@ -58250,7 +58334,7 @@ - 04_05 + 03_48 background-color: rgb(0, 85, 255); @@ -58259,11 +58343,11 @@ - + - 677 - 265 + 509 + 183 10 10 @@ -58711,7 +58795,7 @@ - 04_07 + 04_02 background-color: rgb(0, 85, 255); @@ -58720,11 +58804,11 @@ - + - 723 - 326 + 546 + 190 10 10 @@ -59172,7 +59256,7 @@ - 04_09 + 04_03 background-color: rgb(0, 85, 255); @@ -59181,11 +59265,11 @@ - + - 740 - 360 + 582 + 202 10 10 @@ -59633,7 +59717,7 @@ - 04_10 + 04_04 background-color: rgb(0, 85, 255); @@ -59642,11 +59726,11 @@ - + - 752 - 395 + 616 + 220 10 10 @@ -60094,7 +60178,7 @@ - 04_11 + 04_05 background-color: rgb(0, 85, 255); @@ -60103,11 +60187,11 @@ - + - 759 - 433 + 677 + 265 10 10 @@ -60555,7 +60639,7 @@ - 04_12 + 04_07 background-color: rgb(0, 85, 255); @@ -60564,11 +60648,11 @@ - + - 762 - 471 + 723 + 326 10 10 @@ -61016,7 +61100,7 @@ - 04_13 + 04_09 background-color: rgb(0, 85, 255); @@ -61025,11 +61109,11 @@ - + - 760 - 509 + 740 + 360 10 10 @@ -61477,7 +61561,7 @@ - 04_14 + 04_10 background-color: rgb(0, 85, 255); @@ -61486,11 +61570,11 @@ - + 752 - 547 + 395 10 10 @@ -61938,7 +62022,7 @@ - 04_15 + 04_11 background-color: rgb(0, 85, 255); @@ -61947,11 +62031,11 @@ - + - 740 - 582 + 759 + 433 10 10 @@ -62399,7 +62483,7 @@ - 04_16 + 04_12 background-color: rgb(0, 85, 255); @@ -62408,11 +62492,11 @@ - + - 723 - 616 + 762 + 471 10 10 @@ -62860,7 +62944,7 @@ - 04_17 + 04_13 background-color: rgb(0, 85, 255); @@ -62869,11 +62953,11 @@ - + - 677 - 677 + 760 + 509 10 10 @@ -63321,7 +63405,7 @@ - 04_19 + 04_14 background-color: rgb(0, 85, 255); @@ -63330,11 +63414,11 @@ - + - 616 - 724 + 752 + 547 10 10 @@ -63782,7 +63866,7 @@ - 04_21 + 04_15 background-color: rgb(0, 85, 255); @@ -63791,11 +63875,11 @@ - + - 583 - 740 + 740 + 582 10 10 @@ -64243,7 +64327,7 @@ - 04_22 + 04_16 background-color: rgb(0, 85, 255); @@ -64252,11 +64336,11 @@ - + - 546 - 753 + 723 + 616 10 10 @@ -64704,7 +64788,7 @@ - 04_23 + 04_17 background-color: rgb(0, 85, 255); @@ -64713,11 +64797,11 @@ - + - 508 - 760 + 677 + 677 10 10 @@ -65165,7 +65249,7 @@ - 04_24 + 04_19 background-color: rgb(0, 85, 255); @@ -65174,11 +65258,11 @@ - + - 470 - 763 + 616 + 724 10 10 @@ -65626,7 +65710,7 @@ - 04_25 + 04_21 background-color: rgb(0, 85, 255); @@ -65635,11 +65719,11 @@ - + - 433 - 760 + 583 + 740 10 10 @@ -66087,7 +66171,7 @@ - 04_26 + 04_22 background-color: rgb(0, 85, 255); @@ -66096,10 +66180,10 @@ - + - 395 + 546 753 10 10 @@ -66548,7 +66632,7 @@ - 04_27 + 04_23 background-color: rgb(0, 85, 255); @@ -66557,11 +66641,11 @@ - + - 359 - 741 + 508 + 760 10 10 @@ -67009,7 +67093,7 @@ - 04_28 + 04_24 background-color: rgb(0, 85, 255); @@ -67018,11 +67102,11 @@ - + - 325 - 723 + 470 + 763 10 10 @@ -67470,7 +67554,7 @@ - 04_29 + 04_25 background-color: rgb(0, 85, 255); @@ -67479,11 +67563,11 @@ - + - 264 - 677 + 433 + 760 10 10 @@ -67931,7 +68015,7 @@ - 04_31 + 04_26 background-color: rgb(0, 85, 255); @@ -67940,11 +68024,11 @@ - + - 218 - 616 + 395 + 753 10 10 @@ -68392,7 +68476,7 @@ - 04_33 + 04_27 background-color: rgb(0, 85, 255); @@ -68401,11 +68485,11 @@ - + - 201 - 582 + 359 + 741 10 10 @@ -68853,7 +68937,7 @@ - 04_34 + 04_28 background-color: rgb(0, 85, 255); @@ -68862,11 +68946,11 @@ - + - 189 - 546 + 325 + 723 10 10 @@ -69314,7 +69398,7 @@ - 04_35 + 04_29 background-color: rgb(0, 85, 255); @@ -69323,11 +69407,11 @@ - + - 182 - 509 + 264 + 677 10 10 @@ -69775,7 +69859,7 @@ - 04_36 + 04_31 background-color: rgb(0, 85, 255); @@ -69784,11 +69868,11 @@ - + - 179 - 471 + 218 + 616 10 10 @@ -70236,7 +70320,7 @@ - 04_37 + 04_33 background-color: rgb(0, 85, 255); @@ -70245,11 +70329,11 @@ - + - 181 - 433 + 201 + 582 10 10 @@ -70697,7 +70781,7 @@ - 04_38 + 04_34 background-color: rgb(0, 85, 255); @@ -70706,11 +70790,11 @@ - + 189 - 396 + 546 10 10 @@ -71158,7 +71242,7 @@ - 04_39 + 04_35 background-color: rgb(0, 85, 255); @@ -71167,11 +71251,11 @@ - + - 201 - 360 + 182 + 509 10 10 @@ -71619,7 +71703,7 @@ - 04_40 + 04_36 background-color: rgb(0, 85, 255); @@ -71628,11 +71712,11 @@ - + - 218 - 325 + 179 + 471 10 10 @@ -72080,7 +72164,7 @@ - 04_41 + 04_37 background-color: rgb(0, 85, 255); @@ -72089,11 +72173,11 @@ - + - 264 - 265 + 181 + 433 10 10 @@ -72541,7 +72625,7 @@ - 04_43 + 04_38 background-color: rgb(0, 85, 255); @@ -72550,11 +72634,11 @@ - + - 325 - 219 + 189 + 396 10 10 @@ -73002,7 +73086,7 @@ - 04_45 + 04_39 background-color: rgb(0, 85, 255); @@ -73011,11 +73095,11 @@ - + - 359 - 202 + 201 + 360 10 10 @@ -73463,7 +73547,7 @@ - 04_46 + 04_40 background-color: rgb(0, 85, 255); @@ -73472,11 +73556,11 @@ - + - 395 - 189 + 218 + 325 10 10 @@ -73924,7 +74008,7 @@ - 04_47 + 04_41 background-color: rgb(0, 85, 255); @@ -73933,11 +74017,11 @@ - + - 433 - 182 + 264 + 265 10 10 @@ -74385,7 +74469,7 @@ - 04_48 + 04_43 background-color: rgb(0, 85, 255); @@ -74394,13 +74478,13 @@ - + - 468 - 370 - 20 - 15 + 325 + 219 + 10 + 10 @@ -74845,28 +74929,23 @@ - - - 8 - - - Controls actuators in 1 circle + 04_45 background-color: rgb(0, 85, 255); - C1 + - + - 470 - 310 - 20 - 15 + 359 + 202 + 10 + 10 @@ -75311,28 +75390,23 @@ - - - 8 - - - Controls actuators in 2 circle + 04_46 background-color: rgb(0, 85, 255); - C2 + - + - 470 - 252 - 20 - 15 + 395 + 189 + 10 + 10 @@ -75777,26 +75851,21 @@ - - - 8 - - - Controls actuators in 3 circle + 04_47 background-color: rgb(0, 85, 255); - C3 + - + - 471 - 129 + 433 + 182 10 10 @@ -76244,7 +76313,7 @@ - 05_01 + 04_48 background-color: rgb(0, 85, 255); @@ -76253,13 +76322,13 @@ - + - 516 - 132 - 10 - 10 + 468 + 370 + 20 + 15 @@ -76704,23 +76773,28 @@ + + + 8 + + - 05_02 + Controls actuators in 1 circle background-color: rgb(0, 85, 255); - + C1 - + - 559 - 142 - 10 - 10 + 470 + 310 + 20 + 15 @@ -77165,23 +77239,28 @@ + + + 8 + + - 05_03 + Controls actuators in 2 circle background-color: rgb(0, 85, 255); - + C2 - + - 602 - 155 - 10 - 10 + 470 + 252 + 20 + 15 @@ -77626,21 +77705,26 @@ + + + 8 + + - 05_04 + Controls actuators in 3 circle background-color: rgb(0, 85, 255); - + C3 - + - 642 - 175 + 471 + 129 10 10 @@ -78088,7 +78172,7 @@ - 05_05 + 05_01 background-color: rgb(0, 85, 255); @@ -78097,11 +78181,11 @@ - + - 680 - 200 + 516 + 132 10 10 @@ -78549,7 +78633,7 @@ - 11_11 + 05_02 background-color: rgb(0, 85, 255); @@ -78558,11 +78642,11 @@ - + - 743 - 264 + 559 + 142 10 10 @@ -79010,7 +79094,7 @@ - 05_08 + 05_03 background-color: rgb(0, 85, 255); @@ -79019,11 +79103,11 @@ - + - 767 - 300 + 602 + 155 10 10 @@ -79471,7 +79555,7 @@ - 05_09 + 05_04 background-color: rgb(0, 85, 255); @@ -79480,11 +79564,11 @@ - + - 787 - 340 + 642 + 175 10 10 @@ -79932,7 +80016,7 @@ - 05_10 + 05_05 background-color: rgb(0, 85, 255); @@ -79941,11 +80025,11 @@ - + - 801 - 383 + 680 + 200 10 10 @@ -80393,7 +80477,7 @@ - 05_11 + 11_11 background-color: rgb(0, 85, 255); @@ -80402,11 +80486,11 @@ - + - 810 - 426 + 743 + 264 10 10 @@ -80854,7 +80938,7 @@ - 05_12 + 05_08 background-color: rgb(0, 85, 255); @@ -80863,11 +80947,11 @@ - + - 813 - 471 + 767 + 300 10 10 @@ -81315,7 +81399,7 @@ - 05_13 + 05_09 background-color: rgb(0, 85, 255); @@ -81324,11 +81408,11 @@ - + - 810 - 516 + 787 + 340 10 10 @@ -81776,7 +81860,7 @@ - 05_14 + 05_10 background-color: rgb(0, 85, 255); @@ -81785,11 +81869,11 @@ - + 801 - 560 + 383 10 10 @@ -82237,7 +82321,7 @@ - 05_15 + 05_11 background-color: rgb(0, 85, 255); @@ -82246,11 +82330,11 @@ - + - 787 - 602 + 810 + 426 10 10 @@ -82698,7 +82782,7 @@ - 05_16 + 05_12 background-color: rgb(0, 85, 255); @@ -82707,11 +82791,11 @@ - + - 767 - 642 + 813 + 471 10 10 @@ -83159,7 +83243,7 @@ - 05_17 + 05_13 background-color: rgb(0, 85, 255); @@ -83168,11 +83252,11 @@ - + - 742 - 679 + 810 + 516 10 10 @@ -83620,7 +83704,7 @@ - 05_18 + 05_14 background-color: rgb(0, 85, 255); @@ -83629,11 +83713,11 @@ - + - 679 - 743 + 801 + 560 10 10 @@ -84081,7 +84165,7 @@ - 05_20 + 05_15 background-color: rgb(0, 85, 255); @@ -84090,11 +84174,11 @@ - + - 642 - 768 + 787 + 602 10 10 @@ -84542,7 +84626,7 @@ - 05_21 + 05_16 background-color: rgb(0, 85, 255); @@ -84551,11 +84635,11 @@ - + - 602 - 788 + 767 + 642 10 10 @@ -85003,7 +85087,7 @@ - 05_22 + 05_17 background-color: rgb(0, 85, 255); @@ -85012,11 +85096,11 @@ - + - 559 - 801 + 742 + 679 10 10 @@ -85464,7 +85548,7 @@ - 05_23 + 05_18 background-color: rgb(0, 85, 255); @@ -85473,11 +85557,11 @@ - + - 516 - 811 + 679 + 743 10 10 @@ -85925,7 +86009,7 @@ - 05_24 + 05_20 background-color: rgb(0, 85, 255); @@ -85934,11 +86018,11 @@ - + - 471 - 813 + 642 + 768 10 10 @@ -86386,7 +86470,7 @@ - 05_25 + 05_21 background-color: rgb(0, 85, 255); @@ -86395,11 +86479,11 @@ - + - 426 - 811 + 602 + 788 10 10 @@ -86847,7 +86931,7 @@ - 05_26 + 05_22 background-color: rgb(0, 85, 255); @@ -86856,11 +86940,11 @@ - + - 382 - 802 + 559 + 801 10 10 @@ -87308,7 +87392,7 @@ - 05_27 + 05_23 background-color: rgb(0, 85, 255); @@ -87317,11 +87401,11 @@ - + - 339 - 787 + 516 + 811 10 10 @@ -87769,7 +87853,7 @@ - 05_28 + 05_24 background-color: rgb(0, 85, 255); @@ -87778,11 +87862,11 @@ - + - 299 - 767 + 471 + 813 10 10 @@ -88230,7 +88314,7 @@ - 05_29 + 05_25 background-color: rgb(0, 85, 255); @@ -88239,11 +88323,11 @@ - + - 262 - 743 + 426 + 811 10 10 @@ -88691,7 +88775,7 @@ - 05_30 + 05_26 background-color: rgb(0, 85, 255); @@ -88700,11 +88784,11 @@ - + - 198 - 679 + 382 + 802 10 10 @@ -89152,7 +89236,7 @@ - 05_32 + 05_27 background-color: rgb(0, 85, 255); @@ -89161,11 +89245,11 @@ - + - 173 - 642 + 339 + 787 10 10 @@ -89613,7 +89697,7 @@ - 05_33 + 05_28 background-color: rgb(0, 85, 255); @@ -89622,11 +89706,11 @@ - + - 154 - 602 + 299 + 767 10 10 @@ -90074,7 +90158,7 @@ - 05_34 + 05_29 background-color: rgb(0, 85, 255); @@ -90083,11 +90167,11 @@ - + - 140 - 559 + 262 + 743 10 10 @@ -90535,7 +90619,7 @@ - 05_35 + 05_30 background-color: rgb(0, 85, 255); @@ -90544,11 +90628,11 @@ - + - 131 - 516 + 198 + 679 10 10 @@ -90996,7 +91080,7 @@ - 05_36 + 05_32 background-color: rgb(0, 85, 255); @@ -91005,11 +91089,11 @@ - + - 128 - 471 + 173 + 642 10 10 @@ -91457,7 +91541,7 @@ - 05_37 + 05_33 background-color: rgb(0, 85, 255); @@ -91466,11 +91550,11 @@ - + - 131 - 427 + 154 + 602 10 10 @@ -91918,7 +92002,7 @@ - 05_38 + 05_34 background-color: rgb(0, 85, 255); @@ -91927,11 +92011,11 @@ - + 140 - 383 + 559 10 10 @@ -92379,7 +92463,7 @@ - 05_39 + 05_35 background-color: rgb(0, 85, 255); @@ -92388,11 +92472,11 @@ - + - 154 - 341 + 131 + 516 10 10 @@ -92840,7 +92924,7 @@ - 05_40 + 05_36 background-color: rgb(0, 85, 255); @@ -92849,11 +92933,11 @@ - + - 174 - 300 + 128 + 471 10 10 @@ -93301,7 +93385,7 @@ - 05_41 + 05_37 background-color: rgb(0, 85, 255); @@ -93310,11 +93394,11 @@ - + - 199 - 263 + 131 + 427 10 10 @@ -93762,7 +93846,7 @@ - 05_42 + 05_38 background-color: rgb(0, 85, 255); @@ -93771,11 +93855,11 @@ - + - 262 - 199 + 140 + 383 10 10 @@ -94223,7 +94307,7 @@ - 05_44 + 05_39 background-color: rgb(0, 85, 255); @@ -94232,11 +94316,11 @@ - + - 299 - 175 + 154 + 341 10 10 @@ -94684,7 +94768,7 @@ - 05_45 + 05_40 background-color: rgb(0, 85, 255); @@ -94693,11 +94777,11 @@ - + - 339 - 155 + 174 + 300 10 10 @@ -95145,7 +95229,7 @@ - 05_46 + 05_41 background-color: rgb(0, 85, 255); @@ -95154,11 +95238,11 @@ - + - 382 - 140 + 199 + 263 10 10 @@ -95606,7 +95690,7 @@ - 05_47 + 05_42 background-color: rgb(0, 85, 255); @@ -95615,11 +95699,11 @@ - + - 426 - 131 + 262 + 199 10 10 @@ -96067,7 +96151,7 @@ - 05_48 + 05_44 background-color: rgb(0, 85, 255); @@ -96076,13 +96160,13 @@ - + - 470 - 140 - 25 - 15 + 299 + 175 + 10 + 10 @@ -96527,28 +96611,23 @@ - - - 8 - - - Controls actuators in 5 circle + 05_45 background-color: rgb(0, 85, 255); - C5 + - + - 471 - 192 - 20 - 15 + 339 + 155 + 10 + 10 @@ -96993,26 +97072,21 @@ - - - 8 - - - Controls actuators in 4 circle + 05_46 background-color: rgb(0, 85, 255); - C4 + - + - 471 - 77 + 382 + 140 10 10 @@ -97460,7 +97534,7 @@ - 06_01 + 05_47 background-color: rgb(0, 85, 255); @@ -97469,11 +97543,11 @@ - + - 522 - 81 + 426 + 131 10 10 @@ -97921,7 +97995,7 @@ - 06_02 + 05_48 background-color: rgb(0, 85, 255); @@ -97930,13 +98004,13 @@ - + - 573 - 92 - 10 - 10 + 470 + 140 + 25 + 15 @@ -98381,23 +98455,28 @@ + + + 8 + + - 06_03 + Controls actuators in 5 circle background-color: rgb(0, 85, 255); - + C5 - + - 621 - 108 - 10 - 10 + 471 + 192 + 20 + 15 @@ -98842,21 +98921,26 @@ + + + 8 + + - 06_04 + Controls actuators in 4 circle background-color: rgb(0, 85, 255); - + C4 - + - 667 - 131 + 471 + 77 10 10 @@ -99304,7 +99388,7 @@ - 06_05 + 06_01 background-color: rgb(0, 85, 255); @@ -99313,11 +99397,11 @@ - + - 711 - 159 + 522 + 81 10 10 @@ -99765,7 +99849,7 @@ - 06_06 + 06_02 background-color: rgb(0, 85, 255); @@ -99774,11 +99858,11 @@ - + - 749 - 193 + 573 + 92 10 10 @@ -100226,7 +100310,7 @@ - 06_07 + 06_03 background-color: rgb(0, 85, 255); @@ -100235,11 +100319,11 @@ - + - 783 - 232 + 621 + 108 10 10 @@ -100687,7 +100771,7 @@ - 06_08 + 06_04 background-color: rgb(0, 85, 255); @@ -100696,11 +100780,11 @@ - + - 811 - 275 + 667 + 131 10 10 @@ -101148,7 +101232,7 @@ - 06_09 + 06_05 background-color: rgb(0, 85, 255); @@ -101157,11 +101241,11 @@ - + - 834 - 320 + 711 + 159 10 10 @@ -101609,7 +101693,7 @@ - 06_10 + 06_06 background-color: rgb(0, 85, 255); @@ -101618,11 +101702,11 @@ - + - 861 - 420 + 749 + 193 10 10 @@ -102070,7 +102154,7 @@ - 06_12 + 06_07 background-color: rgb(0, 85, 255); @@ -102079,11 +102163,11 @@ - + - 865 - 471 + 783 + 232 10 10 @@ -102531,7 +102615,7 @@ - 06_13 + 06_08 background-color: rgb(0, 85, 255); @@ -102540,11 +102624,11 @@ - + - 862 - 522 + 811 + 275 10 10 @@ -102992,7 +103076,7 @@ - 06_14 + 06_09 background-color: rgb(0, 85, 255); @@ -103001,11 +103085,11 @@ - + - 850 - 573 + 834 + 320 10 10 @@ -103453,7 +103537,7 @@ - 06_15 + 06_10 background-color: rgb(0, 85, 255); @@ -103462,11 +103546,11 @@ - + - 834 - 622 + 861 + 420 10 10 @@ -103914,7 +103998,7 @@ - 06_16 + 06_12 background-color: rgb(0, 85, 255); @@ -103923,11 +104007,11 @@ - + - 811 - 668 + 865 + 471 10 10 @@ -104375,7 +104459,7 @@ - 06_17 + 06_13 background-color: rgb(0, 85, 255); @@ -104384,11 +104468,11 @@ - + - 783 - 710 + 862 + 522 10 10 @@ -104836,7 +104920,7 @@ - 06_18 + 06_14 background-color: rgb(0, 85, 255); @@ -104845,11 +104929,11 @@ - + - 749 - 749 + 850 + 573 10 10 @@ -105297,7 +105381,7 @@ - 06_19 + 06_15 background-color: rgb(0, 85, 255); @@ -105306,11 +105390,11 @@ - + - 709 - 783 + 834 + 622 10 10 @@ -105758,7 +105842,7 @@ - 06_20 + 06_16 background-color: rgb(0, 85, 255); @@ -105767,11 +105851,11 @@ - + - 668 - 812 + 811 + 668 10 10 @@ -106219,7 +106303,7 @@ - 06_21 + 06_17 background-color: rgb(0, 85, 255); @@ -106228,11 +106312,11 @@ - + - 621 - 835 + 783 + 710 10 10 @@ -106680,7 +106764,7 @@ - 06_22 + 06_18 background-color: rgb(0, 85, 255); @@ -106689,11 +106773,11 @@ - + - 572 - 851 + 749 + 749 10 10 @@ -107141,7 +107225,7 @@ - 06_23 + 06_19 background-color: rgb(0, 85, 255); @@ -107150,11 +107234,11 @@ - + - 522 - 861 + 709 + 783 10 10 @@ -107602,7 +107686,7 @@ - 06_24 + 06_20 background-color: rgb(0, 85, 255); @@ -107611,11 +107695,11 @@ - + - 471 - 864 + 668 + 812 10 10 @@ -108063,7 +108147,7 @@ - 06_25 + 06_21 background-color: rgb(0, 85, 255); @@ -108072,11 +108156,11 @@ - + - 419 - 861 + 621 + 835 10 10 @@ -108524,7 +108608,7 @@ - 06_26 + 06_22 background-color: rgb(0, 85, 255); @@ -108533,10 +108617,10 @@ - + - 369 + 572 851 10 10 @@ -108985,7 +109069,7 @@ - 06_27 + 06_23 background-color: rgb(0, 85, 255); @@ -108994,11 +109078,11 @@ - + - 320 - 835 + 522 + 861 10 10 @@ -109446,7 +109530,7 @@ - 06_28 + 06_24 background-color: rgb(0, 85, 255); @@ -109455,11 +109539,11 @@ - + - 274 - 812 + 471 + 864 10 10 @@ -109907,7 +109991,7 @@ - 06_29 + 06_25 background-color: rgb(0, 85, 255); @@ -109916,11 +110000,11 @@ - + - 231 - 783 + 419 + 861 10 10 @@ -110368,7 +110452,7 @@ - 06_30 + 06_26 background-color: rgb(0, 85, 255); @@ -110377,11 +110461,11 @@ - + - 192 - 750 + 369 + 851 10 10 @@ -110829,7 +110913,7 @@ - 06_31 + 06_27 background-color: rgb(0, 85, 255); @@ -110838,11 +110922,11 @@ - + - 158 - 711 + 320 + 835 10 10 @@ -111290,7 +111374,7 @@ - 06_32 + 06_28 background-color: rgb(0, 85, 255); @@ -111299,11 +111383,11 @@ - + - 129 - 668 + 274 + 812 10 10 @@ -111751,7 +111835,7 @@ - 06_33 + 06_29 background-color: rgb(0, 85, 255); @@ -111760,11 +111844,11 @@ - + - 107 - 622 + 231 + 783 10 10 @@ -112212,7 +112296,7 @@ - 06_34 + 06_30 background-color: rgb(0, 85, 255); @@ -112221,11 +112305,11 @@ - + - 90 - 573 + 192 + 750 10 10 @@ -112673,7 +112757,7 @@ - 06_35 + 06_31 background-color: rgb(0, 85, 255); @@ -112682,11 +112766,11 @@ - + - 80 - 523 + 158 + 711 10 10 @@ -113134,7 +113218,7 @@ - 06_36 + 06_32 background-color: rgb(0, 85, 255); @@ -113143,11 +113227,11 @@ - + - 77 - 471 + 129 + 668 10 10 @@ -113595,7 +113679,7 @@ - 06_37 + 06_33 background-color: rgb(0, 85, 255); @@ -113604,11 +113688,11 @@ - + - 80 - 420 + 107 + 622 10 10 @@ -114056,7 +114140,7 @@ - 06_38 + 06_34 background-color: rgb(0, 85, 255); @@ -114065,11 +114149,11 @@ - + 90 - 370 + 573 10 10 @@ -114517,7 +114601,7 @@ - 06_39 + 06_35 background-color: rgb(0, 85, 255); @@ -114526,11 +114610,11 @@ - + - 107 - 321 + 80 + 523 10 10 @@ -114978,7 +115062,7 @@ - 06_40 + 06_36 background-color: rgb(0, 85, 255); @@ -114987,11 +115071,11 @@ - + - 130 - 275 + 77 + 471 10 10 @@ -115439,7 +115523,7 @@ - 06_41 + 06_37 background-color: rgb(0, 85, 255); @@ -115448,11 +115532,11 @@ - + - 159 - 232 + 80 + 420 10 10 @@ -115900,7 +115984,7 @@ - 06_42 + 06_38 background-color: rgb(0, 85, 255); @@ -115909,11 +115993,11 @@ - + - 192 - 193 + 90 + 370 10 10 @@ -116361,7 +116445,7 @@ - 06_43 + 06_39 background-color: rgb(0, 85, 255); @@ -116370,11 +116454,11 @@ - + - 231 - 159 + 107 + 321 10 10 @@ -116822,7 +116906,7 @@ - 06_44 + 06_40 background-color: rgb(0, 85, 255); @@ -116831,11 +116915,11 @@ - + - 273 - 131 + 130 + 275 10 10 @@ -117283,7 +117367,7 @@ - 06_45 + 06_41 background-color: rgb(0, 85, 255); @@ -117292,11 +117376,11 @@ - + - 320 - 107 + 159 + 232 10 10 @@ -117744,7 +117828,7 @@ - 06_46 + 06_42 background-color: rgb(0, 85, 255); @@ -117753,11 +117837,11 @@ - + - 368 - 91 + 192 + 193 10 10 @@ -118205,7 +118289,7 @@ - 06_47 + 06_43 background-color: rgb(0, 85, 255); @@ -118214,11 +118298,11 @@ - + - 420 - 81 + 231 + 159 10 10 @@ -118666,7 +118750,7 @@ - 06_48 + 06_44 background-color: rgb(0, 85, 255); @@ -118675,13 +118759,13 @@ - + - 470 - 88 - 25 - 15 + 273 + 131 + 10 + 10 @@ -119126,28 +119210,23 @@ - - - 8 - - - Controls actuators in 6 circle + 06_45 background-color: rgb(0, 85, 255); - C6 + - + - 465 - 40 - 20 - 20 + 320 + 107 + 10 + 10 @@ -119593,22 +119672,22 @@ - Controls all actuators in 1 radius + 06_46 background-color: rgb(0, 85, 255); - 1 + - + - 520 - 50 - 20 - 20 + 368 + 91 + 10 + 10 @@ -120054,22 +120133,22 @@ - Controls all actuators in 2 radius + 06_47 background-color: rgb(0, 85, 255); - 2 + - + - 570 - 60 - 20 - 20 + 420 + 81 + 10 + 10 @@ -120515,22 +120594,22 @@ - Controls all actuators in 3 radius + 06_48 background-color: rgb(0, 85, 255); - 3 + - + - 620 - 80 - 20 - 20 + 470 + 88 + 25 + 15 @@ -120975,21 +121054,26 @@ + + + 8 + + - Controls all actuators in 4 radius + Controls actuators in 6 circle background-color: rgb(0, 85, 255); - 4 + C6 - + - 680 - 100 + 465 + 40 20 20 @@ -121437,20 +121521,20 @@ - Controls all actuators in 5 radius + Controls all actuators in 1 radius background-color: rgb(0, 85, 255); - 5 + 1 - + - 730 - 130 + 520 + 50 20 20 @@ -121898,20 +121982,20 @@ - Controls all actuators in 6 radius + Controls all actuators in 2 radius background-color: rgb(0, 85, 255); - 6 + 2 - + - 770 - 160 + 570 + 60 20 20 @@ -122359,20 +122443,20 @@ - Controls all actuators in 7 radius + Controls all actuators in 3 radius background-color: rgb(0, 85, 255); - 7 + 3 - + - 800 - 210 + 620 + 80 20 20 @@ -122820,20 +122904,20 @@ - Controls all actuators in 8 radius + Controls all actuators in 4 radius background-color: rgb(0, 85, 255); - 8 + 4 - + - 830 - 250 + 680 + 100 20 20 @@ -123281,20 +123365,20 @@ - Controls all actuators in 9 radius + Controls all actuators in 5 radius background-color: rgb(0, 85, 255); - 9 + 5 - + - 860 - 300 + 730 + 130 20 20 @@ -123742,20 +123826,20 @@ - Controls all actuators in 10 radius + Controls all actuators in 6 radius background-color: rgb(0, 85, 255); - 10 + 6 - + - 870 - 360 + 770 + 160 20 20 @@ -124203,20 +124287,20 @@ - Controls all actuators in 11 radius + Controls all actuators in 7 radius background-color: rgb(0, 85, 255); - 11 + 7 - + - 880 - 410 + 800 + 210 20 20 @@ -124664,20 +124748,20 @@ - Controls all actuators in 12 radius + Controls all actuators in 8 radius background-color: rgb(0, 85, 255); - 12 + 8 - + - 890 - 470 + 830 + 250 20 20 @@ -125125,20 +125209,20 @@ - Controls all actuators in 13 radius + Controls all actuators in 9 radius background-color: rgb(0, 85, 255); - 13 + 9 - + - 890 - 520 + 860 + 300 20 20 @@ -125586,20 +125670,20 @@ - Controls all actuators in 14 radius + Controls all actuators in 10 radius background-color: rgb(0, 85, 255); - 14 + 10 - + 870 - 580 + 360 20 20 @@ -126047,20 +126131,20 @@ - Controls all actuators in 15 radius + Controls all actuators in 11 radius background-color: rgb(0, 85, 255); - 15 + 11 - + - 855 - 630 + 880 + 410 20 20 @@ -126508,20 +126592,20 @@ - Controls all actuators in 16 radius + Controls all actuators in 12 radius background-color: rgb(0, 85, 255); - 16 + 12 - + - 830 - 680 + 890 + 470 20 20 @@ -126969,20 +127053,20 @@ - Controls all actuators in 17 radius + Controls all actuators in 13 radius background-color: rgb(0, 85, 255); - 17 + 13 - + - 520 - 880 + 890 + 520 20 20 @@ -127429,24 +127513,21 @@ - - - - Controls all actuators in 24 radius + Controls all actuators in 14 radius background-color: rgb(0, 85, 255); - 24 + 14 - + - 470 - 890 + 870 + 580 20 20 @@ -127893,24 +127974,21 @@ - - - - Controls all actuators in 25 radius + Controls all actuators in 15 radius background-color: rgb(0, 85, 255); - 25 + 15 - + - 410 - 880 + 855 + 630 20 20 @@ -128357,24 +128435,21 @@ - - - - Controls all actuators in 26 radius + Controls all actuators in 16 radius background-color: rgb(0, 85, 255); - 26 + 16 - + - 350 - 870 + 830 + 680 20 20 @@ -128821,24 +128896,21 @@ - - - - Controls all actuators in 27 radius + Controls all actuators in 17 radius background-color: rgb(0, 85, 255); - 27 + 17 - + - 350 - 60 + 520 + 880 20 20 @@ -129289,20 +129361,20 @@ - Controls all actuators in 47 radius + Controls all actuators in 24 radius background-color: rgb(0, 85, 255); - 47 + 24 - + - 410 - 50 + 470 + 890 20 20 @@ -129753,20 +129825,20 @@ - Controls all actuators in 48 radius + Controls all actuators in 25 radius background-color: rgb(0, 85, 255); - 48 + 25 - + - 800 - 730 + 410 + 880 20 20 @@ -130217,20 +130289,20 @@ - Controls all actuators in 18 radius + Controls all actuators in 26 radius background-color: rgb(0, 85, 255); - 18 + 26 - + - 770 - 770 + 350 + 870 20 20 @@ -130681,20 +130753,20 @@ - Controls all actuators in 19 radius + Controls all actuators in 27 radius background-color: rgb(0, 85, 255); - 19 + 27 - + - 580 - 870 + 350 + 60 20 20 @@ -131145,20 +131217,20 @@ - Controls all actuators in 23 radius + Controls all actuators in 47 radius background-color: rgb(0, 85, 255); - 23 + 47 - + - 630 - 850 + 410 + 50 20 20 @@ -131609,20 +131681,20 @@ - Controls all actuators in 22 radius + Controls all actuators in 48 radius background-color: rgb(0, 85, 255); - 22 + 48 - + - 680 - 830 + 800 + 730 20 20 @@ -132073,20 +132145,20 @@ - Controls all actuators in 21 radius + Controls all actuators in 18 radius background-color: rgb(0, 85, 255); - 21 + 18 - + - 730 - 800 + 770 + 770 20 20 @@ -132537,20 +132609,20 @@ - Controls all actuators in 20 radius + Controls all actuators in 19 radius background-color: rgb(0, 85, 255); - 20 + 19 - + - 300 - 850 + 580 + 870 20 20 @@ -133001,20 +133073,20 @@ - Controls all actuators in 28 radius + Controls all actuators in 23 radius background-color: rgb(0, 85, 255); - 28 + 23 - + - 250 - 830 + 630 + 850 20 20 @@ -133465,20 +133537,20 @@ - Controls all actuators in 29 radius + Controls all actuators in 22 radius background-color: rgb(0, 85, 255); - 29 + 22 - + - 200 - 790 + 680 + 830 20 20 @@ -133929,20 +134001,20 @@ - Controls all actuators in 30 radius + Controls all actuators in 21 radius background-color: rgb(0, 85, 255); - 30 + 21 - + - 160 - 760 + 730 + 800 20 20 @@ -134393,20 +134465,20 @@ - Controls all actuators in 31 radius + Controls all actuators in 20 radius background-color: rgb(0, 85, 255); - 31 + 20 - + - 130 - 720 + 300 + 850 20 20 @@ -134857,20 +134929,20 @@ - Controls all actuators in 32 radius + Controls all actuators in 28 radius background-color: rgb(0, 85, 255); - 32 + 28 - + - 100 - 680 + 250 + 830 20 20 @@ -135321,20 +135393,20 @@ - Controls all actuators in 33 radius + Controls all actuators in 29 radius background-color: rgb(0, 85, 255); - 33 + 29 - + - 80 - 630 + 200 + 790 20 20 @@ -135785,20 +135857,20 @@ - Controls all actuators in 34 radius + Controls all actuators in 30 radius background-color: rgb(0, 85, 255); - 34 + 30 - + - 60 - 580 + 160 + 760 20 20 @@ -136249,20 +136321,20 @@ - Controls all actuators in 35 radius + Controls all actuators in 31 radius background-color: rgb(0, 85, 255); - 35 + 31 - + - 50 - 520 + 130 + 720 20 20 @@ -136713,20 +136785,20 @@ - Controls all actuators in 36 radius + Controls all actuators in 32 radius background-color: rgb(0, 85, 255); - 36 + 32 - + - 50 - 470 + 100 + 680 20 20 @@ -137177,20 +137249,20 @@ - Controls all actuators in 37 radius + Controls all actuators in 33 radius background-color: rgb(0, 85, 255); - 37 + 33 - + - 50 - 410 + 80 + 630 20 20 @@ -137641,20 +137713,20 @@ - Controls all actuators in 38 radius + Controls all actuators in 34 radius background-color: rgb(0, 85, 255); - 38 + 34 - + 60 - 350 + 580 20 20 @@ -138105,20 +138177,20 @@ - Controls all actuators in 39 radius + Controls all actuators in 35 radius background-color: rgb(0, 85, 255); - 39 + 35 - + - 70 - 300 + 50 + 520 20 20 @@ -138569,20 +138641,20 @@ - Controls all actuators in 40 radius + Controls all actuators in 36 radius background-color: rgb(0, 85, 255); - 40 + 36 - + - 100 - 250 + 50 + 470 20 20 @@ -139033,20 +139105,20 @@ - Controls all actuators in 41 radius + Controls all actuators in 37 radius background-color: rgb(0, 85, 255); - 41 + 37 - + - 130 - 210 + 50 + 410 20 20 @@ -139497,20 +139569,20 @@ - Controls all actuators in 42 radius + Controls all actuators in 38 radius background-color: rgb(0, 85, 255); - 42 + 38 - + - 160 - 160 + 60 + 350 20 20 @@ -139961,20 +140033,20 @@ - Controls all actuators in 43 radius + Controls all actuators in 39 radius background-color: rgb(0, 85, 255); - 43 + 39 - + - 210 - 130 + 70 + 300 20 20 @@ -140425,20 +140497,20 @@ - Controls all actuators in 44 radius + Controls all actuators in 40 radius background-color: rgb(0, 85, 255); - 44 + 40 - + - 250 - 100 + 100 + 250 20 20 @@ -140889,20 +140961,20 @@ - Controls all actuators in 45 radius + Controls all actuators in 41 radius background-color: rgb(0, 85, 255); - 45 + 41 - + - 300 - 80 + 130 + 210 20 20 @@ -141353,22 +141425,22 @@ - Controls all actuators in 46 radius + Controls all actuators in 42 radius background-color: rgb(0, 85, 255); - 46 + 42 - + - 471 - 181 - 10 - 10 + 160 + 160 + 20 + 20 @@ -141813,484 +141885,26 @@ - - 09_01 - - - background-color: rgb(0, 85, 255); - - - - - - - - - 648 - 240 - 10 - 10 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 63 - 127 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - + + - 04_06 + Controls all actuators in 43 radius background-color: rgb(0, 85, 255); - + 43 - + - 702 - 294 - 10 - 10 + 210 + 130 + 20 + 20 @@ -142735,23 +142349,26 @@ + + + - 04_08 + Controls all actuators in 44 radius background-color: rgb(0, 85, 255); - + 44 - + - 702 - 649 - 10 - 10 + 250 + 100 + 20 + 20 @@ -143196,21 +142813,488 @@ + + + - 04_18 + Controls all actuators in 45 radius background-color: rgb(0, 85, 255); - + 45 - + - 648 - 702 + 300 + 80 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 46 radius + + + background-color: rgb(0, 85, 255); + + + 46 + + + + + + 471 + 181 10 10 @@ -143658,7 +143742,7 @@ - 04_20 + 09_01 background-color: rgb(0, 85, 255); @@ -143667,11 +143751,11 @@ - + - 293 - 702 + 648 + 240 10 10 @@ -144119,468 +144203,7 @@ - 04_30 - - - background-color: rgb(0, 85, 255); - - - - - - - - - 240 - 648 - 10 - 10 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 63 - 127 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - 04_32 + 04_06 background-color: rgb(0, 85, 255); @@ -144589,10 +144212,10 @@ - + - 240 + 702 294 10 10 @@ -145041,7 +144664,7 @@ - 04_42 + 04_08 background-color: rgb(0, 85, 255); @@ -145050,11 +144673,11 @@ - + - 293 - 240 + 702 + 649 10 10 @@ -145502,7 +145125,7 @@ - 04_44 + 04_18 background-color: rgb(0, 85, 255); @@ -145511,11 +145134,11 @@ - + - 713 - 229 + 648 + 702 10 10 @@ -145963,7 +145586,7 @@ - 05_07 + 04_20 background-color: rgb(0, 85, 255); @@ -145972,11 +145595,11 @@ - + - 712 - 713 + 293 + 702 10 10 @@ -146424,7 +146047,7 @@ - 05_19 + 04_30 background-color: rgb(0, 85, 255); @@ -146433,11 +146056,11 @@ - + - 229 - 713 + 240 + 648 10 10 @@ -146885,7 +146508,7 @@ - 05_31 + 04_32 background-color: rgb(0, 85, 255); @@ -146894,11 +146517,11 @@ - + - 229 - 229 + 240 + 294 10 10 @@ -147346,7 +146969,7 @@ - 05_43 + 04_42 background-color: rgb(0, 85, 255); @@ -147355,472 +146978,11 @@ - - - - 450 - 443 - 50 - 50 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 63 - 127 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - Controls all actuators - - - background-color: rgb(0, 85, 255); - - - ALL - - - + - 851 - 370 + 293 + 240 10 10 @@ -148268,7 +147430,7 @@ - 06_11 + 04_44 background-color: rgb(0, 85, 255); @@ -148277,487 +147439,13 @@ - - - - - 1070 - 880 - 91 - 31 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 63 - 127 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 0 - 0 - 0 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 127 - 170 - 255 - - - - - - - 38 - 110 - 255 - - - - - - - 0 - 42 - 127 - - - - - - - 0 - 57 - 170 - - - - - - - 128 - 128 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 128 - 128 - 128 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 85 - 255 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 128 - - - - - - - 255 - 255 - 255 - - - - - - - 0 - 0 - 255 - - - - - - - 255 - 0 - 255 - - - - - - - - background-color: rgb(0, 85, 255); - - - QUIT - - - - - false - - - - 970 - 448 - 288 - 291 - - - - - - + - 192 - 45 - 90 - 35 + 713 + 229 + 10 + 10 @@ -149203,22 +147891,22 @@ - calibration + 05_07 background-color: rgb(0, 85, 255); - Calibration + - + - 4 - 5 - 90 - 35 + 712 + 713 + 10 + 10 @@ -149664,22 +148352,22 @@ - Stop actuator + 05_19 background-color: rgb(0, 85, 255); - Stop + - + - 98 - 5 - 90 - 35 + 229 + 713 + 10 + 10 @@ -150125,22 +148813,22 @@ - Reset software + 05_31 background-color: rgb(0, 85, 255); - Reset + - + - 4 - 45 - 90 - 35 + 229 + 229 + 10 + 10 @@ -150586,22 +149274,22 @@ - Reference Position + 05_43 background-color: rgb(0, 85, 255); - RefPos + - + - 5 - 125 - 90 - 35 + 450 + 443 + 50 + 50 @@ -151047,22 +149735,22 @@ - Move actuator to most top position + Controls all actuators background-color: rgb(0, 85, 255); - Top + ALL - + - 98 - 45 - 90 - 35 + 851 + 370 + 10 + 10 @@ -151508,20 +150196,494 @@ - Stop the USD position loop control and bring it to bottom most position + 06_11 background-color: rgb(0, 85, 255); - Stow + - + + + + + 1070 + 880 + 91 + 31 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + background-color: rgb(0, 85, 255); + + + QUIT + + + + + false + + + + 970 + 448 + 288 + 291 + + + + + + - 98 - 125 + 192 + 45 90 35 @@ -151969,19 +151131,19 @@ - Move actuator to most bottom position + calibration background-color: rgb(0, 85, 255); - Bottom + Calibration - + - 192 + 4 5 90 35 @@ -152430,20 +151592,20 @@ - bring the usd to zeroRef position and starts the pos. control loop + Stop actuator background-color: rgb(0, 85, 255); - Setup + Stop - + 98 - 85 + 5 90 35 @@ -152891,20 +152053,20 @@ - Move actuator down + Reset software background-color: rgb(0, 85, 255); - Down + Reset - + 4 - 85 + 45 90 35 @@ -153352,20 +152514,20 @@ - Move actuator up + Reference Position background-color: rgb(0, 85, 255); - Up + RefPos - + 5 - 165 + 125 90 35 @@ -153813,41 +152975,2807 @@ - Moves the actuator of incr amount relative to actual position (mm) + Move actuator to most top position background-color: rgb(0, 85, 255); - Move + Top - + - 140 - 165 - 100 + 98 + 45 + 90 35 - - - 12 - + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + - - Qt::AlignRight + + Stop the USD position loop control and bring it to bottom most position - - false + + background-color: rgb(0, 85, 255); + + + Stow - + - 5 - 205 + 98 + 125 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator to most bottom position + + + background-color: rgb(0, 85, 255); + + + Bottom + + + + + + 192 + 5 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + bring the usd to zeroRef position and starts the pos. control loop + + + background-color: rgb(0, 85, 255); + + + Setup + + + + + + 98 + 85 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator down + + + background-color: rgb(0, 85, 255); + + + Down + + + + + + 4 + 85 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator up + + + background-color: rgb(0, 85, 255); + + + Up + + + + + + 5 + 165 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Moves the actuator of incr amount relative to actual position (mm) + + + background-color: rgb(0, 85, 255); + + + Move + + + + + + 140 + 165 + 100 + 35 + + + + + 12 + + + + Qt::AlignRight + + + false + + + + + + 5 + 205 90 35 @@ -156759,6 +158687,70 @@ + + ActuatorButton07_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton07_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton07_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton07_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + ActuatorButton01_02 clicked() diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui.17012024 b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui.17012024 new file mode 100755 index 000000000..43ba300a6 --- /dev/null +++ b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceGUI.ui.17012024 @@ -0,0 +1,161729 @@ + + + NotoActiveSurfaceGUI + + + + 0 + 0 + 1270 + 960 + + + + + 0 + 0 + + + + + 1100 + 950 + + + + Noto Active Surface + + + + + 975 + 408 + 130 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + background-color: rgb(0, 85, 255); + + + MANAGER + + + + + + 970 + 15 + 130 + 30 + + + + ACTUATOR + + + Qt::AlignCenter + + + false + + + + + + 970 + 152 + 130 + 20 + + + + Delay + + + Qt::AlignCenter + + + false + + + + + + 970 + 225 + 130 + 20 + + + + Acceleration + + + Qt::AlignCenter + + + false + + + + + true + + + + 970 + 305 + 90 + 35 + + + + Zero Calibration + + + + + + Qt::AlignCenter + + + false + + + + + true + + + + 1065 + 305 + 95 + 35 + + + + Auto/Manual Resolution + + + + + + Qt::AlignCenter + + + false + + + + + true + + + + 1115 + 265 + 140 + 35 + + + + Ready + + + + + + Qt::AlignCenter + + + false + + + + + true + + + + 970 + 265 + 140 + 35 + + + + Standby Status + + + + + + Qt::AlignCenter + + + false + + + + + true + + + + 1165 + 305 + 90 + 35 + + + + Run/Stop Status + + + + + + Qt::AlignCenter + + + false + + + + + + 970 + 105 + 130 + 42 + + + + Commanded Pos + + + Qt::AlignCenter + + + false + + + + + + 970 + 60 + 130 + 42 + + + + Actual Pos + + + Qt::AlignCenter + + + false + + + + + + 970 + 176 + 130 + 20 + + + + Min Frequency + + + Qt::AlignCenter + + + false + + + + + + 970 + 200 + 130 + 20 + + + + Max Frequency + + + Qt::AlignCenter + + + false + + + + + + 1120 + 15 + 135 + 30 + + + + + DejaVu LGC Sans + 14 + + + + 32767 + + + Qt::AlignHCenter + + + true + + + + + + 1120 + 60 + 30 + 20 + + + + mm + + + Qt::AlignCenter + + + false + + + + + + 1120 + 82 + 30 + 20 + + + + step + + + Qt::AlignCenter + + + false + + + + + + 1120 + 106 + 30 + 20 + + + + mm + + + Qt::AlignCenter + + + false + + + + + + 1120 + 127 + 30 + 20 + + + + step + + + Qt::AlignCenter + + + false + + + + + + 1153 + 60 + 100 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1153 + 82 + 100 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1154 + 106 + 100 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1154 + 127 + 100 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1120 + 152 + 135 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1120 + 176 + 135 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1120 + 200 + 135 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + + 1120 + 225 + 135 + 20 + + + + + + + Qt::AlignRight + + + true + + + + + false + + + + 1115 + 408 + 135 + 35 + + + + + DejaVu LGC Sans + 12 + + + + Qt::StrongFocus + + + 32767 + + + QLineEdit::Password + + + 0 + + + Qt::AlignHCenter + + + true + + + false + + + + + true + + + + 970 + 362 + 287 + 32 + + + + + DejaVu LGC Sans + 12 + 75 + true + + + + + + + Qt::AlignCenter + + + false + + + + + + 5 + 5 + 950 + 950 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + 10 + 10 + 120 + 120 + + + + ../../../../../../.designer/backup/bussola.120x120.jpg + + + false + + + + + + 471 + 358 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 501 + 361 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 528 + 372 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 552 + 390 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 569 + 414 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 580 + 442 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_06 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 584 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 581 + 500 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 571 + 528 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 552 + 552 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 528 + 570 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 500 + 581 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 470 + 585 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 441 + 581 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 413 + 570 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 390 + 552 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 372 + 528 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 362 + 500 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 357 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 361 + 442 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 371 + 413 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 390 + 391 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 414 + 373 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 442 + 361 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 01_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 298 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 494 + 300 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 516 + 304 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 537 + 312 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 557 + 321 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 576 + 334 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_06 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 594 + 349 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 607 + 365 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 620 + 385 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 630 + 405 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 637 + 426 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 642 + 448 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 643 + 472 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 642 + 494 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 638 + 516 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 630 + 537 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 620 + 557 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 608 + 576 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 593 + 593 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 576 + 607 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 557 + 620 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 536 + 630 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 515 + 637 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 493 + 642 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 644 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_25 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 449 + 642 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_26 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 427 + 637 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_27 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 405 + 631 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_28 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 385 + 620 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_29 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 365 + 607 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_30 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 349 + 592 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_31 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 333 + 576 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_32 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 321 + 557 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_33 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 312 + 536 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_34 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 304 + 515 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_35 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 300 + 493 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_36 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 299 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_37 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 300 + 449 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_38 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 304 + 427 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_39 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 312 + 405 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_40 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 321 + 385 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_41 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 334 + 366 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_42 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 349 + 350 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_43 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 366 + 334 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_44 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 384 + 322 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_45 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 404 + 311 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_46 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 427 + 305 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_47 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 448 + 300 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 02_48 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 239 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 502 + 241 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 532 + 248 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 560 + 257 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 588 + 270 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 612 + 288 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_06 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 635 + 307 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 654 + 330 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 672 + 355 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 685 + 382 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 695 + 411 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 701 + 441 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 703 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 701 + 502 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 695 + 532 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 685 + 560 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 672 + 588 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 655 + 613 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 635 + 636 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 612 + 656 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 587 + 673 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 560 + 687 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 531 + 696 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 501 + 701 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 704 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_25 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 440 + 702 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_26 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 410 + 695 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_27 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 382 + 686 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_28 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 354 + 672 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_29 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 329 + 656 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_30 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 306 + 635 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_31 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 286 + 613 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_32 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 269 + 587 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_33 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 257 + 559 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_34 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 247 + 531 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_35 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 240 + 501 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_36 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 238 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_37 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 240 + 441 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_38 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 246 + 411 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_39 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 256 + 383 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_40 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 269 + 355 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_41 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 287 + 330 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_42 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 306 + 307 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_43 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 329 + 287 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_44 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 354 + 270 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_45 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 382 + 257 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_46 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 410 + 247 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_47 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 440 + 241 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 03_48 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 509 + 183 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 546 + 190 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 582 + 202 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 616 + 220 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 677 + 265 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 723 + 326 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 740 + 360 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 752 + 395 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 759 + 433 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 762 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 760 + 509 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 752 + 547 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 740 + 582 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 723 + 616 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 677 + 677 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 616 + 724 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 583 + 740 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 546 + 753 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 508 + 760 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 470 + 763 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_25 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 433 + 760 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_26 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 395 + 753 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_27 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 359 + 741 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_28 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 325 + 723 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_29 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 264 + 677 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_31 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 218 + 616 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_33 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 201 + 582 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_34 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 189 + 546 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_35 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 182 + 509 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_36 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 179 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_37 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 181 + 433 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_38 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 189 + 396 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_39 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 201 + 360 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_40 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 218 + 325 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_41 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 264 + 265 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_43 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 325 + 219 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_45 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 359 + 202 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_46 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 395 + 189 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_47 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 433 + 182 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_48 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 468 + 370 + 20 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 1 circle + + + background-color: rgb(0, 85, 255); + + + C1 + + + + + + 470 + 310 + 20 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 2 circle + + + background-color: rgb(0, 85, 255); + + + C2 + + + + + + 470 + 252 + 20 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 3 circle + + + background-color: rgb(0, 85, 255); + + + C3 + + + + + + 471 + 129 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 516 + 132 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 559 + 142 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 602 + 155 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 642 + 175 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 680 + 200 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 11_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 743 + 264 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 767 + 300 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 787 + 340 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 801 + 383 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 810 + 426 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 813 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 810 + 516 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 801 + 560 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 787 + 602 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 767 + 642 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 742 + 679 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 679 + 743 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 642 + 768 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 602 + 788 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 559 + 801 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 516 + 811 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 813 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_25 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 426 + 811 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_26 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 382 + 802 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_27 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 339 + 787 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_28 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 299 + 767 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_29 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 262 + 743 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_30 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 198 + 679 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_32 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 173 + 642 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_33 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 154 + 602 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_34 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 140 + 559 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_35 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 131 + 516 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_36 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 128 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_37 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 131 + 427 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_38 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 140 + 383 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_39 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 154 + 341 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_40 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 174 + 300 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_41 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 199 + 263 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_42 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 262 + 199 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_44 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 299 + 175 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_45 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 339 + 155 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_46 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 382 + 140 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_47 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 426 + 131 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_48 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 470 + 140 + 25 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 5 circle + + + background-color: rgb(0, 85, 255); + + + C5 + + + + + + 471 + 192 + 20 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 4 circle + + + background-color: rgb(0, 85, 255); + + + C4 + + + + + + 471 + 77 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 522 + 81 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_02 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 573 + 92 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_03 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 621 + 108 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_04 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 667 + 131 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_05 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 711 + 159 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_06 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 749 + 193 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 783 + 232 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 811 + 275 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_09 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 834 + 320 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_10 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 861 + 420 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_12 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 865 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_13 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 862 + 522 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_14 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 850 + 573 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_15 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 834 + 622 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_16 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 811 + 668 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_17 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 783 + 710 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 749 + 749 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 709 + 783 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 668 + 812 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_21 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 621 + 835 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_22 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 572 + 851 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_23 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 522 + 861 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_24 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 471 + 864 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_25 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 419 + 861 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_26 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 369 + 851 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_27 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 320 + 835 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_28 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 274 + 812 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_29 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 231 + 783 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_30 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 192 + 750 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_31 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 158 + 711 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_32 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 129 + 668 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_33 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 107 + 622 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_34 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 90 + 573 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_35 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 80 + 523 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_36 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 77 + 471 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_37 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 80 + 420 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_38 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 90 + 370 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_39 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 107 + 321 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_40 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 130 + 275 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_41 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 159 + 232 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_42 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 192 + 193 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_43 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 231 + 159 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_44 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 273 + 131 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_45 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 320 + 107 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_46 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 368 + 91 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_47 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 420 + 81 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_48 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 470 + 88 + 25 + 15 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 8 + + + + Controls actuators in 6 circle + + + background-color: rgb(0, 85, 255); + + + C6 + + + + + + 465 + 40 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 1 radius + + + background-color: rgb(0, 85, 255); + + + 1 + + + + + + 520 + 50 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 2 radius + + + background-color: rgb(0, 85, 255); + + + 2 + + + + + + 570 + 60 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 3 radius + + + background-color: rgb(0, 85, 255); + + + 3 + + + + + + 620 + 80 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 4 radius + + + background-color: rgb(0, 85, 255); + + + 4 + + + + + + 680 + 100 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 5 radius + + + background-color: rgb(0, 85, 255); + + + 5 + + + + + + 730 + 130 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 6 radius + + + background-color: rgb(0, 85, 255); + + + 6 + + + + + + 770 + 160 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 7 radius + + + background-color: rgb(0, 85, 255); + + + 7 + + + + + + 800 + 210 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 8 radius + + + background-color: rgb(0, 85, 255); + + + 8 + + + + + + 830 + 250 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 9 radius + + + background-color: rgb(0, 85, 255); + + + 9 + + + + + + 860 + 300 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 10 radius + + + background-color: rgb(0, 85, 255); + + + 10 + + + + + + 870 + 360 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 11 radius + + + background-color: rgb(0, 85, 255); + + + 11 + + + + + + 880 + 410 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 12 radius + + + background-color: rgb(0, 85, 255); + + + 12 + + + + + + 890 + 470 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 13 radius + + + background-color: rgb(0, 85, 255); + + + 13 + + + + + + 890 + 520 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 14 radius + + + background-color: rgb(0, 85, 255); + + + 14 + + + + + + 870 + 580 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 15 radius + + + background-color: rgb(0, 85, 255); + + + 15 + + + + + + 855 + 630 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 16 radius + + + background-color: rgb(0, 85, 255); + + + 16 + + + + + + 830 + 680 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators in 17 radius + + + background-color: rgb(0, 85, 255); + + + 17 + + + + + + 520 + 880 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 24 radius + + + background-color: rgb(0, 85, 255); + + + 24 + + + + + + 470 + 890 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 25 radius + + + background-color: rgb(0, 85, 255); + + + 25 + + + + + + 410 + 880 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 26 radius + + + background-color: rgb(0, 85, 255); + + + 26 + + + + + + 350 + 870 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 27 radius + + + background-color: rgb(0, 85, 255); + + + 27 + + + + + + 350 + 60 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 47 radius + + + background-color: rgb(0, 85, 255); + + + 47 + + + + + + 410 + 50 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 48 radius + + + background-color: rgb(0, 85, 255); + + + 48 + + + + + + 800 + 730 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 18 radius + + + background-color: rgb(0, 85, 255); + + + 18 + + + + + + 770 + 770 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 19 radius + + + background-color: rgb(0, 85, 255); + + + 19 + + + + + + 580 + 870 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 23 radius + + + background-color: rgb(0, 85, 255); + + + 23 + + + + + + 630 + 850 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 22 radius + + + background-color: rgb(0, 85, 255); + + + 22 + + + + + + 680 + 830 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 21 radius + + + background-color: rgb(0, 85, 255); + + + 21 + + + + + + 730 + 800 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 20 radius + + + background-color: rgb(0, 85, 255); + + + 20 + + + + + + 300 + 850 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 28 radius + + + background-color: rgb(0, 85, 255); + + + 28 + + + + + + 250 + 830 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 29 radius + + + background-color: rgb(0, 85, 255); + + + 29 + + + + + + 200 + 790 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 30 radius + + + background-color: rgb(0, 85, 255); + + + 30 + + + + + + 160 + 760 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 31 radius + + + background-color: rgb(0, 85, 255); + + + 31 + + + + + + 130 + 720 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 32 radius + + + background-color: rgb(0, 85, 255); + + + 32 + + + + + + 100 + 680 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 33 radius + + + background-color: rgb(0, 85, 255); + + + 33 + + + + + + 80 + 630 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 34 radius + + + background-color: rgb(0, 85, 255); + + + 34 + + + + + + 60 + 580 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 35 radius + + + background-color: rgb(0, 85, 255); + + + 35 + + + + + + 50 + 520 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 36 radius + + + background-color: rgb(0, 85, 255); + + + 36 + + + + + + 50 + 470 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 37 radius + + + background-color: rgb(0, 85, 255); + + + 37 + + + + + + 50 + 410 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 38 radius + + + background-color: rgb(0, 85, 255); + + + 38 + + + + + + 60 + 350 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 39 radius + + + background-color: rgb(0, 85, 255); + + + 39 + + + + + + 70 + 300 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 40 radius + + + background-color: rgb(0, 85, 255); + + + 40 + + + + + + 100 + 250 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 41 radius + + + background-color: rgb(0, 85, 255); + + + 41 + + + + + + 130 + 210 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 42 radius + + + background-color: rgb(0, 85, 255); + + + 42 + + + + + + 160 + 160 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 43 radius + + + background-color: rgb(0, 85, 255); + + + 43 + + + + + + 210 + 130 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 44 radius + + + background-color: rgb(0, 85, 255); + + + 44 + + + + + + 250 + 100 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 45 radius + + + background-color: rgb(0, 85, 255); + + + 45 + + + + + + 300 + 80 + 20 + 20 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + Controls all actuators in 46 radius + + + background-color: rgb(0, 85, 255); + + + 46 + + + + + + 471 + 181 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 09_01 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 648 + 240 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_06 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 702 + 294 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_08 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 702 + 649 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_18 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 648 + 702 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_20 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 293 + 702 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_30 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 240 + 648 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_32 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 240 + 294 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_42 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 293 + 240 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 04_44 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 713 + 229 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_07 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 712 + 713 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_19 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 229 + 713 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_31 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 229 + 229 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 05_43 + + + background-color: rgb(0, 85, 255); + + + + + + + + + 450 + 443 + 50 + 50 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Controls all actuators + + + background-color: rgb(0, 85, 255); + + + ALL + + + + + + 851 + 370 + 10 + 10 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + 06_11 + + + background-color: rgb(0, 85, 255); + + + + + + + + + + 1070 + 880 + 91 + 31 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + background-color: rgb(0, 85, 255); + + + QUIT + + + + + false + + + + 970 + 448 + 288 + 291 + + + + + + + + + 192 + 45 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + calibration + + + background-color: rgb(0, 85, 255); + + + Calibration + + + + + + 4 + 5 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Stop actuator + + + background-color: rgb(0, 85, 255); + + + Stop + + + + + + 98 + 5 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Reset software + + + background-color: rgb(0, 85, 255); + + + Reset + + + + + + 4 + 45 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Reference Position + + + background-color: rgb(0, 85, 255); + + + RefPos + + + + + + 5 + 125 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator to most top position + + + background-color: rgb(0, 85, 255); + + + Top + + + + + + 98 + 45 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Stop the USD position loop control and bring it to bottom most position + + + background-color: rgb(0, 85, 255); + + + Stow + + + + + + 98 + 125 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator to most bottom position + + + background-color: rgb(0, 85, 255); + + + Bottom + + + + + + 192 + 5 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + bring the usd to zeroRef position and starts the pos. control loop + + + background-color: rgb(0, 85, 255); + + + Setup + + + + + + 98 + 85 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator down + + + background-color: rgb(0, 85, 255); + + + Down + + + + + + 4 + 85 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Move actuator up + + + background-color: rgb(0, 85, 255); + + + Up + + + + + + 5 + 165 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Moves the actuator of incr amount relative to actual position (mm) + + + background-color: rgb(0, 85, 255); + + + Move + + + + + + 140 + 165 + 100 + 35 + + + + + 12 + + + + Qt::AlignRight + + + false + + + + + + 5 + 205 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Last minute correction to be added to actual computed USD position + + + background-color: rgb(0, 85, 255); + + + Correction + + + + + + 140 + 205 + 100 + 35 + + + + + 12 + + + + Qt::AlignRight + + + false + + + + + + 5 + 245 + 90 + 35 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + Update actuator position vs elevation + + + background-color: rgb(0, 85, 255); + + + Update + + + + + + 140 + 245 + 100 + 35 + + + + + 12 + + + + Qt::AlignRight + + + false + + + + + + + 970 + 750 + 288 + 40 + + + + false + + + background-color: rgb(0, 85, 255); + + + OPERATOR / OBSERVER + + + Qt::AlignCenter + + + true + + + + + + 970 + 800 + 90 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + sets the Parabolic profile + + + background-color: rgb(0, 85, 255); + + + Parabolic + + + + + + 1193 + 800 + 61 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + + + background-color: rgb(0, 85, 255); + + + Park + + + + + + 1067 + 800 + 111 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 63 + 127 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 0 + 0 + 0 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 127 + 170 + 255 + + + + + + + 38 + 110 + 255 + + + + + + + 0 + 42 + 127 + + + + + + + 0 + 57 + 170 + + + + + + + 128 + 128 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 128 + 128 + 128 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 85 + 255 + + + + + + + 0 + 0 + 0 + + + + + + + 0 + 0 + 128 + + + + + + + 255 + 255 + 255 + + + + + + + 0 + 0 + 255 + + + + + + + 255 + 0 + 255 + + + + + + + + sets the Parabolic Fixed profile + + + background-color: rgb(0, 85, 255); + + + Parabolic Fixed + + + + + + 1129 + 840 + 131 + 30 + + + + false + + + background-color: rgb(0, 85, 255); + + + + + + Qt::AlignCenter + + + true + + + + + + 970 + 840 + 141 + 31 + + + + false + + + background-color: rgb(0, 85, 255); + + + STATUS + + + Qt::AlignCenter + + + true + + + ManagerButton + ActuatorLabel + DelayActuatorLabel + AccelerationActuatorLabel + ActuatorStatusCammLabel + ActuatorStatusLoopLabel + ActuatorStatusCalLabel + ActuatorStatusEnblLabel + ActuatorStatusRunLabel + CommandedPositionActuatorLabel + ActualPositionActuatorLabel + MinFreqActuatorLabel + MaxfreqActuatorLabel + ActuatorNumberlineEdit + mmActualPositionActuatorLabel + stepActualPositionActuatorLabel + mmCommandedPositionActuatorLabel + stepCommandedPositionActuatorLabel + mmActuatorActualPositionlineEdit + stepActuatorActualPositionlineEdit + mmActuatorCommandedPositionlineEdit + stepActuatorCommandedPositionlineEdit + ActuatorDelaylineEdit + ActuatorFminlineEdit + ActuatorFmaxlineEdit + ActuatorAccelerationlineEdit + ManagerPasswordlineEdit + ManagerLabel + QuitButton + buttonGroup1 + lineEdit + ParabolicProfilebutton + stowASbutton + ParabolicFixedProfileSbutton + StatuslineEdit_2 + StatuslineEdit + frame + + + + + Q3GroupBox + QGroupBox +
Qt3Support/Q3GroupBox
+ 1 +
+ + Q3Frame + QFrame +
Qt3Support/Q3Frame
+ 1 +
+ + Q3ButtonGroup + Q3GroupBox +
Qt3Support/Q3ButtonGroup
+ 1 +
+
+ + + + QuitButton + clicked() + NotoActiveSurfaceGUI + Quit() + + + 20 + 20 + + + 20 + 20 + + + + + ResetButton + clicked() + NotoActiveSurfaceGUI + reset() + + + 20 + 20 + + + 20 + 20 + + + + + UpButton + clicked() + NotoActiveSurfaceGUI + up() + + + 20 + 20 + + + 20 + 20 + + + + + DownButton + clicked() + NotoActiveSurfaceGUI + down() + + + 20 + 20 + + + 20 + 20 + + + + + StopButton + clicked() + NotoActiveSurfaceGUI + stop() + + + 20 + 20 + + + 20 + 20 + + + + + CalibrateButton + clicked() + NotoActiveSurfaceGUI + calibrate() + + + 20 + 20 + + + 20 + 20 + + + + + StowButton + clicked() + NotoActiveSurfaceGUI + stow() + + + 20 + 20 + + + 20 + 20 + + + + + SetupButton + clicked() + NotoActiveSurfaceGUI + setup() + + + 20 + 20 + + + 20 + 20 + + + + + MoveButton + clicked() + NotoActiveSurfaceGUI + move() + + + 20 + 20 + + + 20 + 20 + + + + + CorrectionButton + clicked() + NotoActiveSurfaceGUI + correction() + + + 20 + 20 + + + 20 + 20 + + + + + TopButton + clicked() + NotoActiveSurfaceGUI + top() + + + 20 + 20 + + + 20 + 20 + + + + + BottomButton + clicked() + NotoActiveSurfaceGUI + bottom() + + + 20 + 20 + + + 20 + 20 + + + + + UpdateButton + clicked() + NotoActiveSurfaceGUI + update() + + + 20 + 20 + + + 20 + 20 + + + + + RefPosButton + clicked() + NotoActiveSurfaceGUI + refPos() + + + 20 + 20 + + + 20 + 20 + + + + + ParabolicProfilebutton + clicked() + NotoActiveSurfaceGUI + startAS() + + + 1076 + 864 + + + 634 + 479 + + + + + stowASbutton + clicked() + NotoActiveSurfaceGUI + stowAS() + + + 1148 + 864 + + + 634 + 479 + + + + + ParabolicFixedProfileSbutton + clicked() + NotoActiveSurfaceGUI + stopAS() + + + 1221 + 864 + + + 634 + 479 + + + + + ActuatorButton01_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + AllActuatorsButton + clicked() + NotoActiveSurfaceGUI + setallactuators() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton01_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + R1ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + C1ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_25 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_28 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_27 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_29 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_26 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_30 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_46 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_31 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_36 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_35 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_37 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_38 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_44 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_45 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_41 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_34 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_42 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_39 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_43 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_32 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_33 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_40 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_47 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton02_48 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + C2ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_26 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_29 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_28 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_30 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_25 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_27 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_38 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_36 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_32 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_34 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_35 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_37 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_33 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_31 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_42 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_46 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_44 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_41 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_43 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_45 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_40 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_39 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_48 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + C3ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton03_47 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_25 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_28 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_26 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_27 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_29 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_30 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_37 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_32 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_34 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_33 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_31 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_36 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_35 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_44 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_45 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_42 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_38 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_43 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_39 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_41 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_40 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_48 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_46 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton04_47 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + C4ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_26 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_28 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_27 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_25 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_35 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_34 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_36 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_33 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_30 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_29 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_31 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_32 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_38 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_41 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_40 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_37 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_39 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_42 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_43 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_44 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_48 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_46 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_45 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton05_47 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + C5ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_04 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_02 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_01 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_03 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_05 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_11 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_06 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_09 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_07 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_08 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_12 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_10 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_15 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_18 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_19 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_13 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_16 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_20 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_14 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_17 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_27 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_28 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_21 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_25 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_22 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_26 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_23 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_24 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_36 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_31 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_30 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_29 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_34 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_35 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_32 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_33 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_37 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_38 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_40 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_42 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_43 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_41 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_44 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_39 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_47 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + C6ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setcircle() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_45 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_46 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + ActuatorButton06_48 + clicked() + NotoActiveSurfaceGUI + setactuator() + + + 20 + 20 + + + 20 + 20 + + + + + R1ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R2ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R4ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R3ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R12ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R17ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R9ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R13ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R14ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R15ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R20ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R10ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R11ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R16ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R5ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R18ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R19ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R6ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R8ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R7ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R24ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R28ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R30ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R22ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R31ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R21ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R34ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R29ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R25ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R33ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R35ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R26ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R32ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R23ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R27ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R36ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R38ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R45ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R46ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R43ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R47ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R41ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R48ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R40ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R42ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R37ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R44ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + R39ActuatorsButton + clicked() + NotoActiveSurfaceGUI + setradius() + + + 20 + 20 + + + 20 + 20 + + + + + + setupAS() + startAS() + stowAS() + stopAS() + +
diff --git a/Noto/Configuration/CDB/MACI/Components/AS/Boss/Boss.xml b/Noto/Configuration/CDB/MACI/Components/AS/Boss/Boss.xml index 92484569e..f8fba91ef 100644 --- a/Noto/Configuration/CDB/MACI/Components/AS/Boss/Boss.xml +++ b/Noto/Configuration/CDB/MACI/Components/AS/Boss/Boss.xml @@ -12,6 +12,7 @@ Code="NotoActiveSurfaceBossImpl" Type="IDL:alma/ActiveSurface/NotoActiveSurfaceBoss:1.0" Container="NotoActiveSurfaceContainer" - ImplLang="cpp" - Default="true" + ImplLang="cpp" + Default="true" + KeepAliveTime="-1" /> diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml new file mode 100644 index 000000000..2c7522f8b --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml new file mode 100644 index 000000000..050e8e306 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml new file mode 100644 index 000000000..7cdb94929 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml new file mode 100644 index 000000000..dcbbe593d --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml new file mode 100644 index 000000000..dc5602949 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml new file mode 100644 index 000000000..652a3c061 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml new file mode 100644 index 000000000..35c89cbb4 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml new file mode 100644 index 000000000..392fc44f2 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml new file mode 100644 index 000000000..b7f32fe60 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml new file mode 100644 index 000000000..5a59ce0fc --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml new file mode 100644 index 000000000..0be50246b --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml new file mode 100644 index 000000000..dfe371f22 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml new file mode 100644 index 000000000..8df995439 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml new file mode 100644 index 000000000..f26f17573 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml new file mode 100644 index 000000000..dc8f7877a --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml new file mode 100644 index 000000000..c4dbba796 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml new file mode 100644 index 000000000..ab8433fc2 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml new file mode 100644 index 000000000..735eb4dd9 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml new file mode 100644 index 000000000..c74135584 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml new file mode 100644 index 000000000..987b353b0 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml new file mode 100644 index 000000000..5e3dd19e8 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml new file mode 100644 index 000000000..2d4b33798 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml new file mode 100644 index 000000000..6486358ab --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml new file mode 100644 index 000000000..576db0031 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml new file mode 100644 index 000000000..770f2d052 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml new file mode 100644 index 000000000..08d3df69d --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml new file mode 100644 index 000000000..dec3ad7f5 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml new file mode 100644 index 000000000..8d93e132c --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml new file mode 100644 index 000000000..796706d57 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml new file mode 100644 index 000000000..d03322121 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml new file mode 100644 index 000000000..5770ce189 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml new file mode 100644 index 000000000..6f5f95a7a --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml new file mode 100644 index 000000000..62a2e5acd --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml new file mode 100644 index 000000000..fe5ec5d7f --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml new file mode 100644 index 000000000..75ce4fbf2 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml new file mode 100644 index 000000000..d24d7d837 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml new file mode 100644 index 000000000..0a5287093 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml new file mode 100644 index 000000000..4b4a8bdf9 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml new file mode 100644 index 000000000..0f0526838 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml new file mode 100644 index 000000000..4ec04d4fc --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml new file mode 100644 index 000000000..79f0b6b69 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml new file mode 100644 index 000000000..0d1a086be --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml new file mode 100644 index 000000000..28eb5bddc --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml new file mode 100644 index 000000000..09308e304 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml new file mode 100644 index 000000000..9b1ea6108 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml new file mode 100644 index 000000000..b76305566 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml new file mode 100644 index 000000000..52c2bca08 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml new file mode 100644 index 000000000..b888dceb6 --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer/NotoActiveSurfaceContainer.xml b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer/NotoActiveSurfaceContainer.xml index 0ffa95a22..749ef249b 100644 --- a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer/NotoActiveSurfaceContainer.xml +++ b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer/NotoActiveSurfaceContainer.xml @@ -6,7 +6,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:log="urn:schemas-cosylab-com:LoggingConfig:1.0" - Timeout="600.0" + Timeout="180.0" ImplLang="cpp" ServerThreads="5"> diff --git a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml new file mode 100644 index 000000000..9fecba35d --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer01/NotoActiveSurfaceContainer01.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer02/NotoActiveSurfaceContainer02.xml b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer02/NotoActiveSurfaceContainer02.xml new file mode 100644 index 000000000..f994d42ca --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer02/NotoActiveSurfaceContainer02.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer03/NotoActiveSurfaceContainer03.xml b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer03/NotoActiveSurfaceContainer03.xml new file mode 100644 index 000000000..f994d42ca --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer03/NotoActiveSurfaceContainer03.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer04/NotoActiveSurfaceContainer04.xml b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer04/NotoActiveSurfaceContainer04.xml new file mode 100644 index 000000000..f994d42ca --- /dev/null +++ b/Noto/Configuration/CDB/MACI/Containers/NotoActiveSurfaceContainer04/NotoActiveSurfaceContainer04.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/Boss/Boss.xml b/Noto/Configuration/CDB/alma/AS/Boss/Boss.xml index c04f433a6..95cea922f 100644 --- a/Noto/Configuration/CDB/alma/AS/Boss/Boss.xml +++ b/Noto/Configuration/CDB/alma/AS/Boss/Boss.xml @@ -1,19 +1,45 @@ - + - + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml new file mode 100644 index 000000000..a354d4a3c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/LAN01.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD01/USD01.xml new file mode 100644 index 000000000..49291b90b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD01/USD01.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD02/USD02.xml new file mode 100644 index 000000000..91e8a460c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD02/USD02.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD03/USD03.xml new file mode 100644 index 000000000..beeb7ce7a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD03/USD03.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD04/USD04.xml new file mode 100644 index 000000000..eb2f68241 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD04/USD04.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD05/USD05.xml new file mode 100644 index 000000000..536480a95 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD05/USD05.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD06/USD06.xml new file mode 100644 index 000000000..9a9d55517 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN01/USD06/USD06.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml new file mode 100644 index 000000000..73d025de4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/LAN02.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD02/USD02.xml new file mode 100644 index 000000000..29a427574 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD02/USD02.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD03/USD03.xml new file mode 100644 index 000000000..0baae9ca4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD03/USD03.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD04/USD04.xml new file mode 100644 index 000000000..ee74a005e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD04/USD04.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD05/USD05.xml new file mode 100644 index 000000000..ee92a45af --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD05/USD05.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD06/USD06.xml new file mode 100644 index 000000000..0410e8116 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN02/USD06/USD06.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml new file mode 100644 index 000000000..28d947e10 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/LAN03.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD01/USD01.xml new file mode 100644 index 000000000..6856270db --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD01/USD01.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD02/USD02.xml new file mode 100644 index 000000000..19e99e094 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD02/USD02.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD03/USD03.xml new file mode 100644 index 000000000..5acb37ab9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD03/USD03.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD04/USD04.xml new file mode 100644 index 000000000..e314ed10f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD04/USD04.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD05/USD05.xml new file mode 100644 index 000000000..178e0a14a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD05/USD05.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD06/USD06.xml new file mode 100644 index 000000000..db99028d7 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN03/USD06/USD06.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml new file mode 100644 index 000000000..57ae9510d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/LAN04.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD02/USD02.xml new file mode 100644 index 000000000..57309f904 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD02/USD02.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD03/USD03.xml new file mode 100644 index 000000000..b05f50cc2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD03/USD03.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD04/USD04.xml new file mode 100644 index 000000000..2558227e9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD04/USD04.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD05/USD05.xml new file mode 100644 index 000000000..620a75528 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD05/USD05.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD06/USD06.xml new file mode 100644 index 000000000..923f80e53 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN04/USD06/USD06.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml new file mode 100644 index 000000000..c34ec41d4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/LAN05.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD01/USD01.xml new file mode 100644 index 000000000..86da35e4c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD01/USD01.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD02/USD02.xml new file mode 100644 index 000000000..46f77033e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD02/USD02.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD03/USD03.xml new file mode 100644 index 000000000..bb3220bf0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD03/USD03.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD04/USD04.xml new file mode 100644 index 000000000..599917772 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD04/USD04.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD05/USD05.xml new file mode 100644 index 000000000..006b926a1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD05/USD05.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD06/USD06.xml new file mode 100644 index 000000000..5a35f3714 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN05/USD06/USD06.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml new file mode 100644 index 000000000..c6448ad13 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/LAN06.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD02/USD02.xml new file mode 100644 index 000000000..c1658e5c6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD02/USD02.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD03/USD03.xml new file mode 100644 index 000000000..869665ff8 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD03/USD03.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD04/USD04.xml new file mode 100644 index 000000000..dfe1c36a6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD04/USD04.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD05/USD05.xml new file mode 100644 index 000000000..491c2acf2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD05/USD05.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD06/USD06.xml new file mode 100644 index 000000000..d16cfff39 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN06/USD06/USD06.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml new file mode 100644 index 000000000..1e978e459 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/LAN07.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD01/USD01.xml new file mode 100644 index 000000000..5f99c52d6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD01/USD01.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD02/USD02.xml new file mode 100644 index 000000000..5df8788c0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD02/USD02.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD03/USD03.xml new file mode 100644 index 000000000..93d367491 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD03/USD03.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD04/USD04.xml new file mode 100644 index 000000000..1dce19ecb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD04/USD04.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD05/USD05.xml new file mode 100644 index 000000000..421870640 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD05/USD05.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD06/USD06.xml new file mode 100644 index 000000000..d09858a56 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD06/USD06.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD07/USD07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD07/USD07.xml new file mode 100644 index 000000000..ebb788ee3 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN07/USD07/USD07.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml new file mode 100644 index 000000000..f29a4c334 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/LAN08.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD02/USD02.xml new file mode 100644 index 000000000..baf915ac4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD02/USD02.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD03/USD03.xml new file mode 100644 index 000000000..0c4de9986 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD03/USD03.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD04/USD04.xml new file mode 100644 index 000000000..d0e6e3c13 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD05/USD05.xml new file mode 100644 index 000000000..ec36355ea --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD05/USD05.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD06/USD06.xml new file mode 100644 index 000000000..9ba66da91 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN08/USD06/USD06.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml new file mode 100644 index 000000000..03f1e2ae4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/LAN09.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD01/USD01.xml new file mode 100644 index 000000000..16edb4fc0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD01/USD01.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD02/USD02.xml new file mode 100644 index 000000000..e31277afd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD02/USD02.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD03/USD03.xml new file mode 100644 index 000000000..50fe8f88f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD03/USD03.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD04/USD04.xml new file mode 100644 index 000000000..1f7096c11 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD05/USD05.xml new file mode 100644 index 000000000..78cd39c39 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD05/USD05.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD06/USD06.xml new file mode 100644 index 000000000..3944b721a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN09/USD06/USD06.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml new file mode 100644 index 000000000..677e6cd1b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/LAN10.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD02/USD02.xml new file mode 100644 index 000000000..6391d563b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD03/USD03.xml new file mode 100644 index 000000000..f72caa051 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD03/USD03.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD04/USD04.xml new file mode 100644 index 000000000..5ce732a6d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD04/USD04.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD05/USD05.xml new file mode 100644 index 000000000..893edea0e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD05/USD05.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD06/USD06.xml new file mode 100644 index 000000000..6d962490d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN10/USD06/USD06.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml new file mode 100644 index 000000000..79b661ddc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/LAN11.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD01/USD01.xml new file mode 100644 index 000000000..74b41228e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD01/USD01.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD02/USD02.xml new file mode 100644 index 000000000..e44bf7287 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD03/USD03.xml new file mode 100644 index 000000000..c7a13641c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD03/USD03.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD04/USD04.xml new file mode 100644 index 000000000..823d8e7a5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD04/USD04.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD05/USD05.xml new file mode 100644 index 000000000..cc7cf6801 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD05/USD05.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD06/USD06.xml new file mode 100644 index 000000000..75686848e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN11/USD06/USD06.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml new file mode 100644 index 000000000..a62a80c7a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/LAN12.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD02/USD02.xml new file mode 100644 index 000000000..23ad91436 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD02/USD02.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD03/USD03.xml new file mode 100644 index 000000000..bff6d55db --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD03/USD03.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD04/USD04.xml new file mode 100644 index 000000000..71f499b5c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD04/USD04.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD05/USD05.xml new file mode 100644 index 000000000..c03b145cb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD05/USD05.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD06/USD06.xml new file mode 100644 index 000000000..7530a3a8d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR01/LAN12/USD06/USD06.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml new file mode 100644 index 000000000..9a7000514 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/LAN01.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD01/USD01.xml new file mode 100644 index 000000000..161f42449 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD01/USD01.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD02/USD02.xml new file mode 100644 index 000000000..6b3b2cc75 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD02/USD02.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD03/USD03.xml new file mode 100644 index 000000000..638ef4160 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD03/USD03.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD04/USD04.xml new file mode 100644 index 000000000..893c3fdd1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD04/USD04.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD05/USD05.xml new file mode 100644 index 000000000..25853d4e5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD05/USD05.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD06/USD06.xml new file mode 100644 index 000000000..618c7d4c8 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN01/USD06/USD06.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml new file mode 100644 index 000000000..49a1274e9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/LAN02.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD02/USD02.xml new file mode 100644 index 000000000..e003d342c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD02/USD02.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD03/USD03.xml new file mode 100644 index 000000000..aeb5b6215 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD03/USD03.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD04/USD04.xml new file mode 100644 index 000000000..a48775d15 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD04/USD04.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD05/USD05.xml new file mode 100644 index 000000000..639825164 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD05/USD05.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD06/USD06.xml new file mode 100644 index 000000000..f20af1d5b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN02/USD06/USD06.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml new file mode 100644 index 000000000..0cf6161f1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/LAN03.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD01/USD01.xml new file mode 100644 index 000000000..8152316e5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD01/USD01.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD02/USD02.xml new file mode 100644 index 000000000..e73eecde9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD02/USD02.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD03/USD03.xml new file mode 100644 index 000000000..044d9fc01 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD03/USD03.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD04/USD04.xml new file mode 100644 index 000000000..9409b3c6b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD04/USD04.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD05/USD05.xml new file mode 100644 index 000000000..0a659ad8a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD05/USD05.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD06/USD06.xml new file mode 100644 index 000000000..55cfa826b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN03/USD06/USD06.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml new file mode 100644 index 000000000..2f253082d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/LAN04.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD02/USD02.xml new file mode 100644 index 000000000..9e080d8dc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD02/USD02.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD03/USD03.xml new file mode 100644 index 000000000..dc3c962b7 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD03/USD03.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD04/USD04.xml new file mode 100644 index 000000000..40e60bc81 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD04/USD04.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD05/USD05.xml new file mode 100644 index 000000000..1ca7db75d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD05/USD05.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD06/USD06.xml new file mode 100644 index 000000000..65385b780 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN04/USD06/USD06.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml new file mode 100644 index 000000000..e7a7e499b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/LAN05.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD01/USD01.xml new file mode 100644 index 000000000..8bf0630d5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD01/USD01.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD02/USD02.xml new file mode 100644 index 000000000..051e52a87 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD02/USD02.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD03/USD03.xml new file mode 100644 index 000000000..f60d4e603 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD03/USD03.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD04/USD04.xml new file mode 100644 index 000000000..2029f01bc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD04/USD04.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD05/USD05.xml new file mode 100644 index 000000000..9090482fe --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD05/USD05.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD06/USD06.xml new file mode 100644 index 000000000..e48d05e3c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN05/USD06/USD06.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml new file mode 100644 index 000000000..8fb681373 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/LAN06.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD02/USD02.xml new file mode 100644 index 000000000..8864a12c0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD02/USD02.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD03/USD03.xml new file mode 100644 index 000000000..bd14deb11 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD03/USD03.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD04/USD04.xml new file mode 100644 index 000000000..cca7ef630 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD04/USD04.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD05/USD05.xml new file mode 100644 index 000000000..f514e5752 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD05/USD05.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD06/USD06.xml new file mode 100644 index 000000000..83a68d186 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN06/USD06/USD06.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml new file mode 100644 index 000000000..fd124292c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/LAN07.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD01/USD01.xml new file mode 100644 index 000000000..024296c06 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD01/USD01.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD02/USD02.xml new file mode 100644 index 000000000..591ae57a1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD02/USD02.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD03/USD03.xml new file mode 100644 index 000000000..cc5b30e07 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD03/USD03.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD04/USD04.xml new file mode 100644 index 000000000..d5a4ed3e2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD04/USD04.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD05/USD05.xml new file mode 100644 index 000000000..4825bea58 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD05/USD05.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD06/USD06.xml new file mode 100644 index 000000000..08743b255 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD06/USD06.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD07/USD07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD07/USD07.xml new file mode 100644 index 000000000..2cf59db1e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN07/USD07/USD07.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml new file mode 100644 index 000000000..6c9232eae --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/LAN08.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD02/USD02.xml new file mode 100644 index 000000000..3f1e2bf09 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD02/USD02.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD03/USD03.xml new file mode 100644 index 000000000..052bb3cac --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD03/USD03.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD04/USD04.xml new file mode 100644 index 000000000..e564e11fe --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD05/USD05.xml new file mode 100644 index 000000000..8293f79fb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD05/USD05.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD06/USD06.xml new file mode 100644 index 000000000..7490ccc43 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN08/USD06/USD06.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml new file mode 100644 index 000000000..3a107a429 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/LAN09.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD01/USD01.xml new file mode 100644 index 000000000..092efc242 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD01/USD01.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD02/USD02.xml new file mode 100644 index 000000000..15dfea2fa --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD02/USD02.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD03/USD03.xml new file mode 100644 index 000000000..bd3e79057 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD03/USD03.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD04/USD04.xml new file mode 100644 index 000000000..a205cb893 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD05/USD05.xml new file mode 100644 index 000000000..0ceb4f2d5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD05/USD05.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD06/USD06.xml new file mode 100644 index 000000000..29a590052 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN09/USD06/USD06.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml new file mode 100644 index 000000000..0446f8f7e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/LAN10.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD02/USD02.xml new file mode 100644 index 000000000..c6fa658e8 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD03/USD03.xml new file mode 100644 index 000000000..e86cc4f04 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD03/USD03.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD04/USD04.xml new file mode 100644 index 000000000..1bc00caf0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD04/USD04.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD05/USD05.xml new file mode 100644 index 000000000..73b5c4c6a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD05/USD05.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD06/USD06.xml new file mode 100644 index 000000000..7095c1055 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN10/USD06/USD06.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml new file mode 100644 index 000000000..098500d9f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/LAN11.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD01/USD01.xml new file mode 100644 index 000000000..cd3347ebd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD01/USD01.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD02/USD02.xml new file mode 100644 index 000000000..f11c254aa --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD03/USD03.xml new file mode 100644 index 000000000..5ab58d5c4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD03/USD03.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD04/USD04.xml new file mode 100644 index 000000000..a11204852 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD04/USD04.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD05/USD05.xml new file mode 100644 index 000000000..6a3e1ca97 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD05/USD05.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD06/USD06.xml new file mode 100644 index 000000000..cb0d85b7c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN11/USD06/USD06.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml new file mode 100644 index 000000000..decc024bc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/LAN12.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD02/USD02.xml new file mode 100644 index 000000000..59543d151 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD02/USD02.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD03/USD03.xml new file mode 100644 index 000000000..a9bc6b7bd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD03/USD03.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD04/USD04.xml new file mode 100644 index 000000000..3e817d2ad --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD04/USD04.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD05/USD05.xml new file mode 100644 index 000000000..071cb9fa4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD05/USD05.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD06/USD06.xml new file mode 100644 index 000000000..51cad64fb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR02/LAN12/USD06/USD06.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml new file mode 100644 index 000000000..6634b168f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/LAN01.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD01/USD01.xml new file mode 100644 index 000000000..a6903cb5b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD01/USD01.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD02/USD02.xml new file mode 100644 index 000000000..b66b0f350 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD02/USD02.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD03/USD03.xml new file mode 100644 index 000000000..b98b6b591 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD03/USD03.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD04/USD04.xml new file mode 100644 index 000000000..69d719766 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD04/USD04.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD05/USD05.xml new file mode 100644 index 000000000..0c6f43bd1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD05/USD05.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD06/USD06.xml new file mode 100644 index 000000000..487eeab7a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN01/USD06/USD06.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml new file mode 100644 index 000000000..ad7363dae --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/LAN02.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD02/USD02.xml new file mode 100644 index 000000000..ea0bb982d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD02/USD02.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD03/USD03.xml new file mode 100644 index 000000000..9fe92d3d2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD03/USD03.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD04/USD04.xml new file mode 100644 index 000000000..5535b1fe0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD04/USD04.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD05/USD05.xml new file mode 100644 index 000000000..66b1a25a6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD05/USD05.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD06/USD06.xml new file mode 100644 index 000000000..9a534bc37 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN02/USD06/USD06.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml new file mode 100644 index 000000000..ccbadf57e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/LAN03.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD01/USD01.xml new file mode 100644 index 000000000..921df8561 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD01/USD01.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD02/USD02.xml new file mode 100644 index 000000000..d2ed3c376 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD02/USD02.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD03/USD03.xml new file mode 100644 index 000000000..66674a8ae --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD03/USD03.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD04/USD04.xml new file mode 100644 index 000000000..431d584da --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD04/USD04.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD05/USD05.xml new file mode 100644 index 000000000..f09c489d4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD05/USD05.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD06/USD06.xml new file mode 100644 index 000000000..3363337ba --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN03/USD06/USD06.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml new file mode 100644 index 000000000..0b19775c0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/LAN04.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD02/USD02.xml new file mode 100644 index 000000000..20d701886 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD02/USD02.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD03/USD03.xml new file mode 100644 index 000000000..6235b5f31 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD03/USD03.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD04/USD04.xml new file mode 100644 index 000000000..38c97adec --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD04/USD04.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD05/USD05.xml new file mode 100644 index 000000000..f1bcb88ab --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD05/USD05.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD06/USD06.xml new file mode 100644 index 000000000..c0e1ef09d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN04/USD06/USD06.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml new file mode 100644 index 000000000..d41d490b1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/LAN05.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD01/USD01.xml new file mode 100644 index 000000000..82ba146fb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD01/USD01.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD02/USD02.xml new file mode 100644 index 000000000..548b11a74 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD02/USD02.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD03/USD03.xml new file mode 100644 index 000000000..f39ae4273 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD03/USD03.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD04/USD04.xml new file mode 100644 index 000000000..619885464 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD04/USD04.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD05/USD05.xml new file mode 100644 index 000000000..7fc0be2d2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD05/USD05.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD06/USD06.xml new file mode 100644 index 000000000..f60e463a6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN05/USD06/USD06.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml new file mode 100644 index 000000000..a6868d954 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/LAN06.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD02/USD02.xml new file mode 100644 index 000000000..b1217bbb5 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD02/USD02.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD03/USD03.xml new file mode 100644 index 000000000..25d7f53b8 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD03/USD03.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD04/USD04.xml new file mode 100644 index 000000000..a702597bd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD04/USD04.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD05/USD05.xml new file mode 100644 index 000000000..41775d84f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD05/USD05.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD06/USD06.xml new file mode 100644 index 000000000..47aacee63 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN06/USD06/USD06.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml new file mode 100644 index 000000000..8014987fc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/LAN07.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD01/USD01.xml new file mode 100644 index 000000000..9e979d048 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD01/USD01.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD02/USD02.xml new file mode 100644 index 000000000..c5f0a890b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD02/USD02.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD03/USD03.xml new file mode 100644 index 000000000..b5db6bf36 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD03/USD03.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD04/USD04.xml new file mode 100644 index 000000000..4e0ff54ff --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD04/USD04.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD05/USD05.xml new file mode 100644 index 000000000..67d1793a4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD05/USD05.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD06/USD06.xml new file mode 100644 index 000000000..bc4d2cdf4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD06/USD06.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD07/USD07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD07/USD07.xml new file mode 100644 index 000000000..70724b590 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN07/USD07/USD07.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml new file mode 100644 index 000000000..9efb9e5a9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/LAN08.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD02/USD02.xml new file mode 100644 index 000000000..b74d0ce93 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD02/USD02.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD03/USD03.xml new file mode 100644 index 000000000..7bdc711c0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD03/USD03.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD04/USD04.xml new file mode 100644 index 000000000..07b15883a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD05/USD05.xml new file mode 100644 index 000000000..1f0c1cf55 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD05/USD05.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD06/USD06.xml new file mode 100644 index 000000000..bec5c3bbb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN08/USD06/USD06.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml new file mode 100644 index 000000000..9d6d12b40 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/LAN09.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD01/USD01.xml new file mode 100644 index 000000000..567e7b400 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD01/USD01.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD02/USD02.xml new file mode 100644 index 000000000..047db3449 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD02/USD02.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD03/USD03.xml new file mode 100644 index 000000000..e92f96dec --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD03/USD03.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD04/USD04.xml new file mode 100644 index 000000000..99e9e4641 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD05/USD05.xml new file mode 100644 index 000000000..991a74b1a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD05/USD05.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD06/USD06.xml new file mode 100644 index 000000000..84ede4e1e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN09/USD06/USD06.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml new file mode 100644 index 000000000..1850e83c8 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/LAN10.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD02/USD02.xml new file mode 100644 index 000000000..33e2666cc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD03/USD03.xml new file mode 100644 index 000000000..721e34c65 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD03/USD03.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD04/USD04.xml new file mode 100644 index 000000000..bdcbaae70 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD04/USD04.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD05/USD05.xml new file mode 100644 index 000000000..5beace722 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD05/USD05.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD06/USD06.xml new file mode 100644 index 000000000..ebac52436 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN10/USD06/USD06.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml new file mode 100644 index 000000000..32d556537 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/LAN11.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD01/USD01.xml new file mode 100644 index 000000000..deade0a88 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD01/USD01.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD02/USD02.xml new file mode 100644 index 000000000..6d4fe37be --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD03/USD03.xml new file mode 100644 index 000000000..80bb31d74 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD03/USD03.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD04/USD04.xml new file mode 100644 index 000000000..26aa87944 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD04/USD04.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD05/USD05.xml new file mode 100644 index 000000000..b8ce8a4ab --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD05/USD05.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD06/USD06.xml new file mode 100644 index 000000000..9803e74fc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN11/USD06/USD06.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml new file mode 100644 index 000000000..6a7b82286 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/LAN12.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD02/USD02.xml new file mode 100644 index 000000000..a3f1a17db --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD02/USD02.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD03/USD03.xml new file mode 100644 index 000000000..04c987ab4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD03/USD03.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD04/USD04.xml new file mode 100644 index 000000000..595a79751 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD04/USD04.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD05/USD05.xml new file mode 100644 index 000000000..f543f7071 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD05/USD05.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD06/USD06.xml new file mode 100644 index 000000000..1b8a78e71 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/LAN12/USD06/USD06.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR03/set_calibrate.py b/Noto/Configuration/CDB/alma/AS/SECTOR03/set_calibrate.py new file mode 100755 index 000000000..ebe8c505d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR03/set_calibrate.py @@ -0,0 +1,24 @@ +import os, fnmatch + +path = os.path.dirname(os.path.abspath(__file__)) + +result = [] +for root, dirs, files in os.walk(path): + for name in files: + if fnmatch.fnmatch(name, 'USD*.xml'): + result.append(os.path.join(root, name)) + +counter = 0 + +for filename in result: + counter += 1 + os.rename(filename, filename + '.bak') + original = open(filename + '.bak', 'r') + new = open(filename, 'w') + for fileline in original: + new.write(fileline.replace('sector="2"', 'sector="3"')) + original.close() + os.remove(filename + '.bak') + new.close() + +print(str(counter) + " files edited.") diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml new file mode 100644 index 000000000..816857770 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/LAN01.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD01/USD01.xml new file mode 100644 index 000000000..4d2be9e8e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD01/USD01.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD02/USD02.xml new file mode 100644 index 000000000..fa4e772d4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD02/USD02.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD03/USD03.xml new file mode 100644 index 000000000..114f0ed7f --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD03/USD03.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD04/USD04.xml new file mode 100644 index 000000000..b44c48e70 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD04/USD04.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD05/USD05.xml new file mode 100644 index 000000000..429e72a56 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD05/USD05.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD06/USD06.xml new file mode 100644 index 000000000..e0f4e8011 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN01/USD06/USD06.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml new file mode 100644 index 000000000..4013ff03b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/LAN02.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD02/USD02.xml new file mode 100644 index 000000000..9b7fd35bb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD02/USD02.xml @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD03/USD03.xml new file mode 100644 index 000000000..6fe838767 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD03/USD03.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD04/USD04.xml new file mode 100644 index 000000000..c3370fc16 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD04/USD04.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD05/USD05.xml new file mode 100644 index 000000000..4b0b9755c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD05/USD05.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD06/USD06.xml new file mode 100644 index 000000000..434e28258 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN02/USD06/USD06.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml new file mode 100644 index 000000000..a7535d0fd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/LAN03.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD01/USD01.xml new file mode 100644 index 000000000..1b6aeaf71 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD01/USD01.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD02/USD02.xml new file mode 100644 index 000000000..d476bf3ec --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD02/USD02.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD03/USD03.xml new file mode 100644 index 000000000..c104b5568 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD03/USD03.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD04/USD04.xml new file mode 100644 index 000000000..b13bcbf70 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD04/USD04.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD05/USD05.xml new file mode 100644 index 000000000..4caaf3362 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD05/USD05.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD06/USD06.xml new file mode 100644 index 000000000..38fde25bb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN03/USD06/USD06.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml new file mode 100644 index 000000000..cbf40b8f1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/LAN04.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD02/USD02.xml new file mode 100644 index 000000000..4ff99d2d4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD02/USD02.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD03/USD03.xml new file mode 100644 index 000000000..5dfda939a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD03/USD03.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD04/USD04.xml new file mode 100644 index 000000000..de8ea04d0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD04/USD04.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD05/USD05.xml new file mode 100644 index 000000000..384a206b2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD05/USD05.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD06/USD06.xml new file mode 100644 index 000000000..2a6244b1d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN04/USD06/USD06.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml new file mode 100644 index 000000000..86a008a2a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/LAN05.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD01/USD01.xml new file mode 100644 index 000000000..40a40a9bd --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD01/USD01.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD02/USD02.xml new file mode 100644 index 000000000..fcc68134a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD02/USD02.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD03/USD03.xml new file mode 100644 index 000000000..a2faf41d0 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD03/USD03.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD04/USD04.xml new file mode 100644 index 000000000..04c2e1adc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD04/USD04.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD05/USD05.xml new file mode 100644 index 000000000..2f748a7fa --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD05/USD05.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD06/USD06.xml new file mode 100644 index 000000000..ab9934c59 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN05/USD06/USD06.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml new file mode 100644 index 000000000..5081bc647 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/LAN06.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD02/USD02.xml new file mode 100644 index 000000000..d0f5278e7 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD02/USD02.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD03/USD03.xml new file mode 100644 index 000000000..ae9cfd987 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD03/USD03.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD04/USD04.xml new file mode 100644 index 000000000..ae397b847 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD04/USD04.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD05/USD05.xml new file mode 100644 index 000000000..fe28b2398 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD05/USD05.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD06/USD06.xml new file mode 100644 index 000000000..901fe47fa --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN06/USD06/USD06.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml new file mode 100644 index 000000000..5c0a8d4d3 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/LAN07.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD01/USD01.xml new file mode 100644 index 000000000..ee4eb84cf --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD01/USD01.xml @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD02/USD02.xml new file mode 100644 index 000000000..994fac64a --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD02/USD02.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD03/USD03.xml new file mode 100644 index 000000000..4ed8988e6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD03/USD03.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD04/USD04.xml new file mode 100644 index 000000000..6e91e7cd2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD04/USD04.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD05/USD05.xml new file mode 100644 index 000000000..0932fa058 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD05/USD05.xml @@ -0,0 +1,212 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD06/USD06.xml new file mode 100644 index 000000000..4402f2eaf --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD06/USD06.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD07/USD07.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD07/USD07.xml new file mode 100644 index 000000000..b37cd1ca3 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN07/USD07/USD07.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml new file mode 100644 index 000000000..c61ce2391 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/LAN08.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD02/USD02.xml new file mode 100644 index 000000000..bef639a55 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD02/USD02.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD03/USD03.xml new file mode 100644 index 000000000..731a8ee9e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD03/USD03.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD04/USD04.xml new file mode 100644 index 000000000..bf8e79fa4 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD05/USD05.xml new file mode 100644 index 000000000..9fb92f089 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD05/USD05.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD06/USD06.xml new file mode 100644 index 000000000..3817c36bb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN08/USD06/USD06.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml new file mode 100644 index 000000000..4d6f09032 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/LAN09.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD01/USD01.xml new file mode 100644 index 000000000..d24431953 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD01/USD01.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD02/USD02.xml new file mode 100644 index 000000000..f55f63e3d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD02/USD02.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD03/USD03.xml new file mode 100644 index 000000000..4cb08f3bf --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD03/USD03.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD04/USD04.xml new file mode 100644 index 000000000..1032c470e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD04/USD04.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD05/USD05.xml new file mode 100644 index 000000000..4187be3f3 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD05/USD05.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD06/USD06.xml new file mode 100644 index 000000000..28b173d31 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN09/USD06/USD06.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml new file mode 100644 index 000000000..08432c4be --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/LAN10.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD02/USD02.xml new file mode 100644 index 000000000..c001ffd78 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD03/USD03.xml new file mode 100644 index 000000000..6d32c4fab --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD03/USD03.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD04/USD04.xml new file mode 100644 index 000000000..f04fe9794 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD04/USD04.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD05/USD05.xml new file mode 100644 index 000000000..666c7de3e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD05/USD05.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD06/USD06.xml new file mode 100644 index 000000000..c4e99a731 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN10/USD06/USD06.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml new file mode 100644 index 000000000..b73771eb6 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/LAN11.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD01/USD01.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD01/USD01.xml new file mode 100644 index 000000000..f54433963 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD01/USD01.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD02/USD02.xml new file mode 100644 index 000000000..9b719bd81 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD02/USD02.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD03/USD03.xml new file mode 100644 index 000000000..71bb3811e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD03/USD03.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD04/USD04.xml new file mode 100644 index 000000000..3674ddca2 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD04/USD04.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD05/USD05.xml new file mode 100644 index 000000000..9d0de6473 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD05/USD05.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD06/USD06.xml new file mode 100644 index 000000000..6bcc3d2ca --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN11/USD06/USD06.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml new file mode 100644 index 000000000..d6151cecf --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/LAN12.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD02/USD02.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD02/USD02.xml new file mode 100644 index 000000000..c5ce45827 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD02/USD02.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD03/USD03.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD03/USD03.xml new file mode 100644 index 000000000..caf7ca2cb --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD03/USD03.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD04/USD04.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD04/USD04.xml new file mode 100644 index 000000000..902072426 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD04/USD04.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD05/USD05.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD05/USD05.xml new file mode 100644 index 000000000..892d13971 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD05/USD05.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD06/USD06.xml b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD06/USD06.xml new file mode 100644 index 000000000..f0d5cc27d --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/LAN12/USD06/USD06.xml @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + diff --git a/Noto/Configuration/CDB/alma/AS/SECTOR04/set_calibrate.py b/Noto/Configuration/CDB/alma/AS/SECTOR04/set_calibrate.py new file mode 100755 index 000000000..438835183 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/SECTOR04/set_calibrate.py @@ -0,0 +1,24 @@ +import os, fnmatch + +path = os.path.dirname(os.path.abspath(__file__)) + +result = [] +for root, dirs, files in os.walk(path): + for name in files: + if fnmatch.fnmatch(name, 'USD*.xml'): + result.append(os.path.join(root, name)) + +counter = 0 + +for filename in result: + counter += 1 + os.rename(filename, filename + '.bak') + original = open(filename + '.bak', 'r') + new = open(filename, 'w') + for fileline in original: + new.write(fileline.replace('sector="3"', 'sector="4"')) + original.close() + os.remove(filename + '.bak') + new.close() + +print(str(counter) + " files edited.") diff --git a/Noto/Configuration/CDB/alma/AS/act_Noto_rev01.txt b/Noto/Configuration/CDB/alma/AS/act_Noto_rev01.txt new file mode 100644 index 000000000..9dc044a0b --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/act_Noto_rev01.txt @@ -0,0 +1,268 @@ +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.000 0.000 0.000 0.000 0.000 0.000 0.000 +0.104 0.003 -0.309 -0.422 -0.567 -0.696 0.000 +0.110 -0.150 -0.506 -0.652 -0.876 -1.127 0.000 +0.171 0.108 -0.152 -0.367 -0.466 -0.738 0.000 +0.101 -0.122 -0.252 -0.492 -0.660 -0.900 0.000 +0.008 0.027 -0.075 -0.154 -0.300 -0.523 0.000 +-0.193 -0.267 -0.042 -0.085 -0.184 -0.295 0.000 +-0.154 -0.152 -0.063 -0.055 -0.071 -0.146 0.000 +-0.145 -0.084 0.043 0.055 0.035 0.081 0.000 +-0.399 -0.239 0.056 0.192 0.314 0.411 0.000 +-0.424 -0.403 -0.218 -0.062 0.208 0.154 0.000 +-0.242 -0.074 -0.091 0.133 0.347 0.522 0.000 +-0.200 -0.210 0.110 0.290 0.485 0.560 0.000 +-0.225 -0.179 -0.052 0.172 0.345 0.492 0.000 +-0.253 -0.237 -0.032 0.157 0.271 0.305 0.000 +-0.011 0.009 0.016 0.040 0.170 0.196 0.000 +0.091 0.066 0.067 0.183 0.142 0.145 0.000 +0.425 0.341 -0.143 -0.195 -0.323 -0.505 0.000 +0.382 0.423 0.161 0.045 -0.082 -0.240 0.000 +0.509 0.493 -0.093 -0.290 -0.437 -0.570 0.000 +0.406 0.449 0.269 0.062 -0.029 -0.136 0.000 +0.253 0.244 -0.130 -0.368 -0.493 -0.663 0.000 +0.225 0.360 0.184 0.123 0.016 -0.107 0.000 +0.049 0.088 -0.250 -0.340 -0.467 -0.659 0.000 +0.375 0.468 0.409 0.365 0.356 0.112 0.000 +0.218 0.175 -0.024 -0.233 -0.346 -0.433 0.000 +0.391 0.507 0.362 0.267 0.175 0.104 0.000 +0.249 0.237 -0.059 -0.170 -0.392 -0.439 0.000 +0.440 0.652 0.203 0.205 0.053 -0.131 0.000 +0.289 0.366 -0.157 -0.329 -0.560 -0.740 0.000 +0.747 0.525 0.482 0.424 0.128 -0.041 0.000 +0.481 0.365 0.118 0.031 -0.273 -0.455 0.000 +0.850 0.878 0.675 0.466 0.258 0.095 0.000 +0.391 0.202 0.055 -0.108 -0.214 -0.398 0.000 +0.412 0.402 0.388 0.455 0.460 0.418 0.000 +0.020 0.000 -0.123 0.047 0.014 0.077 0.000 +0.033 0.126 0.165 0.327 0.579 0.612 0.000 +-0.219 -0.308 -0.278 -0.035 0.258 0.339 0.000 +-0.026 0.133 0.036 0.248 0.526 0.585 0.000 +-0.039 -0.069 -0.125 0.060 0.303 0.443 0.000 +-0.097 -0.062 -0.076 0.117 0.291 0.386 0.000 +-0.320 -0.233 -0.182 0.098 0.277 0.288 0.000 +-0.288 -0.107 -0.064 -0.013 -0.148 -0.089 0.000 +-0.258 -0.162 -0.328 -0.167 -0.153 -0.196 0.000 +0.044 0.048 -0.176 -0.224 -0.227 -0.303 0.000 +0.162 0.101 -0.005 -0.132 -0.305 -0.317 0.000 +0.220 0.104 -0.209 -0.331 -0.528 -0.691 0.000 +0.219 0.113 -0.115 -0.269 -0.471 -0.550 0.000 +0.213 0.097 -0.195 -0.383 -0.610 -0.744 0.000 +0.692 0.475 -0.020 -0.365 -0.704 -1.251 0.000 +0.339 0.261 -0.274 -0.604 -0.969 -1.409 0.000 +0.605 0.363 0.037 -0.364 -0.725 -1.105 0.000 +0.382 0.203 -0.041 -0.350 -0.665 -0.989 0.000 +0.543 0.293 0.170 -0.222 -0.517 -0.811 0.000 +0.023 0.039 0.019 -0.109 -0.290 -0.530 0.000 +0.182 0.191 0.239 0.034 -0.121 -0.352 0.000 +-0.524 -0.250 0.228 0.368 0.513 0.435 0.000 +-0.560 -0.340 0.193 0.347 0.495 0.509 0.000 +-0.983 -0.575 -0.008 0.405 0.660 0.767 0.000 +-0.635 -0.455 0.184 0.456 0.605 0.600 0.000 +-0.861 -0.533 -0.298 -0.063 0.025 0.109 0.000 +-0.152 -0.166 0.075 0.223 0.205 0.170 0.000 +0.102 0.054 0.020 0.065 -0.014 -0.180 0.000 +0.687 0.405 0.252 0.182 -0.014 -0.159 0.000 +0.636 0.426 -0.043 -0.173 -0.414 -0.534 0.000 +0.616 0.444 0.118 -0.067 -0.454 -0.689 0.000 +0.762 0.550 -0.121 -0.357 -0.730 -0.904 0.000 +0.486 0.137 0.092 -0.048 -0.425 -0.670 0.000 +0.333 0.041 0.035 -0.123 -0.502 -0.768 0.000 +0.055 -0.270 0.034 -0.051 -0.336 -0.485 0.000 +-0.026 -0.061 -0.050 -0.162 -0.411 -0.660 0.000 +-0.215 -0.477 -0.198 -0.269 -0.463 -0.643 0.000 +-0.218 -0.558 -0.146 -0.266 -0.476 -0.676 0.000 +-0.200 -0.528 -0.048 -0.170 -0.257 -0.451 0.000 +-0.068 -0.201 -0.137 -0.269 -0.453 -0.667 0.000 +-0.039 -0.379 0.004 -0.156 -0.330 -0.535 0.000 +0.097 -0.248 0.010 -0.105 -0.348 -0.622 0.000 +0.189 -0.340 0.057 -0.121 -0.452 -0.781 0.000 +0.433 -0.014 -0.160 -0.367 -0.656 -0.929 0.000 +0.599 0.078 0.057 -0.264 -0.602 -0.916 0.000 +0.856 0.527 0.059 -0.260 -0.512 -0.874 0.000 +0.952 0.515 0.140 -0.150 -0.474 -0.700 0.000 +1.149 0.552 0.300 0.072 -0.196 -0.400 0.000 +0.951 0.744 0.270 0.122 -0.036 -0.295 0.000 +0.601 0.562 0.255 0.300 0.253 0.153 0.000 +0.076 -0.065 -0.015 0.071 0.059 0.097 0.000 +-0.240 -0.331 0.148 0.273 0.452 0.542 0.000 +-0.239 -0.239 0.143 0.385 0.484 0.511 0.000 +-0.606 -0.385 0.272 0.612 0.761 0.971 0.000 +-0.393 -0.234 -0.020 0.246 0.324 0.356 0.000 +-0.374 -0.128 0.008 0.343 0.456 0.444 0.000 +0.310 0.322 0.184 0.162 -0.074 -0.335 0.000 +0.125 0.010 -0.042 -0.121 -0.298 -0.489 0.000 +0.680 0.467 0.156 -0.139 -0.455 -0.730 0.000 +0.506 0.383 0.048 -0.203 -0.588 -0.772 0.000 +0.683 0.436 0.019 -0.352 -0.786 -1.028 0.000 +0.453 0.305 -0.112 -0.401 -0.839 -0.976 0.000 +1.230 0.691 0.067 -0.662 -1.261 -1.565 0.000 +1.001 0.581 -0.047 -0.790 -1.392 -1.758 0.000 +1.447 0.962 0.390 -0.423 -1.121 -1.389 0.000 +1.107 0.673 0.261 -0.499 -1.260 -1.575 0.000 +1.332 0.876 0.559 -0.236 -0.898 -1.356 0.000 +1.166 0.860 0.518 -0.144 -0.756 -1.308 0.000 +1.378 1.355 1.026 0.336 -0.379 -1.015 0.000 +0.634 0.459 0.561 0.310 -0.130 -0.495 0.000 +0.348 0.292 0.837 0.771 0.525 0.312 0.000 +0.065 0.125 0.677 0.779 0.743 0.559 0.000 +-0.029 0.088 0.635 0.829 0.815 0.649 0.000 +0.104 0.349 0.660 0.707 0.723 0.460 0.000 +0.346 0.290 0.461 0.499 0.424 0.162 0.000 +0.348 0.493 0.317 0.305 0.185 -0.154 0.000 +0.346 0.347 0.034 -0.089 -0.400 -0.613 0.000 +0.697 0.523 0.041 -0.140 -0.496 -0.904 0.000 +0.298 0.217 -0.109 -0.311 -0.646 -1.095 0.000 +0.204 0.174 -0.195 -0.396 -0.845 -1.333 0.000 +-0.138 0.669 -0.304 -0.382 -1.005 -1.558 0.000 +-0.258 -0.097 -0.325 -0.367 -0.924 -1.437 0.000 +-0.508 -0.364 -0.276 -0.277 -0.681 -1.088 0.000 +-0.257 -0.102 -0.065 -0.110 -0.382 -0.649 0.000 +-0.667 -0.262 -0.342 -0.242 -0.431 -0.614 0.000 +-0.323 -0.234 0.029 -0.033 -0.161 -0.368 0.000 +-0.868 -0.519 -0.444 -0.347 -0.417 -0.530 0.000 +-0.643 -0.478 -0.395 -0.387 -0.525 -0.863 0.000 +-1.074 -0.475 -0.635 -0.494 -0.624 -0.917 0.000 +-0.385 0.037 -0.177 -0.234 -0.464 -0.848 0.000 +-1.022 -0.506 -0.888 -0.995 -1.245 -1.738 0.000 +0.253 0.366 -0.249 -0.300 -0.684 -1.176 0.000 +0.586 0.692 0.154 -0.174 -0.561 -1.244 0.000 +0.708 0.606 0.131 -0.234 -0.554 -1.210 0.000 +0.541 0.504 -0.191 -0.470 -0.822 -1.268 0.000 +0.965 0.946 0.033 -0.175 -0.506 -0.896 0.000 +0.764 0.528 -0.009 -0.172 -0.373 -0.700 0.000 +0.563 0.546 0.203 0.051 -0.084 -0.344 0.000 +0.418 0.383 0.288 0.323 0.289 -0.020 0.000 +0.365 0.475 0.620 0.647 0.542 0.493 0.000 +0.021 0.216 0.534 0.614 0.613 0.559 0.000 +0.031 0.193 0.294 0.377 0.360 0.166 0.000 +0.421 0.255 0.597 0.527 0.389 0.204 0.000 +0.811 0.785 0.757 0.544 0.254 -0.171 0.000 +1.070 1.132 0.259 -0.354 -0.972 -1.494 0.000 +1.097 0.908 0.331 -0.146 -0.787 -1.249 0.000 +1.655 1.243 0.523 -0.181 -0.939 -1.281 0.000 +1.081 0.903 0.249 -0.537 -1.187 -1.551 0.000 +1.359 1.008 0.315 -0.417 -1.101 -1.362 0.000 +1.418 0.976 0.322 -0.392 -1.055 -1.362 0.000 +1.989 1.250 0.166 -0.794 -1.640 -1.989 0.000 +2.044 1.176 0.135 -0.863 -1.707 -2.253 0.000 +2.011 1.165 0.029 -0.910 -1.801 -2.322 0.000 +1.921 1.211 0.154 -0.966 -1.913 -2.665 0.000 +2.389 1.721 0.566 -0.605 -1.547 -2.401 0.000 +2.181 1.477 0.379 -0.871 -2.011 -3.160 0.000 +2.476 1.750 1.421 0.020 -1.232 -2.509 0.000 +3.019 2.057 0.319 -1.077 -2.334 -3.610 0.000 +2.062 1.480 1.172 0.335 -0.601 -1.545 0.000 +1.476 0.857 1.103 0.808 0.459 -0.213 0.000 +1.057 0.850 1.199 1.120 0.940 0.443 0.000 +0.720 0.594 1.017 1.186 1.215 0.886 0.000 +0.849 0.801 0.990 0.838 0.783 0.485 0.000 +0.906 0.592 0.715 0.660 0.641 0.331 0.000 +0.637 0.590 0.559 0.372 0.158 -0.220 0.000 +0.655 0.596 0.519 0.382 0.100 -0.229 0.000 +0.744 0.718 0.356 0.106 -0.386 -0.879 0.000 +0.339 0.391 -0.050 -0.132 -0.619 -1.176 0.000 +0.132 0.506 0.033 -0.148 -0.726 -1.518 0.000 +-0.251 -0.142 -0.401 -0.510 -0.776 -1.664 0.000 +-0.504 0.135 0.909 0.820 0.534 -0.354 0.000 +-0.823 -0.352 -0.536 -0.663 -1.251 -2.077 0.000 +-1.532 -0.899 -0.656 -0.548 -0.890 -1.311 0.000 +-1.096 -0.706 -0.271 -0.159 -0.491 -0.845 0.000 +-1.665 -1.114 -0.535 -0.296 -0.352 -0.475 0.000 +-1.132 -0.782 -0.099 0.040 -0.013 -0.200 0.000 +-1.531 -0.317 -0.395 -0.110 -0.003 0.023 0.000 +-0.881 -0.596 0.228 0.400 0.397 0.131 0.000 +-1.094 -0.641 0.036 0.248 0.304 0.106 0.000 +-0.433 0.276 0.414 0.404 0.233 -0.286 0.000 +-0.585 0.229 0.181 0.227 -0.032 -0.488 0.000 +0.186 0.739 0.536 0.330 -0.238 -0.944 0.000 +-0.525 -0.820 -1.162 -1.250 -1.535 -2.422 0.000 +-0.519 0.408 -0.158 -0.247 -0.531 -1.422 0.000 +0.661 1.412 0.706 0.354 -0.112 -1.060 0.000 +0.720 1.131 0.341 0.144 -0.248 -0.913 0.000 +1.123 1.203 0.416 0.185 -0.184 -0.822 0.000 +1.022 0.751 0.455 0.390 0.087 -0.276 0.000 +1.089 0.798 0.712 0.598 0.247 -0.106 0.000 +0.716 0.448 0.587 0.562 0.358 0.076 0.000 +0.987 0.894 1.129 1.026 0.888 0.562 0.000 +0.476 0.490 1.006 0.977 0.956 0.632 0.000 +1.059 0.831 1.252 1.069 0.863 0.345 0.000 +1.348 0.935 1.130 0.736 0.338 -0.230 0.000 +1.924 1.354 0.745 -0.048 -0.881 -1.834 0.000 +2.411 1.758 1.231 -0.010 -1.191 -2.367 0.000 +2.759 1.528 0.107 -1.116 -2.308 -3.475 0.000 +2.609 1.991 0.603 -0.472 -1.557 -2.600 0.000 +2.640 1.887 0.660 -0.333 -1.296 -2.021 0.000 +2.355 1.724 0.377 -0.600 -1.635 -2.167 0.000 +2.252 1.392 0.166 -0.810 -1.676 -2.097 0.000 +2.057 1.383 0.114 -0.884 -1.734 -2.233 0.000 +3.646 2.585 0.837 -0.478 -1.338 -1.788 0.000 +3.574 2.528 0.830 -0.666 -1.725 -2.450 0.000 +3.779 2.629 0.775 -0.554 -1.544 -2.149 0.000 +3.859 2.781 1.135 -0.484 -1.720 -2.766 0.000 +4.301 3.063 1.424 -0.242 -1.543 -2.725 0.000 +4.613 3.443 1.665 -0.307 -1.747 -3.279 0.000 +3.508 2.758 0.583 -1.196 -2.546 -4.081 0.000 +3.052 2.282 1.264 -0.128 -1.174 -2.530 0.000 +2.232 1.848 1.375 0.841 0.325 -0.534 0.000 +1.908 1.531 1.603 1.215 0.881 0.206 0.000 +1.120 0.968 1.195 1.184 1.164 0.972 0.000 +1.405 1.237 1.121 1.017 0.923 0.469 0.000 +0.996 1.091 0.761 0.665 0.642 0.244 0.000 +1.065 0.969 0.528 0.304 0.139 -0.491 0.000 +0.738 0.767 0.120 -0.012 -0.138 -0.720 0.000 +0.625 0.689 0.389 -0.047 -0.462 -1.232 0.000 +-0.102 0.280 -0.477 -0.551 -1.021 -1.780 0.000 +-0.360 0.282 -0.474 -0.649 -1.557 -2.346 0.000 +-1.433 -0.818 -0.956 -1.049 -1.911 -2.745 0.000 +-1.492 -0.718 -0.624 -0.811 -1.481 -2.425 0.000 +-2.124 -1.293 -0.943 -0.771 -0.979 -1.509 0.000 +-2.457 -1.707 -0.538 -0.515 -0.885 -1.221 0.000 +-3.017 -2.083 -1.229 -0.822 -0.822 -1.501 0.000 +-2.700 -2.115 -0.791 -0.598 -0.547 -0.515 0.000 +-3.643 -2.160 -1.655 -1.206 -0.933 -0.720 0.000 +-2.817 -2.032 -0.684 -0.577 -0.530 -0.792 0.000 +-2.905 -2.133 -1.145 -0.890 -0.725 -0.914 0.000 +-2.337 -1.194 -0.533 -0.530 -0.616 -0.936 0.000 +-2.281 -0.955 -0.945 -0.809 -0.947 -0.941 0.000 +-1.452 -0.496 -0.653 -0.858 -1.430 -2.387 0.000 +-1.783 -0.720 -1.329 -1.483 -2.099 -3.165 0.000 +-0.954 -0.244 -0.436 -0.710 -1.414 -2.624 0.000 +-0.305 0.157 -0.554 -0.656 -1.051 -1.900 0.000 +0.219 0.420 -0.298 -0.526 -0.907 -1.728 0.000 +0.614 0.523 -0.037 0.031 -0.213 -0.773 0.000 +0.839 0.457 0.519 0.456 0.180 -0.466 0.000 +0.778 0.486 0.464 0.548 0.328 0.027 0.000 +1.120 0.889 1.030 0.880 0.615 0.131 0.000 +1.020 0.737 1.214 1.258 1.170 0.840 0.000 +1.586 1.257 1.436 0.954 0.534 -0.117 0.000 +2.082 1.604 1.412 0.715 0.060 -0.610 0.000 +3.359 2.411 1.453 0.163 -1.026 -2.266 0.000 +3.441 2.429 0.289 -1.277 -2.725 -4.154 0.000 +4.110 2.790 0.950 -0.764 -2.411 -3.781 0.000 +4.224 3.070 1.173 -0.272 -1.597 -2.532 0.000 +3.943 2.720 1.065 -0.507 -1.791 -2.544 0.000 +3.239 2.770 1.913 0.660 -0.295 -0.786 0.000 +3.585 2.488 0.730 -0.688 -1.660 -2.319 0.000 diff --git a/Noto/Configuration/CDB/alma/AS/act_Noto_rev02.txt b/Noto/Configuration/CDB/alma/AS/act_Noto_rev02.txt new file mode 100644 index 000000000..6367ed04e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/act_Noto_rev02.txt @@ -0,0 +1,244 @@ +-0.696 -0.567 -0.422 -0.309 0.003 0.104 0.000 +-1.127 -0.876 -0.652 -0.506 -0.150 0.110 0.000 +-0.738 -0.466 -0.367 -0.152 0.108 0.171 0.000 +-0.900 -0.660 -0.492 -0.252 -0.122 0.101 0.000 +-0.523 -0.300 -0.154 -0.075 0.027 0.008 0.000 +-0.295 -0.184 -0.085 -0.042 -0.267 -0.193 0.000 +-0.146 -0.071 -0.055 -0.063 -0.152 -0.154 0.000 +0.081 0.035 0.055 0.043 -0.084 -0.145 0.000 +0.411 0.314 0.192 0.056 -0.239 -0.399 0.000 +0.154 0.208 -0.062 -0.218 -0.403 -0.424 0.000 +0.522 0.347 0.133 -0.091 -0.074 -0.242 0.000 +0.560 0.485 0.290 0.110 -0.210 -0.200 0.000 +0.492 0.345 0.172 -0.052 -0.179 -0.225 0.000 +0.305 0.271 0.157 -0.032 -0.237 -0.253 0.000 +0.196 0.170 0.040 0.016 0.009 -0.011 0.000 +0.145 0.142 0.183 0.067 0.066 0.091 0.000 +-0.505 -0.323 -0.195 -0.143 0.341 0.425 0.000 +-0.240 -0.082 0.045 0.161 0.423 0.382 0.000 +-0.570 -0.437 -0.290 -0.093 0.493 0.509 0.000 +-0.136 -0.029 0.062 0.269 0.449 0.406 0.000 +-0.663 -0.493 -0.368 -0.130 0.244 0.253 0.000 +-0.107 0.016 0.123 0.184 0.360 0.225 0.000 +-0.659 -0.467 -0.340 -0.250 0.088 0.049 0.000 +0.112 0.356 0.365 0.409 0.468 0.375 0.000 +-0.433 -0.346 -0.233 -0.024 0.175 0.218 0.000 +0.104 0.175 0.267 0.362 0.507 0.391 0.000 +-0.439 -0.392 -0.170 -0.059 0.237 0.249 0.000 +-0.131 0.053 0.205 0.203 0.652 0.440 0.000 +-0.740 -0.560 -0.329 -0.157 0.366 0.289 0.000 +-0.041 0.128 0.424 0.482 0.525 0.747 0.000 +-0.455 -0.273 0.031 0.118 0.365 0.481 0.000 +0.095 0.258 0.466 0.675 0.878 0.850 0.000 +-0.398 -0.214 -0.108 0.055 0.202 0.391 0.000 +0.418 0.460 0.455 0.388 0.402 0.412 0.000 +0.077 0.014 0.047 -0.123 0.000 0.020 0.000 +0.612 0.579 0.327 0.165 0.126 0.033 0.000 +0.339 0.258 -0.035 -0.278 -0.308 -0.219 0.000 +0.585 0.526 0.248 0.036 0.133 -0.026 0.000 +0.443 0.303 0.060 -0.125 -0.069 -0.039 0.000 +0.386 0.291 0.117 -0.076 -0.062 -0.097 0.000 +0.288 0.277 0.098 -0.182 -0.233 -0.320 0.000 +-0.089 -0.148 -0.013 -0.064 -0.107 -0.288 0.000 +-0.196 -0.153 -0.167 -0.328 -0.162 -0.258 0.000 +-0.303 -0.227 -0.224 -0.176 0.048 0.044 0.000 +-0.317 -0.305 -0.132 -0.005 0.101 0.162 0.000 +-0.691 -0.528 -0.331 -0.209 0.104 0.220 0.000 +-0.550 -0.471 -0.269 -0.115 0.113 0.219 0.000 +-0.744 -0.610 -0.383 -0.195 0.097 0.213 0.000 +-1.251 -0.704 -0.365 -0.020 0.475 0.692 0.000 +-1.409 -0.969 -0.604 -0.274 0.261 0.339 0.000 +-1.105 -0.725 -0.364 0.037 0.363 0.605 0.000 +-0.989 -0.665 -0.350 -0.041 0.203 0.382 0.000 +-0.811 -0.517 -0.222 0.170 0.293 0.543 0.000 +-0.530 -0.290 -0.109 0.019 0.039 0.023 0.000 +-0.352 -0.121 0.034 0.239 0.191 0.182 0.000 +0.435 0.513 0.368 0.228 -0.250 -0.524 0.000 +0.509 0.495 0.347 0.193 -0.340 -0.560 0.000 +0.767 0.660 0.405 -0.008 -0.575 -0.983 0.000 +0.600 0.605 0.456 0.184 -0.455 -0.635 0.000 +0.109 0.025 -0.063 -0.298 -0.533 -0.861 0.000 +0.170 0.205 0.223 0.075 -0.166 -0.152 0.000 +-0.180 -0.014 0.065 0.020 0.054 0.102 0.000 +-0.159 -0.014 0.182 0.252 0.405 0.687 0.000 +-0.534 -0.414 -0.173 -0.043 0.426 0.636 0.000 +-0.689 -0.454 -0.067 0.118 0.444 0.616 0.000 +-0.904 -0.730 -0.357 -0.121 0.550 0.762 0.000 +-0.670 -0.425 -0.048 0.092 0.137 0.486 0.000 +-0.768 -0.502 -0.123 0.035 0.041 0.333 0.000 +-0.485 -0.336 -0.051 0.034 -0.270 0.055 0.000 +-0.660 -0.411 -0.162 -0.050 -0.061 -0.026 0.000 +-0.643 -0.463 -0.269 -0.198 -0.477 -0.215 0.000 +-0.676 -0.476 -0.266 -0.146 -0.558 -0.218 0.000 +-0.451 -0.257 -0.170 -0.048 -0.528 -0.200 0.000 +-0.667 -0.453 -0.269 -0.137 -0.201 -0.068 0.000 +-0.535 -0.330 -0.156 0.004 -0.379 -0.039 0.000 +-0.622 -0.348 -0.105 0.010 -0.248 0.097 0.000 +-0.781 -0.452 -0.121 0.057 -0.340 0.189 0.000 +-0.929 -0.656 -0.367 -0.160 -0.014 0.433 0.000 +-0.916 -0.602 -0.264 0.057 0.078 0.599 0.000 +-0.874 -0.512 -0.260 0.059 0.527 0.856 0.000 +-0.700 -0.474 -0.150 0.140 0.515 0.952 0.000 +-0.400 -0.196 0.072 0.300 0.552 1.149 0.000 +-0.295 -0.036 0.122 0.270 0.744 0.951 0.000 +0.153 0.253 0.300 0.255 0.562 0.601 0.000 +0.097 0.059 0.071 -0.015 -0.065 0.076 0.000 +0.542 0.452 0.273 0.148 -0.331 -0.240 0.000 +0.511 0.484 0.385 0.143 -0.239 -0.239 0.000 +0.971 0.761 0.612 0.272 -0.385 -0.606 0.000 +0.356 0.324 0.246 -0.020 -0.234 -0.393 0.000 +0.444 0.456 0.343 0.008 -0.128 -0.374 0.000 +-0.335 -0.074 0.162 0.184 0.322 0.310 0.000 +-0.489 -0.298 -0.121 -0.042 0.010 0.125 0.000 +-0.730 -0.455 -0.139 0.156 0.467 0.680 0.000 +-0.772 -0.588 -0.203 0.048 0.383 0.506 0.000 +-1.028 -0.786 -0.352 0.019 0.436 0.683 0.000 +-0.976 -0.839 -0.401 -0.112 0.305 0.453 0.000 +-1.565 -1.261 -0.662 0.067 0.691 1.230 0.000 +-1.758 -1.392 -0.790 -0.047 0.581 1.001 0.000 +-1.389 -1.121 -0.423 0.390 0.962 1.447 0.000 +-1.575 -1.260 -0.499 0.261 0.673 1.107 0.000 +-1.356 -0.898 -0.236 0.559 0.876 1.332 0.000 +-1.308 -0.756 -0.144 0.518 0.860 1.166 0.000 +-1.015 -0.379 0.336 1.026 1.355 1.378 0.000 +-0.495 -0.130 0.310 0.561 0.459 0.634 0.000 +0.312 0.525 0.771 0.837 0.292 0.348 0.000 +0.559 0.743 0.779 0.677 0.125 0.065 0.000 +0.649 0.815 0.829 0.635 0.088 -0.029 0.000 +0.460 0.723 0.707 0.660 0.349 0.104 0.000 +0.162 0.424 0.499 0.461 0.290 0.346 0.000 +-0.154 0.185 0.305 0.317 0.493 0.348 0.000 +-0.613 -0.400 -0.089 0.034 0.347 0.346 0.000 +-0.904 -0.496 -0.140 0.041 0.523 0.697 0.000 +-1.095 -0.646 -0.311 -0.109 0.217 0.298 0.000 +-1.333 -0.845 -0.396 -0.195 0.174 0.204 0.000 +-1.558 -1.005 -0.382 -0.304 0.669 -0.138 0.000 +-1.437 -0.924 -0.367 -0.325 -0.097 -0.258 0.000 +-1.088 -0.681 -0.277 -0.276 -0.364 -0.508 0.000 +-0.649 -0.382 -0.110 -0.065 -0.102 -0.257 0.000 +-0.614 -0.431 -0.242 -0.342 -0.262 -0.667 0.000 +-0.368 -0.161 -0.033 0.029 -0.234 -0.323 0.000 +-0.530 -0.417 -0.347 -0.444 -0.519 -0.868 0.000 +-0.863 -0.525 -0.387 -0.395 -0.478 -0.643 0.000 +-0.917 -0.624 -0.494 -0.635 -0.475 -1.074 0.000 +-0.848 -0.464 -0.234 -0.177 0.037 -0.385 0.000 +-1.738 -1.245 -0.995 -0.888 -0.506 -1.022 0.000 +-1.176 -0.684 -0.300 -0.249 0.366 0.253 0.000 +-1.244 -0.561 -0.174 0.154 0.692 0.586 0.000 +-1.210 -0.554 -0.234 0.131 0.606 0.708 0.000 +-1.268 -0.822 -0.470 -0.191 0.504 0.541 0.000 +-0.896 -0.506 -0.175 0.033 0.946 0.965 0.000 +-0.700 -0.373 -0.172 -0.009 0.528 0.764 0.000 +-0.344 -0.084 0.051 0.203 0.546 0.563 0.000 +-0.020 0.289 0.323 0.288 0.383 0.418 0.000 +0.493 0.542 0.647 0.620 0.475 0.365 0.000 +0.559 0.613 0.614 0.534 0.216 0.021 0.000 +0.166 0.360 0.377 0.294 0.193 0.031 0.000 +0.204 0.389 0.527 0.597 0.255 0.421 0.000 +-0.171 0.254 0.544 0.757 0.785 0.811 0.000 +-1.494 -0.972 -0.354 0.259 1.132 1.070 0.000 +-1.249 -0.787 -0.146 0.331 0.908 1.097 0.000 +-1.281 -0.939 -0.181 0.523 1.243 1.655 0.000 +-1.551 -1.187 -0.537 0.249 0.903 1.081 0.000 +-1.362 -1.101 -0.417 0.315 1.008 1.359 0.000 +-1.362 -1.055 -0.392 0.322 0.976 1.418 0.000 +-1.989 -1.640 -0.794 0.166 1.250 1.989 0.000 +-2.253 -1.707 -0.863 0.135 1.176 2.044 0.000 +-2.322 -1.801 -0.910 0.029 1.165 2.011 0.000 +-2.665 -1.913 -0.966 0.154 1.211 1.921 0.000 +-2.401 -1.547 -0.605 0.566 1.721 2.389 0.000 +-3.160 -2.011 -0.871 0.379 1.477 2.181 0.000 +-2.509 -1.232 0.020 1.421 1.750 2.476 0.000 +-1.545 -0.601 0.335 1.172 1.480 2.062 0.000 +-0.213 0.459 0.808 1.103 0.857 1.476 0.000 +0.443 0.940 1.120 1.199 0.850 1.057 0.000 +0.886 1.215 1.186 1.017 0.594 0.720 0.000 +0.485 0.783 0.838 0.990 0.801 0.849 0.000 +0.331 0.641 0.660 0.715 0.592 0.906 0.000 +-0.220 0.158 0.372 0.559 0.590 0.637 0.000 +-0.229 0.100 0.382 0.519 0.596 0.655 0.000 +-0.879 -0.386 0.106 0.356 0.718 0.744 0.000 +-1.176 -0.619 -0.132 -0.050 0.391 0.339 0.000 +-1.518 -0.726 -0.148 0.033 0.506 0.132 0.000 +-1.664 -0.776 -0.510 -0.401 -0.142 -0.251 0.000 +-2.077 -1.251 -0.663 -0.536 -0.352 -0.823 0.000 +-1.311 -0.890 -0.548 -0.656 -0.899 -1.532 0.000 +-0.845 -0.491 -0.159 -0.271 -0.706 -1.096 0.000 +-0.475 -0.352 -0.296 -0.535 -1.114 -1.665 0.000 +-0.200 -0.013 0.040 -0.099 -0.782 -1.132 0.000 +0.023 -0.003 -0.110 -0.395 -0.317 -1.531 0.000 +0.131 0.397 0.400 0.228 -0.596 -0.881 0.000 +0.106 0.304 0.248 0.036 -0.641 -1.094 0.000 +-0.286 0.233 0.404 0.414 0.276 -0.433 0.000 +-0.488 -0.032 0.227 0.181 0.229 -0.585 0.000 +-0.944 -0.238 0.330 0.536 0.739 0.186 0.000 +-2.422 -1.535 -1.250 -1.162 -0.820 -0.525 0.000 +-1.060 -0.112 0.354 0.706 1.412 0.661 0.000 +-0.913 -0.248 0.144 0.341 1.131 0.720 0.000 +-0.822 -0.184 0.185 0.416 1.203 1.123 0.000 +-0.276 0.087 0.390 0.455 0.751 1.022 0.000 +-0.106 0.247 0.598 0.712 0.798 1.089 0.000 +0.076 0.358 0.562 0.587 0.448 0.716 0.000 +0.562 0.888 1.026 1.129 0.894 0.987 0.000 +0.632 0.956 0.977 1.006 0.490 0.476 0.000 +0.345 0.863 1.069 1.252 0.831 1.059 0.000 +-0.230 0.338 0.736 1.130 0.935 1.348 0.000 +-1.834 -0.881 -0.048 0.745 1.354 1.924 0.000 +-2.367 -1.191 -0.010 1.231 1.758 2.411 0.000 +-2.600 -1.557 -0.472 0.603 1.991 2.609 0.000 +-2.021 -1.296 -0.333 0.660 1.887 2.640 0.000 +-2.167 -1.635 -0.600 0.377 1.724 2.355 0.000 +-2.097 -1.676 -0.810 0.166 1.392 2.252 0.000 +-2.233 -1.734 -0.884 0.114 1.383 2.057 0.000 +-1.788 -1.338 -0.478 0.837 2.585 3.646 0.000 +-2.450 -1.725 -0.666 0.830 2.528 3.574 0.000 +-2.149 -1.544 -0.554 0.775 2.629 3.779 0.000 +-2.766 -1.720 -0.484 1.135 2.781 3.859 0.000 +-2.725 -1.543 -0.242 1.424 3.063 4.301 0.000 +-3.279 -1.747 -0.307 1.665 3.443 4.613 0.000 +-4.081 -2.546 -1.196 0.583 2.758 3.508 0.000 +-2.530 -1.174 -0.128 1.264 2.282 3.052 0.000 +-0.534 0.325 0.841 1.375 1.848 2.232 0.000 +0.206 0.881 1.215 1.603 1.531 1.908 0.000 +0.972 1.164 1.184 1.195 0.968 1.120 0.000 +0.469 0.923 1.017 1.121 1.237 1.405 0.000 +0.244 0.642 0.665 0.761 1.091 0.996 0.000 +-0.491 0.139 0.304 0.528 0.969 1.065 0.000 +-0.720 -0.138 -0.012 0.120 0.767 0.738 0.000 +-1.232 -0.462 -0.047 0.389 0.689 0.625 0.000 +-1.780 -1.021 -0.551 -0.477 0.280 -0.102 0.000 +-2.346 -1.557 -0.649 -0.474 0.282 -0.360 0.000 +-2.745 -1.911 -1.049 -0.956 -0.818 -1.433 0.000 +-2.425 -1.481 -0.811 -0.624 -0.718 -1.492 0.000 +-1.509 -0.979 -0.771 -0.943 -1.293 -2.124 0.000 +-1.221 -0.885 -0.515 -0.538 -1.707 -2.457 0.000 +-1.501 -0.822 -0.822 -1.229 -2.083 -3.017 0.000 +-0.515 -0.547 -0.598 -0.791 -2.115 -2.700 0.000 +-0.720 -0.933 -1.206 -1.655 -2.160 -3.643 0.000 +-0.792 -0.530 -0.577 -0.684 -2.032 -2.817 0.000 +-0.914 -0.725 -0.890 -1.145 -2.133 -2.905 0.000 +-0.936 -0.616 -0.530 -0.533 -1.194 -2.337 0.000 +-0.941 -0.947 -0.809 -0.945 -0.955 -2.281 0.000 +-2.387 -1.430 -0.858 -0.653 -0.496 -1.452 0.000 +-3.165 -2.099 -1.483 -1.329 -0.720 -1.783 0.000 +-2.624 -1.414 -0.710 -0.436 -0.244 -0.954 0.000 +-1.900 -1.051 -0.656 -0.554 0.157 -0.305 0.000 +-1.728 -0.907 -0.526 -0.298 0.420 0.219 0.000 +-0.773 -0.213 0.031 -0.037 0.523 0.614 0.000 +-0.466 0.180 0.456 0.519 0.457 0.839 0.000 +0.027 0.328 0.548 0.464 0.486 0.778 0.000 +0.131 0.615 0.880 1.030 0.889 1.120 0.000 +0.840 1.170 1.258 1.214 0.737 1.020 0.000 +-0.117 0.534 0.954 1.436 1.257 1.586 0.000 +-0.610 0.060 0.715 1.412 1.604 2.082 0.000 +-2.266 -1.026 0.163 1.453 2.411 3.359 0.000 +-4.154 -2.725 -1.277 0.289 2.429 3.441 0.000 +-3.781 -2.411 -0.764 0.950 2.790 4.110 0.000 +-2.532 -1.597 -0.272 1.173 3.070 4.224 0.000 +-2.544 -1.791 -0.507 1.065 2.720 3.943 0.000 +-0.786 -0.295 0.660 1.913 2.770 3.239 0.000 +-2.319 -1.660 -0.688 0.730 2.488 3.585 0.000 +-3.610 -2.334 -1.077 0.319 2.057 3.019 0.000 +-0.354 0.534 0.820 0.909 0.135 -0.504 0.000 +-1.422 -0.531 -0.247 -0.158 0.408 -0.519 0.000 +-3.475 -2.308 -1.116 0.107 1.528 2.759 0.000 diff --git a/Noto/Configuration/CDB/alma/AS/act_new_lut.txt b/Noto/Configuration/CDB/alma/AS/act_new_lut.txt new file mode 100644 index 000000000..3df016039 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/act_new_lut.txt @@ -0,0 +1,1116 @@ +1.971 0.294 0.212 -1.003 -2.088 -3.085 -13.865 +2.121 0.179 -0.060 -0.795 -2.200 -2.735 -13.865 +1.619 -0.289 -0.211 -1.140 -2.451 -2.821 -13.865 +2.685 0.686 1.160 0.087 -0.785 -1.066 -13.865 +2.308 0.421 0.447 -0.184 -0.877 -1.203 -13.865 +2.283 0.301 0.100 -0.180 -0.605 -0.464 -13.865 +1.107 -0.640 -0.336 -0.057 -0.361 -0.298 -13.865 +0.605 -0.902 -0.179 -0.120 -0.363 0.045 -13.865 +1.075 -0.504 0.406 0.258 0.320 0.932 -13.865 +1.134 -0.251 0.523 0.554 0.565 0.817 -13.865 +0.460 -0.863 0.659 -0.006 0.191 0.924 -13.865 +0.658 -1.088 0.131 -0.211 0.275 1.156 -13.865 +0.570 -0.784 -0.276 -0.188 0.616 1.219 -13.865 +1.211 -0.428 0.035 0.183 0.922 1.246 -13.865 +0.991 -0.381 0.037 0.096 0.511 0.803 -13.865 +1.413 0.130 0.574 0.233 0.600 0.599 -13.865 +0.982 0.071 0.224 -0.383 -0.217 -0.310 -13.865 +1.218 1.205 0.267 0.023 -0.358 -0.574 -13.865 +1.042 0.226 -0.182 -0.604 -1.108 -1.353 -13.865 +1.368 0.213 0.034 -0.694 -1.079 -1.966 -13.865 +1.551 0.426 0.001 -1.014 -1.463 -2.233 -13.865 +1.933 0.697 0.044 -0.804 -1.601 -2.171 -13.865 +1.009 -0.107 -0.629 -1.721 -2.853 -3.642 -13.865 +1.820 0.467 -0.312 -1.488 -2.235 -3.113 -13.865 +1.894 0.261 -0.208 -1.674 -3.082 -4.320 -5.247 +2.426 0.857 0.405 -1.009 -2.520 -3.488 -5.247 +2.171 0.265 -0.042 -1.334 -2.703 -3.640 -5.247 +2.200 0.506 -0.011 -1.088 -2.045 -2.862 -5.247 +1.792 0.170 -0.145 -1.009 -1.852 -2.382 -5.247 +1.623 -0.044 -0.351 -0.796 -1.362 -1.610 -5.247 +0.924 -0.342 -0.357 -0.407 -0.534 -0.686 -5.247 +0.423 -0.666 -0.251 -0.059 -0.022 0.178 -5.247 +0.617 -0.644 0.075 0.344 0.509 1.113 -5.247 +0.346 -0.985 0.270 0.232 0.724 1.466 -5.247 +0.663 -0.893 0.299 0.197 0.964 1.978 -5.247 +0.601 -0.954 -0.091 0.205 0.794 2.108 -5.247 +0.568 -0.702 -0.031 0.413 1.176 2.143 -5.247 +0.705 -0.578 0.071 0.071 0.935 2.028 -5.247 +0.524 -0.576 -0.110 -0.019 0.769 1.477 -5.247 +0.608 -0.601 -0.069 -0.188 0.451 0.788 -5.247 +0.946 -0.040 0.215 -0.253 0.277 0.428 -5.247 +0.832 -0.268 -0.266 -0.591 -0.548 -0.694 -5.247 +1.179 0.002 -0.324 -0.633 -1.127 -1.544 -5.247 +1.596 0.386 -0.121 -0.995 -1.335 -2.078 -5.247 +1.626 0.458 0.146 -1.150 -1.682 -2.839 -5.247 +1.937 0.686 0.090 -1.259 -2.181 -3.496 -5.247 +1.959 0.327 -0.207 -1.627 -2.898 -4.090 -5.247 +2.439 0.838 0.237 -1.300 -2.579 -3.834 -5.247 +2.793 1.559 0.459 -1.270 -2.885 -4.406 0.619 +2.823 1.463 0.447 -1.308 -2.881 -4.496 0.619 +2.914 1.487 0.740 -1.222 -2.716 -4.277 0.619 +3.030 1.535 0.578 -1.302 -2.929 -4.366 0.619 +2.793 1.276 0.510 -1.168 -2.653 -3.734 0.619 +2.814 1.359 0.441 -1.071 -2.450 -3.589 0.619 +2.717 1.217 0.506 -0.744 -1.887 -2.920 0.619 +2.213 0.700 0.058 -1.113 -2.193 -3.281 0.619 +2.452 0.904 0.323 -0.801 -1.690 -2.599 0.619 +2.293 0.572 0.000 -1.002 -2.103 -3.062 0.619 +2.007 0.205 -0.153 -0.794 -1.426 -2.349 0.619 +1.934 0.324 0.025 -0.537 -1.183 -1.557 0.619 +1.639 0.377 0.252 -0.232 -0.748 -0.743 0.619 +1.143 0.029 0.134 -0.048 -0.261 -0.368 0.619 +1.206 0.008 0.447 0.319 0.262 0.397 0.619 +0.505 -0.537 0.034 0.268 0.279 0.592 0.619 +1.132 -0.028 0.633 0.727 1.011 1.347 0.619 +0.773 -0.454 0.424 0.562 0.941 1.525 0.619 +0.503 -0.721 0.283 0.398 0.913 1.529 0.619 +0.049 -1.042 0.141 0.368 0.929 1.845 0.619 +0.340 -0.740 0.355 0.463 1.121 2.212 0.619 +0.339 -0.905 0.083 0.410 1.371 2.760 0.619 +0.811 -0.720 0.379 0.710 1.529 2.973 0.619 +0.413 -0.857 0.129 0.512 1.264 2.884 0.619 +0.414 -0.739 0.024 0.510 1.156 2.765 0.619 +0.310 -0.856 -0.155 0.339 1.068 2.692 0.619 +0.590 -0.654 0.264 0.546 1.249 2.777 0.619 +0.776 -0.452 0.133 0.642 1.633 3.011 0.619 +0.514 -0.385 0.198 0.424 1.388 2.316 0.619 +0.241 -0.820 -0.333 0.004 0.932 1.746 0.619 +1.072 -0.095 0.600 0.490 1.401 1.878 0.619 +0.384 -0.680 0.211 -0.144 0.643 1.130 0.619 +0.267 -0.523 -0.022 -0.012 0.492 0.810 0.619 +0.695 -0.309 0.188 -0.011 0.796 0.856 0.619 +1.217 0.385 0.600 0.497 0.894 0.758 0.619 +0.980 0.053 0.104 0.048 0.095 -0.194 0.619 +1.029 -0.239 -0.303 -0.523 -0.696 -1.052 0.619 +1.244 -0.157 -0.319 -0.901 -1.184 -1.869 0.619 +1.659 0.181 -0.124 -0.806 -1.017 -2.090 0.619 +2.314 0.597 0.117 -0.893 -1.461 -2.829 0.619 +2.433 0.823 0.503 -0.458 -1.112 -2.516 0.619 +1.899 0.587 0.160 -1.101 -1.961 -3.203 0.619 +2.287 1.306 0.633 -0.618 -1.600 -2.802 0.619 +2.294 1.039 0.436 -0.968 -2.161 -3.585 0.619 +2.860 1.367 0.694 -0.863 -2.003 -3.452 0.619 +2.496 0.741 -0.346 -1.955 -3.492 -5.104 0.619 +2.155 0.646 -0.162 -2.000 -3.360 -4.947 0.619 +2.363 0.796 -0.122 -1.819 -3.479 -4.944 0.619 +3.000 1.315 0.080 -1.845 -3.671 -5.487 5.121 +2.628 1.264 0.127 -1.829 -3.785 -5.403 5.121 +2.829 1.442 0.409 -1.723 -3.626 -5.412 5.121 +3.079 1.627 0.399 -1.533 -3.256 -5.070 5.121 +2.735 1.224 0.138 -1.707 -3.448 -4.947 5.121 +2.585 1.284 0.153 -1.501 -3.167 -4.529 5.121 +2.574 1.088 0.241 -1.229 -2.776 -4.010 5.121 +2.580 1.106 0.425 -0.920 -2.355 -3.643 5.121 +1.922 0.527 -0.059 -1.209 -2.564 -3.871 5.121 +2.017 0.458 -0.182 -1.171 -2.398 -3.546 5.121 +2.352 0.876 0.380 -0.503 -1.230 -2.254 5.121 +1.950 0.722 0.209 -0.452 -1.073 -1.614 5.121 +1.220 0.330 0.103 -0.486 -0.680 -0.885 5.121 +0.471 -0.407 -0.285 -0.623 -0.599 -0.446 5.121 +0.511 -0.492 -0.130 -0.337 -0.136 0.190 5.121 +0.307 -0.752 0.217 0.012 0.365 0.826 5.121 +0.406 -0.590 0.283 0.358 0.804 1.445 5.121 +0.220 -0.699 0.242 0.488 1.004 1.767 5.121 +0.387 -0.540 0.361 0.683 1.125 2.210 5.121 +0.055 -0.807 0.235 0.609 1.276 2.463 5.121 +0.169 -0.957 0.255 0.653 1.396 2.721 5.121 +0.278 -1.114 -0.003 0.456 1.502 2.964 5.121 +0.407 -0.968 -0.007 0.584 1.684 3.203 5.121 +0.393 -0.851 0.116 0.821 1.757 3.412 5.121 +0.393 -0.696 -0.024 0.678 1.562 3.334 5.121 +0.417 -0.630 0.074 0.642 1.618 3.447 5.121 +0.395 -0.602 0.085 0.704 1.564 3.378 5.121 +0.415 -0.713 -0.125 0.458 1.602 3.323 5.121 +0.292 -0.668 -0.194 0.434 1.582 2.861 5.121 +0.294 -0.487 -0.198 0.347 1.451 2.530 5.121 +0.322 -0.337 0.081 0.481 1.367 2.256 5.121 +0.147 -0.715 -0.199 0.061 0.911 1.652 5.121 +0.272 -0.533 -0.059 0.098 0.828 1.390 5.121 +-0.004 -0.820 -0.325 -0.344 0.421 0.747 5.121 +0.099 -0.665 -0.420 -0.320 0.118 0.242 5.121 +0.627 -0.187 -0.178 -0.062 0.135 -0.050 5.121 +0.618 -0.400 -0.568 -0.589 -0.741 -1.112 5.121 +1.219 0.194 -0.228 -0.755 -1.080 -1.747 5.121 +1.561 0.158 -0.167 -0.769 -1.368 -2.495 5.121 +1.625 0.152 -0.305 -1.177 -2.029 -3.458 5.121 +2.094 0.575 0.059 -1.071 -2.018 -3.478 5.121 +2.041 0.704 0.019 -1.078 -2.087 -3.680 5.121 +2.334 1.079 0.208 -1.052 -2.344 -3.925 5.121 +2.569 1.199 0.313 -1.291 -2.579 -4.363 5.121 +2.994 1.307 0.468 -1.386 -2.780 -4.614 5.121 +2.816 0.922 0.000 -2.075 -3.615 -5.626 5.121 +2.879 1.282 0.095 -1.900 -3.778 -5.640 5.121 +2.870 1.011 -0.121 -1.948 -3.808 -5.833 5.121 +3.508 1.526 0.434 -1.337 -3.301 -5.129 7.938 +3.286 1.550 0.395 -1.246 -3.425 -5.330 7.938 +3.293 1.603 0.381 -1.602 -3.801 -5.711 7.938 +3.493 1.966 0.520 -1.402 -3.534 -5.340 7.938 +3.285 1.832 0.423 -1.456 -2.993 -4.653 7.938 +3.274 1.847 0.649 -1.007 -2.525 -3.944 7.938 +2.429 1.015 0.002 -1.159 -2.697 -3.854 7.938 +2.466 1.241 0.327 -0.636 -1.784 -3.059 7.938 +2.152 0.985 -0.071 -0.751 -1.865 -3.074 7.938 +1.834 0.445 -0.462 -1.228 -2.342 -3.328 7.938 +2.069 0.600 -0.124 -0.728 -1.645 -2.435 7.938 +1.353 0.173 -0.150 -0.734 -1.143 -1.741 7.938 +1.077 0.203 -0.010 -0.266 -0.415 -0.643 7.938 +0.514 -0.110 -0.167 -0.237 -0.185 0.055 7.938 +0.906 0.072 0.396 0.323 0.582 0.970 7.938 +0.329 -0.438 0.155 0.214 0.511 1.006 7.938 +0.359 -0.417 0.393 0.305 0.785 1.364 7.938 +0.153 -0.628 0.287 0.529 0.949 1.757 7.938 +0.046 -0.538 0.139 0.440 1.118 1.862 7.938 +-0.348 -0.887 -0.003 0.593 1.373 2.740 7.938 +0.014 -0.621 0.101 0.607 1.439 2.969 7.938 +0.260 -0.811 0.104 0.731 1.625 3.425 7.938 +0.326 -0.710 0.204 0.704 1.777 3.418 7.938 +0.329 -0.551 0.199 0.897 1.815 3.395 7.938 +0.362 -0.358 0.099 0.808 1.830 3.284 7.938 +0.225 -0.613 0.133 0.710 1.809 3.444 7.938 +0.349 -0.431 0.006 0.594 1.638 3.379 7.938 +0.510 -0.193 0.074 0.715 1.669 3.680 7.938 +0.315 -0.353 -0.312 0.457 1.515 3.008 7.938 +0.062 -0.385 -0.315 0.362 1.482 2.693 7.938 +0.044 -0.471 -0.358 0.243 1.044 1.745 7.938 +0.005 -0.736 -0.149 0.074 0.804 1.425 7.938 +0.272 -0.515 -0.333 0.007 0.677 1.101 7.938 +0.180 -0.535 -0.308 -0.218 0.667 0.957 7.938 +0.282 -0.307 -0.275 -0.194 0.399 0.599 7.938 +0.196 -0.582 -0.483 -0.361 0.050 -0.133 7.938 +0.701 -0.209 -0.318 -0.512 -0.636 -0.897 7.938 +0.823 -0.365 -0.418 -0.682 -1.143 -1.908 7.938 +1.639 0.246 0.008 -0.682 -1.415 -2.480 7.938 +1.741 0.399 0.021 -0.748 -1.974 -3.090 7.938 +1.823 0.547 0.075 -0.854 -2.111 -3.196 7.938 +1.772 0.667 0.084 -0.920 -2.070 -3.315 7.938 +1.988 0.800 0.099 -1.077 -2.157 -3.674 7.938 +2.613 1.291 0.418 -1.084 -2.558 -4.220 7.938 +3.132 1.531 0.397 -1.589 -3.051 -5.102 7.938 +3.378 1.279 0.217 -2.022 -3.624 -5.928 7.938 +3.511 1.401 0.450 -1.950 -3.662 -5.910 7.938 +3.220 1.348 0.249 -1.803 -3.531 -5.593 7.938 +3.220 1.552 0.515 -1.378 -3.600 -5.330 9.587 +3.255 1.597 0.454 -1.316 -3.574 -5.309 9.587 +3.387 1.715 0.530 -1.366 -3.260 -5.199 9.587 +3.113 1.820 0.589 -1.365 -3.069 -4.995 9.587 +3.032 1.678 0.586 -1.101 -2.607 -4.005 9.587 +2.141 1.123 0.031 -1.123 -2.491 -3.632 9.587 +2.425 1.294 0.468 -0.514 -1.737 -2.600 9.587 +1.821 0.862 -0.115 -0.843 -1.619 -2.659 9.587 +1.670 0.839 -0.087 -0.507 -1.336 -2.185 9.587 +1.258 0.486 -0.322 -0.662 -1.663 -2.421 9.587 +1.080 0.219 -0.284 -0.576 -1.143 -1.717 9.587 +0.811 0.020 -0.277 -0.419 -0.843 -1.216 9.587 +0.673 -0.069 -0.231 -0.240 -0.220 -0.546 9.587 +0.464 -0.092 -0.012 -0.012 0.215 0.176 9.587 +0.209 -0.269 -0.025 0.098 0.443 0.744 9.587 +-0.027 -0.329 0.075 0.341 0.679 1.073 9.587 +-0.049 -0.240 0.273 0.518 0.983 1.657 9.587 +-0.185 -0.163 0.400 0.557 0.988 1.782 9.587 +-0.491 -0.655 0.030 0.278 0.841 1.747 9.587 +-0.561 -0.323 0.118 0.644 1.249 2.360 9.587 +-0.257 -0.436 0.233 0.705 1.383 2.652 9.587 +-0.068 -0.514 0.325 0.911 1.687 3.175 9.587 +-0.047 -0.713 0.085 0.918 1.634 3.241 9.587 +-0.089 -0.444 -0.011 0.928 2.002 3.309 9.587 +-0.091 -0.471 -0.005 0.834 1.929 3.070 9.587 +-0.108 -0.371 0.105 0.690 1.976 3.141 9.587 +0.020 -0.402 0.108 0.734 1.885 3.316 9.587 +-0.217 -0.573 -0.182 0.495 1.501 3.089 9.587 +-0.164 -0.428 -0.042 0.609 1.579 2.699 9.587 +-0.072 -0.266 -0.155 0.556 1.510 2.378 9.587 +0.000 -0.355 -0.171 0.535 1.138 1.971 9.587 +-0.297 -0.867 -0.335 0.096 0.826 1.400 9.587 +-0.042 -0.825 -0.375 0.142 0.725 1.126 9.587 +-0.018 -0.845 -0.528 -0.114 0.599 0.647 9.587 +-0.071 -0.803 -0.306 -0.147 0.280 0.153 9.587 +0.260 -0.468 0.045 -0.131 -0.010 -0.007 9.587 +0.484 -0.356 -0.063 -0.113 -0.100 -0.465 9.587 +0.576 -0.338 -0.237 -0.411 -0.788 -1.248 9.587 +1.032 -0.023 0.262 -0.421 -0.940 -1.632 9.587 +0.781 -0.152 -0.276 -1.049 -1.807 -2.554 9.587 +1.043 -0.080 -0.229 -0.939 -1.888 -2.879 9.587 +1.312 0.188 -0.006 -0.867 -1.818 -2.704 9.587 +1.537 0.571 0.159 -0.850 -1.980 -3.057 9.587 +2.160 1.048 0.435 -0.836 -2.054 -3.650 9.587 +2.588 1.269 0.528 -1.208 -2.469 -4.560 9.587 +3.004 1.237 0.315 -1.826 -3.258 -5.481 9.587 +3.149 1.245 0.212 -1.838 -3.344 -5.546 9.587 +3.284 1.539 0.395 -1.580 -3.429 -5.454 9.587 +2.958 1.596 0.356 -1.201 -3.405 -5.062 10.270 +3.283 1.632 0.225 -1.447 -3.315 -5.031 10.270 +3.102 1.644 0.089 -1.419 -3.472 -5.105 10.270 +3.238 1.686 0.250 -1.438 -3.292 -5.074 10.270 +3.014 1.506 0.315 -1.660 -3.227 -5.099 10.270 +3.196 2.031 0.827 -1.309 -2.888 -4.927 10.270 +2.825 1.724 0.432 -1.246 -2.803 -4.563 10.270 +2.401 1.303 -0.037 -1.470 -3.060 -4.673 10.270 +2.170 1.266 0.213 -0.967 -2.271 -3.368 10.270 +1.823 0.993 -0.123 -1.062 -2.321 -3.204 10.270 +1.746 1.111 0.061 -0.734 -1.719 -2.483 10.270 +1.588 1.065 -0.008 -0.277 -1.232 -1.935 10.270 +1.145 0.648 -0.144 -0.478 -1.062 -1.669 10.270 +1.431 1.069 0.269 -0.226 -0.833 -1.220 10.270 +0.846 0.403 -0.136 -0.587 -1.379 -1.726 10.270 +1.114 0.466 -0.059 -0.428 -1.333 -1.706 10.270 +0.589 0.260 -0.103 -0.587 -1.214 -1.802 10.270 +0.980 0.517 -0.113 -0.418 -1.045 -1.571 10.270 +0.689 0.181 -0.368 -0.486 -1.224 -1.517 10.270 +0.700 0.227 -0.171 -0.483 -1.076 -1.361 10.270 +0.444 0.048 -0.176 -0.361 -0.777 -1.166 10.270 +0.701 0.238 0.162 -0.048 -0.558 -0.740 10.270 +0.231 -0.046 -0.179 -0.118 -0.578 -0.626 10.270 +0.158 -0.120 -0.180 -0.002 -0.418 -0.412 10.270 +-0.076 -0.211 0.020 0.073 -0.093 -0.097 10.270 +0.307 0.223 0.406 0.459 0.425 0.563 10.270 +-0.220 -0.206 0.025 0.056 0.106 0.338 10.270 +-0.015 -0.128 0.086 0.117 0.153 0.577 10.270 +-0.225 -0.501 -0.004 0.137 0.236 0.473 10.270 +-0.145 -0.348 -0.013 0.437 0.455 0.833 10.270 +-0.265 -0.375 0.144 0.364 0.739 1.105 10.270 +-0.369 -0.340 0.161 0.326 0.755 1.115 10.270 +-0.561 -0.217 0.190 0.380 0.983 1.229 10.270 +-0.689 -0.424 0.216 0.229 0.757 1.130 10.270 +-0.790 -0.575 0.092 0.133 0.671 1.148 10.270 +-0.776 -0.538 0.102 0.182 0.609 1.181 10.270 +-0.402 -0.166 0.517 0.510 0.864 1.585 10.270 +-0.547 -0.273 0.429 0.496 0.955 1.722 10.270 +-0.902 -0.499 0.179 0.449 1.045 1.829 10.270 +-0.628 -0.475 0.230 0.595 1.107 2.203 10.270 +-0.510 -0.472 0.328 0.756 1.273 2.333 10.270 +-0.294 -0.535 0.505 0.796 1.480 2.626 10.270 +-0.348 -0.641 0.466 0.769 1.534 2.856 10.270 +-0.178 -0.616 0.392 0.690 1.685 3.120 10.270 +-0.172 -0.403 0.312 0.825 2.080 3.230 10.270 +-0.319 -0.403 0.336 0.969 2.163 3.207 10.270 +-0.202 -0.342 0.227 0.867 2.097 3.224 10.270 +-0.318 -0.439 0.024 0.640 1.902 2.976 10.270 +-0.328 -0.404 -0.058 0.736 1.927 3.009 10.270 +-0.222 -0.385 0.010 0.551 2.012 2.891 10.270 +-0.353 -0.441 -0.258 0.379 1.745 2.665 10.270 +-0.495 -0.449 -0.292 0.436 1.607 2.700 10.270 +-0.368 -0.655 -0.297 0.486 1.665 2.675 10.270 +-0.122 -0.544 -0.240 0.546 1.539 2.691 10.270 +-0.030 -0.385 -0.111 0.571 1.500 2.620 10.270 +-0.290 -0.644 -0.214 0.228 1.222 2.322 10.270 +-0.163 -0.333 -0.054 0.408 1.334 2.143 10.270 +-0.334 -0.500 -0.198 0.260 1.065 1.867 10.270 +-0.296 -0.370 -0.132 0.320 1.053 1.762 10.270 +0.055 -0.209 0.141 0.459 1.125 1.725 10.270 +-0.112 -0.534 0.015 0.397 0.922 1.310 10.270 +-0.595 -1.161 -0.566 -0.195 0.295 0.838 10.270 +-0.201 -0.802 -0.045 0.275 0.723 1.204 10.270 +-0.221 -0.985 -0.262 0.249 0.665 0.985 10.270 +-0.375 -1.086 -0.483 0.040 0.608 0.830 10.270 +-0.146 -0.732 -0.155 0.067 0.830 0.718 10.270 +-0.341 -1.119 -0.256 -0.111 0.464 0.341 10.270 +-0.163 -1.110 -0.124 -0.004 0.369 0.196 10.270 +-0.321 -1.107 -0.312 -0.224 0.167 -0.027 10.270 +0.261 -0.419 0.156 0.273 0.660 0.457 10.270 +-0.189 -0.659 -0.262 -0.188 0.141 0.023 10.270 +0.112 -0.331 0.112 -0.022 0.441 0.140 10.270 +-0.368 -0.542 -0.427 -0.581 -0.218 -0.505 10.270 +-0.205 -0.492 -0.307 -0.507 -0.418 -0.637 10.270 +0.225 -0.234 -0.066 -0.300 -0.369 -0.761 10.270 +0.515 -0.211 0.013 -0.342 -0.546 -0.915 10.270 +0.407 -0.260 0.003 -0.463 -0.638 -1.248 10.270 +0.894 0.109 0.290 -0.346 -0.471 -1.232 10.270 +0.609 -0.173 -0.127 -0.606 -0.911 -1.806 10.270 +0.682 -0.310 -0.298 -0.757 -1.101 -2.035 10.270 +0.834 0.151 -0.094 -0.344 -0.857 -1.754 10.270 +0.457 -0.053 -0.501 -0.724 -1.438 -2.172 10.270 +0.547 -0.220 -0.249 -0.716 -1.245 -1.991 10.270 +0.820 -0.182 -0.245 -0.621 -1.472 -2.086 10.270 +0.859 0.090 -0.127 -0.405 -1.418 -2.069 10.270 +0.952 0.008 -0.171 -0.852 -1.737 -2.503 10.270 +1.659 0.605 0.525 -0.617 -1.423 -2.683 10.270 +1.953 0.838 0.760 -0.807 -1.507 -3.173 10.270 +1.937 0.733 0.696 -1.105 -1.827 -3.706 10.270 +2.221 0.609 0.381 -1.716 -2.622 -4.776 10.270 +2.471 0.962 0.413 -1.453 -2.704 -4.747 10.270 +2.804 1.142 0.627 -1.500 -3.025 -5.097 10.270 +2.654 1.186 0.609 -1.487 -3.091 -5.070 10.270 +2.830 1.339 0.546 -1.457 -3.261 -5.362 10.270 +2.976 1.451 0.527 -1.304 -3.287 -5.149 10.270 +2.943 1.762 0.442 -1.101 -3.331 -5.091 10.270 +2.914 1.668 0.588 -0.924 -3.098 -4.688 10.174 +2.657 1.530 0.362 -1.092 -3.065 -4.803 10.174 +2.765 1.592 0.319 -1.155 -3.176 -4.797 10.174 +2.519 1.305 0.099 -1.553 -3.145 -5.075 10.174 +3.073 1.647 0.265 -1.226 -2.885 -4.541 10.174 +2.156 1.332 -0.128 -1.536 -3.025 -4.640 10.174 +2.326 1.565 0.175 -0.935 -2.327 -3.880 10.174 +1.885 1.431 0.061 -0.765 -1.827 -3.516 10.174 +1.447 1.031 -0.080 -0.857 -1.532 -2.960 10.174 +0.975 0.575 -0.372 -0.745 -1.393 -2.396 10.174 +1.076 0.827 0.015 -0.311 -0.791 -1.522 10.174 +0.619 0.457 -0.160 -0.216 -0.612 -1.011 10.174 +0.126 0.222 -0.255 -0.147 -0.472 -0.417 10.174 +0.456 0.444 0.175 0.299 -0.145 -0.036 10.174 +-0.172 -0.081 -0.168 -0.156 -0.541 -0.415 10.174 +0.108 0.140 -0.167 -0.060 -0.542 -0.388 10.174 +0.085 0.343 -0.050 -0.004 -0.400 -0.188 10.174 +0.066 0.289 -0.082 -0.054 -0.463 -0.457 10.174 +-0.259 -0.017 -0.217 -0.275 -0.591 -0.823 10.174 +-0.055 -0.075 -0.181 -0.128 -0.497 -0.581 10.174 +-0.149 -0.140 -0.285 -0.174 -0.372 -0.474 10.174 +-0.419 -0.100 -0.212 0.004 -0.344 -0.247 10.174 +-0.608 -0.142 -0.068 0.106 -0.381 -0.291 10.174 +-0.813 -0.165 0.062 0.112 -0.177 0.018 10.174 +-0.792 -0.403 0.091 0.113 -0.046 0.255 10.174 +-0.861 -0.419 0.050 0.050 -0.050 0.311 10.174 +-0.821 -0.597 -0.056 -0.028 0.057 0.367 10.174 +-0.595 -0.504 0.176 0.187 0.027 0.551 10.174 +-0.680 -0.683 -0.114 0.102 -0.027 0.459 10.174 +-0.613 -0.497 0.094 0.330 0.378 0.853 10.174 +-0.567 -0.487 0.233 0.443 0.774 0.932 10.174 +-0.743 -0.508 0.233 0.500 0.786 0.947 10.174 +-1.001 -0.390 0.292 0.410 0.820 0.852 10.174 +-1.173 -0.533 0.314 0.352 0.847 0.970 10.174 +-1.075 -0.595 0.243 0.255 0.762 0.834 10.174 +-0.934 -0.427 0.345 0.421 0.864 1.031 10.174 +-0.681 -0.148 0.575 0.520 0.877 1.139 10.174 +-0.509 0.015 0.657 0.811 1.239 1.655 10.174 +-0.953 -0.492 0.233 0.563 0.923 1.530 10.174 +-0.754 -0.415 0.470 0.725 1.012 1.837 10.174 +-0.757 -0.620 0.338 0.579 1.220 1.940 10.174 +-0.668 -0.667 0.352 0.740 1.365 2.350 10.174 +-0.380 -0.617 0.370 0.662 1.448 2.536 10.174 +-0.423 -0.658 0.298 0.673 1.698 2.782 10.174 +-0.309 -0.359 0.313 0.739 2.141 2.912 10.174 +0.069 0.114 0.585 1.208 2.671 3.505 10.174 +-0.332 -0.339 0.184 0.748 2.203 2.962 10.174 +-0.319 -0.179 0.240 0.848 2.181 3.115 10.174 +-0.214 -0.059 0.329 0.875 2.253 3.111 10.174 +-0.153 0.125 0.189 0.950 2.346 3.068 10.174 +0.016 0.113 0.106 0.955 2.218 2.842 10.174 +-0.132 0.045 0.133 0.862 2.156 2.770 10.174 +0.055 0.137 0.020 0.809 1.932 2.664 10.174 +-0.189 -0.149 -0.176 0.567 1.557 2.481 10.174 +0.027 0.029 -0.007 0.698 1.553 2.471 10.174 +-0.112 -0.095 -0.037 0.617 1.451 2.111 10.174 +-0.135 -0.056 -0.082 0.566 1.094 1.707 10.174 +-0.278 -0.411 -0.158 0.366 0.855 1.227 10.174 +-0.337 -0.457 0.083 0.188 0.793 1.210 10.174 +-0.225 -0.328 0.016 0.107 0.714 1.132 10.174 +-0.256 -0.544 -0.086 -0.011 0.453 0.736 10.174 +-0.401 -0.586 0.069 0.215 1.013 1.030 10.174 +-0.691 -0.927 -0.225 0.055 0.644 0.744 10.174 +-0.844 -0.916 -0.188 0.286 0.784 1.024 10.174 +-0.581 -0.668 -0.152 0.135 0.970 0.763 10.174 +-0.943 -1.121 -0.263 -0.089 0.701 0.513 10.174 +-0.630 -1.075 0.098 0.116 0.732 0.638 10.174 +-0.547 -1.163 -0.198 -0.041 0.778 0.531 10.174 +-0.488 -0.970 -0.146 0.043 0.400 0.242 10.174 +-0.328 -0.649 -0.045 0.146 0.579 0.308 10.174 +-0.486 -0.532 -0.154 -0.085 0.436 0.135 10.174 +-0.931 -0.853 -0.501 -0.581 0.025 -0.192 10.174 +-0.730 -0.434 -0.121 -0.198 0.258 -0.080 10.174 +-0.446 -0.189 0.121 -0.003 0.306 -0.029 10.174 +-0.730 -0.385 -0.084 -0.245 -0.164 -0.495 10.174 +-0.599 -0.521 -0.447 -0.404 -0.488 -0.694 10.174 +-0.434 -0.622 -0.347 -0.540 -0.594 -0.780 10.174 +-0.060 -0.298 -0.056 -0.388 -0.504 -0.739 10.174 +0.454 0.058 0.159 -0.051 -0.098 -0.494 10.174 +0.361 -0.058 0.042 -0.106 -0.293 -0.732 10.174 +0.024 -0.193 -0.181 -0.222 -0.336 -0.795 10.174 +0.233 0.182 0.058 -0.101 -0.315 -0.890 10.174 +0.291 0.200 0.067 0.117 0.016 -0.337 10.174 +-0.027 -0.392 -0.355 -0.254 -0.502 -0.899 10.174 +0.503 -0.013 0.123 0.227 0.020 -0.491 10.174 +0.290 -0.105 -0.034 -0.194 -0.461 -1.189 10.174 +0.477 -0.182 0.151 -0.314 -0.528 -1.689 10.174 +0.655 0.206 0.201 -0.971 -0.839 -2.225 10.174 +1.001 0.306 0.304 -1.172 -1.389 -3.036 10.174 +1.461 0.719 0.459 -1.107 -1.879 -3.692 10.174 +1.749 0.751 0.301 -1.246 -2.344 -3.988 10.174 +1.923 1.001 0.394 -1.409 -2.630 -4.314 10.174 +2.120 1.230 0.315 -1.258 -3.039 -4.603 10.174 +2.381 1.487 0.553 -1.041 -2.813 -4.655 10.174 +2.377 1.517 0.405 -1.099 -3.192 -4.782 10.174 +2.772 1.580 0.713 -0.766 -3.021 -4.774 10.174 +2.394 1.222 0.521 -0.806 -3.204 -4.414 9.410 +2.565 1.670 0.663 -0.865 -2.884 -4.350 9.410 +2.331 1.450 0.237 -1.128 -2.972 -4.419 9.410 +2.243 1.333 -0.143 -1.562 -3.094 -4.666 9.410 +2.241 1.766 0.361 -1.184 -2.358 -3.850 9.410 +2.449 1.722 0.581 -1.292 -2.293 -3.762 9.410 +2.002 1.397 0.250 -1.041 -1.804 -3.068 9.410 +1.579 1.174 -0.059 -0.898 -1.842 -2.850 9.410 +1.070 0.935 0.036 -0.260 -1.036 -1.704 9.410 +0.767 0.616 -0.167 0.109 -0.097 -1.035 9.410 +0.312 0.222 -0.183 -0.190 -0.353 -0.447 9.410 +-0.346 0.014 -0.485 -0.020 0.010 0.117 9.410 +-0.696 -0.284 -0.527 0.018 0.514 0.852 9.410 +-0.600 -0.231 -0.647 -0.127 0.060 0.279 9.410 +-0.952 -0.616 -0.668 -0.229 -0.224 0.154 9.410 +-0.605 -0.495 -0.399 -0.023 -0.216 0.136 9.410 +-0.362 0.012 -0.084 0.382 0.251 0.888 9.410 +-0.646 -0.320 -0.581 0.062 -0.468 -0.088 9.410 +-0.775 -0.291 -0.526 0.108 -0.052 0.150 9.410 +-0.468 -0.238 -0.407 0.168 -0.025 -0.010 9.410 +-0.558 -0.274 -0.413 0.265 -0.087 0.207 9.410 +-0.547 -0.364 -0.164 0.143 -0.071 0.152 9.410 +-0.914 -0.432 -0.235 0.077 -0.082 0.206 9.410 +-0.972 -0.388 -0.031 0.168 -0.015 0.233 9.410 +-0.852 -0.117 0.272 0.323 0.236 0.680 9.410 +-1.014 -0.404 -0.017 -0.012 -0.108 0.312 9.410 +-0.934 -0.370 -0.032 0.094 -0.080 0.391 9.410 +-0.954 -0.555 -0.180 0.000 -0.036 0.343 9.410 +-0.677 -0.658 -0.058 0.155 -0.121 0.351 9.410 +-0.787 -0.716 -0.172 -0.005 -0.229 0.202 9.410 +-0.676 -0.657 0.119 0.154 0.313 0.400 9.410 +-1.056 -0.627 0.227 0.084 0.491 0.430 9.410 +-1.365 -0.715 0.055 -0.041 0.350 0.112 9.410 +-1.422 -0.739 0.168 0.189 0.480 0.407 9.410 +-1.320 -0.791 0.034 0.059 0.376 0.139 9.410 +-1.036 -0.641 0.189 0.140 0.361 0.181 9.410 +-0.641 -0.277 0.200 0.026 0.216 -0.189 9.410 +-0.636 -0.329 0.210 0.212 0.503 0.547 9.410 +-0.942 -0.707 0.142 0.263 0.750 0.799 9.410 +-0.760 -0.571 0.254 0.450 1.048 1.155 9.410 +-0.494 -0.433 0.244 0.695 0.808 1.507 9.410 +-0.609 -0.517 0.097 0.507 1.097 1.933 9.410 +-0.524 -0.584 0.216 0.530 1.150 1.835 9.410 +-0.293 -0.714 0.235 0.601 1.566 2.349 9.410 +-0.130 -0.643 0.103 0.507 1.679 2.455 9.410 +0.032 -0.433 0.015 0.489 1.741 2.524 9.410 +-0.013 -0.294 0.124 0.535 1.484 2.559 9.410 +0.034 -0.019 0.364 0.668 1.724 2.855 9.410 +-0.207 0.027 0.496 0.691 1.605 2.652 9.410 +-0.117 0.136 0.375 0.839 1.597 2.739 9.410 +0.331 0.324 0.402 0.905 1.727 2.631 9.410 +0.522 0.234 0.222 0.900 1.786 2.536 9.410 +0.409 0.232 0.054 0.845 1.568 2.246 9.410 +0.133 -0.156 -0.214 0.692 1.290 1.885 9.410 +0.356 0.113 0.014 0.779 1.389 1.847 9.410 +-0.209 -0.240 -0.289 0.299 0.928 1.345 9.410 +-0.390 -0.525 -0.350 0.008 0.302 0.562 9.410 +0.011 -0.019 -0.056 0.320 0.514 0.780 9.410 +-0.048 -0.323 0.183 0.216 0.551 0.607 9.410 +-0.407 -0.682 -0.339 -0.469 -0.241 -0.286 9.410 +-0.149 -0.268 0.073 -0.222 -0.207 -0.420 9.410 +-0.707 -0.623 0.031 -0.137 0.333 0.233 9.410 +-1.432 -1.220 -0.888 -0.429 0.021 0.004 9.410 +-1.273 -1.111 -0.432 -0.063 0.389 0.164 9.410 +-0.904 -0.796 -0.186 0.098 0.444 0.055 9.410 +-0.731 -0.976 -0.264 0.127 0.650 0.399 9.410 +-0.921 -1.067 -0.310 0.008 0.459 0.175 9.410 +-0.997 -1.248 -0.348 -0.261 0.203 -0.098 9.410 +-0.834 -0.965 -0.455 -0.102 0.182 -0.088 9.410 +-0.803 -0.672 -0.128 -0.068 0.296 0.041 9.410 +-1.107 -0.986 -0.537 -0.467 0.157 -0.231 9.410 +-1.075 -0.743 -0.405 -0.382 0.284 -0.178 9.410 +-0.904 -0.642 -0.301 -0.271 0.310 0.027 9.410 +-0.784 -0.321 0.070 0.113 0.539 0.287 9.410 +-0.799 -0.329 -0.051 0.109 0.274 0.264 9.410 +-0.958 -0.547 -0.242 -0.288 0.004 -0.139 9.410 +-0.727 -0.286 -0.107 -0.159 0.058 0.082 9.410 +-0.488 -0.179 -0.152 -0.354 -0.266 -0.212 9.410 +-0.488 -0.272 -0.167 -0.146 -0.252 -0.327 9.410 +-0.170 -0.165 -0.150 -0.031 0.010 -0.101 9.410 +-0.632 -0.525 -0.321 -0.176 0.297 0.137 9.410 +-0.532 -0.466 -0.280 -0.249 0.165 -0.053 9.410 +-0.547 -0.428 -0.352 -0.215 0.276 0.076 9.410 +-0.444 -0.523 -0.112 0.217 0.223 0.304 9.410 +-0.720 -0.988 -0.222 0.310 0.708 0.772 9.410 +-0.475 -0.669 -0.019 0.218 0.593 -0.157 9.410 +-0.304 -0.248 -0.011 0.051 0.609 -0.693 9.410 +0.130 0.034 0.065 -0.431 -0.367 -1.329 9.410 +0.817 0.291 0.311 -0.535 -0.710 -1.761 9.410 +1.138 0.477 0.308 -1.126 -1.424 -2.907 9.410 +1.140 0.581 0.114 -1.148 -1.986 -3.129 9.410 +1.616 0.934 0.234 -1.239 -2.399 -3.718 9.410 +2.003 1.248 0.331 -1.060 -2.378 -3.622 9.410 +2.344 1.334 0.364 -1.195 -2.642 -4.126 9.410 +2.589 1.584 0.603 -0.957 -2.714 -4.046 9.410 +2.804 1.560 0.870 -0.795 -2.834 -4.311 9.410 +2.529 1.453 0.661 -0.712 -2.764 -3.580 8.262 +1.939 1.301 0.361 -1.153 -3.049 -3.766 8.262 +1.758 1.367 0.016 -1.355 -2.817 -3.880 8.262 +1.628 1.162 0.251 -1.406 -2.748 -3.927 8.262 +2.027 1.645 0.079 -0.989 -2.152 -3.328 8.262 +1.525 1.322 -0.089 -1.269 -2.024 -3.166 8.262 +0.995 0.781 -0.106 -0.995 -1.664 -2.783 8.262 +1.059 1.020 0.358 -0.481 -0.964 -1.541 8.262 +0.435 0.590 -0.006 -0.195 -0.283 -0.835 8.262 +-0.642 -0.138 -0.527 -0.113 -0.017 -0.010 8.262 +-0.909 -0.273 -0.416 0.378 0.727 0.958 8.262 +-1.177 -0.723 -0.699 0.622 1.374 1.847 8.262 +-1.311 -0.547 -0.439 1.002 1.810 2.765 8.262 +-1.506 -0.428 -0.800 0.671 1.554 2.153 8.262 +-1.404 -0.684 -0.735 0.608 0.901 1.631 8.262 +-1.096 -0.596 -0.474 0.753 0.977 1.445 8.262 +-1.526 -0.921 -0.694 0.466 0.350 1.244 8.262 +-1.553 -1.000 -0.911 0.155 -0.073 0.701 8.262 +-1.231 -0.710 -0.690 0.385 0.493 0.909 8.262 +-1.375 -0.891 -0.773 0.236 -0.034 0.645 8.262 +-1.037 -0.677 -0.591 0.477 0.238 0.846 8.262 +-1.037 -0.779 -0.555 0.111 0.018 0.680 8.262 +-1.080 -0.656 -0.311 -0.003 0.221 0.458 8.262 +-1.197 -0.450 -0.348 -0.045 0.190 0.576 8.262 +-1.197 -0.590 -0.267 -0.011 -0.134 0.377 8.262 +-1.474 -0.752 -0.518 -0.216 -0.400 -0.125 8.262 +-1.330 -0.676 -0.597 -0.241 -0.445 -0.038 8.262 +-1.163 -0.559 -0.424 -0.106 -0.169 0.072 8.262 +-1.050 -0.776 -0.426 -0.035 -0.256 -0.106 8.262 +-1.008 -0.607 -0.090 0.138 -0.039 0.122 8.262 +-1.102 -0.924 -0.297 -0.028 0.022 -0.111 8.262 +-1.315 -0.608 -0.036 0.100 0.260 0.174 8.262 +-1.358 -0.459 0.109 -0.093 0.086 -0.169 8.262 +-1.631 -0.643 0.014 -0.114 0.172 -0.215 8.262 +-0.864 -0.489 0.269 0.145 0.060 -0.271 8.262 +-0.819 -0.254 0.388 0.154 -0.014 -0.474 8.262 +-0.351 -0.224 0.105 -0.311 -0.342 -0.867 8.262 +-0.418 -0.406 0.222 -0.113 -0.011 -0.303 8.262 +-0.488 -0.425 0.112 0.196 0.154 0.171 8.262 +-0.821 -0.859 -0.365 -0.214 -0.114 0.022 8.262 +-0.467 -0.404 0.074 0.339 0.259 0.751 8.262 +-0.489 -0.545 0.026 0.556 0.552 1.324 8.262 +-0.189 -0.286 0.326 0.704 0.904 1.717 8.262 +-0.210 -0.442 0.214 0.477 1.119 1.843 8.262 +0.012 -0.202 0.087 0.508 1.286 2.009 8.262 +0.074 0.068 0.159 0.573 1.340 2.173 8.262 +0.139 0.063 0.250 0.308 1.284 1.978 8.262 +0.108 0.249 0.419 0.643 1.655 2.348 8.262 +0.184 0.299 0.452 0.554 1.460 2.254 8.262 +-0.224 0.122 0.135 0.426 1.181 2.054 8.262 +0.080 0.126 -0.162 0.580 0.982 1.853 8.262 +0.556 0.366 0.114 0.949 1.376 2.085 8.262 +0.654 0.184 -0.248 0.491 0.904 1.745 8.262 +0.373 -0.039 -0.187 0.523 1.002 1.607 8.262 +0.321 -0.083 -0.145 0.433 0.735 1.232 8.262 +0.389 0.177 0.108 0.592 0.752 1.299 8.262 +0.439 0.086 0.215 0.386 0.200 0.652 8.262 +0.367 0.124 0.152 0.270 -0.190 0.103 8.262 +0.245 0.474 0.112 0.292 0.052 -0.156 8.262 +-0.038 0.136 0.044 -0.120 0.114 -0.941 8.262 +-0.040 0.072 0.241 -0.337 -0.717 -1.370 8.262 +-0.723 -0.387 -0.100 -0.321 -0.162 -0.786 8.262 +-0.769 -0.511 -0.025 -0.044 0.024 -0.405 8.262 +-1.202 -0.770 -0.315 0.184 0.269 -0.219 8.262 +-1.029 -0.629 -0.254 0.169 0.183 -0.164 8.262 +-1.273 -0.773 -0.311 0.033 0.082 -0.036 8.262 +-1.119 -0.827 -0.235 0.147 -0.318 -0.154 8.262 +-1.250 -0.731 0.068 0.019 0.260 0.090 8.262 +-1.097 -0.641 -0.330 0.213 0.147 -0.042 8.262 +-1.241 -0.914 -0.587 -0.240 0.022 -0.174 8.262 +-1.177 -0.835 -0.468 -0.030 0.257 -0.045 8.262 +-1.402 -0.889 -0.563 -0.030 0.243 0.097 8.262 +-1.393 -0.910 -0.495 -0.071 0.167 0.114 8.262 +-1.395 -0.759 -0.234 0.110 0.326 0.387 8.262 +-1.147 -0.538 -0.110 0.111 0.341 0.596 8.262 +-1.372 -0.611 -0.210 -0.092 0.221 0.734 8.262 +-1.386 -0.644 -0.184 -0.086 0.280 0.768 8.262 +-1.134 -0.474 -0.007 -0.064 0.259 0.889 8.262 +-0.957 -0.267 -0.045 0.032 0.456 0.966 8.262 +-0.918 -0.568 -0.377 -0.243 0.469 0.749 8.262 +-1.076 -0.390 -0.137 0.172 1.072 1.198 8.262 +-1.374 -0.737 -0.308 0.064 1.008 1.050 8.262 +-1.542 -0.811 -0.212 0.438 1.237 1.693 8.262 +-1.805 -1.129 -0.385 0.570 1.026 1.874 8.262 +-1.687 -1.048 0.085 0.994 1.887 2.100 8.262 +-1.482 -1.030 0.102 0.817 1.877 1.478 8.262 +-1.162 -0.866 -0.031 0.341 1.154 0.730 8.262 +-0.770 -0.747 0.086 0.032 0.296 0.594 8.262 +0.074 0.309 0.301 -0.113 -0.275 -0.828 8.262 +0.639 0.474 0.391 -0.303 -0.513 -1.425 8.262 +1.151 0.475 0.347 -0.636 -0.795 -1.856 8.262 +1.030 0.547 0.123 -0.943 -1.510 -2.614 8.262 +1.453 0.796 0.228 -1.028 -1.957 -2.813 8.262 +2.208 1.264 0.585 -0.988 -2.441 -3.135 8.262 +2.147 1.334 0.602 -0.903 -2.704 -3.326 8.262 +2.178 1.344 0.746 -1.052 -2.816 -3.729 8.262 +2.391 1.670 0.607 -0.950 -2.181 -2.995 6.741 +2.002 1.425 0.259 -1.073 -2.357 -3.309 6.741 +1.763 1.056 -0.096 -1.393 -2.454 -3.641 6.741 +1.613 1.284 -0.083 -1.108 -1.990 -3.311 6.741 +1.374 1.014 -0.294 -1.163 -1.901 -2.934 6.741 +1.763 1.266 0.404 -0.523 -1.205 -2.285 6.741 +0.789 0.505 -0.022 -0.766 -1.066 -1.894 6.741 +0.804 0.881 0.494 -0.079 -0.144 -0.747 6.741 +-0.791 -0.376 -0.469 -0.534 -0.258 -0.404 6.741 +-0.688 0.096 -0.102 0.513 1.103 1.363 6.741 +-1.779 -0.853 -0.652 0.589 1.170 2.064 6.741 +-2.042 -1.276 -0.460 1.245 1.791 3.231 6.741 +-2.017 -0.869 -0.358 1.759 2.498 4.398 6.741 +-2.094 -1.001 -0.673 1.134 2.234 3.634 6.741 +-2.085 -0.647 -0.392 1.140 1.835 3.273 6.741 +-1.379 -0.484 -0.185 1.148 1.814 2.828 6.741 +-2.187 -1.257 -0.954 0.535 0.972 2.166 6.741 +-1.567 -0.603 -0.714 0.868 1.144 2.123 6.741 +-1.587 -0.770 -0.593 0.594 0.795 2.003 6.741 +-1.427 -0.869 -0.597 0.458 0.652 1.506 6.741 +-1.157 -0.722 -0.499 0.488 0.704 1.430 6.741 +-1.412 -0.716 -0.487 0.191 0.552 1.048 6.741 +-1.271 -0.599 -0.335 -0.072 0.407 0.932 6.741 +-1.011 -0.574 -0.242 -0.062 0.191 0.406 6.741 +-0.935 -0.499 -0.337 0.066 0.047 0.348 6.741 +-0.996 -0.419 -0.177 0.187 0.092 0.145 6.741 +-1.275 -0.596 -0.592 -0.095 -0.224 -0.556 6.741 +-1.166 -0.566 -0.541 -0.053 -0.125 -0.695 6.741 +-1.336 -0.756 -0.482 -0.332 -0.385 -0.868 6.741 +-1.285 -0.750 -0.361 -0.267 0.007 -0.658 6.741 +-1.139 -0.637 -0.116 -0.144 0.061 -0.818 6.741 +-1.302 -0.723 -0.015 -0.279 0.059 -0.398 6.741 +-1.282 -0.608 -0.010 -0.363 -0.575 -0.798 6.741 +-1.512 -0.849 -0.090 -0.333 -0.450 -0.810 6.741 +-1.300 -0.689 -0.130 -0.311 -0.693 -1.194 6.741 +-0.779 -0.268 0.300 -0.159 -0.471 -1.087 6.741 +-0.541 -0.158 0.033 -0.690 -0.985 -1.456 6.741 +0.049 -0.167 0.335 -0.104 -0.410 -0.919 6.741 +0.007 0.015 0.217 0.066 -0.258 -0.491 6.741 +-0.120 -0.133 0.012 0.025 -0.261 -0.252 6.741 +0.179 -0.009 0.124 0.177 -0.027 0.175 6.741 +0.036 -0.192 0.290 0.346 -0.120 0.744 6.741 +0.277 -0.028 0.309 0.411 0.215 0.905 6.741 +0.156 -0.142 0.251 0.356 0.865 1.404 6.741 +0.357 0.105 0.161 0.148 0.909 1.279 6.741 +0.613 0.386 0.277 0.432 1.309 1.713 6.741 +0.538 0.651 0.253 0.307 1.249 1.374 6.741 +0.500 0.675 0.253 0.462 1.056 1.733 6.741 +0.467 0.749 0.198 0.490 0.578 1.625 6.741 +0.697 0.879 0.399 0.799 0.753 1.965 6.741 +0.778 0.412 -0.161 0.385 0.386 1.192 6.741 +1.203 0.763 0.032 0.975 0.681 1.781 6.741 +1.131 0.558 0.113 0.877 0.813 1.292 6.741 +0.997 0.408 0.289 0.644 0.717 1.395 6.741 +0.987 0.437 0.366 0.533 0.586 0.802 6.741 +0.193 -0.018 -0.049 0.094 0.139 0.295 6.741 +0.600 0.427 0.508 0.345 -0.116 0.006 6.741 +-0.079 0.026 -0.161 -0.174 -0.844 -0.614 6.741 +0.386 0.496 0.431 -0.067 -0.676 -0.756 6.741 +0.263 0.622 0.516 -0.217 -0.833 -1.458 6.741 +-0.214 0.003 -0.059 -1.261 -1.774 -2.336 6.741 +-0.797 -0.651 -0.419 -0.859 -1.330 -1.912 6.741 +-0.487 -0.384 -0.111 -0.400 -0.323 -1.257 6.741 +-0.765 -0.488 -0.473 0.255 0.071 -0.426 6.741 +-0.865 -0.236 -0.433 0.224 -0.239 -0.766 6.741 +-1.290 -0.572 -0.268 0.131 -0.515 -0.589 6.741 +-1.031 -0.184 -0.088 0.213 -0.337 -0.436 6.741 +-1.279 -0.233 -0.162 0.092 -0.211 -0.297 6.741 +-1.050 -0.261 -0.142 -0.007 0.037 -0.442 6.741 +-1.619 -0.907 -0.836 -0.322 -0.465 -0.475 6.741 +-1.498 -0.614 -0.610 -0.070 -0.293 -0.102 6.741 +-1.527 -0.856 -0.692 -0.107 -0.192 0.046 6.741 +-1.549 -1.079 -0.684 -0.053 -0.367 0.177 6.741 +-1.521 -0.731 -0.240 0.233 0.235 0.736 6.741 +-1.609 -0.794 -0.187 0.149 0.358 0.996 6.741 +-1.819 -0.906 0.113 0.117 0.450 1.349 6.741 +-1.495 -0.800 0.043 0.344 0.927 1.681 6.741 +-1.443 -0.926 -0.370 0.057 0.555 1.675 6.741 +-1.446 -0.892 -0.488 0.185 0.901 2.167 6.741 +-1.340 -0.799 -0.482 0.160 1.147 2.001 6.741 +-1.673 -0.799 -0.350 0.333 1.683 2.360 6.741 +-1.774 -0.862 -0.095 0.507 1.604 2.344 6.741 +-2.350 -1.274 -0.361 0.600 1.684 2.629 6.741 +-2.622 -1.193 -0.297 1.248 1.975 3.207 6.741 +-2.316 -1.191 0.009 1.280 2.696 3.169 6.741 +-2.234 -1.136 -0.114 1.408 2.226 2.756 6.741 +-1.586 -0.983 -0.030 0.728 1.652 2.007 6.741 +-0.784 -0.482 0.360 0.156 1.003 1.183 6.741 +-0.202 0.096 0.494 0.712 0.586 0.415 6.741 +0.528 0.179 0.531 0.208 0.124 -0.420 6.741 +0.784 0.457 0.599 -0.122 -0.175 -0.750 6.741 +1.399 0.740 0.487 -0.462 -1.007 -1.729 6.741 +1.533 0.776 0.431 -0.788 -1.468 -2.283 6.741 +2.039 0.992 0.510 -0.978 -2.306 -2.779 6.741 +1.871 1.180 0.488 -0.962 -2.355 -3.207 6.741 +2.357 1.415 0.542 -0.968 -2.376 -3.236 6.741 +2.056 1.444 0.473 -0.771 -1.630 -2.417 4.839 +2.235 1.687 0.855 -0.429 -1.221 -1.983 4.839 +1.545 0.885 0.021 -1.087 -1.870 -2.533 4.839 +1.449 1.032 0.249 -0.707 -1.091 -2.128 4.839 +1.014 0.583 0.044 -0.897 -1.056 -1.691 4.839 +1.438 1.158 0.833 0.094 0.028 -0.725 4.839 +1.274 0.885 0.974 0.224 0.375 0.081 4.839 +-0.113 0.362 0.132 0.005 0.125 0.231 4.839 +-0.751 -0.256 -0.054 0.733 0.775 1.158 4.839 +-1.694 -0.821 -0.218 0.898 1.367 2.234 4.839 +-2.304 -1.304 -0.422 0.945 1.924 3.199 4.839 +-2.832 -1.207 -0.505 1.663 2.884 4.611 4.839 +-3.148 -1.397 -0.571 1.834 3.330 5.152 4.839 +-3.437 -1.366 -0.947 1.416 3.093 5.028 4.839 +-2.870 -1.035 -0.633 1.470 2.936 4.843 4.839 +-2.397 -0.756 -0.162 1.597 2.743 4.343 4.839 +-2.584 -1.051 -0.749 0.977 2.345 3.801 4.839 +-2.335 -0.882 -0.872 0.985 1.990 3.158 4.839 +-1.931 -0.746 -0.728 1.123 1.896 3.134 4.839 +-1.878 -0.878 -0.684 1.003 1.585 2.651 4.839 +-1.344 -0.769 -0.445 0.843 1.659 2.329 4.839 +-1.657 -0.930 -0.553 0.334 1.348 1.927 4.839 +-1.622 -0.747 -0.446 0.091 1.099 1.431 4.839 +-1.563 -0.770 -0.400 0.106 0.700 1.166 4.839 +-1.169 -0.586 -0.308 0.125 0.377 0.429 4.839 +-0.770 -0.320 -0.017 0.458 0.724 0.359 4.839 +-1.187 -0.682 -0.563 0.069 -0.044 -0.649 4.839 +-1.438 -0.483 -0.493 0.018 -0.019 -0.785 4.839 +-1.616 -0.424 -0.392 -0.236 -0.231 -1.036 4.839 +-1.472 -0.306 0.143 -0.145 0.219 -0.621 4.839 +-1.289 -0.431 0.149 -0.365 -0.187 -1.136 4.839 +-1.432 -0.547 0.221 -0.354 -0.178 -0.822 4.839 +-1.160 -0.147 0.388 -0.302 -0.700 -1.261 4.839 +-1.479 -0.450 0.147 -0.280 -1.054 -1.537 4.839 +-0.958 -0.400 0.130 -0.255 -1.072 -2.041 4.839 +-0.645 -0.179 0.354 -0.449 -1.198 -2.398 4.839 +-0.121 0.150 0.435 -0.404 -1.222 -2.427 4.839 +0.076 0.281 0.443 -0.080 -0.715 -1.764 4.839 +0.025 0.223 0.199 -0.238 -0.906 -1.542 4.839 +-0.114 0.252 0.097 -0.179 -0.934 -1.131 4.839 +0.261 0.394 0.123 -0.067 -0.762 -0.710 4.839 +-0.087 0.021 0.059 -0.165 -0.660 -0.240 4.839 +0.245 0.166 0.049 -0.017 -0.398 -0.081 4.839 +0.531 0.453 0.435 0.296 0.727 0.744 4.839 +0.824 0.845 0.413 0.207 0.743 0.731 4.839 +0.667 0.784 0.344 0.248 1.222 1.026 4.839 +1.156 1.255 0.508 0.538 1.534 1.031 4.839 +0.776 1.179 0.431 0.710 1.177 1.235 4.839 +1.005 1.349 0.416 0.760 0.678 1.221 4.839 +1.394 1.323 0.333 0.949 0.712 1.483 4.839 +1.130 0.677 -0.289 0.378 -0.089 0.519 4.839 +1.041 0.485 -0.113 0.488 0.352 0.748 4.839 +1.115 0.690 0.274 0.373 0.244 0.448 4.839 +0.789 0.365 0.389 0.180 -0.069 0.350 4.839 +0.745 0.511 0.275 0.084 -0.283 -0.126 4.839 +0.609 0.626 0.438 0.390 0.150 0.027 4.839 +0.630 0.838 0.672 0.120 -0.540 -0.768 4.839 +-0.076 0.474 0.207 -0.295 -1.489 -1.273 4.839 +-0.426 0.001 -0.156 -0.973 -1.510 -1.990 4.839 +-0.104 0.246 0.015 -0.546 -1.719 -2.157 4.839 +0.129 0.501 -0.024 -0.442 -1.721 -2.707 4.839 +-0.079 -0.022 -0.143 -0.424 -1.463 -2.422 4.839 +-0.079 0.074 0.214 0.068 -0.704 -1.813 4.839 +-1.133 -0.394 -0.383 -0.286 -0.445 -1.333 4.839 +-1.085 0.053 -0.157 0.128 -0.544 -1.366 4.839 +-1.523 -0.007 0.014 0.387 -0.345 -0.701 4.839 +-1.212 -0.165 0.067 -0.070 -0.496 -0.763 4.839 +-1.412 -0.317 -0.070 0.011 0.057 -0.382 4.839 +-1.694 -0.532 -0.583 -0.335 -0.505 -0.558 4.839 +-1.734 -0.521 -0.671 -0.165 -0.219 -0.042 4.839 +-1.553 -0.585 -0.796 -0.132 -0.245 0.340 4.839 +-1.568 -0.834 -0.718 0.066 0.007 0.671 4.839 +-1.622 -0.630 -0.245 0.211 0.440 1.071 4.839 +-1.981 -0.694 -0.210 0.433 0.742 1.481 4.839 +-1.987 -0.785 -0.332 0.253 0.918 1.615 4.839 +-2.442 -1.020 -0.468 0.072 0.828 1.771 4.839 +-2.026 -0.831 -0.151 0.255 1.206 2.308 4.839 +-1.990 -0.985 -0.285 0.406 1.405 2.683 4.839 +-2.170 -0.829 -0.332 0.778 1.955 3.025 4.839 +-2.216 -0.631 -0.542 0.876 2.122 2.997 4.839 +-2.372 -0.948 -0.298 1.027 2.639 3.816 4.839 +-2.380 -1.346 -0.083 1.189 2.695 4.036 4.839 +-2.936 -0.949 -0.087 1.573 3.147 4.600 4.839 +-3.585 -1.502 -0.124 1.924 3.303 4.989 4.839 +-3.138 -1.267 -0.027 2.121 3.670 5.174 4.839 +-2.674 -1.245 0.031 1.827 3.085 4.222 4.839 +-1.857 -0.995 -0.007 1.336 2.513 3.277 4.839 +-1.371 -0.523 0.465 1.256 2.135 2.706 4.839 +-1.127 -0.259 0.419 0.455 1.401 1.857 4.839 +-0.353 0.187 0.445 0.550 0.868 1.066 4.839 +0.270 0.436 0.721 0.461 0.519 0.441 4.839 +0.852 0.515 0.662 0.124 -0.123 -0.522 4.839 +1.295 0.698 0.527 -0.209 -0.665 -1.030 4.839 +1.446 0.848 0.381 -0.628 -1.275 -2.028 4.839 +2.024 1.160 0.538 -0.528 -1.452 -1.937 4.839 +2.089 1.374 0.729 -0.659 -1.383 -2.105 4.839 +1.712 0.857 0.469 -0.797 -1.210 -1.699 2.659 +1.729 1.069 0.698 -0.442 -0.823 -1.509 2.659 +2.037 1.548 1.026 0.115 -0.288 -0.671 2.659 +2.048 1.451 0.998 0.143 -0.431 -0.817 2.659 +1.869 1.205 1.088 0.432 -0.074 0.147 2.659 +0.879 0.506 0.386 -0.055 0.058 -0.313 2.659 +0.116 0.460 0.246 -0.121 0.121 0.817 2.659 +-0.008 0.390 0.672 0.847 1.117 2.160 2.659 +-0.709 0.080 0.525 1.342 2.145 3.138 2.659 +-1.597 -0.622 0.337 1.437 2.471 4.188 2.659 +-2.666 -1.359 -0.252 1.158 2.611 4.665 2.659 +-3.386 -1.145 -0.267 1.792 3.423 5.590 2.659 +-3.820 -1.582 -0.382 2.076 3.896 6.142 2.659 +-3.325 -1.532 -0.355 2.149 4.130 6.395 2.659 +-3.392 -1.347 -0.944 1.687 3.667 5.735 2.659 +-2.922 -1.228 -0.900 1.554 3.316 4.796 2.659 +-3.496 -1.637 -1.376 1.178 2.594 4.376 2.659 +-2.914 -0.989 -0.865 1.345 2.682 4.310 2.659 +-2.933 -1.501 -1.298 0.984 2.053 3.672 2.659 +-2.704 -1.530 -1.138 0.802 1.684 3.362 2.659 +-2.311 -1.210 -0.658 0.916 1.889 2.998 2.659 +-2.276 -1.112 -0.739 0.531 1.581 2.354 2.659 +-2.056 -1.207 -1.118 0.011 0.836 1.220 2.659 +-1.754 -0.922 -0.840 0.159 0.896 1.363 2.659 +-1.306 -0.524 -0.469 0.271 0.721 0.883 2.659 +-1.196 -0.353 -0.433 0.369 0.638 0.103 2.659 +-1.017 0.062 -0.292 0.518 0.654 -0.340 2.659 +-1.505 -0.065 -0.374 0.055 0.030 -0.739 2.659 +-1.649 -0.186 -0.289 -0.466 -0.396 -1.205 2.659 +-1.854 -0.275 -0.208 -0.575 -0.659 -1.141 2.659 +-1.344 -0.054 0.043 -0.629 -0.871 -1.328 2.659 +-1.267 -0.207 0.185 -0.562 -1.002 -1.476 2.659 +-0.794 -0.013 0.326 -0.683 -1.429 -2.301 2.659 +-1.188 -0.401 0.055 -0.722 -1.484 -2.027 2.659 +-0.934 -0.032 0.341 -0.634 -1.740 -2.783 2.659 +-0.327 0.322 0.609 -0.456 -1.453 -2.919 2.659 +-0.176 0.449 0.288 -0.779 -2.066 -3.617 2.659 +-0.238 0.414 0.176 -0.729 -1.711 -3.342 2.659 +0.073 0.501 0.464 -0.462 -1.502 -2.780 2.659 +0.211 0.678 0.531 -0.335 -1.244 -1.968 2.659 +0.602 1.060 0.601 -0.149 -1.040 -1.516 2.659 +0.249 0.479 0.211 -0.251 -0.809 -1.023 2.659 +0.927 0.853 0.374 -0.129 -0.420 -0.722 2.659 +1.059 1.099 0.792 0.397 0.578 0.211 2.659 +1.399 1.284 0.533 -0.032 0.588 0.019 2.659 +1.439 1.469 0.594 0.503 1.084 0.518 2.659 +1.480 1.592 0.481 0.401 0.831 0.070 2.659 +1.408 1.438 0.202 0.348 0.429 0.356 2.659 +1.540 1.408 0.012 0.342 0.068 0.182 2.659 +2.102 1.839 0.478 1.018 1.001 0.964 2.659 +1.744 1.301 -0.159 0.190 0.216 -0.138 2.659 +1.764 1.255 0.388 0.639 0.201 0.343 2.659 +1.432 0.964 0.119 0.152 -0.926 -0.552 2.659 +1.496 1.221 0.648 0.554 -0.101 -0.071 2.659 +1.546 1.501 0.796 0.473 -0.203 -0.658 2.659 +0.948 1.219 0.513 0.134 -0.620 -0.927 2.659 +0.258 0.955 0.067 -0.559 -1.881 -1.833 2.659 +0.262 1.085 0.331 -0.408 -1.724 -1.850 2.659 +0.264 0.691 -0.013 -0.590 -1.952 -2.469 2.659 +0.133 0.460 -0.188 -0.539 -2.228 -2.992 2.659 +0.318 0.646 -0.205 -0.501 -2.410 -3.289 2.659 +0.040 0.547 -0.141 -0.267 -1.761 -2.825 2.659 +-1.033 -0.363 -0.811 -0.902 -2.044 -3.034 2.659 +-0.994 0.168 -0.322 -0.300 -0.895 -1.840 2.659 +-0.981 0.261 -0.339 -0.320 -0.981 -1.913 2.659 +-1.015 0.123 -0.440 -0.119 -0.581 -1.136 2.659 +-1.206 0.075 -0.060 -0.176 -0.778 -1.080 2.659 +-1.534 -0.076 -0.243 0.041 -0.561 -0.548 2.659 +-1.773 -0.142 -0.556 -0.254 -0.554 -0.600 2.659 +-1.958 -0.440 -0.647 -0.361 -0.238 -0.229 2.659 +-2.394 -1.100 -1.271 -0.728 -0.490 -0.365 2.659 +-2.599 -1.378 -1.120 -0.579 -0.448 0.098 2.659 +-2.406 -0.910 -0.834 -0.267 0.462 0.907 2.659 +-2.251 -0.712 -0.581 0.077 0.784 1.653 2.659 +-2.225 -0.744 -0.533 0.379 0.914 2.035 2.659 +-2.355 -1.046 -0.497 0.367 1.265 2.686 2.659 +-2.163 -0.939 -0.178 0.569 1.678 3.393 2.659 +-2.283 -0.941 -0.192 0.502 1.918 3.434 2.659 +-2.645 -1.265 -0.438 0.724 2.160 3.701 2.659 +-2.403 -1.043 -0.382 1.221 2.645 4.082 2.659 +-2.947 -1.265 -0.359 1.589 2.984 4.881 2.659 +-3.283 -1.527 -0.328 2.455 2.985 4.846 2.659 +-3.534 -1.073 -0.288 2.277 3.480 5.280 2.659 +-3.330 -0.821 -0.224 2.245 4.143 5.935 2.659 +-3.828 -1.206 -0.190 2.070 4.091 6.052 2.659 +-3.284 -0.601 0.067 2.073 3.672 5.062 2.659 +-2.406 -0.967 0.125 2.123 3.465 4.550 2.659 +-2.006 -0.897 0.523 1.567 2.919 3.956 2.659 +-1.717 -0.371 0.703 1.251 2.440 3.527 2.659 +-1.058 -0.282 0.499 0.349 1.649 2.207 2.659 +-0.282 0.027 0.515 0.314 1.117 1.612 2.659 +0.364 0.517 0.468 0.359 0.580 0.585 2.659 +0.808 0.809 0.540 0.295 0.201 0.091 2.659 +1.140 0.702 0.274 -0.368 -0.544 -0.773 2.659 +1.665 0.816 0.378 -0.631 -0.508 -0.872 2.659 +2.398 1.410 0.977 -0.073 -0.575 -0.709 2.659 +2.196 1.035 1.152 -0.008 0.269 0.334 0.121 +2.006 1.348 1.088 0.140 0.422 0.165 0.121 +2.082 1.085 1.048 0.110 0.149 0.421 0.121 +1.341 0.555 0.540 0.179 -0.462 0.153 0.121 +1.348 1.049 1.059 0.766 0.569 1.297 0.121 +0.985 0.922 1.016 1.001 1.007 1.999 0.121 +-0.444 -0.250 0.276 0.536 1.087 2.140 0.121 +-0.346 0.230 0.912 1.381 2.086 3.716 0.121 +-1.397 -0.503 0.775 1.426 2.760 5.034 0.121 +-2.350 -0.338 0.440 1.741 3.116 5.936 0.121 +-2.912 -0.931 0.057 1.740 3.648 6.379 0.121 +-3.911 -1.775 -0.722 1.829 4.087 6.247 0.121 +-3.922 -1.678 -0.372 2.863 4.914 7.276 0.121 +-4.088 -1.828 -0.408 2.645 5.380 7.582 0.121 +-4.196 -1.804 -0.963 2.020 4.563 7.082 0.121 +-4.068 -1.607 -1.098 1.812 4.176 6.228 0.121 +-4.499 -2.238 -1.825 0.645 3.398 5.527 0.121 +-4.081 -1.796 -1.661 0.718 3.397 5.368 0.121 +-3.281 -1.054 -1.176 1.068 3.333 5.218 0.121 +-3.236 -1.081 -1.026 1.130 2.893 4.549 0.121 +-2.671 -0.751 -0.761 1.141 2.935 4.237 0.121 +-2.568 -0.613 -0.804 1.132 2.497 3.534 0.121 +-2.545 -0.982 -1.315 0.282 1.350 2.072 0.121 +-2.225 -0.995 -1.150 0.347 1.005 1.534 0.121 +-2.030 -0.680 -0.855 0.368 0.615 0.874 0.121 +-2.181 -0.682 -0.921 0.202 0.289 0.088 0.121 +-2.046 -0.617 -0.962 -0.231 -0.519 -0.747 0.121 +-1.682 -0.160 -0.260 -0.255 -0.451 -0.604 0.121 +-1.716 -0.003 -0.113 -0.581 -0.752 -1.529 0.121 +-1.897 0.024 -0.171 -0.915 -1.010 -1.774 0.121 +-1.375 0.270 -0.031 -1.111 -0.922 -2.085 0.121 +-1.443 -0.056 -0.162 -1.355 -1.424 -2.618 0.121 +-0.724 0.114 0.213 -1.240 -1.866 -3.269 0.121 +-1.433 -0.137 0.143 -1.033 -2.081 -3.506 0.121 +-0.760 0.278 0.529 -0.722 -2.266 -3.877 0.121 +-0.345 0.178 0.402 -1.100 -2.774 -4.230 0.121 +0.309 0.805 0.597 -0.869 -2.784 -4.329 0.121 +-0.324 0.499 0.044 -0.953 -2.468 -4.276 0.121 +0.303 1.047 0.668 -0.690 -1.842 -3.570 0.121 +0.058 1.049 0.485 -0.622 -2.000 -3.169 0.121 +0.930 1.377 0.885 -0.412 -1.544 -2.644 0.121 +0.797 1.378 0.718 -0.363 -0.896 -1.821 0.121 +1.111 1.367 0.715 -0.504 -0.719 -1.800 0.121 +0.672 1.087 0.227 -0.355 -0.232 -1.205 0.121 +1.636 1.652 0.317 -0.017 0.228 -1.209 0.121 +1.663 1.598 0.300 0.186 0.142 -0.568 0.121 +2.302 1.858 0.190 -0.060 -0.454 -0.840 0.121 +1.875 1.729 0.208 -0.018 -0.222 -0.445 0.121 +1.806 1.473 -0.186 -0.140 -0.299 -0.930 0.121 +1.276 1.206 -0.568 -0.399 -0.655 -1.292 0.121 +2.212 1.793 -0.034 -0.144 -0.863 -1.218 0.121 +2.422 1.962 0.353 0.461 -0.451 -0.667 0.121 +2.401 2.002 0.577 0.426 -0.885 -1.112 0.121 +1.971 1.977 0.759 0.364 -0.704 -0.928 0.121 +1.972 1.837 0.815 0.090 -1.099 -1.707 0.121 +0.735 1.250 0.364 -0.609 -2.049 -2.170 0.121 +0.700 1.224 0.231 -1.100 -2.211 -3.024 0.121 +0.241 0.918 -0.417 -1.055 -2.277 -3.124 0.121 +0.535 0.690 -0.992 -1.164 -2.846 -3.852 0.121 +0.613 1.153 -0.375 -1.077 -2.664 -3.735 0.121 +0.952 1.350 -0.392 -0.732 -2.786 -4.274 0.121 +-0.695 0.422 -0.876 -1.390 -3.044 -4.577 0.121 +-0.414 0.610 -0.358 -1.179 -2.468 -3.744 0.121 +-0.963 0.877 -0.755 -1.064 -1.952 -2.864 0.121 +-0.325 1.308 -0.102 -0.350 -1.310 -2.241 0.121 +-1.090 0.267 -0.315 -0.823 -1.058 -1.880 0.121 +-0.741 0.353 0.077 -0.184 -1.030 -1.651 0.121 +-1.204 0.791 -0.106 0.342 -0.581 -0.664 0.121 +-1.597 0.501 -0.530 -0.061 -0.981 -0.874 0.121 +-1.748 0.220 -0.564 0.183 -0.504 -0.117 0.121 +-2.219 -0.325 -0.643 -0.525 -0.269 -0.111 0.121 +-2.412 -0.412 -0.707 -0.322 0.290 0.730 0.121 +-2.118 -0.185 -0.084 0.092 0.844 1.636 0.121 +-2.327 -0.110 -0.213 0.400 1.319 2.407 0.121 +-2.009 -0.164 -0.069 0.913 1.561 3.113 0.121 +-2.598 -0.771 -0.442 0.883 1.695 3.689 0.121 +-2.621 -0.880 -0.421 1.079 1.864 4.174 0.121 +-2.870 -0.862 -0.259 1.058 2.389 4.874 0.121 +-2.616 -0.965 -0.126 1.959 3.079 5.446 0.121 +-3.152 -1.273 -0.170 2.282 3.229 5.475 0.121 +-3.435 -1.198 -0.235 2.996 3.794 6.417 0.121 +-3.492 -1.191 -0.031 2.652 3.874 6.478 0.121 +-3.848 -1.143 -0.311 2.652 4.368 6.782 0.121 +-4.158 -1.357 -0.086 3.036 4.923 7.652 0.121 +-4.412 -0.627 -0.406 2.664 5.123 7.175 0.121 +-3.858 -1.065 0.122 2.676 4.911 6.783 0.121 +-3.341 -0.835 0.314 2.373 4.770 6.258 0.121 +-2.651 -0.118 0.571 2.383 4.208 5.938 0.121 +-2.054 -0.567 0.728 1.914 3.473 5.332 0.121 +-1.650 -0.438 0.670 1.335 2.793 3.927 0.121 +-0.838 0.235 0.564 0.841 2.165 3.147 0.121 +-0.118 0.184 0.775 0.507 1.389 2.688 0.121 +0.637 0.549 0.709 0.340 0.938 1.693 0.121 +1.299 0.798 0.592 0.428 0.615 0.645 0.121 +1.842 0.977 0.660 0.395 0.614 0.444 0.121 +1.672 0.705 0.585 -0.027 -0.149 -0.233 0.121 +2.737 0.941 0.982 0.153 0.774 0.936 -1.082 +1.771 1.097 1.064 0.678 0.914 1.041 -1.082 +2.042 0.790 0.690 0.766 1.059 1.731 -1.082 +1.242 0.899 0.674 1.104 1.009 2.275 -1.082 +1.633 1.469 1.638 1.970 1.530 3.540 -1.082 +-0.866 -0.603 0.368 0.609 0.816 2.885 -1.082 +-0.841 -0.527 0.341 1.168 2.121 4.371 -1.082 +-1.634 -0.661 0.066 2.095 2.634 4.946 -1.082 +-2.620 -1.755 -0.861 1.102 3.023 6.476 -1.082 +-3.819 -1.592 -0.543 1.353 3.923 6.403 -1.082 +-3.561 -1.178 -0.231 2.442 5.340 7.839 -1.082 +-4.249 -2.067 -0.390 2.583 5.065 8.278 -1.082 +-3.675 -1.564 0.107 3.229 6.842 9.308 -1.082 +-4.963 -2.486 -1.095 2.378 5.764 8.470 -1.082 +-4.639 -1.759 -0.868 2.303 5.640 8.796 -1.082 +-4.612 -1.441 -1.115 2.438 4.990 8.450 -1.082 +-4.989 -1.776 -1.505 2.030 4.961 7.647 -1.082 +-5.410 -3.001 -2.209 0.665 3.915 6.282 -1.082 +-4.232 -1.840 -1.771 1.532 4.029 6.226 -1.082 +-3.993 -1.437 -1.913 0.964 3.987 5.424 -1.082 +-2.884 -1.213 -1.500 0.976 3.313 4.932 -1.082 +-2.772 -1.151 -1.456 0.586 2.671 3.839 -1.082 +-2.830 -1.094 -1.548 0.015 2.014 2.452 -1.082 +-1.832 -0.048 -0.717 0.785 1.906 2.497 -1.082 +-1.308 -0.026 -0.587 0.708 1.665 1.482 -1.082 +-2.481 -0.618 -1.251 -0.669 0.355 -0.061 -1.082 +-2.307 -0.627 -0.846 -1.224 -0.303 -0.774 -1.082 +-1.234 0.127 0.443 -0.325 -0.378 -0.811 -1.082 +-0.783 0.691 0.280 -0.540 -0.276 -1.277 -1.082 +-0.550 0.884 0.433 -0.485 -0.179 -1.794 -1.082 +-0.388 1.021 0.767 -0.915 -0.811 -2.627 -1.082 +-1.322 0.074 -0.158 -1.604 -2.029 -3.750 -1.082 +-0.709 0.510 0.583 -1.420 -2.455 -4.338 -1.082 +-0.784 0.346 0.438 -1.364 -1.970 -4.816 -1.082 +0.561 1.408 1.141 -0.671 -2.118 -4.470 -1.082 +0.487 1.175 0.866 -1.035 -2.540 -5.212 -1.082 +1.538 1.358 1.419 -0.292 -2.488 -4.417 -1.082 +1.293 1.106 0.715 -0.960 -2.662 -4.683 -1.082 +1.158 1.635 0.694 -0.855 -2.381 -4.344 -1.082 +1.330 1.728 0.874 -0.547 -1.913 -3.749 -1.082 +0.926 1.925 0.410 -1.084 -1.946 -4.076 -1.082 +1.243 2.350 0.368 -0.912 -1.504 -3.370 -1.082 +1.863 2.856 0.534 -0.601 -1.023 -3.174 -1.082 +1.991 2.441 0.646 -0.329 0.072 -2.262 -1.082 +2.593 2.256 0.555 -0.383 -0.685 -2.107 -1.082 +2.386 2.064 0.127 -0.385 -0.674 -1.782 -1.082 +2.982 3.035 0.712 0.120 -0.713 -1.490 -1.082 +3.301 3.076 0.453 0.457 -0.555 -0.939 -1.082 +3.489 3.191 0.697 0.526 0.218 -1.314 -1.082 +2.379 2.046 0.028 -0.107 -1.634 -1.923 -1.082 +2.860 2.839 0.394 0.219 -1.659 -1.765 -1.082 +2.462 2.425 0.206 0.278 -1.983 -1.252 -1.082 +3.149 2.918 0.920 0.088 -1.512 -2.298 -1.082 +1.994 2.194 0.264 -0.606 -1.895 -2.726 -1.082 +2.402 2.479 0.801 -0.369 -1.388 -2.619 -1.082 +0.104 0.060 -1.286 -2.628 -3.779 -4.994 -1.082 +1.348 2.085 0.190 -0.832 -1.842 -3.847 -1.082 +0.899 0.895 0.292 -1.855 -1.893 -4.884 -1.082 +1.315 1.777 -0.167 -1.407 -3.228 -4.404 -1.082 +1.362 1.814 0.358 -0.253 -2.542 -4.143 -1.082 +1.236 2.534 -0.525 -1.284 -3.158 -4.804 -1.082 +0.089 1.451 -0.159 -1.929 -3.539 -5.335 -1.082 +-0.616 1.394 -0.172 -1.926 -3.890 -5.062 -1.082 +-0.642 0.969 -0.338 -1.302 -2.956 -3.993 -1.082 +-0.346 0.623 -0.717 -1.384 -2.792 -3.781 -1.082 +-1.079 0.319 -0.649 -1.312 -1.987 -3.265 -1.082 +-1.872 0.605 -1.531 -1.196 -2.591 -3.218 -1.082 +-2.107 0.985 -2.140 -0.765 -1.552 -1.956 -1.082 +-2.101 0.650 -1.891 -0.371 -1.157 -1.697 -1.082 +-2.367 -0.419 -1.191 -0.366 -1.261 -0.553 -1.082 +-1.808 -0.048 -0.358 -0.162 -0.533 0.093 -1.082 +-2.749 -0.467 -1.002 -0.041 -0.271 0.223 -1.082 +-2.397 -0.196 -0.190 0.563 0.568 1.292 -1.082 +-2.622 -0.735 -0.555 0.429 1.046 2.273 -1.082 +-1.537 -0.132 0.169 1.381 1.653 2.877 -1.082 +-2.326 0.217 0.112 1.733 2.433 4.882 -1.082 +-1.715 -0.187 -0.055 2.139 3.253 5.786 -1.082 +-2.227 -0.452 -0.016 2.493 3.685 6.824 -1.082 +-3.177 -1.225 -0.326 1.898 3.268 6.818 -1.082 +-3.451 -1.129 -0.229 2.501 3.627 7.253 -1.082 +-3.698 -1.598 0.083 3.312 5.098 7.135 -1.082 +-3.579 -1.309 -0.088 3.129 5.237 7.728 -1.082 +-4.192 -1.264 -0.075 3.170 5.555 8.893 -1.082 +-5.403 -1.829 0.275 3.035 6.118 9.039 -1.082 +-4.286 -0.796 0.410 3.925 6.859 9.316 -1.082 +-4.004 -1.216 0.038 3.450 7.123 8.662 -1.082 +-4.665 -0.698 -0.359 2.336 4.614 7.733 -1.082 +-3.532 -0.388 0.707 2.612 5.288 7.383 -1.082 +-2.011 0.879 1.362 2.647 5.841 7.104 -1.082 +-2.139 0.657 0.576 1.753 2.927 5.422 -1.082 +-1.070 1.332 1.167 2.221 2.954 4.444 -1.082 +-0.932 -0.580 -0.107 0.504 1.466 3.585 -1.082 +0.963 1.293 1.220 1.124 2.229 3.413 -1.082 +0.631 0.437 0.472 0.147 1.314 1.802 -1.082 +0.758 0.164 -0.040 -0.176 0.557 0.020 -1.082 +1.078 -0.159 0.242 -0.477 0.517 -0.011 -1.082 +-0.374 -0.030 -0.742 -0.116 -0.323 -0.164 9.410 +-0.934 -0.491 -0.305 0.323 0.152 0.641 9.410 +-1.192 -0.513 0.324 0.295 0.465 0.284 9.410 +-0.799 -0.539 0.135 0.330 0.684 0.846 9.410 +-0.418 -0.326 -0.062 0.155 0.205 0.152 9.410 +-1.161 -0.923 -0.369 -0.259 0.173 -0.118 9.410 +-1.444 -1.099 -0.755 -0.450 0.225 0.085 9.410 +-0.784 -0.856 -0.104 -0.160 0.800 -0.341 9.410 +-2.836 -1.356 -0.563 1.833 3.066 5.231 6.741 +-0.290 -0.163 0.272 -0.667 -1.325 -2.682 6.741 +0.018 0.161 -0.085 -1.013 -2.335 -3.111 6.741 +-2.885 -1.460 -0.143 1.826 3.528 4.531 6.741 diff --git a/Noto/Configuration/CDB/alma/AS/act_rev02.txt b/Noto/Configuration/CDB/alma/AS/act_rev02.txt new file mode 100644 index 000000000..3df016039 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/act_rev02.txt @@ -0,0 +1,1116 @@ +1.971 0.294 0.212 -1.003 -2.088 -3.085 -13.865 +2.121 0.179 -0.060 -0.795 -2.200 -2.735 -13.865 +1.619 -0.289 -0.211 -1.140 -2.451 -2.821 -13.865 +2.685 0.686 1.160 0.087 -0.785 -1.066 -13.865 +2.308 0.421 0.447 -0.184 -0.877 -1.203 -13.865 +2.283 0.301 0.100 -0.180 -0.605 -0.464 -13.865 +1.107 -0.640 -0.336 -0.057 -0.361 -0.298 -13.865 +0.605 -0.902 -0.179 -0.120 -0.363 0.045 -13.865 +1.075 -0.504 0.406 0.258 0.320 0.932 -13.865 +1.134 -0.251 0.523 0.554 0.565 0.817 -13.865 +0.460 -0.863 0.659 -0.006 0.191 0.924 -13.865 +0.658 -1.088 0.131 -0.211 0.275 1.156 -13.865 +0.570 -0.784 -0.276 -0.188 0.616 1.219 -13.865 +1.211 -0.428 0.035 0.183 0.922 1.246 -13.865 +0.991 -0.381 0.037 0.096 0.511 0.803 -13.865 +1.413 0.130 0.574 0.233 0.600 0.599 -13.865 +0.982 0.071 0.224 -0.383 -0.217 -0.310 -13.865 +1.218 1.205 0.267 0.023 -0.358 -0.574 -13.865 +1.042 0.226 -0.182 -0.604 -1.108 -1.353 -13.865 +1.368 0.213 0.034 -0.694 -1.079 -1.966 -13.865 +1.551 0.426 0.001 -1.014 -1.463 -2.233 -13.865 +1.933 0.697 0.044 -0.804 -1.601 -2.171 -13.865 +1.009 -0.107 -0.629 -1.721 -2.853 -3.642 -13.865 +1.820 0.467 -0.312 -1.488 -2.235 -3.113 -13.865 +1.894 0.261 -0.208 -1.674 -3.082 -4.320 -5.247 +2.426 0.857 0.405 -1.009 -2.520 -3.488 -5.247 +2.171 0.265 -0.042 -1.334 -2.703 -3.640 -5.247 +2.200 0.506 -0.011 -1.088 -2.045 -2.862 -5.247 +1.792 0.170 -0.145 -1.009 -1.852 -2.382 -5.247 +1.623 -0.044 -0.351 -0.796 -1.362 -1.610 -5.247 +0.924 -0.342 -0.357 -0.407 -0.534 -0.686 -5.247 +0.423 -0.666 -0.251 -0.059 -0.022 0.178 -5.247 +0.617 -0.644 0.075 0.344 0.509 1.113 -5.247 +0.346 -0.985 0.270 0.232 0.724 1.466 -5.247 +0.663 -0.893 0.299 0.197 0.964 1.978 -5.247 +0.601 -0.954 -0.091 0.205 0.794 2.108 -5.247 +0.568 -0.702 -0.031 0.413 1.176 2.143 -5.247 +0.705 -0.578 0.071 0.071 0.935 2.028 -5.247 +0.524 -0.576 -0.110 -0.019 0.769 1.477 -5.247 +0.608 -0.601 -0.069 -0.188 0.451 0.788 -5.247 +0.946 -0.040 0.215 -0.253 0.277 0.428 -5.247 +0.832 -0.268 -0.266 -0.591 -0.548 -0.694 -5.247 +1.179 0.002 -0.324 -0.633 -1.127 -1.544 -5.247 +1.596 0.386 -0.121 -0.995 -1.335 -2.078 -5.247 +1.626 0.458 0.146 -1.150 -1.682 -2.839 -5.247 +1.937 0.686 0.090 -1.259 -2.181 -3.496 -5.247 +1.959 0.327 -0.207 -1.627 -2.898 -4.090 -5.247 +2.439 0.838 0.237 -1.300 -2.579 -3.834 -5.247 +2.793 1.559 0.459 -1.270 -2.885 -4.406 0.619 +2.823 1.463 0.447 -1.308 -2.881 -4.496 0.619 +2.914 1.487 0.740 -1.222 -2.716 -4.277 0.619 +3.030 1.535 0.578 -1.302 -2.929 -4.366 0.619 +2.793 1.276 0.510 -1.168 -2.653 -3.734 0.619 +2.814 1.359 0.441 -1.071 -2.450 -3.589 0.619 +2.717 1.217 0.506 -0.744 -1.887 -2.920 0.619 +2.213 0.700 0.058 -1.113 -2.193 -3.281 0.619 +2.452 0.904 0.323 -0.801 -1.690 -2.599 0.619 +2.293 0.572 0.000 -1.002 -2.103 -3.062 0.619 +2.007 0.205 -0.153 -0.794 -1.426 -2.349 0.619 +1.934 0.324 0.025 -0.537 -1.183 -1.557 0.619 +1.639 0.377 0.252 -0.232 -0.748 -0.743 0.619 +1.143 0.029 0.134 -0.048 -0.261 -0.368 0.619 +1.206 0.008 0.447 0.319 0.262 0.397 0.619 +0.505 -0.537 0.034 0.268 0.279 0.592 0.619 +1.132 -0.028 0.633 0.727 1.011 1.347 0.619 +0.773 -0.454 0.424 0.562 0.941 1.525 0.619 +0.503 -0.721 0.283 0.398 0.913 1.529 0.619 +0.049 -1.042 0.141 0.368 0.929 1.845 0.619 +0.340 -0.740 0.355 0.463 1.121 2.212 0.619 +0.339 -0.905 0.083 0.410 1.371 2.760 0.619 +0.811 -0.720 0.379 0.710 1.529 2.973 0.619 +0.413 -0.857 0.129 0.512 1.264 2.884 0.619 +0.414 -0.739 0.024 0.510 1.156 2.765 0.619 +0.310 -0.856 -0.155 0.339 1.068 2.692 0.619 +0.590 -0.654 0.264 0.546 1.249 2.777 0.619 +0.776 -0.452 0.133 0.642 1.633 3.011 0.619 +0.514 -0.385 0.198 0.424 1.388 2.316 0.619 +0.241 -0.820 -0.333 0.004 0.932 1.746 0.619 +1.072 -0.095 0.600 0.490 1.401 1.878 0.619 +0.384 -0.680 0.211 -0.144 0.643 1.130 0.619 +0.267 -0.523 -0.022 -0.012 0.492 0.810 0.619 +0.695 -0.309 0.188 -0.011 0.796 0.856 0.619 +1.217 0.385 0.600 0.497 0.894 0.758 0.619 +0.980 0.053 0.104 0.048 0.095 -0.194 0.619 +1.029 -0.239 -0.303 -0.523 -0.696 -1.052 0.619 +1.244 -0.157 -0.319 -0.901 -1.184 -1.869 0.619 +1.659 0.181 -0.124 -0.806 -1.017 -2.090 0.619 +2.314 0.597 0.117 -0.893 -1.461 -2.829 0.619 +2.433 0.823 0.503 -0.458 -1.112 -2.516 0.619 +1.899 0.587 0.160 -1.101 -1.961 -3.203 0.619 +2.287 1.306 0.633 -0.618 -1.600 -2.802 0.619 +2.294 1.039 0.436 -0.968 -2.161 -3.585 0.619 +2.860 1.367 0.694 -0.863 -2.003 -3.452 0.619 +2.496 0.741 -0.346 -1.955 -3.492 -5.104 0.619 +2.155 0.646 -0.162 -2.000 -3.360 -4.947 0.619 +2.363 0.796 -0.122 -1.819 -3.479 -4.944 0.619 +3.000 1.315 0.080 -1.845 -3.671 -5.487 5.121 +2.628 1.264 0.127 -1.829 -3.785 -5.403 5.121 +2.829 1.442 0.409 -1.723 -3.626 -5.412 5.121 +3.079 1.627 0.399 -1.533 -3.256 -5.070 5.121 +2.735 1.224 0.138 -1.707 -3.448 -4.947 5.121 +2.585 1.284 0.153 -1.501 -3.167 -4.529 5.121 +2.574 1.088 0.241 -1.229 -2.776 -4.010 5.121 +2.580 1.106 0.425 -0.920 -2.355 -3.643 5.121 +1.922 0.527 -0.059 -1.209 -2.564 -3.871 5.121 +2.017 0.458 -0.182 -1.171 -2.398 -3.546 5.121 +2.352 0.876 0.380 -0.503 -1.230 -2.254 5.121 +1.950 0.722 0.209 -0.452 -1.073 -1.614 5.121 +1.220 0.330 0.103 -0.486 -0.680 -0.885 5.121 +0.471 -0.407 -0.285 -0.623 -0.599 -0.446 5.121 +0.511 -0.492 -0.130 -0.337 -0.136 0.190 5.121 +0.307 -0.752 0.217 0.012 0.365 0.826 5.121 +0.406 -0.590 0.283 0.358 0.804 1.445 5.121 +0.220 -0.699 0.242 0.488 1.004 1.767 5.121 +0.387 -0.540 0.361 0.683 1.125 2.210 5.121 +0.055 -0.807 0.235 0.609 1.276 2.463 5.121 +0.169 -0.957 0.255 0.653 1.396 2.721 5.121 +0.278 -1.114 -0.003 0.456 1.502 2.964 5.121 +0.407 -0.968 -0.007 0.584 1.684 3.203 5.121 +0.393 -0.851 0.116 0.821 1.757 3.412 5.121 +0.393 -0.696 -0.024 0.678 1.562 3.334 5.121 +0.417 -0.630 0.074 0.642 1.618 3.447 5.121 +0.395 -0.602 0.085 0.704 1.564 3.378 5.121 +0.415 -0.713 -0.125 0.458 1.602 3.323 5.121 +0.292 -0.668 -0.194 0.434 1.582 2.861 5.121 +0.294 -0.487 -0.198 0.347 1.451 2.530 5.121 +0.322 -0.337 0.081 0.481 1.367 2.256 5.121 +0.147 -0.715 -0.199 0.061 0.911 1.652 5.121 +0.272 -0.533 -0.059 0.098 0.828 1.390 5.121 +-0.004 -0.820 -0.325 -0.344 0.421 0.747 5.121 +0.099 -0.665 -0.420 -0.320 0.118 0.242 5.121 +0.627 -0.187 -0.178 -0.062 0.135 -0.050 5.121 +0.618 -0.400 -0.568 -0.589 -0.741 -1.112 5.121 +1.219 0.194 -0.228 -0.755 -1.080 -1.747 5.121 +1.561 0.158 -0.167 -0.769 -1.368 -2.495 5.121 +1.625 0.152 -0.305 -1.177 -2.029 -3.458 5.121 +2.094 0.575 0.059 -1.071 -2.018 -3.478 5.121 +2.041 0.704 0.019 -1.078 -2.087 -3.680 5.121 +2.334 1.079 0.208 -1.052 -2.344 -3.925 5.121 +2.569 1.199 0.313 -1.291 -2.579 -4.363 5.121 +2.994 1.307 0.468 -1.386 -2.780 -4.614 5.121 +2.816 0.922 0.000 -2.075 -3.615 -5.626 5.121 +2.879 1.282 0.095 -1.900 -3.778 -5.640 5.121 +2.870 1.011 -0.121 -1.948 -3.808 -5.833 5.121 +3.508 1.526 0.434 -1.337 -3.301 -5.129 7.938 +3.286 1.550 0.395 -1.246 -3.425 -5.330 7.938 +3.293 1.603 0.381 -1.602 -3.801 -5.711 7.938 +3.493 1.966 0.520 -1.402 -3.534 -5.340 7.938 +3.285 1.832 0.423 -1.456 -2.993 -4.653 7.938 +3.274 1.847 0.649 -1.007 -2.525 -3.944 7.938 +2.429 1.015 0.002 -1.159 -2.697 -3.854 7.938 +2.466 1.241 0.327 -0.636 -1.784 -3.059 7.938 +2.152 0.985 -0.071 -0.751 -1.865 -3.074 7.938 +1.834 0.445 -0.462 -1.228 -2.342 -3.328 7.938 +2.069 0.600 -0.124 -0.728 -1.645 -2.435 7.938 +1.353 0.173 -0.150 -0.734 -1.143 -1.741 7.938 +1.077 0.203 -0.010 -0.266 -0.415 -0.643 7.938 +0.514 -0.110 -0.167 -0.237 -0.185 0.055 7.938 +0.906 0.072 0.396 0.323 0.582 0.970 7.938 +0.329 -0.438 0.155 0.214 0.511 1.006 7.938 +0.359 -0.417 0.393 0.305 0.785 1.364 7.938 +0.153 -0.628 0.287 0.529 0.949 1.757 7.938 +0.046 -0.538 0.139 0.440 1.118 1.862 7.938 +-0.348 -0.887 -0.003 0.593 1.373 2.740 7.938 +0.014 -0.621 0.101 0.607 1.439 2.969 7.938 +0.260 -0.811 0.104 0.731 1.625 3.425 7.938 +0.326 -0.710 0.204 0.704 1.777 3.418 7.938 +0.329 -0.551 0.199 0.897 1.815 3.395 7.938 +0.362 -0.358 0.099 0.808 1.830 3.284 7.938 +0.225 -0.613 0.133 0.710 1.809 3.444 7.938 +0.349 -0.431 0.006 0.594 1.638 3.379 7.938 +0.510 -0.193 0.074 0.715 1.669 3.680 7.938 +0.315 -0.353 -0.312 0.457 1.515 3.008 7.938 +0.062 -0.385 -0.315 0.362 1.482 2.693 7.938 +0.044 -0.471 -0.358 0.243 1.044 1.745 7.938 +0.005 -0.736 -0.149 0.074 0.804 1.425 7.938 +0.272 -0.515 -0.333 0.007 0.677 1.101 7.938 +0.180 -0.535 -0.308 -0.218 0.667 0.957 7.938 +0.282 -0.307 -0.275 -0.194 0.399 0.599 7.938 +0.196 -0.582 -0.483 -0.361 0.050 -0.133 7.938 +0.701 -0.209 -0.318 -0.512 -0.636 -0.897 7.938 +0.823 -0.365 -0.418 -0.682 -1.143 -1.908 7.938 +1.639 0.246 0.008 -0.682 -1.415 -2.480 7.938 +1.741 0.399 0.021 -0.748 -1.974 -3.090 7.938 +1.823 0.547 0.075 -0.854 -2.111 -3.196 7.938 +1.772 0.667 0.084 -0.920 -2.070 -3.315 7.938 +1.988 0.800 0.099 -1.077 -2.157 -3.674 7.938 +2.613 1.291 0.418 -1.084 -2.558 -4.220 7.938 +3.132 1.531 0.397 -1.589 -3.051 -5.102 7.938 +3.378 1.279 0.217 -2.022 -3.624 -5.928 7.938 +3.511 1.401 0.450 -1.950 -3.662 -5.910 7.938 +3.220 1.348 0.249 -1.803 -3.531 -5.593 7.938 +3.220 1.552 0.515 -1.378 -3.600 -5.330 9.587 +3.255 1.597 0.454 -1.316 -3.574 -5.309 9.587 +3.387 1.715 0.530 -1.366 -3.260 -5.199 9.587 +3.113 1.820 0.589 -1.365 -3.069 -4.995 9.587 +3.032 1.678 0.586 -1.101 -2.607 -4.005 9.587 +2.141 1.123 0.031 -1.123 -2.491 -3.632 9.587 +2.425 1.294 0.468 -0.514 -1.737 -2.600 9.587 +1.821 0.862 -0.115 -0.843 -1.619 -2.659 9.587 +1.670 0.839 -0.087 -0.507 -1.336 -2.185 9.587 +1.258 0.486 -0.322 -0.662 -1.663 -2.421 9.587 +1.080 0.219 -0.284 -0.576 -1.143 -1.717 9.587 +0.811 0.020 -0.277 -0.419 -0.843 -1.216 9.587 +0.673 -0.069 -0.231 -0.240 -0.220 -0.546 9.587 +0.464 -0.092 -0.012 -0.012 0.215 0.176 9.587 +0.209 -0.269 -0.025 0.098 0.443 0.744 9.587 +-0.027 -0.329 0.075 0.341 0.679 1.073 9.587 +-0.049 -0.240 0.273 0.518 0.983 1.657 9.587 +-0.185 -0.163 0.400 0.557 0.988 1.782 9.587 +-0.491 -0.655 0.030 0.278 0.841 1.747 9.587 +-0.561 -0.323 0.118 0.644 1.249 2.360 9.587 +-0.257 -0.436 0.233 0.705 1.383 2.652 9.587 +-0.068 -0.514 0.325 0.911 1.687 3.175 9.587 +-0.047 -0.713 0.085 0.918 1.634 3.241 9.587 +-0.089 -0.444 -0.011 0.928 2.002 3.309 9.587 +-0.091 -0.471 -0.005 0.834 1.929 3.070 9.587 +-0.108 -0.371 0.105 0.690 1.976 3.141 9.587 +0.020 -0.402 0.108 0.734 1.885 3.316 9.587 +-0.217 -0.573 -0.182 0.495 1.501 3.089 9.587 +-0.164 -0.428 -0.042 0.609 1.579 2.699 9.587 +-0.072 -0.266 -0.155 0.556 1.510 2.378 9.587 +0.000 -0.355 -0.171 0.535 1.138 1.971 9.587 +-0.297 -0.867 -0.335 0.096 0.826 1.400 9.587 +-0.042 -0.825 -0.375 0.142 0.725 1.126 9.587 +-0.018 -0.845 -0.528 -0.114 0.599 0.647 9.587 +-0.071 -0.803 -0.306 -0.147 0.280 0.153 9.587 +0.260 -0.468 0.045 -0.131 -0.010 -0.007 9.587 +0.484 -0.356 -0.063 -0.113 -0.100 -0.465 9.587 +0.576 -0.338 -0.237 -0.411 -0.788 -1.248 9.587 +1.032 -0.023 0.262 -0.421 -0.940 -1.632 9.587 +0.781 -0.152 -0.276 -1.049 -1.807 -2.554 9.587 +1.043 -0.080 -0.229 -0.939 -1.888 -2.879 9.587 +1.312 0.188 -0.006 -0.867 -1.818 -2.704 9.587 +1.537 0.571 0.159 -0.850 -1.980 -3.057 9.587 +2.160 1.048 0.435 -0.836 -2.054 -3.650 9.587 +2.588 1.269 0.528 -1.208 -2.469 -4.560 9.587 +3.004 1.237 0.315 -1.826 -3.258 -5.481 9.587 +3.149 1.245 0.212 -1.838 -3.344 -5.546 9.587 +3.284 1.539 0.395 -1.580 -3.429 -5.454 9.587 +2.958 1.596 0.356 -1.201 -3.405 -5.062 10.270 +3.283 1.632 0.225 -1.447 -3.315 -5.031 10.270 +3.102 1.644 0.089 -1.419 -3.472 -5.105 10.270 +3.238 1.686 0.250 -1.438 -3.292 -5.074 10.270 +3.014 1.506 0.315 -1.660 -3.227 -5.099 10.270 +3.196 2.031 0.827 -1.309 -2.888 -4.927 10.270 +2.825 1.724 0.432 -1.246 -2.803 -4.563 10.270 +2.401 1.303 -0.037 -1.470 -3.060 -4.673 10.270 +2.170 1.266 0.213 -0.967 -2.271 -3.368 10.270 +1.823 0.993 -0.123 -1.062 -2.321 -3.204 10.270 +1.746 1.111 0.061 -0.734 -1.719 -2.483 10.270 +1.588 1.065 -0.008 -0.277 -1.232 -1.935 10.270 +1.145 0.648 -0.144 -0.478 -1.062 -1.669 10.270 +1.431 1.069 0.269 -0.226 -0.833 -1.220 10.270 +0.846 0.403 -0.136 -0.587 -1.379 -1.726 10.270 +1.114 0.466 -0.059 -0.428 -1.333 -1.706 10.270 +0.589 0.260 -0.103 -0.587 -1.214 -1.802 10.270 +0.980 0.517 -0.113 -0.418 -1.045 -1.571 10.270 +0.689 0.181 -0.368 -0.486 -1.224 -1.517 10.270 +0.700 0.227 -0.171 -0.483 -1.076 -1.361 10.270 +0.444 0.048 -0.176 -0.361 -0.777 -1.166 10.270 +0.701 0.238 0.162 -0.048 -0.558 -0.740 10.270 +0.231 -0.046 -0.179 -0.118 -0.578 -0.626 10.270 +0.158 -0.120 -0.180 -0.002 -0.418 -0.412 10.270 +-0.076 -0.211 0.020 0.073 -0.093 -0.097 10.270 +0.307 0.223 0.406 0.459 0.425 0.563 10.270 +-0.220 -0.206 0.025 0.056 0.106 0.338 10.270 +-0.015 -0.128 0.086 0.117 0.153 0.577 10.270 +-0.225 -0.501 -0.004 0.137 0.236 0.473 10.270 +-0.145 -0.348 -0.013 0.437 0.455 0.833 10.270 +-0.265 -0.375 0.144 0.364 0.739 1.105 10.270 +-0.369 -0.340 0.161 0.326 0.755 1.115 10.270 +-0.561 -0.217 0.190 0.380 0.983 1.229 10.270 +-0.689 -0.424 0.216 0.229 0.757 1.130 10.270 +-0.790 -0.575 0.092 0.133 0.671 1.148 10.270 +-0.776 -0.538 0.102 0.182 0.609 1.181 10.270 +-0.402 -0.166 0.517 0.510 0.864 1.585 10.270 +-0.547 -0.273 0.429 0.496 0.955 1.722 10.270 +-0.902 -0.499 0.179 0.449 1.045 1.829 10.270 +-0.628 -0.475 0.230 0.595 1.107 2.203 10.270 +-0.510 -0.472 0.328 0.756 1.273 2.333 10.270 +-0.294 -0.535 0.505 0.796 1.480 2.626 10.270 +-0.348 -0.641 0.466 0.769 1.534 2.856 10.270 +-0.178 -0.616 0.392 0.690 1.685 3.120 10.270 +-0.172 -0.403 0.312 0.825 2.080 3.230 10.270 +-0.319 -0.403 0.336 0.969 2.163 3.207 10.270 +-0.202 -0.342 0.227 0.867 2.097 3.224 10.270 +-0.318 -0.439 0.024 0.640 1.902 2.976 10.270 +-0.328 -0.404 -0.058 0.736 1.927 3.009 10.270 +-0.222 -0.385 0.010 0.551 2.012 2.891 10.270 +-0.353 -0.441 -0.258 0.379 1.745 2.665 10.270 +-0.495 -0.449 -0.292 0.436 1.607 2.700 10.270 +-0.368 -0.655 -0.297 0.486 1.665 2.675 10.270 +-0.122 -0.544 -0.240 0.546 1.539 2.691 10.270 +-0.030 -0.385 -0.111 0.571 1.500 2.620 10.270 +-0.290 -0.644 -0.214 0.228 1.222 2.322 10.270 +-0.163 -0.333 -0.054 0.408 1.334 2.143 10.270 +-0.334 -0.500 -0.198 0.260 1.065 1.867 10.270 +-0.296 -0.370 -0.132 0.320 1.053 1.762 10.270 +0.055 -0.209 0.141 0.459 1.125 1.725 10.270 +-0.112 -0.534 0.015 0.397 0.922 1.310 10.270 +-0.595 -1.161 -0.566 -0.195 0.295 0.838 10.270 +-0.201 -0.802 -0.045 0.275 0.723 1.204 10.270 +-0.221 -0.985 -0.262 0.249 0.665 0.985 10.270 +-0.375 -1.086 -0.483 0.040 0.608 0.830 10.270 +-0.146 -0.732 -0.155 0.067 0.830 0.718 10.270 +-0.341 -1.119 -0.256 -0.111 0.464 0.341 10.270 +-0.163 -1.110 -0.124 -0.004 0.369 0.196 10.270 +-0.321 -1.107 -0.312 -0.224 0.167 -0.027 10.270 +0.261 -0.419 0.156 0.273 0.660 0.457 10.270 +-0.189 -0.659 -0.262 -0.188 0.141 0.023 10.270 +0.112 -0.331 0.112 -0.022 0.441 0.140 10.270 +-0.368 -0.542 -0.427 -0.581 -0.218 -0.505 10.270 +-0.205 -0.492 -0.307 -0.507 -0.418 -0.637 10.270 +0.225 -0.234 -0.066 -0.300 -0.369 -0.761 10.270 +0.515 -0.211 0.013 -0.342 -0.546 -0.915 10.270 +0.407 -0.260 0.003 -0.463 -0.638 -1.248 10.270 +0.894 0.109 0.290 -0.346 -0.471 -1.232 10.270 +0.609 -0.173 -0.127 -0.606 -0.911 -1.806 10.270 +0.682 -0.310 -0.298 -0.757 -1.101 -2.035 10.270 +0.834 0.151 -0.094 -0.344 -0.857 -1.754 10.270 +0.457 -0.053 -0.501 -0.724 -1.438 -2.172 10.270 +0.547 -0.220 -0.249 -0.716 -1.245 -1.991 10.270 +0.820 -0.182 -0.245 -0.621 -1.472 -2.086 10.270 +0.859 0.090 -0.127 -0.405 -1.418 -2.069 10.270 +0.952 0.008 -0.171 -0.852 -1.737 -2.503 10.270 +1.659 0.605 0.525 -0.617 -1.423 -2.683 10.270 +1.953 0.838 0.760 -0.807 -1.507 -3.173 10.270 +1.937 0.733 0.696 -1.105 -1.827 -3.706 10.270 +2.221 0.609 0.381 -1.716 -2.622 -4.776 10.270 +2.471 0.962 0.413 -1.453 -2.704 -4.747 10.270 +2.804 1.142 0.627 -1.500 -3.025 -5.097 10.270 +2.654 1.186 0.609 -1.487 -3.091 -5.070 10.270 +2.830 1.339 0.546 -1.457 -3.261 -5.362 10.270 +2.976 1.451 0.527 -1.304 -3.287 -5.149 10.270 +2.943 1.762 0.442 -1.101 -3.331 -5.091 10.270 +2.914 1.668 0.588 -0.924 -3.098 -4.688 10.174 +2.657 1.530 0.362 -1.092 -3.065 -4.803 10.174 +2.765 1.592 0.319 -1.155 -3.176 -4.797 10.174 +2.519 1.305 0.099 -1.553 -3.145 -5.075 10.174 +3.073 1.647 0.265 -1.226 -2.885 -4.541 10.174 +2.156 1.332 -0.128 -1.536 -3.025 -4.640 10.174 +2.326 1.565 0.175 -0.935 -2.327 -3.880 10.174 +1.885 1.431 0.061 -0.765 -1.827 -3.516 10.174 +1.447 1.031 -0.080 -0.857 -1.532 -2.960 10.174 +0.975 0.575 -0.372 -0.745 -1.393 -2.396 10.174 +1.076 0.827 0.015 -0.311 -0.791 -1.522 10.174 +0.619 0.457 -0.160 -0.216 -0.612 -1.011 10.174 +0.126 0.222 -0.255 -0.147 -0.472 -0.417 10.174 +0.456 0.444 0.175 0.299 -0.145 -0.036 10.174 +-0.172 -0.081 -0.168 -0.156 -0.541 -0.415 10.174 +0.108 0.140 -0.167 -0.060 -0.542 -0.388 10.174 +0.085 0.343 -0.050 -0.004 -0.400 -0.188 10.174 +0.066 0.289 -0.082 -0.054 -0.463 -0.457 10.174 +-0.259 -0.017 -0.217 -0.275 -0.591 -0.823 10.174 +-0.055 -0.075 -0.181 -0.128 -0.497 -0.581 10.174 +-0.149 -0.140 -0.285 -0.174 -0.372 -0.474 10.174 +-0.419 -0.100 -0.212 0.004 -0.344 -0.247 10.174 +-0.608 -0.142 -0.068 0.106 -0.381 -0.291 10.174 +-0.813 -0.165 0.062 0.112 -0.177 0.018 10.174 +-0.792 -0.403 0.091 0.113 -0.046 0.255 10.174 +-0.861 -0.419 0.050 0.050 -0.050 0.311 10.174 +-0.821 -0.597 -0.056 -0.028 0.057 0.367 10.174 +-0.595 -0.504 0.176 0.187 0.027 0.551 10.174 +-0.680 -0.683 -0.114 0.102 -0.027 0.459 10.174 +-0.613 -0.497 0.094 0.330 0.378 0.853 10.174 +-0.567 -0.487 0.233 0.443 0.774 0.932 10.174 +-0.743 -0.508 0.233 0.500 0.786 0.947 10.174 +-1.001 -0.390 0.292 0.410 0.820 0.852 10.174 +-1.173 -0.533 0.314 0.352 0.847 0.970 10.174 +-1.075 -0.595 0.243 0.255 0.762 0.834 10.174 +-0.934 -0.427 0.345 0.421 0.864 1.031 10.174 +-0.681 -0.148 0.575 0.520 0.877 1.139 10.174 +-0.509 0.015 0.657 0.811 1.239 1.655 10.174 +-0.953 -0.492 0.233 0.563 0.923 1.530 10.174 +-0.754 -0.415 0.470 0.725 1.012 1.837 10.174 +-0.757 -0.620 0.338 0.579 1.220 1.940 10.174 +-0.668 -0.667 0.352 0.740 1.365 2.350 10.174 +-0.380 -0.617 0.370 0.662 1.448 2.536 10.174 +-0.423 -0.658 0.298 0.673 1.698 2.782 10.174 +-0.309 -0.359 0.313 0.739 2.141 2.912 10.174 +0.069 0.114 0.585 1.208 2.671 3.505 10.174 +-0.332 -0.339 0.184 0.748 2.203 2.962 10.174 +-0.319 -0.179 0.240 0.848 2.181 3.115 10.174 +-0.214 -0.059 0.329 0.875 2.253 3.111 10.174 +-0.153 0.125 0.189 0.950 2.346 3.068 10.174 +0.016 0.113 0.106 0.955 2.218 2.842 10.174 +-0.132 0.045 0.133 0.862 2.156 2.770 10.174 +0.055 0.137 0.020 0.809 1.932 2.664 10.174 +-0.189 -0.149 -0.176 0.567 1.557 2.481 10.174 +0.027 0.029 -0.007 0.698 1.553 2.471 10.174 +-0.112 -0.095 -0.037 0.617 1.451 2.111 10.174 +-0.135 -0.056 -0.082 0.566 1.094 1.707 10.174 +-0.278 -0.411 -0.158 0.366 0.855 1.227 10.174 +-0.337 -0.457 0.083 0.188 0.793 1.210 10.174 +-0.225 -0.328 0.016 0.107 0.714 1.132 10.174 +-0.256 -0.544 -0.086 -0.011 0.453 0.736 10.174 +-0.401 -0.586 0.069 0.215 1.013 1.030 10.174 +-0.691 -0.927 -0.225 0.055 0.644 0.744 10.174 +-0.844 -0.916 -0.188 0.286 0.784 1.024 10.174 +-0.581 -0.668 -0.152 0.135 0.970 0.763 10.174 +-0.943 -1.121 -0.263 -0.089 0.701 0.513 10.174 +-0.630 -1.075 0.098 0.116 0.732 0.638 10.174 +-0.547 -1.163 -0.198 -0.041 0.778 0.531 10.174 +-0.488 -0.970 -0.146 0.043 0.400 0.242 10.174 +-0.328 -0.649 -0.045 0.146 0.579 0.308 10.174 +-0.486 -0.532 -0.154 -0.085 0.436 0.135 10.174 +-0.931 -0.853 -0.501 -0.581 0.025 -0.192 10.174 +-0.730 -0.434 -0.121 -0.198 0.258 -0.080 10.174 +-0.446 -0.189 0.121 -0.003 0.306 -0.029 10.174 +-0.730 -0.385 -0.084 -0.245 -0.164 -0.495 10.174 +-0.599 -0.521 -0.447 -0.404 -0.488 -0.694 10.174 +-0.434 -0.622 -0.347 -0.540 -0.594 -0.780 10.174 +-0.060 -0.298 -0.056 -0.388 -0.504 -0.739 10.174 +0.454 0.058 0.159 -0.051 -0.098 -0.494 10.174 +0.361 -0.058 0.042 -0.106 -0.293 -0.732 10.174 +0.024 -0.193 -0.181 -0.222 -0.336 -0.795 10.174 +0.233 0.182 0.058 -0.101 -0.315 -0.890 10.174 +0.291 0.200 0.067 0.117 0.016 -0.337 10.174 +-0.027 -0.392 -0.355 -0.254 -0.502 -0.899 10.174 +0.503 -0.013 0.123 0.227 0.020 -0.491 10.174 +0.290 -0.105 -0.034 -0.194 -0.461 -1.189 10.174 +0.477 -0.182 0.151 -0.314 -0.528 -1.689 10.174 +0.655 0.206 0.201 -0.971 -0.839 -2.225 10.174 +1.001 0.306 0.304 -1.172 -1.389 -3.036 10.174 +1.461 0.719 0.459 -1.107 -1.879 -3.692 10.174 +1.749 0.751 0.301 -1.246 -2.344 -3.988 10.174 +1.923 1.001 0.394 -1.409 -2.630 -4.314 10.174 +2.120 1.230 0.315 -1.258 -3.039 -4.603 10.174 +2.381 1.487 0.553 -1.041 -2.813 -4.655 10.174 +2.377 1.517 0.405 -1.099 -3.192 -4.782 10.174 +2.772 1.580 0.713 -0.766 -3.021 -4.774 10.174 +2.394 1.222 0.521 -0.806 -3.204 -4.414 9.410 +2.565 1.670 0.663 -0.865 -2.884 -4.350 9.410 +2.331 1.450 0.237 -1.128 -2.972 -4.419 9.410 +2.243 1.333 -0.143 -1.562 -3.094 -4.666 9.410 +2.241 1.766 0.361 -1.184 -2.358 -3.850 9.410 +2.449 1.722 0.581 -1.292 -2.293 -3.762 9.410 +2.002 1.397 0.250 -1.041 -1.804 -3.068 9.410 +1.579 1.174 -0.059 -0.898 -1.842 -2.850 9.410 +1.070 0.935 0.036 -0.260 -1.036 -1.704 9.410 +0.767 0.616 -0.167 0.109 -0.097 -1.035 9.410 +0.312 0.222 -0.183 -0.190 -0.353 -0.447 9.410 +-0.346 0.014 -0.485 -0.020 0.010 0.117 9.410 +-0.696 -0.284 -0.527 0.018 0.514 0.852 9.410 +-0.600 -0.231 -0.647 -0.127 0.060 0.279 9.410 +-0.952 -0.616 -0.668 -0.229 -0.224 0.154 9.410 +-0.605 -0.495 -0.399 -0.023 -0.216 0.136 9.410 +-0.362 0.012 -0.084 0.382 0.251 0.888 9.410 +-0.646 -0.320 -0.581 0.062 -0.468 -0.088 9.410 +-0.775 -0.291 -0.526 0.108 -0.052 0.150 9.410 +-0.468 -0.238 -0.407 0.168 -0.025 -0.010 9.410 +-0.558 -0.274 -0.413 0.265 -0.087 0.207 9.410 +-0.547 -0.364 -0.164 0.143 -0.071 0.152 9.410 +-0.914 -0.432 -0.235 0.077 -0.082 0.206 9.410 +-0.972 -0.388 -0.031 0.168 -0.015 0.233 9.410 +-0.852 -0.117 0.272 0.323 0.236 0.680 9.410 +-1.014 -0.404 -0.017 -0.012 -0.108 0.312 9.410 +-0.934 -0.370 -0.032 0.094 -0.080 0.391 9.410 +-0.954 -0.555 -0.180 0.000 -0.036 0.343 9.410 +-0.677 -0.658 -0.058 0.155 -0.121 0.351 9.410 +-0.787 -0.716 -0.172 -0.005 -0.229 0.202 9.410 +-0.676 -0.657 0.119 0.154 0.313 0.400 9.410 +-1.056 -0.627 0.227 0.084 0.491 0.430 9.410 +-1.365 -0.715 0.055 -0.041 0.350 0.112 9.410 +-1.422 -0.739 0.168 0.189 0.480 0.407 9.410 +-1.320 -0.791 0.034 0.059 0.376 0.139 9.410 +-1.036 -0.641 0.189 0.140 0.361 0.181 9.410 +-0.641 -0.277 0.200 0.026 0.216 -0.189 9.410 +-0.636 -0.329 0.210 0.212 0.503 0.547 9.410 +-0.942 -0.707 0.142 0.263 0.750 0.799 9.410 +-0.760 -0.571 0.254 0.450 1.048 1.155 9.410 +-0.494 -0.433 0.244 0.695 0.808 1.507 9.410 +-0.609 -0.517 0.097 0.507 1.097 1.933 9.410 +-0.524 -0.584 0.216 0.530 1.150 1.835 9.410 +-0.293 -0.714 0.235 0.601 1.566 2.349 9.410 +-0.130 -0.643 0.103 0.507 1.679 2.455 9.410 +0.032 -0.433 0.015 0.489 1.741 2.524 9.410 +-0.013 -0.294 0.124 0.535 1.484 2.559 9.410 +0.034 -0.019 0.364 0.668 1.724 2.855 9.410 +-0.207 0.027 0.496 0.691 1.605 2.652 9.410 +-0.117 0.136 0.375 0.839 1.597 2.739 9.410 +0.331 0.324 0.402 0.905 1.727 2.631 9.410 +0.522 0.234 0.222 0.900 1.786 2.536 9.410 +0.409 0.232 0.054 0.845 1.568 2.246 9.410 +0.133 -0.156 -0.214 0.692 1.290 1.885 9.410 +0.356 0.113 0.014 0.779 1.389 1.847 9.410 +-0.209 -0.240 -0.289 0.299 0.928 1.345 9.410 +-0.390 -0.525 -0.350 0.008 0.302 0.562 9.410 +0.011 -0.019 -0.056 0.320 0.514 0.780 9.410 +-0.048 -0.323 0.183 0.216 0.551 0.607 9.410 +-0.407 -0.682 -0.339 -0.469 -0.241 -0.286 9.410 +-0.149 -0.268 0.073 -0.222 -0.207 -0.420 9.410 +-0.707 -0.623 0.031 -0.137 0.333 0.233 9.410 +-1.432 -1.220 -0.888 -0.429 0.021 0.004 9.410 +-1.273 -1.111 -0.432 -0.063 0.389 0.164 9.410 +-0.904 -0.796 -0.186 0.098 0.444 0.055 9.410 +-0.731 -0.976 -0.264 0.127 0.650 0.399 9.410 +-0.921 -1.067 -0.310 0.008 0.459 0.175 9.410 +-0.997 -1.248 -0.348 -0.261 0.203 -0.098 9.410 +-0.834 -0.965 -0.455 -0.102 0.182 -0.088 9.410 +-0.803 -0.672 -0.128 -0.068 0.296 0.041 9.410 +-1.107 -0.986 -0.537 -0.467 0.157 -0.231 9.410 +-1.075 -0.743 -0.405 -0.382 0.284 -0.178 9.410 +-0.904 -0.642 -0.301 -0.271 0.310 0.027 9.410 +-0.784 -0.321 0.070 0.113 0.539 0.287 9.410 +-0.799 -0.329 -0.051 0.109 0.274 0.264 9.410 +-0.958 -0.547 -0.242 -0.288 0.004 -0.139 9.410 +-0.727 -0.286 -0.107 -0.159 0.058 0.082 9.410 +-0.488 -0.179 -0.152 -0.354 -0.266 -0.212 9.410 +-0.488 -0.272 -0.167 -0.146 -0.252 -0.327 9.410 +-0.170 -0.165 -0.150 -0.031 0.010 -0.101 9.410 +-0.632 -0.525 -0.321 -0.176 0.297 0.137 9.410 +-0.532 -0.466 -0.280 -0.249 0.165 -0.053 9.410 +-0.547 -0.428 -0.352 -0.215 0.276 0.076 9.410 +-0.444 -0.523 -0.112 0.217 0.223 0.304 9.410 +-0.720 -0.988 -0.222 0.310 0.708 0.772 9.410 +-0.475 -0.669 -0.019 0.218 0.593 -0.157 9.410 +-0.304 -0.248 -0.011 0.051 0.609 -0.693 9.410 +0.130 0.034 0.065 -0.431 -0.367 -1.329 9.410 +0.817 0.291 0.311 -0.535 -0.710 -1.761 9.410 +1.138 0.477 0.308 -1.126 -1.424 -2.907 9.410 +1.140 0.581 0.114 -1.148 -1.986 -3.129 9.410 +1.616 0.934 0.234 -1.239 -2.399 -3.718 9.410 +2.003 1.248 0.331 -1.060 -2.378 -3.622 9.410 +2.344 1.334 0.364 -1.195 -2.642 -4.126 9.410 +2.589 1.584 0.603 -0.957 -2.714 -4.046 9.410 +2.804 1.560 0.870 -0.795 -2.834 -4.311 9.410 +2.529 1.453 0.661 -0.712 -2.764 -3.580 8.262 +1.939 1.301 0.361 -1.153 -3.049 -3.766 8.262 +1.758 1.367 0.016 -1.355 -2.817 -3.880 8.262 +1.628 1.162 0.251 -1.406 -2.748 -3.927 8.262 +2.027 1.645 0.079 -0.989 -2.152 -3.328 8.262 +1.525 1.322 -0.089 -1.269 -2.024 -3.166 8.262 +0.995 0.781 -0.106 -0.995 -1.664 -2.783 8.262 +1.059 1.020 0.358 -0.481 -0.964 -1.541 8.262 +0.435 0.590 -0.006 -0.195 -0.283 -0.835 8.262 +-0.642 -0.138 -0.527 -0.113 -0.017 -0.010 8.262 +-0.909 -0.273 -0.416 0.378 0.727 0.958 8.262 +-1.177 -0.723 -0.699 0.622 1.374 1.847 8.262 +-1.311 -0.547 -0.439 1.002 1.810 2.765 8.262 +-1.506 -0.428 -0.800 0.671 1.554 2.153 8.262 +-1.404 -0.684 -0.735 0.608 0.901 1.631 8.262 +-1.096 -0.596 -0.474 0.753 0.977 1.445 8.262 +-1.526 -0.921 -0.694 0.466 0.350 1.244 8.262 +-1.553 -1.000 -0.911 0.155 -0.073 0.701 8.262 +-1.231 -0.710 -0.690 0.385 0.493 0.909 8.262 +-1.375 -0.891 -0.773 0.236 -0.034 0.645 8.262 +-1.037 -0.677 -0.591 0.477 0.238 0.846 8.262 +-1.037 -0.779 -0.555 0.111 0.018 0.680 8.262 +-1.080 -0.656 -0.311 -0.003 0.221 0.458 8.262 +-1.197 -0.450 -0.348 -0.045 0.190 0.576 8.262 +-1.197 -0.590 -0.267 -0.011 -0.134 0.377 8.262 +-1.474 -0.752 -0.518 -0.216 -0.400 -0.125 8.262 +-1.330 -0.676 -0.597 -0.241 -0.445 -0.038 8.262 +-1.163 -0.559 -0.424 -0.106 -0.169 0.072 8.262 +-1.050 -0.776 -0.426 -0.035 -0.256 -0.106 8.262 +-1.008 -0.607 -0.090 0.138 -0.039 0.122 8.262 +-1.102 -0.924 -0.297 -0.028 0.022 -0.111 8.262 +-1.315 -0.608 -0.036 0.100 0.260 0.174 8.262 +-1.358 -0.459 0.109 -0.093 0.086 -0.169 8.262 +-1.631 -0.643 0.014 -0.114 0.172 -0.215 8.262 +-0.864 -0.489 0.269 0.145 0.060 -0.271 8.262 +-0.819 -0.254 0.388 0.154 -0.014 -0.474 8.262 +-0.351 -0.224 0.105 -0.311 -0.342 -0.867 8.262 +-0.418 -0.406 0.222 -0.113 -0.011 -0.303 8.262 +-0.488 -0.425 0.112 0.196 0.154 0.171 8.262 +-0.821 -0.859 -0.365 -0.214 -0.114 0.022 8.262 +-0.467 -0.404 0.074 0.339 0.259 0.751 8.262 +-0.489 -0.545 0.026 0.556 0.552 1.324 8.262 +-0.189 -0.286 0.326 0.704 0.904 1.717 8.262 +-0.210 -0.442 0.214 0.477 1.119 1.843 8.262 +0.012 -0.202 0.087 0.508 1.286 2.009 8.262 +0.074 0.068 0.159 0.573 1.340 2.173 8.262 +0.139 0.063 0.250 0.308 1.284 1.978 8.262 +0.108 0.249 0.419 0.643 1.655 2.348 8.262 +0.184 0.299 0.452 0.554 1.460 2.254 8.262 +-0.224 0.122 0.135 0.426 1.181 2.054 8.262 +0.080 0.126 -0.162 0.580 0.982 1.853 8.262 +0.556 0.366 0.114 0.949 1.376 2.085 8.262 +0.654 0.184 -0.248 0.491 0.904 1.745 8.262 +0.373 -0.039 -0.187 0.523 1.002 1.607 8.262 +0.321 -0.083 -0.145 0.433 0.735 1.232 8.262 +0.389 0.177 0.108 0.592 0.752 1.299 8.262 +0.439 0.086 0.215 0.386 0.200 0.652 8.262 +0.367 0.124 0.152 0.270 -0.190 0.103 8.262 +0.245 0.474 0.112 0.292 0.052 -0.156 8.262 +-0.038 0.136 0.044 -0.120 0.114 -0.941 8.262 +-0.040 0.072 0.241 -0.337 -0.717 -1.370 8.262 +-0.723 -0.387 -0.100 -0.321 -0.162 -0.786 8.262 +-0.769 -0.511 -0.025 -0.044 0.024 -0.405 8.262 +-1.202 -0.770 -0.315 0.184 0.269 -0.219 8.262 +-1.029 -0.629 -0.254 0.169 0.183 -0.164 8.262 +-1.273 -0.773 -0.311 0.033 0.082 -0.036 8.262 +-1.119 -0.827 -0.235 0.147 -0.318 -0.154 8.262 +-1.250 -0.731 0.068 0.019 0.260 0.090 8.262 +-1.097 -0.641 -0.330 0.213 0.147 -0.042 8.262 +-1.241 -0.914 -0.587 -0.240 0.022 -0.174 8.262 +-1.177 -0.835 -0.468 -0.030 0.257 -0.045 8.262 +-1.402 -0.889 -0.563 -0.030 0.243 0.097 8.262 +-1.393 -0.910 -0.495 -0.071 0.167 0.114 8.262 +-1.395 -0.759 -0.234 0.110 0.326 0.387 8.262 +-1.147 -0.538 -0.110 0.111 0.341 0.596 8.262 +-1.372 -0.611 -0.210 -0.092 0.221 0.734 8.262 +-1.386 -0.644 -0.184 -0.086 0.280 0.768 8.262 +-1.134 -0.474 -0.007 -0.064 0.259 0.889 8.262 +-0.957 -0.267 -0.045 0.032 0.456 0.966 8.262 +-0.918 -0.568 -0.377 -0.243 0.469 0.749 8.262 +-1.076 -0.390 -0.137 0.172 1.072 1.198 8.262 +-1.374 -0.737 -0.308 0.064 1.008 1.050 8.262 +-1.542 -0.811 -0.212 0.438 1.237 1.693 8.262 +-1.805 -1.129 -0.385 0.570 1.026 1.874 8.262 +-1.687 -1.048 0.085 0.994 1.887 2.100 8.262 +-1.482 -1.030 0.102 0.817 1.877 1.478 8.262 +-1.162 -0.866 -0.031 0.341 1.154 0.730 8.262 +-0.770 -0.747 0.086 0.032 0.296 0.594 8.262 +0.074 0.309 0.301 -0.113 -0.275 -0.828 8.262 +0.639 0.474 0.391 -0.303 -0.513 -1.425 8.262 +1.151 0.475 0.347 -0.636 -0.795 -1.856 8.262 +1.030 0.547 0.123 -0.943 -1.510 -2.614 8.262 +1.453 0.796 0.228 -1.028 -1.957 -2.813 8.262 +2.208 1.264 0.585 -0.988 -2.441 -3.135 8.262 +2.147 1.334 0.602 -0.903 -2.704 -3.326 8.262 +2.178 1.344 0.746 -1.052 -2.816 -3.729 8.262 +2.391 1.670 0.607 -0.950 -2.181 -2.995 6.741 +2.002 1.425 0.259 -1.073 -2.357 -3.309 6.741 +1.763 1.056 -0.096 -1.393 -2.454 -3.641 6.741 +1.613 1.284 -0.083 -1.108 -1.990 -3.311 6.741 +1.374 1.014 -0.294 -1.163 -1.901 -2.934 6.741 +1.763 1.266 0.404 -0.523 -1.205 -2.285 6.741 +0.789 0.505 -0.022 -0.766 -1.066 -1.894 6.741 +0.804 0.881 0.494 -0.079 -0.144 -0.747 6.741 +-0.791 -0.376 -0.469 -0.534 -0.258 -0.404 6.741 +-0.688 0.096 -0.102 0.513 1.103 1.363 6.741 +-1.779 -0.853 -0.652 0.589 1.170 2.064 6.741 +-2.042 -1.276 -0.460 1.245 1.791 3.231 6.741 +-2.017 -0.869 -0.358 1.759 2.498 4.398 6.741 +-2.094 -1.001 -0.673 1.134 2.234 3.634 6.741 +-2.085 -0.647 -0.392 1.140 1.835 3.273 6.741 +-1.379 -0.484 -0.185 1.148 1.814 2.828 6.741 +-2.187 -1.257 -0.954 0.535 0.972 2.166 6.741 +-1.567 -0.603 -0.714 0.868 1.144 2.123 6.741 +-1.587 -0.770 -0.593 0.594 0.795 2.003 6.741 +-1.427 -0.869 -0.597 0.458 0.652 1.506 6.741 +-1.157 -0.722 -0.499 0.488 0.704 1.430 6.741 +-1.412 -0.716 -0.487 0.191 0.552 1.048 6.741 +-1.271 -0.599 -0.335 -0.072 0.407 0.932 6.741 +-1.011 -0.574 -0.242 -0.062 0.191 0.406 6.741 +-0.935 -0.499 -0.337 0.066 0.047 0.348 6.741 +-0.996 -0.419 -0.177 0.187 0.092 0.145 6.741 +-1.275 -0.596 -0.592 -0.095 -0.224 -0.556 6.741 +-1.166 -0.566 -0.541 -0.053 -0.125 -0.695 6.741 +-1.336 -0.756 -0.482 -0.332 -0.385 -0.868 6.741 +-1.285 -0.750 -0.361 -0.267 0.007 -0.658 6.741 +-1.139 -0.637 -0.116 -0.144 0.061 -0.818 6.741 +-1.302 -0.723 -0.015 -0.279 0.059 -0.398 6.741 +-1.282 -0.608 -0.010 -0.363 -0.575 -0.798 6.741 +-1.512 -0.849 -0.090 -0.333 -0.450 -0.810 6.741 +-1.300 -0.689 -0.130 -0.311 -0.693 -1.194 6.741 +-0.779 -0.268 0.300 -0.159 -0.471 -1.087 6.741 +-0.541 -0.158 0.033 -0.690 -0.985 -1.456 6.741 +0.049 -0.167 0.335 -0.104 -0.410 -0.919 6.741 +0.007 0.015 0.217 0.066 -0.258 -0.491 6.741 +-0.120 -0.133 0.012 0.025 -0.261 -0.252 6.741 +0.179 -0.009 0.124 0.177 -0.027 0.175 6.741 +0.036 -0.192 0.290 0.346 -0.120 0.744 6.741 +0.277 -0.028 0.309 0.411 0.215 0.905 6.741 +0.156 -0.142 0.251 0.356 0.865 1.404 6.741 +0.357 0.105 0.161 0.148 0.909 1.279 6.741 +0.613 0.386 0.277 0.432 1.309 1.713 6.741 +0.538 0.651 0.253 0.307 1.249 1.374 6.741 +0.500 0.675 0.253 0.462 1.056 1.733 6.741 +0.467 0.749 0.198 0.490 0.578 1.625 6.741 +0.697 0.879 0.399 0.799 0.753 1.965 6.741 +0.778 0.412 -0.161 0.385 0.386 1.192 6.741 +1.203 0.763 0.032 0.975 0.681 1.781 6.741 +1.131 0.558 0.113 0.877 0.813 1.292 6.741 +0.997 0.408 0.289 0.644 0.717 1.395 6.741 +0.987 0.437 0.366 0.533 0.586 0.802 6.741 +0.193 -0.018 -0.049 0.094 0.139 0.295 6.741 +0.600 0.427 0.508 0.345 -0.116 0.006 6.741 +-0.079 0.026 -0.161 -0.174 -0.844 -0.614 6.741 +0.386 0.496 0.431 -0.067 -0.676 -0.756 6.741 +0.263 0.622 0.516 -0.217 -0.833 -1.458 6.741 +-0.214 0.003 -0.059 -1.261 -1.774 -2.336 6.741 +-0.797 -0.651 -0.419 -0.859 -1.330 -1.912 6.741 +-0.487 -0.384 -0.111 -0.400 -0.323 -1.257 6.741 +-0.765 -0.488 -0.473 0.255 0.071 -0.426 6.741 +-0.865 -0.236 -0.433 0.224 -0.239 -0.766 6.741 +-1.290 -0.572 -0.268 0.131 -0.515 -0.589 6.741 +-1.031 -0.184 -0.088 0.213 -0.337 -0.436 6.741 +-1.279 -0.233 -0.162 0.092 -0.211 -0.297 6.741 +-1.050 -0.261 -0.142 -0.007 0.037 -0.442 6.741 +-1.619 -0.907 -0.836 -0.322 -0.465 -0.475 6.741 +-1.498 -0.614 -0.610 -0.070 -0.293 -0.102 6.741 +-1.527 -0.856 -0.692 -0.107 -0.192 0.046 6.741 +-1.549 -1.079 -0.684 -0.053 -0.367 0.177 6.741 +-1.521 -0.731 -0.240 0.233 0.235 0.736 6.741 +-1.609 -0.794 -0.187 0.149 0.358 0.996 6.741 +-1.819 -0.906 0.113 0.117 0.450 1.349 6.741 +-1.495 -0.800 0.043 0.344 0.927 1.681 6.741 +-1.443 -0.926 -0.370 0.057 0.555 1.675 6.741 +-1.446 -0.892 -0.488 0.185 0.901 2.167 6.741 +-1.340 -0.799 -0.482 0.160 1.147 2.001 6.741 +-1.673 -0.799 -0.350 0.333 1.683 2.360 6.741 +-1.774 -0.862 -0.095 0.507 1.604 2.344 6.741 +-2.350 -1.274 -0.361 0.600 1.684 2.629 6.741 +-2.622 -1.193 -0.297 1.248 1.975 3.207 6.741 +-2.316 -1.191 0.009 1.280 2.696 3.169 6.741 +-2.234 -1.136 -0.114 1.408 2.226 2.756 6.741 +-1.586 -0.983 -0.030 0.728 1.652 2.007 6.741 +-0.784 -0.482 0.360 0.156 1.003 1.183 6.741 +-0.202 0.096 0.494 0.712 0.586 0.415 6.741 +0.528 0.179 0.531 0.208 0.124 -0.420 6.741 +0.784 0.457 0.599 -0.122 -0.175 -0.750 6.741 +1.399 0.740 0.487 -0.462 -1.007 -1.729 6.741 +1.533 0.776 0.431 -0.788 -1.468 -2.283 6.741 +2.039 0.992 0.510 -0.978 -2.306 -2.779 6.741 +1.871 1.180 0.488 -0.962 -2.355 -3.207 6.741 +2.357 1.415 0.542 -0.968 -2.376 -3.236 6.741 +2.056 1.444 0.473 -0.771 -1.630 -2.417 4.839 +2.235 1.687 0.855 -0.429 -1.221 -1.983 4.839 +1.545 0.885 0.021 -1.087 -1.870 -2.533 4.839 +1.449 1.032 0.249 -0.707 -1.091 -2.128 4.839 +1.014 0.583 0.044 -0.897 -1.056 -1.691 4.839 +1.438 1.158 0.833 0.094 0.028 -0.725 4.839 +1.274 0.885 0.974 0.224 0.375 0.081 4.839 +-0.113 0.362 0.132 0.005 0.125 0.231 4.839 +-0.751 -0.256 -0.054 0.733 0.775 1.158 4.839 +-1.694 -0.821 -0.218 0.898 1.367 2.234 4.839 +-2.304 -1.304 -0.422 0.945 1.924 3.199 4.839 +-2.832 -1.207 -0.505 1.663 2.884 4.611 4.839 +-3.148 -1.397 -0.571 1.834 3.330 5.152 4.839 +-3.437 -1.366 -0.947 1.416 3.093 5.028 4.839 +-2.870 -1.035 -0.633 1.470 2.936 4.843 4.839 +-2.397 -0.756 -0.162 1.597 2.743 4.343 4.839 +-2.584 -1.051 -0.749 0.977 2.345 3.801 4.839 +-2.335 -0.882 -0.872 0.985 1.990 3.158 4.839 +-1.931 -0.746 -0.728 1.123 1.896 3.134 4.839 +-1.878 -0.878 -0.684 1.003 1.585 2.651 4.839 +-1.344 -0.769 -0.445 0.843 1.659 2.329 4.839 +-1.657 -0.930 -0.553 0.334 1.348 1.927 4.839 +-1.622 -0.747 -0.446 0.091 1.099 1.431 4.839 +-1.563 -0.770 -0.400 0.106 0.700 1.166 4.839 +-1.169 -0.586 -0.308 0.125 0.377 0.429 4.839 +-0.770 -0.320 -0.017 0.458 0.724 0.359 4.839 +-1.187 -0.682 -0.563 0.069 -0.044 -0.649 4.839 +-1.438 -0.483 -0.493 0.018 -0.019 -0.785 4.839 +-1.616 -0.424 -0.392 -0.236 -0.231 -1.036 4.839 +-1.472 -0.306 0.143 -0.145 0.219 -0.621 4.839 +-1.289 -0.431 0.149 -0.365 -0.187 -1.136 4.839 +-1.432 -0.547 0.221 -0.354 -0.178 -0.822 4.839 +-1.160 -0.147 0.388 -0.302 -0.700 -1.261 4.839 +-1.479 -0.450 0.147 -0.280 -1.054 -1.537 4.839 +-0.958 -0.400 0.130 -0.255 -1.072 -2.041 4.839 +-0.645 -0.179 0.354 -0.449 -1.198 -2.398 4.839 +-0.121 0.150 0.435 -0.404 -1.222 -2.427 4.839 +0.076 0.281 0.443 -0.080 -0.715 -1.764 4.839 +0.025 0.223 0.199 -0.238 -0.906 -1.542 4.839 +-0.114 0.252 0.097 -0.179 -0.934 -1.131 4.839 +0.261 0.394 0.123 -0.067 -0.762 -0.710 4.839 +-0.087 0.021 0.059 -0.165 -0.660 -0.240 4.839 +0.245 0.166 0.049 -0.017 -0.398 -0.081 4.839 +0.531 0.453 0.435 0.296 0.727 0.744 4.839 +0.824 0.845 0.413 0.207 0.743 0.731 4.839 +0.667 0.784 0.344 0.248 1.222 1.026 4.839 +1.156 1.255 0.508 0.538 1.534 1.031 4.839 +0.776 1.179 0.431 0.710 1.177 1.235 4.839 +1.005 1.349 0.416 0.760 0.678 1.221 4.839 +1.394 1.323 0.333 0.949 0.712 1.483 4.839 +1.130 0.677 -0.289 0.378 -0.089 0.519 4.839 +1.041 0.485 -0.113 0.488 0.352 0.748 4.839 +1.115 0.690 0.274 0.373 0.244 0.448 4.839 +0.789 0.365 0.389 0.180 -0.069 0.350 4.839 +0.745 0.511 0.275 0.084 -0.283 -0.126 4.839 +0.609 0.626 0.438 0.390 0.150 0.027 4.839 +0.630 0.838 0.672 0.120 -0.540 -0.768 4.839 +-0.076 0.474 0.207 -0.295 -1.489 -1.273 4.839 +-0.426 0.001 -0.156 -0.973 -1.510 -1.990 4.839 +-0.104 0.246 0.015 -0.546 -1.719 -2.157 4.839 +0.129 0.501 -0.024 -0.442 -1.721 -2.707 4.839 +-0.079 -0.022 -0.143 -0.424 -1.463 -2.422 4.839 +-0.079 0.074 0.214 0.068 -0.704 -1.813 4.839 +-1.133 -0.394 -0.383 -0.286 -0.445 -1.333 4.839 +-1.085 0.053 -0.157 0.128 -0.544 -1.366 4.839 +-1.523 -0.007 0.014 0.387 -0.345 -0.701 4.839 +-1.212 -0.165 0.067 -0.070 -0.496 -0.763 4.839 +-1.412 -0.317 -0.070 0.011 0.057 -0.382 4.839 +-1.694 -0.532 -0.583 -0.335 -0.505 -0.558 4.839 +-1.734 -0.521 -0.671 -0.165 -0.219 -0.042 4.839 +-1.553 -0.585 -0.796 -0.132 -0.245 0.340 4.839 +-1.568 -0.834 -0.718 0.066 0.007 0.671 4.839 +-1.622 -0.630 -0.245 0.211 0.440 1.071 4.839 +-1.981 -0.694 -0.210 0.433 0.742 1.481 4.839 +-1.987 -0.785 -0.332 0.253 0.918 1.615 4.839 +-2.442 -1.020 -0.468 0.072 0.828 1.771 4.839 +-2.026 -0.831 -0.151 0.255 1.206 2.308 4.839 +-1.990 -0.985 -0.285 0.406 1.405 2.683 4.839 +-2.170 -0.829 -0.332 0.778 1.955 3.025 4.839 +-2.216 -0.631 -0.542 0.876 2.122 2.997 4.839 +-2.372 -0.948 -0.298 1.027 2.639 3.816 4.839 +-2.380 -1.346 -0.083 1.189 2.695 4.036 4.839 +-2.936 -0.949 -0.087 1.573 3.147 4.600 4.839 +-3.585 -1.502 -0.124 1.924 3.303 4.989 4.839 +-3.138 -1.267 -0.027 2.121 3.670 5.174 4.839 +-2.674 -1.245 0.031 1.827 3.085 4.222 4.839 +-1.857 -0.995 -0.007 1.336 2.513 3.277 4.839 +-1.371 -0.523 0.465 1.256 2.135 2.706 4.839 +-1.127 -0.259 0.419 0.455 1.401 1.857 4.839 +-0.353 0.187 0.445 0.550 0.868 1.066 4.839 +0.270 0.436 0.721 0.461 0.519 0.441 4.839 +0.852 0.515 0.662 0.124 -0.123 -0.522 4.839 +1.295 0.698 0.527 -0.209 -0.665 -1.030 4.839 +1.446 0.848 0.381 -0.628 -1.275 -2.028 4.839 +2.024 1.160 0.538 -0.528 -1.452 -1.937 4.839 +2.089 1.374 0.729 -0.659 -1.383 -2.105 4.839 +1.712 0.857 0.469 -0.797 -1.210 -1.699 2.659 +1.729 1.069 0.698 -0.442 -0.823 -1.509 2.659 +2.037 1.548 1.026 0.115 -0.288 -0.671 2.659 +2.048 1.451 0.998 0.143 -0.431 -0.817 2.659 +1.869 1.205 1.088 0.432 -0.074 0.147 2.659 +0.879 0.506 0.386 -0.055 0.058 -0.313 2.659 +0.116 0.460 0.246 -0.121 0.121 0.817 2.659 +-0.008 0.390 0.672 0.847 1.117 2.160 2.659 +-0.709 0.080 0.525 1.342 2.145 3.138 2.659 +-1.597 -0.622 0.337 1.437 2.471 4.188 2.659 +-2.666 -1.359 -0.252 1.158 2.611 4.665 2.659 +-3.386 -1.145 -0.267 1.792 3.423 5.590 2.659 +-3.820 -1.582 -0.382 2.076 3.896 6.142 2.659 +-3.325 -1.532 -0.355 2.149 4.130 6.395 2.659 +-3.392 -1.347 -0.944 1.687 3.667 5.735 2.659 +-2.922 -1.228 -0.900 1.554 3.316 4.796 2.659 +-3.496 -1.637 -1.376 1.178 2.594 4.376 2.659 +-2.914 -0.989 -0.865 1.345 2.682 4.310 2.659 +-2.933 -1.501 -1.298 0.984 2.053 3.672 2.659 +-2.704 -1.530 -1.138 0.802 1.684 3.362 2.659 +-2.311 -1.210 -0.658 0.916 1.889 2.998 2.659 +-2.276 -1.112 -0.739 0.531 1.581 2.354 2.659 +-2.056 -1.207 -1.118 0.011 0.836 1.220 2.659 +-1.754 -0.922 -0.840 0.159 0.896 1.363 2.659 +-1.306 -0.524 -0.469 0.271 0.721 0.883 2.659 +-1.196 -0.353 -0.433 0.369 0.638 0.103 2.659 +-1.017 0.062 -0.292 0.518 0.654 -0.340 2.659 +-1.505 -0.065 -0.374 0.055 0.030 -0.739 2.659 +-1.649 -0.186 -0.289 -0.466 -0.396 -1.205 2.659 +-1.854 -0.275 -0.208 -0.575 -0.659 -1.141 2.659 +-1.344 -0.054 0.043 -0.629 -0.871 -1.328 2.659 +-1.267 -0.207 0.185 -0.562 -1.002 -1.476 2.659 +-0.794 -0.013 0.326 -0.683 -1.429 -2.301 2.659 +-1.188 -0.401 0.055 -0.722 -1.484 -2.027 2.659 +-0.934 -0.032 0.341 -0.634 -1.740 -2.783 2.659 +-0.327 0.322 0.609 -0.456 -1.453 -2.919 2.659 +-0.176 0.449 0.288 -0.779 -2.066 -3.617 2.659 +-0.238 0.414 0.176 -0.729 -1.711 -3.342 2.659 +0.073 0.501 0.464 -0.462 -1.502 -2.780 2.659 +0.211 0.678 0.531 -0.335 -1.244 -1.968 2.659 +0.602 1.060 0.601 -0.149 -1.040 -1.516 2.659 +0.249 0.479 0.211 -0.251 -0.809 -1.023 2.659 +0.927 0.853 0.374 -0.129 -0.420 -0.722 2.659 +1.059 1.099 0.792 0.397 0.578 0.211 2.659 +1.399 1.284 0.533 -0.032 0.588 0.019 2.659 +1.439 1.469 0.594 0.503 1.084 0.518 2.659 +1.480 1.592 0.481 0.401 0.831 0.070 2.659 +1.408 1.438 0.202 0.348 0.429 0.356 2.659 +1.540 1.408 0.012 0.342 0.068 0.182 2.659 +2.102 1.839 0.478 1.018 1.001 0.964 2.659 +1.744 1.301 -0.159 0.190 0.216 -0.138 2.659 +1.764 1.255 0.388 0.639 0.201 0.343 2.659 +1.432 0.964 0.119 0.152 -0.926 -0.552 2.659 +1.496 1.221 0.648 0.554 -0.101 -0.071 2.659 +1.546 1.501 0.796 0.473 -0.203 -0.658 2.659 +0.948 1.219 0.513 0.134 -0.620 -0.927 2.659 +0.258 0.955 0.067 -0.559 -1.881 -1.833 2.659 +0.262 1.085 0.331 -0.408 -1.724 -1.850 2.659 +0.264 0.691 -0.013 -0.590 -1.952 -2.469 2.659 +0.133 0.460 -0.188 -0.539 -2.228 -2.992 2.659 +0.318 0.646 -0.205 -0.501 -2.410 -3.289 2.659 +0.040 0.547 -0.141 -0.267 -1.761 -2.825 2.659 +-1.033 -0.363 -0.811 -0.902 -2.044 -3.034 2.659 +-0.994 0.168 -0.322 -0.300 -0.895 -1.840 2.659 +-0.981 0.261 -0.339 -0.320 -0.981 -1.913 2.659 +-1.015 0.123 -0.440 -0.119 -0.581 -1.136 2.659 +-1.206 0.075 -0.060 -0.176 -0.778 -1.080 2.659 +-1.534 -0.076 -0.243 0.041 -0.561 -0.548 2.659 +-1.773 -0.142 -0.556 -0.254 -0.554 -0.600 2.659 +-1.958 -0.440 -0.647 -0.361 -0.238 -0.229 2.659 +-2.394 -1.100 -1.271 -0.728 -0.490 -0.365 2.659 +-2.599 -1.378 -1.120 -0.579 -0.448 0.098 2.659 +-2.406 -0.910 -0.834 -0.267 0.462 0.907 2.659 +-2.251 -0.712 -0.581 0.077 0.784 1.653 2.659 +-2.225 -0.744 -0.533 0.379 0.914 2.035 2.659 +-2.355 -1.046 -0.497 0.367 1.265 2.686 2.659 +-2.163 -0.939 -0.178 0.569 1.678 3.393 2.659 +-2.283 -0.941 -0.192 0.502 1.918 3.434 2.659 +-2.645 -1.265 -0.438 0.724 2.160 3.701 2.659 +-2.403 -1.043 -0.382 1.221 2.645 4.082 2.659 +-2.947 -1.265 -0.359 1.589 2.984 4.881 2.659 +-3.283 -1.527 -0.328 2.455 2.985 4.846 2.659 +-3.534 -1.073 -0.288 2.277 3.480 5.280 2.659 +-3.330 -0.821 -0.224 2.245 4.143 5.935 2.659 +-3.828 -1.206 -0.190 2.070 4.091 6.052 2.659 +-3.284 -0.601 0.067 2.073 3.672 5.062 2.659 +-2.406 -0.967 0.125 2.123 3.465 4.550 2.659 +-2.006 -0.897 0.523 1.567 2.919 3.956 2.659 +-1.717 -0.371 0.703 1.251 2.440 3.527 2.659 +-1.058 -0.282 0.499 0.349 1.649 2.207 2.659 +-0.282 0.027 0.515 0.314 1.117 1.612 2.659 +0.364 0.517 0.468 0.359 0.580 0.585 2.659 +0.808 0.809 0.540 0.295 0.201 0.091 2.659 +1.140 0.702 0.274 -0.368 -0.544 -0.773 2.659 +1.665 0.816 0.378 -0.631 -0.508 -0.872 2.659 +2.398 1.410 0.977 -0.073 -0.575 -0.709 2.659 +2.196 1.035 1.152 -0.008 0.269 0.334 0.121 +2.006 1.348 1.088 0.140 0.422 0.165 0.121 +2.082 1.085 1.048 0.110 0.149 0.421 0.121 +1.341 0.555 0.540 0.179 -0.462 0.153 0.121 +1.348 1.049 1.059 0.766 0.569 1.297 0.121 +0.985 0.922 1.016 1.001 1.007 1.999 0.121 +-0.444 -0.250 0.276 0.536 1.087 2.140 0.121 +-0.346 0.230 0.912 1.381 2.086 3.716 0.121 +-1.397 -0.503 0.775 1.426 2.760 5.034 0.121 +-2.350 -0.338 0.440 1.741 3.116 5.936 0.121 +-2.912 -0.931 0.057 1.740 3.648 6.379 0.121 +-3.911 -1.775 -0.722 1.829 4.087 6.247 0.121 +-3.922 -1.678 -0.372 2.863 4.914 7.276 0.121 +-4.088 -1.828 -0.408 2.645 5.380 7.582 0.121 +-4.196 -1.804 -0.963 2.020 4.563 7.082 0.121 +-4.068 -1.607 -1.098 1.812 4.176 6.228 0.121 +-4.499 -2.238 -1.825 0.645 3.398 5.527 0.121 +-4.081 -1.796 -1.661 0.718 3.397 5.368 0.121 +-3.281 -1.054 -1.176 1.068 3.333 5.218 0.121 +-3.236 -1.081 -1.026 1.130 2.893 4.549 0.121 +-2.671 -0.751 -0.761 1.141 2.935 4.237 0.121 +-2.568 -0.613 -0.804 1.132 2.497 3.534 0.121 +-2.545 -0.982 -1.315 0.282 1.350 2.072 0.121 +-2.225 -0.995 -1.150 0.347 1.005 1.534 0.121 +-2.030 -0.680 -0.855 0.368 0.615 0.874 0.121 +-2.181 -0.682 -0.921 0.202 0.289 0.088 0.121 +-2.046 -0.617 -0.962 -0.231 -0.519 -0.747 0.121 +-1.682 -0.160 -0.260 -0.255 -0.451 -0.604 0.121 +-1.716 -0.003 -0.113 -0.581 -0.752 -1.529 0.121 +-1.897 0.024 -0.171 -0.915 -1.010 -1.774 0.121 +-1.375 0.270 -0.031 -1.111 -0.922 -2.085 0.121 +-1.443 -0.056 -0.162 -1.355 -1.424 -2.618 0.121 +-0.724 0.114 0.213 -1.240 -1.866 -3.269 0.121 +-1.433 -0.137 0.143 -1.033 -2.081 -3.506 0.121 +-0.760 0.278 0.529 -0.722 -2.266 -3.877 0.121 +-0.345 0.178 0.402 -1.100 -2.774 -4.230 0.121 +0.309 0.805 0.597 -0.869 -2.784 -4.329 0.121 +-0.324 0.499 0.044 -0.953 -2.468 -4.276 0.121 +0.303 1.047 0.668 -0.690 -1.842 -3.570 0.121 +0.058 1.049 0.485 -0.622 -2.000 -3.169 0.121 +0.930 1.377 0.885 -0.412 -1.544 -2.644 0.121 +0.797 1.378 0.718 -0.363 -0.896 -1.821 0.121 +1.111 1.367 0.715 -0.504 -0.719 -1.800 0.121 +0.672 1.087 0.227 -0.355 -0.232 -1.205 0.121 +1.636 1.652 0.317 -0.017 0.228 -1.209 0.121 +1.663 1.598 0.300 0.186 0.142 -0.568 0.121 +2.302 1.858 0.190 -0.060 -0.454 -0.840 0.121 +1.875 1.729 0.208 -0.018 -0.222 -0.445 0.121 +1.806 1.473 -0.186 -0.140 -0.299 -0.930 0.121 +1.276 1.206 -0.568 -0.399 -0.655 -1.292 0.121 +2.212 1.793 -0.034 -0.144 -0.863 -1.218 0.121 +2.422 1.962 0.353 0.461 -0.451 -0.667 0.121 +2.401 2.002 0.577 0.426 -0.885 -1.112 0.121 +1.971 1.977 0.759 0.364 -0.704 -0.928 0.121 +1.972 1.837 0.815 0.090 -1.099 -1.707 0.121 +0.735 1.250 0.364 -0.609 -2.049 -2.170 0.121 +0.700 1.224 0.231 -1.100 -2.211 -3.024 0.121 +0.241 0.918 -0.417 -1.055 -2.277 -3.124 0.121 +0.535 0.690 -0.992 -1.164 -2.846 -3.852 0.121 +0.613 1.153 -0.375 -1.077 -2.664 -3.735 0.121 +0.952 1.350 -0.392 -0.732 -2.786 -4.274 0.121 +-0.695 0.422 -0.876 -1.390 -3.044 -4.577 0.121 +-0.414 0.610 -0.358 -1.179 -2.468 -3.744 0.121 +-0.963 0.877 -0.755 -1.064 -1.952 -2.864 0.121 +-0.325 1.308 -0.102 -0.350 -1.310 -2.241 0.121 +-1.090 0.267 -0.315 -0.823 -1.058 -1.880 0.121 +-0.741 0.353 0.077 -0.184 -1.030 -1.651 0.121 +-1.204 0.791 -0.106 0.342 -0.581 -0.664 0.121 +-1.597 0.501 -0.530 -0.061 -0.981 -0.874 0.121 +-1.748 0.220 -0.564 0.183 -0.504 -0.117 0.121 +-2.219 -0.325 -0.643 -0.525 -0.269 -0.111 0.121 +-2.412 -0.412 -0.707 -0.322 0.290 0.730 0.121 +-2.118 -0.185 -0.084 0.092 0.844 1.636 0.121 +-2.327 -0.110 -0.213 0.400 1.319 2.407 0.121 +-2.009 -0.164 -0.069 0.913 1.561 3.113 0.121 +-2.598 -0.771 -0.442 0.883 1.695 3.689 0.121 +-2.621 -0.880 -0.421 1.079 1.864 4.174 0.121 +-2.870 -0.862 -0.259 1.058 2.389 4.874 0.121 +-2.616 -0.965 -0.126 1.959 3.079 5.446 0.121 +-3.152 -1.273 -0.170 2.282 3.229 5.475 0.121 +-3.435 -1.198 -0.235 2.996 3.794 6.417 0.121 +-3.492 -1.191 -0.031 2.652 3.874 6.478 0.121 +-3.848 -1.143 -0.311 2.652 4.368 6.782 0.121 +-4.158 -1.357 -0.086 3.036 4.923 7.652 0.121 +-4.412 -0.627 -0.406 2.664 5.123 7.175 0.121 +-3.858 -1.065 0.122 2.676 4.911 6.783 0.121 +-3.341 -0.835 0.314 2.373 4.770 6.258 0.121 +-2.651 -0.118 0.571 2.383 4.208 5.938 0.121 +-2.054 -0.567 0.728 1.914 3.473 5.332 0.121 +-1.650 -0.438 0.670 1.335 2.793 3.927 0.121 +-0.838 0.235 0.564 0.841 2.165 3.147 0.121 +-0.118 0.184 0.775 0.507 1.389 2.688 0.121 +0.637 0.549 0.709 0.340 0.938 1.693 0.121 +1.299 0.798 0.592 0.428 0.615 0.645 0.121 +1.842 0.977 0.660 0.395 0.614 0.444 0.121 +1.672 0.705 0.585 -0.027 -0.149 -0.233 0.121 +2.737 0.941 0.982 0.153 0.774 0.936 -1.082 +1.771 1.097 1.064 0.678 0.914 1.041 -1.082 +2.042 0.790 0.690 0.766 1.059 1.731 -1.082 +1.242 0.899 0.674 1.104 1.009 2.275 -1.082 +1.633 1.469 1.638 1.970 1.530 3.540 -1.082 +-0.866 -0.603 0.368 0.609 0.816 2.885 -1.082 +-0.841 -0.527 0.341 1.168 2.121 4.371 -1.082 +-1.634 -0.661 0.066 2.095 2.634 4.946 -1.082 +-2.620 -1.755 -0.861 1.102 3.023 6.476 -1.082 +-3.819 -1.592 -0.543 1.353 3.923 6.403 -1.082 +-3.561 -1.178 -0.231 2.442 5.340 7.839 -1.082 +-4.249 -2.067 -0.390 2.583 5.065 8.278 -1.082 +-3.675 -1.564 0.107 3.229 6.842 9.308 -1.082 +-4.963 -2.486 -1.095 2.378 5.764 8.470 -1.082 +-4.639 -1.759 -0.868 2.303 5.640 8.796 -1.082 +-4.612 -1.441 -1.115 2.438 4.990 8.450 -1.082 +-4.989 -1.776 -1.505 2.030 4.961 7.647 -1.082 +-5.410 -3.001 -2.209 0.665 3.915 6.282 -1.082 +-4.232 -1.840 -1.771 1.532 4.029 6.226 -1.082 +-3.993 -1.437 -1.913 0.964 3.987 5.424 -1.082 +-2.884 -1.213 -1.500 0.976 3.313 4.932 -1.082 +-2.772 -1.151 -1.456 0.586 2.671 3.839 -1.082 +-2.830 -1.094 -1.548 0.015 2.014 2.452 -1.082 +-1.832 -0.048 -0.717 0.785 1.906 2.497 -1.082 +-1.308 -0.026 -0.587 0.708 1.665 1.482 -1.082 +-2.481 -0.618 -1.251 -0.669 0.355 -0.061 -1.082 +-2.307 -0.627 -0.846 -1.224 -0.303 -0.774 -1.082 +-1.234 0.127 0.443 -0.325 -0.378 -0.811 -1.082 +-0.783 0.691 0.280 -0.540 -0.276 -1.277 -1.082 +-0.550 0.884 0.433 -0.485 -0.179 -1.794 -1.082 +-0.388 1.021 0.767 -0.915 -0.811 -2.627 -1.082 +-1.322 0.074 -0.158 -1.604 -2.029 -3.750 -1.082 +-0.709 0.510 0.583 -1.420 -2.455 -4.338 -1.082 +-0.784 0.346 0.438 -1.364 -1.970 -4.816 -1.082 +0.561 1.408 1.141 -0.671 -2.118 -4.470 -1.082 +0.487 1.175 0.866 -1.035 -2.540 -5.212 -1.082 +1.538 1.358 1.419 -0.292 -2.488 -4.417 -1.082 +1.293 1.106 0.715 -0.960 -2.662 -4.683 -1.082 +1.158 1.635 0.694 -0.855 -2.381 -4.344 -1.082 +1.330 1.728 0.874 -0.547 -1.913 -3.749 -1.082 +0.926 1.925 0.410 -1.084 -1.946 -4.076 -1.082 +1.243 2.350 0.368 -0.912 -1.504 -3.370 -1.082 +1.863 2.856 0.534 -0.601 -1.023 -3.174 -1.082 +1.991 2.441 0.646 -0.329 0.072 -2.262 -1.082 +2.593 2.256 0.555 -0.383 -0.685 -2.107 -1.082 +2.386 2.064 0.127 -0.385 -0.674 -1.782 -1.082 +2.982 3.035 0.712 0.120 -0.713 -1.490 -1.082 +3.301 3.076 0.453 0.457 -0.555 -0.939 -1.082 +3.489 3.191 0.697 0.526 0.218 -1.314 -1.082 +2.379 2.046 0.028 -0.107 -1.634 -1.923 -1.082 +2.860 2.839 0.394 0.219 -1.659 -1.765 -1.082 +2.462 2.425 0.206 0.278 -1.983 -1.252 -1.082 +3.149 2.918 0.920 0.088 -1.512 -2.298 -1.082 +1.994 2.194 0.264 -0.606 -1.895 -2.726 -1.082 +2.402 2.479 0.801 -0.369 -1.388 -2.619 -1.082 +0.104 0.060 -1.286 -2.628 -3.779 -4.994 -1.082 +1.348 2.085 0.190 -0.832 -1.842 -3.847 -1.082 +0.899 0.895 0.292 -1.855 -1.893 -4.884 -1.082 +1.315 1.777 -0.167 -1.407 -3.228 -4.404 -1.082 +1.362 1.814 0.358 -0.253 -2.542 -4.143 -1.082 +1.236 2.534 -0.525 -1.284 -3.158 -4.804 -1.082 +0.089 1.451 -0.159 -1.929 -3.539 -5.335 -1.082 +-0.616 1.394 -0.172 -1.926 -3.890 -5.062 -1.082 +-0.642 0.969 -0.338 -1.302 -2.956 -3.993 -1.082 +-0.346 0.623 -0.717 -1.384 -2.792 -3.781 -1.082 +-1.079 0.319 -0.649 -1.312 -1.987 -3.265 -1.082 +-1.872 0.605 -1.531 -1.196 -2.591 -3.218 -1.082 +-2.107 0.985 -2.140 -0.765 -1.552 -1.956 -1.082 +-2.101 0.650 -1.891 -0.371 -1.157 -1.697 -1.082 +-2.367 -0.419 -1.191 -0.366 -1.261 -0.553 -1.082 +-1.808 -0.048 -0.358 -0.162 -0.533 0.093 -1.082 +-2.749 -0.467 -1.002 -0.041 -0.271 0.223 -1.082 +-2.397 -0.196 -0.190 0.563 0.568 1.292 -1.082 +-2.622 -0.735 -0.555 0.429 1.046 2.273 -1.082 +-1.537 -0.132 0.169 1.381 1.653 2.877 -1.082 +-2.326 0.217 0.112 1.733 2.433 4.882 -1.082 +-1.715 -0.187 -0.055 2.139 3.253 5.786 -1.082 +-2.227 -0.452 -0.016 2.493 3.685 6.824 -1.082 +-3.177 -1.225 -0.326 1.898 3.268 6.818 -1.082 +-3.451 -1.129 -0.229 2.501 3.627 7.253 -1.082 +-3.698 -1.598 0.083 3.312 5.098 7.135 -1.082 +-3.579 -1.309 -0.088 3.129 5.237 7.728 -1.082 +-4.192 -1.264 -0.075 3.170 5.555 8.893 -1.082 +-5.403 -1.829 0.275 3.035 6.118 9.039 -1.082 +-4.286 -0.796 0.410 3.925 6.859 9.316 -1.082 +-4.004 -1.216 0.038 3.450 7.123 8.662 -1.082 +-4.665 -0.698 -0.359 2.336 4.614 7.733 -1.082 +-3.532 -0.388 0.707 2.612 5.288 7.383 -1.082 +-2.011 0.879 1.362 2.647 5.841 7.104 -1.082 +-2.139 0.657 0.576 1.753 2.927 5.422 -1.082 +-1.070 1.332 1.167 2.221 2.954 4.444 -1.082 +-0.932 -0.580 -0.107 0.504 1.466 3.585 -1.082 +0.963 1.293 1.220 1.124 2.229 3.413 -1.082 +0.631 0.437 0.472 0.147 1.314 1.802 -1.082 +0.758 0.164 -0.040 -0.176 0.557 0.020 -1.082 +1.078 -0.159 0.242 -0.477 0.517 -0.011 -1.082 +-0.374 -0.030 -0.742 -0.116 -0.323 -0.164 9.410 +-0.934 -0.491 -0.305 0.323 0.152 0.641 9.410 +-1.192 -0.513 0.324 0.295 0.465 0.284 9.410 +-0.799 -0.539 0.135 0.330 0.684 0.846 9.410 +-0.418 -0.326 -0.062 0.155 0.205 0.152 9.410 +-1.161 -0.923 -0.369 -0.259 0.173 -0.118 9.410 +-1.444 -1.099 -0.755 -0.450 0.225 0.085 9.410 +-0.784 -0.856 -0.104 -0.160 0.800 -0.341 9.410 +-2.836 -1.356 -0.563 1.833 3.066 5.231 6.741 +-0.290 -0.163 0.272 -0.667 -1.325 -2.682 6.741 +0.018 0.161 -0.085 -1.013 -2.335 -3.111 6.741 +-2.885 -1.460 -0.143 1.826 3.528 4.531 6.741 diff --git a/Noto/Configuration/CDB/alma/AS/actuatorsCorrections.txt b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections.txt new file mode 100644 index 000000000..701e485ee --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections.txt @@ -0,0 +1,100440 @@ +1 0.364 +2 0.413 +3 0.457 +4 0.496 +5 0.531 +6 0.561 +7 0.587 +8 0.609 +9 0.627 +10 0.642 +11 0.653 +12 0.661 +13 0.665 +14 0.667 +15 0.666 +16 0.663 +17 0.657 +18 0.649 +19 0.638 +20 0.626 +21 0.612 +22 0.596 +23 0.579 +24 0.560 +25 0.539 +26 0.518 +27 0.495 +28 0.472 +29 0.447 +30 0.422 +31 0.396 +32 0.369 +33 0.342 +34 0.315 +35 0.287 +36 0.258 +37 0.230 +38 0.201 +39 0.173 +40 0.144 +41 0.115 +42 0.086 +43 0.057 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.057 +48 -0.084 +49 -0.112 +50 -0.140 +51 -0.167 +52 -0.194 +53 -0.221 +54 -0.248 +55 -0.274 +56 -0.300 +57 -0.326 +58 -0.352 +59 -0.378 +60 -0.404 +61 -0.429 +62 -0.455 +63 -0.481 +64 -0.507 +65 -0.533 +66 -0.559 +67 -0.586 +68 -0.613 +69 -0.640 +70 -0.668 +71 -0.697 +72 -0.726 +73 -0.756 +74 -0.787 +75 -0.819 +76 -0.852 +77 -0.886 +78 -0.922 +79 -0.959 +80 -0.998 +81 -1.038 +82 -1.080 +83 -1.124 +84 -1.171 +85 -1.219 +86 -1.270 +87 -1.324 +88 -1.380 +89 -1.440 +90 -1.502 +1 0.313 +2 0.359 +3 0.401 +4 0.438 +5 0.471 +6 0.500 +7 0.525 +8 0.546 +9 0.564 +10 0.578 +11 0.589 +12 0.597 +13 0.602 +14 0.605 +15 0.605 +16 0.602 +17 0.597 +18 0.590 +19 0.581 +20 0.571 +21 0.558 +22 0.544 +23 0.528 +24 0.512 +25 0.493 +26 0.474 +27 0.454 +28 0.432 +29 0.410 +30 0.387 +31 0.363 +32 0.339 +33 0.314 +34 0.289 +35 0.264 +36 0.238 +37 0.212 +38 0.185 +39 0.159 +40 0.132 +41 0.106 +42 0.079 +43 0.053 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.052 +48 -0.078 +49 -0.104 +50 -0.129 +51 -0.155 +52 -0.180 +53 -0.205 +54 -0.229 +55 -0.254 +56 -0.278 +57 -0.303 +58 -0.327 +59 -0.351 +60 -0.375 +61 -0.399 +62 -0.423 +63 -0.448 +64 -0.472 +65 -0.496 +66 -0.521 +67 -0.546 +68 -0.572 +69 -0.598 +70 -0.624 +71 -0.651 +72 -0.679 +73 -0.707 +74 -0.736 +75 -0.767 +76 -0.798 +77 -0.830 +78 -0.864 +79 -0.899 +80 -0.936 +81 -0.974 +82 -1.014 +83 -1.056 +84 -1.099 +85 -1.145 +86 -1.194 +87 -1.244 +88 -1.297 +89 -1.353 +90 -1.412 +1 0.201 +2 0.242 +3 0.278 +4 0.311 +5 0.340 +6 0.366 +7 0.388 +8 0.408 +9 0.424 +10 0.438 +11 0.449 +12 0.457 +13 0.463 +14 0.467 +15 0.469 +16 0.468 +17 0.466 +18 0.462 +19 0.456 +20 0.449 +21 0.440 +22 0.430 +23 0.418 +24 0.406 +25 0.392 +26 0.377 +27 0.362 +28 0.345 +29 0.328 +30 0.310 +31 0.291 +32 0.272 +33 0.253 +34 0.233 +35 0.213 +36 0.192 +37 0.171 +38 0.150 +39 0.129 +40 0.107 +41 0.086 +42 0.065 +43 0.043 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.043 +48 -0.064 +49 -0.085 +50 -0.106 +51 -0.127 +52 -0.148 +53 -0.169 +54 -0.190 +55 -0.210 +56 -0.231 +57 -0.251 +58 -0.272 +59 -0.292 +60 -0.313 +61 -0.333 +62 -0.354 +63 -0.375 +64 -0.396 +65 -0.417 +66 -0.438 +67 -0.460 +68 -0.482 +69 -0.504 +70 -0.527 +71 -0.550 +72 -0.574 +73 -0.599 +74 -0.625 +75 -0.651 +76 -0.678 +77 -0.706 +78 -0.736 +79 -0.766 +80 -0.798 +81 -0.831 +82 -0.865 +83 -0.902 +84 -0.939 +85 -0.979 +86 -1.021 +87 -1.064 +88 -1.110 +89 -1.158 +90 -1.208 +1 0.042 +2 0.073 +3 0.102 +4 0.128 +5 0.151 +6 0.172 +7 0.191 +8 0.208 +9 0.222 +10 0.235 +11 0.245 +12 0.254 +13 0.261 +14 0.267 +15 0.271 +16 0.274 +17 0.275 +18 0.275 +19 0.273 +20 0.271 +21 0.267 +22 0.263 +23 0.257 +24 0.251 +25 0.244 +26 0.236 +27 0.227 +28 0.217 +29 0.208 +30 0.197 +31 0.186 +32 0.174 +33 0.163 +34 0.150 +35 0.138 +36 0.125 +37 0.112 +38 0.098 +39 0.085 +40 0.071 +41 0.057 +42 0.043 +43 0.029 +44 0.014 +45 -0.000 +46 -0.014 +47 -0.029 +48 -0.043 +49 -0.058 +50 -0.072 +51 -0.087 +52 -0.102 +53 -0.116 +54 -0.131 +55 -0.146 +56 -0.160 +57 -0.175 +58 -0.190 +59 -0.205 +60 -0.220 +61 -0.236 +62 -0.251 +63 -0.267 +64 -0.282 +65 -0.298 +66 -0.315 +67 -0.331 +68 -0.348 +69 -0.365 +70 -0.383 +71 -0.401 +72 -0.420 +73 -0.439 +74 -0.459 +75 -0.479 +76 -0.500 +77 -0.522 +78 -0.545 +79 -0.569 +80 -0.593 +81 -0.619 +82 -0.646 +83 -0.673 +84 -0.703 +85 -0.733 +86 -0.765 +87 -0.798 +88 -0.833 +89 -0.869 +90 -0.907 +1 -0.145 +2 -0.124 +3 -0.104 +4 -0.086 +5 -0.069 +6 -0.053 +7 -0.039 +8 -0.025 +9 -0.013 +10 -0.001 +11 0.009 +12 0.019 +13 0.027 +14 0.035 +15 0.042 +16 0.048 +17 0.053 +18 0.058 +19 0.062 +20 0.065 +21 0.067 +22 0.069 +23 0.071 +24 0.071 +25 0.072 +26 0.071 +27 0.071 +28 0.070 +29 0.068 +30 0.066 +31 0.064 +32 0.061 +33 0.058 +34 0.054 +35 0.051 +36 0.047 +37 0.043 +38 0.038 +39 0.033 +40 0.028 +41 0.023 +42 0.018 +43 0.012 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.013 +48 -0.019 +49 -0.026 +50 -0.033 +51 -0.040 +52 -0.047 +53 -0.055 +54 -0.062 +55 -0.070 +56 -0.078 +57 -0.086 +58 -0.095 +59 -0.103 +60 -0.112 +61 -0.121 +62 -0.130 +63 -0.139 +64 -0.149 +65 -0.159 +66 -0.169 +67 -0.180 +68 -0.190 +69 -0.202 +70 -0.213 +71 -0.225 +72 -0.237 +73 -0.250 +74 -0.263 +75 -0.276 +76 -0.290 +77 -0.304 +78 -0.319 +79 -0.335 +80 -0.351 +81 -0.367 +82 -0.384 +83 -0.402 +84 -0.421 +85 -0.440 +86 -0.460 +87 -0.481 +88 -0.503 +89 -0.526 +90 -0.549 +1 -0.373 +2 -0.366 +3 -0.358 +4 -0.350 +5 -0.342 +6 -0.333 +7 -0.325 +8 -0.315 +9 -0.306 +10 -0.296 +11 -0.287 +12 -0.277 +13 -0.267 +14 -0.257 +15 -0.247 +16 -0.237 +17 -0.226 +18 -0.216 +19 -0.206 +20 -0.196 +21 -0.186 +22 -0.176 +23 -0.166 +24 -0.156 +25 -0.146 +26 -0.136 +27 -0.127 +28 -0.118 +29 -0.109 +30 -0.100 +31 -0.091 +32 -0.083 +33 -0.075 +34 -0.067 +35 -0.059 +36 -0.052 +37 -0.045 +38 -0.038 +39 -0.032 +40 -0.026 +41 -0.020 +42 -0.014 +43 -0.009 +44 -0.004 +45 -0.000 +46 0.004 +47 0.008 +48 0.011 +49 0.014 +50 0.017 +51 0.020 +52 0.022 +53 0.023 +54 0.025 +55 0.026 +56 0.026 +57 0.027 +58 0.027 +59 0.026 +60 0.025 +61 0.024 +62 0.023 +63 0.021 +64 0.020 +65 0.017 +66 0.015 +67 0.012 +68 0.009 +69 0.006 +70 0.002 +71 -0.002 +72 -0.006 +73 -0.010 +74 -0.014 +75 -0.019 +76 -0.024 +77 -0.029 +78 -0.033 +79 -0.039 +80 -0.044 +81 -0.049 +82 -0.054 +83 -0.060 +84 -0.065 +85 -0.070 +86 -0.076 +87 -0.081 +88 -0.086 +89 -0.091 +90 -0.096 +1 -0.614 +2 -0.621 +3 -0.625 +4 -0.628 +5 -0.628 +6 -0.627 +7 -0.623 +8 -0.619 +9 -0.612 +10 -0.605 +11 -0.595 +12 -0.585 +13 -0.573 +14 -0.561 +15 -0.547 +16 -0.532 +17 -0.517 +18 -0.500 +19 -0.484 +20 -0.466 +21 -0.448 +22 -0.429 +23 -0.411 +24 -0.391 +25 -0.372 +26 -0.352 +27 -0.332 +28 -0.312 +29 -0.292 +30 -0.272 +31 -0.252 +32 -0.232 +33 -0.212 +34 -0.193 +35 -0.174 +36 -0.155 +37 -0.136 +38 -0.117 +39 -0.099 +40 -0.082 +41 -0.064 +42 -0.048 +43 -0.031 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.043 +49 0.056 +50 0.069 +51 0.081 +52 0.093 +53 0.104 +54 0.115 +55 0.125 +56 0.134 +57 0.143 +58 0.152 +59 0.160 +60 0.168 +61 0.175 +62 0.182 +63 0.188 +64 0.194 +65 0.200 +66 0.205 +67 0.211 +68 0.216 +69 0.220 +70 0.225 +71 0.230 +72 0.234 +73 0.239 +74 0.243 +75 0.248 +76 0.253 +77 0.258 +78 0.263 +79 0.269 +80 0.275 +81 0.282 +82 0.289 +83 0.297 +84 0.305 +85 0.315 +86 0.325 +87 0.336 +88 0.348 +89 0.362 +90 0.376 +1 -0.841 +2 -0.861 +3 -0.877 +4 -0.890 +5 -0.899 +6 -0.905 +7 -0.907 +8 -0.907 +9 -0.903 +10 -0.897 +11 -0.889 +12 -0.878 +13 -0.865 +14 -0.849 +15 -0.832 +16 -0.814 +17 -0.793 +18 -0.771 +19 -0.748 +20 -0.724 +21 -0.698 +22 -0.671 +23 -0.644 +24 -0.616 +25 -0.587 +26 -0.557 +27 -0.527 +28 -0.497 +29 -0.467 +30 -0.436 +31 -0.405 +32 -0.374 +33 -0.344 +34 -0.313 +35 -0.282 +36 -0.252 +37 -0.222 +38 -0.193 +39 -0.164 +40 -0.135 +41 -0.107 +42 -0.079 +43 -0.052 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.073 +49 0.096 +50 0.119 +51 0.140 +52 0.161 +53 0.181 +54 0.201 +55 0.219 +56 0.238 +57 0.255 +58 0.272 +59 0.288 +60 0.304 +61 0.319 +62 0.333 +63 0.347 +64 0.361 +65 0.374 +66 0.387 +67 0.400 +68 0.413 +69 0.425 +70 0.438 +71 0.451 +72 0.463 +73 0.476 +74 0.489 +75 0.503 +76 0.517 +77 0.531 +78 0.547 +79 0.563 +80 0.580 +81 0.598 +82 0.617 +83 0.637 +84 0.659 +85 0.682 +86 0.707 +87 0.734 +88 0.762 +89 0.793 +90 0.826 +1 -1.028 +2 -1.060 +3 -1.086 +4 -1.107 +5 -1.123 +6 -1.135 +7 -1.142 +8 -1.145 +9 -1.144 +10 -1.139 +11 -1.131 +12 -1.120 +13 -1.106 +14 -1.089 +15 -1.069 +16 -1.047 +17 -1.022 +18 -0.996 +19 -0.967 +20 -0.937 +21 -0.905 +22 -0.872 +23 -0.837 +24 -0.802 +25 -0.765 +26 -0.728 +27 -0.690 +28 -0.651 +29 -0.612 +30 -0.572 +31 -0.532 +32 -0.492 +33 -0.452 +34 -0.412 +35 -0.373 +36 -0.333 +37 -0.294 +38 -0.255 +39 -0.217 +40 -0.179 +41 -0.142 +42 -0.105 +43 -0.070 +44 -0.034 +45 0.000 +46 0.034 +47 0.066 +48 0.098 +49 0.129 +50 0.160 +51 0.189 +52 0.218 +53 0.245 +54 0.272 +55 0.298 +56 0.323 +57 0.348 +58 0.371 +59 0.394 +60 0.416 +61 0.438 +62 0.459 +63 0.479 +64 0.500 +65 0.519 +66 0.539 +67 0.558 +68 0.577 +69 0.596 +70 0.615 +71 0.634 +72 0.654 +73 0.674 +74 0.694 +75 0.715 +76 0.736 +77 0.759 +78 0.783 +79 0.807 +80 0.833 +81 0.861 +82 0.890 +83 0.921 +84 0.954 +85 0.989 +86 1.026 +87 1.066 +88 1.108 +89 1.154 +90 1.202 +1 -1.174 +2 -1.214 +3 -1.248 +4 -1.276 +5 -1.298 +6 -1.314 +7 -1.325 +8 -1.332 +9 -1.333 +10 -1.330 +11 -1.322 +12 -1.311 +13 -1.296 +14 -1.277 +15 -1.256 +16 -1.231 +17 -1.203 +18 -1.173 +19 -1.140 +20 -1.106 +21 -1.069 +22 -1.031 +23 -0.991 +24 -0.949 +25 -0.906 +26 -0.863 +27 -0.818 +28 -0.773 +29 -0.727 +30 -0.680 +31 -0.633 +32 -0.586 +33 -0.539 +34 -0.492 +35 -0.445 +36 -0.398 +37 -0.351 +38 -0.305 +39 -0.260 +40 -0.214 +41 -0.170 +42 -0.126 +43 -0.083 +44 -0.041 +45 0.000 +46 0.040 +47 0.080 +48 0.118 +49 0.156 +50 0.193 +51 0.228 +52 0.263 +53 0.297 +54 0.329 +55 0.361 +56 0.392 +57 0.422 +58 0.451 +59 0.479 +60 0.507 +61 0.534 +62 0.560 +63 0.586 +64 0.611 +65 0.636 +66 0.661 +67 0.685 +68 0.709 +69 0.734 +70 0.758 +71 0.783 +72 0.808 +73 0.833 +74 0.859 +75 0.886 +76 0.914 +77 0.943 +78 0.974 +79 1.006 +80 1.039 +81 1.074 +82 1.111 +83 1.151 +84 1.193 +85 1.237 +86 1.285 +87 1.335 +88 1.389 +89 1.446 +90 1.507 +1 -1.268 +2 -1.315 +3 -1.354 +4 -1.387 +5 -1.413 +6 -1.433 +7 -1.447 +8 -1.455 +9 -1.458 +10 -1.455 +11 -1.449 +12 -1.437 +13 -1.422 +14 -1.402 +15 -1.379 +16 -1.353 +17 -1.323 +18 -1.291 +19 -1.255 +20 -1.218 +21 -1.178 +22 -1.136 +23 -1.092 +24 -1.047 +25 -1.001 +26 -0.953 +27 -0.904 +28 -0.854 +29 -0.803 +30 -0.752 +31 -0.700 +32 -0.649 +33 -0.597 +34 -0.544 +35 -0.493 +36 -0.441 +37 -0.389 +38 -0.338 +39 -0.288 +40 -0.238 +41 -0.189 +42 -0.140 +43 -0.093 +44 -0.046 +45 0.000 +46 0.045 +47 0.089 +48 0.132 +49 0.174 +50 0.215 +51 0.255 +52 0.293 +53 0.331 +54 0.368 +55 0.403 +56 0.438 +57 0.472 +58 0.505 +59 0.537 +60 0.568 +61 0.599 +62 0.629 +63 0.658 +64 0.687 +65 0.715 +66 0.743 +67 0.771 +68 0.799 +69 0.827 +70 0.855 +71 0.883 +72 0.912 +73 0.942 +74 0.972 +75 1.003 +76 1.035 +77 1.069 +78 1.104 +79 1.141 +80 1.179 +81 1.220 +82 1.262 +83 1.308 +84 1.356 +85 1.407 +86 1.461 +87 1.519 +88 1.580 +89 1.645 +90 1.715 +1 -1.311 +2 -1.361 +3 -1.403 +4 -1.438 +5 -1.466 +6 -1.487 +7 -1.503 +8 -1.512 +9 -1.516 +10 -1.514 +11 -1.508 +12 -1.496 +13 -1.481 +14 -1.461 +15 -1.437 +16 -1.410 +17 -1.380 +18 -1.346 +19 -1.310 +20 -1.271 +21 -1.229 +22 -1.186 +23 -1.141 +24 -1.093 +25 -1.045 +26 -0.995 +27 -0.944 +28 -0.892 +29 -0.839 +30 -0.786 +31 -0.732 +32 -0.678 +33 -0.624 +34 -0.569 +35 -0.515 +36 -0.461 +37 -0.407 +38 -0.354 +39 -0.301 +40 -0.249 +41 -0.198 +42 -0.147 +43 -0.097 +44 -0.048 +45 0.000 +46 0.047 +47 0.093 +48 0.138 +49 0.182 +50 0.225 +51 0.267 +52 0.308 +53 0.347 +54 0.386 +55 0.423 +56 0.460 +57 0.495 +58 0.530 +59 0.564 +60 0.597 +61 0.629 +62 0.660 +63 0.691 +64 0.722 +65 0.752 +66 0.782 +67 0.811 +68 0.841 +69 0.870 +70 0.900 +71 0.930 +72 0.961 +73 0.992 +74 1.024 +75 1.057 +76 1.091 +77 1.127 +78 1.164 +79 1.203 +80 1.244 +81 1.287 +82 1.332 +83 1.380 +84 1.431 +85 1.485 +86 1.542 +87 1.603 +88 1.668 +89 1.737 +90 1.811 +1 -1.310 +2 -1.360 +3 -1.401 +4 -1.436 +5 -1.464 +6 -1.485 +7 -1.500 +8 -1.509 +9 -1.513 +10 -1.511 +11 -1.505 +12 -1.493 +13 -1.478 +14 -1.458 +15 -1.434 +16 -1.407 +17 -1.376 +18 -1.343 +19 -1.307 +20 -1.268 +21 -1.226 +22 -1.183 +23 -1.138 +24 -1.091 +25 -1.042 +26 -0.993 +27 -0.942 +28 -0.890 +29 -0.837 +30 -0.784 +31 -0.730 +32 -0.676 +33 -0.622 +34 -0.568 +35 -0.514 +36 -0.460 +37 -0.406 +38 -0.353 +39 -0.301 +40 -0.249 +41 -0.197 +42 -0.147 +43 -0.097 +44 -0.048 +45 0.000 +46 0.047 +47 0.093 +48 0.138 +49 0.182 +50 0.225 +51 0.266 +52 0.307 +53 0.346 +54 0.385 +55 0.422 +56 0.459 +57 0.494 +58 0.529 +59 0.562 +60 0.595 +61 0.627 +62 0.659 +63 0.690 +64 0.720 +65 0.750 +66 0.780 +67 0.809 +68 0.839 +69 0.868 +70 0.898 +71 0.928 +72 0.959 +73 0.990 +74 1.022 +75 1.055 +76 1.089 +77 1.124 +78 1.162 +79 1.200 +80 1.241 +81 1.284 +82 1.329 +83 1.377 +84 1.428 +85 1.482 +86 1.539 +87 1.600 +88 1.665 +89 1.734 +90 1.807 +1 -1.270 +2 -1.317 +3 -1.356 +4 -1.389 +5 -1.415 +6 -1.435 +7 -1.449 +8 -1.457 +9 -1.460 +10 -1.458 +11 -1.451 +12 -1.439 +13 -1.424 +14 -1.404 +15 -1.381 +16 -1.355 +17 -1.325 +18 -1.293 +19 -1.257 +20 -1.220 +21 -1.180 +22 -1.138 +23 -1.094 +24 -1.049 +25 -1.002 +26 -0.954 +27 -0.905 +28 -0.855 +29 -0.804 +30 -0.753 +31 -0.701 +32 -0.649 +33 -0.597 +34 -0.545 +35 -0.493 +36 -0.441 +37 -0.390 +38 -0.339 +39 -0.288 +40 -0.238 +41 -0.189 +42 -0.141 +43 -0.093 +44 -0.046 +45 0.000 +46 0.045 +47 0.089 +48 0.132 +49 0.174 +50 0.215 +51 0.255 +52 0.294 +53 0.331 +54 0.368 +55 0.404 +56 0.438 +57 0.472 +58 0.505 +59 0.537 +60 0.568 +61 0.599 +62 0.629 +63 0.658 +64 0.687 +65 0.715 +66 0.743 +67 0.771 +68 0.799 +69 0.827 +70 0.855 +71 0.883 +72 0.912 +73 0.942 +74 0.972 +75 1.003 +76 1.035 +77 1.069 +78 1.104 +79 1.140 +80 1.179 +81 1.219 +82 1.262 +83 1.308 +84 1.356 +85 1.407 +86 1.461 +87 1.519 +88 1.580 +89 1.645 +90 1.715 +1 -1.175 +2 -1.216 +3 -1.250 +4 -1.278 +5 -1.300 +6 -1.316 +7 -1.328 +8 -1.334 +9 -1.335 +10 -1.332 +11 -1.324 +12 -1.313 +13 -1.298 +14 -1.279 +15 -1.257 +16 -1.233 +17 -1.205 +18 -1.175 +19 -1.142 +20 -1.107 +21 -1.071 +22 -1.032 +23 -0.992 +24 -0.951 +25 -0.908 +26 -0.864 +27 -0.819 +28 -0.774 +29 -0.728 +30 -0.681 +31 -0.634 +32 -0.587 +33 -0.540 +34 -0.492 +35 -0.445 +36 -0.398 +37 -0.352 +38 -0.306 +39 -0.260 +40 -0.215 +41 -0.170 +42 -0.127 +43 -0.084 +44 -0.041 +45 0.000 +46 0.040 +47 0.080 +48 0.119 +49 0.156 +50 0.193 +51 0.229 +52 0.263 +53 0.297 +54 0.330 +55 0.362 +56 0.392 +57 0.423 +58 0.452 +59 0.480 +60 0.508 +61 0.535 +62 0.561 +63 0.587 +64 0.612 +65 0.637 +66 0.662 +67 0.686 +68 0.710 +69 0.735 +70 0.759 +71 0.784 +72 0.809 +73 0.834 +74 0.860 +75 0.887 +76 0.915 +77 0.945 +78 0.975 +79 1.007 +80 1.040 +81 1.075 +82 1.113 +83 1.152 +84 1.194 +85 1.238 +86 1.286 +87 1.336 +88 1.390 +89 1.447 +90 1.508 +1 -1.031 +2 -1.062 +3 -1.088 +4 -1.109 +5 -1.125 +6 -1.136 +7 -1.143 +8 -1.146 +9 -1.145 +10 -1.141 +11 -1.132 +12 -1.121 +13 -1.107 +14 -1.089 +15 -1.070 +16 -1.047 +17 -1.023 +18 -0.996 +19 -0.968 +20 -0.937 +21 -0.905 +22 -0.872 +23 -0.838 +24 -0.802 +25 -0.765 +26 -0.728 +27 -0.690 +28 -0.651 +29 -0.612 +30 -0.572 +31 -0.532 +32 -0.492 +33 -0.452 +34 -0.412 +35 -0.373 +36 -0.333 +37 -0.294 +38 -0.255 +39 -0.217 +40 -0.179 +41 -0.142 +42 -0.105 +43 -0.070 +44 -0.034 +45 0.000 +46 0.034 +47 0.066 +48 0.098 +49 0.129 +50 0.160 +51 0.189 +52 0.218 +53 0.245 +54 0.272 +55 0.298 +56 0.323 +57 0.347 +58 0.371 +59 0.394 +60 0.416 +61 0.438 +62 0.459 +63 0.479 +64 0.500 +65 0.519 +66 0.539 +67 0.558 +68 0.577 +69 0.596 +70 0.615 +71 0.634 +72 0.654 +73 0.674 +74 0.694 +75 0.715 +76 0.737 +77 0.759 +78 0.783 +79 0.807 +80 0.833 +81 0.861 +82 0.890 +83 0.921 +84 0.954 +85 0.989 +86 1.026 +87 1.066 +88 1.108 +89 1.154 +90 1.202 +1 -0.847 +2 -0.867 +3 -0.883 +4 -0.896 +5 -0.905 +6 -0.911 +7 -0.913 +8 -0.913 +9 -0.909 +10 -0.903 +11 -0.894 +12 -0.883 +13 -0.870 +14 -0.855 +15 -0.838 +16 -0.819 +17 -0.798 +18 -0.776 +19 -0.753 +20 -0.728 +21 -0.703 +22 -0.676 +23 -0.648 +24 -0.620 +25 -0.591 +26 -0.561 +27 -0.531 +28 -0.501 +29 -0.470 +30 -0.439 +31 -0.408 +32 -0.377 +33 -0.346 +34 -0.315 +35 -0.284 +36 -0.254 +37 -0.224 +38 -0.194 +39 -0.165 +40 -0.136 +41 -0.108 +42 -0.080 +43 -0.053 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.074 +49 0.097 +50 0.120 +51 0.141 +52 0.162 +53 0.183 +54 0.202 +55 0.221 +56 0.239 +57 0.257 +58 0.274 +59 0.290 +60 0.306 +61 0.321 +62 0.336 +63 0.350 +64 0.364 +65 0.378 +66 0.391 +67 0.404 +68 0.417 +69 0.429 +70 0.442 +71 0.455 +72 0.468 +73 0.481 +74 0.494 +75 0.508 +76 0.522 +77 0.537 +78 0.552 +79 0.568 +80 0.585 +81 0.604 +82 0.623 +83 0.643 +84 0.665 +85 0.689 +86 0.714 +87 0.741 +88 0.770 +89 0.801 +90 0.834 +1 -0.614 +2 -0.621 +3 -0.626 +4 -0.628 +5 -0.629 +6 -0.628 +7 -0.625 +8 -0.620 +9 -0.614 +10 -0.606 +11 -0.597 +12 -0.586 +13 -0.575 +14 -0.562 +15 -0.548 +16 -0.534 +17 -0.518 +18 -0.502 +19 -0.485 +20 -0.468 +21 -0.449 +22 -0.431 +23 -0.412 +24 -0.393 +25 -0.373 +26 -0.353 +27 -0.333 +28 -0.313 +29 -0.293 +30 -0.273 +31 -0.253 +32 -0.233 +33 -0.213 +34 -0.194 +35 -0.174 +36 -0.155 +37 -0.136 +38 -0.118 +39 -0.100 +40 -0.082 +41 -0.065 +42 -0.048 +43 -0.031 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.043 +49 0.057 +50 0.069 +51 0.082 +52 0.093 +53 0.105 +54 0.115 +55 0.125 +56 0.135 +57 0.144 +58 0.153 +59 0.161 +60 0.168 +61 0.176 +62 0.183 +63 0.189 +64 0.195 +65 0.201 +66 0.206 +67 0.212 +68 0.217 +69 0.221 +70 0.226 +71 0.231 +72 0.235 +73 0.240 +74 0.244 +75 0.249 +76 0.254 +77 0.259 +78 0.264 +79 0.270 +80 0.276 +81 0.283 +82 0.290 +83 0.298 +84 0.306 +85 0.316 +86 0.326 +87 0.337 +88 0.349 +89 0.363 +90 0.377 +1 -0.376 +2 -0.369 +3 -0.361 +4 -0.353 +5 -0.345 +6 -0.336 +7 -0.327 +8 -0.318 +9 -0.309 +10 -0.299 +11 -0.290 +12 -0.280 +13 -0.270 +14 -0.259 +15 -0.249 +16 -0.239 +17 -0.229 +18 -0.218 +19 -0.208 +20 -0.198 +21 -0.187 +22 -0.177 +23 -0.167 +24 -0.157 +25 -0.148 +26 -0.138 +27 -0.128 +28 -0.119 +29 -0.110 +30 -0.101 +31 -0.092 +32 -0.084 +33 -0.076 +34 -0.068 +35 -0.060 +36 -0.053 +37 -0.046 +38 -0.039 +39 -0.032 +40 -0.026 +41 -0.020 +42 -0.015 +43 -0.009 +44 -0.005 +45 -0.000 +46 0.004 +47 0.008 +48 0.011 +49 0.015 +50 0.017 +51 0.020 +52 0.022 +53 0.023 +54 0.025 +55 0.026 +56 0.026 +57 0.027 +58 0.027 +59 0.026 +60 0.026 +61 0.025 +62 0.023 +63 0.022 +64 0.020 +65 0.017 +66 0.015 +67 0.012 +68 0.009 +69 0.006 +70 0.002 +71 -0.002 +72 -0.006 +73 -0.010 +74 -0.014 +75 -0.019 +76 -0.024 +77 -0.029 +78 -0.033 +79 -0.039 +80 -0.044 +81 -0.049 +82 -0.054 +83 -0.059 +84 -0.065 +85 -0.070 +86 -0.075 +87 -0.080 +88 -0.085 +89 -0.090 +90 -0.095 +1 -0.149 +2 -0.129 +3 -0.110 +4 -0.092 +5 -0.075 +6 -0.059 +7 -0.045 +8 -0.032 +9 -0.019 +10 -0.008 +11 0.002 +12 0.012 +13 0.020 +14 0.028 +15 0.035 +16 0.041 +17 0.046 +18 0.051 +19 0.055 +20 0.058 +21 0.061 +22 0.063 +23 0.065 +24 0.066 +25 0.066 +26 0.066 +27 0.066 +28 0.065 +29 0.064 +30 0.062 +31 0.060 +32 0.057 +33 0.055 +34 0.052 +35 0.048 +36 0.044 +37 0.040 +38 0.036 +39 0.032 +40 0.027 +41 0.022 +42 0.017 +43 0.011 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.019 +49 -0.025 +50 -0.032 +51 -0.039 +52 -0.046 +53 -0.053 +54 -0.061 +55 -0.068 +56 -0.076 +57 -0.084 +58 -0.092 +59 -0.101 +60 -0.109 +61 -0.118 +62 -0.127 +63 -0.136 +64 -0.146 +65 -0.156 +66 -0.166 +67 -0.176 +68 -0.187 +69 -0.198 +70 -0.209 +71 -0.221 +72 -0.233 +73 -0.245 +74 -0.258 +75 -0.271 +76 -0.285 +77 -0.299 +78 -0.314 +79 -0.329 +80 -0.345 +81 -0.361 +82 -0.378 +83 -0.396 +84 -0.414 +85 -0.433 +86 -0.453 +87 -0.474 +88 -0.495 +89 -0.517 +90 -0.540 +1 0.040 +2 0.072 +3 0.100 +4 0.126 +5 0.150 +6 0.171 +7 0.190 +8 0.207 +9 0.221 +10 0.234 +11 0.245 +12 0.254 +13 0.261 +14 0.267 +15 0.271 +16 0.273 +17 0.275 +18 0.275 +19 0.273 +20 0.271 +21 0.267 +22 0.263 +23 0.257 +24 0.251 +25 0.244 +26 0.236 +27 0.227 +28 0.217 +29 0.208 +30 0.197 +31 0.186 +32 0.175 +33 0.163 +34 0.150 +35 0.138 +36 0.125 +37 0.112 +38 0.098 +39 0.085 +40 0.071 +41 0.057 +42 0.043 +43 0.029 +44 0.014 +45 -0.000 +46 -0.014 +47 -0.029 +48 -0.043 +49 -0.058 +50 -0.072 +51 -0.087 +52 -0.102 +53 -0.116 +54 -0.131 +55 -0.146 +56 -0.161 +57 -0.175 +58 -0.190 +59 -0.205 +60 -0.220 +61 -0.236 +62 -0.251 +63 -0.267 +64 -0.282 +65 -0.298 +66 -0.315 +67 -0.331 +68 -0.348 +69 -0.365 +70 -0.383 +71 -0.401 +72 -0.420 +73 -0.439 +74 -0.459 +75 -0.479 +76 -0.500 +77 -0.522 +78 -0.545 +79 -0.569 +80 -0.593 +81 -0.619 +82 -0.646 +83 -0.673 +84 -0.703 +85 -0.733 +86 -0.765 +87 -0.798 +88 -0.833 +89 -0.869 +90 -0.907 +1 0.201 +2 0.241 +3 0.277 +4 0.310 +5 0.339 +6 0.365 +7 0.387 +8 0.406 +9 0.423 +10 0.436 +11 0.447 +12 0.456 +13 0.462 +14 0.466 +15 0.467 +16 0.467 +17 0.465 +18 0.461 +19 0.455 +20 0.447 +21 0.439 +22 0.428 +23 0.417 +24 0.404 +25 0.391 +26 0.376 +27 0.360 +28 0.344 +29 0.327 +30 0.309 +31 0.291 +32 0.272 +33 0.252 +34 0.232 +35 0.212 +36 0.191 +37 0.171 +38 0.150 +39 0.128 +40 0.107 +41 0.086 +42 0.064 +43 0.043 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.043 +48 -0.064 +49 -0.085 +50 -0.106 +51 -0.127 +52 -0.148 +53 -0.169 +54 -0.189 +55 -0.210 +56 -0.230 +57 -0.251 +58 -0.271 +59 -0.292 +60 -0.312 +61 -0.333 +62 -0.353 +63 -0.374 +64 -0.395 +65 -0.416 +66 -0.437 +67 -0.459 +68 -0.481 +69 -0.503 +70 -0.526 +71 -0.549 +72 -0.573 +73 -0.598 +74 -0.624 +75 -0.650 +76 -0.677 +77 -0.705 +78 -0.735 +79 -0.765 +80 -0.797 +81 -0.830 +82 -0.864 +83 -0.901 +84 -0.938 +85 -0.978 +86 -1.020 +87 -1.063 +88 -1.109 +89 -1.157 +90 -1.207 +1 0.317 +2 0.363 +3 0.404 +4 0.441 +5 0.474 +6 0.503 +7 0.527 +8 0.549 +9 0.566 +10 0.580 +11 0.591 +12 0.599 +13 0.604 +14 0.607 +15 0.606 +16 0.604 +17 0.599 +18 0.592 +19 0.583 +20 0.572 +21 0.560 +22 0.546 +23 0.530 +24 0.513 +25 0.495 +26 0.475 +27 0.455 +28 0.433 +29 0.411 +30 0.388 +31 0.364 +32 0.340 +33 0.315 +34 0.290 +35 0.264 +36 0.238 +37 0.212 +38 0.186 +39 0.159 +40 0.133 +41 0.106 +42 0.079 +43 0.053 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.052 +48 -0.078 +49 -0.104 +50 -0.130 +51 -0.155 +52 -0.180 +53 -0.205 +54 -0.230 +55 -0.255 +56 -0.279 +57 -0.304 +58 -0.328 +59 -0.352 +60 -0.376 +61 -0.401 +62 -0.425 +63 -0.449 +64 -0.473 +65 -0.498 +66 -0.523 +67 -0.548 +68 -0.574 +69 -0.600 +70 -0.626 +71 -0.653 +72 -0.681 +73 -0.709 +74 -0.739 +75 -0.769 +76 -0.800 +77 -0.833 +78 -0.866 +79 -0.902 +80 -0.938 +81 -0.976 +82 -1.016 +83 -1.058 +84 -1.102 +85 -1.148 +86 -1.196 +87 -1.246 +88 -1.300 +89 -1.355 +90 -1.414 +1 0.368 +2 0.417 +3 0.461 +4 0.500 +5 0.535 +6 0.565 +7 0.591 +8 0.613 +9 0.631 +10 0.646 +11 0.657 +12 0.664 +13 0.669 +14 0.671 +15 0.670 +16 0.666 +17 0.660 +18 0.652 +19 0.642 +20 0.629 +21 0.615 +22 0.599 +23 0.581 +24 0.562 +25 0.542 +26 0.520 +27 0.498 +28 0.474 +29 0.449 +30 0.424 +31 0.398 +32 0.371 +33 0.344 +34 0.316 +35 0.288 +36 0.260 +37 0.231 +38 0.202 +39 0.173 +40 0.144 +41 0.115 +42 0.086 +43 0.057 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.057 +48 -0.085 +49 -0.113 +50 -0.140 +51 -0.168 +52 -0.195 +53 -0.222 +54 -0.249 +55 -0.275 +56 -0.302 +57 -0.328 +58 -0.354 +59 -0.380 +60 -0.405 +61 -0.431 +62 -0.457 +63 -0.483 +64 -0.509 +65 -0.535 +66 -0.562 +67 -0.588 +68 -0.615 +69 -0.643 +70 -0.671 +71 -0.700 +72 -0.729 +73 -0.759 +74 -0.790 +75 -0.822 +76 -0.856 +77 -0.890 +78 -0.926 +79 -0.963 +80 -1.002 +81 -1.042 +82 -1.085 +83 -1.129 +84 -1.176 +85 -1.224 +86 -1.276 +87 -1.329 +88 -1.386 +89 -1.445 +90 -1.508 +1 1.128 +2 1.206 +3 1.276 +4 1.336 +5 1.387 +6 1.430 +7 1.465 +8 1.493 +9 1.514 +10 1.528 +11 1.535 +12 1.537 +13 1.532 +14 1.523 +15 1.508 +16 1.489 +17 1.466 +18 1.438 +19 1.406 +20 1.371 +21 1.333 +22 1.292 +23 1.248 +24 1.202 +25 1.153 +26 1.102 +27 1.050 +28 0.996 +29 0.941 +30 0.884 +31 0.826 +32 0.768 +33 0.709 +34 0.650 +35 0.590 +36 0.530 +37 0.470 +38 0.410 +39 0.350 +40 0.290 +41 0.231 +42 0.173 +43 0.114 +44 0.057 +45 -0.000 +46 -0.056 +47 -0.111 +48 -0.166 +49 -0.220 +50 -0.273 +51 -0.325 +52 -0.376 +53 -0.426 +54 -0.475 +55 -0.524 +56 -0.572 +57 -0.619 +58 -0.666 +59 -0.711 +60 -0.757 +61 -0.802 +62 -0.846 +63 -0.890 +64 -0.934 +65 -0.978 +66 -1.022 +67 -1.067 +68 -1.111 +69 -1.156 +70 -1.202 +71 -1.249 +72 -1.296 +73 -1.345 +74 -1.395 +75 -1.447 +76 -1.500 +77 -1.556 +78 -1.614 +79 -1.674 +80 -1.737 +81 -1.803 +82 -1.872 +83 -1.945 +84 -2.021 +85 -2.102 +86 -2.187 +87 -2.277 +88 -2.372 +89 -2.472 +90 -2.578 +1 1.112 +2 1.188 +3 1.254 +4 1.312 +5 1.362 +6 1.403 +7 1.437 +8 1.464 +9 1.484 +10 1.497 +11 1.504 +12 1.505 +13 1.500 +14 1.490 +15 1.476 +16 1.457 +17 1.433 +18 1.406 +19 1.375 +20 1.341 +21 1.303 +22 1.263 +23 1.219 +24 1.174 +25 1.126 +26 1.077 +27 1.025 +28 0.972 +29 0.918 +30 0.863 +31 0.807 +32 0.750 +33 0.692 +34 0.634 +35 0.576 +36 0.517 +37 0.458 +38 0.400 +39 0.341 +40 0.283 +41 0.226 +42 0.168 +43 0.112 +44 0.055 +45 -0.000 +46 -0.055 +47 -0.109 +48 -0.162 +49 -0.214 +50 -0.266 +51 -0.316 +52 -0.366 +53 -0.415 +54 -0.463 +55 -0.510 +56 -0.557 +57 -0.603 +58 -0.648 +59 -0.692 +60 -0.736 +61 -0.780 +62 -0.823 +63 -0.866 +64 -0.909 +65 -0.951 +66 -0.994 +67 -1.037 +68 -1.080 +69 -1.124 +70 -1.168 +71 -1.213 +72 -1.259 +73 -1.306 +74 -1.355 +75 -1.405 +76 -1.457 +77 -1.511 +78 -1.566 +79 -1.625 +80 -1.686 +81 -1.750 +82 -1.817 +83 -1.887 +84 -1.961 +85 -2.040 +86 -2.122 +87 -2.209 +88 -2.301 +89 -2.398 +90 -2.501 +1 0.936 +2 1.005 +3 1.066 +4 1.119 +5 1.164 +6 1.202 +7 1.234 +8 1.259 +9 1.278 +10 1.291 +11 1.299 +12 1.301 +13 1.299 +14 1.291 +15 1.280 +16 1.264 +17 1.245 +18 1.222 +19 1.196 +20 1.167 +21 1.135 +22 1.100 +23 1.063 +24 1.024 +25 0.983 +26 0.940 +27 0.896 +28 0.850 +29 0.803 +30 0.755 +31 0.706 +32 0.656 +33 0.606 +34 0.556 +35 0.505 +36 0.453 +37 0.402 +38 0.351 +39 0.300 +40 0.249 +41 0.198 +42 0.148 +43 0.098 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.096 +48 -0.143 +49 -0.189 +50 -0.234 +51 -0.279 +52 -0.323 +53 -0.367 +54 -0.409 +55 -0.451 +56 -0.493 +57 -0.533 +58 -0.574 +59 -0.613 +60 -0.653 +61 -0.692 +62 -0.730 +63 -0.769 +64 -0.807 +65 -0.846 +66 -0.884 +67 -0.923 +68 -0.962 +69 -1.001 +70 -1.041 +71 -1.082 +72 -1.123 +73 -1.166 +74 -1.210 +75 -1.255 +76 -1.302 +77 -1.351 +78 -1.401 +79 -1.454 +80 -1.509 +81 -1.567 +82 -1.628 +83 -1.691 +84 -1.758 +85 -1.829 +86 -1.903 +87 -1.982 +88 -2.064 +89 -2.152 +90 -2.244 +1 0.764 +2 0.824 +3 0.877 +4 0.923 +5 0.963 +6 0.997 +7 1.025 +8 1.047 +9 1.064 +10 1.076 +11 1.084 +12 1.087 +13 1.086 +14 1.081 +15 1.072 +16 1.060 +17 1.044 +18 1.026 +19 1.004 +20 0.980 +21 0.954 +22 0.925 +23 0.895 +24 0.862 +25 0.828 +26 0.792 +27 0.755 +28 0.717 +29 0.677 +30 0.637 +31 0.596 +32 0.554 +33 0.512 +34 0.469 +35 0.426 +36 0.383 +37 0.340 +38 0.297 +39 0.254 +40 0.211 +41 0.168 +42 0.125 +43 0.083 +44 0.041 +45 -0.000 +46 -0.041 +47 -0.081 +48 -0.121 +49 -0.160 +50 -0.199 +51 -0.237 +52 -0.275 +53 -0.312 +54 -0.348 +55 -0.384 +56 -0.420 +57 -0.455 +58 -0.489 +59 -0.523 +60 -0.557 +61 -0.591 +62 -0.624 +63 -0.657 +64 -0.690 +65 -0.724 +66 -0.757 +67 -0.790 +68 -0.824 +69 -0.858 +70 -0.893 +71 -0.928 +72 -0.965 +73 -1.002 +74 -1.040 +75 -1.079 +76 -1.120 +77 -1.162 +78 -1.206 +79 -1.252 +80 -1.300 +81 -1.350 +82 -1.403 +83 -1.458 +84 -1.516 +85 -1.577 +86 -1.641 +87 -1.709 +88 -1.781 +89 -1.856 +90 -1.936 +1 0.509 +2 0.554 +3 0.593 +4 0.627 +5 0.657 +6 0.682 +7 0.704 +8 0.721 +9 0.735 +10 0.744 +11 0.751 +12 0.754 +13 0.755 +14 0.752 +15 0.747 +16 0.739 +17 0.729 +18 0.717 +19 0.703 +20 0.686 +21 0.668 +22 0.649 +23 0.628 +24 0.605 +25 0.582 +26 0.557 +27 0.531 +28 0.505 +29 0.477 +30 0.449 +31 0.420 +32 0.391 +33 0.361 +34 0.332 +35 0.301 +36 0.271 +37 0.241 +38 0.210 +39 0.180 +40 0.149 +41 0.119 +42 0.089 +43 0.059 +44 0.029 +45 -0.000 +46 -0.029 +47 -0.058 +48 -0.086 +49 -0.114 +50 -0.142 +51 -0.169 +52 -0.196 +53 -0.222 +54 -0.249 +55 -0.274 +56 -0.300 +57 -0.325 +58 -0.350 +59 -0.374 +60 -0.399 +61 -0.423 +62 -0.447 +63 -0.471 +64 -0.495 +65 -0.519 +66 -0.544 +67 -0.568 +68 -0.593 +69 -0.618 +70 -0.643 +71 -0.669 +72 -0.695 +73 -0.723 +74 -0.750 +75 -0.779 +76 -0.809 +77 -0.840 +78 -0.872 +79 -0.906 +80 -0.941 +81 -0.978 +82 -1.016 +83 -1.057 +84 -1.099 +85 -1.144 +86 -1.191 +87 -1.240 +88 -1.293 +89 -1.348 +90 -1.406 +1 0.026 +2 0.043 +3 0.058 +4 0.072 +5 0.085 +6 0.096 +7 0.106 +8 0.115 +9 0.123 +10 0.130 +11 0.135 +12 0.140 +13 0.144 +14 0.147 +15 0.149 +16 0.150 +17 0.151 +18 0.150 +19 0.150 +20 0.148 +21 0.146 +22 0.143 +23 0.140 +24 0.137 +25 0.133 +26 0.128 +27 0.123 +28 0.118 +29 0.113 +30 0.107 +31 0.101 +32 0.095 +33 0.088 +34 0.081 +35 0.075 +36 0.068 +37 0.060 +38 0.053 +39 0.046 +40 0.038 +41 0.031 +42 0.023 +43 0.015 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.023 +49 -0.031 +50 -0.039 +51 -0.047 +52 -0.055 +53 -0.062 +54 -0.070 +55 -0.078 +56 -0.086 +57 -0.094 +58 -0.102 +59 -0.110 +60 -0.118 +61 -0.126 +62 -0.134 +63 -0.142 +64 -0.151 +65 -0.159 +66 -0.168 +67 -0.177 +68 -0.185 +69 -0.195 +70 -0.204 +71 -0.214 +72 -0.224 +73 -0.234 +74 -0.244 +75 -0.255 +76 -0.266 +77 -0.278 +78 -0.290 +79 -0.303 +80 -0.316 +81 -0.330 +82 -0.344 +83 -0.359 +84 -0.374 +85 -0.390 +86 -0.407 +87 -0.425 +88 -0.444 +89 -0.464 +90 -0.484 +1 -0.490 +2 -0.504 +3 -0.515 +4 -0.524 +5 -0.531 +6 -0.536 +7 -0.538 +8 -0.539 +9 -0.538 +10 -0.536 +11 -0.531 +12 -0.526 +13 -0.519 +14 -0.510 +15 -0.501 +16 -0.490 +17 -0.478 +18 -0.465 +19 -0.452 +20 -0.437 +21 -0.422 +22 -0.407 +23 -0.390 +24 -0.374 +25 -0.356 +26 -0.339 +27 -0.321 +28 -0.303 +29 -0.284 +30 -0.266 +31 -0.247 +32 -0.229 +33 -0.210 +34 -0.192 +35 -0.173 +36 -0.155 +37 -0.136 +38 -0.118 +39 -0.101 +40 -0.083 +41 -0.066 +42 -0.049 +43 -0.032 +44 -0.016 +45 0.000 +46 0.016 +47 0.031 +48 0.045 +49 0.060 +50 0.074 +51 0.087 +52 0.100 +53 0.113 +54 0.125 +55 0.137 +56 0.149 +57 0.160 +58 0.171 +59 0.181 +60 0.191 +61 0.201 +62 0.210 +63 0.220 +64 0.229 +65 0.237 +66 0.246 +67 0.255 +68 0.263 +69 0.272 +70 0.280 +71 0.288 +72 0.297 +73 0.306 +74 0.315 +75 0.324 +76 0.333 +77 0.343 +78 0.354 +79 0.365 +80 0.376 +81 0.388 +82 0.401 +83 0.415 +84 0.429 +85 0.444 +86 0.461 +87 0.479 +88 0.497 +89 0.517 +90 0.539 +1 -0.915 +2 -0.957 +3 -0.992 +4 -1.022 +5 -1.047 +6 -1.067 +7 -1.081 +8 -1.092 +9 -1.098 +10 -1.099 +11 -1.097 +12 -1.092 +13 -1.082 +14 -1.070 +15 -1.055 +16 -1.036 +17 -1.016 +18 -0.992 +19 -0.967 +20 -0.940 +21 -0.910 +22 -0.879 +23 -0.847 +24 -0.813 +25 -0.777 +26 -0.741 +27 -0.704 +28 -0.666 +29 -0.627 +30 -0.588 +31 -0.548 +32 -0.508 +33 -0.468 +34 -0.428 +35 -0.387 +36 -0.347 +37 -0.307 +38 -0.267 +39 -0.228 +40 -0.188 +41 -0.150 +42 -0.111 +43 -0.074 +44 -0.037 +45 0.000 +46 0.036 +47 0.071 +48 0.105 +49 0.139 +50 0.172 +51 0.204 +52 0.236 +53 0.267 +54 0.297 +55 0.326 +56 0.354 +57 0.382 +58 0.410 +59 0.436 +60 0.463 +61 0.488 +62 0.514 +63 0.539 +64 0.563 +65 0.588 +66 0.612 +67 0.636 +68 0.660 +69 0.684 +70 0.709 +71 0.734 +72 0.759 +73 0.785 +74 0.812 +75 0.839 +76 0.867 +77 0.897 +78 0.928 +79 0.960 +80 0.993 +81 1.029 +82 1.066 +83 1.105 +84 1.147 +85 1.191 +86 1.237 +87 1.287 +88 1.339 +89 1.395 +90 1.454 +1 -1.220 +2 -1.278 +3 -1.328 +4 -1.370 +5 -1.405 +6 -1.433 +7 -1.454 +8 -1.469 +9 -1.478 +10 -1.482 +11 -1.480 +12 -1.473 +13 -1.462 +14 -1.446 +15 -1.426 +16 -1.402 +17 -1.374 +18 -1.343 +19 -1.309 +20 -1.273 +21 -1.233 +22 -1.192 +23 -1.148 +24 -1.102 +25 -1.055 +26 -1.006 +27 -0.956 +28 -0.904 +29 -0.852 +30 -0.799 +31 -0.745 +32 -0.691 +33 -0.637 +34 -0.582 +35 -0.527 +36 -0.473 +37 -0.418 +38 -0.364 +39 -0.310 +40 -0.257 +41 -0.204 +42 -0.152 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.097 +48 0.144 +49 0.190 +50 0.235 +51 0.279 +52 0.323 +53 0.365 +54 0.406 +55 0.446 +56 0.486 +57 0.524 +58 0.562 +59 0.599 +60 0.635 +61 0.671 +62 0.706 +63 0.740 +64 0.775 +65 0.808 +66 0.842 +67 0.876 +68 0.910 +69 0.944 +70 0.978 +71 1.013 +72 1.048 +73 1.085 +74 1.122 +75 1.160 +76 1.200 +77 1.241 +78 1.284 +79 1.329 +80 1.376 +81 1.426 +82 1.478 +83 1.533 +84 1.591 +85 1.652 +86 1.717 +87 1.786 +88 1.859 +89 1.937 +90 2.019 +1 -1.344 +2 -1.414 +3 -1.475 +4 -1.526 +5 -1.569 +6 -1.604 +7 -1.631 +8 -1.651 +9 -1.664 +10 -1.670 +11 -1.670 +12 -1.664 +13 -1.653 +14 -1.637 +15 -1.615 +16 -1.590 +17 -1.560 +18 -1.526 +19 -1.489 +20 -1.448 +21 -1.404 +22 -1.357 +23 -1.308 +24 -1.257 +25 -1.204 +26 -1.148 +27 -1.092 +28 -1.034 +29 -0.974 +30 -0.914 +31 -0.853 +32 -0.791 +33 -0.729 +34 -0.667 +35 -0.604 +36 -0.542 +37 -0.480 +38 -0.418 +39 -0.356 +40 -0.295 +41 -0.234 +42 -0.175 +43 -0.116 +44 -0.057 +45 0.000 +46 0.056 +47 0.112 +48 0.166 +49 0.219 +50 0.272 +51 0.323 +52 0.373 +53 0.422 +54 0.470 +55 0.517 +56 0.563 +57 0.608 +58 0.652 +59 0.695 +60 0.738 +61 0.780 +62 0.821 +63 0.862 +64 0.902 +65 0.942 +66 0.982 +67 1.022 +68 1.063 +69 1.103 +70 1.144 +71 1.186 +72 1.228 +73 1.271 +74 1.316 +75 1.362 +76 1.409 +77 1.459 +78 1.510 +79 1.564 +80 1.620 +81 1.679 +82 1.741 +83 1.807 +84 1.876 +85 1.949 +86 2.027 +87 2.109 +88 2.195 +89 2.287 +90 2.385 +1 -1.399 +2 -1.475 +3 -1.542 +4 -1.598 +5 -1.646 +6 -1.685 +7 -1.715 +8 -1.738 +9 -1.753 +10 -1.762 +11 -1.763 +12 -1.758 +13 -1.748 +14 -1.731 +15 -1.710 +16 -1.683 +17 -1.653 +18 -1.618 +19 -1.579 +20 -1.536 +21 -1.490 +22 -1.441 +23 -1.390 +24 -1.336 +25 -1.279 +26 -1.221 +27 -1.161 +28 -1.100 +29 -1.037 +30 -0.973 +31 -0.908 +32 -0.843 +33 -0.777 +34 -0.711 +35 -0.644 +36 -0.578 +37 -0.512 +38 -0.446 +39 -0.380 +40 -0.315 +41 -0.250 +42 -0.187 +43 -0.124 +44 -0.061 +45 0.000 +46 0.060 +47 0.120 +48 0.178 +49 0.235 +50 0.291 +51 0.346 +52 0.400 +53 0.453 +54 0.504 +55 0.555 +56 0.604 +57 0.653 +58 0.701 +59 0.747 +60 0.793 +61 0.839 +62 0.884 +63 0.928 +64 0.972 +65 1.016 +66 1.059 +67 1.103 +68 1.147 +69 1.191 +70 1.236 +71 1.281 +72 1.328 +73 1.375 +74 1.424 +75 1.475 +76 1.527 +77 1.581 +78 1.637 +79 1.696 +80 1.758 +81 1.822 +82 1.890 +83 1.962 +84 2.038 +85 2.118 +86 2.202 +87 2.292 +88 2.386 +89 2.487 +90 2.593 +1 -1.484 +2 -1.564 +3 -1.633 +4 -1.692 +5 -1.742 +6 -1.782 +7 -1.814 +8 -1.838 +9 -1.853 +10 -1.862 +11 -1.863 +12 -1.857 +13 -1.846 +14 -1.828 +15 -1.805 +16 -1.777 +17 -1.745 +18 -1.707 +19 -1.666 +20 -1.621 +21 -1.572 +22 -1.521 +23 -1.466 +24 -1.409 +25 -1.349 +26 -1.288 +27 -1.225 +28 -1.160 +29 -1.093 +30 -1.026 +31 -0.958 +32 -0.889 +33 -0.819 +34 -0.749 +35 -0.679 +36 -0.609 +37 -0.539 +38 -0.470 +39 -0.401 +40 -0.332 +41 -0.264 +42 -0.197 +43 -0.130 +44 -0.065 +45 0.000 +46 0.064 +47 0.126 +48 0.187 +49 0.248 +50 0.307 +51 0.364 +52 0.421 +53 0.477 +54 0.531 +55 0.584 +56 0.636 +57 0.687 +58 0.738 +59 0.787 +60 0.835 +61 0.883 +62 0.930 +63 0.977 +64 1.023 +65 1.069 +66 1.115 +67 1.160 +68 1.207 +69 1.253 +70 1.300 +71 1.348 +72 1.396 +73 1.446 +74 1.497 +75 1.550 +76 1.605 +77 1.662 +78 1.721 +79 1.783 +80 1.847 +81 1.915 +82 1.987 +83 2.062 +84 2.141 +85 2.225 +86 2.314 +87 2.408 +88 2.507 +89 2.612 +90 2.724 +1 -1.495 +2 -1.575 +3 -1.644 +4 -1.703 +5 -1.753 +6 -1.793 +7 -1.825 +8 -1.848 +9 -1.864 +10 -1.872 +11 -1.873 +12 -1.867 +13 -1.855 +14 -1.837 +15 -1.814 +16 -1.786 +17 -1.753 +18 -1.715 +19 -1.674 +20 -1.628 +21 -1.579 +22 -1.527 +23 -1.472 +24 -1.415 +25 -1.355 +26 -1.293 +27 -1.230 +28 -1.164 +29 -1.098 +30 -1.030 +31 -0.961 +32 -0.892 +33 -0.822 +34 -0.752 +35 -0.682 +36 -0.611 +37 -0.541 +38 -0.471 +39 -0.402 +40 -0.333 +41 -0.265 +42 -0.197 +43 -0.131 +44 -0.065 +45 0.000 +46 0.064 +47 0.126 +48 0.188 +49 0.248 +50 0.307 +51 0.365 +52 0.422 +53 0.478 +54 0.532 +55 0.585 +56 0.638 +57 0.689 +58 0.739 +59 0.788 +60 0.837 +61 0.884 +62 0.931 +63 0.978 +64 1.024 +65 1.070 +66 1.116 +67 1.162 +68 1.208 +69 1.254 +70 1.301 +71 1.349 +72 1.397 +73 1.447 +74 1.498 +75 1.551 +76 1.605 +77 1.662 +78 1.721 +79 1.783 +80 1.847 +81 1.915 +82 1.986 +83 2.061 +84 2.141 +85 2.225 +86 2.313 +87 2.407 +88 2.506 +89 2.611 +90 2.723 +1 -1.417 +2 -1.494 +3 -1.561 +4 -1.618 +5 -1.666 +6 -1.705 +7 -1.736 +8 -1.758 +9 -1.774 +10 -1.782 +11 -1.783 +12 -1.778 +13 -1.767 +14 -1.751 +15 -1.729 +16 -1.702 +17 -1.671 +18 -1.635 +19 -1.596 +20 -1.552 +21 -1.506 +22 -1.457 +23 -1.404 +24 -1.350 +25 -1.293 +26 -1.234 +27 -1.173 +28 -1.111 +29 -1.048 +30 -0.983 +31 -0.918 +32 -0.852 +33 -0.785 +34 -0.718 +35 -0.651 +36 -0.584 +37 -0.517 +38 -0.450 +39 -0.384 +40 -0.318 +41 -0.253 +42 -0.188 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.121 +48 0.180 +49 0.237 +50 0.294 +51 0.349 +52 0.404 +53 0.457 +54 0.509 +55 0.560 +56 0.610 +57 0.659 +58 0.707 +59 0.754 +60 0.800 +61 0.846 +62 0.891 +63 0.936 +64 0.980 +65 1.024 +66 1.068 +67 1.112 +68 1.156 +69 1.201 +70 1.246 +71 1.292 +72 1.338 +73 1.386 +74 1.435 +75 1.486 +76 1.538 +77 1.593 +78 1.650 +79 1.709 +80 1.771 +81 1.836 +82 1.905 +83 1.977 +84 2.053 +85 2.133 +86 2.218 +87 2.309 +88 2.404 +89 2.505 +90 2.612 +1 -1.359 +2 -1.428 +3 -1.488 +4 -1.539 +5 -1.581 +6 -1.615 +7 -1.642 +8 -1.661 +9 -1.673 +10 -1.679 +11 -1.679 +12 -1.673 +13 -1.661 +14 -1.644 +15 -1.622 +16 -1.596 +17 -1.566 +18 -1.532 +19 -1.494 +20 -1.453 +21 -1.409 +22 -1.362 +23 -1.312 +24 -1.261 +25 -1.207 +26 -1.151 +27 -1.094 +28 -1.036 +29 -0.976 +30 -0.916 +31 -0.855 +32 -0.793 +33 -0.731 +34 -0.668 +35 -0.606 +36 -0.543 +37 -0.480 +38 -0.418 +39 -0.357 +40 -0.295 +41 -0.235 +42 -0.175 +43 -0.116 +44 -0.057 +45 0.000 +46 0.056 +47 0.112 +48 0.166 +49 0.220 +50 0.272 +51 0.323 +52 0.373 +53 0.422 +54 0.470 +55 0.517 +56 0.563 +57 0.608 +58 0.652 +59 0.695 +60 0.737 +61 0.779 +62 0.820 +63 0.861 +64 0.901 +65 0.941 +66 0.981 +67 1.021 +68 1.061 +69 1.101 +70 1.142 +71 1.183 +72 1.225 +73 1.269 +74 1.313 +75 1.359 +76 1.406 +77 1.455 +78 1.506 +79 1.560 +80 1.616 +81 1.674 +82 1.736 +83 1.802 +84 1.870 +85 1.943 +86 2.020 +87 2.102 +88 2.188 +89 2.280 +90 2.377 +1 -1.216 +2 -1.275 +3 -1.326 +4 -1.369 +5 -1.405 +6 -1.434 +7 -1.456 +8 -1.472 +9 -1.481 +10 -1.485 +11 -1.484 +12 -1.478 +13 -1.466 +14 -1.451 +15 -1.431 +16 -1.407 +17 -1.380 +18 -1.349 +19 -1.316 +20 -1.279 +21 -1.240 +22 -1.198 +23 -1.154 +24 -1.108 +25 -1.061 +26 -1.012 +27 -0.961 +28 -0.910 +29 -0.857 +30 -0.804 +31 -0.750 +32 -0.696 +33 -0.641 +34 -0.586 +35 -0.531 +36 -0.476 +37 -0.421 +38 -0.366 +39 -0.312 +40 -0.259 +41 -0.205 +42 -0.153 +43 -0.101 +44 -0.050 +45 0.000 +46 0.049 +47 0.098 +48 0.145 +49 0.192 +50 0.237 +51 0.282 +52 0.325 +53 0.368 +54 0.410 +55 0.450 +56 0.490 +57 0.529 +58 0.567 +59 0.605 +60 0.641 +61 0.677 +62 0.713 +63 0.748 +64 0.783 +65 0.817 +66 0.851 +67 0.885 +68 0.920 +69 0.954 +70 0.989 +71 1.024 +72 1.060 +73 1.097 +74 1.135 +75 1.174 +76 1.214 +77 1.256 +78 1.300 +79 1.345 +80 1.393 +81 1.443 +82 1.496 +83 1.552 +84 1.611 +85 1.673 +86 1.739 +87 1.809 +88 1.883 +89 1.962 +90 2.045 +1 -0.925 +2 -0.967 +3 -1.003 +4 -1.034 +5 -1.059 +6 -1.079 +7 -1.094 +8 -1.105 +9 -1.111 +10 -1.113 +11 -1.111 +12 -1.105 +13 -1.096 +14 -1.083 +15 -1.068 +16 -1.050 +17 -1.029 +18 -1.005 +19 -0.980 +20 -0.952 +21 -0.922 +22 -0.891 +23 -0.858 +24 -0.823 +25 -0.788 +26 -0.751 +27 -0.713 +28 -0.675 +29 -0.636 +30 -0.596 +31 -0.556 +32 -0.515 +33 -0.475 +34 -0.434 +35 -0.393 +36 -0.352 +37 -0.311 +38 -0.271 +39 -0.231 +40 -0.191 +41 -0.152 +42 -0.113 +43 -0.075 +44 -0.037 +45 0.000 +46 0.036 +47 0.072 +48 0.107 +49 0.141 +50 0.175 +51 0.207 +52 0.239 +53 0.271 +54 0.301 +55 0.331 +56 0.360 +57 0.388 +58 0.416 +59 0.443 +60 0.470 +61 0.496 +62 0.522 +63 0.547 +64 0.572 +65 0.597 +66 0.622 +67 0.647 +68 0.671 +69 0.696 +70 0.721 +71 0.746 +72 0.772 +73 0.799 +74 0.826 +75 0.854 +76 0.883 +77 0.913 +78 0.944 +79 0.977 +80 1.011 +81 1.047 +82 1.085 +83 1.125 +84 1.167 +85 1.212 +86 1.259 +87 1.310 +88 1.363 +89 1.420 +90 1.480 +1 -0.499 +2 -0.514 +3 -0.526 +4 -0.536 +5 -0.543 +6 -0.548 +7 -0.551 +8 -0.553 +9 -0.552 +10 -0.550 +11 -0.546 +12 -0.540 +13 -0.533 +14 -0.525 +15 -0.515 +16 -0.504 +17 -0.492 +18 -0.479 +19 -0.466 +20 -0.451 +21 -0.436 +22 -0.419 +23 -0.403 +24 -0.386 +25 -0.368 +26 -0.350 +27 -0.332 +28 -0.313 +29 -0.294 +30 -0.275 +31 -0.256 +32 -0.237 +33 -0.217 +34 -0.198 +35 -0.179 +36 -0.160 +37 -0.141 +38 -0.123 +39 -0.104 +40 -0.086 +41 -0.068 +42 -0.051 +43 -0.033 +44 -0.017 +45 0.000 +46 0.016 +47 0.032 +48 0.047 +49 0.062 +50 0.077 +51 0.091 +52 0.104 +53 0.118 +54 0.131 +55 0.143 +56 0.155 +57 0.167 +58 0.178 +59 0.189 +60 0.200 +61 0.210 +62 0.220 +63 0.230 +64 0.239 +65 0.249 +66 0.258 +67 0.267 +68 0.276 +69 0.285 +70 0.294 +71 0.303 +72 0.312 +73 0.322 +74 0.331 +75 0.341 +76 0.351 +77 0.362 +78 0.373 +79 0.384 +80 0.397 +81 0.409 +82 0.423 +83 0.437 +84 0.453 +85 0.469 +86 0.487 +87 0.505 +88 0.525 +89 0.546 +90 0.569 +1 -0.005 +2 0.011 +3 0.025 +4 0.038 +5 0.050 +6 0.061 +7 0.070 +8 0.079 +9 0.087 +10 0.093 +11 0.099 +12 0.104 +13 0.108 +14 0.112 +15 0.114 +16 0.116 +17 0.117 +18 0.118 +19 0.118 +20 0.117 +21 0.116 +22 0.115 +23 0.113 +24 0.110 +25 0.107 +26 0.104 +27 0.101 +28 0.097 +29 0.092 +30 0.088 +31 0.083 +32 0.078 +33 0.073 +34 0.068 +35 0.062 +36 0.056 +37 0.051 +38 0.045 +39 0.038 +40 0.032 +41 0.026 +42 0.020 +43 0.013 +44 0.007 +45 -0.000 +46 -0.007 +47 -0.013 +48 -0.020 +49 -0.027 +50 -0.034 +51 -0.040 +52 -0.047 +53 -0.054 +54 -0.061 +55 -0.068 +56 -0.075 +57 -0.082 +58 -0.089 +59 -0.096 +60 -0.104 +61 -0.111 +62 -0.118 +63 -0.126 +64 -0.134 +65 -0.141 +66 -0.149 +67 -0.158 +68 -0.166 +69 -0.174 +70 -0.183 +71 -0.192 +72 -0.201 +73 -0.211 +74 -0.220 +75 -0.231 +76 -0.241 +77 -0.252 +78 -0.263 +79 -0.275 +80 -0.287 +81 -0.300 +82 -0.313 +83 -0.327 +84 -0.341 +85 -0.356 +86 -0.372 +87 -0.388 +88 -0.405 +89 -0.423 +90 -0.442 +1 0.488 +2 0.531 +3 0.569 +4 0.603 +5 0.632 +6 0.657 +7 0.678 +8 0.695 +9 0.708 +10 0.718 +11 0.725 +12 0.728 +13 0.729 +14 0.726 +15 0.722 +16 0.714 +17 0.705 +18 0.693 +19 0.679 +20 0.664 +21 0.647 +22 0.628 +23 0.608 +24 0.586 +25 0.563 +26 0.539 +27 0.514 +28 0.489 +29 0.462 +30 0.435 +31 0.407 +32 0.379 +33 0.350 +34 0.321 +35 0.292 +36 0.263 +37 0.233 +38 0.204 +39 0.174 +40 0.145 +41 0.115 +42 0.086 +43 0.057 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.084 +49 -0.111 +50 -0.138 +51 -0.164 +52 -0.191 +53 -0.216 +54 -0.242 +55 -0.267 +56 -0.292 +57 -0.316 +58 -0.341 +59 -0.365 +60 -0.389 +61 -0.412 +62 -0.436 +63 -0.460 +64 -0.483 +65 -0.507 +66 -0.530 +67 -0.554 +68 -0.579 +69 -0.603 +70 -0.628 +71 -0.653 +72 -0.679 +73 -0.706 +74 -0.734 +75 -0.762 +76 -0.791 +77 -0.822 +78 -0.853 +79 -0.886 +80 -0.921 +81 -0.957 +82 -0.994 +83 -1.034 +84 -1.076 +85 -1.119 +86 -1.165 +87 -1.214 +88 -1.265 +89 -1.319 +90 -1.376 +1 0.722 +2 0.780 +3 0.832 +4 0.878 +5 0.917 +6 0.950 +7 0.978 +8 1.000 +9 1.018 +10 1.030 +11 1.038 +12 1.042 +13 1.041 +14 1.037 +15 1.029 +16 1.017 +17 1.003 +18 0.985 +19 0.965 +20 0.942 +21 0.917 +22 0.890 +23 0.861 +24 0.830 +25 0.797 +26 0.763 +27 0.727 +28 0.690 +29 0.653 +30 0.614 +31 0.575 +32 0.534 +33 0.494 +34 0.453 +35 0.412 +36 0.370 +37 0.328 +38 0.287 +39 0.245 +40 0.203 +41 0.162 +42 0.121 +43 0.080 +44 0.040 +45 -0.000 +46 -0.040 +47 -0.079 +48 -0.117 +49 -0.155 +50 -0.193 +51 -0.230 +52 -0.266 +53 -0.302 +54 -0.338 +55 -0.373 +56 -0.407 +57 -0.441 +58 -0.475 +59 -0.508 +60 -0.541 +61 -0.574 +62 -0.606 +63 -0.638 +64 -0.671 +65 -0.703 +66 -0.736 +67 -0.768 +68 -0.801 +69 -0.835 +70 -0.869 +71 -0.904 +72 -0.939 +73 -0.976 +74 -1.013 +75 -1.052 +76 -1.092 +77 -1.133 +78 -1.176 +79 -1.221 +80 -1.268 +81 -1.317 +82 -1.369 +83 -1.423 +84 -1.480 +85 -1.540 +86 -1.603 +87 -1.669 +88 -1.739 +89 -1.813 +90 -1.891 +1 0.960 +2 1.029 +3 1.090 +4 1.143 +5 1.189 +6 1.227 +7 1.259 +8 1.284 +9 1.303 +10 1.316 +11 1.323 +12 1.325 +13 1.322 +14 1.315 +15 1.303 +16 1.287 +17 1.267 +18 1.243 +19 1.217 +20 1.187 +21 1.154 +22 1.119 +23 1.081 +24 1.041 +25 0.999 +26 0.955 +27 0.910 +28 0.864 +29 0.816 +30 0.767 +31 0.717 +32 0.667 +33 0.616 +34 0.564 +35 0.512 +36 0.460 +37 0.408 +38 0.356 +39 0.304 +40 0.253 +41 0.201 +42 0.150 +43 0.100 +44 0.049 +45 -0.000 +46 -0.049 +47 -0.097 +48 -0.145 +49 -0.192 +50 -0.238 +51 -0.283 +52 -0.328 +53 -0.372 +54 -0.415 +55 -0.458 +56 -0.499 +57 -0.541 +58 -0.582 +59 -0.622 +60 -0.662 +61 -0.701 +62 -0.740 +63 -0.779 +64 -0.818 +65 -0.857 +66 -0.895 +67 -0.934 +68 -0.974 +69 -1.014 +70 -1.054 +71 -1.095 +72 -1.137 +73 -1.180 +74 -1.225 +75 -1.270 +76 -1.318 +77 -1.367 +78 -1.418 +79 -1.471 +80 -1.527 +81 -1.585 +82 -1.646 +83 -1.710 +84 -1.778 +85 -1.849 +86 -1.924 +87 -2.003 +88 -2.087 +89 -2.175 +90 -2.268 +1 1.112 +2 1.188 +3 1.254 +4 1.312 +5 1.361 +6 1.402 +7 1.436 +8 1.462 +9 1.482 +10 1.495 +11 1.501 +12 1.502 +13 1.498 +14 1.488 +15 1.473 +16 1.454 +17 1.431 +18 1.403 +19 1.372 +20 1.338 +21 1.300 +22 1.260 +23 1.217 +24 1.171 +25 1.124 +26 1.074 +27 1.023 +28 0.970 +29 0.916 +30 0.861 +31 0.805 +32 0.748 +33 0.690 +34 0.632 +35 0.574 +36 0.516 +37 0.457 +38 0.399 +39 0.340 +40 0.282 +41 0.225 +42 0.168 +43 0.111 +44 0.055 +45 -0.000 +46 -0.055 +47 -0.108 +48 -0.161 +49 -0.213 +50 -0.265 +51 -0.315 +52 -0.365 +53 -0.414 +54 -0.461 +55 -0.509 +56 -0.555 +57 -0.601 +58 -0.646 +59 -0.690 +60 -0.734 +61 -0.777 +62 -0.820 +63 -0.863 +64 -0.905 +65 -0.948 +66 -0.990 +67 -1.033 +68 -1.076 +69 -1.119 +70 -1.163 +71 -1.208 +72 -1.254 +73 -1.300 +74 -1.349 +75 -1.398 +76 -1.450 +77 -1.503 +78 -1.559 +79 -1.617 +80 -1.677 +81 -1.741 +82 -1.807 +83 -1.877 +84 -1.951 +85 -2.029 +86 -2.111 +87 -2.197 +88 -2.288 +89 -2.385 +90 -2.487 +1 1.144 +2 1.222 +3 1.292 +4 1.352 +5 1.403 +6 1.446 +7 1.481 +8 1.509 +9 1.529 +10 1.543 +11 1.550 +12 1.551 +13 1.547 +14 1.537 +15 1.522 +16 1.503 +17 1.479 +18 1.451 +19 1.419 +20 1.383 +21 1.345 +22 1.303 +23 1.258 +24 1.212 +25 1.162 +26 1.111 +27 1.058 +28 1.004 +29 0.948 +30 0.891 +31 0.833 +32 0.774 +33 0.715 +34 0.655 +35 0.594 +36 0.534 +37 0.473 +38 0.413 +39 0.353 +40 0.293 +41 0.233 +42 0.174 +43 0.115 +44 0.057 +45 -0.000 +46 -0.057 +47 -0.112 +48 -0.167 +49 -0.221 +50 -0.275 +51 -0.327 +52 -0.378 +53 -0.429 +54 -0.479 +55 -0.528 +56 -0.576 +57 -0.623 +58 -0.670 +59 -0.716 +60 -0.762 +61 -0.807 +62 -0.851 +63 -0.896 +64 -0.940 +65 -0.984 +66 -1.029 +67 -1.073 +68 -1.118 +69 -1.163 +70 -1.209 +71 -1.256 +72 -1.303 +73 -1.352 +74 -1.403 +75 -1.455 +76 -1.508 +77 -1.564 +78 -1.622 +79 -1.682 +80 -1.746 +81 -1.812 +82 -1.881 +83 -1.954 +84 -2.031 +85 -2.112 +86 -2.197 +87 -2.287 +88 -2.382 +89 -2.483 +90 -2.589 +1 1.451 +2 1.537 +3 1.612 +4 1.677 +5 1.732 +6 1.777 +7 1.813 +8 1.841 +9 1.860 +10 1.872 +11 1.876 +12 1.873 +13 1.864 +14 1.849 +15 1.828 +16 1.801 +17 1.770 +18 1.734 +19 1.693 +20 1.649 +21 1.601 +22 1.549 +23 1.495 +24 1.438 +25 1.378 +26 1.316 +27 1.252 +28 1.186 +29 1.119 +30 1.051 +31 0.982 +32 0.911 +33 0.841 +34 0.769 +35 0.698 +36 0.626 +37 0.555 +38 0.484 +39 0.413 +40 0.342 +41 0.272 +42 0.203 +43 0.134 +44 0.067 +45 -0.000 +46 -0.066 +47 -0.130 +48 -0.194 +49 -0.257 +50 -0.318 +51 -0.378 +52 -0.437 +53 -0.495 +54 -0.552 +55 -0.608 +56 -0.662 +57 -0.716 +58 -0.769 +59 -0.821 +60 -0.872 +61 -0.923 +62 -0.973 +63 -1.022 +64 -1.071 +65 -1.120 +66 -1.169 +67 -1.218 +68 -1.268 +69 -1.318 +70 -1.368 +71 -1.419 +72 -1.472 +73 -1.525 +74 -1.580 +75 -1.637 +76 -1.696 +77 -1.757 +78 -1.820 +79 -1.886 +80 -1.956 +81 -2.029 +82 -2.105 +83 -2.185 +84 -2.270 +85 -2.360 +86 -2.454 +87 -2.554 +88 -2.660 +89 -2.772 +90 -2.890 +1 1.589 +2 1.680 +3 1.758 +4 1.825 +5 1.882 +6 1.928 +7 1.965 +8 1.993 +9 2.012 +10 2.023 +11 2.026 +12 2.021 +13 2.010 +14 1.992 +15 1.969 +16 1.939 +17 1.904 +18 1.865 +19 1.820 +20 1.772 +21 1.720 +22 1.664 +23 1.605 +24 1.543 +25 1.478 +26 1.411 +27 1.342 +28 1.272 +29 1.200 +30 1.126 +31 1.051 +32 0.976 +33 0.900 +34 0.824 +35 0.747 +36 0.670 +37 0.593 +38 0.517 +39 0.441 +40 0.366 +41 0.291 +42 0.217 +43 0.143 +44 0.071 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.207 +49 -0.273 +50 -0.339 +51 -0.403 +52 -0.466 +53 -0.527 +54 -0.588 +55 -0.647 +56 -0.705 +57 -0.762 +58 -0.818 +59 -0.873 +60 -0.927 +61 -0.980 +62 -1.033 +63 -1.085 +64 -1.137 +65 -1.189 +66 -1.240 +67 -1.292 +68 -1.344 +69 -1.396 +70 -1.449 +71 -1.503 +72 -1.558 +73 -1.614 +74 -1.672 +75 -1.731 +76 -1.793 +77 -1.857 +78 -1.923 +79 -1.993 +80 -2.065 +81 -2.142 +82 -2.222 +83 -2.306 +84 -2.395 +85 -2.489 +86 -2.589 +87 -2.694 +88 -2.805 +89 -2.922 +90 -3.047 +1 1.515 +2 1.600 +3 1.675 +4 1.739 +5 1.793 +6 1.837 +7 1.872 +8 1.899 +9 1.917 +10 1.927 +11 1.930 +12 1.925 +13 1.915 +14 1.898 +15 1.875 +16 1.847 +17 1.814 +18 1.776 +19 1.734 +20 1.687 +21 1.638 +22 1.584 +23 1.528 +24 1.469 +25 1.408 +26 1.344 +27 1.278 +28 1.211 +29 1.142 +30 1.072 +31 1.001 +32 0.929 +33 0.857 +34 0.784 +35 0.711 +36 0.638 +37 0.565 +38 0.492 +39 0.420 +40 0.348 +41 0.277 +42 0.206 +43 0.137 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.132 +48 -0.197 +49 -0.260 +50 -0.322 +51 -0.383 +52 -0.443 +53 -0.502 +54 -0.559 +55 -0.615 +56 -0.670 +57 -0.725 +58 -0.778 +59 -0.830 +60 -0.881 +61 -0.932 +62 -0.982 +63 -1.032 +64 -1.081 +65 -1.130 +66 -1.179 +67 -1.228 +68 -1.277 +69 -1.327 +70 -1.377 +71 -1.428 +72 -1.480 +73 -1.533 +74 -1.588 +75 -1.645 +76 -1.703 +77 -1.764 +78 -1.827 +79 -1.893 +80 -1.962 +81 -2.034 +82 -2.110 +83 -2.191 +84 -2.275 +85 -2.364 +86 -2.459 +87 -2.558 +88 -2.664 +89 -2.776 +90 -2.894 +1 1.903 +2 1.998 +3 2.080 +4 2.150 +5 2.208 +6 2.255 +7 2.291 +8 2.317 +9 2.334 +10 2.341 +11 2.340 +12 2.331 +13 2.314 +14 2.290 +15 2.260 +16 2.223 +17 2.180 +18 2.132 +19 2.080 +20 2.022 +21 1.960 +22 1.895 +23 1.826 +24 1.754 +25 1.679 +26 1.602 +27 1.522 +28 1.441 +29 1.358 +30 1.274 +31 1.189 +32 1.103 +33 1.016 +34 0.929 +35 0.842 +36 0.755 +37 0.668 +38 0.582 +39 0.496 +40 0.411 +41 0.326 +42 0.243 +43 0.161 +44 0.080 +45 -0.000 +46 -0.078 +47 -0.155 +48 -0.231 +49 -0.305 +50 -0.378 +51 -0.449 +52 -0.518 +53 -0.586 +54 -0.653 +55 -0.718 +56 -0.781 +57 -0.843 +58 -0.904 +59 -0.964 +60 -1.023 +61 -1.081 +62 -1.138 +63 -1.194 +64 -1.250 +65 -1.305 +66 -1.360 +67 -1.415 +68 -1.470 +69 -1.526 +70 -1.582 +71 -1.639 +72 -1.697 +73 -1.756 +74 -1.817 +75 -1.880 +76 -1.945 +77 -2.013 +78 -2.083 +79 -2.157 +80 -2.233 +81 -2.314 +82 -2.399 +83 -2.489 +84 -2.584 +85 -2.684 +86 -2.789 +87 -2.902 +88 -3.020 +89 -3.146 +90 -3.280 +1 1.334 +2 1.412 +3 1.480 +4 1.538 +5 1.587 +6 1.627 +7 1.660 +8 1.684 +9 1.701 +10 1.711 +11 1.714 +12 1.711 +13 1.702 +14 1.688 +15 1.668 +16 1.644 +17 1.615 +18 1.581 +19 1.544 +20 1.503 +21 1.459 +22 1.412 +23 1.362 +24 1.310 +25 1.255 +26 1.199 +27 1.140 +28 1.081 +29 1.019 +30 0.957 +31 0.894 +32 0.830 +33 0.765 +34 0.700 +35 0.635 +36 0.570 +37 0.505 +38 0.440 +39 0.375 +40 0.311 +41 0.247 +42 0.184 +43 0.122 +44 0.061 +45 -0.000 +46 -0.060 +47 -0.119 +48 -0.176 +49 -0.233 +50 -0.289 +51 -0.344 +52 -0.397 +53 -0.450 +54 -0.501 +55 -0.552 +56 -0.602 +57 -0.650 +58 -0.698 +59 -0.745 +60 -0.792 +61 -0.837 +62 -0.883 +63 -0.927 +64 -0.972 +65 -1.016 +66 -1.061 +67 -1.105 +68 -1.149 +69 -1.194 +70 -1.240 +71 -1.286 +72 -1.334 +73 -1.382 +74 -1.432 +75 -1.483 +76 -1.536 +77 -1.591 +78 -1.648 +79 -1.708 +80 -1.771 +81 -1.837 +82 -1.906 +83 -1.978 +84 -2.055 +85 -2.136 +86 -2.221 +87 -2.311 +88 -2.407 +89 -2.508 +90 -2.615 +1 1.360 +2 1.440 +3 1.510 +4 1.569 +5 1.620 +6 1.662 +7 1.695 +8 1.720 +9 1.738 +10 1.748 +11 1.752 +12 1.749 +13 1.740 +14 1.725 +15 1.705 +16 1.680 +17 1.651 +18 1.617 +19 1.579 +20 1.537 +21 1.492 +22 1.444 +23 1.393 +24 1.340 +25 1.284 +26 1.226 +27 1.167 +28 1.105 +29 1.043 +30 0.979 +31 0.914 +32 0.849 +33 0.783 +34 0.717 +35 0.650 +36 0.583 +37 0.517 +38 0.450 +39 0.384 +40 0.318 +41 0.253 +42 0.189 +43 0.125 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.181 +49 -0.239 +50 -0.296 +51 -0.352 +52 -0.407 +53 -0.460 +54 -0.513 +55 -0.565 +56 -0.616 +57 -0.666 +58 -0.715 +59 -0.763 +60 -0.811 +61 -0.858 +62 -0.904 +63 -0.950 +64 -0.996 +65 -1.041 +66 -1.087 +67 -1.132 +68 -1.178 +69 -1.224 +70 -1.271 +71 -1.319 +72 -1.367 +73 -1.417 +74 -1.468 +75 -1.521 +76 -1.575 +77 -1.632 +78 -1.691 +79 -1.752 +80 -1.816 +81 -1.884 +82 -1.955 +83 -2.030 +84 -2.108 +85 -2.191 +86 -2.279 +87 -2.372 +88 -2.470 +89 -2.574 +90 -2.684 +1 1.049 +2 1.116 +3 1.176 +4 1.227 +5 1.271 +6 1.307 +7 1.337 +8 1.360 +9 1.376 +10 1.387 +11 1.392 +12 1.392 +13 1.387 +14 1.377 +15 1.362 +16 1.344 +17 1.321 +18 1.295 +19 1.266 +20 1.234 +21 1.199 +22 1.161 +23 1.121 +24 1.078 +25 1.034 +26 0.988 +27 0.941 +28 0.892 +29 0.842 +30 0.791 +31 0.739 +32 0.687 +33 0.634 +34 0.580 +35 0.527 +36 0.473 +37 0.419 +38 0.365 +39 0.312 +40 0.259 +41 0.206 +42 0.154 +43 0.102 +44 0.051 +45 -0.000 +46 -0.050 +47 -0.099 +48 -0.147 +49 -0.195 +50 -0.242 +51 -0.288 +52 -0.333 +53 -0.377 +54 -0.421 +55 -0.463 +56 -0.505 +57 -0.547 +58 -0.588 +59 -0.628 +60 -0.667 +61 -0.706 +62 -0.745 +63 -0.784 +64 -0.822 +65 -0.860 +66 -0.898 +67 -0.937 +68 -0.975 +69 -1.014 +70 -1.054 +71 -1.094 +72 -1.135 +73 -1.177 +74 -1.221 +75 -1.265 +76 -1.312 +77 -1.360 +78 -1.410 +79 -1.462 +80 -1.516 +81 -1.573 +82 -1.633 +83 -1.696 +84 -1.763 +85 -1.833 +86 -1.907 +87 -1.985 +88 -2.067 +89 -2.155 +90 -2.247 +1 1.184 +2 1.255 +3 1.317 +4 1.370 +5 1.415 +6 1.452 +7 1.482 +8 1.505 +9 1.520 +10 1.530 +11 1.534 +12 1.532 +13 1.524 +14 1.512 +15 1.495 +16 1.473 +17 1.447 +18 1.418 +19 1.385 +20 1.349 +21 1.309 +22 1.267 +23 1.223 +24 1.176 +25 1.127 +26 1.077 +27 1.024 +28 0.971 +29 0.916 +30 0.860 +31 0.803 +32 0.746 +33 0.688 +34 0.630 +35 0.571 +36 0.513 +37 0.454 +38 0.396 +39 0.338 +40 0.280 +41 0.223 +42 0.166 +43 0.110 +44 0.055 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.159 +49 -0.210 +50 -0.260 +51 -0.310 +52 -0.358 +53 -0.406 +54 -0.452 +55 -0.498 +56 -0.543 +57 -0.587 +58 -0.630 +59 -0.673 +60 -0.715 +61 -0.757 +62 -0.798 +63 -0.838 +64 -0.879 +65 -0.919 +66 -0.959 +67 -1.000 +68 -1.040 +69 -1.081 +70 -1.123 +71 -1.165 +72 -1.208 +73 -1.252 +74 -1.298 +75 -1.345 +76 -1.393 +77 -1.443 +78 -1.496 +79 -1.550 +80 -1.607 +81 -1.667 +82 -1.730 +83 -1.797 +84 -1.867 +85 -1.940 +86 -2.018 +87 -2.100 +88 -2.187 +89 -2.280 +90 -2.377 +1 1.025 +2 1.086 +3 1.139 +4 1.185 +5 1.224 +6 1.256 +7 1.282 +8 1.301 +9 1.315 +10 1.323 +11 1.326 +12 1.324 +13 1.318 +14 1.307 +15 1.292 +16 1.273 +17 1.251 +18 1.226 +19 1.197 +20 1.166 +21 1.132 +22 1.095 +23 1.057 +24 1.016 +25 0.974 +26 0.930 +27 0.885 +28 0.839 +29 0.791 +30 0.743 +31 0.694 +32 0.644 +33 0.594 +34 0.544 +35 0.493 +36 0.443 +37 0.392 +38 0.342 +39 0.292 +40 0.242 +41 0.192 +42 0.143 +43 0.095 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.092 +48 -0.137 +49 -0.181 +50 -0.225 +51 -0.267 +52 -0.309 +53 -0.350 +54 -0.390 +55 -0.430 +56 -0.468 +57 -0.506 +58 -0.544 +59 -0.581 +60 -0.617 +61 -0.653 +62 -0.688 +63 -0.723 +64 -0.758 +65 -0.793 +66 -0.827 +67 -0.862 +68 -0.897 +69 -0.932 +70 -0.968 +71 -1.004 +72 -1.041 +73 -1.079 +74 -1.118 +75 -1.159 +76 -1.200 +77 -1.244 +78 -1.289 +79 -1.336 +80 -1.385 +81 -1.437 +82 -1.491 +83 -1.548 +84 -1.608 +85 -1.672 +86 -1.739 +87 -1.810 +88 -1.885 +89 -1.964 +90 -2.048 +1 1.339 +2 1.407 +3 1.465 +4 1.515 +5 1.557 +6 1.591 +7 1.617 +8 1.636 +9 1.648 +10 1.653 +11 1.653 +12 1.647 +13 1.635 +14 1.618 +15 1.597 +16 1.571 +17 1.541 +18 1.507 +19 1.470 +20 1.430 +21 1.386 +22 1.340 +23 1.291 +24 1.240 +25 1.187 +26 1.133 +27 1.077 +28 1.019 +29 0.961 +30 0.901 +31 0.841 +32 0.780 +33 0.719 +34 0.657 +35 0.595 +36 0.534 +37 0.472 +38 0.411 +39 0.351 +40 0.290 +41 0.231 +42 0.172 +43 0.114 +44 0.056 +45 -0.000 +46 -0.055 +47 -0.110 +48 -0.163 +49 -0.216 +50 -0.267 +51 -0.317 +52 -0.366 +53 -0.415 +54 -0.462 +55 -0.508 +56 -0.553 +57 -0.597 +58 -0.640 +59 -0.682 +60 -0.724 +61 -0.765 +62 -0.805 +63 -0.845 +64 -0.884 +65 -0.924 +66 -0.963 +67 -1.002 +68 -1.041 +69 -1.080 +70 -1.120 +71 -1.160 +72 -1.202 +73 -1.244 +74 -1.287 +75 -1.332 +76 -1.378 +77 -1.426 +78 -1.476 +79 -1.529 +80 -1.584 +81 -1.641 +82 -1.702 +83 -1.766 +84 -1.833 +85 -1.905 +86 -1.980 +87 -2.060 +88 -2.145 +89 -2.235 +90 -2.330 +1 0.678 +2 0.717 +3 0.751 +4 0.780 +5 0.805 +6 0.825 +7 0.841 +8 0.853 +9 0.862 +10 0.866 +11 0.868 +12 0.866 +13 0.861 +14 0.854 +15 0.844 +16 0.831 +17 0.816 +18 0.799 +19 0.781 +20 0.760 +21 0.737 +22 0.713 +23 0.688 +24 0.662 +25 0.634 +26 0.605 +27 0.576 +28 0.545 +29 0.515 +30 0.483 +31 0.451 +32 0.419 +33 0.386 +34 0.353 +35 0.320 +36 0.287 +37 0.255 +38 0.222 +39 0.189 +40 0.157 +41 0.125 +42 0.093 +43 0.062 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.117 +50 -0.145 +51 -0.173 +52 -0.200 +53 -0.226 +54 -0.252 +55 -0.278 +56 -0.303 +57 -0.327 +58 -0.351 +59 -0.375 +60 -0.398 +61 -0.421 +62 -0.444 +63 -0.466 +64 -0.489 +65 -0.511 +66 -0.533 +67 -0.555 +68 -0.578 +69 -0.600 +70 -0.623 +71 -0.646 +72 -0.670 +73 -0.694 +74 -0.719 +75 -0.745 +76 -0.772 +77 -0.799 +78 -0.828 +79 -0.858 +80 -0.890 +81 -0.923 +82 -0.957 +83 -0.994 +84 -1.033 +85 -1.073 +86 -1.116 +87 -1.162 +88 -1.210 +89 -1.261 +90 -1.315 +1 0.403 +2 0.427 +3 0.447 +4 0.465 +5 0.480 +6 0.492 +7 0.502 +8 0.510 +9 0.515 +10 0.518 +11 0.519 +12 0.518 +13 0.516 +14 0.511 +15 0.505 +16 0.498 +17 0.489 +18 0.479 +19 0.468 +20 0.455 +21 0.442 +22 0.428 +23 0.413 +24 0.397 +25 0.380 +26 0.363 +27 0.346 +28 0.327 +29 0.309 +30 0.290 +31 0.271 +32 0.251 +33 0.232 +34 0.212 +35 0.192 +36 0.173 +37 0.153 +38 0.133 +39 0.114 +40 0.094 +41 0.075 +42 0.056 +43 0.037 +44 0.018 +45 -0.000 +46 -0.018 +47 -0.036 +48 -0.053 +49 -0.071 +50 -0.088 +51 -0.104 +52 -0.120 +53 -0.136 +54 -0.152 +55 -0.167 +56 -0.182 +57 -0.197 +58 -0.212 +59 -0.226 +60 -0.240 +61 -0.254 +62 -0.268 +63 -0.282 +64 -0.295 +65 -0.309 +66 -0.322 +67 -0.336 +68 -0.349 +69 -0.363 +70 -0.377 +71 -0.391 +72 -0.406 +73 -0.420 +74 -0.436 +75 -0.451 +76 -0.468 +77 -0.485 +78 -0.502 +79 -0.521 +80 -0.540 +81 -0.560 +82 -0.581 +83 -0.604 +84 -0.627 +85 -0.652 +86 -0.679 +87 -0.706 +88 -0.736 +89 -0.767 +90 -0.800 +1 -0.020 +2 -0.019 +3 -0.017 +4 -0.015 +5 -0.014 +6 -0.013 +7 -0.011 +8 -0.010 +9 -0.009 +10 -0.008 +11 -0.007 +12 -0.006 +13 -0.005 +14 -0.004 +15 -0.004 +16 -0.003 +17 -0.002 +18 -0.002 +19 -0.001 +20 -0.001 +21 -0.000 +22 0.000 +23 0.001 +24 0.001 +25 0.001 +26 0.001 +27 0.002 +28 0.002 +29 0.002 +30 0.002 +31 0.002 +32 0.002 +33 0.002 +34 0.002 +35 0.002 +36 0.002 +37 0.002 +38 0.002 +39 0.002 +40 0.001 +41 0.001 +42 0.001 +43 0.001 +44 0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.001 +49 -0.001 +50 -0.002 +51 -0.002 +52 -0.003 +53 -0.003 +54 -0.004 +55 -0.004 +56 -0.005 +57 -0.006 +58 -0.006 +59 -0.007 +60 -0.008 +61 -0.008 +62 -0.009 +63 -0.010 +64 -0.011 +65 -0.011 +66 -0.012 +67 -0.013 +68 -0.014 +69 -0.015 +70 -0.016 +71 -0.017 +72 -0.018 +73 -0.019 +74 -0.020 +75 -0.022 +76 -0.023 +77 -0.024 +78 -0.025 +79 -0.027 +80 -0.028 +81 -0.030 +82 -0.031 +83 -0.033 +84 -0.035 +85 -0.036 +86 -0.038 +87 -0.040 +88 -0.042 +89 -0.044 +90 -0.046 +1 -0.329 +2 -0.348 +3 -0.366 +4 -0.380 +5 -0.393 +6 -0.403 +7 -0.412 +8 -0.418 +9 -0.423 +10 -0.425 +11 -0.426 +12 -0.426 +13 -0.424 +14 -0.421 +15 -0.416 +16 -0.410 +17 -0.403 +18 -0.395 +19 -0.386 +20 -0.376 +21 -0.365 +22 -0.353 +23 -0.341 +24 -0.328 +25 -0.314 +26 -0.300 +27 -0.286 +28 -0.271 +29 -0.256 +30 -0.240 +31 -0.224 +32 -0.208 +33 -0.192 +34 -0.176 +35 -0.160 +36 -0.143 +37 -0.127 +38 -0.111 +39 -0.094 +40 -0.078 +41 -0.062 +42 -0.046 +43 -0.031 +44 -0.015 +45 0.000 +46 0.015 +47 0.030 +48 0.045 +49 0.059 +50 0.073 +51 0.087 +52 0.100 +53 0.114 +54 0.127 +55 0.140 +56 0.152 +57 0.165 +58 0.177 +59 0.189 +60 0.201 +61 0.213 +62 0.224 +63 0.236 +64 0.247 +65 0.259 +66 0.270 +67 0.281 +68 0.293 +69 0.304 +70 0.316 +71 0.328 +72 0.340 +73 0.352 +74 0.365 +75 0.378 +76 0.392 +77 0.406 +78 0.420 +79 0.436 +80 0.452 +81 0.468 +82 0.486 +83 0.504 +84 0.524 +85 0.544 +86 0.566 +87 0.588 +88 0.613 +89 0.638 +90 0.665 +1 -0.583 +2 -0.619 +3 -0.650 +4 -0.677 +5 -0.700 +6 -0.719 +7 -0.734 +8 -0.746 +9 -0.754 +10 -0.759 +11 -0.761 +12 -0.761 +13 -0.757 +14 -0.751 +15 -0.743 +16 -0.732 +17 -0.720 +18 -0.705 +19 -0.689 +20 -0.671 +21 -0.652 +22 -0.631 +23 -0.609 +24 -0.586 +25 -0.562 +26 -0.537 +27 -0.511 +28 -0.484 +29 -0.457 +30 -0.429 +31 -0.401 +32 -0.372 +33 -0.343 +34 -0.314 +35 -0.285 +36 -0.256 +37 -0.227 +38 -0.198 +39 -0.169 +40 -0.140 +41 -0.111 +42 -0.083 +43 -0.055 +44 -0.027 +45 0.000 +46 0.027 +47 0.053 +48 0.080 +49 0.105 +50 0.130 +51 0.155 +52 0.179 +53 0.203 +54 0.227 +55 0.250 +56 0.272 +57 0.294 +58 0.316 +59 0.338 +60 0.359 +61 0.380 +62 0.400 +63 0.421 +64 0.441 +65 0.461 +66 0.482 +67 0.502 +68 0.522 +69 0.543 +70 0.564 +71 0.585 +72 0.607 +73 0.629 +74 0.652 +75 0.675 +76 0.700 +77 0.725 +78 0.751 +79 0.779 +80 0.807 +81 0.837 +82 0.869 +83 0.902 +84 0.937 +85 0.974 +86 1.013 +87 1.054 +88 1.097 +89 1.143 +90 1.192 +1 -0.845 +2 -0.909 +3 -0.966 +4 -1.015 +5 -1.058 +6 -1.094 +7 -1.124 +8 -1.147 +9 -1.165 +10 -1.178 +11 -1.186 +12 -1.188 +13 -1.187 +14 -1.181 +15 -1.171 +16 -1.157 +17 -1.139 +18 -1.119 +19 -1.095 +20 -1.069 +21 -1.040 +22 -1.008 +23 -0.975 +24 -0.939 +25 -0.901 +26 -0.862 +27 -0.822 +28 -0.780 +29 -0.737 +30 -0.693 +31 -0.648 +32 -0.603 +33 -0.557 +34 -0.510 +35 -0.464 +36 -0.417 +37 -0.370 +38 -0.322 +39 -0.276 +40 -0.229 +41 -0.182 +42 -0.136 +43 -0.090 +44 -0.045 +45 0.000 +46 0.044 +47 0.088 +48 0.131 +49 0.174 +50 0.216 +51 0.257 +52 0.298 +53 0.338 +54 0.377 +55 0.416 +56 0.454 +57 0.492 +58 0.529 +59 0.566 +60 0.602 +61 0.638 +62 0.674 +63 0.710 +64 0.745 +65 0.781 +66 0.816 +67 0.852 +68 0.888 +69 0.925 +70 0.962 +71 1.000 +72 1.038 +73 1.078 +74 1.119 +75 1.161 +76 1.204 +77 1.249 +78 1.296 +79 1.345 +80 1.396 +81 1.450 +82 1.506 +83 1.565 +84 1.627 +85 1.692 +86 1.761 +87 1.833 +88 1.910 +89 1.991 +90 2.076 +1 -1.009 +2 -1.068 +3 -1.120 +4 -1.164 +5 -1.201 +6 -1.232 +7 -1.256 +8 -1.275 +9 -1.288 +10 -1.295 +11 -1.298 +12 -1.296 +13 -1.289 +14 -1.278 +15 -1.263 +16 -1.245 +17 -1.223 +18 -1.198 +19 -1.169 +20 -1.139 +21 -1.105 +22 -1.070 +23 -1.032 +24 -0.992 +25 -0.951 +26 -0.908 +27 -0.864 +28 -0.819 +29 -0.772 +30 -0.725 +31 -0.677 +32 -0.629 +33 -0.580 +34 -0.531 +35 -0.481 +36 -0.432 +37 -0.383 +38 -0.333 +39 -0.284 +40 -0.236 +41 -0.188 +42 -0.140 +43 -0.093 +44 -0.046 +45 0.000 +46 0.045 +47 0.090 +48 0.134 +49 0.177 +50 0.219 +51 0.260 +52 0.301 +53 0.341 +54 0.380 +55 0.419 +56 0.456 +57 0.493 +58 0.529 +59 0.565 +60 0.600 +61 0.635 +62 0.670 +63 0.704 +64 0.737 +65 0.771 +66 0.805 +67 0.838 +68 0.872 +69 0.906 +70 0.941 +71 0.976 +72 1.012 +73 1.049 +74 1.087 +75 1.126 +76 1.166 +77 1.208 +78 1.251 +79 1.297 +80 1.344 +81 1.394 +82 1.447 +83 1.502 +84 1.560 +85 1.621 +86 1.686 +87 1.755 +88 1.827 +89 1.904 +90 1.985 +1 -1.179 +2 -1.248 +3 -1.309 +4 -1.361 +5 -1.405 +6 -1.441 +7 -1.470 +8 -1.492 +9 -1.507 +10 -1.516 +11 -1.520 +12 -1.517 +13 -1.510 +14 -1.497 +15 -1.480 +16 -1.458 +17 -1.432 +18 -1.403 +19 -1.370 +20 -1.334 +21 -1.295 +22 -1.254 +23 -1.209 +24 -1.163 +25 -1.115 +26 -1.064 +27 -1.013 +28 -0.960 +29 -0.905 +30 -0.850 +31 -0.794 +32 -0.737 +33 -0.680 +34 -0.622 +35 -0.564 +36 -0.506 +37 -0.449 +38 -0.391 +39 -0.334 +40 -0.277 +41 -0.220 +42 -0.164 +43 -0.109 +44 -0.054 +45 0.000 +46 0.053 +47 0.105 +48 0.157 +49 0.207 +50 0.257 +51 0.306 +52 0.353 +53 0.400 +54 0.446 +55 0.491 +56 0.535 +57 0.579 +58 0.621 +59 0.663 +60 0.705 +61 0.746 +62 0.786 +63 0.826 +64 0.866 +65 0.905 +66 0.945 +67 0.984 +68 1.024 +69 1.064 +70 1.105 +71 1.146 +72 1.189 +73 1.232 +74 1.276 +75 1.322 +76 1.369 +77 1.418 +78 1.470 +79 1.523 +80 1.579 +81 1.638 +82 1.699 +83 1.764 +84 1.832 +85 1.905 +86 1.981 +87 2.061 +88 2.146 +89 2.237 +90 2.332 +1 -1.247 +2 -1.314 +3 -1.372 +4 -1.422 +5 -1.464 +6 -1.498 +7 -1.525 +8 -1.545 +9 -1.558 +10 -1.565 +11 -1.566 +12 -1.561 +13 -1.552 +14 -1.537 +15 -1.518 +16 -1.494 +17 -1.467 +18 -1.436 +19 -1.401 +20 -1.363 +21 -1.322 +22 -1.279 +23 -1.233 +24 -1.185 +25 -1.135 +26 -1.083 +27 -1.030 +28 -0.975 +29 -0.920 +30 -0.863 +31 -0.806 +32 -0.748 +33 -0.689 +34 -0.630 +35 -0.572 +36 -0.513 +37 -0.454 +38 -0.395 +39 -0.337 +40 -0.279 +41 -0.222 +42 -0.165 +43 -0.110 +44 -0.054 +45 0.000 +46 0.053 +47 0.106 +48 0.158 +49 0.208 +50 0.258 +51 0.307 +52 0.354 +53 0.401 +54 0.447 +55 0.492 +56 0.536 +57 0.579 +58 0.621 +59 0.662 +60 0.703 +61 0.743 +62 0.783 +63 0.822 +64 0.861 +65 0.900 +66 0.939 +67 0.977 +68 1.016 +69 1.055 +70 1.095 +71 1.135 +72 1.176 +73 1.218 +74 1.261 +75 1.306 +76 1.352 +77 1.400 +78 1.450 +79 1.502 +80 1.556 +81 1.613 +82 1.673 +83 1.737 +84 1.804 +85 1.874 +86 1.949 +87 2.028 +88 2.112 +89 2.200 +90 2.294 +1 -1.307 +2 -1.388 +3 -1.458 +4 -1.518 +5 -1.569 +6 -1.611 +7 -1.645 +8 -1.671 +9 -1.690 +10 -1.701 +11 -1.706 +12 -1.704 +13 -1.696 +14 -1.683 +15 -1.664 +16 -1.641 +17 -1.612 +18 -1.580 +19 -1.543 +20 -1.503 +21 -1.460 +22 -1.413 +23 -1.364 +24 -1.312 +25 -1.258 +26 -1.201 +27 -1.143 +28 -1.083 +29 -1.022 +30 -0.960 +31 -0.897 +32 -0.833 +33 -0.768 +34 -0.703 +35 -0.638 +36 -0.573 +37 -0.507 +38 -0.442 +39 -0.377 +40 -0.313 +41 -0.249 +42 -0.186 +43 -0.123 +44 -0.061 +45 0.000 +46 0.060 +47 0.119 +48 0.178 +49 0.235 +50 0.291 +51 0.346 +52 0.401 +53 0.454 +54 0.506 +55 0.557 +56 0.608 +57 0.657 +58 0.706 +59 0.754 +60 0.801 +61 0.847 +62 0.893 +63 0.939 +64 0.985 +65 1.030 +66 1.075 +67 1.121 +68 1.166 +69 1.212 +70 1.259 +71 1.307 +72 1.355 +73 1.405 +74 1.456 +75 1.508 +76 1.563 +77 1.620 +78 1.678 +79 1.740 +80 1.804 +81 1.872 +82 1.943 +83 2.017 +84 2.096 +85 2.179 +86 2.266 +87 2.359 +88 2.457 +89 2.560 +90 2.670 +1 -1.284 +2 -1.363 +3 -1.431 +4 -1.490 +5 -1.540 +6 -1.581 +7 -1.614 +8 -1.640 +9 -1.658 +10 -1.669 +11 -1.673 +12 -1.671 +13 -1.664 +14 -1.650 +15 -1.632 +16 -1.609 +17 -1.581 +18 -1.549 +19 -1.513 +20 -1.474 +21 -1.431 +22 -1.385 +23 -1.337 +24 -1.286 +25 -1.233 +26 -1.178 +27 -1.121 +28 -1.062 +29 -1.002 +30 -0.941 +31 -0.879 +32 -0.816 +33 -0.753 +34 -0.689 +35 -0.625 +36 -0.561 +37 -0.497 +38 -0.433 +39 -0.370 +40 -0.307 +41 -0.244 +42 -0.182 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.117 +48 0.174 +49 0.230 +50 0.285 +51 0.340 +52 0.393 +53 0.445 +54 0.496 +55 0.546 +56 0.596 +57 0.644 +58 0.692 +59 0.739 +60 0.785 +61 0.830 +62 0.876 +63 0.920 +64 0.965 +65 1.009 +66 1.054 +67 1.098 +68 1.143 +69 1.188 +70 1.234 +71 1.281 +72 1.328 +73 1.377 +74 1.427 +75 1.479 +76 1.532 +77 1.588 +78 1.645 +79 1.706 +80 1.769 +81 1.835 +82 1.905 +83 1.978 +84 2.055 +85 2.136 +86 2.222 +87 2.313 +88 2.409 +89 2.510 +90 2.618 +1 -1.226 +2 -1.322 +3 -1.406 +4 -1.480 +5 -1.543 +6 -1.597 +7 -1.641 +8 -1.677 +9 -1.704 +10 -1.723 +11 -1.735 +12 -1.740 +13 -1.738 +14 -1.730 +15 -1.715 +16 -1.696 +17 -1.671 +18 -1.641 +19 -1.606 +20 -1.568 +21 -1.525 +22 -1.480 +23 -1.430 +24 -1.378 +25 -1.323 +26 -1.266 +27 -1.207 +28 -1.145 +29 -1.082 +30 -1.018 +31 -0.952 +32 -0.886 +33 -0.818 +34 -0.750 +35 -0.681 +36 -0.612 +37 -0.543 +38 -0.474 +39 -0.405 +40 -0.336 +41 -0.268 +42 -0.200 +43 -0.133 +44 -0.066 +45 0.000 +46 0.065 +47 0.130 +48 0.193 +49 0.256 +50 0.318 +51 0.378 +52 0.438 +53 0.497 +54 0.556 +55 0.613 +56 0.669 +57 0.725 +58 0.780 +59 0.834 +60 0.888 +61 0.941 +62 0.994 +63 1.047 +64 1.100 +65 1.153 +66 1.206 +67 1.259 +68 1.312 +69 1.367 +70 1.422 +71 1.478 +72 1.536 +73 1.595 +74 1.656 +75 1.718 +76 1.783 +77 1.850 +78 1.920 +79 1.993 +80 2.070 +81 2.150 +82 2.233 +83 2.322 +84 2.414 +85 2.512 +86 2.614 +87 2.723 +88 2.837 +89 2.958 +90 3.085 +1 -1.361 +2 -1.447 +3 -1.524 +4 -1.589 +5 -1.645 +6 -1.691 +7 -1.729 +8 -1.758 +9 -1.779 +10 -1.792 +11 -1.798 +12 -1.797 +13 -1.790 +14 -1.777 +15 -1.758 +16 -1.734 +17 -1.705 +18 -1.671 +19 -1.633 +20 -1.591 +21 -1.546 +22 -1.497 +23 -1.445 +24 -1.390 +25 -1.333 +26 -1.274 +27 -1.212 +28 -1.149 +29 -1.085 +30 -1.019 +31 -0.952 +32 -0.884 +33 -0.816 +34 -0.747 +35 -0.678 +36 -0.609 +37 -0.539 +38 -0.470 +39 -0.401 +40 -0.333 +41 -0.265 +42 -0.198 +43 -0.131 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.189 +49 0.251 +50 0.311 +51 0.370 +52 0.428 +53 0.485 +54 0.541 +55 0.596 +56 0.650 +57 0.703 +58 0.755 +59 0.806 +60 0.857 +61 0.907 +62 0.957 +63 1.006 +64 1.056 +65 1.105 +66 1.154 +67 1.203 +68 1.252 +69 1.302 +70 1.353 +71 1.405 +72 1.457 +73 1.511 +74 1.567 +75 1.624 +76 1.684 +77 1.745 +78 1.809 +79 1.876 +80 1.946 +81 2.020 +82 2.097 +83 2.178 +84 2.263 +85 2.353 +86 2.448 +87 2.549 +88 2.655 +89 2.767 +90 2.886 +1 -1.428 +2 -1.520 +3 -1.600 +4 -1.670 +5 -1.729 +6 -1.778 +7 -1.818 +8 -1.849 +9 -1.871 +10 -1.885 +11 -1.892 +12 -1.891 +13 -1.884 +14 -1.870 +15 -1.850 +16 -1.825 +17 -1.794 +18 -1.759 +19 -1.719 +20 -1.675 +21 -1.627 +22 -1.576 +23 -1.521 +24 -1.464 +25 -1.404 +26 -1.341 +27 -1.277 +28 -1.210 +29 -1.142 +30 -1.073 +31 -1.003 +32 -0.931 +33 -0.859 +34 -0.787 +35 -0.714 +36 -0.641 +37 -0.568 +38 -0.495 +39 -0.423 +40 -0.351 +41 -0.279 +42 -0.208 +43 -0.138 +44 -0.069 +45 0.000 +46 0.068 +47 0.134 +48 0.200 +49 0.264 +50 0.327 +51 0.390 +52 0.451 +53 0.511 +54 0.570 +55 0.627 +56 0.684 +57 0.740 +58 0.795 +59 0.850 +60 0.903 +61 0.956 +62 1.009 +63 1.061 +64 1.112 +65 1.164 +66 1.216 +67 1.267 +68 1.320 +69 1.372 +70 1.426 +71 1.480 +72 1.536 +73 1.593 +74 1.652 +75 1.712 +76 1.775 +77 1.840 +78 1.907 +79 1.978 +80 2.052 +81 2.129 +82 2.211 +83 2.296 +84 2.387 +85 2.482 +86 2.582 +87 2.688 +88 2.800 +89 2.919 +90 3.044 +1 -1.452 +2 -1.540 +3 -1.617 +4 -1.683 +5 -1.739 +6 -1.785 +7 -1.822 +8 -1.851 +9 -1.871 +10 -1.883 +11 -1.887 +12 -1.885 +13 -1.876 +14 -1.861 +15 -1.840 +16 -1.814 +17 -1.782 +18 -1.746 +19 -1.706 +20 -1.661 +21 -1.613 +22 -1.561 +23 -1.507 +24 -1.449 +25 -1.389 +26 -1.327 +27 -1.262 +28 -1.196 +29 -1.129 +30 -1.060 +31 -0.990 +32 -0.919 +33 -0.848 +34 -0.776 +35 -0.704 +36 -0.632 +37 -0.560 +38 -0.488 +39 -0.416 +40 -0.345 +41 -0.275 +42 -0.205 +43 -0.136 +44 -0.067 +45 0.000 +46 0.066 +47 0.132 +48 0.196 +49 0.259 +50 0.321 +51 0.382 +52 0.442 +53 0.501 +54 0.558 +55 0.615 +56 0.670 +57 0.725 +58 0.778 +59 0.831 +60 0.883 +61 0.934 +62 0.985 +63 1.035 +64 1.086 +65 1.135 +66 1.185 +67 1.235 +68 1.286 +69 1.337 +70 1.388 +71 1.440 +72 1.494 +73 1.549 +74 1.605 +75 1.663 +76 1.723 +77 1.786 +78 1.851 +79 1.918 +80 1.989 +81 2.064 +82 2.142 +83 2.224 +84 2.311 +85 2.403 +86 2.499 +87 2.602 +88 2.710 +89 2.824 +90 2.945 +1 -1.429 +2 -1.521 +3 -1.601 +4 -1.671 +5 -1.730 +6 -1.779 +7 -1.819 +8 -1.850 +9 -1.872 +10 -1.886 +11 -1.893 +12 -1.892 +13 -1.885 +14 -1.871 +15 -1.852 +16 -1.826 +17 -1.796 +18 -1.760 +19 -1.720 +20 -1.676 +21 -1.628 +22 -1.577 +23 -1.522 +24 -1.465 +25 -1.405 +26 -1.342 +27 -1.278 +28 -1.211 +29 -1.143 +30 -1.074 +31 -1.004 +32 -0.932 +33 -0.860 +34 -0.788 +35 -0.715 +36 -0.642 +37 -0.569 +38 -0.496 +39 -0.423 +40 -0.351 +41 -0.279 +42 -0.208 +43 -0.138 +44 -0.069 +45 0.000 +46 0.068 +47 0.134 +48 0.200 +49 0.264 +50 0.328 +51 0.390 +52 0.451 +53 0.511 +54 0.570 +55 0.628 +56 0.685 +57 0.741 +58 0.796 +59 0.851 +60 0.904 +61 0.957 +62 1.010 +63 1.062 +64 1.114 +65 1.166 +66 1.217 +67 1.269 +68 1.322 +69 1.374 +70 1.428 +71 1.483 +72 1.538 +73 1.595 +74 1.654 +75 1.715 +76 1.777 +77 1.842 +78 1.910 +79 1.981 +80 2.055 +81 2.132 +82 2.214 +83 2.300 +84 2.390 +85 2.485 +86 2.585 +87 2.692 +88 2.804 +89 2.922 +90 3.048 +1 -1.360 +2 -1.447 +3 -1.523 +4 -1.589 +5 -1.645 +6 -1.692 +7 -1.729 +8 -1.758 +9 -1.779 +10 -1.793 +11 -1.799 +12 -1.798 +13 -1.791 +14 -1.778 +15 -1.759 +16 -1.735 +17 -1.706 +18 -1.672 +19 -1.635 +20 -1.593 +21 -1.547 +22 -1.498 +23 -1.446 +24 -1.391 +25 -1.334 +26 -1.275 +27 -1.214 +28 -1.150 +29 -1.086 +30 -1.020 +31 -0.953 +32 -0.885 +33 -0.817 +34 -0.748 +35 -0.679 +36 -0.609 +37 -0.540 +38 -0.471 +39 -0.402 +40 -0.333 +41 -0.265 +42 -0.198 +43 -0.131 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.190 +49 0.251 +50 0.311 +51 0.370 +52 0.428 +53 0.485 +54 0.541 +55 0.596 +56 0.650 +57 0.703 +58 0.756 +59 0.807 +60 0.858 +61 0.908 +62 0.958 +63 1.007 +64 1.056 +65 1.105 +66 1.154 +67 1.204 +68 1.253 +69 1.303 +70 1.354 +71 1.406 +72 1.458 +73 1.512 +74 1.568 +75 1.625 +76 1.685 +77 1.746 +78 1.810 +79 1.877 +80 1.947 +81 2.021 +82 2.098 +83 2.179 +84 2.265 +85 2.355 +86 2.450 +87 2.550 +88 2.657 +89 2.769 +90 2.888 +1 -1.224 +2 -1.320 +3 -1.404 +4 -1.478 +5 -1.541 +6 -1.595 +7 -1.639 +8 -1.675 +9 -1.702 +10 -1.721 +11 -1.733 +12 -1.738 +13 -1.736 +14 -1.728 +15 -1.713 +16 -1.694 +17 -1.669 +18 -1.639 +19 -1.605 +20 -1.566 +21 -1.524 +22 -1.478 +23 -1.429 +24 -1.377 +25 -1.322 +26 -1.265 +27 -1.206 +28 -1.144 +29 -1.081 +30 -1.017 +31 -0.951 +32 -0.885 +33 -0.817 +34 -0.749 +35 -0.681 +36 -0.612 +37 -0.543 +38 -0.474 +39 -0.405 +40 -0.336 +41 -0.268 +42 -0.200 +43 -0.133 +44 -0.066 +45 0.000 +46 0.065 +47 0.130 +48 0.193 +49 0.256 +50 0.317 +51 0.378 +52 0.438 +53 0.497 +54 0.555 +55 0.612 +56 0.669 +57 0.725 +58 0.780 +59 0.834 +60 0.888 +61 0.941 +62 0.994 +63 1.047 +64 1.100 +65 1.152 +66 1.205 +67 1.259 +68 1.312 +69 1.367 +70 1.422 +71 1.478 +72 1.536 +73 1.595 +74 1.656 +75 1.719 +76 1.784 +77 1.851 +78 1.921 +79 1.994 +80 2.071 +81 2.151 +82 2.235 +83 2.323 +84 2.415 +85 2.513 +86 2.616 +87 2.724 +88 2.839 +89 2.959 +90 3.087 +1 -1.286 +2 -1.365 +3 -1.433 +4 -1.492 +5 -1.542 +6 -1.583 +7 -1.616 +8 -1.642 +9 -1.660 +10 -1.671 +11 -1.675 +12 -1.673 +13 -1.666 +14 -1.652 +15 -1.634 +16 -1.611 +17 -1.583 +18 -1.551 +19 -1.515 +20 -1.476 +21 -1.433 +22 -1.387 +23 -1.338 +24 -1.287 +25 -1.234 +26 -1.179 +27 -1.122 +28 -1.063 +29 -1.003 +30 -0.942 +31 -0.880 +32 -0.817 +33 -0.754 +34 -0.690 +35 -0.626 +36 -0.562 +37 -0.498 +38 -0.434 +39 -0.370 +40 -0.307 +41 -0.244 +42 -0.182 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.117 +48 0.174 +49 0.231 +50 0.286 +51 0.340 +52 0.393 +53 0.445 +54 0.496 +55 0.547 +56 0.596 +57 0.645 +58 0.692 +59 0.739 +60 0.785 +61 0.831 +62 0.876 +63 0.921 +64 0.966 +65 1.010 +66 1.055 +67 1.099 +68 1.144 +69 1.189 +70 1.235 +71 1.282 +72 1.329 +73 1.378 +74 1.428 +75 1.480 +76 1.533 +77 1.589 +78 1.647 +79 1.707 +80 1.770 +81 1.836 +82 1.906 +83 1.979 +84 2.056 +85 2.138 +86 2.224 +87 2.315 +88 2.411 +89 2.512 +90 2.620 +1 -1.315 +2 -1.395 +3 -1.465 +4 -1.525 +5 -1.576 +6 -1.618 +7 -1.652 +8 -1.678 +9 -1.696 +10 -1.707 +11 -1.711 +12 -1.709 +13 -1.701 +14 -1.688 +15 -1.669 +16 -1.645 +17 -1.617 +18 -1.584 +19 -1.547 +20 -1.507 +21 -1.463 +22 -1.417 +23 -1.367 +24 -1.315 +25 -1.260 +26 -1.204 +27 -1.146 +28 -1.086 +29 -1.024 +30 -0.962 +31 -0.899 +32 -0.835 +33 -0.770 +34 -0.705 +35 -0.639 +36 -0.574 +37 -0.508 +38 -0.443 +39 -0.378 +40 -0.313 +41 -0.249 +42 -0.186 +43 -0.123 +44 -0.061 +45 0.000 +46 0.060 +47 0.120 +48 0.178 +49 0.235 +50 0.292 +51 0.347 +52 0.401 +53 0.455 +54 0.507 +55 0.558 +56 0.609 +57 0.658 +58 0.707 +59 0.755 +60 0.802 +61 0.849 +62 0.895 +63 0.941 +64 0.986 +65 1.032 +66 1.077 +67 1.122 +68 1.168 +69 1.214 +70 1.261 +71 1.309 +72 1.357 +73 1.407 +74 1.458 +75 1.511 +76 1.565 +77 1.622 +78 1.681 +79 1.742 +80 1.807 +81 1.874 +82 1.945 +83 2.020 +84 2.099 +85 2.182 +86 2.269 +87 2.362 +88 2.460 +89 2.563 +90 2.673 +1 -1.250 +2 -1.318 +3 -1.376 +4 -1.426 +5 -1.468 +6 -1.502 +7 -1.529 +8 -1.549 +9 -1.562 +10 -1.569 +11 -1.570 +12 -1.565 +13 -1.556 +14 -1.541 +15 -1.522 +16 -1.498 +17 -1.470 +18 -1.439 +19 -1.404 +20 -1.366 +21 -1.325 +22 -1.282 +23 -1.236 +24 -1.188 +25 -1.138 +26 -1.086 +27 -1.032 +28 -0.978 +29 -0.922 +30 -0.865 +31 -0.807 +32 -0.749 +33 -0.691 +34 -0.632 +35 -0.573 +36 -0.514 +37 -0.455 +38 -0.396 +39 -0.338 +40 -0.280 +41 -0.223 +42 -0.166 +43 -0.110 +44 -0.054 +45 0.000 +46 0.054 +47 0.106 +48 0.158 +49 0.209 +50 0.259 +51 0.307 +52 0.355 +53 0.402 +54 0.448 +55 0.493 +56 0.537 +57 0.580 +58 0.622 +59 0.664 +60 0.705 +61 0.745 +62 0.785 +63 0.824 +64 0.863 +65 0.902 +66 0.941 +67 0.979 +68 1.018 +69 1.057 +70 1.097 +71 1.137 +72 1.178 +73 1.220 +74 1.264 +75 1.308 +76 1.354 +77 1.402 +78 1.452 +79 1.504 +80 1.558 +81 1.615 +82 1.676 +83 1.739 +84 1.806 +85 1.876 +86 1.951 +87 2.030 +88 2.114 +89 2.202 +90 2.296 +1 -1.183 +2 -1.253 +3 -1.314 +4 -1.366 +5 -1.410 +6 -1.446 +7 -1.475 +8 -1.498 +9 -1.513 +10 -1.522 +11 -1.525 +12 -1.523 +13 -1.515 +14 -1.503 +15 -1.485 +16 -1.464 +17 -1.438 +18 -1.408 +19 -1.375 +20 -1.339 +21 -1.300 +22 -1.258 +23 -1.214 +24 -1.167 +25 -1.119 +26 -1.068 +27 -1.016 +28 -0.963 +29 -0.909 +30 -0.853 +31 -0.797 +32 -0.740 +33 -0.682 +34 -0.624 +35 -0.566 +36 -0.508 +37 -0.450 +38 -0.392 +39 -0.335 +40 -0.277 +41 -0.221 +42 -0.165 +43 -0.109 +44 -0.054 +45 0.000 +46 0.053 +47 0.106 +48 0.157 +49 0.208 +50 0.258 +51 0.306 +52 0.354 +53 0.401 +54 0.447 +55 0.492 +56 0.537 +57 0.580 +58 0.623 +59 0.665 +60 0.706 +61 0.747 +62 0.788 +63 0.828 +64 0.867 +65 0.907 +66 0.947 +67 0.986 +68 1.026 +69 1.066 +70 1.107 +71 1.148 +72 1.191 +73 1.234 +74 1.278 +75 1.324 +76 1.372 +77 1.421 +78 1.472 +79 1.526 +80 1.582 +81 1.641 +82 1.702 +83 1.767 +84 1.836 +85 1.908 +86 1.985 +87 2.065 +88 2.151 +89 2.241 +90 2.337 +1 -1.013 +2 -1.072 +3 -1.123 +4 -1.168 +5 -1.205 +6 -1.236 +7 -1.260 +8 -1.279 +9 -1.292 +10 -1.299 +11 -1.302 +12 -1.300 +13 -1.293 +14 -1.282 +15 -1.267 +16 -1.248 +17 -1.226 +18 -1.201 +19 -1.173 +20 -1.142 +21 -1.108 +22 -1.073 +23 -1.035 +24 -0.995 +25 -0.954 +26 -0.911 +27 -0.866 +28 -0.821 +29 -0.774 +30 -0.727 +31 -0.679 +32 -0.630 +33 -0.581 +34 -0.532 +35 -0.483 +36 -0.433 +37 -0.384 +38 -0.334 +39 -0.285 +40 -0.236 +41 -0.188 +42 -0.140 +43 -0.093 +44 -0.046 +45 0.000 +46 0.045 +47 0.090 +48 0.134 +49 0.177 +50 0.219 +51 0.261 +52 0.302 +53 0.342 +54 0.381 +55 0.419 +56 0.457 +57 0.494 +58 0.530 +59 0.566 +60 0.601 +61 0.636 +62 0.671 +63 0.705 +64 0.738 +65 0.772 +66 0.806 +67 0.839 +68 0.873 +69 0.907 +70 0.942 +71 0.977 +72 1.013 +73 1.050 +74 1.087 +75 1.126 +76 1.167 +77 1.208 +78 1.252 +79 1.297 +80 1.345 +81 1.395 +82 1.447 +83 1.502 +84 1.560 +85 1.621 +86 1.686 +87 1.755 +88 1.827 +89 1.904 +90 1.985 +1 -0.849 +2 -0.913 +3 -0.970 +4 -1.019 +5 -1.061 +6 -1.097 +7 -1.126 +8 -1.150 +9 -1.167 +10 -1.180 +11 -1.187 +12 -1.190 +13 -1.188 +14 -1.182 +15 -1.172 +16 -1.158 +17 -1.140 +18 -1.120 +19 -1.096 +20 -1.069 +21 -1.040 +22 -1.009 +23 -0.975 +24 -0.939 +25 -0.902 +26 -0.862 +27 -0.822 +28 -0.780 +29 -0.737 +30 -0.693 +31 -0.648 +32 -0.603 +33 -0.557 +34 -0.510 +35 -0.463 +36 -0.416 +37 -0.369 +38 -0.322 +39 -0.275 +40 -0.229 +41 -0.182 +42 -0.136 +43 -0.090 +44 -0.045 +45 0.000 +46 0.044 +47 0.088 +48 0.131 +49 0.174 +50 0.216 +51 0.257 +52 0.297 +53 0.337 +54 0.377 +55 0.415 +56 0.454 +57 0.491 +58 0.528 +59 0.565 +60 0.601 +61 0.637 +62 0.673 +63 0.709 +64 0.744 +65 0.779 +66 0.815 +67 0.851 +68 0.887 +69 0.923 +70 0.960 +71 0.998 +72 1.036 +73 1.076 +74 1.116 +75 1.158 +76 1.201 +77 1.246 +78 1.293 +79 1.342 +80 1.393 +81 1.446 +82 1.502 +83 1.561 +84 1.622 +85 1.687 +86 1.756 +87 1.828 +88 1.904 +89 1.985 +90 2.070 +1 -0.592 +2 -0.628 +3 -0.660 +4 -0.687 +5 -0.710 +6 -0.729 +7 -0.744 +8 -0.756 +9 -0.764 +10 -0.769 +11 -0.771 +12 -0.771 +13 -0.767 +14 -0.761 +15 -0.752 +16 -0.742 +17 -0.729 +18 -0.714 +19 -0.698 +20 -0.680 +21 -0.660 +22 -0.639 +23 -0.617 +24 -0.593 +25 -0.568 +26 -0.543 +27 -0.517 +28 -0.490 +29 -0.462 +30 -0.434 +31 -0.405 +32 -0.377 +33 -0.347 +34 -0.318 +35 -0.288 +36 -0.259 +37 -0.229 +38 -0.200 +39 -0.171 +40 -0.141 +41 -0.113 +42 -0.084 +43 -0.056 +44 -0.028 +45 0.000 +46 0.027 +47 0.054 +48 0.080 +49 0.106 +50 0.132 +51 0.157 +52 0.181 +53 0.205 +54 0.229 +55 0.252 +56 0.275 +57 0.297 +58 0.319 +59 0.341 +60 0.362 +61 0.383 +62 0.404 +63 0.425 +64 0.445 +65 0.466 +66 0.486 +67 0.507 +68 0.527 +69 0.548 +70 0.569 +71 0.590 +72 0.612 +73 0.635 +74 0.658 +75 0.681 +76 0.706 +77 0.731 +78 0.758 +79 0.785 +80 0.814 +81 0.845 +82 0.877 +83 0.910 +84 0.945 +85 0.983 +86 1.022 +87 1.063 +88 1.107 +89 1.154 +90 1.203 +1 -0.343 +2 -0.364 +3 -0.382 +4 -0.398 +5 -0.411 +6 -0.422 +7 -0.431 +8 -0.437 +9 -0.442 +10 -0.445 +11 -0.446 +12 -0.446 +13 -0.444 +14 -0.440 +15 -0.435 +16 -0.429 +17 -0.422 +18 -0.413 +19 -0.403 +20 -0.393 +21 -0.382 +22 -0.369 +23 -0.356 +24 -0.343 +25 -0.329 +26 -0.314 +27 -0.299 +28 -0.283 +29 -0.267 +30 -0.251 +31 -0.234 +32 -0.218 +33 -0.201 +34 -0.184 +35 -0.167 +36 -0.150 +37 -0.133 +38 -0.116 +39 -0.099 +40 -0.082 +41 -0.065 +42 -0.049 +43 -0.032 +44 -0.016 +45 0.000 +46 0.016 +47 0.031 +48 0.047 +49 0.062 +50 0.076 +51 0.091 +52 0.105 +53 0.119 +54 0.132 +55 0.146 +56 0.159 +57 0.172 +58 0.185 +59 0.197 +60 0.210 +61 0.222 +62 0.234 +63 0.246 +64 0.258 +65 0.269 +66 0.281 +67 0.293 +68 0.305 +69 0.317 +70 0.329 +71 0.341 +72 0.354 +73 0.367 +74 0.380 +75 0.394 +76 0.408 +77 0.422 +78 0.437 +79 0.453 +80 0.470 +81 0.487 +82 0.505 +83 0.525 +84 0.545 +85 0.566 +86 0.589 +87 0.612 +88 0.637 +89 0.664 +90 0.692 +1 -0.032 +2 -0.031 +3 -0.030 +4 -0.029 +5 -0.028 +6 -0.027 +7 -0.026 +8 -0.025 +9 -0.024 +10 -0.023 +11 -0.022 +12 -0.021 +13 -0.020 +14 -0.019 +15 -0.018 +16 -0.017 +17 -0.016 +18 -0.015 +19 -0.014 +20 -0.013 +21 -0.012 +22 -0.012 +23 -0.011 +24 -0.010 +25 -0.009 +26 -0.009 +27 -0.008 +28 -0.007 +29 -0.007 +30 -0.006 +31 -0.005 +32 -0.005 +33 -0.004 +34 -0.004 +35 -0.003 +36 -0.003 +37 -0.002 +38 -0.002 +39 -0.002 +40 -0.001 +41 -0.001 +42 -0.001 +43 -0.000 +44 -0.000 +45 -0.000 +46 0.000 +47 0.000 +48 0.000 +49 0.000 +50 0.000 +51 0.000 +52 0.000 +53 0.000 +54 0.000 +55 0.000 +56 -0.000 +57 -0.000 +58 -0.000 +59 -0.001 +60 -0.001 +61 -0.001 +62 -0.002 +63 -0.002 +64 -0.003 +65 -0.003 +66 -0.004 +67 -0.004 +68 -0.005 +69 -0.005 +70 -0.006 +71 -0.007 +72 -0.007 +73 -0.008 +74 -0.009 +75 -0.010 +76 -0.011 +77 -0.011 +78 -0.012 +79 -0.013 +80 -0.014 +81 -0.015 +82 -0.016 +83 -0.018 +84 -0.019 +85 -0.020 +86 -0.021 +87 -0.022 +88 -0.023 +89 -0.025 +90 -0.026 +1 0.387 +2 0.410 +3 0.430 +4 0.447 +5 0.462 +6 0.474 +7 0.484 +8 0.491 +9 0.496 +10 0.499 +11 0.500 +12 0.500 +13 0.497 +14 0.493 +15 0.487 +16 0.480 +17 0.472 +18 0.462 +19 0.451 +20 0.440 +21 0.427 +22 0.413 +23 0.398 +24 0.383 +25 0.367 +26 0.351 +27 0.334 +28 0.316 +29 0.298 +30 0.280 +31 0.262 +32 0.243 +33 0.224 +34 0.205 +35 0.186 +36 0.167 +37 0.148 +38 0.129 +39 0.110 +40 0.091 +41 0.072 +42 0.054 +43 0.036 +44 0.018 +45 -0.000 +46 -0.017 +47 -0.035 +48 -0.052 +49 -0.068 +50 -0.085 +51 -0.101 +52 -0.116 +53 -0.132 +54 -0.147 +55 -0.162 +56 -0.176 +57 -0.190 +58 -0.205 +59 -0.218 +60 -0.232 +61 -0.245 +62 -0.259 +63 -0.272 +64 -0.285 +65 -0.298 +66 -0.311 +67 -0.324 +68 -0.337 +69 -0.351 +70 -0.364 +71 -0.378 +72 -0.392 +73 -0.406 +74 -0.421 +75 -0.436 +76 -0.452 +77 -0.468 +78 -0.485 +79 -0.503 +80 -0.521 +81 -0.541 +82 -0.561 +83 -0.583 +84 -0.606 +85 -0.630 +86 -0.655 +87 -0.682 +88 -0.710 +89 -0.740 +90 -0.772 +1 0.673 +2 0.712 +3 0.745 +4 0.775 +5 0.799 +6 0.819 +7 0.835 +8 0.847 +9 0.856 +10 0.860 +11 0.862 +12 0.860 +13 0.856 +14 0.848 +15 0.838 +16 0.826 +17 0.811 +18 0.794 +19 0.775 +20 0.755 +21 0.733 +22 0.709 +23 0.684 +24 0.657 +25 0.630 +26 0.602 +27 0.572 +28 0.542 +29 0.511 +30 0.480 +31 0.448 +32 0.416 +33 0.384 +34 0.351 +35 0.318 +36 0.286 +37 0.253 +38 0.220 +39 0.188 +40 0.156 +41 0.124 +42 0.092 +43 0.061 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.059 +48 -0.088 +49 -0.117 +50 -0.145 +51 -0.172 +52 -0.199 +53 -0.225 +54 -0.251 +55 -0.276 +56 -0.301 +57 -0.325 +58 -0.349 +59 -0.372 +60 -0.396 +61 -0.418 +62 -0.441 +63 -0.463 +64 -0.485 +65 -0.508 +66 -0.530 +67 -0.552 +68 -0.574 +69 -0.596 +70 -0.619 +71 -0.642 +72 -0.666 +73 -0.690 +74 -0.714 +75 -0.740 +76 -0.766 +77 -0.794 +78 -0.823 +79 -0.852 +80 -0.884 +81 -0.917 +82 -0.951 +83 -0.987 +84 -1.026 +85 -1.066 +86 -1.109 +87 -1.154 +88 -1.202 +89 -1.252 +90 -1.306 +1 1.346 +2 1.414 +3 1.473 +4 1.523 +5 1.564 +6 1.598 +7 1.623 +8 1.642 +9 1.654 +10 1.660 +11 1.659 +12 1.653 +13 1.641 +14 1.624 +15 1.603 +16 1.577 +17 1.546 +18 1.513 +19 1.475 +20 1.434 +21 1.391 +22 1.344 +23 1.295 +24 1.244 +25 1.191 +26 1.137 +27 1.080 +28 1.023 +29 0.964 +30 0.904 +31 0.844 +32 0.782 +33 0.721 +34 0.659 +35 0.597 +36 0.536 +37 0.474 +38 0.413 +39 0.352 +40 0.291 +41 0.232 +42 0.172 +43 0.114 +44 0.057 +45 -0.000 +46 -0.056 +47 -0.110 +48 -0.164 +49 -0.217 +50 -0.268 +51 -0.318 +52 -0.368 +53 -0.416 +54 -0.463 +55 -0.510 +56 -0.555 +57 -0.599 +58 -0.642 +59 -0.685 +60 -0.727 +61 -0.768 +62 -0.808 +63 -0.849 +64 -0.888 +65 -0.928 +66 -0.967 +67 -1.006 +68 -1.045 +69 -1.085 +70 -1.125 +71 -1.166 +72 -1.207 +73 -1.249 +74 -1.293 +75 -1.338 +76 -1.384 +77 -1.433 +78 -1.483 +79 -1.535 +80 -1.591 +81 -1.648 +82 -1.709 +83 -1.773 +84 -1.841 +85 -1.912 +86 -1.988 +87 -2.068 +88 -2.153 +89 -2.243 +90 -2.339 +1 1.025 +2 1.086 +3 1.139 +4 1.185 +5 1.224 +6 1.256 +7 1.282 +8 1.301 +9 1.315 +10 1.323 +11 1.326 +12 1.324 +13 1.317 +14 1.307 +15 1.292 +16 1.273 +17 1.251 +18 1.225 +19 1.197 +20 1.165 +21 1.131 +22 1.095 +23 1.057 +24 1.016 +25 0.974 +26 0.930 +27 0.885 +28 0.839 +29 0.791 +30 0.743 +31 0.694 +32 0.644 +33 0.594 +34 0.544 +35 0.493 +36 0.443 +37 0.392 +38 0.342 +39 0.292 +40 0.242 +41 0.192 +42 0.143 +43 0.095 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.092 +48 -0.137 +49 -0.181 +50 -0.225 +51 -0.267 +52 -0.309 +53 -0.350 +54 -0.391 +55 -0.430 +56 -0.469 +57 -0.507 +58 -0.544 +59 -0.581 +60 -0.617 +61 -0.653 +62 -0.689 +63 -0.724 +64 -0.759 +65 -0.793 +66 -0.828 +67 -0.863 +68 -0.898 +69 -0.933 +70 -0.969 +71 -1.005 +72 -1.043 +73 -1.081 +74 -1.120 +75 -1.160 +76 -1.202 +77 -1.245 +78 -1.290 +79 -1.337 +80 -1.386 +81 -1.438 +82 -1.492 +83 -1.549 +84 -1.609 +85 -1.673 +86 -1.740 +87 -1.811 +88 -1.886 +89 -1.965 +90 -2.049 +1 1.177 +2 1.248 +3 1.310 +4 1.364 +5 1.409 +6 1.446 +7 1.476 +8 1.499 +9 1.515 +10 1.525 +11 1.529 +12 1.527 +13 1.520 +14 1.507 +15 1.490 +16 1.469 +17 1.443 +18 1.414 +19 1.381 +20 1.345 +21 1.306 +22 1.264 +23 1.220 +24 1.173 +25 1.125 +26 1.074 +27 1.022 +28 0.968 +29 0.914 +30 0.858 +31 0.801 +32 0.744 +33 0.686 +34 0.628 +35 0.570 +36 0.512 +37 0.453 +38 0.395 +39 0.337 +40 0.279 +41 0.222 +42 0.166 +43 0.110 +44 0.054 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.159 +49 -0.210 +50 -0.260 +51 -0.309 +52 -0.357 +53 -0.405 +54 -0.451 +55 -0.497 +56 -0.542 +57 -0.586 +58 -0.629 +59 -0.671 +60 -0.713 +61 -0.755 +62 -0.796 +63 -0.836 +64 -0.877 +65 -0.917 +66 -0.957 +67 -0.997 +68 -1.038 +69 -1.079 +70 -1.120 +71 -1.162 +72 -1.205 +73 -1.249 +74 -1.294 +75 -1.341 +76 -1.389 +77 -1.440 +78 -1.492 +79 -1.546 +80 -1.603 +81 -1.663 +82 -1.726 +83 -1.792 +84 -1.862 +85 -1.936 +86 -2.013 +87 -2.096 +88 -2.183 +89 -2.275 +90 -2.372 +1 1.047 +2 1.115 +3 1.174 +4 1.225 +5 1.269 +6 1.305 +7 1.335 +8 1.358 +9 1.374 +10 1.385 +11 1.390 +12 1.390 +13 1.384 +14 1.374 +15 1.360 +16 1.342 +17 1.319 +18 1.293 +19 1.264 +20 1.232 +21 1.197 +22 1.159 +23 1.119 +24 1.077 +25 1.033 +26 0.987 +27 0.940 +28 0.891 +29 0.841 +30 0.790 +31 0.738 +32 0.686 +33 0.633 +34 0.580 +35 0.526 +36 0.472 +37 0.419 +38 0.365 +39 0.312 +40 0.258 +41 0.206 +42 0.153 +43 0.102 +44 0.051 +45 -0.000 +46 -0.050 +47 -0.099 +48 -0.147 +49 -0.195 +50 -0.242 +51 -0.287 +52 -0.333 +53 -0.377 +54 -0.420 +55 -0.463 +56 -0.505 +57 -0.547 +58 -0.587 +59 -0.628 +60 -0.667 +61 -0.706 +62 -0.745 +63 -0.784 +64 -0.822 +65 -0.860 +66 -0.898 +67 -0.937 +68 -0.975 +69 -1.014 +70 -1.054 +71 -1.094 +72 -1.135 +73 -1.178 +74 -1.221 +75 -1.265 +76 -1.312 +77 -1.360 +78 -1.410 +79 -1.462 +80 -1.516 +81 -1.573 +82 -1.633 +83 -1.696 +84 -1.763 +85 -1.833 +86 -1.906 +87 -1.984 +88 -2.067 +89 -2.154 +90 -2.246 +1 1.361 +2 1.441 +3 1.510 +4 1.570 +5 1.621 +6 1.663 +7 1.696 +8 1.721 +9 1.739 +10 1.749 +11 1.753 +12 1.750 +13 1.741 +14 1.727 +15 1.707 +16 1.682 +17 1.652 +18 1.618 +19 1.580 +20 1.539 +21 1.494 +22 1.446 +23 1.395 +24 1.341 +25 1.285 +26 1.227 +27 1.168 +28 1.106 +29 1.044 +30 0.980 +31 0.915 +32 0.850 +33 0.784 +34 0.717 +35 0.651 +36 0.584 +37 0.517 +38 0.451 +39 0.384 +40 0.319 +41 0.254 +42 0.189 +43 0.125 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.181 +49 -0.239 +50 -0.296 +51 -0.352 +52 -0.407 +53 -0.461 +54 -0.514 +55 -0.566 +56 -0.617 +57 -0.667 +58 -0.716 +59 -0.764 +60 -0.812 +61 -0.859 +62 -0.905 +63 -0.951 +64 -0.997 +65 -1.042 +66 -1.088 +67 -1.133 +68 -1.179 +69 -1.225 +70 -1.272 +71 -1.320 +72 -1.368 +73 -1.418 +74 -1.469 +75 -1.521 +76 -1.576 +77 -1.633 +78 -1.691 +79 -1.753 +80 -1.817 +81 -1.885 +82 -1.956 +83 -2.030 +84 -2.109 +85 -2.192 +86 -2.280 +87 -2.372 +88 -2.470 +89 -2.574 +90 -2.684 +1 1.331 +2 1.409 +3 1.477 +4 1.535 +5 1.584 +6 1.625 +7 1.657 +8 1.681 +9 1.698 +10 1.708 +11 1.712 +12 1.709 +13 1.700 +14 1.685 +15 1.666 +16 1.641 +17 1.612 +18 1.579 +19 1.542 +20 1.502 +21 1.458 +22 1.411 +23 1.361 +24 1.308 +25 1.254 +26 1.197 +27 1.139 +28 1.079 +29 1.018 +30 0.956 +31 0.893 +32 0.829 +33 0.764 +34 0.700 +35 0.635 +36 0.569 +37 0.504 +38 0.440 +39 0.375 +40 0.311 +41 0.247 +42 0.184 +43 0.122 +44 0.061 +45 -0.000 +46 -0.060 +47 -0.118 +48 -0.176 +49 -0.233 +50 -0.289 +51 -0.343 +52 -0.397 +53 -0.449 +54 -0.501 +55 -0.551 +56 -0.601 +57 -0.650 +58 -0.698 +59 -0.745 +60 -0.791 +61 -0.837 +62 -0.882 +63 -0.927 +64 -0.971 +65 -1.015 +66 -1.060 +67 -1.104 +68 -1.149 +69 -1.193 +70 -1.239 +71 -1.285 +72 -1.332 +73 -1.381 +74 -1.430 +75 -1.482 +76 -1.535 +77 -1.590 +78 -1.647 +79 -1.707 +80 -1.769 +81 -1.835 +82 -1.904 +83 -1.976 +84 -2.053 +85 -2.133 +86 -2.219 +87 -2.309 +88 -2.404 +89 -2.505 +90 -2.612 +1 1.896 +2 1.991 +3 2.073 +4 2.143 +5 2.201 +6 2.248 +7 2.284 +8 2.310 +9 2.327 +10 2.335 +11 2.334 +12 2.325 +13 2.308 +14 2.284 +15 2.254 +16 2.217 +17 2.175 +18 2.127 +19 2.074 +20 2.017 +21 1.956 +22 1.890 +23 1.822 +24 1.750 +25 1.675 +26 1.598 +27 1.519 +28 1.438 +29 1.355 +30 1.271 +31 1.186 +32 1.100 +33 1.014 +34 0.927 +35 0.840 +36 0.753 +37 0.666 +38 0.580 +39 0.495 +40 0.410 +41 0.326 +42 0.242 +43 0.160 +44 0.080 +45 -0.000 +46 -0.078 +47 -0.155 +48 -0.230 +49 -0.304 +50 -0.377 +51 -0.448 +52 -0.517 +53 -0.585 +54 -0.651 +55 -0.716 +56 -0.779 +57 -0.842 +58 -0.903 +59 -0.962 +60 -1.021 +61 -1.079 +62 -1.135 +63 -1.192 +64 -1.247 +65 -1.302 +66 -1.357 +67 -1.412 +68 -1.467 +69 -1.523 +70 -1.579 +71 -1.636 +72 -1.694 +73 -1.753 +74 -1.814 +75 -1.877 +76 -1.942 +77 -2.009 +78 -2.080 +79 -2.153 +80 -2.230 +81 -2.311 +82 -2.396 +83 -2.485 +84 -2.580 +85 -2.680 +86 -2.786 +87 -2.898 +88 -3.017 +89 -3.142 +90 -3.276 +1 1.513 +2 1.598 +3 1.673 +4 1.736 +5 1.790 +6 1.834 +7 1.869 +8 1.895 +9 1.913 +10 1.923 +11 1.926 +12 1.922 +13 1.911 +14 1.894 +15 1.871 +16 1.843 +17 1.810 +18 1.772 +19 1.730 +20 1.684 +21 1.634 +22 1.581 +23 1.525 +24 1.466 +25 1.405 +26 1.341 +27 1.276 +28 1.209 +29 1.140 +30 1.070 +31 0.999 +32 0.927 +33 0.855 +34 0.783 +35 0.710 +36 0.637 +37 0.564 +38 0.491 +39 0.419 +40 0.347 +41 0.276 +42 0.206 +43 0.136 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.132 +48 -0.197 +49 -0.260 +50 -0.322 +51 -0.383 +52 -0.442 +53 -0.501 +54 -0.558 +55 -0.615 +56 -0.670 +57 -0.724 +58 -0.777 +59 -0.829 +60 -0.881 +61 -0.931 +62 -0.981 +63 -1.031 +64 -1.080 +65 -1.129 +66 -1.178 +67 -1.227 +68 -1.276 +69 -1.326 +70 -1.376 +71 -1.427 +72 -1.479 +73 -1.532 +74 -1.587 +75 -1.644 +76 -1.702 +77 -1.763 +78 -1.826 +79 -1.892 +80 -1.961 +81 -2.033 +82 -2.109 +83 -2.189 +84 -2.273 +85 -2.362 +86 -2.456 +87 -2.556 +88 -2.661 +89 -2.773 +90 -2.891 +1 1.586 +2 1.676 +3 1.755 +4 1.822 +5 1.879 +6 1.926 +7 1.963 +8 1.990 +9 2.009 +10 2.020 +11 2.023 +12 2.019 +13 2.008 +14 1.990 +15 1.967 +16 1.937 +17 1.902 +18 1.863 +19 1.819 +20 1.770 +21 1.718 +22 1.662 +23 1.603 +24 1.541 +25 1.477 +26 1.410 +27 1.341 +28 1.271 +29 1.198 +30 1.125 +31 1.050 +32 0.975 +33 0.899 +34 0.823 +35 0.746 +36 0.669 +37 0.593 +38 0.517 +39 0.441 +40 0.365 +41 0.290 +42 0.216 +43 0.143 +44 0.071 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.207 +49 -0.273 +50 -0.338 +51 -0.402 +52 -0.465 +53 -0.527 +54 -0.587 +55 -0.646 +56 -0.704 +57 -0.761 +58 -0.817 +59 -0.872 +60 -0.926 +61 -0.979 +62 -1.032 +63 -1.084 +64 -1.136 +65 -1.187 +66 -1.239 +67 -1.290 +68 -1.342 +69 -1.394 +70 -1.447 +71 -1.501 +72 -1.555 +73 -1.612 +74 -1.669 +75 -1.729 +76 -1.790 +77 -1.854 +78 -1.920 +79 -1.990 +80 -2.062 +81 -2.139 +82 -2.219 +83 -2.303 +84 -2.392 +85 -2.486 +86 -2.585 +87 -2.690 +88 -2.801 +89 -2.919 +90 -3.043 +1 1.947 +2 2.046 +3 2.131 +4 2.204 +5 2.264 +6 2.313 +7 2.351 +8 2.378 +9 2.395 +10 2.404 +11 2.403 +12 2.394 +13 2.377 +14 2.353 +15 2.322 +16 2.284 +17 2.241 +18 2.192 +19 2.138 +20 2.079 +21 2.016 +22 1.949 +23 1.878 +24 1.804 +25 1.727 +26 1.648 +27 1.566 +28 1.483 +29 1.398 +30 1.311 +31 1.223 +32 1.135 +33 1.046 +34 0.956 +35 0.867 +36 0.777 +37 0.688 +38 0.599 +39 0.510 +40 0.423 +41 0.336 +42 0.250 +43 0.166 +44 0.082 +45 -0.000 +46 -0.081 +47 -0.160 +48 -0.238 +49 -0.314 +50 -0.389 +51 -0.462 +52 -0.534 +53 -0.604 +54 -0.673 +55 -0.740 +56 -0.806 +57 -0.870 +58 -0.933 +59 -0.995 +60 -1.056 +61 -1.116 +62 -1.175 +63 -1.233 +64 -1.291 +65 -1.348 +66 -1.405 +67 -1.462 +68 -1.519 +69 -1.577 +70 -1.635 +71 -1.694 +72 -1.754 +73 -1.816 +74 -1.879 +75 -1.944 +76 -2.012 +77 -2.082 +78 -2.155 +79 -2.231 +80 -2.311 +81 -2.395 +82 -2.483 +83 -2.576 +84 -2.674 +85 -2.777 +86 -2.887 +87 -3.003 +88 -3.126 +89 -3.257 +90 -3.395 +1 1.960 +2 2.061 +3 2.148 +4 2.221 +5 2.283 +6 2.333 +7 2.372 +8 2.400 +9 2.418 +10 2.427 +11 2.426 +12 2.418 +13 2.401 +14 2.377 +15 2.346 +16 2.308 +17 2.264 +18 2.215 +19 2.161 +20 2.101 +21 2.038 +22 1.970 +23 1.899 +24 1.824 +25 1.746 +26 1.666 +27 1.584 +28 1.500 +29 1.413 +30 1.326 +31 1.237 +32 1.148 +33 1.058 +34 0.967 +35 0.877 +36 0.786 +37 0.696 +38 0.606 +39 0.517 +40 0.428 +41 0.340 +42 0.253 +43 0.168 +44 0.083 +45 -0.000 +46 -0.082 +47 -0.162 +48 -0.241 +49 -0.318 +50 -0.394 +51 -0.468 +52 -0.541 +53 -0.612 +54 -0.682 +55 -0.750 +56 -0.816 +57 -0.882 +58 -0.946 +59 -1.008 +60 -1.070 +61 -1.131 +62 -1.190 +63 -1.250 +64 -1.308 +65 -1.366 +66 -1.424 +67 -1.482 +68 -1.540 +69 -1.599 +70 -1.658 +71 -1.718 +72 -1.779 +73 -1.842 +74 -1.906 +75 -1.972 +76 -2.041 +77 -2.112 +78 -2.187 +79 -2.264 +80 -2.345 +81 -2.430 +82 -2.520 +83 -2.614 +84 -2.714 +85 -2.820 +86 -2.931 +87 -3.049 +88 -3.174 +89 -3.307 +90 -3.447 +1 2.090 +2 2.193 +3 2.282 +4 2.357 +5 2.419 +6 2.469 +7 2.508 +8 2.535 +9 2.552 +10 2.560 +11 2.558 +12 2.547 +13 2.528 +14 2.502 +15 2.468 +16 2.427 +17 2.380 +18 2.327 +19 2.269 +20 2.206 +21 2.139 +22 2.067 +23 1.991 +24 1.913 +25 1.831 +26 1.746 +27 1.659 +28 1.570 +29 1.480 +30 1.388 +31 1.295 +32 1.201 +33 1.107 +34 1.012 +35 0.917 +36 0.822 +37 0.727 +38 0.633 +39 0.539 +40 0.447 +41 0.355 +42 0.264 +43 0.175 +44 0.087 +45 -0.000 +46 -0.085 +47 -0.169 +48 -0.251 +49 -0.331 +50 -0.410 +51 -0.487 +52 -0.563 +53 -0.636 +54 -0.709 +55 -0.779 +56 -0.848 +57 -0.915 +58 -0.982 +59 -1.046 +60 -1.110 +61 -1.172 +62 -1.234 +63 -1.295 +64 -1.355 +65 -1.414 +66 -1.474 +67 -1.533 +68 -1.593 +69 -1.653 +70 -1.713 +71 -1.774 +72 -1.837 +73 -1.901 +74 -1.966 +75 -2.034 +76 -2.104 +77 -2.177 +78 -2.253 +79 -2.332 +80 -2.415 +81 -2.502 +82 -2.594 +83 -2.691 +84 -2.793 +85 -2.901 +86 -3.015 +87 -3.136 +88 -3.264 +89 -3.401 +90 -3.545 +1 2.220 +2 2.326 +3 2.417 +4 2.494 +5 2.558 +6 2.609 +7 2.648 +8 2.676 +9 2.692 +10 2.699 +11 2.695 +12 2.683 +13 2.662 +14 2.633 +15 2.597 +16 2.553 +17 2.503 +18 2.447 +19 2.385 +20 2.319 +21 2.247 +22 2.171 +23 2.091 +24 2.008 +25 1.922 +26 1.833 +27 1.741 +28 1.648 +29 1.553 +30 1.456 +31 1.358 +32 1.259 +33 1.160 +34 1.061 +35 0.961 +36 0.861 +37 0.762 +38 0.663 +39 0.565 +40 0.468 +41 0.372 +42 0.277 +43 0.183 +44 0.091 +45 -0.000 +46 -0.089 +47 -0.177 +48 -0.263 +49 -0.347 +50 -0.429 +51 -0.510 +52 -0.588 +53 -0.665 +54 -0.740 +55 -0.814 +56 -0.886 +57 -0.956 +58 -1.025 +59 -1.092 +60 -1.158 +61 -1.223 +62 -1.287 +63 -1.350 +64 -1.413 +65 -1.475 +66 -1.536 +67 -1.598 +68 -1.659 +69 -1.721 +70 -1.784 +71 -1.847 +72 -1.912 +73 -1.978 +74 -2.046 +75 -2.116 +76 -2.189 +77 -2.264 +78 -2.342 +79 -2.424 +80 -2.510 +81 -2.600 +82 -2.695 +83 -2.795 +84 -2.901 +85 -3.012 +86 -3.131 +87 -3.256 +88 -3.389 +89 -3.530 +90 -3.680 +1 2.067 +2 2.169 +3 2.258 +4 2.333 +5 2.396 +6 2.446 +7 2.485 +8 2.513 +9 2.531 +10 2.539 +11 2.537 +12 2.527 +13 2.509 +14 2.483 +15 2.450 +16 2.410 +17 2.363 +18 2.311 +19 2.254 +20 2.191 +21 2.124 +22 2.053 +23 1.979 +24 1.900 +25 1.819 +26 1.735 +27 1.649 +28 1.561 +29 1.471 +30 1.380 +31 1.288 +32 1.194 +33 1.100 +34 1.006 +35 0.912 +36 0.817 +37 0.723 +38 0.630 +39 0.537 +40 0.445 +41 0.353 +42 0.263 +43 0.174 +44 0.086 +45 -0.000 +46 -0.085 +47 -0.168 +48 -0.250 +49 -0.330 +50 -0.409 +51 -0.485 +52 -0.561 +53 -0.634 +54 -0.706 +55 -0.776 +56 -0.845 +57 -0.912 +58 -0.978 +59 -1.043 +60 -1.107 +61 -1.169 +62 -1.231 +63 -1.291 +64 -1.351 +65 -1.411 +66 -1.471 +67 -1.530 +68 -1.589 +69 -1.649 +70 -1.710 +71 -1.771 +72 -1.834 +73 -1.898 +74 -1.964 +75 -2.032 +76 -2.102 +77 -2.175 +78 -2.251 +79 -2.330 +80 -2.413 +81 -2.500 +82 -2.592 +83 -2.689 +84 -2.791 +85 -2.899 +86 -3.013 +87 -3.134 +88 -3.263 +89 -3.399 +90 -3.543 +1 1.903 +2 2.005 +3 2.092 +4 2.167 +5 2.230 +6 2.281 +7 2.321 +8 2.350 +9 2.370 +10 2.380 +11 2.381 +12 2.374 +13 2.358 +14 2.336 +15 2.306 +16 2.270 +17 2.228 +18 2.180 +19 2.127 +20 2.069 +21 2.007 +22 1.941 +23 1.871 +24 1.798 +25 1.722 +26 1.644 +27 1.563 +28 1.480 +29 1.395 +30 1.309 +31 1.222 +32 1.134 +33 1.045 +34 0.956 +35 0.867 +36 0.777 +37 0.688 +38 0.599 +39 0.511 +40 0.423 +41 0.337 +42 0.251 +43 0.166 +44 0.082 +45 -0.000 +46 -0.081 +47 -0.161 +48 -0.239 +49 -0.315 +50 -0.391 +51 -0.464 +52 -0.537 +53 -0.607 +54 -0.676 +55 -0.744 +56 -0.810 +57 -0.875 +58 -0.939 +59 -1.002 +60 -1.063 +61 -1.124 +62 -1.184 +63 -1.243 +64 -1.302 +65 -1.360 +66 -1.418 +67 -1.476 +68 -1.535 +69 -1.593 +70 -1.653 +71 -1.713 +72 -1.775 +73 -1.838 +74 -1.903 +75 -1.970 +76 -2.039 +77 -2.111 +78 -2.185 +79 -2.263 +80 -2.345 +81 -2.431 +82 -2.521 +83 -2.616 +84 -2.717 +85 -2.823 +86 -2.935 +87 -3.053 +88 -3.179 +89 -3.312 +90 -3.453 +1 1.825 +2 1.921 +3 2.003 +4 2.073 +5 2.132 +6 2.180 +7 2.217 +8 2.244 +9 2.262 +10 2.271 +11 2.271 +12 2.263 +13 2.248 +14 2.226 +15 2.198 +16 2.163 +17 2.122 +18 2.076 +19 2.026 +20 1.970 +21 1.911 +22 1.848 +23 1.781 +24 1.711 +25 1.639 +26 1.564 +27 1.487 +28 1.408 +29 1.327 +30 1.245 +31 1.162 +32 1.078 +33 0.994 +34 0.909 +35 0.824 +36 0.739 +37 0.654 +38 0.569 +39 0.486 +40 0.402 +41 0.320 +42 0.238 +43 0.158 +44 0.078 +45 -0.000 +46 -0.077 +47 -0.153 +48 -0.227 +49 -0.300 +50 -0.371 +51 -0.441 +52 -0.509 +53 -0.576 +54 -0.642 +55 -0.706 +56 -0.769 +57 -0.831 +58 -0.891 +59 -0.950 +60 -1.009 +61 -1.066 +62 -1.123 +63 -1.179 +64 -1.234 +65 -1.289 +66 -1.344 +67 -1.399 +68 -1.454 +69 -1.510 +70 -1.566 +71 -1.623 +72 -1.681 +73 -1.741 +74 -1.802 +75 -1.865 +76 -1.930 +77 -1.998 +78 -2.068 +79 -2.142 +80 -2.219 +81 -2.300 +82 -2.385 +83 -2.475 +84 -2.570 +85 -2.670 +86 -2.775 +87 -2.887 +88 -3.006 +89 -3.132 +90 -3.265 +1 1.722 +2 1.812 +3 1.891 +4 1.958 +5 2.014 +6 2.060 +7 2.095 +8 2.121 +9 2.138 +10 2.147 +11 2.148 +12 2.141 +13 2.127 +14 2.106 +15 2.079 +16 2.047 +17 2.008 +18 1.965 +19 1.917 +20 1.865 +21 1.809 +22 1.749 +23 1.686 +24 1.620 +25 1.552 +26 1.481 +27 1.408 +28 1.333 +29 1.257 +30 1.179 +31 1.100 +32 1.021 +33 0.941 +34 0.861 +35 0.780 +36 0.700 +37 0.619 +38 0.539 +39 0.460 +40 0.381 +41 0.303 +42 0.226 +43 0.149 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.215 +49 -0.284 +50 -0.351 +51 -0.418 +52 -0.483 +53 -0.546 +54 -0.608 +55 -0.669 +56 -0.729 +57 -0.787 +58 -0.844 +59 -0.901 +60 -0.956 +61 -1.010 +62 -1.064 +63 -1.117 +64 -1.170 +65 -1.222 +66 -1.274 +67 -1.327 +68 -1.379 +69 -1.432 +70 -1.485 +71 -1.539 +72 -1.594 +73 -1.651 +74 -1.709 +75 -1.769 +76 -1.831 +77 -1.895 +78 -1.962 +79 -2.032 +80 -2.106 +81 -2.183 +82 -2.264 +83 -2.349 +84 -2.439 +85 -2.534 +86 -2.635 +87 -2.741 +88 -2.854 +89 -2.973 +90 -3.100 +1 1.743 +2 1.829 +3 1.903 +4 1.967 +5 2.019 +6 2.061 +7 2.094 +8 2.117 +9 2.132 +10 2.138 +11 2.137 +12 2.128 +13 2.113 +14 2.091 +15 2.062 +16 2.029 +17 1.990 +18 1.946 +19 1.897 +20 1.844 +21 1.788 +22 1.728 +23 1.665 +24 1.599 +25 1.531 +26 1.460 +27 1.388 +28 1.314 +29 1.238 +30 1.161 +31 1.083 +32 1.005 +33 0.926 +34 0.846 +35 0.767 +36 0.688 +37 0.608 +38 0.530 +39 0.451 +40 0.374 +41 0.297 +42 0.221 +43 0.146 +44 0.073 +45 -0.000 +46 -0.071 +47 -0.141 +48 -0.210 +49 -0.278 +50 -0.343 +51 -0.408 +52 -0.471 +53 -0.533 +54 -0.593 +55 -0.652 +56 -0.710 +57 -0.767 +58 -0.822 +59 -0.877 +60 -0.930 +61 -0.982 +62 -1.034 +63 -1.085 +64 -1.136 +65 -1.186 +66 -1.236 +67 -1.286 +68 -1.336 +69 -1.386 +70 -1.437 +71 -1.489 +72 -1.541 +73 -1.595 +74 -1.651 +75 -1.708 +76 -1.767 +77 -1.828 +78 -1.892 +79 -1.959 +80 -2.029 +81 -2.102 +82 -2.179 +83 -2.261 +84 -2.347 +85 -2.438 +86 -2.534 +87 -2.636 +88 -2.745 +89 -2.859 +90 -2.981 +1 1.690 +2 1.769 +3 1.836 +4 1.894 +5 1.941 +6 1.979 +7 2.007 +8 2.027 +9 2.039 +10 2.044 +11 2.040 +12 2.030 +13 2.014 +14 1.992 +15 1.964 +16 1.930 +17 1.892 +18 1.849 +19 1.802 +20 1.751 +21 1.697 +22 1.640 +23 1.579 +24 1.516 +25 1.451 +26 1.383 +27 1.314 +28 1.243 +29 1.171 +30 1.098 +31 1.024 +32 0.949 +33 0.875 +34 0.799 +35 0.724 +36 0.649 +37 0.574 +38 0.499 +39 0.426 +40 0.352 +41 0.280 +42 0.208 +43 0.138 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.133 +48 -0.197 +49 -0.261 +50 -0.322 +51 -0.383 +52 -0.442 +53 -0.500 +54 -0.556 +55 -0.611 +56 -0.665 +57 -0.718 +58 -0.769 +59 -0.820 +60 -0.869 +61 -0.918 +62 -0.965 +63 -1.012 +64 -1.059 +65 -1.105 +66 -1.151 +67 -1.197 +68 -1.243 +69 -1.289 +70 -1.336 +71 -1.383 +72 -1.432 +73 -1.481 +74 -1.532 +75 -1.584 +76 -1.638 +77 -1.694 +78 -1.753 +79 -1.814 +80 -1.878 +81 -1.945 +82 -2.016 +83 -2.091 +84 -2.170 +85 -2.254 +86 -2.343 +87 -2.437 +88 -2.537 +89 -2.643 +90 -2.755 +1 1.226 +2 1.281 +3 1.329 +4 1.370 +5 1.403 +6 1.429 +7 1.449 +8 1.463 +9 1.471 +10 1.473 +11 1.471 +12 1.463 +13 1.451 +14 1.434 +15 1.414 +16 1.389 +17 1.361 +18 1.330 +19 1.296 +20 1.259 +21 1.220 +22 1.178 +23 1.135 +24 1.089 +25 1.042 +26 0.993 +27 0.943 +28 0.892 +29 0.841 +30 0.788 +31 0.735 +32 0.681 +33 0.627 +34 0.573 +35 0.519 +36 0.465 +37 0.411 +38 0.358 +39 0.305 +40 0.252 +41 0.200 +42 0.149 +43 0.099 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.095 +48 -0.141 +49 -0.186 +50 -0.231 +51 -0.274 +52 -0.316 +53 -0.357 +54 -0.397 +55 -0.436 +56 -0.475 +57 -0.512 +58 -0.549 +59 -0.585 +60 -0.620 +61 -0.654 +62 -0.688 +63 -0.721 +64 -0.754 +65 -0.787 +66 -0.820 +67 -0.852 +68 -0.884 +69 -0.917 +70 -0.950 +71 -0.983 +72 -1.017 +73 -1.052 +74 -1.088 +75 -1.125 +76 -1.163 +77 -1.203 +78 -1.244 +79 -1.287 +80 -1.332 +81 -1.380 +82 -1.430 +83 -1.483 +84 -1.539 +85 -1.599 +86 -1.662 +87 -1.728 +88 -1.799 +89 -1.874 +90 -1.954 +1 0.740 +2 0.773 +3 0.800 +4 0.824 +5 0.843 +6 0.858 +7 0.869 +8 0.877 +9 0.881 +10 0.882 +11 0.880 +12 0.875 +13 0.868 +14 0.857 +15 0.845 +16 0.830 +17 0.813 +18 0.794 +19 0.773 +20 0.751 +21 0.728 +22 0.703 +23 0.676 +24 0.649 +25 0.621 +26 0.592 +27 0.562 +28 0.531 +29 0.500 +30 0.469 +31 0.437 +32 0.405 +33 0.373 +34 0.341 +35 0.309 +36 0.277 +37 0.245 +38 0.213 +39 0.181 +40 0.150 +41 0.119 +42 0.089 +43 0.059 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.084 +49 -0.110 +50 -0.137 +51 -0.162 +52 -0.187 +53 -0.211 +54 -0.235 +55 -0.258 +56 -0.281 +57 -0.303 +58 -0.325 +59 -0.346 +60 -0.366 +61 -0.387 +62 -0.406 +63 -0.426 +64 -0.445 +65 -0.465 +66 -0.484 +67 -0.503 +68 -0.522 +69 -0.541 +70 -0.560 +71 -0.580 +72 -0.599 +73 -0.620 +74 -0.641 +75 -0.662 +76 -0.684 +77 -0.708 +78 -0.732 +79 -0.757 +80 -0.784 +81 -0.811 +82 -0.841 +83 -0.872 +84 -0.905 +85 -0.939 +86 -0.976 +87 -1.015 +88 -1.057 +89 -1.101 +90 -1.148 +1 0.255 +2 0.258 +3 0.259 +4 0.260 +5 0.260 +6 0.259 +7 0.258 +8 0.256 +9 0.253 +10 0.249 +11 0.246 +12 0.241 +13 0.236 +14 0.231 +15 0.225 +16 0.219 +17 0.212 +18 0.206 +19 0.199 +20 0.191 +21 0.184 +22 0.176 +23 0.168 +24 0.160 +25 0.152 +26 0.144 +27 0.136 +28 0.128 +29 0.119 +30 0.111 +31 0.103 +32 0.095 +33 0.087 +34 0.079 +35 0.071 +36 0.063 +37 0.055 +38 0.048 +39 0.040 +40 0.033 +41 0.026 +42 0.019 +43 0.013 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.017 +49 -0.023 +50 -0.028 +51 -0.033 +52 -0.037 +53 -0.042 +54 -0.046 +55 -0.050 +56 -0.054 +57 -0.057 +58 -0.061 +59 -0.064 +60 -0.067 +61 -0.070 +62 -0.072 +63 -0.075 +64 -0.077 +65 -0.079 +66 -0.081 +67 -0.083 +68 -0.085 +69 -0.087 +70 -0.089 +71 -0.091 +72 -0.093 +73 -0.094 +74 -0.096 +75 -0.098 +76 -0.100 +77 -0.102 +78 -0.104 +79 -0.106 +80 -0.109 +81 -0.112 +82 -0.115 +83 -0.118 +84 -0.121 +85 -0.125 +86 -0.130 +87 -0.134 +88 -0.139 +89 -0.145 +90 -0.151 +1 -0.257 +2 -0.285 +3 -0.310 +4 -0.332 +5 -0.351 +6 -0.368 +7 -0.382 +8 -0.393 +9 -0.403 +10 -0.410 +11 -0.416 +12 -0.419 +13 -0.421 +14 -0.421 +15 -0.419 +16 -0.416 +17 -0.411 +18 -0.405 +19 -0.398 +20 -0.390 +21 -0.380 +22 -0.370 +23 -0.358 +24 -0.346 +25 -0.333 +26 -0.319 +27 -0.305 +28 -0.290 +29 -0.275 +30 -0.259 +31 -0.243 +32 -0.226 +33 -0.209 +34 -0.192 +35 -0.175 +36 -0.158 +37 -0.140 +38 -0.123 +39 -0.105 +40 -0.087 +41 -0.070 +42 -0.052 +43 -0.035 +44 -0.017 +45 0.000 +46 0.017 +47 0.034 +48 0.051 +49 0.068 +50 0.084 +51 0.100 +52 0.116 +53 0.132 +54 0.148 +55 0.164 +56 0.179 +57 0.194 +58 0.210 +59 0.225 +60 0.240 +61 0.254 +62 0.269 +63 0.284 +64 0.299 +65 0.314 +66 0.329 +67 0.344 +68 0.360 +69 0.375 +70 0.391 +71 0.407 +72 0.424 +73 0.441 +74 0.458 +75 0.476 +76 0.495 +77 0.514 +78 0.534 +79 0.555 +80 0.577 +81 0.599 +82 0.623 +83 0.648 +84 0.674 +85 0.701 +86 0.730 +87 0.760 +88 0.792 +89 0.826 +90 0.861 +1 -0.556 +2 -0.606 +3 -0.651 +4 -0.691 +5 -0.725 +6 -0.754 +7 -0.779 +8 -0.799 +9 -0.815 +10 -0.827 +11 -0.835 +12 -0.840 +13 -0.841 +14 -0.839 +15 -0.834 +16 -0.826 +17 -0.815 +18 -0.802 +19 -0.786 +20 -0.768 +21 -0.749 +22 -0.727 +23 -0.704 +24 -0.679 +25 -0.653 +26 -0.625 +27 -0.597 +28 -0.567 +29 -0.536 +30 -0.505 +31 -0.473 +32 -0.440 +33 -0.407 +34 -0.374 +35 -0.340 +36 -0.306 +37 -0.271 +38 -0.237 +39 -0.203 +40 -0.169 +41 -0.134 +42 -0.100 +43 -0.067 +44 -0.033 +45 0.000 +46 0.033 +47 0.065 +48 0.098 +49 0.129 +50 0.161 +51 0.192 +52 0.223 +53 0.253 +54 0.283 +55 0.312 +56 0.341 +57 0.370 +58 0.399 +59 0.427 +60 0.455 +61 0.483 +62 0.510 +63 0.538 +64 0.566 +65 0.594 +66 0.621 +67 0.650 +68 0.678 +69 0.707 +70 0.736 +71 0.766 +72 0.796 +73 0.828 +74 0.860 +75 0.893 +76 0.927 +77 0.963 +78 1.000 +79 1.038 +80 1.079 +81 1.121 +82 1.165 +83 1.211 +84 1.259 +85 1.310 +86 1.364 +87 1.420 +88 1.479 +89 1.542 +90 1.608 +1 -0.872 +2 -0.946 +3 -1.012 +4 -1.069 +5 -1.119 +6 -1.162 +7 -1.197 +8 -1.226 +9 -1.248 +10 -1.265 +11 -1.275 +12 -1.281 +13 -1.281 +14 -1.277 +15 -1.268 +16 -1.254 +17 -1.237 +18 -1.216 +19 -1.192 +20 -1.164 +21 -1.133 +22 -1.100 +23 -1.064 +24 -1.026 +25 -0.986 +26 -0.944 +27 -0.900 +28 -0.855 +29 -0.809 +30 -0.761 +31 -0.712 +32 -0.663 +33 -0.613 +34 -0.562 +35 -0.511 +36 -0.459 +37 -0.408 +38 -0.356 +39 -0.304 +40 -0.253 +41 -0.202 +42 -0.151 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.098 +48 0.146 +49 0.193 +50 0.240 +51 0.286 +52 0.332 +53 0.377 +54 0.421 +55 0.465 +56 0.508 +57 0.551 +58 0.593 +59 0.635 +60 0.676 +61 0.717 +62 0.758 +63 0.799 +64 0.839 +65 0.880 +66 0.921 +67 0.962 +68 1.004 +69 1.046 +70 1.089 +71 1.133 +72 1.177 +73 1.223 +74 1.270 +75 1.319 +76 1.369 +77 1.421 +78 1.476 +79 1.532 +80 1.591 +81 1.653 +82 1.718 +83 1.786 +84 1.857 +85 1.932 +86 2.011 +87 2.094 +88 2.182 +89 2.274 +90 2.372 +1 -1.094 +2 -1.177 +3 -1.250 +4 -1.313 +5 -1.368 +6 -1.414 +7 -1.452 +8 -1.483 +9 -1.506 +10 -1.522 +11 -1.532 +12 -1.535 +13 -1.533 +14 -1.525 +15 -1.512 +16 -1.494 +17 -1.472 +18 -1.445 +19 -1.415 +20 -1.380 +21 -1.343 +22 -1.302 +23 -1.259 +24 -1.213 +25 -1.164 +26 -1.114 +27 -1.061 +28 -1.007 +29 -0.952 +30 -0.895 +31 -0.837 +32 -0.778 +33 -0.719 +34 -0.659 +35 -0.599 +36 -0.538 +37 -0.477 +38 -0.417 +39 -0.356 +40 -0.296 +41 -0.235 +42 -0.176 +43 -0.117 +44 -0.058 +45 0.000 +46 0.057 +47 0.114 +48 0.170 +49 0.225 +50 0.279 +51 0.332 +52 0.385 +53 0.436 +54 0.487 +55 0.538 +56 0.587 +57 0.636 +58 0.684 +59 0.731 +60 0.778 +61 0.825 +62 0.871 +63 0.918 +64 0.964 +65 1.009 +66 1.056 +67 1.102 +68 1.149 +69 1.196 +70 1.244 +71 1.293 +72 1.343 +73 1.394 +74 1.447 +75 1.501 +76 1.557 +77 1.616 +78 1.676 +79 1.740 +80 1.806 +81 1.875 +82 1.947 +83 2.024 +84 2.104 +85 2.188 +86 2.277 +87 2.371 +88 2.469 +89 2.574 +90 2.684 +1 -1.293 +2 -1.382 +3 -1.460 +4 -1.527 +5 -1.585 +6 -1.633 +7 -1.673 +8 -1.704 +9 -1.727 +10 -1.742 +11 -1.750 +12 -1.752 +13 -1.746 +14 -1.735 +15 -1.718 +16 -1.696 +17 -1.669 +18 -1.637 +19 -1.601 +20 -1.561 +21 -1.517 +22 -1.470 +23 -1.420 +24 -1.367 +25 -1.312 +26 -1.254 +27 -1.194 +28 -1.132 +29 -1.069 +30 -1.005 +31 -0.939 +32 -0.873 +33 -0.806 +34 -0.738 +35 -0.670 +36 -0.602 +37 -0.534 +38 -0.465 +39 -0.397 +40 -0.330 +41 -0.263 +42 -0.196 +43 -0.130 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.188 +49 0.249 +50 0.309 +51 0.368 +52 0.426 +53 0.483 +54 0.539 +55 0.594 +56 0.648 +57 0.702 +58 0.754 +59 0.806 +60 0.857 +61 0.908 +62 0.958 +63 1.008 +64 1.058 +65 1.108 +66 1.157 +67 1.207 +68 1.258 +69 1.308 +70 1.360 +71 1.413 +72 1.466 +73 1.521 +74 1.578 +75 1.636 +76 1.696 +77 1.759 +78 1.824 +79 1.892 +80 1.963 +81 2.038 +82 2.116 +83 2.198 +84 2.284 +85 2.375 +86 2.471 +87 2.573 +88 2.680 +89 2.793 +90 2.913 +1 -1.348 +2 -1.443 +3 -1.526 +4 -1.598 +5 -1.660 +6 -1.712 +7 -1.754 +8 -1.788 +9 -1.813 +10 -1.829 +11 -1.838 +12 -1.840 +13 -1.836 +14 -1.824 +15 -1.807 +16 -1.784 +17 -1.756 +18 -1.723 +19 -1.685 +20 -1.643 +21 -1.597 +22 -1.548 +23 -1.495 +24 -1.440 +25 -1.381 +26 -1.321 +27 -1.258 +28 -1.193 +29 -1.127 +30 -1.059 +31 -0.990 +32 -0.920 +33 -0.849 +34 -0.778 +35 -0.707 +36 -0.635 +37 -0.563 +38 -0.491 +39 -0.419 +40 -0.348 +41 -0.277 +42 -0.207 +43 -0.137 +44 -0.068 +45 0.000 +46 0.067 +47 0.134 +48 0.199 +49 0.263 +50 0.326 +51 0.389 +52 0.450 +53 0.510 +54 0.569 +55 0.627 +56 0.685 +57 0.741 +58 0.797 +59 0.852 +60 0.906 +61 0.960 +62 1.013 +63 1.066 +64 1.118 +65 1.171 +66 1.224 +67 1.277 +68 1.330 +69 1.384 +70 1.439 +71 1.495 +72 1.552 +73 1.610 +74 1.670 +75 1.732 +76 1.796 +77 1.863 +78 1.932 +79 2.005 +80 2.080 +81 2.159 +82 2.242 +83 2.330 +84 2.422 +85 2.519 +86 2.621 +87 2.729 +88 2.842 +89 2.963 +90 3.090 +1 -1.456 +2 -1.558 +3 -1.647 +4 -1.724 +5 -1.790 +6 -1.845 +7 -1.891 +8 -1.926 +9 -1.953 +10 -1.971 +11 -1.980 +12 -1.982 +13 -1.976 +14 -1.964 +15 -1.945 +16 -1.920 +17 -1.890 +18 -1.854 +19 -1.813 +20 -1.768 +21 -1.719 +22 -1.665 +23 -1.609 +24 -1.549 +25 -1.486 +26 -1.421 +27 -1.353 +28 -1.283 +29 -1.212 +30 -1.139 +31 -1.065 +32 -0.990 +33 -0.914 +34 -0.837 +35 -0.760 +36 -0.682 +37 -0.605 +38 -0.528 +39 -0.451 +40 -0.374 +41 -0.298 +42 -0.222 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.144 +48 0.214 +49 0.283 +50 0.351 +51 0.418 +52 0.484 +53 0.548 +54 0.612 +55 0.674 +56 0.736 +57 0.797 +58 0.856 +59 0.915 +60 0.974 +61 1.031 +62 1.088 +63 1.145 +64 1.202 +65 1.258 +66 1.315 +67 1.372 +68 1.429 +69 1.487 +70 1.546 +71 1.606 +72 1.667 +73 1.730 +74 1.794 +75 1.861 +76 1.930 +77 2.001 +78 2.076 +79 2.153 +80 2.234 +81 2.319 +82 2.409 +83 2.502 +84 2.601 +85 2.705 +86 2.815 +87 2.931 +88 3.053 +89 3.182 +90 3.319 +1 -1.341 +2 -1.444 +3 -1.535 +4 -1.615 +5 -1.683 +6 -1.741 +7 -1.789 +8 -1.827 +9 -1.856 +10 -1.877 +11 -1.889 +12 -1.894 +13 -1.891 +14 -1.882 +15 -1.866 +16 -1.844 +17 -1.817 +18 -1.784 +19 -1.747 +20 -1.705 +21 -1.658 +22 -1.608 +23 -1.555 +24 -1.498 +25 -1.438 +26 -1.376 +27 -1.311 +28 -1.245 +29 -1.176 +30 -1.106 +31 -1.035 +32 -0.962 +33 -0.889 +34 -0.815 +35 -0.740 +36 -0.665 +37 -0.590 +38 -0.515 +39 -0.440 +40 -0.365 +41 -0.291 +42 -0.217 +43 -0.144 +44 -0.072 +45 0.000 +46 0.071 +47 0.141 +48 0.210 +49 0.278 +50 0.345 +51 0.411 +52 0.476 +53 0.540 +54 0.603 +55 0.665 +56 0.726 +57 0.787 +58 0.846 +59 0.905 +60 0.964 +61 1.021 +62 1.079 +63 1.136 +64 1.193 +65 1.250 +66 1.308 +67 1.365 +68 1.423 +69 1.482 +70 1.542 +71 1.603 +72 1.665 +73 1.729 +74 1.795 +75 1.863 +76 1.933 +77 2.006 +78 2.082 +79 2.161 +80 2.243 +81 2.330 +82 2.420 +83 2.516 +84 2.616 +85 2.721 +86 2.833 +87 2.950 +88 3.073 +89 3.204 +90 3.342 +1 -1.281 +2 -1.388 +3 -1.482 +4 -1.565 +5 -1.637 +6 -1.698 +7 -1.749 +8 -1.790 +9 -1.822 +10 -1.845 +11 -1.860 +12 -1.867 +13 -1.867 +14 -1.860 +15 -1.846 +16 -1.826 +17 -1.801 +18 -1.770 +19 -1.734 +20 -1.693 +21 -1.649 +22 -1.600 +23 -1.548 +24 -1.492 +25 -1.433 +26 -1.372 +27 -1.308 +28 -1.242 +29 -1.174 +30 -1.105 +31 -1.034 +32 -0.962 +33 -0.889 +34 -0.815 +35 -0.741 +36 -0.666 +37 -0.591 +38 -0.516 +39 -0.441 +40 -0.367 +41 -0.292 +42 -0.218 +43 -0.145 +44 -0.072 +45 0.000 +46 0.071 +47 0.142 +48 0.211 +49 0.280 +50 0.348 +51 0.414 +52 0.480 +53 0.545 +54 0.609 +55 0.672 +56 0.735 +57 0.796 +58 0.857 +59 0.917 +60 0.977 +61 1.036 +62 1.095 +63 1.154 +64 1.212 +65 1.271 +66 1.330 +67 1.389 +68 1.449 +69 1.510 +70 1.572 +71 1.635 +72 1.700 +73 1.766 +74 1.834 +75 1.904 +76 1.977 +77 2.052 +78 2.131 +79 2.213 +80 2.298 +81 2.388 +82 2.481 +83 2.580 +84 2.683 +85 2.792 +86 2.907 +87 3.028 +88 3.155 +89 3.290 +90 3.432 +1 -1.324 +2 -1.429 +3 -1.521 +4 -1.601 +5 -1.671 +6 -1.730 +7 -1.779 +8 -1.818 +9 -1.848 +10 -1.869 +11 -1.883 +12 -1.888 +13 -1.886 +14 -1.878 +15 -1.862 +16 -1.841 +17 -1.814 +18 -1.782 +19 -1.745 +20 -1.703 +21 -1.658 +22 -1.608 +23 -1.554 +24 -1.498 +25 -1.439 +26 -1.376 +27 -1.312 +28 -1.245 +29 -1.177 +30 -1.107 +31 -1.036 +32 -0.963 +33 -0.890 +34 -0.816 +35 -0.741 +36 -0.666 +37 -0.591 +38 -0.516 +39 -0.441 +40 -0.366 +41 -0.292 +42 -0.218 +43 -0.144 +44 -0.072 +45 0.000 +46 0.071 +47 0.141 +48 0.210 +49 0.279 +50 0.346 +51 0.412 +52 0.478 +53 0.542 +54 0.605 +55 0.668 +56 0.729 +57 0.790 +58 0.850 +59 0.909 +60 0.968 +61 1.026 +62 1.084 +63 1.142 +64 1.200 +65 1.257 +66 1.315 +67 1.373 +68 1.432 +69 1.492 +70 1.552 +71 1.614 +72 1.677 +73 1.741 +74 1.808 +75 1.876 +76 1.947 +77 2.021 +78 2.098 +79 2.178 +80 2.261 +81 2.349 +82 2.441 +83 2.537 +84 2.639 +85 2.745 +86 2.858 +87 2.976 +88 3.101 +89 3.234 +90 3.373 +1 -1.406 +2 -1.509 +3 -1.600 +4 -1.679 +5 -1.747 +6 -1.804 +7 -1.851 +8 -1.888 +9 -1.916 +10 -1.936 +11 -1.947 +12 -1.950 +13 -1.946 +14 -1.935 +15 -1.918 +16 -1.895 +17 -1.866 +18 -1.831 +19 -1.792 +20 -1.748 +21 -1.700 +22 -1.648 +23 -1.592 +24 -1.533 +25 -1.472 +26 -1.408 +27 -1.341 +28 -1.272 +29 -1.202 +30 -1.130 +31 -1.057 +32 -0.982 +33 -0.907 +34 -0.831 +35 -0.755 +36 -0.678 +37 -0.602 +38 -0.525 +39 -0.448 +40 -0.372 +41 -0.296 +42 -0.221 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.143 +48 0.213 +49 0.282 +50 0.350 +51 0.417 +52 0.483 +53 0.548 +54 0.611 +55 0.674 +56 0.736 +57 0.797 +58 0.857 +59 0.916 +60 0.975 +61 1.033 +62 1.091 +63 1.148 +64 1.206 +65 1.263 +66 1.320 +67 1.378 +68 1.436 +69 1.495 +70 1.555 +71 1.616 +72 1.678 +73 1.742 +74 1.808 +75 1.876 +76 1.946 +77 2.019 +78 2.094 +79 2.174 +80 2.256 +81 2.343 +82 2.434 +83 2.529 +84 2.630 +85 2.735 +86 2.847 +87 2.965 +88 3.089 +89 3.220 +90 3.359 +1 -1.370 +2 -1.472 +3 -1.561 +4 -1.639 +5 -1.706 +6 -1.762 +7 -1.809 +8 -1.846 +9 -1.874 +10 -1.893 +11 -1.904 +12 -1.908 +13 -1.904 +14 -1.894 +15 -1.877 +16 -1.854 +17 -1.826 +18 -1.792 +19 -1.754 +20 -1.711 +21 -1.664 +22 -1.613 +23 -1.559 +24 -1.502 +25 -1.441 +26 -1.379 +27 -1.314 +28 -1.246 +29 -1.177 +30 -1.107 +31 -1.035 +32 -0.962 +33 -0.889 +34 -0.815 +35 -0.740 +36 -0.665 +37 -0.590 +38 -0.514 +39 -0.439 +40 -0.365 +41 -0.291 +42 -0.217 +43 -0.144 +44 -0.071 +45 0.000 +46 0.071 +47 0.140 +48 0.209 +49 0.277 +50 0.343 +51 0.409 +52 0.474 +53 0.537 +54 0.600 +55 0.661 +56 0.722 +57 0.782 +58 0.841 +59 0.899 +60 0.957 +61 1.014 +62 1.071 +63 1.127 +64 1.183 +65 1.240 +66 1.296 +67 1.353 +68 1.410 +69 1.468 +70 1.527 +71 1.587 +72 1.648 +73 1.711 +74 1.776 +75 1.842 +76 1.912 +77 1.983 +78 2.058 +79 2.136 +80 2.217 +81 2.302 +82 2.392 +83 2.486 +84 2.584 +85 2.689 +86 2.798 +87 2.914 +88 3.036 +89 3.166 +90 3.302 +1 -1.406 +2 -1.509 +3 -1.600 +4 -1.679 +5 -1.747 +6 -1.804 +7 -1.851 +8 -1.888 +9 -1.917 +10 -1.936 +11 -1.947 +12 -1.950 +13 -1.946 +14 -1.936 +15 -1.918 +16 -1.895 +17 -1.866 +18 -1.831 +19 -1.792 +20 -1.748 +21 -1.700 +22 -1.648 +23 -1.592 +24 -1.534 +25 -1.472 +26 -1.408 +27 -1.341 +28 -1.272 +29 -1.202 +30 -1.130 +31 -1.057 +32 -0.982 +33 -0.907 +34 -0.831 +35 -0.755 +36 -0.678 +37 -0.602 +38 -0.525 +39 -0.448 +40 -0.372 +41 -0.296 +42 -0.221 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.143 +48 0.213 +49 0.282 +50 0.350 +51 0.417 +52 0.483 +53 0.548 +54 0.611 +55 0.674 +56 0.736 +57 0.797 +58 0.857 +59 0.916 +60 0.975 +61 1.033 +62 1.091 +63 1.148 +64 1.206 +65 1.263 +66 1.320 +67 1.378 +68 1.436 +69 1.495 +70 1.555 +71 1.616 +72 1.678 +73 1.742 +74 1.808 +75 1.876 +76 1.946 +77 2.019 +78 2.095 +79 2.174 +80 2.256 +81 2.343 +82 2.434 +83 2.530 +84 2.630 +85 2.736 +86 2.848 +87 2.965 +88 3.090 +89 3.221 +90 3.360 +1 -1.324 +2 -1.429 +3 -1.521 +4 -1.601 +5 -1.671 +6 -1.730 +7 -1.779 +8 -1.818 +9 -1.848 +10 -1.869 +11 -1.883 +12 -1.888 +13 -1.886 +14 -1.878 +15 -1.862 +16 -1.841 +17 -1.814 +18 -1.782 +19 -1.745 +20 -1.703 +21 -1.658 +22 -1.608 +23 -1.554 +24 -1.498 +25 -1.439 +26 -1.376 +27 -1.312 +28 -1.245 +29 -1.177 +30 -1.107 +31 -1.036 +32 -0.963 +33 -0.890 +34 -0.816 +35 -0.741 +36 -0.666 +37 -0.591 +38 -0.516 +39 -0.441 +40 -0.366 +41 -0.292 +42 -0.218 +43 -0.144 +44 -0.072 +45 0.000 +46 0.071 +47 0.141 +48 0.210 +49 0.279 +50 0.346 +51 0.412 +52 0.478 +53 0.542 +54 0.605 +55 0.668 +56 0.729 +57 0.790 +58 0.850 +59 0.909 +60 0.968 +61 1.026 +62 1.084 +63 1.142 +64 1.200 +65 1.257 +66 1.315 +67 1.373 +68 1.432 +69 1.492 +70 1.552 +71 1.614 +72 1.677 +73 1.741 +74 1.808 +75 1.876 +76 1.947 +77 2.021 +78 2.098 +79 2.178 +80 2.261 +81 2.349 +82 2.441 +83 2.537 +84 2.639 +85 2.745 +86 2.858 +87 2.976 +88 3.101 +89 3.234 +90 3.373 +1 -1.281 +2 -1.388 +3 -1.482 +4 -1.565 +5 -1.637 +6 -1.698 +7 -1.749 +8 -1.790 +9 -1.822 +10 -1.845 +11 -1.860 +12 -1.867 +13 -1.867 +14 -1.860 +15 -1.846 +16 -1.826 +17 -1.801 +18 -1.770 +19 -1.734 +20 -1.693 +21 -1.649 +22 -1.600 +23 -1.548 +24 -1.492 +25 -1.433 +26 -1.372 +27 -1.308 +28 -1.242 +29 -1.174 +30 -1.105 +31 -1.034 +32 -0.962 +33 -0.889 +34 -0.815 +35 -0.741 +36 -0.666 +37 -0.591 +38 -0.516 +39 -0.441 +40 -0.367 +41 -0.292 +42 -0.218 +43 -0.145 +44 -0.072 +45 0.000 +46 0.071 +47 0.142 +48 0.211 +49 0.280 +50 0.348 +51 0.414 +52 0.480 +53 0.545 +54 0.609 +55 0.672 +56 0.735 +57 0.796 +58 0.857 +59 0.917 +60 0.977 +61 1.036 +62 1.095 +63 1.154 +64 1.212 +65 1.271 +66 1.330 +67 1.389 +68 1.449 +69 1.510 +70 1.572 +71 1.635 +72 1.700 +73 1.766 +74 1.834 +75 1.904 +76 1.977 +77 2.052 +78 2.131 +79 2.213 +80 2.298 +81 2.388 +82 2.481 +83 2.580 +84 2.683 +85 2.792 +86 2.907 +87 3.028 +88 3.155 +89 3.290 +90 3.432 +1 -1.343 +2 -1.446 +3 -1.537 +4 -1.617 +5 -1.685 +6 -1.743 +7 -1.791 +8 -1.829 +9 -1.858 +10 -1.879 +11 -1.891 +12 -1.896 +13 -1.893 +14 -1.884 +15 -1.868 +16 -1.846 +17 -1.819 +18 -1.786 +19 -1.748 +20 -1.706 +21 -1.660 +22 -1.610 +23 -1.556 +24 -1.499 +25 -1.440 +26 -1.377 +27 -1.312 +28 -1.246 +29 -1.177 +30 -1.107 +31 -1.036 +32 -0.963 +33 -0.889 +34 -0.815 +35 -0.741 +36 -0.666 +37 -0.591 +38 -0.515 +39 -0.440 +40 -0.366 +41 -0.291 +42 -0.217 +43 -0.144 +44 -0.072 +45 0.000 +46 0.071 +47 0.141 +48 0.210 +49 0.278 +50 0.345 +51 0.411 +52 0.476 +53 0.540 +54 0.603 +55 0.666 +56 0.727 +57 0.787 +58 0.847 +59 0.906 +60 0.964 +61 1.022 +62 1.080 +63 1.137 +64 1.194 +65 1.251 +66 1.308 +67 1.366 +68 1.424 +69 1.483 +70 1.543 +71 1.604 +72 1.666 +73 1.730 +74 1.796 +75 1.864 +76 1.934 +77 2.007 +78 2.083 +79 2.162 +80 2.244 +81 2.331 +82 2.421 +83 2.517 +84 2.617 +85 2.722 +86 2.834 +87 2.951 +88 3.074 +89 3.205 +90 3.343 +1 -1.460 +2 -1.561 +3 -1.650 +4 -1.727 +5 -1.793 +6 -1.848 +7 -1.894 +8 -1.929 +9 -1.955 +10 -1.973 +11 -1.983 +12 -1.984 +13 -1.979 +14 -1.966 +15 -1.947 +16 -1.922 +17 -1.892 +18 -1.856 +19 -1.815 +20 -1.770 +21 -1.720 +22 -1.667 +23 -1.610 +24 -1.550 +25 -1.487 +26 -1.422 +27 -1.354 +28 -1.284 +29 -1.213 +30 -1.140 +31 -1.066 +32 -0.990 +33 -0.914 +34 -0.838 +35 -0.760 +36 -0.683 +37 -0.606 +38 -0.528 +39 -0.451 +40 -0.374 +41 -0.298 +42 -0.222 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.144 +48 0.214 +49 0.283 +50 0.351 +51 0.418 +52 0.484 +53 0.549 +54 0.612 +55 0.675 +56 0.737 +57 0.797 +58 0.857 +59 0.916 +60 0.974 +61 1.032 +62 1.089 +63 1.146 +64 1.203 +65 1.259 +66 1.316 +67 1.373 +68 1.430 +69 1.488 +70 1.547 +71 1.607 +72 1.668 +73 1.731 +74 1.795 +75 1.862 +76 1.931 +77 2.002 +78 2.077 +79 2.154 +80 2.236 +81 2.321 +82 2.410 +83 2.504 +84 2.602 +85 2.706 +86 2.816 +87 2.932 +88 3.054 +89 3.183 +90 3.320 +1 -1.355 +2 -1.449 +3 -1.532 +4 -1.604 +5 -1.665 +6 -1.717 +7 -1.759 +8 -1.792 +9 -1.816 +10 -1.833 +11 -1.842 +12 -1.844 +13 -1.839 +14 -1.827 +15 -1.810 +16 -1.786 +17 -1.758 +18 -1.725 +19 -1.687 +20 -1.645 +21 -1.599 +22 -1.549 +23 -1.497 +24 -1.441 +25 -1.383 +26 -1.322 +27 -1.259 +28 -1.194 +29 -1.128 +30 -1.060 +31 -0.991 +32 -0.921 +33 -0.850 +34 -0.779 +35 -0.707 +36 -0.635 +37 -0.563 +38 -0.491 +39 -0.420 +40 -0.348 +41 -0.277 +42 -0.207 +43 -0.137 +44 -0.068 +45 0.000 +46 0.067 +47 0.134 +48 0.199 +49 0.263 +50 0.327 +51 0.389 +52 0.450 +53 0.511 +54 0.570 +55 0.628 +56 0.686 +57 0.742 +58 0.798 +59 0.853 +60 0.907 +61 0.961 +62 1.014 +63 1.067 +64 1.120 +65 1.173 +66 1.225 +67 1.279 +68 1.332 +69 1.386 +70 1.441 +71 1.497 +72 1.554 +73 1.612 +74 1.673 +75 1.735 +76 1.799 +77 1.866 +78 1.935 +79 2.007 +80 2.083 +81 2.162 +82 2.245 +83 2.333 +84 2.425 +85 2.521 +86 2.624 +87 2.732 +88 2.845 +89 2.966 +90 3.093 +1 -1.298 +2 -1.387 +3 -1.465 +4 -1.532 +5 -1.590 +6 -1.638 +7 -1.678 +8 -1.709 +9 -1.732 +10 -1.747 +11 -1.755 +12 -1.756 +13 -1.751 +14 -1.740 +15 -1.723 +16 -1.700 +17 -1.673 +18 -1.641 +19 -1.605 +20 -1.564 +21 -1.521 +22 -1.473 +23 -1.423 +24 -1.370 +25 -1.314 +26 -1.256 +27 -1.196 +28 -1.135 +29 -1.072 +30 -1.007 +31 -0.941 +32 -0.875 +33 -0.808 +34 -0.740 +35 -0.672 +36 -0.603 +37 -0.535 +38 -0.466 +39 -0.398 +40 -0.330 +41 -0.263 +42 -0.196 +43 -0.130 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.189 +49 0.250 +50 0.310 +51 0.369 +52 0.427 +53 0.484 +54 0.540 +55 0.595 +56 0.649 +57 0.703 +58 0.755 +59 0.807 +60 0.859 +61 0.909 +62 0.960 +63 1.010 +64 1.060 +65 1.109 +66 1.159 +67 1.209 +68 1.259 +69 1.310 +70 1.362 +71 1.415 +72 1.468 +73 1.523 +74 1.580 +75 1.638 +76 1.699 +77 1.761 +78 1.827 +79 1.895 +80 1.966 +81 2.040 +82 2.119 +83 2.201 +84 2.287 +85 2.379 +86 2.475 +87 2.576 +88 2.684 +89 2.797 +90 2.917 +1 -1.100 +2 -1.183 +3 -1.256 +4 -1.320 +5 -1.375 +6 -1.421 +7 -1.460 +8 -1.490 +9 -1.513 +10 -1.530 +11 -1.539 +12 -1.543 +13 -1.540 +14 -1.533 +15 -1.519 +16 -1.501 +17 -1.479 +18 -1.452 +19 -1.421 +20 -1.387 +21 -1.349 +22 -1.308 +23 -1.265 +24 -1.218 +25 -1.170 +26 -1.119 +27 -1.066 +28 -1.012 +29 -0.956 +30 -0.899 +31 -0.841 +32 -0.782 +33 -0.722 +34 -0.662 +35 -0.601 +36 -0.540 +37 -0.479 +38 -0.418 +39 -0.357 +40 -0.297 +41 -0.236 +42 -0.176 +43 -0.117 +44 -0.058 +45 0.000 +46 0.058 +47 0.114 +48 0.170 +49 0.225 +50 0.280 +51 0.333 +52 0.386 +53 0.438 +54 0.489 +55 0.539 +56 0.589 +57 0.638 +58 0.686 +59 0.734 +60 0.781 +61 0.828 +62 0.874 +63 0.920 +64 0.966 +65 1.012 +66 1.058 +67 1.105 +68 1.152 +69 1.199 +70 1.247 +71 1.296 +72 1.346 +73 1.397 +74 1.450 +75 1.504 +76 1.561 +77 1.619 +78 1.680 +79 1.743 +80 1.810 +81 1.879 +82 1.952 +83 2.028 +84 2.108 +85 2.193 +86 2.282 +87 2.376 +88 2.475 +89 2.579 +90 2.690 +1 -0.879 +2 -0.953 +3 -1.019 +4 -1.077 +5 -1.127 +6 -1.170 +7 -1.205 +8 -1.234 +9 -1.256 +10 -1.273 +11 -1.283 +12 -1.289 +13 -1.289 +14 -1.284 +15 -1.275 +16 -1.262 +17 -1.244 +18 -1.223 +19 -1.198 +20 -1.171 +21 -1.140 +22 -1.106 +23 -1.070 +24 -1.032 +25 -0.991 +26 -0.949 +27 -0.905 +28 -0.860 +29 -0.813 +30 -0.765 +31 -0.716 +32 -0.666 +33 -0.616 +34 -0.565 +35 -0.513 +36 -0.462 +37 -0.410 +38 -0.358 +39 -0.306 +40 -0.254 +41 -0.203 +42 -0.151 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.098 +48 0.147 +49 0.194 +50 0.241 +51 0.288 +52 0.334 +53 0.379 +54 0.423 +55 0.467 +56 0.510 +57 0.553 +58 0.595 +59 0.637 +60 0.679 +61 0.720 +62 0.761 +63 0.802 +64 0.843 +65 0.884 +66 0.925 +67 0.966 +68 1.008 +69 1.050 +70 1.093 +71 1.137 +72 1.182 +73 1.227 +74 1.275 +75 1.323 +76 1.374 +77 1.426 +78 1.480 +79 1.537 +80 1.596 +81 1.658 +82 1.723 +83 1.791 +84 1.862 +85 1.937 +86 2.016 +87 2.100 +88 2.188 +89 2.280 +90 2.378 +1 -0.565 +2 -0.616 +3 -0.661 +4 -0.700 +5 -0.735 +6 -0.765 +7 -0.789 +8 -0.810 +9 -0.826 +10 -0.837 +11 -0.845 +12 -0.850 +13 -0.851 +14 -0.848 +15 -0.843 +16 -0.835 +17 -0.824 +18 -0.810 +19 -0.795 +20 -0.777 +21 -0.757 +22 -0.735 +23 -0.711 +24 -0.686 +25 -0.660 +26 -0.632 +27 -0.603 +28 -0.573 +29 -0.542 +30 -0.510 +31 -0.478 +32 -0.445 +33 -0.411 +34 -0.377 +35 -0.343 +36 -0.309 +37 -0.274 +38 -0.239 +39 -0.205 +40 -0.170 +41 -0.136 +42 -0.101 +43 -0.067 +44 -0.034 +45 0.000 +46 0.033 +47 0.066 +48 0.098 +49 0.131 +50 0.162 +51 0.193 +52 0.224 +53 0.255 +54 0.285 +55 0.315 +56 0.344 +57 0.373 +58 0.402 +59 0.430 +60 0.458 +61 0.486 +62 0.514 +63 0.542 +64 0.570 +65 0.598 +66 0.626 +67 0.654 +68 0.683 +69 0.712 +70 0.741 +71 0.771 +72 0.802 +73 0.833 +74 0.865 +75 0.899 +76 0.933 +77 0.969 +78 1.006 +79 1.045 +80 1.086 +81 1.128 +82 1.172 +83 1.219 +84 1.267 +85 1.319 +86 1.373 +87 1.430 +88 1.489 +89 1.552 +90 1.619 +1 -0.270 +2 -0.297 +3 -0.322 +4 -0.344 +5 -0.363 +6 -0.379 +7 -0.393 +8 -0.405 +9 -0.414 +10 -0.421 +11 -0.427 +12 -0.430 +13 -0.431 +14 -0.431 +15 -0.429 +16 -0.425 +17 -0.420 +18 -0.414 +19 -0.407 +20 -0.398 +21 -0.388 +22 -0.377 +23 -0.366 +24 -0.353 +25 -0.340 +26 -0.326 +27 -0.311 +28 -0.296 +29 -0.280 +30 -0.264 +31 -0.247 +32 -0.231 +33 -0.213 +34 -0.196 +35 -0.178 +36 -0.161 +37 -0.143 +38 -0.125 +39 -0.107 +40 -0.089 +41 -0.071 +42 -0.053 +43 -0.035 +44 -0.018 +45 0.000 +46 0.017 +47 0.035 +48 0.052 +49 0.069 +50 0.086 +51 0.102 +52 0.118 +53 0.135 +54 0.151 +55 0.167 +56 0.182 +57 0.198 +58 0.213 +59 0.229 +60 0.244 +61 0.259 +62 0.274 +63 0.289 +64 0.305 +65 0.320 +66 0.335 +67 0.350 +68 0.366 +69 0.382 +70 0.398 +71 0.414 +72 0.431 +73 0.448 +74 0.466 +75 0.484 +76 0.503 +77 0.523 +78 0.543 +79 0.564 +80 0.586 +81 0.609 +82 0.633 +83 0.658 +84 0.685 +85 0.713 +86 0.742 +87 0.772 +88 0.804 +89 0.838 +90 0.874 +1 0.245 +2 0.247 +3 0.249 +4 0.249 +5 0.249 +6 0.248 +7 0.246 +8 0.244 +9 0.241 +10 0.238 +11 0.234 +12 0.230 +13 0.225 +14 0.220 +15 0.214 +16 0.208 +17 0.202 +18 0.195 +19 0.189 +20 0.182 +21 0.174 +22 0.167 +23 0.160 +24 0.152 +25 0.144 +26 0.136 +27 0.129 +28 0.121 +29 0.113 +30 0.105 +31 0.097 +32 0.089 +33 0.082 +34 0.074 +35 0.067 +36 0.059 +37 0.052 +38 0.045 +39 0.038 +40 0.031 +41 0.025 +42 0.018 +43 0.012 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.011 +48 -0.016 +49 -0.021 +50 -0.026 +51 -0.031 +52 -0.035 +53 -0.039 +54 -0.043 +55 -0.047 +56 -0.050 +57 -0.053 +58 -0.057 +59 -0.060 +60 -0.062 +61 -0.065 +62 -0.067 +63 -0.069 +64 -0.072 +65 -0.074 +66 -0.075 +67 -0.077 +68 -0.079 +69 -0.080 +70 -0.082 +71 -0.084 +72 -0.085 +73 -0.087 +74 -0.088 +75 -0.090 +76 -0.091 +77 -0.093 +78 -0.095 +79 -0.097 +80 -0.099 +81 -0.102 +82 -0.104 +83 -0.107 +84 -0.110 +85 -0.114 +86 -0.118 +87 -0.122 +88 -0.126 +89 -0.131 +90 -0.137 +1 0.732 +2 0.764 +3 0.792 +4 0.815 +5 0.834 +6 0.849 +7 0.860 +8 0.868 +9 0.872 +10 0.873 +11 0.871 +12 0.866 +13 0.859 +14 0.848 +15 0.836 +16 0.821 +17 0.804 +18 0.786 +19 0.765 +20 0.743 +21 0.720 +22 0.695 +23 0.669 +24 0.642 +25 0.614 +26 0.586 +27 0.556 +28 0.526 +29 0.495 +30 0.464 +31 0.433 +32 0.401 +33 0.369 +34 0.337 +35 0.305 +36 0.273 +37 0.242 +38 0.210 +39 0.179 +40 0.148 +41 0.118 +42 0.088 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.083 +49 -0.109 +50 -0.135 +51 -0.160 +52 -0.185 +53 -0.209 +54 -0.232 +55 -0.255 +56 -0.278 +57 -0.299 +58 -0.321 +59 -0.341 +60 -0.362 +61 -0.382 +62 -0.401 +63 -0.421 +64 -0.440 +65 -0.459 +66 -0.478 +67 -0.496 +68 -0.515 +69 -0.534 +70 -0.553 +71 -0.572 +72 -0.592 +73 -0.612 +74 -0.633 +75 -0.654 +76 -0.676 +77 -0.699 +78 -0.723 +79 -0.748 +80 -0.774 +81 -0.802 +82 -0.831 +83 -0.862 +84 -0.894 +85 -0.929 +86 -0.965 +87 -1.004 +88 -1.046 +89 -1.089 +90 -1.136 +1 1.218 +2 1.273 +3 1.321 +4 1.361 +5 1.394 +6 1.420 +7 1.440 +8 1.454 +9 1.462 +10 1.464 +11 1.461 +12 1.454 +13 1.441 +14 1.425 +15 1.404 +16 1.380 +17 1.353 +18 1.322 +19 1.288 +20 1.251 +21 1.212 +22 1.171 +23 1.127 +24 1.082 +25 1.035 +26 0.987 +27 0.937 +28 0.887 +29 0.835 +30 0.783 +31 0.730 +32 0.677 +33 0.623 +34 0.570 +35 0.516 +36 0.462 +37 0.409 +38 0.356 +39 0.303 +40 0.251 +41 0.199 +42 0.148 +43 0.098 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.095 +48 -0.140 +49 -0.185 +50 -0.229 +51 -0.272 +52 -0.314 +53 -0.355 +54 -0.395 +55 -0.434 +56 -0.472 +57 -0.509 +58 -0.546 +59 -0.581 +60 -0.616 +61 -0.650 +62 -0.684 +63 -0.717 +64 -0.750 +65 -0.783 +66 -0.815 +67 -0.847 +68 -0.880 +69 -0.912 +70 -0.945 +71 -0.978 +72 -1.012 +73 -1.047 +74 -1.082 +75 -1.119 +76 -1.157 +77 -1.196 +78 -1.238 +79 -1.281 +80 -1.326 +81 -1.373 +82 -1.423 +83 -1.476 +84 -1.532 +85 -1.591 +86 -1.653 +87 -1.720 +88 -1.790 +89 -1.865 +90 -1.944 +1 1.686 +2 1.765 +3 1.833 +4 1.890 +5 1.937 +6 1.975 +7 2.003 +8 2.023 +9 2.035 +10 2.039 +11 2.036 +12 2.026 +13 2.010 +14 1.988 +15 1.960 +16 1.926 +17 1.888 +18 1.846 +19 1.799 +20 1.748 +21 1.694 +22 1.636 +23 1.576 +24 1.513 +25 1.448 +26 1.381 +27 1.311 +28 1.241 +29 1.169 +30 1.096 +31 1.022 +32 0.948 +33 0.873 +34 0.798 +35 0.723 +36 0.648 +37 0.573 +38 0.499 +39 0.425 +40 0.352 +41 0.279 +42 0.208 +43 0.138 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.133 +48 -0.197 +49 -0.260 +50 -0.322 +51 -0.382 +52 -0.441 +53 -0.499 +54 -0.555 +55 -0.610 +56 -0.664 +57 -0.717 +58 -0.768 +59 -0.818 +60 -0.868 +61 -0.916 +62 -0.964 +63 -1.011 +64 -1.057 +65 -1.104 +66 -1.150 +67 -1.195 +68 -1.241 +69 -1.287 +70 -1.334 +71 -1.381 +72 -1.429 +73 -1.479 +74 -1.529 +75 -1.581 +76 -1.635 +77 -1.691 +78 -1.750 +79 -1.811 +80 -1.875 +81 -1.942 +82 -2.013 +83 -2.088 +84 -2.167 +85 -2.250 +86 -2.339 +87 -2.433 +88 -2.532 +89 -2.638 +90 -2.750 +1 1.736 +2 1.822 +3 1.897 +4 1.960 +5 2.013 +6 2.055 +7 2.088 +8 2.112 +9 2.127 +10 2.133 +11 2.132 +12 2.123 +13 2.108 +14 2.086 +15 2.058 +16 2.024 +17 1.986 +18 1.942 +19 1.893 +20 1.841 +21 1.785 +22 1.725 +23 1.662 +24 1.596 +25 1.528 +26 1.458 +27 1.385 +28 1.311 +29 1.236 +30 1.159 +31 1.081 +32 1.003 +33 0.924 +34 0.845 +35 0.766 +36 0.686 +37 0.607 +38 0.529 +39 0.451 +40 0.373 +41 0.297 +42 0.221 +43 0.146 +44 0.072 +45 -0.000 +46 -0.071 +47 -0.141 +48 -0.210 +49 -0.277 +50 -0.343 +51 -0.407 +52 -0.470 +53 -0.532 +54 -0.592 +55 -0.651 +56 -0.709 +57 -0.765 +58 -0.821 +59 -0.875 +60 -0.928 +61 -0.980 +62 -1.032 +63 -1.083 +64 -1.133 +65 -1.183 +66 -1.233 +67 -1.283 +68 -1.333 +69 -1.383 +70 -1.434 +71 -1.486 +72 -1.538 +73 -1.592 +74 -1.647 +75 -1.704 +76 -1.763 +77 -1.824 +78 -1.888 +79 -1.955 +80 -2.024 +81 -2.098 +82 -2.175 +83 -2.257 +84 -2.343 +85 -2.433 +86 -2.530 +87 -2.632 +88 -2.740 +89 -2.854 +90 -2.976 +1 1.718 +2 1.809 +3 1.888 +4 1.955 +5 2.011 +6 2.057 +7 2.092 +8 2.119 +9 2.136 +10 2.145 +11 2.146 +12 2.139 +13 2.125 +14 2.104 +15 2.077 +16 2.045 +17 2.007 +18 1.963 +19 1.916 +20 1.864 +21 1.807 +22 1.748 +23 1.685 +24 1.619 +25 1.550 +26 1.479 +27 1.406 +28 1.332 +29 1.256 +30 1.178 +31 1.099 +32 1.020 +33 0.940 +34 0.860 +35 0.780 +36 0.699 +37 0.619 +38 0.539 +39 0.459 +40 0.381 +41 0.303 +42 0.225 +43 0.149 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.144 +48 -0.215 +49 -0.284 +50 -0.351 +51 -0.417 +52 -0.482 +53 -0.545 +54 -0.608 +55 -0.668 +56 -0.728 +57 -0.786 +58 -0.843 +59 -0.900 +60 -0.955 +61 -1.009 +62 -1.063 +63 -1.116 +64 -1.168 +65 -1.221 +66 -1.273 +67 -1.325 +68 -1.377 +69 -1.430 +70 -1.483 +71 -1.537 +72 -1.592 +73 -1.649 +74 -1.707 +75 -1.767 +76 -1.829 +77 -1.893 +78 -1.960 +79 -2.030 +80 -2.103 +81 -2.180 +82 -2.261 +83 -2.346 +84 -2.437 +85 -2.532 +86 -2.632 +87 -2.739 +88 -2.852 +89 -2.971 +90 -3.098 +1 1.822 +2 1.917 +3 2.000 +4 2.070 +5 2.129 +6 2.177 +7 2.214 +8 2.241 +9 2.259 +10 2.268 +11 2.269 +12 2.261 +13 2.246 +14 2.224 +15 2.196 +16 2.161 +17 2.121 +18 2.075 +19 2.024 +20 1.969 +21 1.909 +22 1.846 +23 1.780 +24 1.710 +25 1.637 +26 1.563 +27 1.485 +28 1.406 +29 1.326 +30 1.244 +31 1.161 +32 1.077 +33 0.993 +34 0.908 +35 0.823 +36 0.738 +37 0.653 +38 0.569 +39 0.485 +40 0.402 +41 0.319 +42 0.238 +43 0.157 +44 0.078 +45 -0.000 +46 -0.077 +47 -0.152 +48 -0.227 +49 -0.299 +50 -0.371 +51 -0.440 +52 -0.509 +53 -0.576 +54 -0.641 +55 -0.705 +56 -0.768 +57 -0.830 +58 -0.890 +59 -0.949 +60 -1.007 +61 -1.065 +62 -1.121 +63 -1.177 +64 -1.233 +65 -1.288 +66 -1.342 +67 -1.397 +68 -1.452 +69 -1.508 +70 -1.564 +71 -1.621 +72 -1.679 +73 -1.739 +74 -1.800 +75 -1.863 +76 -1.928 +77 -1.995 +78 -2.066 +79 -2.140 +80 -2.217 +81 -2.298 +82 -2.383 +83 -2.473 +84 -2.567 +85 -2.667 +86 -2.773 +87 -2.885 +88 -3.004 +89 -3.130 +90 -3.263 +1 1.900 +2 2.001 +3 2.089 +4 2.164 +5 2.227 +6 2.278 +7 2.318 +8 2.348 +9 2.367 +10 2.377 +11 2.378 +12 2.371 +13 2.356 +14 2.333 +15 2.304 +16 2.268 +17 2.226 +18 2.178 +19 2.125 +20 2.068 +21 2.006 +22 1.939 +23 1.870 +24 1.797 +25 1.721 +26 1.642 +27 1.561 +28 1.479 +29 1.394 +30 1.308 +31 1.221 +32 1.133 +33 1.044 +34 0.955 +35 0.866 +36 0.777 +37 0.687 +38 0.599 +39 0.511 +40 0.423 +41 0.336 +42 0.251 +43 0.166 +44 0.082 +45 -0.000 +46 -0.081 +47 -0.161 +48 -0.239 +49 -0.315 +50 -0.390 +51 -0.464 +52 -0.536 +53 -0.607 +54 -0.676 +55 -0.744 +56 -0.810 +57 -0.875 +58 -0.939 +59 -1.001 +60 -1.063 +61 -1.123 +62 -1.183 +63 -1.242 +64 -1.301 +65 -1.359 +66 -1.417 +67 -1.475 +68 -1.534 +69 -1.593 +70 -1.652 +71 -1.712 +72 -1.774 +73 -1.837 +74 -1.902 +75 -1.968 +76 -2.038 +77 -2.109 +78 -2.184 +79 -2.262 +80 -2.344 +81 -2.429 +82 -2.520 +83 -2.615 +84 -2.715 +85 -2.821 +86 -2.933 +87 -3.051 +88 -3.177 +89 -3.310 +90 -3.451 +1 2.065 +2 2.167 +3 2.256 +4 2.331 +5 2.394 +6 2.444 +7 2.483 +8 2.511 +9 2.529 +10 2.537 +11 2.536 +12 2.525 +13 2.507 +14 2.481 +15 2.448 +16 2.408 +17 2.362 +18 2.310 +19 2.252 +20 2.190 +21 2.123 +22 2.052 +23 1.977 +24 1.899 +25 1.818 +26 1.734 +27 1.648 +28 1.560 +29 1.470 +30 1.379 +31 1.287 +32 1.193 +33 1.100 +34 1.005 +35 0.911 +36 0.817 +37 0.723 +38 0.629 +39 0.536 +40 0.444 +41 0.353 +42 0.263 +43 0.174 +44 0.086 +45 -0.000 +46 -0.085 +47 -0.168 +48 -0.250 +49 -0.330 +50 -0.408 +51 -0.485 +52 -0.560 +53 -0.634 +54 -0.705 +55 -0.776 +56 -0.844 +57 -0.912 +58 -0.978 +59 -1.042 +60 -1.106 +61 -1.168 +62 -1.230 +63 -1.290 +64 -1.350 +65 -1.410 +66 -1.470 +67 -1.529 +68 -1.588 +69 -1.648 +70 -1.709 +71 -1.770 +72 -1.833 +73 -1.897 +74 -1.963 +75 -2.031 +76 -2.101 +77 -2.174 +78 -2.250 +79 -2.329 +80 -2.412 +81 -2.499 +82 -2.591 +83 -2.688 +84 -2.790 +85 -2.898 +86 -3.013 +87 -3.134 +88 -3.262 +89 -3.399 +90 -3.543 +1 2.218 +2 2.324 +3 2.415 +4 2.492 +5 2.556 +6 2.607 +7 2.646 +8 2.674 +9 2.690 +10 2.697 +11 2.694 +12 2.681 +13 2.660 +14 2.631 +15 2.595 +16 2.551 +17 2.501 +18 2.445 +19 2.384 +20 2.317 +21 2.245 +22 2.170 +23 2.090 +24 2.007 +25 1.921 +26 1.832 +27 1.740 +28 1.647 +29 1.552 +30 1.455 +31 1.357 +32 1.259 +33 1.159 +34 1.060 +35 0.960 +36 0.861 +37 0.761 +38 0.663 +39 0.565 +40 0.468 +41 0.372 +42 0.277 +43 0.183 +44 0.091 +45 -0.000 +46 -0.089 +47 -0.177 +48 -0.262 +49 -0.346 +50 -0.429 +51 -0.509 +52 -0.588 +53 -0.665 +54 -0.740 +55 -0.813 +56 -0.885 +57 -0.955 +58 -1.024 +59 -1.092 +60 -1.158 +61 -1.223 +62 -1.286 +63 -1.350 +64 -1.412 +65 -1.474 +66 -1.535 +67 -1.597 +68 -1.658 +69 -1.720 +70 -1.783 +71 -1.846 +72 -1.911 +73 -1.977 +74 -2.045 +75 -2.115 +76 -2.188 +77 -2.263 +78 -2.341 +79 -2.423 +80 -2.509 +81 -2.599 +82 -2.694 +83 -2.794 +84 -2.900 +85 -3.012 +86 -3.130 +87 -3.256 +88 -3.389 +89 -3.530 +90 -3.680 +1 2.091 +2 2.193 +3 2.281 +4 2.356 +5 2.418 +6 2.468 +7 2.506 +8 2.534 +9 2.551 +10 2.558 +11 2.556 +12 2.545 +13 2.526 +14 2.500 +15 2.466 +16 2.425 +17 2.378 +18 2.325 +19 2.267 +20 2.204 +21 2.137 +22 2.065 +23 1.990 +24 1.911 +25 1.829 +26 1.745 +27 1.658 +28 1.569 +29 1.479 +30 1.387 +31 1.294 +32 1.200 +33 1.106 +34 1.011 +35 0.916 +36 0.821 +37 0.727 +38 0.633 +39 0.539 +40 0.447 +41 0.355 +42 0.264 +43 0.175 +44 0.087 +45 -0.000 +46 -0.085 +47 -0.169 +48 -0.251 +49 -0.331 +50 -0.410 +51 -0.487 +52 -0.563 +53 -0.636 +54 -0.709 +55 -0.779 +56 -0.848 +57 -0.916 +58 -0.982 +59 -1.046 +60 -1.110 +61 -1.173 +62 -1.234 +63 -1.295 +64 -1.355 +65 -1.415 +66 -1.475 +67 -1.534 +68 -1.593 +69 -1.653 +70 -1.714 +71 -1.775 +72 -1.838 +73 -1.902 +74 -1.968 +75 -2.036 +76 -2.106 +77 -2.178 +78 -2.254 +79 -2.334 +80 -2.416 +81 -2.504 +82 -2.595 +83 -2.692 +84 -2.794 +85 -2.902 +86 -3.016 +87 -3.137 +88 -3.266 +89 -3.402 +90 -3.546 +1 1.959 +2 2.059 +3 2.146 +4 2.219 +5 2.281 +6 2.331 +7 2.370 +8 2.398 +9 2.416 +10 2.425 +11 2.424 +12 2.416 +13 2.399 +14 2.375 +15 2.344 +16 2.306 +17 2.263 +18 2.213 +19 2.159 +20 2.100 +21 2.036 +22 1.968 +23 1.897 +24 1.823 +25 1.745 +26 1.665 +27 1.583 +28 1.498 +29 1.412 +30 1.325 +31 1.236 +32 1.147 +33 1.057 +34 0.967 +35 0.876 +36 0.786 +37 0.695 +38 0.606 +39 0.516 +40 0.428 +41 0.340 +42 0.253 +43 0.168 +44 0.083 +45 -0.000 +46 -0.082 +47 -0.162 +48 -0.241 +49 -0.318 +50 -0.394 +51 -0.468 +52 -0.541 +53 -0.612 +54 -0.681 +55 -0.749 +56 -0.816 +57 -0.881 +58 -0.945 +59 -1.008 +60 -1.069 +61 -1.130 +62 -1.190 +63 -1.249 +64 -1.307 +65 -1.365 +66 -1.423 +67 -1.481 +68 -1.539 +69 -1.598 +70 -1.657 +71 -1.717 +72 -1.778 +73 -1.841 +74 -1.905 +75 -1.971 +76 -2.040 +77 -2.111 +78 -2.185 +79 -2.263 +80 -2.344 +81 -2.429 +82 -2.519 +83 -2.613 +84 -2.713 +85 -2.818 +86 -2.929 +87 -3.047 +88 -3.172 +89 -3.305 +90 -3.445 +1 1.870 +2 1.959 +3 2.035 +4 2.100 +5 2.153 +6 2.196 +7 2.228 +8 2.251 +9 2.265 +10 2.270 +11 2.267 +12 2.257 +13 2.239 +14 2.215 +15 2.184 +16 2.147 +17 2.105 +18 2.058 +19 2.006 +20 1.949 +21 1.889 +22 1.825 +23 1.758 +24 1.688 +25 1.616 +26 1.541 +27 1.464 +28 1.385 +29 1.305 +30 1.224 +31 1.142 +32 1.059 +33 0.975 +34 0.892 +35 0.808 +36 0.724 +37 0.641 +38 0.557 +39 0.475 +40 0.393 +41 0.313 +42 0.233 +43 0.154 +44 0.076 +45 -0.000 +46 -0.075 +47 -0.149 +48 -0.221 +49 -0.291 +50 -0.361 +51 -0.428 +52 -0.495 +53 -0.559 +54 -0.623 +55 -0.684 +56 -0.745 +57 -0.804 +58 -0.862 +59 -0.918 +60 -0.974 +61 -1.029 +62 -1.082 +63 -1.135 +64 -1.188 +65 -1.240 +66 -1.292 +67 -1.343 +68 -1.395 +69 -1.447 +70 -1.500 +71 -1.553 +72 -1.608 +73 -1.663 +74 -1.720 +75 -1.779 +76 -1.840 +77 -1.903 +78 -1.969 +79 -2.038 +80 -2.110 +81 -2.186 +82 -2.265 +83 -2.350 +84 -2.438 +85 -2.532 +86 -2.632 +87 -2.737 +88 -2.849 +89 -2.967 +90 -3.093 +1 1.940 +2 2.034 +3 2.116 +4 2.185 +5 2.242 +6 2.288 +7 2.323 +8 2.349 +9 2.364 +10 2.371 +11 2.369 +12 2.358 +13 2.341 +14 2.316 +15 2.284 +16 2.247 +17 2.203 +18 2.154 +19 2.100 +20 2.042 +21 1.979 +22 1.913 +23 1.843 +24 1.770 +25 1.694 +26 1.616 +27 1.535 +28 1.453 +29 1.369 +30 1.284 +31 1.198 +32 1.111 +33 1.024 +34 0.936 +35 0.848 +36 0.760 +37 0.673 +38 0.585 +39 0.499 +40 0.413 +41 0.328 +42 0.244 +43 0.162 +44 0.080 +45 -0.000 +46 -0.079 +47 -0.156 +48 -0.232 +49 -0.306 +50 -0.379 +51 -0.451 +52 -0.520 +53 -0.588 +54 -0.655 +55 -0.720 +56 -0.784 +57 -0.846 +58 -0.907 +59 -0.967 +60 -1.026 +61 -1.084 +62 -1.141 +63 -1.197 +64 -1.252 +65 -1.307 +66 -1.362 +67 -1.417 +68 -1.472 +69 -1.527 +70 -1.583 +71 -1.640 +72 -1.697 +73 -1.756 +74 -1.817 +75 -1.879 +76 -1.944 +77 -2.011 +78 -2.081 +79 -2.154 +80 -2.231 +81 -2.311 +82 -2.396 +83 -2.485 +84 -2.580 +85 -2.679 +86 -2.785 +87 -2.897 +88 -3.015 +89 -3.141 +90 -3.274 +1 2.405 +2 2.506 +3 2.591 +4 2.663 +5 2.721 +6 2.767 +7 2.800 +8 2.822 +9 2.833 +10 2.834 +11 2.825 +12 2.808 +13 2.781 +14 2.747 +15 2.705 +16 2.656 +17 2.601 +18 2.540 +19 2.473 +20 2.401 +21 2.325 +22 2.244 +23 2.160 +24 2.072 +25 1.981 +26 1.888 +27 1.792 +28 1.695 +29 1.596 +30 1.495 +31 1.393 +32 1.291 +33 1.189 +34 1.086 +35 0.983 +36 0.880 +37 0.778 +38 0.677 +39 0.576 +40 0.477 +41 0.379 +42 0.282 +43 0.186 +44 0.092 +45 -0.000 +46 -0.090 +47 -0.179 +48 -0.266 +49 -0.351 +50 -0.434 +51 -0.514 +52 -0.593 +53 -0.670 +54 -0.745 +55 -0.819 +56 -0.890 +57 -0.959 +58 -1.027 +59 -1.094 +60 -1.159 +61 -1.222 +62 -1.285 +63 -1.346 +64 -1.406 +65 -1.466 +66 -1.526 +67 -1.585 +68 -1.644 +69 -1.703 +70 -1.763 +71 -1.824 +72 -1.885 +73 -1.948 +74 -2.013 +75 -2.079 +76 -2.148 +77 -2.219 +78 -2.294 +79 -2.372 +80 -2.454 +81 -2.539 +82 -2.630 +83 -2.726 +84 -2.827 +85 -2.935 +86 -3.048 +87 -3.169 +88 -3.298 +89 -3.434 +90 -3.579 +1 2.628 +2 2.737 +3 2.830 +4 2.908 +5 2.971 +6 3.020 +7 3.057 +8 3.080 +9 3.092 +10 3.093 +11 3.083 +12 3.063 +13 3.035 +14 2.997 +15 2.951 +16 2.898 +17 2.837 +18 2.770 +19 2.698 +20 2.619 +21 2.536 +22 2.448 +23 2.356 +24 2.260 +25 2.161 +26 2.059 +27 1.954 +28 1.848 +29 1.740 +30 1.630 +31 1.519 +32 1.408 +33 1.296 +34 1.184 +35 1.071 +36 0.960 +37 0.848 +38 0.738 +39 0.628 +40 0.520 +41 0.413 +42 0.307 +43 0.203 +44 0.101 +45 -0.000 +46 -0.099 +47 -0.195 +48 -0.290 +49 -0.382 +50 -0.472 +51 -0.561 +52 -0.647 +53 -0.730 +54 -0.812 +55 -0.892 +56 -0.969 +57 -1.045 +58 -1.119 +59 -1.191 +60 -1.262 +61 -1.331 +62 -1.399 +63 -1.466 +64 -1.532 +65 -1.597 +66 -1.662 +67 -1.726 +68 -1.790 +69 -1.855 +70 -1.920 +71 -1.986 +72 -2.053 +73 -2.121 +74 -2.192 +75 -2.264 +76 -2.339 +77 -2.417 +78 -2.498 +79 -2.582 +80 -2.671 +81 -2.765 +82 -2.864 +83 -2.968 +84 -3.078 +85 -3.195 +86 -3.319 +87 -3.451 +88 -3.591 +89 -3.739 +90 -3.897 +1 2.423 +2 2.526 +3 2.614 +4 2.688 +5 2.748 +6 2.795 +7 2.830 +8 2.853 +9 2.865 +10 2.867 +11 2.859 +12 2.842 +13 2.816 +14 2.781 +15 2.740 +16 2.691 +17 2.635 +18 2.574 +19 2.506 +20 2.434 +21 2.357 +22 2.275 +23 2.190 +24 2.101 +25 2.010 +26 1.915 +27 1.818 +28 1.719 +29 1.619 +30 1.517 +31 1.414 +32 1.311 +33 1.206 +34 1.102 +35 0.998 +36 0.894 +37 0.790 +38 0.687 +39 0.585 +40 0.484 +41 0.385 +42 0.286 +43 0.189 +44 0.094 +45 -0.000 +46 -0.092 +47 -0.182 +48 -0.270 +49 -0.357 +50 -0.441 +51 -0.523 +52 -0.604 +53 -0.682 +54 -0.758 +55 -0.833 +56 -0.906 +57 -0.977 +58 -1.046 +59 -1.114 +60 -1.180 +61 -1.245 +62 -1.309 +63 -1.371 +64 -1.433 +65 -1.495 +66 -1.556 +67 -1.616 +68 -1.677 +69 -1.738 +70 -1.799 +71 -1.861 +72 -1.924 +73 -1.989 +74 -2.055 +75 -2.124 +76 -2.194 +77 -2.268 +78 -2.344 +79 -2.425 +80 -2.509 +81 -2.597 +82 -2.690 +83 -2.788 +84 -2.893 +85 -3.003 +86 -3.120 +87 -3.244 +88 -3.375 +89 -3.515 +90 -3.664 +1 1.920 +2 2.022 +3 2.111 +4 2.187 +5 2.251 +6 2.303 +7 2.343 +8 2.373 +9 2.393 +10 2.403 +11 2.405 +12 2.398 +13 2.382 +14 2.360 +15 2.330 +16 2.293 +17 2.251 +18 2.203 +19 2.149 +20 2.091 +21 2.028 +22 1.961 +23 1.891 +24 1.817 +25 1.740 +26 1.661 +27 1.579 +28 1.495 +29 1.410 +30 1.323 +31 1.235 +32 1.146 +33 1.056 +34 0.966 +35 0.876 +36 0.786 +37 0.695 +38 0.606 +39 0.516 +40 0.428 +41 0.340 +42 0.253 +43 0.168 +44 0.083 +45 -0.000 +46 -0.082 +47 -0.162 +48 -0.241 +49 -0.319 +50 -0.395 +51 -0.469 +52 -0.542 +53 -0.614 +54 -0.684 +55 -0.752 +56 -0.819 +57 -0.885 +58 -0.950 +59 -1.013 +60 -1.075 +61 -1.137 +62 -1.197 +63 -1.257 +64 -1.316 +65 -1.375 +66 -1.434 +67 -1.493 +68 -1.552 +69 -1.612 +70 -1.672 +71 -1.733 +72 -1.796 +73 -1.859 +74 -1.925 +75 -1.993 +76 -2.062 +77 -2.135 +78 -2.211 +79 -2.290 +80 -2.373 +81 -2.459 +82 -2.551 +83 -2.647 +84 -2.749 +85 -2.856 +86 -2.969 +87 -3.089 +88 -3.217 +89 -3.351 +90 -3.494 +1 1.789 +2 1.877 +3 1.953 +4 2.018 +5 2.071 +6 2.114 +7 2.147 +8 2.171 +9 2.186 +10 2.192 +11 2.190 +12 2.181 +13 2.165 +14 2.142 +15 2.113 +16 2.079 +17 2.038 +18 1.993 +19 1.944 +20 1.890 +21 1.832 +22 1.770 +23 1.706 +24 1.638 +25 1.568 +26 1.496 +27 1.421 +28 1.345 +29 1.268 +30 1.189 +31 1.109 +32 1.029 +33 0.948 +34 0.867 +35 0.785 +36 0.704 +37 0.623 +38 0.542 +39 0.462 +40 0.383 +41 0.304 +42 0.226 +43 0.150 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.215 +49 -0.284 +50 -0.352 +51 -0.418 +52 -0.482 +53 -0.546 +54 -0.607 +55 -0.668 +56 -0.727 +57 -0.785 +58 -0.842 +59 -0.897 +60 -0.952 +61 -1.005 +62 -1.058 +63 -1.110 +64 -1.162 +65 -1.213 +66 -1.264 +67 -1.315 +68 -1.367 +69 -1.418 +70 -1.470 +71 -1.523 +72 -1.577 +73 -1.632 +74 -1.688 +75 -1.746 +76 -1.807 +77 -1.869 +78 -1.934 +79 -2.003 +80 -2.074 +81 -2.149 +82 -2.228 +83 -2.311 +84 -2.399 +85 -2.492 +86 -2.590 +87 -2.694 +88 -2.805 +89 -2.922 +90 -3.046 +1 1.705 +2 1.794 +3 1.871 +4 1.937 +5 1.992 +6 2.037 +7 2.071 +8 2.097 +9 2.114 +10 2.122 +11 2.122 +12 2.115 +13 2.101 +14 2.080 +15 2.054 +16 2.021 +17 1.983 +18 1.940 +19 1.893 +20 1.841 +21 1.786 +22 1.726 +23 1.664 +24 1.599 +25 1.531 +26 1.461 +27 1.389 +28 1.315 +29 1.240 +30 1.163 +31 1.085 +32 1.007 +33 0.928 +34 0.849 +35 0.769 +36 0.690 +37 0.611 +38 0.532 +39 0.453 +40 0.376 +41 0.299 +42 0.222 +43 0.147 +44 0.073 +45 -0.000 +46 -0.072 +47 -0.142 +48 -0.212 +49 -0.280 +50 -0.346 +51 -0.411 +52 -0.475 +53 -0.538 +54 -0.599 +55 -0.659 +56 -0.717 +57 -0.775 +58 -0.831 +59 -0.886 +60 -0.941 +61 -0.994 +62 -1.047 +63 -1.099 +64 -1.151 +65 -1.202 +66 -1.253 +67 -1.305 +68 -1.356 +69 -1.408 +70 -1.460 +71 -1.513 +72 -1.567 +73 -1.623 +74 -1.680 +75 -1.739 +76 -1.799 +77 -1.862 +78 -1.928 +79 -1.997 +80 -2.069 +81 -2.144 +82 -2.224 +83 -2.308 +84 -2.396 +85 -2.490 +86 -2.588 +87 -2.693 +88 -2.804 +89 -2.921 +90 -3.046 +1 2.200 +2 2.291 +3 2.369 +4 2.434 +5 2.487 +6 2.528 +7 2.559 +8 2.579 +9 2.589 +10 2.589 +11 2.581 +12 2.565 +13 2.540 +14 2.509 +15 2.470 +16 2.426 +17 2.375 +18 2.319 +19 2.258 +20 2.192 +21 2.122 +22 2.049 +23 1.972 +24 1.891 +25 1.808 +26 1.723 +27 1.636 +28 1.546 +29 1.456 +30 1.364 +31 1.271 +32 1.178 +33 1.084 +34 0.990 +35 0.896 +36 0.803 +37 0.710 +38 0.617 +39 0.525 +40 0.435 +41 0.345 +42 0.257 +43 0.170 +44 0.084 +45 -0.000 +46 -0.082 +47 -0.163 +48 -0.242 +49 -0.319 +50 -0.395 +51 -0.469 +52 -0.540 +53 -0.611 +54 -0.679 +55 -0.745 +56 -0.810 +57 -0.874 +58 -0.935 +59 -0.996 +60 -1.055 +61 -1.112 +62 -1.169 +63 -1.225 +64 -1.280 +65 -1.334 +66 -1.388 +67 -1.442 +68 -1.496 +69 -1.550 +70 -1.604 +71 -1.659 +72 -1.715 +73 -1.772 +74 -1.831 +75 -1.891 +76 -1.954 +77 -2.019 +78 -2.087 +79 -2.158 +80 -2.233 +81 -2.311 +82 -2.394 +83 -2.481 +84 -2.573 +85 -2.671 +86 -2.775 +87 -2.886 +88 -3.003 +89 -3.128 +90 -3.260 +1 2.289 +2 2.381 +3 2.459 +4 2.524 +5 2.577 +6 2.618 +7 2.647 +8 2.666 +9 2.675 +10 2.674 +11 2.665 +12 2.646 +13 2.620 +14 2.587 +15 2.546 +16 2.500 +17 2.447 +18 2.388 +19 2.325 +20 2.257 +21 2.184 +22 2.108 +23 2.028 +24 1.945 +25 1.859 +26 1.771 +27 1.681 +28 1.589 +29 1.496 +30 1.401 +31 1.306 +32 1.209 +33 1.113 +34 1.016 +35 0.920 +36 0.824 +37 0.728 +38 0.633 +39 0.539 +40 0.446 +41 0.354 +42 0.263 +43 0.174 +44 0.086 +45 -0.000 +46 -0.084 +47 -0.167 +48 -0.248 +49 -0.327 +50 -0.404 +51 -0.479 +52 -0.553 +53 -0.624 +54 -0.694 +55 -0.762 +56 -0.828 +57 -0.893 +58 -0.955 +59 -1.017 +60 -1.077 +61 -1.135 +62 -1.193 +63 -1.250 +64 -1.305 +65 -1.360 +66 -1.415 +67 -1.469 +68 -1.524 +69 -1.578 +70 -1.633 +71 -1.689 +72 -1.745 +73 -1.803 +74 -1.862 +75 -1.923 +76 -1.986 +77 -2.052 +78 -2.120 +79 -2.192 +80 -2.267 +81 -2.346 +82 -2.430 +83 -2.518 +84 -2.611 +85 -2.710 +86 -2.815 +87 -2.927 +88 -3.046 +89 -3.172 +90 -3.306 +1 1.831 +2 1.900 +3 1.958 +4 2.006 +5 2.045 +6 2.075 +7 2.095 +8 2.108 +9 2.113 +10 2.110 +11 2.101 +12 2.085 +13 2.063 +14 2.035 +15 2.002 +16 1.964 +17 1.922 +18 1.875 +19 1.824 +20 1.770 +21 1.712 +22 1.651 +23 1.588 +24 1.522 +25 1.455 +26 1.385 +27 1.314 +28 1.242 +29 1.168 +30 1.094 +31 1.019 +32 0.944 +33 0.868 +34 0.792 +35 0.717 +36 0.642 +37 0.567 +38 0.493 +39 0.419 +40 0.347 +41 0.275 +42 0.204 +43 0.135 +44 0.067 +45 -0.000 +46 -0.066 +47 -0.130 +48 -0.192 +49 -0.253 +50 -0.313 +51 -0.371 +52 -0.428 +53 -0.483 +54 -0.536 +55 -0.589 +56 -0.639 +57 -0.689 +58 -0.737 +59 -0.784 +60 -0.829 +61 -0.874 +62 -0.918 +63 -0.961 +64 -1.003 +65 -1.045 +66 -1.086 +67 -1.127 +68 -1.168 +69 -1.209 +70 -1.250 +71 -1.292 +72 -1.334 +73 -1.377 +74 -1.422 +75 -1.468 +76 -1.515 +77 -1.564 +78 -1.616 +79 -1.670 +80 -1.726 +81 -1.786 +82 -1.849 +83 -1.915 +84 -1.986 +85 -2.061 +86 -2.140 +87 -2.225 +88 -2.315 +89 -2.411 +90 -2.513 +1 0.901 +2 0.937 +3 0.967 +4 0.992 +5 1.012 +6 1.028 +7 1.039 +8 1.046 +9 1.049 +10 1.048 +11 1.044 +12 1.037 +13 1.026 +14 1.013 +15 0.997 +16 0.978 +17 0.958 +18 0.934 +19 0.909 +20 0.883 +21 0.854 +22 0.824 +23 0.793 +24 0.760 +25 0.727 +26 0.692 +27 0.657 +28 0.621 +29 0.584 +30 0.547 +31 0.510 +32 0.472 +33 0.434 +34 0.397 +35 0.359 +36 0.321 +37 0.284 +38 0.247 +39 0.210 +40 0.174 +41 0.138 +42 0.103 +43 0.068 +44 0.034 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.097 +49 -0.127 +50 -0.157 +51 -0.186 +52 -0.215 +53 -0.243 +54 -0.270 +55 -0.296 +56 -0.322 +57 -0.347 +58 -0.371 +59 -0.395 +60 -0.418 +61 -0.441 +62 -0.463 +63 -0.485 +64 -0.506 +65 -0.528 +66 -0.549 +67 -0.570 +68 -0.591 +69 -0.612 +70 -0.633 +71 -0.654 +72 -0.676 +73 -0.699 +74 -0.721 +75 -0.745 +76 -0.770 +77 -0.795 +78 -0.822 +79 -0.849 +80 -0.878 +81 -0.909 +82 -0.942 +83 -0.976 +84 -1.012 +85 -1.051 +86 -1.092 +87 -1.135 +88 -1.181 +89 -1.231 +90 -1.283 +1 0.380 +2 0.383 +3 0.385 +4 0.385 +5 0.385 +6 0.383 +7 0.381 +8 0.377 +9 0.373 +10 0.368 +11 0.362 +12 0.355 +13 0.347 +14 0.339 +15 0.331 +16 0.321 +17 0.312 +18 0.302 +19 0.291 +20 0.280 +21 0.269 +22 0.258 +23 0.246 +24 0.234 +25 0.222 +26 0.210 +27 0.198 +28 0.186 +29 0.174 +30 0.162 +31 0.150 +32 0.138 +33 0.126 +34 0.114 +35 0.103 +36 0.091 +37 0.080 +38 0.069 +39 0.059 +40 0.048 +41 0.038 +42 0.028 +43 0.018 +44 0.009 +45 -0.000 +46 -0.009 +47 -0.017 +48 -0.025 +49 -0.033 +50 -0.040 +51 -0.047 +52 -0.054 +53 -0.060 +54 -0.066 +55 -0.072 +56 -0.077 +57 -0.082 +58 -0.087 +59 -0.091 +60 -0.096 +61 -0.099 +62 -0.103 +63 -0.106 +64 -0.110 +65 -0.113 +66 -0.115 +67 -0.118 +68 -0.120 +69 -0.123 +70 -0.125 +71 -0.127 +72 -0.129 +73 -0.132 +74 -0.134 +75 -0.136 +76 -0.138 +77 -0.141 +78 -0.144 +79 -0.146 +80 -0.149 +81 -0.153 +82 -0.157 +83 -0.161 +84 -0.165 +85 -0.170 +86 -0.176 +87 -0.182 +88 -0.189 +89 -0.196 +90 -0.204 +1 -0.194 +2 -0.223 +3 -0.250 +4 -0.274 +5 -0.295 +6 -0.314 +7 -0.330 +8 -0.343 +9 -0.355 +10 -0.364 +11 -0.371 +12 -0.377 +13 -0.380 +14 -0.382 +15 -0.382 +16 -0.381 +17 -0.378 +18 -0.374 +19 -0.368 +20 -0.361 +21 -0.354 +22 -0.345 +23 -0.335 +24 -0.324 +25 -0.313 +26 -0.301 +27 -0.288 +28 -0.275 +29 -0.261 +30 -0.246 +31 -0.231 +32 -0.216 +33 -0.200 +34 -0.184 +35 -0.168 +36 -0.151 +37 -0.135 +38 -0.118 +39 -0.101 +40 -0.084 +41 -0.067 +42 -0.051 +43 -0.034 +44 -0.017 +45 0.000 +46 0.017 +47 0.033 +48 0.050 +49 0.066 +50 0.083 +51 0.099 +52 0.115 +53 0.131 +54 0.147 +55 0.163 +56 0.178 +57 0.194 +58 0.210 +59 0.225 +60 0.240 +61 0.256 +62 0.271 +63 0.287 +64 0.303 +65 0.318 +66 0.334 +67 0.350 +68 0.367 +69 0.383 +70 0.400 +71 0.417 +72 0.435 +73 0.453 +74 0.472 +75 0.491 +76 0.511 +77 0.531 +78 0.553 +79 0.575 +80 0.598 +81 0.622 +82 0.648 +83 0.674 +84 0.702 +85 0.730 +86 0.761 +87 0.793 +88 0.826 +89 0.861 +90 0.898 +1 -0.378 +2 -0.440 +3 -0.496 +4 -0.546 +5 -0.590 +6 -0.629 +7 -0.663 +8 -0.692 +9 -0.716 +10 -0.736 +11 -0.751 +12 -0.763 +13 -0.771 +14 -0.775 +15 -0.776 +16 -0.774 +17 -0.768 +18 -0.760 +19 -0.750 +20 -0.736 +21 -0.721 +22 -0.703 +23 -0.684 +24 -0.662 +25 -0.639 +26 -0.614 +27 -0.588 +28 -0.561 +29 -0.533 +30 -0.503 +31 -0.473 +32 -0.441 +33 -0.409 +34 -0.377 +35 -0.344 +36 -0.310 +37 -0.276 +38 -0.242 +39 -0.208 +40 -0.173 +41 -0.138 +42 -0.104 +43 -0.069 +44 -0.034 +45 0.000 +46 0.034 +47 0.069 +48 0.103 +49 0.136 +50 0.170 +51 0.203 +52 0.237 +53 0.269 +54 0.302 +55 0.335 +56 0.367 +57 0.399 +58 0.432 +59 0.464 +60 0.496 +61 0.528 +62 0.560 +63 0.592 +64 0.625 +65 0.658 +66 0.691 +67 0.724 +68 0.758 +69 0.793 +70 0.828 +71 0.864 +72 0.901 +73 0.939 +74 0.978 +75 1.019 +76 1.060 +77 1.104 +78 1.148 +79 1.195 +80 1.244 +81 1.295 +82 1.348 +83 1.403 +84 1.461 +85 1.522 +86 1.586 +87 1.652 +88 1.723 +89 1.796 +90 1.874 +1 -0.709 +2 -0.794 +3 -0.871 +4 -0.938 +5 -0.998 +6 -1.050 +7 -1.094 +8 -1.131 +9 -1.162 +10 -1.186 +11 -1.204 +12 -1.216 +13 -1.223 +14 -1.224 +15 -1.221 +16 -1.213 +17 -1.201 +18 -1.185 +19 -1.165 +20 -1.141 +21 -1.114 +22 -1.085 +23 -1.052 +24 -1.017 +25 -0.979 +26 -0.940 +27 -0.898 +28 -0.855 +29 -0.810 +30 -0.764 +31 -0.717 +32 -0.668 +33 -0.619 +34 -0.569 +35 -0.518 +36 -0.466 +37 -0.415 +38 -0.363 +39 -0.311 +40 -0.259 +41 -0.207 +42 -0.155 +43 -0.103 +44 -0.051 +45 0.000 +46 0.051 +47 0.101 +48 0.152 +49 0.201 +50 0.250 +51 0.299 +52 0.347 +53 0.395 +54 0.443 +55 0.490 +56 0.536 +57 0.582 +58 0.628 +59 0.674 +60 0.719 +61 0.765 +62 0.810 +63 0.855 +64 0.901 +65 0.946 +66 0.992 +67 1.039 +68 1.086 +69 1.134 +70 1.183 +71 1.233 +72 1.284 +73 1.336 +74 1.390 +75 1.446 +76 1.504 +77 1.563 +78 1.625 +79 1.690 +80 1.757 +81 1.828 +82 1.901 +83 1.978 +84 2.059 +85 2.144 +86 2.233 +87 2.326 +88 2.425 +89 2.528 +90 2.637 +1 -0.836 +2 -0.922 +3 -0.999 +4 -1.067 +5 -1.126 +6 -1.177 +7 -1.221 +8 -1.256 +9 -1.285 +10 -1.308 +11 -1.323 +12 -1.333 +13 -1.337 +14 -1.336 +15 -1.330 +16 -1.319 +17 -1.303 +18 -1.284 +19 -1.260 +20 -1.233 +21 -1.203 +22 -1.169 +23 -1.133 +24 -1.094 +25 -1.052 +26 -1.009 +27 -0.963 +28 -0.916 +29 -0.867 +30 -0.817 +31 -0.766 +32 -0.713 +33 -0.660 +34 -0.606 +35 -0.551 +36 -0.496 +37 -0.441 +38 -0.386 +39 -0.330 +40 -0.274 +41 -0.219 +42 -0.164 +43 -0.109 +44 -0.054 +45 0.000 +46 0.054 +47 0.107 +48 0.160 +49 0.212 +50 0.263 +51 0.314 +52 0.365 +53 0.415 +54 0.464 +55 0.513 +56 0.561 +57 0.609 +58 0.656 +59 0.703 +60 0.750 +61 0.796 +62 0.843 +63 0.889 +64 0.936 +65 0.982 +66 1.029 +67 1.077 +68 1.125 +69 1.173 +70 1.223 +71 1.274 +72 1.325 +73 1.378 +74 1.433 +75 1.489 +76 1.548 +77 1.608 +78 1.671 +79 1.737 +80 1.805 +81 1.876 +82 1.951 +83 2.030 +84 2.112 +85 2.198 +86 2.289 +87 2.385 +88 2.485 +89 2.591 +90 2.703 +1 -1.306 +2 -1.393 +3 -1.469 +4 -1.535 +5 -1.591 +6 -1.638 +7 -1.676 +8 -1.706 +9 -1.728 +10 -1.742 +11 -1.749 +12 -1.750 +13 -1.744 +14 -1.732 +15 -1.714 +16 -1.692 +17 -1.664 +18 -1.632 +19 -1.595 +20 -1.555 +21 -1.511 +22 -1.464 +23 -1.414 +24 -1.360 +25 -1.305 +26 -1.247 +27 -1.188 +28 -1.126 +29 -1.063 +30 -0.999 +31 -0.934 +32 -0.868 +33 -0.801 +34 -0.733 +35 -0.666 +36 -0.598 +37 -0.530 +38 -0.462 +39 -0.395 +40 -0.327 +41 -0.261 +42 -0.194 +43 -0.129 +44 -0.064 +45 0.000 +46 0.063 +47 0.125 +48 0.187 +49 0.247 +50 0.306 +51 0.365 +52 0.422 +53 0.478 +54 0.534 +55 0.588 +56 0.641 +57 0.694 +58 0.746 +59 0.797 +60 0.847 +61 0.897 +62 0.947 +63 0.996 +64 1.045 +65 1.093 +66 1.142 +67 1.191 +68 1.241 +69 1.290 +70 1.341 +71 1.392 +72 1.445 +73 1.499 +74 1.554 +75 1.611 +76 1.670 +77 1.732 +78 1.795 +79 1.862 +80 1.932 +81 2.005 +82 2.081 +83 2.162 +84 2.246 +85 2.336 +86 2.430 +87 2.529 +88 2.634 +89 2.746 +90 2.863 +1 -1.207 +2 -1.294 +3 -1.370 +4 -1.437 +5 -1.494 +6 -1.542 +7 -1.582 +8 -1.613 +9 -1.636 +10 -1.652 +11 -1.661 +12 -1.664 +13 -1.660 +14 -1.650 +15 -1.635 +16 -1.615 +17 -1.590 +18 -1.561 +19 -1.527 +20 -1.489 +21 -1.448 +22 -1.404 +23 -1.356 +24 -1.306 +25 -1.253 +26 -1.199 +27 -1.142 +28 -1.083 +29 -1.023 +30 -0.962 +31 -0.900 +32 -0.836 +33 -0.772 +34 -0.707 +35 -0.642 +36 -0.577 +37 -0.512 +38 -0.447 +39 -0.381 +40 -0.317 +41 -0.252 +42 -0.188 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.122 +48 0.181 +49 0.240 +50 0.298 +51 0.355 +52 0.411 +53 0.466 +54 0.520 +55 0.573 +56 0.625 +57 0.677 +58 0.728 +59 0.778 +60 0.828 +61 0.878 +62 0.926 +63 0.975 +64 1.024 +65 1.072 +66 1.121 +67 1.169 +68 1.219 +69 1.268 +70 1.319 +71 1.370 +72 1.423 +73 1.477 +74 1.532 +75 1.590 +76 1.649 +77 1.710 +78 1.774 +79 1.841 +80 1.911 +81 1.984 +82 2.060 +83 2.141 +84 2.225 +85 2.314 +86 2.408 +87 2.508 +88 2.612 +89 2.723 +90 2.840 +1 -1.516 +2 -1.619 +3 -1.710 +4 -1.788 +5 -1.855 +6 -1.911 +7 -1.957 +8 -1.992 +9 -2.019 +10 -2.036 +11 -2.045 +12 -2.047 +13 -2.040 +14 -2.027 +15 -2.007 +16 -1.981 +17 -1.949 +18 -1.911 +19 -1.869 +20 -1.822 +21 -1.771 +22 -1.716 +23 -1.657 +24 -1.595 +25 -1.530 +26 -1.463 +27 -1.393 +28 -1.321 +29 -1.247 +30 -1.172 +31 -1.096 +32 -1.018 +33 -0.940 +34 -0.861 +35 -0.781 +36 -0.702 +37 -0.622 +38 -0.543 +39 -0.463 +40 -0.384 +41 -0.306 +42 -0.228 +43 -0.151 +44 -0.075 +45 0.000 +46 0.074 +47 0.147 +48 0.219 +49 0.290 +50 0.360 +51 0.429 +52 0.496 +53 0.562 +54 0.628 +55 0.692 +56 0.755 +57 0.817 +58 0.878 +59 0.938 +60 0.998 +61 1.057 +62 1.115 +63 1.173 +64 1.231 +65 1.289 +66 1.346 +67 1.404 +68 1.463 +69 1.522 +70 1.582 +71 1.643 +72 1.705 +73 1.769 +74 1.835 +75 1.903 +76 1.973 +77 2.046 +78 2.122 +79 2.201 +80 2.284 +81 2.370 +82 2.462 +83 2.557 +84 2.658 +85 2.764 +86 2.876 +87 2.994 +88 3.119 +89 3.251 +90 3.391 +1 -1.010 +2 -1.114 +3 -1.206 +4 -1.288 +5 -1.359 +6 -1.420 +7 -1.472 +8 -1.516 +9 -1.550 +10 -1.577 +11 -1.596 +12 -1.607 +13 -1.612 +14 -1.610 +15 -1.603 +16 -1.589 +17 -1.570 +18 -1.547 +19 -1.518 +20 -1.485 +21 -1.448 +22 -1.408 +23 -1.364 +24 -1.317 +25 -1.267 +26 -1.214 +27 -1.159 +28 -1.102 +29 -1.044 +30 -0.983 +31 -0.921 +32 -0.858 +33 -0.794 +34 -0.729 +35 -0.663 +36 -0.597 +37 -0.530 +38 -0.464 +39 -0.397 +40 -0.330 +41 -0.263 +42 -0.197 +43 -0.131 +44 -0.065 +45 0.000 +46 0.065 +47 0.129 +48 0.192 +49 0.254 +50 0.316 +51 0.378 +52 0.438 +53 0.498 +54 0.557 +55 0.616 +56 0.673 +57 0.731 +58 0.788 +59 0.844 +60 0.900 +61 0.956 +62 1.012 +63 1.067 +64 1.123 +65 1.179 +66 1.236 +67 1.292 +68 1.350 +69 1.408 +70 1.468 +71 1.529 +72 1.591 +73 1.655 +74 1.721 +75 1.789 +76 1.859 +77 1.932 +78 2.008 +79 2.086 +80 2.169 +81 2.255 +82 2.345 +83 2.440 +84 2.539 +85 2.644 +86 2.754 +87 2.869 +88 2.991 +89 3.119 +90 3.254 +1 -0.981 +2 -1.092 +3 -1.191 +4 -1.278 +5 -1.355 +6 -1.421 +7 -1.478 +8 -1.525 +9 -1.564 +10 -1.594 +11 -1.616 +12 -1.630 +13 -1.637 +14 -1.638 +15 -1.632 +16 -1.620 +17 -1.602 +18 -1.580 +19 -1.552 +20 -1.520 +21 -1.483 +22 -1.443 +23 -1.398 +24 -1.351 +25 -1.301 +26 -1.247 +27 -1.192 +28 -1.134 +29 -1.074 +30 -1.012 +31 -0.949 +32 -0.884 +33 -0.818 +34 -0.752 +35 -0.684 +36 -0.616 +37 -0.548 +38 -0.479 +39 -0.410 +40 -0.341 +41 -0.272 +42 -0.204 +43 -0.135 +44 -0.067 +45 0.000 +46 0.067 +47 0.133 +48 0.199 +49 0.264 +50 0.329 +51 0.393 +52 0.456 +53 0.518 +54 0.580 +55 0.641 +56 0.702 +57 0.762 +58 0.822 +59 0.881 +60 0.940 +61 0.999 +62 1.058 +63 1.117 +64 1.176 +65 1.235 +66 1.295 +67 1.355 +68 1.417 +69 1.479 +70 1.542 +71 1.607 +72 1.673 +73 1.741 +74 1.811 +75 1.883 +76 1.958 +77 2.036 +78 2.117 +79 2.201 +80 2.289 +81 2.380 +82 2.476 +83 2.577 +84 2.683 +85 2.794 +86 2.910 +87 3.033 +88 3.162 +89 3.298 +90 3.441 +1 -0.962 +2 -1.065 +3 -1.157 +4 -1.238 +5 -1.309 +6 -1.370 +7 -1.422 +8 -1.466 +9 -1.501 +10 -1.528 +11 -1.547 +12 -1.560 +13 -1.565 +14 -1.565 +15 -1.558 +16 -1.546 +17 -1.528 +18 -1.505 +19 -1.478 +20 -1.447 +21 -1.411 +22 -1.372 +23 -1.330 +24 -1.284 +25 -1.236 +26 -1.185 +27 -1.132 +28 -1.076 +29 -1.019 +30 -0.960 +31 -0.900 +32 -0.838 +33 -0.776 +34 -0.712 +35 -0.648 +36 -0.584 +37 -0.519 +38 -0.453 +39 -0.388 +40 -0.323 +41 -0.258 +42 -0.193 +43 -0.128 +44 -0.064 +45 0.000 +46 0.063 +47 0.126 +48 0.188 +49 0.249 +50 0.310 +51 0.370 +52 0.430 +53 0.488 +54 0.547 +55 0.604 +56 0.661 +57 0.717 +58 0.773 +59 0.829 +60 0.884 +61 0.939 +62 0.994 +63 1.049 +64 1.105 +65 1.160 +66 1.216 +67 1.272 +68 1.329 +69 1.387 +70 1.446 +71 1.506 +72 1.568 +73 1.631 +74 1.697 +75 1.764 +76 1.834 +77 1.906 +78 1.981 +79 2.060 +80 2.142 +81 2.227 +82 2.317 +83 2.411 +84 2.509 +85 2.613 +86 2.722 +87 2.836 +88 2.957 +89 3.084 +90 3.218 +1 -1.287 +2 -1.386 +3 -1.472 +4 -1.548 +5 -1.613 +6 -1.668 +7 -1.713 +8 -1.750 +9 -1.777 +10 -1.797 +11 -1.808 +12 -1.813 +13 -1.810 +14 -1.801 +15 -1.785 +16 -1.764 +17 -1.738 +18 -1.707 +19 -1.671 +20 -1.630 +21 -1.586 +22 -1.538 +23 -1.487 +24 -1.432 +25 -1.375 +26 -1.315 +27 -1.253 +28 -1.190 +29 -1.124 +30 -1.057 +31 -0.989 +32 -0.919 +33 -0.849 +34 -0.778 +35 -0.707 +36 -0.635 +37 -0.564 +38 -0.492 +39 -0.420 +40 -0.349 +41 -0.278 +42 -0.208 +43 -0.138 +44 -0.068 +45 0.000 +46 0.068 +47 0.134 +48 0.200 +49 0.265 +50 0.329 +51 0.392 +52 0.454 +53 0.515 +54 0.575 +55 0.635 +56 0.693 +57 0.751 +58 0.808 +59 0.864 +60 0.919 +61 0.975 +62 1.029 +63 1.084 +64 1.138 +65 1.193 +66 1.247 +67 1.302 +68 1.358 +69 1.414 +70 1.471 +71 1.529 +72 1.589 +73 1.650 +74 1.712 +75 1.777 +76 1.844 +77 1.914 +78 1.986 +79 2.061 +80 2.140 +81 2.223 +82 2.310 +83 2.401 +84 2.497 +85 2.597 +86 2.704 +87 2.816 +88 2.934 +89 3.059 +90 3.191 +1 -1.196 +2 -1.289 +3 -1.371 +4 -1.442 +5 -1.504 +6 -1.556 +7 -1.599 +8 -1.634 +9 -1.660 +10 -1.679 +11 -1.691 +12 -1.695 +13 -1.693 +14 -1.685 +15 -1.671 +16 -1.651 +17 -1.627 +18 -1.598 +19 -1.564 +20 -1.527 +21 -1.485 +22 -1.441 +23 -1.393 +24 -1.342 +25 -1.289 +26 -1.233 +27 -1.175 +28 -1.115 +29 -1.054 +30 -0.991 +31 -0.927 +32 -0.862 +33 -0.796 +34 -0.730 +35 -0.663 +36 -0.596 +37 -0.529 +38 -0.461 +39 -0.394 +40 -0.327 +41 -0.261 +42 -0.195 +43 -0.129 +44 -0.064 +45 0.000 +46 0.063 +47 0.126 +48 0.188 +49 0.249 +50 0.309 +51 0.368 +52 0.427 +53 0.484 +54 0.540 +55 0.596 +56 0.651 +57 0.705 +58 0.759 +59 0.812 +60 0.864 +61 0.916 +62 0.968 +63 1.019 +64 1.070 +65 1.122 +66 1.173 +67 1.225 +68 1.277 +69 1.330 +70 1.384 +71 1.439 +72 1.495 +73 1.553 +74 1.612 +75 1.673 +76 1.736 +77 1.802 +78 1.870 +79 1.942 +80 2.016 +81 2.094 +82 2.176 +83 2.262 +84 2.352 +85 2.448 +86 2.548 +87 2.654 +88 2.766 +89 2.883 +90 3.008 +1 -1.288 +2 -1.386 +3 -1.472 +4 -1.548 +5 -1.613 +6 -1.668 +7 -1.713 +8 -1.750 +9 -1.777 +10 -1.797 +11 -1.808 +12 -1.813 +13 -1.810 +14 -1.801 +15 -1.785 +16 -1.764 +17 -1.738 +18 -1.707 +19 -1.671 +20 -1.630 +21 -1.586 +22 -1.538 +23 -1.487 +24 -1.432 +25 -1.375 +26 -1.315 +27 -1.253 +28 -1.190 +29 -1.124 +30 -1.057 +31 -0.989 +32 -0.919 +33 -0.849 +34 -0.778 +35 -0.707 +36 -0.635 +37 -0.564 +38 -0.492 +39 -0.420 +40 -0.349 +41 -0.278 +42 -0.208 +43 -0.138 +44 -0.068 +45 0.000 +46 0.068 +47 0.134 +48 0.200 +49 0.265 +50 0.329 +51 0.392 +52 0.454 +53 0.515 +54 0.575 +55 0.635 +56 0.693 +57 0.751 +58 0.808 +59 0.864 +60 0.919 +61 0.975 +62 1.029 +63 1.084 +64 1.138 +65 1.193 +66 1.247 +67 1.302 +68 1.358 +69 1.414 +70 1.471 +71 1.529 +72 1.589 +73 1.649 +74 1.712 +75 1.777 +76 1.844 +77 1.913 +78 1.986 +79 2.061 +80 2.140 +81 2.223 +82 2.309 +83 2.400 +84 2.496 +85 2.597 +86 2.703 +87 2.815 +88 2.933 +89 3.058 +90 3.190 +1 -0.965 +2 -1.068 +3 -1.159 +4 -1.240 +5 -1.311 +6 -1.372 +7 -1.424 +8 -1.467 +9 -1.502 +10 -1.529 +11 -1.548 +12 -1.561 +13 -1.566 +14 -1.565 +15 -1.559 +16 -1.546 +17 -1.528 +18 -1.506 +19 -1.479 +20 -1.447 +21 -1.412 +22 -1.372 +23 -1.330 +24 -1.284 +25 -1.236 +26 -1.185 +27 -1.132 +28 -1.076 +29 -1.019 +30 -0.960 +31 -0.900 +32 -0.838 +33 -0.776 +34 -0.712 +35 -0.648 +36 -0.584 +37 -0.519 +38 -0.453 +39 -0.388 +40 -0.323 +41 -0.258 +42 -0.193 +43 -0.128 +44 -0.064 +45 0.000 +46 0.063 +47 0.126 +48 0.188 +49 0.249 +50 0.310 +51 0.370 +52 0.430 +53 0.488 +54 0.547 +55 0.604 +56 0.661 +57 0.717 +58 0.773 +59 0.829 +60 0.884 +61 0.939 +62 0.994 +63 1.049 +64 1.105 +65 1.160 +66 1.216 +67 1.272 +68 1.329 +69 1.387 +70 1.446 +71 1.506 +72 1.568 +73 1.631 +74 1.697 +75 1.764 +76 1.834 +77 1.906 +78 1.981 +79 2.060 +80 2.142 +81 2.227 +82 2.317 +83 2.411 +84 2.509 +85 2.613 +86 2.722 +87 2.836 +88 2.957 +89 3.084 +90 3.218 +1 -0.985 +2 -1.095 +3 -1.194 +4 -1.281 +5 -1.358 +6 -1.424 +7 -1.481 +8 -1.528 +9 -1.567 +10 -1.596 +11 -1.618 +12 -1.633 +13 -1.640 +14 -1.640 +15 -1.634 +16 -1.622 +17 -1.604 +18 -1.582 +19 -1.554 +20 -1.521 +21 -1.485 +22 -1.444 +23 -1.400 +24 -1.353 +25 -1.302 +26 -1.249 +27 -1.193 +28 -1.135 +29 -1.075 +30 -1.013 +31 -0.950 +32 -0.885 +33 -0.819 +34 -0.752 +35 -0.685 +36 -0.617 +37 -0.548 +38 -0.479 +39 -0.410 +40 -0.342 +41 -0.273 +42 -0.204 +43 -0.136 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.199 +49 0.265 +50 0.329 +51 0.393 +52 0.456 +53 0.519 +54 0.581 +55 0.642 +56 0.703 +57 0.763 +58 0.823 +59 0.882 +60 0.941 +61 1.000 +62 1.059 +63 1.118 +64 1.177 +65 1.236 +66 1.296 +67 1.356 +68 1.418 +69 1.480 +70 1.543 +71 1.608 +72 1.674 +73 1.742 +74 1.812 +75 1.884 +76 1.959 +77 2.037 +78 2.118 +79 2.202 +80 2.290 +81 2.381 +82 2.477 +83 2.578 +84 2.684 +85 2.795 +86 2.911 +87 3.034 +88 3.163 +89 3.299 +90 3.442 +1 -1.013 +2 -1.117 +3 -1.209 +4 -1.291 +5 -1.362 +6 -1.423 +7 -1.475 +8 -1.518 +9 -1.553 +10 -1.579 +11 -1.598 +12 -1.610 +13 -1.614 +14 -1.613 +15 -1.605 +16 -1.591 +17 -1.572 +18 -1.549 +19 -1.520 +20 -1.487 +21 -1.450 +22 -1.410 +23 -1.365 +24 -1.318 +25 -1.268 +26 -1.216 +27 -1.161 +28 -1.104 +29 -1.045 +30 -0.984 +31 -0.922 +32 -0.859 +33 -0.795 +34 -0.729 +35 -0.664 +36 -0.597 +37 -0.531 +38 -0.464 +39 -0.397 +40 -0.330 +41 -0.263 +42 -0.197 +43 -0.131 +44 -0.065 +45 0.000 +46 0.065 +47 0.129 +48 0.192 +49 0.255 +50 0.317 +51 0.378 +52 0.438 +53 0.498 +54 0.557 +55 0.616 +56 0.674 +57 0.731 +58 0.788 +59 0.845 +60 0.901 +61 0.957 +62 1.012 +63 1.068 +64 1.124 +65 1.180 +66 1.236 +67 1.293 +68 1.351 +69 1.409 +70 1.469 +71 1.530 +72 1.592 +73 1.656 +74 1.722 +75 1.790 +76 1.860 +77 1.933 +78 2.009 +79 2.088 +80 2.170 +81 2.257 +82 2.347 +83 2.442 +84 2.541 +85 2.645 +86 2.755 +87 2.871 +88 2.993 +89 3.121 +90 3.256 +1 -1.518 +2 -1.622 +3 -1.712 +4 -1.791 +5 -1.858 +6 -1.914 +7 -1.960 +8 -1.996 +9 -2.022 +10 -2.040 +11 -2.049 +12 -2.050 +13 -2.044 +14 -2.030 +15 -2.010 +16 -1.984 +17 -1.952 +18 -1.915 +19 -1.872 +20 -1.825 +21 -1.774 +22 -1.719 +23 -1.660 +24 -1.598 +25 -1.533 +26 -1.465 +27 -1.395 +28 -1.323 +29 -1.249 +30 -1.174 +31 -1.097 +32 -1.020 +33 -0.941 +34 -0.862 +35 -0.783 +36 -0.703 +37 -0.623 +38 -0.543 +39 -0.464 +40 -0.385 +41 -0.307 +42 -0.229 +43 -0.152 +44 -0.075 +45 0.000 +46 0.074 +47 0.148 +48 0.220 +49 0.291 +50 0.361 +51 0.429 +52 0.497 +53 0.563 +54 0.629 +55 0.693 +56 0.756 +57 0.818 +58 0.879 +59 0.940 +60 0.999 +61 1.058 +62 1.117 +63 1.175 +64 1.233 +65 1.290 +66 1.348 +67 1.406 +68 1.465 +69 1.524 +70 1.584 +71 1.645 +72 1.707 +73 1.771 +74 1.837 +75 1.905 +76 1.975 +77 2.048 +78 2.124 +79 2.203 +80 2.286 +81 2.373 +82 2.464 +83 2.559 +84 2.660 +85 2.766 +86 2.878 +87 2.996 +88 3.121 +89 3.253 +90 3.393 +1 -1.212 +2 -1.299 +3 -1.375 +4 -1.442 +5 -1.499 +6 -1.547 +7 -1.586 +8 -1.617 +9 -1.641 +10 -1.657 +11 -1.666 +12 -1.668 +13 -1.664 +14 -1.655 +15 -1.639 +16 -1.619 +17 -1.594 +18 -1.564 +19 -1.530 +20 -1.493 +21 -1.451 +22 -1.407 +23 -1.359 +24 -1.309 +25 -1.256 +26 -1.201 +27 -1.144 +28 -1.086 +29 -1.025 +30 -0.964 +31 -0.901 +32 -0.838 +33 -0.774 +34 -0.709 +35 -0.644 +36 -0.578 +37 -0.513 +38 -0.448 +39 -0.382 +40 -0.317 +41 -0.253 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.122 +48 0.182 +49 0.240 +50 0.298 +51 0.355 +52 0.411 +53 0.467 +54 0.521 +55 0.574 +56 0.627 +57 0.679 +58 0.730 +59 0.780 +60 0.830 +61 0.880 +62 0.929 +63 0.977 +64 1.026 +65 1.075 +66 1.123 +67 1.172 +68 1.221 +69 1.271 +70 1.322 +71 1.374 +72 1.426 +73 1.480 +74 1.536 +75 1.593 +76 1.652 +77 1.714 +78 1.778 +79 1.845 +80 1.915 +81 1.988 +82 2.064 +83 2.145 +84 2.230 +85 2.319 +86 2.413 +87 2.512 +88 2.617 +89 2.728 +90 2.845 +1 -1.311 +2 -1.398 +3 -1.475 +4 -1.541 +5 -1.597 +6 -1.644 +7 -1.682 +8 -1.712 +9 -1.734 +10 -1.748 +11 -1.755 +12 -1.756 +13 -1.750 +14 -1.738 +15 -1.720 +16 -1.697 +17 -1.669 +18 -1.637 +19 -1.600 +20 -1.560 +21 -1.516 +22 -1.468 +23 -1.418 +24 -1.365 +25 -1.309 +26 -1.251 +27 -1.191 +28 -1.130 +29 -1.066 +30 -1.002 +31 -0.937 +32 -0.870 +33 -0.803 +34 -0.736 +35 -0.668 +36 -0.600 +37 -0.531 +38 -0.463 +39 -0.396 +40 -0.328 +41 -0.261 +42 -0.195 +43 -0.129 +44 -0.064 +45 0.000 +46 0.063 +47 0.126 +48 0.187 +49 0.248 +50 0.307 +51 0.366 +52 0.423 +53 0.479 +54 0.535 +55 0.589 +56 0.643 +57 0.696 +58 0.748 +59 0.799 +60 0.849 +61 0.899 +62 0.949 +63 0.998 +64 1.047 +65 1.096 +66 1.145 +67 1.194 +68 1.243 +69 1.293 +70 1.344 +71 1.396 +72 1.448 +73 1.502 +74 1.558 +75 1.615 +76 1.674 +77 1.735 +78 1.799 +79 1.866 +80 1.936 +81 2.009 +82 2.085 +83 2.166 +84 2.251 +85 2.340 +86 2.435 +87 2.535 +88 2.640 +89 2.751 +90 2.869 +1 -0.842 +2 -0.928 +3 -1.005 +4 -1.073 +5 -1.133 +6 -1.184 +7 -1.228 +8 -1.264 +9 -1.293 +10 -1.315 +11 -1.331 +12 -1.341 +13 -1.345 +14 -1.343 +15 -1.337 +16 -1.326 +17 -1.310 +18 -1.291 +19 -1.267 +20 -1.240 +21 -1.209 +22 -1.175 +23 -1.139 +24 -1.099 +25 -1.058 +26 -1.014 +27 -0.968 +28 -0.921 +29 -0.871 +30 -0.821 +31 -0.769 +32 -0.717 +33 -0.663 +34 -0.609 +35 -0.554 +36 -0.499 +37 -0.443 +38 -0.387 +39 -0.331 +40 -0.276 +41 -0.220 +42 -0.164 +43 -0.109 +44 -0.054 +45 0.000 +46 0.054 +47 0.107 +48 0.160 +49 0.213 +50 0.265 +51 0.316 +52 0.366 +53 0.416 +54 0.466 +55 0.515 +56 0.563 +57 0.611 +58 0.659 +59 0.706 +60 0.753 +61 0.799 +62 0.846 +63 0.893 +64 0.939 +65 0.986 +66 1.033 +67 1.081 +68 1.129 +69 1.177 +70 1.227 +71 1.278 +72 1.329 +73 1.383 +74 1.437 +75 1.494 +76 1.552 +77 1.613 +78 1.676 +79 1.742 +80 1.810 +81 1.882 +82 1.957 +83 2.035 +84 2.118 +85 2.204 +86 2.295 +87 2.391 +88 2.492 +89 2.598 +90 2.710 +1 -0.717 +2 -0.802 +3 -0.879 +4 -0.946 +5 -1.006 +6 -1.058 +7 -1.102 +8 -1.139 +9 -1.170 +10 -1.194 +11 -1.212 +12 -1.224 +13 -1.230 +14 -1.232 +15 -1.228 +16 -1.220 +17 -1.208 +18 -1.191 +19 -1.171 +20 -1.147 +21 -1.121 +22 -1.091 +23 -1.058 +24 -1.022 +25 -0.985 +26 -0.945 +27 -0.903 +28 -0.860 +29 -0.814 +30 -0.768 +31 -0.720 +32 -0.672 +33 -0.622 +34 -0.571 +35 -0.520 +36 -0.469 +37 -0.417 +38 -0.365 +39 -0.312 +40 -0.260 +41 -0.208 +42 -0.155 +43 -0.103 +44 -0.052 +45 0.000 +46 0.051 +47 0.102 +48 0.152 +49 0.202 +50 0.252 +51 0.301 +52 0.349 +53 0.397 +54 0.445 +55 0.492 +56 0.539 +57 0.585 +58 0.631 +59 0.677 +60 0.723 +61 0.768 +62 0.814 +63 0.859 +64 0.905 +65 0.951 +66 0.997 +67 1.044 +68 1.091 +69 1.139 +70 1.188 +71 1.238 +72 1.289 +73 1.342 +74 1.396 +75 1.452 +76 1.509 +77 1.569 +78 1.631 +79 1.696 +80 1.764 +81 1.834 +82 1.908 +83 1.985 +84 2.066 +85 2.151 +86 2.240 +87 2.334 +88 2.432 +89 2.536 +90 2.645 +1 -0.386 +2 -0.448 +3 -0.504 +4 -0.554 +5 -0.599 +6 -0.638 +7 -0.672 +8 -0.701 +9 -0.725 +10 -0.745 +11 -0.761 +12 -0.772 +13 -0.780 +14 -0.784 +15 -0.785 +16 -0.783 +17 -0.777 +18 -0.769 +19 -0.758 +20 -0.744 +21 -0.729 +22 -0.711 +23 -0.691 +24 -0.669 +25 -0.646 +26 -0.621 +27 -0.594 +28 -0.567 +29 -0.538 +30 -0.508 +31 -0.477 +32 -0.446 +33 -0.413 +34 -0.380 +35 -0.347 +36 -0.313 +37 -0.279 +38 -0.244 +39 -0.209 +40 -0.175 +41 -0.140 +42 -0.105 +43 -0.070 +44 -0.035 +45 0.000 +46 0.035 +47 0.069 +48 0.103 +49 0.137 +50 0.171 +51 0.205 +52 0.238 +53 0.272 +54 0.305 +55 0.337 +56 0.370 +57 0.402 +58 0.435 +59 0.467 +60 0.499 +61 0.531 +62 0.564 +63 0.596 +64 0.629 +65 0.662 +66 0.695 +67 0.729 +68 0.763 +69 0.798 +70 0.833 +71 0.869 +72 0.906 +73 0.945 +74 0.984 +75 1.024 +76 1.066 +77 1.110 +78 1.155 +79 1.202 +80 1.251 +81 1.302 +82 1.355 +83 1.410 +84 1.469 +85 1.530 +86 1.594 +87 1.661 +88 1.732 +89 1.806 +90 1.884 +1 -0.201 +2 -0.232 +3 -0.259 +4 -0.283 +5 -0.304 +6 -0.323 +7 -0.339 +8 -0.353 +9 -0.364 +10 -0.374 +11 -0.381 +12 -0.386 +13 -0.389 +14 -0.391 +15 -0.391 +16 -0.390 +17 -0.387 +18 -0.382 +19 -0.376 +20 -0.370 +21 -0.362 +22 -0.352 +23 -0.342 +24 -0.331 +25 -0.320 +26 -0.307 +27 -0.294 +28 -0.280 +29 -0.266 +30 -0.251 +31 -0.236 +32 -0.220 +33 -0.204 +34 -0.188 +35 -0.171 +36 -0.154 +37 -0.137 +38 -0.120 +39 -0.103 +40 -0.086 +41 -0.069 +42 -0.051 +43 -0.034 +44 -0.017 +45 0.000 +46 0.017 +47 0.034 +48 0.051 +49 0.067 +50 0.084 +51 0.101 +52 0.117 +53 0.133 +54 0.149 +55 0.165 +56 0.181 +57 0.197 +58 0.213 +59 0.228 +60 0.244 +61 0.260 +62 0.275 +63 0.291 +64 0.307 +65 0.323 +66 0.339 +67 0.355 +68 0.371 +69 0.388 +70 0.405 +71 0.422 +72 0.440 +73 0.459 +74 0.477 +75 0.497 +76 0.517 +77 0.538 +78 0.559 +79 0.582 +80 0.605 +81 0.630 +82 0.655 +83 0.682 +84 0.710 +85 0.739 +86 0.770 +87 0.802 +88 0.836 +89 0.872 +90 0.909 +1 0.371 +2 0.374 +3 0.375 +4 0.376 +5 0.375 +6 0.373 +7 0.370 +8 0.367 +9 0.362 +10 0.357 +11 0.351 +12 0.344 +13 0.337 +14 0.329 +15 0.320 +16 0.311 +17 0.301 +18 0.292 +19 0.281 +20 0.271 +21 0.260 +22 0.249 +23 0.238 +24 0.226 +25 0.215 +26 0.203 +27 0.191 +28 0.179 +29 0.168 +30 0.156 +31 0.144 +32 0.133 +33 0.121 +34 0.110 +35 0.099 +36 0.088 +37 0.077 +38 0.067 +39 0.056 +40 0.046 +41 0.036 +42 0.027 +43 0.018 +44 0.009 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.031 +50 -0.038 +51 -0.045 +52 -0.052 +53 -0.058 +54 -0.063 +55 -0.069 +56 -0.074 +57 -0.079 +58 -0.083 +59 -0.087 +60 -0.091 +61 -0.095 +62 -0.098 +63 -0.102 +64 -0.105 +65 -0.107 +66 -0.110 +67 -0.112 +68 -0.115 +69 -0.117 +70 -0.119 +71 -0.121 +72 -0.123 +73 -0.125 +74 -0.127 +75 -0.129 +76 -0.131 +77 -0.134 +78 -0.136 +79 -0.139 +80 -0.141 +81 -0.145 +82 -0.148 +83 -0.152 +84 -0.156 +85 -0.161 +86 -0.166 +87 -0.171 +88 -0.178 +89 -0.184 +90 -0.192 +1 0.892 +2 0.927 +3 0.957 +4 0.982 +5 1.002 +6 1.017 +7 1.029 +8 1.036 +9 1.039 +10 1.038 +11 1.034 +12 1.027 +13 1.017 +14 1.003 +15 0.987 +16 0.969 +17 0.948 +18 0.926 +19 0.901 +20 0.874 +21 0.846 +22 0.816 +23 0.785 +24 0.753 +25 0.720 +26 0.686 +27 0.651 +28 0.615 +29 0.579 +30 0.542 +31 0.505 +32 0.468 +33 0.430 +34 0.393 +35 0.356 +36 0.318 +37 0.281 +38 0.245 +39 0.208 +40 0.172 +41 0.137 +42 0.102 +43 0.067 +44 0.033 +45 -0.000 +46 -0.033 +47 -0.064 +48 -0.096 +49 -0.126 +50 -0.156 +51 -0.185 +52 -0.213 +53 -0.241 +54 -0.268 +55 -0.294 +56 -0.319 +57 -0.344 +58 -0.368 +59 -0.392 +60 -0.415 +61 -0.437 +62 -0.459 +63 -0.481 +64 -0.502 +65 -0.523 +66 -0.544 +67 -0.565 +68 -0.586 +69 -0.607 +70 -0.628 +71 -0.649 +72 -0.671 +73 -0.693 +74 -0.716 +75 -0.739 +76 -0.764 +77 -0.789 +78 -0.815 +79 -0.843 +80 -0.872 +81 -0.902 +82 -0.934 +83 -0.968 +84 -1.004 +85 -1.043 +86 -1.083 +87 -1.126 +88 -1.172 +89 -1.221 +90 -1.273 +1 1.823 +2 1.891 +3 1.950 +4 1.998 +5 2.036 +6 2.065 +7 2.086 +8 2.099 +9 2.103 +10 2.101 +11 2.092 +12 2.076 +13 2.054 +14 2.026 +15 1.993 +16 1.955 +17 1.913 +18 1.866 +19 1.816 +20 1.761 +21 1.704 +22 1.644 +23 1.581 +24 1.515 +25 1.448 +26 1.379 +27 1.308 +28 1.236 +29 1.163 +30 1.089 +31 1.014 +32 0.939 +33 0.864 +34 0.789 +35 0.714 +36 0.639 +37 0.564 +38 0.491 +39 0.417 +40 0.345 +41 0.274 +42 0.204 +43 0.134 +44 0.067 +45 -0.000 +46 -0.065 +47 -0.129 +48 -0.191 +49 -0.252 +50 -0.312 +51 -0.369 +52 -0.426 +53 -0.481 +54 -0.534 +55 -0.586 +56 -0.637 +57 -0.686 +58 -0.734 +59 -0.780 +60 -0.826 +61 -0.870 +62 -0.914 +63 -0.957 +64 -0.999 +65 -1.040 +66 -1.081 +67 -1.122 +68 -1.163 +69 -1.204 +70 -1.245 +71 -1.287 +72 -1.329 +73 -1.372 +74 -1.416 +75 -1.462 +76 -1.509 +77 -1.558 +78 -1.610 +79 -1.663 +80 -1.720 +81 -1.779 +82 -1.842 +83 -1.908 +84 -1.978 +85 -2.053 +86 -2.132 +87 -2.216 +88 -2.306 +89 -2.401 +90 -2.503 +1 2.280 +2 2.373 +3 2.451 +4 2.516 +5 2.569 +6 2.610 +7 2.640 +8 2.659 +9 2.668 +10 2.667 +11 2.658 +12 2.640 +13 2.614 +14 2.581 +15 2.541 +16 2.494 +17 2.441 +18 2.383 +19 2.320 +20 2.252 +21 2.179 +22 2.103 +23 2.024 +24 1.941 +25 1.855 +26 1.767 +27 1.677 +28 1.586 +29 1.492 +30 1.398 +31 1.303 +32 1.207 +33 1.111 +34 1.014 +35 0.918 +36 0.822 +37 0.726 +38 0.632 +39 0.538 +40 0.445 +41 0.353 +42 0.263 +43 0.173 +44 0.086 +45 -0.000 +46 -0.084 +47 -0.167 +48 -0.247 +49 -0.326 +50 -0.403 +51 -0.478 +52 -0.551 +53 -0.623 +54 -0.692 +55 -0.760 +56 -0.826 +57 -0.890 +58 -0.953 +59 -1.014 +60 -1.074 +61 -1.132 +62 -1.190 +63 -1.246 +64 -1.301 +65 -1.356 +66 -1.411 +67 -1.465 +68 -1.519 +69 -1.573 +70 -1.628 +71 -1.683 +72 -1.740 +73 -1.797 +74 -1.856 +75 -1.917 +76 -1.980 +77 -2.046 +78 -2.114 +79 -2.185 +80 -2.260 +81 -2.339 +82 -2.423 +83 -2.511 +84 -2.604 +85 -2.703 +86 -2.808 +87 -2.919 +88 -3.038 +89 -3.164 +90 -3.298 +1 2.194 +2 2.285 +3 2.362 +4 2.427 +5 2.480 +6 2.521 +7 2.551 +8 2.571 +9 2.581 +10 2.582 +11 2.574 +12 2.557 +13 2.533 +14 2.501 +15 2.463 +16 2.419 +17 2.368 +18 2.312 +19 2.251 +20 2.186 +21 2.116 +22 2.043 +23 1.966 +24 1.886 +25 1.803 +26 1.718 +27 1.631 +28 1.542 +29 1.452 +30 1.360 +31 1.268 +32 1.174 +33 1.081 +34 0.987 +35 0.894 +36 0.800 +37 0.708 +38 0.615 +39 0.524 +40 0.433 +41 0.344 +42 0.256 +43 0.169 +44 0.084 +45 -0.000 +46 -0.082 +47 -0.163 +48 -0.242 +49 -0.319 +50 -0.394 +51 -0.467 +52 -0.539 +53 -0.609 +54 -0.677 +55 -0.743 +56 -0.808 +57 -0.871 +58 -0.933 +59 -0.993 +60 -1.052 +61 -1.109 +62 -1.166 +63 -1.222 +64 -1.277 +65 -1.331 +66 -1.385 +67 -1.438 +68 -1.492 +69 -1.546 +70 -1.600 +71 -1.655 +72 -1.711 +73 -1.768 +74 -1.827 +75 -1.887 +76 -1.949 +77 -2.014 +78 -2.082 +79 -2.153 +80 -2.227 +81 -2.306 +82 -2.388 +83 -2.475 +84 -2.568 +85 -2.665 +86 -2.769 +87 -2.879 +88 -2.996 +89 -3.121 +90 -3.253 +1 1.701 +2 1.790 +3 1.867 +4 1.932 +5 1.987 +6 2.031 +7 2.066 +8 2.092 +9 2.108 +10 2.116 +11 2.117 +12 2.110 +13 2.096 +14 2.075 +15 2.048 +16 2.016 +17 1.978 +18 1.935 +19 1.888 +20 1.836 +21 1.781 +22 1.722 +23 1.660 +24 1.595 +25 1.527 +26 1.457 +27 1.385 +28 1.312 +29 1.236 +30 1.160 +31 1.083 +32 1.004 +33 0.926 +34 0.847 +35 0.767 +36 0.688 +37 0.609 +38 0.530 +39 0.452 +40 0.375 +41 0.298 +42 0.222 +43 0.147 +44 0.073 +45 -0.000 +46 -0.072 +47 -0.142 +48 -0.211 +49 -0.279 +50 -0.345 +51 -0.410 +52 -0.474 +53 -0.536 +54 -0.597 +55 -0.657 +56 -0.716 +57 -0.773 +58 -0.829 +59 -0.884 +60 -0.939 +61 -0.992 +62 -1.045 +63 -1.097 +64 -1.148 +65 -1.200 +66 -1.251 +67 -1.302 +68 -1.353 +69 -1.405 +70 -1.457 +71 -1.510 +72 -1.564 +73 -1.620 +74 -1.676 +75 -1.735 +76 -1.796 +77 -1.859 +78 -1.925 +79 -1.993 +80 -2.065 +81 -2.141 +82 -2.220 +83 -2.304 +84 -2.392 +85 -2.485 +86 -2.584 +87 -2.689 +88 -2.799 +89 -2.917 +90 -3.041 +1 1.786 +2 1.873 +3 1.949 +4 2.014 +5 2.067 +6 2.110 +7 2.143 +8 2.167 +9 2.182 +10 2.188 +11 2.186 +12 2.177 +13 2.161 +14 2.138 +15 2.109 +16 2.075 +17 2.035 +18 1.990 +19 1.940 +20 1.886 +21 1.828 +22 1.767 +23 1.703 +24 1.635 +25 1.565 +26 1.493 +27 1.419 +28 1.343 +29 1.266 +30 1.187 +31 1.107 +32 1.027 +33 0.946 +34 0.865 +35 0.784 +36 0.703 +37 0.622 +38 0.541 +39 0.461 +40 0.382 +41 0.304 +42 0.226 +43 0.150 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.215 +49 -0.284 +50 -0.351 +51 -0.417 +52 -0.482 +53 -0.545 +54 -0.607 +55 -0.667 +56 -0.726 +57 -0.784 +58 -0.840 +59 -0.896 +60 -0.950 +61 -1.004 +62 -1.057 +63 -1.109 +64 -1.160 +65 -1.212 +66 -1.263 +67 -1.314 +68 -1.365 +69 -1.416 +70 -1.468 +71 -1.521 +72 -1.574 +73 -1.629 +74 -1.686 +75 -1.744 +76 -1.804 +77 -1.867 +78 -1.932 +79 -2.000 +80 -2.071 +81 -2.146 +82 -2.225 +83 -2.308 +84 -2.396 +85 -2.489 +86 -2.587 +87 -2.691 +88 -2.801 +89 -2.918 +90 -3.042 +1 1.918 +2 2.021 +3 2.109 +4 2.185 +5 2.249 +6 2.301 +7 2.341 +8 2.371 +9 2.391 +10 2.401 +11 2.403 +12 2.396 +13 2.380 +14 2.358 +15 2.328 +16 2.292 +17 2.249 +18 2.201 +19 2.148 +20 2.089 +21 2.027 +22 1.960 +23 1.890 +24 1.816 +25 1.739 +26 1.660 +27 1.578 +28 1.494 +29 1.409 +30 1.322 +31 1.234 +32 1.145 +33 1.055 +34 0.965 +35 0.875 +36 0.785 +37 0.695 +38 0.605 +39 0.516 +40 0.428 +41 0.340 +42 0.253 +43 0.168 +44 0.083 +45 -0.000 +46 -0.082 +47 -0.162 +48 -0.241 +49 -0.319 +50 -0.395 +51 -0.469 +52 -0.542 +53 -0.613 +54 -0.683 +55 -0.752 +56 -0.819 +57 -0.885 +58 -0.949 +59 -1.012 +60 -1.075 +61 -1.136 +62 -1.197 +63 -1.256 +64 -1.316 +65 -1.375 +66 -1.433 +67 -1.492 +68 -1.551 +69 -1.611 +70 -1.671 +71 -1.732 +72 -1.794 +73 -1.858 +74 -1.924 +75 -1.991 +76 -2.061 +77 -2.134 +78 -2.210 +79 -2.289 +80 -2.371 +81 -2.458 +82 -2.549 +83 -2.646 +84 -2.747 +85 -2.854 +86 -2.968 +87 -3.088 +88 -3.215 +89 -3.349 +90 -3.492 +1 2.422 +2 2.525 +3 2.613 +4 2.687 +5 2.747 +6 2.794 +7 2.829 +8 2.853 +9 2.865 +10 2.867 +11 2.859 +12 2.841 +13 2.815 +14 2.781 +15 2.739 +16 2.690 +17 2.635 +18 2.573 +19 2.506 +20 2.434 +21 2.357 +22 2.275 +23 2.190 +24 2.101 +25 2.009 +26 1.915 +27 1.818 +28 1.719 +29 1.619 +30 1.517 +31 1.414 +32 1.311 +33 1.206 +34 1.102 +35 0.998 +36 0.894 +37 0.790 +38 0.687 +39 0.585 +40 0.484 +41 0.385 +42 0.286 +43 0.189 +44 0.094 +45 -0.000 +46 -0.092 +47 -0.182 +48 -0.270 +49 -0.357 +50 -0.441 +51 -0.523 +52 -0.604 +53 -0.682 +54 -0.758 +55 -0.833 +56 -0.906 +57 -0.977 +58 -1.046 +59 -1.114 +60 -1.180 +61 -1.245 +62 -1.309 +63 -1.372 +64 -1.433 +65 -1.495 +66 -1.556 +67 -1.616 +68 -1.677 +69 -1.738 +70 -1.799 +71 -1.861 +72 -1.924 +73 -1.989 +74 -2.055 +75 -2.124 +76 -2.194 +77 -2.268 +78 -2.344 +79 -2.425 +80 -2.509 +81 -2.597 +82 -2.690 +83 -2.788 +84 -2.892 +85 -3.003 +86 -3.120 +87 -3.244 +88 -3.375 +89 -3.515 +90 -3.664 +1 2.627 +2 2.736 +3 2.829 +4 2.907 +5 2.970 +6 3.019 +7 3.056 +8 3.079 +9 3.091 +10 3.092 +11 3.083 +12 3.063 +13 3.034 +14 2.997 +15 2.951 +16 2.897 +17 2.837 +18 2.770 +19 2.697 +20 2.619 +21 2.536 +22 2.448 +23 2.355 +24 2.260 +25 2.161 +26 2.059 +27 1.954 +28 1.848 +29 1.740 +30 1.630 +31 1.519 +32 1.408 +33 1.296 +34 1.184 +35 1.071 +36 0.960 +37 0.848 +38 0.738 +39 0.628 +40 0.520 +41 0.413 +42 0.307 +43 0.203 +44 0.101 +45 -0.000 +46 -0.099 +47 -0.195 +48 -0.290 +49 -0.382 +50 -0.472 +51 -0.561 +52 -0.647 +53 -0.730 +54 -0.812 +55 -0.892 +56 -0.970 +57 -1.045 +58 -1.119 +59 -1.192 +60 -1.262 +61 -1.331 +62 -1.399 +63 -1.466 +64 -1.532 +65 -1.597 +66 -1.662 +67 -1.726 +68 -1.790 +69 -1.855 +70 -1.920 +71 -1.986 +72 -2.053 +73 -2.121 +74 -2.192 +75 -2.264 +76 -2.339 +77 -2.417 +78 -2.498 +79 -2.582 +80 -2.671 +81 -2.765 +82 -2.864 +83 -2.968 +84 -3.078 +85 -3.195 +86 -3.319 +87 -3.451 +88 -3.590 +89 -3.739 +90 -3.897 +1 2.405 +2 2.505 +3 2.591 +4 2.663 +5 2.721 +6 2.767 +7 2.800 +8 2.822 +9 2.833 +10 2.834 +11 2.825 +12 2.808 +13 2.781 +14 2.747 +15 2.705 +16 2.656 +17 2.601 +18 2.540 +19 2.473 +20 2.401 +21 2.325 +22 2.244 +23 2.160 +24 2.072 +25 1.981 +26 1.888 +27 1.792 +28 1.695 +29 1.596 +30 1.495 +31 1.393 +32 1.291 +33 1.189 +34 1.086 +35 0.983 +36 0.880 +37 0.778 +38 0.677 +39 0.576 +40 0.477 +41 0.379 +42 0.282 +43 0.186 +44 0.092 +45 -0.000 +46 -0.090 +47 -0.179 +48 -0.266 +49 -0.351 +50 -0.433 +51 -0.514 +52 -0.593 +53 -0.670 +54 -0.745 +55 -0.818 +56 -0.890 +57 -0.959 +58 -1.027 +59 -1.094 +60 -1.158 +61 -1.222 +62 -1.284 +63 -1.346 +64 -1.406 +65 -1.466 +66 -1.526 +67 -1.585 +68 -1.644 +69 -1.703 +70 -1.763 +71 -1.824 +72 -1.885 +73 -1.948 +74 -2.013 +75 -2.079 +76 -2.148 +77 -2.220 +78 -2.294 +79 -2.372 +80 -2.454 +81 -2.540 +82 -2.631 +83 -2.727 +84 -2.828 +85 -2.936 +86 -3.050 +87 -3.171 +88 -3.299 +89 -3.436 +90 -3.581 +1 1.941 +2 2.036 +3 2.117 +4 2.186 +5 2.243 +6 2.289 +7 2.324 +8 2.349 +9 2.365 +10 2.371 +11 2.369 +12 2.359 +13 2.341 +14 2.316 +15 2.285 +16 2.247 +17 2.203 +18 2.154 +19 2.100 +20 2.042 +21 1.979 +22 1.913 +23 1.843 +24 1.770 +25 1.694 +26 1.616 +27 1.535 +28 1.453 +29 1.369 +30 1.284 +31 1.198 +32 1.111 +33 1.024 +34 0.936 +35 0.848 +36 0.760 +37 0.673 +38 0.585 +39 0.499 +40 0.413 +41 0.328 +42 0.244 +43 0.162 +44 0.080 +45 -0.000 +46 -0.079 +47 -0.156 +48 -0.232 +49 -0.307 +50 -0.379 +51 -0.451 +52 -0.520 +53 -0.589 +54 -0.655 +55 -0.720 +56 -0.784 +57 -0.847 +58 -0.908 +59 -0.968 +60 -1.026 +61 -1.084 +62 -1.141 +63 -1.197 +64 -1.253 +65 -1.308 +66 -1.363 +67 -1.418 +68 -1.473 +69 -1.528 +70 -1.584 +71 -1.641 +72 -1.698 +73 -1.758 +74 -1.818 +75 -1.881 +76 -1.946 +77 -2.013 +78 -2.083 +79 -2.156 +80 -2.233 +81 -2.313 +82 -2.398 +83 -2.487 +84 -2.581 +85 -2.681 +86 -2.787 +87 -2.898 +88 -3.017 +89 -3.143 +90 -3.276 +1 1.609 +2 1.695 +3 1.768 +4 1.831 +5 1.884 +6 1.927 +7 1.960 +8 1.985 +9 2.001 +10 2.010 +11 2.010 +12 2.004 +13 1.991 +14 1.972 +15 1.947 +16 1.916 +17 1.881 +18 1.840 +19 1.796 +20 1.747 +21 1.694 +22 1.639 +23 1.580 +24 1.518 +25 1.454 +26 1.387 +27 1.319 +28 1.249 +29 1.178 +30 1.105 +31 1.031 +32 0.957 +33 0.882 +34 0.807 +35 0.732 +36 0.656 +37 0.581 +38 0.506 +39 0.431 +40 0.357 +41 0.284 +42 0.212 +43 0.140 +44 0.070 +45 -0.000 +46 -0.068 +47 -0.136 +48 -0.202 +49 -0.266 +50 -0.330 +51 -0.392 +52 -0.453 +53 -0.513 +54 -0.571 +55 -0.629 +56 -0.685 +57 -0.740 +58 -0.794 +59 -0.846 +60 -0.899 +61 -0.950 +62 -1.000 +63 -1.050 +64 -1.100 +65 -1.149 +66 -1.198 +67 -1.248 +68 -1.297 +69 -1.347 +70 -1.397 +71 -1.448 +72 -1.500 +73 -1.553 +74 -1.608 +75 -1.665 +76 -1.723 +77 -1.784 +78 -1.847 +79 -1.913 +80 -1.982 +81 -2.054 +82 -2.130 +83 -2.210 +84 -2.295 +85 -2.384 +86 -2.479 +87 -2.579 +88 -2.685 +89 -2.797 +90 -2.916 +1 1.692 +2 1.780 +3 1.856 +4 1.921 +5 1.975 +6 2.019 +7 2.053 +8 2.078 +9 2.094 +10 2.103 +11 2.103 +12 2.096 +13 2.082 +14 2.061 +15 2.034 +16 2.002 +17 1.965 +18 1.922 +19 1.875 +20 1.824 +21 1.769 +22 1.710 +23 1.648 +24 1.584 +25 1.517 +26 1.447 +27 1.376 +28 1.302 +29 1.228 +30 1.152 +31 1.075 +32 0.998 +33 0.919 +34 0.841 +35 0.762 +36 0.683 +37 0.605 +38 0.527 +39 0.449 +40 0.372 +41 0.296 +42 0.220 +43 0.146 +44 0.072 +45 -0.000 +46 -0.071 +47 -0.141 +48 -0.210 +49 -0.277 +50 -0.343 +51 -0.408 +52 -0.471 +53 -0.533 +54 -0.594 +55 -0.653 +56 -0.711 +57 -0.768 +58 -0.824 +59 -0.879 +60 -0.932 +61 -0.985 +62 -1.038 +63 -1.089 +64 -1.141 +65 -1.192 +66 -1.242 +67 -1.293 +68 -1.344 +69 -1.395 +70 -1.447 +71 -1.500 +72 -1.553 +73 -1.608 +74 -1.665 +75 -1.723 +76 -1.783 +77 -1.845 +78 -1.910 +79 -1.978 +80 -2.049 +81 -2.124 +82 -2.203 +83 -2.285 +84 -2.373 +85 -2.465 +86 -2.562 +87 -2.666 +88 -2.775 +89 -2.891 +90 -3.014 +1 1.783 +2 1.874 +3 1.952 +4 2.019 +5 2.074 +6 2.119 +7 2.154 +8 2.179 +9 2.195 +10 2.203 +11 2.202 +12 2.194 +13 2.179 +14 2.157 +15 2.128 +16 2.094 +17 2.054 +18 2.009 +19 1.960 +20 1.906 +21 1.848 +22 1.786 +23 1.722 +24 1.654 +25 1.583 +26 1.511 +27 1.436 +28 1.359 +29 1.281 +30 1.202 +31 1.122 +32 1.041 +33 0.959 +34 0.877 +35 0.795 +36 0.713 +37 0.631 +38 0.549 +39 0.468 +40 0.388 +41 0.308 +42 0.230 +43 0.152 +44 0.075 +45 -0.000 +46 -0.074 +47 -0.147 +48 -0.218 +49 -0.288 +50 -0.357 +51 -0.424 +52 -0.490 +53 -0.554 +54 -0.617 +55 -0.679 +56 -0.739 +57 -0.798 +58 -0.856 +59 -0.913 +60 -0.969 +61 -1.024 +62 -1.078 +63 -1.131 +64 -1.184 +65 -1.237 +66 -1.290 +67 -1.342 +68 -1.395 +69 -1.447 +70 -1.501 +71 -1.555 +72 -1.611 +73 -1.667 +74 -1.726 +75 -1.786 +76 -1.848 +77 -1.912 +78 -1.979 +79 -2.049 +80 -2.123 +81 -2.200 +82 -2.281 +83 -2.366 +84 -2.457 +85 -2.552 +86 -2.653 +87 -2.760 +88 -2.873 +89 -2.993 +90 -3.120 +1 1.911 +2 2.007 +3 2.089 +4 2.160 +5 2.218 +6 2.265 +7 2.302 +8 2.328 +9 2.344 +10 2.352 +11 2.351 +12 2.342 +13 2.325 +14 2.301 +15 2.270 +16 2.233 +17 2.190 +18 2.142 +19 2.089 +20 2.032 +21 1.970 +22 1.904 +23 1.835 +24 1.762 +25 1.687 +26 1.609 +27 1.530 +28 1.448 +29 1.365 +30 1.280 +31 1.194 +32 1.108 +33 1.021 +34 0.933 +35 0.846 +36 0.758 +37 0.671 +38 0.584 +39 0.498 +40 0.413 +41 0.328 +42 0.244 +43 0.162 +44 0.080 +45 -0.000 +46 -0.079 +47 -0.156 +48 -0.232 +49 -0.307 +50 -0.379 +51 -0.451 +52 -0.521 +53 -0.589 +54 -0.656 +55 -0.721 +56 -0.785 +57 -0.848 +58 -0.909 +59 -0.969 +60 -1.029 +61 -1.087 +62 -1.144 +63 -1.201 +64 -1.257 +65 -1.312 +66 -1.368 +67 -1.423 +68 -1.479 +69 -1.534 +70 -1.591 +71 -1.648 +72 -1.707 +73 -1.767 +74 -1.828 +75 -1.891 +76 -1.957 +77 -2.025 +78 -2.096 +79 -2.170 +80 -2.247 +81 -2.329 +82 -2.414 +83 -2.504 +84 -2.600 +85 -2.701 +86 -2.807 +87 -2.920 +88 -3.040 +89 -3.166 +90 -3.301 +1 1.659 +2 1.749 +3 1.828 +4 1.895 +5 1.951 +6 1.997 +7 2.033 +8 2.060 +9 2.078 +10 2.087 +11 2.089 +12 2.083 +13 2.070 +14 2.051 +15 2.026 +16 1.994 +17 1.958 +18 1.916 +19 1.870 +20 1.820 +21 1.765 +22 1.708 +23 1.646 +24 1.582 +25 1.516 +26 1.447 +27 1.376 +28 1.303 +29 1.229 +30 1.153 +31 1.076 +32 0.999 +33 0.921 +34 0.842 +35 0.764 +36 0.685 +37 0.607 +38 0.528 +39 0.451 +40 0.373 +41 0.297 +42 0.221 +43 0.146 +44 0.073 +45 -0.000 +46 -0.072 +47 -0.142 +48 -0.211 +49 -0.279 +50 -0.345 +51 -0.410 +52 -0.474 +53 -0.537 +54 -0.598 +55 -0.658 +56 -0.717 +57 -0.775 +58 -0.831 +59 -0.887 +60 -0.942 +61 -0.995 +62 -1.049 +63 -1.101 +64 -1.154 +65 -1.206 +66 -1.257 +67 -1.309 +68 -1.361 +69 -1.414 +70 -1.467 +71 -1.521 +72 -1.576 +73 -1.632 +74 -1.690 +75 -1.750 +76 -1.812 +77 -1.876 +78 -1.943 +79 -2.012 +80 -2.085 +81 -2.162 +82 -2.242 +83 -2.327 +84 -2.417 +85 -2.511 +86 -2.611 +87 -2.717 +88 -2.829 +89 -2.947 +90 -3.073 +1 1.526 +2 1.617 +3 1.697 +4 1.765 +5 1.823 +6 1.871 +7 1.909 +8 1.938 +9 1.959 +10 1.971 +11 1.976 +12 1.973 +13 1.963 +14 1.947 +15 1.925 +16 1.898 +17 1.865 +18 1.827 +19 1.784 +20 1.737 +21 1.687 +22 1.633 +23 1.575 +24 1.515 +25 1.452 +26 1.387 +27 1.320 +28 1.251 +29 1.180 +30 1.108 +31 1.035 +32 0.961 +33 0.886 +34 0.811 +35 0.736 +36 0.661 +37 0.585 +38 0.510 +39 0.435 +40 0.361 +41 0.287 +42 0.214 +43 0.142 +44 0.070 +45 -0.000 +46 -0.069 +47 -0.138 +48 -0.205 +49 -0.271 +50 -0.336 +51 -0.399 +52 -0.462 +53 -0.523 +54 -0.583 +55 -0.642 +56 -0.700 +57 -0.756 +58 -0.812 +59 -0.867 +60 -0.922 +61 -0.975 +62 -1.028 +63 -1.080 +64 -1.133 +65 -1.184 +66 -1.236 +67 -1.288 +68 -1.341 +69 -1.394 +70 -1.447 +71 -1.501 +72 -1.557 +73 -1.614 +74 -1.672 +75 -1.732 +76 -1.795 +77 -1.859 +78 -1.927 +79 -1.997 +80 -2.071 +81 -2.148 +82 -2.229 +83 -2.314 +84 -2.404 +85 -2.499 +86 -2.599 +87 -2.705 +88 -2.817 +89 -2.936 +90 -3.061 +1 1.372 +2 1.459 +3 1.534 +4 1.600 +5 1.655 +6 1.701 +7 1.738 +8 1.767 +9 1.787 +10 1.800 +11 1.806 +12 1.805 +13 1.798 +14 1.784 +15 1.765 +16 1.741 +17 1.711 +18 1.677 +19 1.639 +20 1.597 +21 1.551 +22 1.502 +23 1.450 +24 1.395 +25 1.337 +26 1.278 +27 1.216 +28 1.153 +29 1.088 +30 1.022 +31 0.955 +32 0.887 +33 0.818 +34 0.749 +35 0.680 +36 0.610 +37 0.541 +38 0.472 +39 0.402 +40 0.334 +41 0.266 +42 0.198 +43 0.131 +44 0.065 +45 -0.000 +46 -0.064 +47 -0.128 +48 -0.190 +49 -0.251 +50 -0.311 +51 -0.371 +52 -0.429 +53 -0.486 +54 -0.542 +55 -0.597 +56 -0.651 +57 -0.704 +58 -0.756 +59 -0.808 +60 -0.859 +61 -0.909 +62 -0.959 +63 -1.008 +64 -1.057 +65 -1.106 +66 -1.155 +67 -1.204 +68 -1.253 +69 -1.303 +70 -1.354 +71 -1.405 +72 -1.458 +73 -1.512 +74 -1.567 +75 -1.624 +76 -1.683 +77 -1.745 +78 -1.808 +79 -1.875 +80 -1.945 +81 -2.018 +82 -2.094 +83 -2.175 +84 -2.260 +85 -2.349 +86 -2.444 +87 -2.544 +88 -2.649 +89 -2.761 +90 -2.879 +1 1.474 +2 1.562 +3 1.638 +4 1.704 +5 1.760 +6 1.806 +7 1.843 +8 1.871 +9 1.890 +10 1.902 +11 1.906 +12 1.904 +13 1.894 +14 1.879 +15 1.857 +16 1.830 +17 1.798 +18 1.762 +19 1.721 +20 1.676 +21 1.627 +22 1.574 +23 1.519 +24 1.461 +25 1.400 +26 1.337 +27 1.272 +28 1.206 +29 1.137 +30 1.068 +31 0.998 +32 0.926 +33 0.854 +34 0.782 +35 0.709 +36 0.637 +37 0.564 +38 0.491 +39 0.419 +40 0.348 +41 0.277 +42 0.206 +43 0.137 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.133 +48 -0.197 +49 -0.261 +50 -0.323 +51 -0.384 +52 -0.444 +53 -0.503 +54 -0.561 +55 -0.618 +56 -0.673 +57 -0.728 +58 -0.782 +59 -0.834 +60 -0.887 +61 -0.938 +62 -0.989 +63 -1.039 +64 -1.089 +65 -1.139 +66 -1.189 +67 -1.239 +68 -1.289 +69 -1.340 +70 -1.391 +71 -1.443 +72 -1.496 +73 -1.551 +74 -1.607 +75 -1.665 +76 -1.725 +77 -1.787 +78 -1.852 +79 -1.919 +80 -1.990 +81 -2.064 +82 -2.142 +83 -2.224 +84 -2.310 +85 -2.401 +86 -2.498 +87 -2.600 +88 -2.707 +89 -2.821 +90 -2.942 +1 1.596 +2 1.683 +3 1.759 +4 1.824 +5 1.878 +6 1.922 +7 1.957 +8 1.983 +9 2.000 +10 2.010 +11 2.011 +12 2.006 +13 1.994 +14 1.975 +15 1.951 +16 1.920 +17 1.885 +18 1.845 +19 1.801 +20 1.752 +21 1.700 +22 1.644 +23 1.585 +24 1.524 +25 1.459 +26 1.393 +27 1.325 +28 1.254 +29 1.183 +30 1.110 +31 1.036 +32 0.962 +33 0.886 +34 0.811 +35 0.735 +36 0.659 +37 0.584 +38 0.509 +39 0.434 +40 0.359 +41 0.286 +42 0.213 +43 0.141 +44 0.070 +45 -0.000 +46 -0.069 +47 -0.136 +48 -0.203 +49 -0.268 +50 -0.332 +51 -0.395 +52 -0.456 +53 -0.516 +54 -0.575 +55 -0.633 +56 -0.689 +57 -0.745 +58 -0.799 +59 -0.853 +60 -0.905 +61 -0.957 +62 -1.008 +63 -1.059 +64 -1.109 +65 -1.159 +66 -1.209 +67 -1.258 +68 -1.309 +69 -1.359 +70 -1.410 +71 -1.462 +72 -1.515 +73 -1.569 +74 -1.625 +75 -1.682 +76 -1.741 +77 -1.803 +78 -1.867 +79 -1.934 +80 -2.005 +81 -2.078 +82 -2.156 +83 -2.238 +84 -2.324 +85 -2.415 +86 -2.511 +87 -2.613 +88 -2.721 +89 -2.835 +90 -2.956 +1 1.644 +2 1.724 +3 1.793 +4 1.852 +5 1.900 +6 1.939 +7 1.969 +8 1.990 +9 2.003 +10 2.009 +11 2.007 +12 1.998 +13 1.983 +14 1.962 +15 1.935 +16 1.903 +17 1.866 +18 1.825 +19 1.779 +20 1.729 +21 1.676 +22 1.620 +23 1.560 +24 1.499 +25 1.434 +26 1.368 +27 1.300 +28 1.230 +29 1.159 +30 1.087 +31 1.014 +32 0.940 +33 0.866 +34 0.792 +35 0.718 +36 0.643 +37 0.569 +38 0.495 +39 0.422 +40 0.350 +41 0.278 +42 0.207 +43 0.137 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.132 +48 -0.196 +49 -0.259 +50 -0.321 +51 -0.381 +52 -0.440 +53 -0.497 +54 -0.554 +55 -0.609 +56 -0.663 +57 -0.715 +58 -0.767 +59 -0.817 +60 -0.867 +61 -0.915 +62 -0.963 +63 -1.011 +64 -1.058 +65 -1.104 +66 -1.151 +67 -1.197 +68 -1.243 +69 -1.290 +70 -1.337 +71 -1.385 +72 -1.434 +73 -1.483 +74 -1.535 +75 -1.588 +76 -1.642 +77 -1.699 +78 -1.758 +79 -1.820 +80 -1.885 +81 -1.953 +82 -2.025 +83 -2.101 +84 -2.181 +85 -2.265 +86 -2.355 +87 -2.450 +88 -2.550 +89 -2.657 +90 -2.770 +1 1.200 +2 1.256 +3 1.303 +4 1.344 +5 1.377 +6 1.403 +7 1.424 +8 1.438 +9 1.446 +10 1.449 +11 1.446 +12 1.439 +13 1.427 +14 1.411 +15 1.391 +16 1.367 +17 1.340 +18 1.310 +19 1.276 +20 1.240 +21 1.202 +22 1.161 +23 1.118 +24 1.073 +25 1.027 +26 0.979 +27 0.930 +28 0.880 +29 0.829 +30 0.777 +31 0.725 +32 0.672 +33 0.619 +34 0.565 +35 0.512 +36 0.459 +37 0.406 +38 0.353 +39 0.301 +40 0.249 +41 0.198 +42 0.147 +43 0.097 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.094 +48 -0.140 +49 -0.184 +50 -0.228 +51 -0.270 +52 -0.312 +53 -0.353 +54 -0.393 +55 -0.432 +56 -0.470 +57 -0.507 +58 -0.543 +59 -0.579 +60 -0.613 +61 -0.648 +62 -0.681 +63 -0.714 +64 -0.747 +65 -0.780 +66 -0.812 +67 -0.844 +68 -0.877 +69 -0.909 +70 -0.942 +71 -0.975 +72 -1.009 +73 -1.044 +74 -1.080 +75 -1.116 +76 -1.154 +77 -1.194 +78 -1.235 +79 -1.278 +80 -1.323 +81 -1.371 +82 -1.421 +83 -1.474 +84 -1.529 +85 -1.589 +86 -1.651 +87 -1.717 +88 -1.788 +89 -1.863 +90 -1.942 +1 0.754 +2 0.785 +3 0.812 +4 0.835 +5 0.853 +6 0.867 +7 0.878 +8 0.885 +9 0.888 +10 0.889 +11 0.886 +12 0.880 +13 0.872 +14 0.861 +15 0.848 +16 0.833 +17 0.815 +18 0.796 +19 0.775 +20 0.752 +21 0.728 +22 0.703 +23 0.677 +24 0.649 +25 0.621 +26 0.591 +27 0.561 +28 0.531 +29 0.500 +30 0.468 +31 0.436 +32 0.404 +33 0.372 +34 0.340 +35 0.307 +36 0.275 +37 0.243 +38 0.212 +39 0.180 +40 0.149 +41 0.118 +42 0.088 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.083 +49 -0.110 +50 -0.135 +51 -0.161 +52 -0.185 +53 -0.209 +54 -0.233 +55 -0.255 +56 -0.278 +57 -0.299 +58 -0.320 +59 -0.341 +60 -0.361 +61 -0.381 +62 -0.401 +63 -0.420 +64 -0.439 +65 -0.457 +66 -0.476 +67 -0.494 +68 -0.513 +69 -0.531 +70 -0.550 +71 -0.569 +72 -0.588 +73 -0.608 +74 -0.628 +75 -0.649 +76 -0.671 +77 -0.693 +78 -0.717 +79 -0.741 +80 -0.767 +81 -0.794 +82 -0.823 +83 -0.853 +84 -0.885 +85 -0.919 +86 -0.956 +87 -0.994 +88 -1.035 +89 -1.078 +90 -1.124 +1 0.228 +2 0.231 +3 0.233 +4 0.235 +5 0.236 +6 0.236 +7 0.235 +8 0.234 +9 0.232 +10 0.230 +11 0.226 +12 0.223 +13 0.219 +14 0.214 +15 0.209 +16 0.204 +17 0.198 +18 0.192 +19 0.186 +20 0.179 +21 0.172 +22 0.165 +23 0.158 +24 0.151 +25 0.143 +26 0.136 +27 0.128 +28 0.120 +29 0.113 +30 0.105 +31 0.097 +32 0.090 +33 0.082 +34 0.075 +35 0.067 +36 0.060 +37 0.053 +38 0.045 +39 0.038 +40 0.032 +41 0.025 +42 0.018 +43 0.012 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.011 +48 -0.017 +49 -0.022 +50 -0.027 +51 -0.032 +52 -0.036 +53 -0.041 +54 -0.045 +55 -0.049 +56 -0.052 +57 -0.056 +58 -0.059 +59 -0.063 +60 -0.066 +61 -0.069 +62 -0.071 +63 -0.074 +64 -0.077 +65 -0.079 +66 -0.081 +67 -0.084 +68 -0.086 +69 -0.088 +70 -0.090 +71 -0.092 +72 -0.094 +73 -0.096 +74 -0.099 +75 -0.101 +76 -0.103 +77 -0.106 +78 -0.108 +79 -0.111 +80 -0.114 +81 -0.118 +82 -0.121 +83 -0.125 +84 -0.129 +85 -0.134 +86 -0.139 +87 -0.144 +88 -0.150 +89 -0.156 +90 -0.163 +1 -0.218 +2 -0.243 +3 -0.266 +4 -0.286 +5 -0.303 +6 -0.318 +7 -0.331 +8 -0.342 +9 -0.351 +10 -0.358 +11 -0.363 +12 -0.366 +13 -0.368 +14 -0.368 +15 -0.367 +16 -0.365 +17 -0.361 +18 -0.356 +19 -0.350 +20 -0.343 +21 -0.335 +22 -0.326 +23 -0.316 +24 -0.305 +25 -0.294 +26 -0.282 +27 -0.269 +28 -0.256 +29 -0.243 +30 -0.229 +31 -0.215 +32 -0.200 +33 -0.185 +34 -0.170 +35 -0.155 +36 -0.140 +37 -0.124 +38 -0.109 +39 -0.093 +40 -0.077 +41 -0.062 +42 -0.046 +43 -0.031 +44 -0.015 +45 0.000 +46 0.015 +47 0.030 +48 0.045 +49 0.060 +50 0.075 +51 0.089 +52 0.104 +53 0.118 +54 0.132 +55 0.146 +56 0.160 +57 0.174 +58 0.187 +59 0.201 +60 0.214 +61 0.228 +62 0.241 +63 0.255 +64 0.268 +65 0.281 +66 0.295 +67 0.309 +68 0.323 +69 0.337 +70 0.351 +71 0.366 +72 0.381 +73 0.396 +74 0.412 +75 0.428 +76 0.445 +77 0.462 +78 0.480 +79 0.499 +80 0.519 +81 0.539 +82 0.560 +83 0.583 +84 0.606 +85 0.631 +86 0.657 +87 0.684 +88 0.712 +89 0.742 +90 0.774 +1 -0.612 +2 -0.661 +3 -0.705 +4 -0.743 +5 -0.776 +6 -0.804 +7 -0.827 +8 -0.846 +9 -0.860 +10 -0.871 +11 -0.877 +12 -0.880 +13 -0.880 +14 -0.876 +15 -0.869 +16 -0.860 +17 -0.848 +18 -0.833 +19 -0.816 +20 -0.796 +21 -0.775 +22 -0.752 +23 -0.727 +24 -0.701 +25 -0.674 +26 -0.645 +27 -0.615 +28 -0.584 +29 -0.552 +30 -0.519 +31 -0.486 +32 -0.452 +33 -0.418 +34 -0.383 +35 -0.348 +36 -0.313 +37 -0.278 +38 -0.242 +39 -0.207 +40 -0.172 +41 -0.137 +42 -0.102 +43 -0.068 +44 -0.034 +45 0.000 +46 0.033 +47 0.066 +48 0.099 +49 0.131 +50 0.163 +51 0.194 +52 0.225 +53 0.255 +54 0.285 +55 0.315 +56 0.344 +57 0.373 +58 0.401 +59 0.429 +60 0.457 +61 0.485 +62 0.512 +63 0.539 +64 0.567 +65 0.594 +66 0.621 +67 0.649 +68 0.676 +69 0.704 +70 0.733 +71 0.762 +72 0.792 +73 0.822 +74 0.853 +75 0.886 +76 0.919 +77 0.954 +78 0.990 +79 1.027 +80 1.066 +81 1.107 +82 1.150 +83 1.195 +84 1.242 +85 1.292 +86 1.344 +87 1.400 +88 1.458 +89 1.519 +90 1.584 +1 -1.003 +2 -1.078 +3 -1.143 +4 -1.200 +5 -1.249 +6 -1.290 +7 -1.324 +8 -1.351 +9 -1.372 +10 -1.386 +11 -1.394 +12 -1.397 +13 -1.395 +14 -1.387 +15 -1.375 +16 -1.358 +17 -1.338 +18 -1.313 +19 -1.285 +20 -1.254 +21 -1.220 +22 -1.182 +23 -1.143 +24 -1.101 +25 -1.057 +26 -1.011 +27 -0.963 +28 -0.914 +29 -0.864 +30 -0.812 +31 -0.759 +32 -0.706 +33 -0.652 +34 -0.598 +35 -0.543 +36 -0.488 +37 -0.433 +38 -0.378 +39 -0.323 +40 -0.268 +41 -0.213 +42 -0.159 +43 -0.106 +44 -0.053 +45 0.000 +46 0.052 +47 0.103 +48 0.154 +49 0.203 +50 0.252 +51 0.301 +52 0.348 +53 0.395 +54 0.441 +55 0.486 +56 0.531 +57 0.575 +58 0.619 +59 0.661 +60 0.704 +61 0.746 +62 0.788 +63 0.829 +64 0.871 +65 0.912 +66 0.954 +67 0.995 +68 1.037 +69 1.080 +70 1.123 +71 1.167 +72 1.212 +73 1.258 +74 1.305 +75 1.354 +76 1.404 +77 1.457 +78 1.511 +79 1.568 +80 1.627 +81 1.689 +82 1.755 +83 1.823 +84 1.895 +85 1.971 +86 2.050 +87 2.134 +88 2.223 +89 2.317 +90 2.416 +1 -1.331 +2 -1.414 +3 -1.487 +4 -1.550 +5 -1.603 +6 -1.647 +7 -1.683 +8 -1.710 +9 -1.730 +10 -1.742 +11 -1.748 +12 -1.747 +13 -1.739 +14 -1.726 +15 -1.707 +16 -1.683 +17 -1.655 +18 -1.622 +19 -1.585 +20 -1.544 +21 -1.500 +22 -1.452 +23 -1.402 +24 -1.348 +25 -1.293 +26 -1.235 +27 -1.176 +28 -1.115 +29 -1.052 +30 -0.988 +31 -0.923 +32 -0.857 +33 -0.791 +34 -0.724 +35 -0.657 +36 -0.590 +37 -0.523 +38 -0.456 +39 -0.389 +40 -0.323 +41 -0.257 +42 -0.191 +43 -0.127 +44 -0.063 +45 0.000 +46 0.062 +47 0.123 +48 0.184 +49 0.243 +50 0.301 +51 0.358 +52 0.414 +53 0.469 +54 0.523 +55 0.577 +56 0.629 +57 0.680 +58 0.730 +59 0.780 +60 0.829 +61 0.878 +62 0.926 +63 0.973 +64 1.020 +65 1.067 +66 1.115 +67 1.162 +68 1.209 +69 1.257 +70 1.306 +71 1.355 +72 1.406 +73 1.458 +74 1.511 +75 1.565 +76 1.622 +77 1.681 +78 1.742 +79 1.806 +80 1.873 +81 1.943 +82 2.016 +83 2.093 +84 2.175 +85 2.261 +86 2.351 +87 2.447 +88 2.548 +89 2.655 +90 2.768 +1 -1.532 +2 -1.618 +3 -1.693 +4 -1.757 +5 -1.811 +6 -1.855 +7 -1.890 +8 -1.917 +9 -1.935 +10 -1.945 +11 -1.947 +12 -1.943 +13 -1.932 +14 -1.915 +15 -1.892 +16 -1.863 +17 -1.830 +18 -1.791 +19 -1.749 +20 -1.702 +21 -1.652 +22 -1.598 +23 -1.541 +24 -1.482 +25 -1.420 +26 -1.355 +27 -1.289 +28 -1.221 +29 -1.152 +30 -1.081 +31 -1.009 +32 -0.937 +33 -0.864 +34 -0.790 +35 -0.717 +36 -0.643 +37 -0.570 +38 -0.496 +39 -0.423 +40 -0.351 +41 -0.279 +42 -0.208 +43 -0.138 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.262 +50 0.325 +51 0.386 +52 0.447 +53 0.506 +54 0.563 +55 0.620 +56 0.676 +57 0.730 +58 0.784 +59 0.836 +60 0.888 +61 0.939 +62 0.990 +63 1.040 +64 1.089 +65 1.139 +66 1.188 +67 1.237 +68 1.287 +69 1.336 +70 1.387 +71 1.438 +72 1.491 +73 1.544 +74 1.599 +75 1.656 +76 1.715 +77 1.776 +78 1.839 +79 1.906 +80 1.975 +81 2.048 +82 2.124 +83 2.205 +84 2.290 +85 2.380 +86 2.474 +87 2.575 +88 2.681 +89 2.793 +90 2.912 +1 -1.625 +2 -1.711 +3 -1.787 +4 -1.851 +5 -1.905 +6 -1.949 +7 -1.983 +8 -2.009 +9 -2.026 +10 -2.034 +11 -2.035 +12 -2.029 +13 -2.016 +14 -1.997 +15 -1.972 +16 -1.941 +17 -1.905 +18 -1.865 +19 -1.819 +20 -1.770 +21 -1.717 +22 -1.660 +23 -1.601 +24 -1.538 +25 -1.473 +26 -1.406 +27 -1.337 +28 -1.266 +29 -1.194 +30 -1.120 +31 -1.045 +32 -0.970 +33 -0.894 +34 -0.818 +35 -0.742 +36 -0.665 +37 -0.589 +38 -0.513 +39 -0.437 +40 -0.362 +41 -0.288 +42 -0.215 +43 -0.142 +44 -0.070 +45 0.000 +46 0.069 +47 0.138 +48 0.204 +49 0.270 +50 0.334 +51 0.398 +52 0.459 +53 0.520 +54 0.579 +55 0.637 +56 0.694 +57 0.750 +58 0.804 +59 0.858 +60 0.911 +61 0.963 +62 1.014 +63 1.065 +64 1.115 +65 1.165 +66 1.215 +67 1.265 +68 1.315 +69 1.366 +70 1.417 +71 1.469 +72 1.522 +73 1.576 +74 1.632 +75 1.689 +76 1.749 +77 1.810 +78 1.874 +79 1.942 +80 2.012 +81 2.086 +82 2.163 +83 2.245 +84 2.331 +85 2.422 +86 2.519 +87 2.620 +88 2.728 +89 2.843 +90 2.964 +1 -1.619 +2 -1.713 +3 -1.794 +4 -1.863 +5 -1.922 +6 -1.970 +7 -2.009 +8 -2.037 +9 -2.057 +10 -2.069 +11 -2.072 +12 -2.068 +13 -2.057 +14 -2.039 +15 -2.015 +16 -1.985 +17 -1.950 +18 -1.909 +19 -1.864 +20 -1.815 +21 -1.761 +22 -1.704 +23 -1.644 +24 -1.581 +25 -1.515 +26 -1.446 +27 -1.376 +28 -1.303 +29 -1.229 +30 -1.154 +31 -1.078 +32 -1.000 +33 -0.922 +34 -0.844 +35 -0.766 +36 -0.687 +37 -0.608 +38 -0.530 +39 -0.452 +40 -0.375 +41 -0.298 +42 -0.222 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.143 +48 0.212 +49 0.281 +50 0.348 +51 0.413 +52 0.478 +53 0.541 +54 0.603 +55 0.664 +56 0.723 +57 0.782 +58 0.839 +59 0.896 +60 0.952 +61 1.006 +62 1.061 +63 1.114 +64 1.168 +65 1.221 +66 1.274 +67 1.327 +68 1.381 +69 1.434 +70 1.489 +71 1.544 +72 1.601 +73 1.659 +74 1.719 +75 1.780 +76 1.844 +77 1.910 +78 1.979 +79 2.050 +80 2.125 +81 2.204 +82 2.287 +83 2.374 +84 2.466 +85 2.564 +86 2.666 +87 2.775 +88 2.890 +89 3.011 +90 3.140 +1 -1.454 +2 -1.547 +3 -1.629 +4 -1.699 +5 -1.759 +6 -1.809 +7 -1.849 +8 -1.880 +9 -1.903 +10 -1.917 +11 -1.924 +12 -1.923 +13 -1.916 +14 -1.902 +15 -1.881 +16 -1.856 +17 -1.825 +18 -1.789 +19 -1.748 +20 -1.703 +21 -1.654 +22 -1.602 +23 -1.547 +24 -1.488 +25 -1.427 +26 -1.364 +27 -1.298 +28 -1.230 +29 -1.161 +30 -1.091 +31 -1.019 +32 -0.947 +33 -0.874 +34 -0.800 +35 -0.726 +36 -0.652 +37 -0.578 +38 -0.504 +39 -0.430 +40 -0.357 +41 -0.284 +42 -0.212 +43 -0.140 +44 -0.070 +45 0.000 +46 0.069 +47 0.136 +48 0.203 +49 0.268 +50 0.333 +51 0.396 +52 0.458 +53 0.519 +54 0.579 +55 0.638 +56 0.696 +57 0.753 +58 0.809 +59 0.864 +60 0.918 +61 0.972 +62 1.026 +63 1.078 +64 1.131 +65 1.184 +66 1.236 +67 1.289 +68 1.342 +69 1.396 +70 1.450 +71 1.505 +72 1.562 +73 1.620 +74 1.679 +75 1.741 +76 1.804 +77 1.870 +78 1.939 +79 2.011 +80 2.086 +81 2.165 +82 2.247 +83 2.334 +84 2.426 +85 2.522 +86 2.624 +87 2.732 +88 2.845 +89 2.966 +90 3.093 +1 -1.354 +2 -1.454 +3 -1.541 +4 -1.618 +5 -1.683 +6 -1.738 +7 -1.783 +8 -1.819 +9 -1.847 +10 -1.865 +11 -1.876 +12 -1.879 +13 -1.876 +14 -1.865 +15 -1.848 +16 -1.826 +17 -1.798 +18 -1.765 +19 -1.727 +20 -1.684 +21 -1.638 +22 -1.588 +23 -1.534 +24 -1.478 +25 -1.418 +26 -1.357 +27 -1.292 +28 -1.226 +29 -1.158 +30 -1.089 +31 -1.018 +32 -0.947 +33 -0.874 +34 -0.801 +35 -0.728 +36 -0.654 +37 -0.580 +38 -0.506 +39 -0.432 +40 -0.359 +41 -0.286 +42 -0.213 +43 -0.141 +44 -0.070 +45 0.000 +46 0.069 +47 0.138 +48 0.205 +49 0.272 +50 0.337 +51 0.402 +52 0.465 +53 0.528 +54 0.589 +55 0.650 +56 0.709 +57 0.768 +58 0.826 +59 0.883 +60 0.940 +61 0.996 +62 1.052 +63 1.107 +64 1.162 +65 1.217 +66 1.273 +67 1.328 +68 1.384 +69 1.441 +70 1.499 +71 1.558 +72 1.618 +73 1.679 +74 1.743 +75 1.808 +76 1.876 +77 1.946 +78 2.019 +79 2.096 +80 2.176 +81 2.259 +82 2.347 +83 2.439 +84 2.536 +85 2.638 +86 2.746 +87 2.859 +88 2.979 +89 3.106 +90 3.240 +1 -1.341 +2 -1.437 +3 -1.520 +4 -1.593 +5 -1.656 +6 -1.709 +7 -1.752 +8 -1.786 +9 -1.811 +10 -1.828 +11 -1.838 +12 -1.840 +13 -1.836 +14 -1.825 +15 -1.808 +16 -1.785 +17 -1.757 +18 -1.724 +19 -1.686 +20 -1.645 +21 -1.599 +22 -1.550 +23 -1.497 +24 -1.442 +25 -1.383 +26 -1.323 +27 -1.260 +28 -1.195 +29 -1.129 +30 -1.061 +31 -0.992 +32 -0.922 +33 -0.851 +34 -0.780 +35 -0.708 +36 -0.636 +37 -0.564 +38 -0.492 +39 -0.420 +40 -0.349 +41 -0.278 +42 -0.207 +43 -0.137 +44 -0.068 +45 0.000 +46 0.067 +47 0.134 +48 0.199 +49 0.264 +50 0.328 +51 0.390 +52 0.452 +53 0.512 +54 0.572 +55 0.630 +56 0.688 +57 0.745 +58 0.800 +59 0.856 +60 0.910 +61 0.965 +62 1.018 +63 1.072 +64 1.125 +65 1.178 +66 1.231 +67 1.285 +68 1.339 +69 1.394 +70 1.449 +71 1.506 +72 1.563 +73 1.623 +74 1.683 +75 1.746 +76 1.811 +77 1.879 +78 1.949 +79 2.023 +80 2.100 +81 2.180 +82 2.264 +83 2.353 +84 2.446 +85 2.545 +86 2.649 +87 2.758 +88 2.874 +89 2.996 +90 3.125 +1 -1.360 +2 -1.453 +3 -1.535 +4 -1.606 +5 -1.667 +6 -1.718 +7 -1.759 +8 -1.792 +9 -1.816 +10 -1.832 +11 -1.840 +12 -1.842 +13 -1.836 +14 -1.824 +15 -1.807 +16 -1.783 +17 -1.755 +18 -1.721 +19 -1.683 +20 -1.641 +21 -1.595 +22 -1.545 +23 -1.492 +24 -1.437 +25 -1.378 +26 -1.318 +27 -1.255 +28 -1.190 +29 -1.124 +30 -1.056 +31 -0.987 +32 -0.917 +33 -0.847 +34 -0.776 +35 -0.704 +36 -0.632 +37 -0.561 +38 -0.489 +39 -0.418 +40 -0.346 +41 -0.276 +42 -0.206 +43 -0.136 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.262 +50 0.325 +51 0.387 +52 0.448 +53 0.507 +54 0.566 +55 0.624 +56 0.681 +57 0.737 +58 0.792 +59 0.847 +60 0.901 +61 0.954 +62 1.007 +63 1.059 +64 1.112 +65 1.164 +66 1.216 +67 1.269 +68 1.322 +69 1.376 +70 1.430 +71 1.485 +72 1.542 +73 1.600 +74 1.660 +75 1.721 +76 1.785 +77 1.851 +78 1.920 +79 1.992 +80 2.068 +81 2.146 +82 2.229 +83 2.316 +84 2.408 +85 2.504 +86 2.606 +87 2.714 +88 2.827 +89 2.947 +90 3.074 +1 -1.370 +2 -1.461 +3 -1.541 +4 -1.610 +5 -1.669 +6 -1.718 +7 -1.758 +8 -1.790 +9 -1.812 +10 -1.827 +11 -1.835 +12 -1.835 +13 -1.829 +14 -1.816 +15 -1.798 +16 -1.774 +17 -1.745 +18 -1.711 +19 -1.673 +20 -1.631 +21 -1.584 +22 -1.535 +23 -1.482 +24 -1.426 +25 -1.368 +26 -1.307 +27 -1.245 +28 -1.180 +29 -1.114 +30 -1.047 +31 -0.979 +32 -0.909 +33 -0.839 +34 -0.768 +35 -0.697 +36 -0.626 +37 -0.555 +38 -0.484 +39 -0.413 +40 -0.343 +41 -0.273 +42 -0.204 +43 -0.135 +44 -0.067 +45 0.000 +46 0.066 +47 0.131 +48 0.195 +49 0.259 +50 0.321 +51 0.382 +52 0.442 +53 0.501 +54 0.559 +55 0.616 +56 0.672 +57 0.727 +58 0.781 +59 0.834 +60 0.887 +61 0.939 +62 0.991 +63 1.043 +64 1.094 +65 1.145 +66 1.196 +67 1.248 +68 1.299 +69 1.352 +70 1.405 +71 1.459 +72 1.514 +73 1.571 +74 1.629 +75 1.689 +76 1.752 +77 1.816 +78 1.884 +79 1.954 +80 2.027 +81 2.104 +82 2.185 +83 2.270 +84 2.360 +85 2.454 +86 2.554 +87 2.659 +88 2.770 +89 2.888 +90 3.012 +1 -1.360 +2 -1.453 +3 -1.536 +4 -1.607 +5 -1.668 +6 -1.719 +7 -1.761 +8 -1.793 +9 -1.818 +10 -1.834 +11 -1.842 +12 -1.844 +13 -1.838 +14 -1.826 +15 -1.809 +16 -1.785 +17 -1.756 +18 -1.723 +19 -1.685 +20 -1.643 +21 -1.597 +22 -1.547 +23 -1.494 +24 -1.438 +25 -1.380 +26 -1.319 +27 -1.256 +28 -1.191 +29 -1.125 +30 -1.057 +31 -0.988 +32 -0.918 +33 -0.847 +34 -0.776 +35 -0.705 +36 -0.633 +37 -0.561 +38 -0.489 +39 -0.418 +40 -0.347 +41 -0.276 +42 -0.206 +43 -0.136 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.262 +50 0.325 +51 0.387 +52 0.448 +53 0.507 +54 0.566 +55 0.624 +56 0.681 +57 0.737 +58 0.792 +59 0.847 +60 0.900 +61 0.954 +62 1.006 +63 1.059 +64 1.111 +65 1.163 +66 1.216 +67 1.268 +68 1.321 +69 1.375 +70 1.429 +71 1.484 +72 1.541 +73 1.599 +74 1.659 +75 1.720 +76 1.784 +77 1.850 +78 1.919 +79 1.991 +80 2.066 +81 2.145 +82 2.228 +83 2.315 +84 2.407 +85 2.503 +86 2.605 +87 2.713 +88 2.827 +89 2.947 +90 3.074 +1 -1.344 +2 -1.439 +3 -1.523 +4 -1.596 +5 -1.658 +6 -1.710 +7 -1.753 +8 -1.787 +9 -1.812 +10 -1.829 +11 -1.839 +12 -1.841 +13 -1.836 +14 -1.825 +15 -1.808 +16 -1.785 +17 -1.757 +18 -1.724 +19 -1.687 +20 -1.645 +21 -1.599 +22 -1.550 +23 -1.497 +24 -1.442 +25 -1.383 +26 -1.323 +27 -1.260 +28 -1.195 +29 -1.129 +30 -1.061 +31 -0.992 +32 -0.922 +33 -0.851 +34 -0.780 +35 -0.708 +36 -0.636 +37 -0.564 +38 -0.492 +39 -0.420 +40 -0.349 +41 -0.278 +42 -0.207 +43 -0.137 +44 -0.068 +45 0.000 +46 0.067 +47 0.134 +48 0.199 +49 0.264 +50 0.328 +51 0.390 +52 0.452 +53 0.512 +54 0.572 +55 0.630 +56 0.688 +57 0.744 +58 0.800 +59 0.856 +60 0.910 +61 0.964 +62 1.018 +63 1.072 +64 1.125 +65 1.178 +66 1.231 +67 1.285 +68 1.339 +69 1.394 +70 1.449 +71 1.506 +72 1.563 +73 1.623 +74 1.683 +75 1.746 +76 1.811 +77 1.879 +78 1.949 +79 2.023 +80 2.100 +81 2.180 +82 2.264 +83 2.353 +84 2.446 +85 2.545 +86 2.649 +87 2.758 +88 2.874 +89 2.996 +90 3.125 +1 -1.358 +2 -1.457 +3 -1.544 +4 -1.621 +5 -1.686 +6 -1.741 +7 -1.786 +8 -1.822 +9 -1.849 +10 -1.868 +11 -1.879 +12 -1.882 +13 -1.878 +14 -1.867 +15 -1.851 +16 -1.828 +17 -1.800 +18 -1.766 +19 -1.728 +20 -1.686 +21 -1.640 +22 -1.590 +23 -1.536 +24 -1.479 +25 -1.420 +26 -1.358 +27 -1.294 +28 -1.227 +29 -1.159 +30 -1.090 +31 -1.019 +32 -0.948 +33 -0.875 +34 -0.802 +35 -0.728 +36 -0.654 +37 -0.580 +38 -0.506 +39 -0.432 +40 -0.359 +41 -0.286 +42 -0.213 +43 -0.141 +44 -0.070 +45 0.000 +46 0.069 +47 0.138 +48 0.206 +49 0.272 +50 0.338 +51 0.402 +52 0.466 +53 0.528 +54 0.590 +55 0.650 +56 0.710 +57 0.769 +58 0.827 +59 0.884 +60 0.941 +61 0.997 +62 1.052 +63 1.108 +64 1.163 +65 1.218 +66 1.274 +67 1.329 +68 1.385 +69 1.442 +70 1.500 +71 1.559 +72 1.619 +73 1.681 +74 1.744 +75 1.809 +76 1.877 +77 1.947 +78 2.021 +79 2.097 +80 2.177 +81 2.260 +82 2.348 +83 2.440 +84 2.537 +85 2.639 +86 2.747 +87 2.860 +88 2.980 +89 3.107 +90 3.241 +1 -1.459 +2 -1.552 +3 -1.633 +4 -1.703 +5 -1.763 +6 -1.813 +7 -1.853 +8 -1.884 +9 -1.906 +10 -1.920 +11 -1.927 +12 -1.926 +13 -1.918 +14 -1.904 +15 -1.884 +16 -1.858 +17 -1.827 +18 -1.791 +19 -1.750 +20 -1.705 +21 -1.656 +22 -1.604 +23 -1.548 +24 -1.490 +25 -1.429 +26 -1.365 +27 -1.299 +28 -1.232 +29 -1.163 +30 -1.092 +31 -1.020 +32 -0.948 +33 -0.875 +34 -0.801 +35 -0.727 +36 -0.652 +37 -0.578 +38 -0.504 +39 -0.430 +40 -0.357 +41 -0.284 +42 -0.212 +43 -0.140 +44 -0.070 +45 0.000 +46 0.069 +47 0.136 +48 0.203 +49 0.269 +50 0.333 +51 0.396 +52 0.459 +53 0.520 +54 0.580 +55 0.639 +56 0.696 +57 0.753 +58 0.809 +59 0.865 +60 0.919 +61 0.973 +62 1.026 +63 1.079 +64 1.132 +65 1.184 +66 1.237 +67 1.290 +68 1.343 +69 1.397 +70 1.451 +71 1.506 +72 1.563 +73 1.621 +74 1.680 +75 1.742 +76 1.806 +77 1.872 +78 1.940 +79 2.012 +80 2.087 +81 2.166 +82 2.249 +83 2.336 +84 2.427 +85 2.524 +86 2.626 +87 2.733 +88 2.847 +89 2.968 +90 3.095 +1 -1.623 +2 -1.716 +3 -1.798 +4 -1.867 +5 -1.926 +6 -1.974 +7 -2.013 +8 -2.042 +9 -2.061 +10 -2.073 +11 -2.076 +12 -2.072 +13 -2.061 +14 -2.043 +15 -2.019 +16 -1.989 +17 -1.954 +18 -1.913 +19 -1.868 +20 -1.818 +21 -1.765 +22 -1.707 +23 -1.647 +24 -1.583 +25 -1.517 +26 -1.449 +27 -1.378 +28 -1.306 +29 -1.231 +30 -1.156 +31 -1.079 +32 -1.002 +33 -0.924 +34 -0.846 +35 -0.767 +36 -0.688 +37 -0.609 +38 -0.531 +39 -0.453 +40 -0.375 +41 -0.299 +42 -0.223 +43 -0.147 +44 -0.073 +45 0.000 +46 0.072 +47 0.143 +48 0.213 +49 0.281 +50 0.348 +51 0.414 +52 0.479 +53 0.542 +54 0.604 +55 0.665 +56 0.724 +57 0.783 +58 0.841 +59 0.897 +60 0.953 +61 1.008 +62 1.062 +63 1.116 +64 1.169 +65 1.223 +66 1.276 +67 1.329 +68 1.382 +69 1.436 +70 1.491 +71 1.547 +72 1.603 +73 1.661 +74 1.721 +75 1.782 +76 1.846 +77 1.912 +78 1.981 +79 2.053 +80 2.128 +81 2.207 +82 2.290 +83 2.377 +84 2.470 +85 2.567 +86 2.670 +87 2.778 +88 2.893 +89 3.015 +90 3.144 +1 -1.630 +2 -1.717 +3 -1.792 +4 -1.856 +5 -1.910 +6 -1.954 +7 -1.988 +8 -2.013 +9 -2.030 +10 -2.039 +11 -2.040 +12 -2.034 +13 -2.021 +14 -2.001 +15 -1.976 +16 -1.945 +17 -1.909 +18 -1.868 +19 -1.823 +20 -1.773 +21 -1.720 +22 -1.663 +23 -1.604 +24 -1.541 +25 -1.476 +26 -1.409 +27 -1.339 +28 -1.268 +29 -1.196 +30 -1.122 +31 -1.047 +32 -0.972 +33 -0.896 +34 -0.819 +35 -0.743 +36 -0.666 +37 -0.590 +38 -0.514 +39 -0.438 +40 -0.363 +41 -0.289 +42 -0.215 +43 -0.142 +44 -0.071 +45 0.000 +46 0.069 +47 0.138 +48 0.205 +49 0.271 +50 0.335 +51 0.398 +52 0.460 +53 0.521 +54 0.580 +55 0.638 +56 0.695 +57 0.751 +58 0.806 +59 0.860 +60 0.913 +61 0.965 +62 1.016 +63 1.067 +64 1.118 +65 1.168 +66 1.218 +67 1.268 +68 1.318 +69 1.369 +70 1.420 +71 1.472 +72 1.525 +73 1.579 +74 1.635 +75 1.693 +76 1.752 +77 1.814 +78 1.878 +79 1.946 +80 2.016 +81 2.090 +82 2.167 +83 2.249 +84 2.336 +85 2.427 +86 2.523 +87 2.625 +88 2.733 +89 2.848 +90 2.969 +1 -1.537 +2 -1.623 +3 -1.698 +4 -1.763 +5 -1.817 +6 -1.861 +7 -1.897 +8 -1.923 +9 -1.941 +10 -1.951 +11 -1.953 +12 -1.949 +13 -1.938 +14 -1.921 +15 -1.897 +16 -1.869 +17 -1.835 +18 -1.797 +19 -1.754 +20 -1.707 +21 -1.657 +22 -1.603 +23 -1.546 +24 -1.486 +25 -1.424 +26 -1.359 +27 -1.293 +28 -1.224 +29 -1.155 +30 -1.084 +31 -1.012 +32 -0.939 +33 -0.866 +34 -0.793 +35 -0.719 +36 -0.645 +37 -0.571 +38 -0.497 +39 -0.424 +40 -0.352 +41 -0.280 +42 -0.208 +43 -0.138 +44 -0.069 +45 0.000 +46 0.067 +47 0.134 +48 0.199 +49 0.263 +50 0.326 +51 0.387 +52 0.448 +53 0.507 +54 0.565 +55 0.622 +56 0.677 +57 0.732 +58 0.786 +59 0.838 +60 0.890 +61 0.941 +62 0.992 +63 1.042 +64 1.092 +65 1.141 +66 1.190 +67 1.240 +68 1.289 +69 1.339 +70 1.390 +71 1.441 +72 1.494 +73 1.548 +74 1.603 +75 1.660 +76 1.719 +77 1.780 +78 1.843 +79 1.910 +80 1.979 +81 2.052 +82 2.129 +83 2.210 +84 2.295 +85 2.385 +86 2.480 +87 2.581 +88 2.687 +89 2.800 +90 2.919 +1 -1.337 +2 -1.420 +3 -1.493 +4 -1.556 +5 -1.610 +6 -1.654 +7 -1.690 +8 -1.718 +9 -1.738 +10 -1.750 +11 -1.755 +12 -1.754 +13 -1.747 +14 -1.733 +15 -1.715 +16 -1.691 +17 -1.662 +18 -1.629 +19 -1.592 +20 -1.551 +21 -1.506 +22 -1.458 +23 -1.407 +24 -1.354 +25 -1.298 +26 -1.240 +27 -1.181 +28 -1.119 +29 -1.056 +30 -0.992 +31 -0.927 +32 -0.861 +33 -0.794 +34 -0.727 +35 -0.660 +36 -0.592 +37 -0.525 +38 -0.458 +39 -0.391 +40 -0.324 +41 -0.258 +42 -0.192 +43 -0.127 +44 -0.063 +45 0.000 +46 0.062 +47 0.124 +48 0.184 +49 0.244 +50 0.302 +51 0.359 +52 0.416 +53 0.471 +54 0.525 +55 0.579 +56 0.631 +57 0.682 +58 0.733 +59 0.783 +60 0.832 +61 0.880 +62 0.929 +63 0.976 +64 1.024 +65 1.071 +66 1.118 +67 1.165 +68 1.213 +69 1.261 +70 1.310 +71 1.360 +72 1.410 +73 1.462 +74 1.515 +75 1.570 +76 1.627 +77 1.686 +78 1.747 +79 1.811 +80 1.878 +81 1.949 +82 2.022 +83 2.100 +84 2.181 +85 2.268 +86 2.358 +87 2.454 +88 2.556 +89 2.663 +90 2.777 +1 -1.009 +2 -1.084 +3 -1.150 +4 -1.207 +5 -1.256 +6 -1.297 +7 -1.332 +8 -1.359 +9 -1.379 +10 -1.393 +11 -1.402 +12 -1.404 +13 -1.402 +14 -1.394 +15 -1.382 +16 -1.365 +17 -1.344 +18 -1.320 +19 -1.292 +20 -1.260 +21 -1.226 +22 -1.188 +23 -1.149 +24 -1.106 +25 -1.062 +26 -1.016 +27 -0.968 +28 -0.919 +29 -0.868 +30 -0.816 +31 -0.763 +32 -0.710 +33 -0.655 +34 -0.601 +35 -0.546 +36 -0.490 +37 -0.435 +38 -0.379 +39 -0.324 +40 -0.269 +41 -0.214 +42 -0.160 +43 -0.106 +44 -0.053 +45 0.000 +46 0.052 +47 0.104 +48 0.154 +49 0.204 +50 0.254 +51 0.302 +52 0.350 +53 0.397 +54 0.443 +55 0.489 +56 0.534 +57 0.578 +58 0.621 +59 0.665 +60 0.707 +61 0.749 +62 0.791 +63 0.833 +64 0.875 +65 0.916 +66 0.958 +67 1.000 +68 1.042 +69 1.085 +70 1.128 +71 1.172 +72 1.217 +73 1.263 +74 1.311 +75 1.360 +76 1.410 +77 1.463 +78 1.518 +79 1.575 +80 1.634 +81 1.696 +82 1.762 +83 1.830 +84 1.902 +85 1.978 +86 2.058 +87 2.143 +88 2.232 +89 2.326 +90 2.425 +1 -0.621 +2 -0.670 +3 -0.714 +4 -0.752 +5 -0.785 +6 -0.813 +7 -0.836 +8 -0.855 +9 -0.869 +10 -0.880 +11 -0.886 +12 -0.889 +13 -0.888 +14 -0.884 +15 -0.877 +16 -0.867 +17 -0.855 +18 -0.840 +19 -0.823 +20 -0.803 +21 -0.782 +22 -0.758 +23 -0.733 +24 -0.707 +25 -0.679 +26 -0.650 +27 -0.619 +28 -0.588 +29 -0.556 +30 -0.523 +31 -0.489 +32 -0.455 +33 -0.421 +34 -0.386 +35 -0.351 +36 -0.315 +37 -0.280 +38 -0.244 +39 -0.209 +40 -0.173 +41 -0.138 +42 -0.103 +43 -0.068 +44 -0.034 +45 0.000 +46 0.034 +47 0.067 +48 0.100 +49 0.132 +50 0.164 +51 0.196 +52 0.227 +53 0.257 +54 0.287 +55 0.317 +56 0.346 +57 0.375 +58 0.404 +59 0.432 +60 0.460 +61 0.488 +62 0.516 +63 0.543 +64 0.570 +65 0.598 +66 0.625 +67 0.653 +68 0.681 +69 0.709 +70 0.738 +71 0.767 +72 0.797 +73 0.828 +74 0.859 +75 0.892 +76 0.925 +77 0.960 +78 0.996 +79 1.034 +80 1.073 +81 1.114 +82 1.158 +83 1.203 +84 1.250 +85 1.300 +86 1.353 +87 1.409 +88 1.467 +89 1.529 +90 1.594 +1 -0.227 +2 -0.252 +3 -0.275 +4 -0.295 +5 -0.312 +6 -0.327 +7 -0.340 +8 -0.351 +9 -0.360 +10 -0.366 +11 -0.371 +12 -0.375 +13 -0.376 +14 -0.376 +15 -0.375 +16 -0.372 +17 -0.368 +18 -0.363 +19 -0.357 +20 -0.349 +21 -0.341 +22 -0.332 +23 -0.322 +24 -0.311 +25 -0.299 +26 -0.287 +27 -0.274 +28 -0.261 +29 -0.247 +30 -0.233 +31 -0.218 +32 -0.204 +33 -0.189 +34 -0.173 +35 -0.158 +36 -0.142 +37 -0.126 +38 -0.110 +39 -0.095 +40 -0.079 +41 -0.063 +42 -0.047 +43 -0.031 +44 -0.016 +45 0.000 +46 0.015 +47 0.031 +48 0.046 +49 0.061 +50 0.076 +51 0.091 +52 0.105 +53 0.120 +54 0.134 +55 0.148 +56 0.162 +57 0.176 +58 0.190 +59 0.204 +60 0.217 +61 0.231 +62 0.245 +63 0.258 +64 0.272 +65 0.286 +66 0.299 +67 0.313 +68 0.327 +69 0.341 +70 0.356 +71 0.371 +72 0.386 +73 0.401 +74 0.417 +75 0.434 +76 0.451 +77 0.469 +78 0.487 +79 0.506 +80 0.526 +81 0.547 +82 0.568 +83 0.591 +84 0.615 +85 0.640 +86 0.666 +87 0.693 +88 0.722 +89 0.753 +90 0.785 +1 0.220 +2 0.223 +3 0.225 +4 0.226 +5 0.227 +6 0.227 +7 0.226 +8 0.225 +9 0.223 +10 0.220 +11 0.217 +12 0.213 +13 0.209 +14 0.205 +15 0.200 +16 0.195 +17 0.189 +18 0.183 +19 0.177 +20 0.171 +21 0.164 +22 0.158 +23 0.151 +24 0.144 +25 0.137 +26 0.129 +27 0.122 +28 0.115 +29 0.107 +30 0.100 +31 0.093 +32 0.085 +33 0.078 +34 0.071 +35 0.064 +36 0.057 +37 0.050 +38 0.043 +39 0.037 +40 0.030 +41 0.024 +42 0.018 +43 0.012 +44 0.006 +45 -0.000 +46 -0.005 +47 -0.011 +48 -0.016 +49 -0.021 +50 -0.025 +51 -0.030 +52 -0.034 +53 -0.038 +54 -0.042 +55 -0.046 +56 -0.050 +57 -0.053 +58 -0.056 +59 -0.059 +60 -0.062 +61 -0.065 +62 -0.068 +63 -0.070 +64 -0.072 +65 -0.075 +66 -0.077 +67 -0.079 +68 -0.081 +69 -0.083 +70 -0.085 +71 -0.087 +72 -0.089 +73 -0.091 +74 -0.093 +75 -0.095 +76 -0.097 +77 -0.100 +78 -0.102 +79 -0.105 +80 -0.108 +81 -0.111 +82 -0.114 +83 -0.118 +84 -0.121 +85 -0.126 +86 -0.130 +87 -0.135 +88 -0.141 +89 -0.147 +90 -0.153 +1 0.745 +2 0.776 +3 0.803 +4 0.825 +5 0.843 +6 0.857 +7 0.868 +8 0.875 +9 0.878 +10 0.878 +11 0.876 +12 0.870 +13 0.862 +14 0.851 +15 0.838 +16 0.823 +17 0.806 +18 0.787 +19 0.766 +20 0.744 +21 0.720 +22 0.695 +23 0.669 +24 0.642 +25 0.614 +26 0.585 +27 0.555 +28 0.525 +29 0.494 +30 0.463 +31 0.432 +32 0.400 +33 0.368 +34 0.336 +35 0.304 +36 0.272 +37 0.241 +38 0.209 +39 0.178 +40 0.148 +41 0.117 +42 0.087 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.082 +49 -0.108 +50 -0.134 +51 -0.159 +52 -0.183 +53 -0.207 +54 -0.230 +55 -0.253 +56 -0.275 +57 -0.296 +58 -0.317 +59 -0.338 +60 -0.358 +61 -0.378 +62 -0.397 +63 -0.416 +64 -0.435 +65 -0.453 +66 -0.471 +67 -0.490 +68 -0.508 +69 -0.526 +70 -0.545 +71 -0.564 +72 -0.583 +73 -0.602 +74 -0.623 +75 -0.643 +76 -0.665 +77 -0.687 +78 -0.710 +79 -0.735 +80 -0.760 +81 -0.787 +82 -0.815 +83 -0.845 +84 -0.877 +85 -0.911 +86 -0.946 +87 -0.984 +88 -1.025 +89 -1.067 +90 -1.113 +1 1.190 +2 1.246 +3 1.294 +4 1.334 +5 1.367 +6 1.393 +7 1.414 +8 1.428 +9 1.436 +10 1.439 +11 1.436 +12 1.429 +13 1.418 +14 1.402 +15 1.382 +16 1.358 +17 1.331 +18 1.301 +19 1.268 +20 1.232 +21 1.194 +22 1.153 +23 1.111 +24 1.066 +25 1.020 +26 0.973 +27 0.924 +28 0.874 +29 0.823 +30 0.772 +31 0.720 +32 0.667 +33 0.615 +34 0.562 +35 0.509 +36 0.456 +37 0.403 +38 0.351 +39 0.299 +40 0.248 +41 0.197 +42 0.146 +43 0.097 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.139 +49 -0.183 +50 -0.226 +51 -0.269 +52 -0.310 +53 -0.351 +54 -0.390 +55 -0.429 +56 -0.466 +57 -0.503 +58 -0.539 +59 -0.575 +60 -0.609 +61 -0.643 +62 -0.677 +63 -0.710 +64 -0.742 +65 -0.775 +66 -0.807 +67 -0.839 +68 -0.871 +69 -0.903 +70 -0.936 +71 -0.969 +72 -1.003 +73 -1.037 +74 -1.073 +75 -1.109 +76 -1.147 +77 -1.187 +78 -1.228 +79 -1.271 +80 -1.316 +81 -1.363 +82 -1.413 +83 -1.465 +84 -1.521 +85 -1.580 +86 -1.642 +87 -1.708 +88 -1.778 +89 -1.853 +90 -1.932 +1 1.636 +2 1.716 +3 1.785 +4 1.843 +5 1.891 +6 1.930 +7 1.960 +8 1.981 +9 1.994 +10 1.999 +11 1.997 +12 1.989 +13 1.974 +14 1.953 +15 1.926 +16 1.894 +17 1.857 +18 1.816 +19 1.771 +20 1.721 +21 1.668 +22 1.612 +23 1.553 +24 1.492 +25 1.428 +26 1.362 +27 1.294 +28 1.224 +29 1.154 +30 1.082 +31 1.009 +32 0.936 +33 0.862 +34 0.788 +35 0.714 +36 0.640 +37 0.567 +38 0.493 +39 0.420 +40 0.348 +41 0.277 +42 0.206 +43 0.136 +44 0.068 +45 -0.000 +46 -0.066 +47 -0.132 +48 -0.195 +49 -0.258 +50 -0.319 +51 -0.379 +52 -0.438 +53 -0.495 +54 -0.551 +55 -0.606 +56 -0.660 +57 -0.712 +58 -0.764 +59 -0.814 +60 -0.863 +61 -0.912 +62 -0.960 +63 -1.007 +64 -1.054 +65 -1.100 +66 -1.146 +67 -1.192 +68 -1.238 +69 -1.285 +70 -1.332 +71 -1.380 +72 -1.428 +73 -1.478 +74 -1.529 +75 -1.582 +76 -1.636 +77 -1.693 +78 -1.752 +79 -1.814 +80 -1.878 +81 -1.946 +82 -2.018 +83 -2.093 +84 -2.173 +85 -2.257 +86 -2.346 +87 -2.441 +88 -2.541 +89 -2.647 +90 -2.760 +1 1.590 +2 1.677 +3 1.752 +4 1.817 +5 1.871 +6 1.915 +7 1.950 +8 1.976 +9 1.993 +10 2.002 +11 2.004 +12 1.999 +13 1.986 +14 1.968 +15 1.944 +16 1.914 +17 1.878 +18 1.839 +19 1.794 +20 1.746 +21 1.694 +22 1.638 +23 1.580 +24 1.518 +25 1.454 +26 1.388 +27 1.320 +28 1.250 +29 1.179 +30 1.106 +31 1.032 +32 0.958 +33 0.883 +34 0.808 +35 0.733 +36 0.657 +37 0.582 +38 0.507 +39 0.432 +40 0.358 +41 0.285 +42 0.212 +43 0.140 +44 0.070 +45 -0.000 +46 -0.069 +47 -0.136 +48 -0.202 +49 -0.267 +50 -0.331 +51 -0.393 +52 -0.454 +53 -0.514 +54 -0.573 +55 -0.631 +56 -0.687 +57 -0.742 +58 -0.796 +59 -0.850 +60 -0.902 +61 -0.954 +62 -1.005 +63 -1.055 +64 -1.105 +65 -1.155 +66 -1.204 +67 -1.254 +68 -1.304 +69 -1.354 +70 -1.405 +71 -1.457 +72 -1.509 +73 -1.563 +74 -1.619 +75 -1.676 +76 -1.735 +77 -1.797 +78 -1.861 +79 -1.928 +80 -1.998 +81 -2.071 +82 -2.149 +83 -2.230 +84 -2.316 +85 -2.407 +86 -2.503 +87 -2.605 +88 -2.712 +89 -2.826 +90 -2.947 +1 1.468 +2 1.556 +3 1.632 +4 1.698 +5 1.753 +6 1.799 +7 1.835 +8 1.863 +9 1.883 +10 1.895 +11 1.899 +12 1.896 +13 1.887 +14 1.871 +15 1.850 +16 1.823 +17 1.791 +18 1.755 +19 1.714 +20 1.669 +21 1.620 +22 1.568 +23 1.513 +24 1.455 +25 1.395 +26 1.332 +27 1.267 +28 1.201 +29 1.133 +30 1.064 +31 0.994 +32 0.923 +33 0.851 +34 0.779 +35 0.707 +36 0.634 +37 0.562 +38 0.490 +39 0.418 +40 0.346 +41 0.276 +42 0.205 +43 0.136 +44 0.068 +45 -0.000 +46 -0.067 +47 -0.132 +48 -0.197 +49 -0.260 +50 -0.322 +51 -0.383 +52 -0.443 +53 -0.502 +54 -0.559 +55 -0.616 +56 -0.671 +57 -0.726 +58 -0.779 +59 -0.832 +60 -0.884 +61 -0.936 +62 -0.986 +63 -1.037 +64 -1.087 +65 -1.136 +66 -1.186 +67 -1.236 +68 -1.286 +69 -1.337 +70 -1.388 +71 -1.440 +72 -1.493 +73 -1.548 +74 -1.604 +75 -1.662 +76 -1.721 +77 -1.783 +78 -1.848 +79 -1.916 +80 -1.986 +81 -2.060 +82 -2.138 +83 -2.220 +84 -2.306 +85 -2.397 +86 -2.493 +87 -2.595 +88 -2.702 +89 -2.816 +90 -2.936 +1 1.368 +2 1.455 +3 1.530 +4 1.596 +5 1.651 +6 1.697 +7 1.734 +8 1.763 +9 1.783 +10 1.796 +11 1.802 +12 1.801 +13 1.794 +14 1.780 +15 1.761 +16 1.737 +17 1.708 +18 1.674 +19 1.635 +20 1.593 +21 1.548 +22 1.499 +23 1.447 +24 1.392 +25 1.335 +26 1.275 +27 1.214 +28 1.151 +29 1.086 +30 1.020 +31 0.953 +32 0.885 +33 0.817 +34 0.748 +35 0.679 +36 0.609 +37 0.540 +38 0.471 +39 0.402 +40 0.333 +41 0.265 +42 0.198 +43 0.131 +44 0.065 +45 -0.000 +46 -0.064 +47 -0.127 +48 -0.190 +49 -0.251 +50 -0.311 +51 -0.370 +52 -0.428 +53 -0.485 +54 -0.541 +55 -0.596 +56 -0.650 +57 -0.703 +58 -0.755 +59 -0.807 +60 -0.857 +61 -0.907 +62 -0.957 +63 -1.006 +64 -1.055 +65 -1.104 +66 -1.153 +67 -1.202 +68 -1.252 +69 -1.301 +70 -1.352 +71 -1.403 +72 -1.456 +73 -1.510 +74 -1.565 +75 -1.622 +76 -1.681 +77 -1.742 +78 -1.806 +79 -1.872 +80 -1.942 +81 -2.015 +82 -2.091 +83 -2.172 +84 -2.257 +85 -2.346 +86 -2.440 +87 -2.540 +88 -2.646 +89 -2.757 +90 -2.875 +1 1.523 +2 1.614 +3 1.694 +4 1.763 +5 1.821 +6 1.869 +7 1.908 +8 1.937 +9 1.958 +10 1.970 +11 1.975 +12 1.972 +13 1.963 +14 1.947 +15 1.925 +16 1.897 +17 1.864 +18 1.826 +19 1.784 +20 1.737 +21 1.687 +22 1.633 +23 1.575 +24 1.515 +25 1.452 +26 1.387 +27 1.320 +28 1.251 +29 1.180 +30 1.108 +31 1.035 +32 0.961 +33 0.886 +34 0.811 +35 0.736 +36 0.661 +37 0.585 +38 0.510 +39 0.435 +40 0.361 +41 0.287 +42 0.214 +43 0.142 +44 0.070 +45 -0.000 +46 -0.069 +47 -0.138 +48 -0.205 +49 -0.271 +50 -0.335 +51 -0.399 +52 -0.461 +53 -0.523 +54 -0.583 +55 -0.642 +56 -0.699 +57 -0.756 +58 -0.812 +59 -0.867 +60 -0.921 +61 -0.975 +62 -1.027 +63 -1.080 +64 -1.132 +65 -1.184 +66 -1.236 +67 -1.288 +68 -1.340 +69 -1.393 +70 -1.446 +71 -1.500 +72 -1.556 +73 -1.613 +74 -1.671 +75 -1.731 +76 -1.793 +77 -1.858 +78 -1.926 +79 -1.996 +80 -2.069 +81 -2.147 +82 -2.228 +83 -2.313 +84 -2.403 +85 -2.498 +86 -2.598 +87 -2.704 +88 -2.816 +89 -2.935 +90 -3.060 +1 1.658 +2 1.748 +3 1.827 +4 1.894 +5 1.950 +6 1.996 +7 2.032 +8 2.059 +9 2.077 +10 2.087 +11 2.088 +12 2.083 +13 2.070 +14 2.051 +15 2.025 +16 1.994 +17 1.958 +18 1.916 +19 1.870 +20 1.820 +21 1.765 +22 1.707 +23 1.646 +24 1.582 +25 1.516 +26 1.447 +27 1.376 +28 1.303 +29 1.229 +30 1.153 +31 1.076 +32 0.999 +33 0.921 +34 0.842 +35 0.764 +36 0.685 +37 0.607 +38 0.528 +39 0.451 +40 0.373 +41 0.297 +42 0.221 +43 0.146 +44 0.073 +45 -0.000 +46 -0.072 +47 -0.142 +48 -0.211 +49 -0.279 +50 -0.345 +51 -0.410 +52 -0.474 +53 -0.537 +54 -0.598 +55 -0.658 +56 -0.717 +57 -0.775 +58 -0.831 +59 -0.887 +60 -0.942 +61 -0.996 +62 -1.049 +63 -1.101 +64 -1.154 +65 -1.206 +66 -1.257 +67 -1.309 +68 -1.361 +69 -1.414 +70 -1.467 +71 -1.521 +72 -1.576 +73 -1.632 +74 -1.690 +75 -1.750 +76 -1.812 +77 -1.876 +78 -1.942 +79 -2.012 +80 -2.085 +81 -2.162 +82 -2.242 +83 -2.327 +84 -2.416 +85 -2.511 +86 -2.611 +87 -2.716 +88 -2.828 +89 -2.946 +90 -3.072 +1 1.911 +2 2.007 +3 2.089 +4 2.160 +5 2.218 +6 2.265 +7 2.302 +8 2.328 +9 2.344 +10 2.352 +11 2.351 +12 2.342 +13 2.325 +14 2.301 +15 2.270 +16 2.233 +17 2.191 +18 2.142 +19 2.089 +20 2.032 +21 1.970 +22 1.904 +23 1.835 +24 1.762 +25 1.687 +26 1.609 +27 1.530 +28 1.448 +29 1.365 +30 1.280 +31 1.194 +32 1.108 +33 1.021 +34 0.933 +35 0.846 +36 0.758 +37 0.671 +38 0.584 +39 0.498 +40 0.413 +41 0.328 +42 0.244 +43 0.162 +44 0.080 +45 -0.000 +46 -0.079 +47 -0.156 +48 -0.232 +49 -0.307 +50 -0.379 +51 -0.451 +52 -0.521 +53 -0.589 +54 -0.656 +55 -0.721 +56 -0.785 +57 -0.848 +58 -0.909 +59 -0.969 +60 -1.028 +61 -1.087 +62 -1.144 +63 -1.200 +64 -1.257 +65 -1.312 +66 -1.368 +67 -1.423 +68 -1.479 +69 -1.534 +70 -1.591 +71 -1.648 +72 -1.707 +73 -1.767 +74 -1.828 +75 -1.891 +76 -1.957 +77 -2.025 +78 -2.096 +79 -2.170 +80 -2.247 +81 -2.329 +82 -2.415 +83 -2.505 +84 -2.600 +85 -2.701 +86 -2.808 +87 -2.921 +88 -3.040 +89 -3.167 +90 -3.302 +1 1.784 +2 1.874 +3 1.953 +4 2.019 +5 2.075 +6 2.120 +7 2.155 +8 2.180 +9 2.196 +10 2.204 +11 2.204 +12 2.195 +13 2.180 +14 2.158 +15 2.130 +16 2.095 +17 2.056 +18 2.011 +19 1.961 +20 1.907 +21 1.849 +22 1.788 +23 1.723 +24 1.655 +25 1.585 +26 1.512 +27 1.437 +28 1.361 +29 1.282 +30 1.203 +31 1.123 +32 1.041 +33 0.960 +34 0.878 +35 0.795 +36 0.713 +37 0.631 +38 0.550 +39 0.469 +40 0.388 +41 0.308 +42 0.230 +43 0.152 +44 0.075 +45 -0.000 +46 -0.074 +47 -0.147 +48 -0.219 +49 -0.289 +50 -0.357 +51 -0.425 +52 -0.490 +53 -0.555 +54 -0.618 +55 -0.680 +56 -0.740 +57 -0.799 +58 -0.857 +59 -0.914 +60 -0.970 +61 -1.025 +62 -1.079 +63 -1.132 +64 -1.185 +65 -1.238 +66 -1.290 +67 -1.343 +68 -1.395 +69 -1.448 +70 -1.502 +71 -1.556 +72 -1.612 +73 -1.668 +74 -1.727 +75 -1.787 +76 -1.849 +77 -1.913 +78 -1.980 +79 -2.050 +80 -2.124 +81 -2.201 +82 -2.282 +83 -2.367 +84 -2.458 +85 -2.553 +86 -2.654 +87 -2.761 +88 -2.874 +89 -2.994 +90 -3.121 +1 1.692 +2 1.780 +3 1.857 +4 1.922 +5 1.976 +6 2.020 +7 2.054 +8 2.079 +9 2.096 +10 2.104 +11 2.104 +12 2.097 +13 2.083 +14 2.063 +15 2.036 +16 2.004 +17 1.966 +18 1.924 +19 1.876 +20 1.825 +21 1.770 +22 1.712 +23 1.650 +24 1.585 +25 1.518 +26 1.448 +27 1.377 +28 1.304 +29 1.229 +30 1.153 +31 1.076 +32 0.998 +33 0.920 +34 0.842 +35 0.763 +36 0.684 +37 0.606 +38 0.527 +39 0.450 +40 0.372 +41 0.296 +42 0.221 +43 0.146 +44 0.072 +45 -0.000 +46 -0.071 +47 -0.141 +48 -0.210 +49 -0.277 +50 -0.343 +51 -0.408 +52 -0.471 +53 -0.533 +54 -0.594 +55 -0.653 +56 -0.712 +57 -0.769 +58 -0.824 +59 -0.879 +60 -0.933 +61 -0.986 +62 -1.039 +63 -1.090 +64 -1.142 +65 -1.192 +66 -1.243 +67 -1.294 +68 -1.345 +69 -1.396 +70 -1.448 +71 -1.501 +72 -1.554 +73 -1.609 +74 -1.666 +75 -1.724 +76 -1.784 +77 -1.846 +78 -1.912 +79 -1.979 +80 -2.051 +81 -2.125 +82 -2.204 +83 -2.287 +84 -2.374 +85 -2.466 +86 -2.564 +87 -2.667 +88 -2.777 +89 -2.893 +90 -3.016 +1 1.289 +2 1.359 +3 1.419 +4 1.471 +5 1.514 +6 1.549 +7 1.577 +8 1.598 +9 1.611 +10 1.619 +11 1.620 +12 1.615 +13 1.605 +14 1.590 +15 1.570 +16 1.546 +17 1.517 +18 1.485 +19 1.449 +20 1.410 +21 1.368 +22 1.323 +23 1.276 +24 1.226 +25 1.174 +26 1.121 +27 1.066 +28 1.009 +29 0.952 +30 0.893 +31 0.834 +32 0.774 +33 0.713 +34 0.652 +35 0.591 +36 0.530 +37 0.470 +38 0.409 +39 0.349 +40 0.289 +41 0.230 +42 0.171 +43 0.113 +44 0.056 +45 -0.000 +46 -0.055 +47 -0.110 +48 -0.163 +49 -0.216 +50 -0.267 +51 -0.318 +52 -0.367 +53 -0.415 +54 -0.463 +55 -0.509 +56 -0.554 +57 -0.599 +58 -0.643 +59 -0.686 +60 -0.728 +61 -0.770 +62 -0.811 +63 -0.851 +64 -0.892 +65 -0.932 +66 -0.972 +67 -1.012 +68 -1.052 +69 -1.092 +70 -1.133 +71 -1.175 +72 -1.217 +73 -1.260 +74 -1.305 +75 -1.351 +76 -1.398 +77 -1.448 +78 -1.499 +79 -1.553 +80 -1.609 +81 -1.668 +82 -1.730 +83 -1.795 +84 -1.864 +85 -1.937 +86 -2.013 +87 -2.095 +88 -2.181 +89 -2.272 +90 -2.369 +1 1.497 +2 1.569 +3 1.632 +4 1.685 +5 1.729 +6 1.764 +7 1.791 +8 1.811 +9 1.823 +10 1.827 +11 1.826 +12 1.818 +13 1.804 +14 1.785 +15 1.760 +16 1.731 +17 1.698 +18 1.660 +19 1.618 +20 1.573 +21 1.525 +22 1.473 +23 1.420 +24 1.363 +25 1.305 +26 1.245 +27 1.183 +28 1.119 +29 1.055 +30 0.989 +31 0.923 +32 0.856 +33 0.788 +34 0.721 +35 0.653 +36 0.585 +37 0.518 +38 0.451 +39 0.384 +40 0.318 +41 0.253 +42 0.188 +43 0.125 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.120 +48 -0.179 +49 -0.236 +50 -0.292 +51 -0.347 +52 -0.400 +53 -0.453 +54 -0.504 +55 -0.554 +56 -0.603 +57 -0.651 +58 -0.698 +59 -0.744 +60 -0.789 +61 -0.834 +62 -0.877 +63 -0.920 +64 -0.963 +65 -1.005 +66 -1.048 +67 -1.090 +68 -1.132 +69 -1.174 +70 -1.217 +71 -1.260 +72 -1.305 +73 -1.350 +74 -1.396 +75 -1.444 +76 -1.494 +77 -1.545 +78 -1.599 +79 -1.655 +80 -1.714 +81 -1.776 +82 -1.840 +83 -1.909 +84 -1.981 +85 -2.058 +86 -2.139 +87 -2.224 +88 -2.315 +89 -2.412 +90 -2.514 +1 1.373 +2 1.444 +3 1.506 +4 1.558 +5 1.602 +6 1.638 +7 1.665 +8 1.686 +9 1.699 +10 1.705 +11 1.705 +12 1.700 +13 1.688 +14 1.671 +15 1.650 +16 1.624 +17 1.593 +18 1.559 +19 1.520 +20 1.479 +21 1.434 +22 1.387 +23 1.337 +24 1.284 +25 1.230 +26 1.173 +27 1.115 +28 1.056 +29 0.996 +30 0.934 +31 0.872 +32 0.809 +33 0.745 +34 0.682 +35 0.618 +36 0.554 +37 0.490 +38 0.427 +39 0.364 +40 0.302 +41 0.240 +42 0.179 +43 0.118 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.114 +48 -0.170 +49 -0.225 +50 -0.278 +51 -0.330 +52 -0.382 +53 -0.432 +54 -0.481 +55 -0.529 +56 -0.576 +57 -0.622 +58 -0.667 +59 -0.712 +60 -0.755 +61 -0.798 +62 -0.841 +63 -0.883 +64 -0.924 +65 -0.965 +66 -1.006 +67 -1.047 +68 -1.089 +69 -1.130 +70 -1.172 +71 -1.215 +72 -1.258 +73 -1.302 +74 -1.348 +75 -1.395 +76 -1.444 +77 -1.494 +78 -1.547 +79 -1.602 +80 -1.660 +81 -1.720 +82 -1.784 +83 -1.851 +84 -1.921 +85 -1.996 +86 -2.075 +87 -2.159 +88 -2.247 +89 -2.341 +90 -2.441 +1 1.676 +2 1.753 +3 1.819 +4 1.875 +5 1.921 +6 1.958 +7 1.985 +8 2.005 +9 2.016 +10 2.020 +11 2.016 +12 2.006 +13 1.989 +14 1.967 +15 1.939 +16 1.906 +17 1.868 +18 1.825 +19 1.779 +20 1.729 +21 1.675 +22 1.618 +23 1.558 +24 1.496 +25 1.431 +26 1.365 +27 1.296 +28 1.226 +29 1.155 +30 1.083 +31 1.010 +32 0.936 +33 0.862 +34 0.788 +35 0.714 +36 0.640 +37 0.566 +38 0.493 +39 0.420 +40 0.347 +41 0.276 +42 0.205 +43 0.136 +44 0.067 +45 -0.000 +46 -0.066 +47 -0.131 +48 -0.195 +49 -0.257 +50 -0.318 +51 -0.377 +52 -0.436 +53 -0.492 +54 -0.548 +55 -0.602 +56 -0.655 +57 -0.707 +58 -0.758 +59 -0.807 +60 -0.856 +61 -0.904 +62 -0.951 +63 -0.997 +64 -1.043 +65 -1.088 +66 -1.133 +67 -1.178 +68 -1.223 +69 -1.268 +70 -1.314 +71 -1.360 +72 -1.408 +73 -1.456 +74 -1.505 +75 -1.556 +76 -1.609 +77 -1.664 +78 -1.721 +79 -1.781 +80 -1.843 +81 -1.909 +82 -1.978 +83 -2.051 +84 -2.129 +85 -2.210 +86 -2.297 +87 -2.389 +88 -2.486 +89 -2.589 +90 -2.699 +1 1.470 +2 1.545 +3 1.610 +4 1.665 +5 1.711 +6 1.748 +7 1.777 +8 1.798 +9 1.812 +10 1.818 +11 1.818 +12 1.811 +13 1.798 +14 1.780 +15 1.757 +16 1.729 +17 1.696 +18 1.659 +19 1.618 +20 1.574 +21 1.526 +22 1.475 +23 1.422 +24 1.366 +25 1.308 +26 1.248 +27 1.186 +28 1.123 +29 1.058 +30 0.993 +31 0.927 +32 0.860 +33 0.792 +34 0.725 +35 0.657 +36 0.589 +37 0.521 +38 0.454 +39 0.387 +40 0.320 +41 0.255 +42 0.190 +43 0.126 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.180 +49 -0.238 +50 -0.295 +51 -0.351 +52 -0.405 +53 -0.458 +54 -0.510 +55 -0.561 +56 -0.611 +57 -0.660 +58 -0.708 +59 -0.755 +60 -0.801 +61 -0.847 +62 -0.892 +63 -0.936 +64 -0.980 +65 -1.023 +66 -1.067 +67 -1.110 +68 -1.154 +69 -1.198 +70 -1.242 +71 -1.287 +72 -1.333 +73 -1.380 +74 -1.428 +75 -1.478 +76 -1.529 +77 -1.582 +78 -1.638 +79 -1.696 +80 -1.757 +81 -1.821 +82 -1.888 +83 -1.959 +84 -2.033 +85 -2.112 +86 -2.196 +87 -2.284 +88 -2.378 +89 -2.477 +90 -2.582 +1 1.876 +2 1.959 +3 2.030 +4 2.090 +5 2.139 +6 2.178 +7 2.207 +8 2.227 +9 2.238 +10 2.241 +11 2.236 +12 2.223 +13 2.204 +14 2.178 +15 2.146 +16 2.109 +17 2.066 +18 2.019 +19 1.967 +20 1.910 +21 1.850 +22 1.787 +23 1.721 +24 1.651 +25 1.580 +26 1.506 +27 1.430 +28 1.353 +29 1.274 +30 1.194 +31 1.113 +32 1.032 +33 0.950 +34 0.868 +35 0.786 +36 0.704 +37 0.623 +38 0.542 +39 0.462 +40 0.382 +41 0.303 +42 0.226 +43 0.149 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.144 +48 -0.214 +49 -0.282 +50 -0.349 +51 -0.414 +52 -0.478 +53 -0.540 +54 -0.601 +55 -0.660 +56 -0.718 +57 -0.774 +58 -0.830 +59 -0.884 +60 -0.936 +61 -0.988 +62 -1.039 +63 -1.090 +64 -1.139 +65 -1.188 +66 -1.237 +67 -1.286 +68 -1.335 +69 -1.384 +70 -1.433 +71 -1.483 +72 -1.534 +73 -1.586 +74 -1.640 +75 -1.695 +76 -1.752 +77 -1.811 +78 -1.873 +79 -1.937 +80 -2.005 +81 -2.076 +82 -2.151 +83 -2.230 +84 -2.313 +85 -2.402 +86 -2.496 +87 -2.595 +88 -2.701 +89 -2.813 +90 -2.932 +1 1.465 +2 1.541 +3 1.608 +4 1.664 +5 1.711 +6 1.749 +7 1.779 +8 1.801 +9 1.815 +10 1.822 +11 1.822 +12 1.816 +13 1.804 +14 1.786 +15 1.763 +16 1.736 +17 1.703 +18 1.666 +19 1.625 +20 1.581 +21 1.533 +22 1.483 +23 1.429 +24 1.373 +25 1.315 +26 1.255 +27 1.193 +28 1.129 +29 1.065 +30 0.999 +31 0.932 +32 0.865 +33 0.797 +34 0.729 +35 0.661 +36 0.593 +37 0.525 +38 0.457 +39 0.390 +40 0.323 +41 0.257 +42 0.191 +43 0.127 +44 0.063 +45 -0.000 +46 -0.062 +47 -0.122 +48 -0.182 +49 -0.240 +50 -0.298 +51 -0.354 +52 -0.409 +53 -0.463 +54 -0.515 +55 -0.567 +56 -0.617 +57 -0.667 +58 -0.715 +59 -0.763 +60 -0.810 +61 -0.856 +62 -0.901 +63 -0.946 +64 -0.991 +65 -1.035 +66 -1.079 +67 -1.123 +68 -1.167 +69 -1.212 +70 -1.257 +71 -1.303 +72 -1.349 +73 -1.397 +74 -1.446 +75 -1.497 +76 -1.549 +77 -1.604 +78 -1.660 +79 -1.719 +80 -1.781 +81 -1.846 +82 -1.915 +83 -1.987 +84 -2.063 +85 -2.143 +86 -2.228 +87 -2.318 +88 -2.413 +89 -2.514 +90 -2.621 +1 1.771 +2 1.853 +3 1.923 +4 1.982 +5 2.031 +6 2.070 +7 2.099 +8 2.120 +9 2.132 +10 2.136 +11 2.132 +12 2.122 +13 2.104 +14 2.080 +15 2.051 +16 2.016 +17 1.976 +18 1.931 +19 1.882 +20 1.829 +21 1.772 +22 1.712 +23 1.648 +24 1.583 +25 1.514 +26 1.444 +27 1.371 +28 1.298 +29 1.222 +30 1.146 +31 1.069 +32 0.991 +33 0.913 +34 0.834 +35 0.756 +36 0.677 +37 0.599 +38 0.521 +39 0.444 +40 0.368 +41 0.292 +42 0.217 +43 0.144 +44 0.071 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.272 +50 -0.336 +51 -0.400 +52 -0.461 +53 -0.521 +54 -0.580 +55 -0.638 +56 -0.694 +57 -0.749 +58 -0.803 +59 -0.855 +60 -0.907 +61 -0.957 +62 -1.007 +63 -1.056 +64 -1.105 +65 -1.153 +66 -1.201 +67 -1.248 +68 -1.296 +69 -1.344 +70 -1.393 +71 -1.442 +72 -1.492 +73 -1.544 +74 -1.596 +75 -1.651 +76 -1.707 +77 -1.765 +78 -1.826 +79 -1.889 +80 -1.956 +81 -2.026 +82 -2.099 +83 -2.177 +84 -2.259 +85 -2.346 +86 -2.438 +87 -2.535 +88 -2.639 +89 -2.749 +90 -2.865 +1 1.188 +2 1.260 +3 1.322 +4 1.376 +5 1.421 +6 1.459 +7 1.489 +8 1.511 +9 1.528 +10 1.537 +11 1.541 +12 1.539 +13 1.532 +14 1.519 +15 1.502 +16 1.481 +17 1.455 +18 1.425 +19 1.392 +20 1.356 +21 1.316 +22 1.274 +23 1.230 +24 1.183 +25 1.134 +26 1.083 +27 1.030 +28 0.976 +29 0.921 +30 0.865 +31 0.808 +32 0.750 +33 0.692 +34 0.633 +35 0.575 +36 0.516 +37 0.457 +38 0.398 +39 0.340 +40 0.282 +41 0.224 +42 0.167 +43 0.111 +44 0.055 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.160 +49 -0.211 +50 -0.262 +51 -0.312 +52 -0.361 +53 -0.408 +54 -0.455 +55 -0.501 +56 -0.547 +57 -0.591 +58 -0.635 +59 -0.678 +60 -0.720 +61 -0.762 +62 -0.803 +63 -0.844 +64 -0.885 +65 -0.926 +66 -0.966 +67 -1.007 +68 -1.048 +69 -1.089 +70 -1.131 +71 -1.174 +72 -1.217 +73 -1.261 +74 -1.307 +75 -1.354 +76 -1.403 +77 -1.454 +78 -1.506 +79 -1.561 +80 -1.619 +81 -1.679 +82 -1.743 +83 -1.809 +84 -1.880 +85 -1.954 +86 -2.032 +87 -2.115 +88 -2.202 +89 -2.295 +90 -2.393 +1 1.388 +2 1.464 +3 1.530 +4 1.587 +5 1.634 +6 1.673 +7 1.703 +8 1.726 +9 1.741 +10 1.750 +11 1.751 +12 1.747 +13 1.736 +14 1.720 +15 1.699 +16 1.673 +17 1.642 +18 1.608 +19 1.569 +20 1.527 +21 1.481 +22 1.433 +23 1.382 +24 1.328 +25 1.272 +26 1.214 +27 1.155 +28 1.094 +29 1.031 +30 0.968 +31 0.904 +32 0.839 +33 0.773 +34 0.707 +35 0.641 +36 0.575 +37 0.509 +38 0.444 +39 0.378 +40 0.314 +41 0.249 +42 0.186 +43 0.123 +44 0.061 +45 -0.000 +46 -0.060 +47 -0.119 +48 -0.177 +49 -0.234 +50 -0.290 +51 -0.345 +52 -0.399 +53 -0.451 +54 -0.503 +55 -0.553 +56 -0.603 +57 -0.651 +58 -0.699 +59 -0.746 +60 -0.792 +61 -0.837 +62 -0.882 +63 -0.927 +64 -0.971 +65 -1.014 +66 -1.058 +67 -1.102 +68 -1.146 +69 -1.190 +70 -1.235 +71 -1.281 +72 -1.327 +73 -1.375 +74 -1.423 +75 -1.474 +76 -1.526 +77 -1.580 +78 -1.636 +79 -1.695 +80 -1.757 +81 -1.822 +82 -1.890 +83 -1.961 +84 -2.037 +85 -2.116 +86 -2.201 +87 -2.290 +88 -2.384 +89 -2.484 +90 -2.590 +1 1.043 +2 1.116 +3 1.180 +4 1.235 +5 1.283 +6 1.323 +7 1.356 +8 1.381 +9 1.400 +10 1.413 +11 1.420 +12 1.422 +13 1.418 +14 1.409 +15 1.396 +16 1.378 +17 1.356 +18 1.330 +19 1.301 +20 1.269 +21 1.233 +22 1.195 +23 1.155 +24 1.112 +25 1.067 +26 1.020 +27 0.971 +28 0.922 +29 0.870 +30 0.818 +31 0.765 +32 0.711 +33 0.656 +34 0.601 +35 0.546 +36 0.490 +37 0.435 +38 0.379 +39 0.324 +40 0.269 +41 0.214 +42 0.160 +43 0.106 +44 0.053 +45 -0.000 +46 -0.052 +47 -0.103 +48 -0.154 +49 -0.203 +50 -0.252 +51 -0.301 +52 -0.348 +53 -0.394 +54 -0.440 +55 -0.485 +56 -0.530 +57 -0.573 +58 -0.616 +59 -0.659 +60 -0.701 +61 -0.743 +62 -0.784 +63 -0.825 +64 -0.866 +65 -0.906 +66 -0.947 +67 -0.988 +68 -1.030 +69 -1.072 +70 -1.114 +71 -1.157 +72 -1.201 +73 -1.247 +74 -1.293 +75 -1.341 +76 -1.391 +77 -1.442 +78 -1.496 +79 -1.552 +80 -1.610 +81 -1.672 +82 -1.736 +83 -1.804 +84 -1.875 +85 -1.949 +86 -2.028 +87 -2.112 +88 -2.200 +89 -2.293 +90 -2.391 +1 1.081 +2 1.153 +3 1.216 +4 1.271 +5 1.318 +6 1.357 +7 1.389 +8 1.414 +9 1.432 +10 1.444 +11 1.450 +12 1.450 +13 1.445 +14 1.435 +15 1.421 +16 1.402 +17 1.379 +18 1.352 +19 1.322 +20 1.289 +21 1.252 +22 1.213 +23 1.172 +24 1.128 +25 1.082 +26 1.034 +27 0.984 +28 0.933 +29 0.881 +30 0.828 +31 0.774 +32 0.719 +33 0.664 +34 0.608 +35 0.552 +36 0.495 +37 0.439 +38 0.383 +39 0.327 +40 0.271 +41 0.216 +42 0.161 +43 0.107 +44 0.053 +45 -0.000 +46 -0.052 +47 -0.104 +48 -0.155 +49 -0.205 +50 -0.254 +51 -0.302 +52 -0.350 +53 -0.396 +54 -0.442 +55 -0.487 +56 -0.532 +57 -0.575 +58 -0.618 +59 -0.661 +60 -0.702 +61 -0.744 +62 -0.785 +63 -0.826 +64 -0.866 +65 -0.907 +66 -0.947 +67 -0.988 +68 -1.029 +69 -1.070 +70 -1.112 +71 -1.155 +72 -1.198 +73 -1.243 +74 -1.289 +75 -1.336 +76 -1.386 +77 -1.436 +78 -1.489 +79 -1.545 +80 -1.603 +81 -1.663 +82 -1.727 +83 -1.794 +84 -1.864 +85 -1.938 +86 -2.017 +87 -2.100 +88 -2.187 +89 -2.279 +90 -2.377 +1 0.837 +2 0.905 +3 0.966 +4 1.018 +5 1.064 +6 1.103 +7 1.135 +8 1.161 +9 1.181 +10 1.196 +11 1.205 +12 1.209 +13 1.208 +14 1.203 +15 1.194 +16 1.181 +17 1.164 +18 1.144 +19 1.121 +20 1.094 +21 1.065 +22 1.033 +23 0.999 +24 0.963 +25 0.925 +26 0.886 +27 0.844 +28 0.802 +29 0.758 +30 0.713 +31 0.667 +32 0.621 +33 0.574 +34 0.526 +35 0.478 +36 0.430 +37 0.381 +38 0.333 +39 0.285 +40 0.236 +41 0.188 +42 0.141 +43 0.093 +44 0.046 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.136 +49 -0.180 +50 -0.224 +51 -0.267 +52 -0.309 +53 -0.351 +54 -0.392 +55 -0.433 +56 -0.473 +57 -0.512 +58 -0.551 +59 -0.590 +60 -0.628 +61 -0.666 +62 -0.704 +63 -0.742 +64 -0.780 +65 -0.817 +66 -0.855 +67 -0.893 +68 -0.932 +69 -0.970 +70 -1.010 +71 -1.050 +72 -1.092 +73 -1.134 +74 -1.177 +75 -1.222 +76 -1.269 +77 -1.317 +78 -1.367 +79 -1.419 +80 -1.474 +81 -1.531 +82 -1.591 +83 -1.654 +84 -1.720 +85 -1.790 +86 -1.863 +87 -1.940 +88 -2.021 +89 -2.107 +90 -2.198 +1 1.129 +2 1.204 +3 1.269 +4 1.326 +5 1.374 +6 1.414 +7 1.447 +8 1.472 +9 1.491 +10 1.503 +11 1.509 +12 1.509 +13 1.504 +14 1.493 +15 1.478 +16 1.458 +17 1.434 +18 1.406 +19 1.375 +20 1.340 +21 1.302 +22 1.261 +23 1.218 +24 1.172 +25 1.124 +26 1.074 +27 1.023 +28 0.970 +29 0.915 +30 0.860 +31 0.804 +32 0.747 +33 0.689 +34 0.631 +35 0.573 +36 0.514 +37 0.456 +38 0.398 +39 0.339 +40 0.282 +41 0.224 +42 0.167 +43 0.111 +44 0.055 +45 -0.000 +46 -0.054 +47 -0.108 +48 -0.160 +49 -0.212 +50 -0.263 +51 -0.313 +52 -0.363 +53 -0.411 +54 -0.458 +55 -0.505 +56 -0.551 +57 -0.596 +58 -0.641 +59 -0.684 +60 -0.728 +61 -0.771 +62 -0.813 +63 -0.855 +64 -0.897 +65 -0.939 +66 -0.981 +67 -1.023 +68 -1.065 +69 -1.108 +70 -1.151 +71 -1.195 +72 -1.240 +73 -1.286 +74 -1.334 +75 -1.383 +76 -1.434 +77 -1.486 +78 -1.541 +79 -1.598 +80 -1.658 +81 -1.721 +82 -1.786 +83 -1.856 +84 -1.928 +85 -2.005 +86 -2.086 +87 -2.172 +88 -2.262 +89 -2.358 +90 -2.459 +1 1.088 +2 1.161 +3 1.226 +4 1.281 +5 1.329 +6 1.369 +7 1.401 +8 1.427 +9 1.445 +10 1.458 +11 1.464 +12 1.465 +13 1.460 +14 1.450 +15 1.436 +16 1.417 +17 1.394 +18 1.367 +19 1.337 +20 1.303 +21 1.267 +22 1.227 +23 1.185 +24 1.141 +25 1.094 +26 1.046 +27 0.996 +28 0.944 +29 0.892 +30 0.838 +31 0.783 +32 0.728 +33 0.672 +34 0.615 +35 0.559 +36 0.502 +37 0.445 +38 0.388 +39 0.331 +40 0.275 +41 0.219 +42 0.163 +43 0.108 +44 0.054 +45 -0.000 +46 -0.053 +47 -0.105 +48 -0.157 +49 -0.208 +50 -0.257 +51 -0.306 +52 -0.355 +53 -0.402 +54 -0.449 +55 -0.494 +56 -0.539 +57 -0.584 +58 -0.627 +59 -0.670 +60 -0.713 +61 -0.755 +62 -0.797 +63 -0.838 +64 -0.879 +65 -0.921 +66 -0.962 +67 -1.003 +68 -1.045 +69 -1.087 +70 -1.130 +71 -1.174 +72 -1.218 +73 -1.264 +74 -1.311 +75 -1.359 +76 -1.409 +77 -1.461 +78 -1.515 +79 -1.572 +80 -1.631 +81 -1.692 +82 -1.757 +83 -1.826 +84 -1.897 +85 -1.973 +86 -2.053 +87 -2.137 +88 -2.226 +89 -2.320 +90 -2.420 +1 1.488 +2 1.568 +3 1.637 +4 1.697 +5 1.746 +6 1.786 +7 1.818 +8 1.841 +9 1.857 +10 1.865 +11 1.866 +12 1.860 +13 1.849 +14 1.831 +15 1.808 +16 1.780 +17 1.747 +18 1.710 +19 1.668 +20 1.623 +21 1.574 +22 1.522 +23 1.468 +24 1.410 +25 1.351 +26 1.289 +27 1.226 +28 1.161 +29 1.094 +30 1.027 +31 0.959 +32 0.890 +33 0.820 +34 0.750 +35 0.680 +36 0.610 +37 0.540 +38 0.470 +39 0.401 +40 0.332 +41 0.264 +42 0.197 +43 0.130 +44 0.065 +45 -0.000 +46 -0.064 +47 -0.126 +48 -0.187 +49 -0.248 +50 -0.307 +51 -0.365 +52 -0.421 +53 -0.477 +54 -0.531 +55 -0.584 +56 -0.637 +57 -0.688 +58 -0.738 +59 -0.787 +60 -0.836 +61 -0.883 +62 -0.930 +63 -0.977 +64 -1.023 +65 -1.069 +66 -1.115 +67 -1.161 +68 -1.207 +69 -1.253 +70 -1.300 +71 -1.348 +72 -1.396 +73 -1.446 +74 -1.497 +75 -1.550 +76 -1.604 +77 -1.661 +78 -1.720 +79 -1.782 +80 -1.846 +81 -1.914 +82 -1.985 +83 -2.060 +84 -2.140 +85 -2.223 +86 -2.312 +87 -2.405 +88 -2.505 +89 -2.610 +90 -2.721 +1 1.312 +2 1.389 +3 1.457 +4 1.514 +5 1.563 +6 1.603 +7 1.635 +8 1.659 +9 1.676 +10 1.686 +11 1.690 +12 1.687 +13 1.678 +14 1.664 +15 1.645 +16 1.621 +17 1.592 +18 1.559 +19 1.523 +20 1.483 +21 1.439 +22 1.393 +23 1.344 +24 1.292 +25 1.238 +26 1.182 +27 1.125 +28 1.066 +29 1.005 +30 0.944 +31 0.882 +32 0.819 +33 0.755 +34 0.691 +35 0.627 +36 0.562 +37 0.498 +38 0.434 +39 0.370 +40 0.307 +41 0.244 +42 0.182 +43 0.121 +44 0.060 +45 -0.000 +46 -0.059 +47 -0.117 +48 -0.174 +49 -0.230 +50 -0.285 +51 -0.339 +52 -0.392 +53 -0.444 +54 -0.495 +55 -0.545 +56 -0.594 +57 -0.642 +58 -0.689 +59 -0.736 +60 -0.781 +61 -0.827 +62 -0.871 +63 -0.916 +64 -0.960 +65 -1.004 +66 -1.047 +67 -1.091 +68 -1.135 +69 -1.180 +70 -1.225 +71 -1.271 +72 -1.318 +73 -1.366 +74 -1.415 +75 -1.466 +76 -1.518 +77 -1.573 +78 -1.630 +79 -1.689 +80 -1.752 +81 -1.817 +82 -1.885 +83 -1.957 +84 -2.034 +85 -2.114 +86 -2.199 +87 -2.288 +88 -2.383 +89 -2.484 +90 -2.590 +1 1.812 +2 1.892 +3 1.961 +4 2.019 +5 2.067 +6 2.105 +7 2.133 +8 2.152 +9 2.163 +10 2.166 +11 2.161 +12 2.149 +13 2.130 +14 2.106 +15 2.075 +16 2.039 +17 1.997 +18 1.951 +19 1.901 +20 1.847 +21 1.789 +22 1.727 +23 1.663 +24 1.596 +25 1.527 +26 1.455 +27 1.382 +28 1.307 +29 1.231 +30 1.154 +31 1.076 +32 0.997 +33 0.918 +34 0.839 +35 0.760 +36 0.681 +37 0.602 +38 0.524 +39 0.446 +40 0.369 +41 0.293 +42 0.218 +43 0.144 +44 0.072 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.272 +50 -0.337 +51 -0.400 +52 -0.462 +53 -0.522 +54 -0.580 +55 -0.638 +56 -0.693 +57 -0.748 +58 -0.801 +59 -0.854 +60 -0.905 +61 -0.955 +62 -1.004 +63 -1.053 +64 -1.101 +65 -1.148 +66 -1.196 +67 -1.243 +68 -1.290 +69 -1.337 +70 -1.385 +71 -1.433 +72 -1.483 +73 -1.533 +74 -1.585 +75 -1.638 +76 -1.694 +77 -1.751 +78 -1.811 +79 -1.874 +80 -1.939 +81 -2.008 +82 -2.081 +83 -2.158 +84 -2.239 +85 -2.325 +86 -2.416 +87 -2.513 +88 -2.615 +89 -2.724 +90 -2.840 +1 1.410 +2 1.480 +3 1.540 +4 1.591 +5 1.634 +6 1.668 +7 1.695 +8 1.714 +9 1.726 +10 1.731 +11 1.730 +12 1.723 +13 1.710 +14 1.692 +15 1.670 +16 1.642 +17 1.611 +18 1.575 +19 1.536 +20 1.493 +21 1.448 +22 1.399 +23 1.348 +24 1.295 +25 1.240 +26 1.182 +27 1.124 +28 1.063 +29 1.002 +30 0.940 +31 0.877 +32 0.813 +33 0.749 +34 0.685 +35 0.621 +36 0.557 +37 0.493 +38 0.429 +39 0.365 +40 0.303 +41 0.241 +42 0.179 +43 0.118 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.114 +48 -0.170 +49 -0.225 +50 -0.278 +51 -0.330 +52 -0.381 +53 -0.432 +54 -0.480 +55 -0.528 +56 -0.575 +57 -0.621 +58 -0.666 +59 -0.710 +60 -0.753 +61 -0.795 +62 -0.837 +63 -0.879 +64 -0.920 +65 -0.960 +66 -1.001 +67 -1.041 +68 -1.082 +69 -1.123 +70 -1.164 +71 -1.206 +72 -1.249 +73 -1.292 +74 -1.337 +75 -1.384 +76 -1.432 +77 -1.481 +78 -1.533 +79 -1.588 +80 -1.644 +81 -1.704 +82 -1.767 +83 -1.833 +84 -1.903 +85 -1.977 +86 -2.056 +87 -2.139 +88 -2.227 +89 -2.320 +90 -2.419 +1 1.678 +2 1.744 +3 1.801 +4 1.847 +5 1.885 +6 1.914 +7 1.935 +8 1.948 +9 1.954 +10 1.953 +11 1.946 +12 1.932 +13 1.912 +14 1.888 +15 1.858 +16 1.823 +17 1.784 +18 1.741 +19 1.695 +20 1.645 +21 1.592 +22 1.536 +23 1.478 +24 1.417 +25 1.354 +26 1.290 +27 1.224 +28 1.157 +29 1.089 +30 1.020 +31 0.950 +32 0.880 +33 0.810 +34 0.740 +35 0.669 +36 0.599 +37 0.530 +38 0.460 +39 0.392 +40 0.324 +41 0.257 +42 0.191 +43 0.126 +44 0.063 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.180 +49 -0.238 +50 -0.294 +51 -0.348 +52 -0.401 +53 -0.453 +54 -0.504 +55 -0.553 +56 -0.601 +57 -0.648 +58 -0.693 +59 -0.738 +60 -0.781 +61 -0.823 +62 -0.865 +63 -0.906 +64 -0.946 +65 -0.986 +66 -1.026 +67 -1.065 +68 -1.104 +69 -1.143 +70 -1.183 +71 -1.223 +72 -1.264 +73 -1.306 +74 -1.348 +75 -1.392 +76 -1.438 +77 -1.485 +78 -1.535 +79 -1.587 +80 -1.641 +81 -1.698 +82 -1.759 +83 -1.823 +84 -1.890 +85 -1.962 +86 -2.038 +87 -2.119 +88 -2.205 +89 -2.297 +90 -2.394 +1 1.154 +2 1.206 +3 1.251 +4 1.288 +5 1.319 +6 1.343 +7 1.362 +8 1.374 +9 1.381 +10 1.383 +11 1.380 +12 1.373 +13 1.361 +14 1.345 +15 1.326 +16 1.303 +17 1.277 +18 1.247 +19 1.215 +20 1.181 +21 1.144 +22 1.104 +23 1.063 +24 1.021 +25 0.976 +26 0.931 +27 0.884 +28 0.836 +29 0.787 +30 0.738 +31 0.688 +32 0.638 +33 0.587 +34 0.537 +35 0.486 +36 0.435 +37 0.385 +38 0.335 +39 0.285 +40 0.236 +41 0.188 +42 0.140 +43 0.092 +44 0.046 +45 -0.000 +46 -0.045 +47 -0.089 +48 -0.132 +49 -0.174 +50 -0.216 +51 -0.256 +52 -0.295 +53 -0.334 +54 -0.371 +55 -0.408 +56 -0.444 +57 -0.479 +58 -0.513 +59 -0.547 +60 -0.579 +61 -0.612 +62 -0.643 +63 -0.674 +64 -0.705 +65 -0.736 +66 -0.766 +67 -0.796 +68 -0.827 +69 -0.857 +70 -0.888 +71 -0.919 +72 -0.951 +73 -0.984 +74 -1.017 +75 -1.051 +76 -1.087 +77 -1.124 +78 -1.163 +79 -1.203 +80 -1.246 +81 -1.290 +82 -1.337 +83 -1.387 +84 -1.440 +85 -1.495 +86 -1.554 +87 -1.616 +88 -1.683 +89 -1.753 +90 -1.828 +1 1.198 +2 1.242 +3 1.279 +4 1.310 +5 1.334 +6 1.352 +7 1.365 +8 1.373 +9 1.375 +10 1.373 +11 1.366 +12 1.355 +13 1.341 +14 1.322 +15 1.300 +16 1.275 +17 1.247 +18 1.216 +19 1.183 +20 1.148 +21 1.110 +22 1.070 +23 1.029 +24 0.986 +25 0.942 +26 0.897 +27 0.851 +28 0.804 +29 0.756 +30 0.708 +31 0.659 +32 0.610 +33 0.561 +34 0.512 +35 0.464 +36 0.415 +37 0.366 +38 0.318 +39 0.271 +40 0.224 +41 0.178 +42 0.132 +43 0.087 +44 0.043 +45 -0.000 +46 -0.042 +47 -0.084 +48 -0.124 +49 -0.163 +50 -0.202 +51 -0.239 +52 -0.276 +53 -0.311 +54 -0.345 +55 -0.379 +56 -0.412 +57 -0.443 +58 -0.474 +59 -0.504 +60 -0.533 +61 -0.562 +62 -0.590 +63 -0.617 +64 -0.644 +65 -0.671 +66 -0.697 +67 -0.723 +68 -0.750 +69 -0.776 +70 -0.802 +71 -0.829 +72 -0.856 +73 -0.883 +74 -0.912 +75 -0.941 +76 -0.971 +77 -1.002 +78 -1.035 +79 -1.070 +80 -1.106 +81 -1.144 +82 -1.184 +83 -1.227 +84 -1.272 +85 -1.320 +86 -1.371 +87 -1.425 +88 -1.483 +89 -1.544 +90 -1.610 +1 0.747 +2 0.777 +3 0.803 +4 0.824 +5 0.841 +6 0.854 +7 0.864 +8 0.870 +9 0.873 +10 0.872 +11 0.869 +12 0.863 +13 0.855 +14 0.844 +15 0.830 +16 0.815 +17 0.798 +18 0.779 +19 0.758 +20 0.735 +21 0.712 +22 0.687 +23 0.661 +24 0.634 +25 0.606 +26 0.577 +27 0.547 +28 0.517 +29 0.487 +30 0.456 +31 0.425 +32 0.394 +33 0.362 +34 0.331 +35 0.299 +36 0.268 +37 0.237 +38 0.206 +39 0.175 +40 0.145 +41 0.115 +42 0.085 +43 0.056 +44 0.028 +45 -0.000 +46 -0.027 +47 -0.054 +48 -0.080 +49 -0.106 +50 -0.131 +51 -0.155 +52 -0.179 +53 -0.202 +54 -0.225 +55 -0.247 +56 -0.268 +57 -0.289 +58 -0.309 +59 -0.329 +60 -0.349 +61 -0.368 +62 -0.386 +63 -0.404 +64 -0.422 +65 -0.440 +66 -0.458 +67 -0.475 +68 -0.493 +69 -0.510 +70 -0.528 +71 -0.546 +72 -0.564 +73 -0.583 +74 -0.602 +75 -0.622 +76 -0.642 +77 -0.664 +78 -0.686 +79 -0.709 +80 -0.734 +81 -0.759 +82 -0.786 +83 -0.815 +84 -0.846 +85 -0.878 +86 -0.912 +87 -0.949 +88 -0.988 +89 -1.029 +90 -1.073 +1 0.642 +2 0.659 +3 0.674 +4 0.685 +5 0.694 +6 0.700 +7 0.703 +8 0.704 +9 0.702 +10 0.699 +11 0.693 +12 0.685 +13 0.676 +14 0.665 +15 0.652 +16 0.638 +17 0.623 +18 0.606 +19 0.588 +20 0.569 +21 0.549 +22 0.529 +23 0.508 +24 0.486 +25 0.463 +26 0.440 +27 0.417 +28 0.393 +29 0.369 +30 0.345 +31 0.321 +32 0.297 +33 0.272 +34 0.248 +35 0.224 +36 0.200 +37 0.177 +38 0.153 +39 0.130 +40 0.107 +41 0.085 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.020 +47 -0.040 +48 -0.059 +49 -0.077 +50 -0.095 +51 -0.112 +52 -0.129 +53 -0.145 +54 -0.161 +55 -0.176 +56 -0.191 +57 -0.205 +58 -0.219 +59 -0.232 +60 -0.245 +61 -0.257 +62 -0.269 +63 -0.281 +64 -0.293 +65 -0.304 +66 -0.315 +67 -0.326 +68 -0.337 +69 -0.347 +70 -0.358 +71 -0.369 +72 -0.380 +73 -0.391 +74 -0.403 +75 -0.414 +76 -0.427 +77 -0.439 +78 -0.453 +79 -0.467 +80 -0.482 +81 -0.498 +82 -0.514 +83 -0.532 +84 -0.551 +85 -0.571 +86 -0.593 +87 -0.616 +88 -0.641 +89 -0.668 +90 -0.696 +1 0.239 +2 0.243 +3 0.245 +4 0.247 +5 0.248 +6 0.248 +7 0.248 +8 0.246 +9 0.244 +10 0.242 +11 0.238 +12 0.234 +13 0.230 +14 0.225 +15 0.220 +16 0.215 +17 0.209 +18 0.202 +19 0.196 +20 0.189 +21 0.182 +22 0.174 +23 0.167 +24 0.159 +25 0.151 +26 0.143 +27 0.135 +28 0.127 +29 0.119 +30 0.111 +31 0.103 +32 0.095 +33 0.087 +34 0.079 +35 0.071 +36 0.063 +37 0.056 +38 0.048 +39 0.041 +40 0.034 +41 0.026 +42 0.020 +43 0.013 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.023 +50 -0.029 +51 -0.034 +52 -0.039 +53 -0.043 +54 -0.048 +55 -0.052 +56 -0.056 +57 -0.060 +58 -0.064 +59 -0.067 +60 -0.071 +61 -0.074 +62 -0.077 +63 -0.080 +64 -0.083 +65 -0.086 +66 -0.088 +67 -0.091 +68 -0.093 +69 -0.096 +70 -0.098 +71 -0.100 +72 -0.103 +73 -0.105 +74 -0.108 +75 -0.110 +76 -0.113 +77 -0.116 +78 -0.119 +79 -0.122 +80 -0.126 +81 -0.129 +82 -0.133 +83 -0.137 +84 -0.142 +85 -0.147 +86 -0.153 +87 -0.158 +88 -0.165 +89 -0.172 +90 -0.179 +1 0.164 +2 0.154 +3 0.145 +4 0.136 +5 0.127 +6 0.119 +7 0.111 +8 0.103 +9 0.096 +10 0.089 +11 0.082 +12 0.076 +13 0.070 +14 0.064 +15 0.058 +16 0.053 +17 0.048 +18 0.043 +19 0.039 +20 0.034 +21 0.030 +22 0.027 +23 0.023 +24 0.020 +25 0.017 +26 0.014 +27 0.011 +28 0.009 +29 0.007 +30 0.005 +31 0.003 +32 0.002 +33 0.000 +34 -0.001 +35 -0.001 +36 -0.002 +37 -0.003 +38 -0.003 +39 -0.003 +40 -0.003 +41 -0.003 +42 -0.002 +43 -0.002 +44 -0.001 +45 0.000 +46 0.001 +47 0.002 +48 0.004 +49 0.006 +50 0.007 +51 0.009 +52 0.012 +53 0.014 +54 0.017 +55 0.019 +56 0.022 +57 0.025 +58 0.028 +59 0.032 +60 0.035 +61 0.039 +62 0.043 +63 0.047 +64 0.051 +65 0.055 +66 0.060 +67 0.065 +68 0.070 +69 0.075 +70 0.080 +71 0.085 +72 0.091 +73 0.097 +74 0.103 +75 0.109 +76 0.115 +77 0.122 +78 0.129 +79 0.136 +80 0.143 +81 0.150 +82 0.158 +83 0.166 +84 0.173 +85 0.182 +86 0.190 +87 0.199 +88 0.208 +89 0.217 +90 0.226 +1 -0.167 +2 -0.189 +3 -0.209 +4 -0.227 +5 -0.243 +6 -0.257 +7 -0.269 +8 -0.279 +9 -0.287 +10 -0.294 +11 -0.299 +12 -0.303 +13 -0.305 +14 -0.306 +15 -0.305 +16 -0.304 +17 -0.301 +18 -0.297 +19 -0.293 +20 -0.287 +21 -0.281 +22 -0.273 +23 -0.266 +24 -0.257 +25 -0.248 +26 -0.238 +27 -0.228 +28 -0.217 +29 -0.206 +30 -0.194 +31 -0.182 +32 -0.170 +33 -0.157 +34 -0.145 +35 -0.132 +36 -0.119 +37 -0.106 +38 -0.093 +39 -0.079 +40 -0.066 +41 -0.053 +42 -0.040 +43 -0.026 +44 -0.013 +45 0.000 +46 0.013 +47 0.026 +48 0.039 +49 0.052 +50 0.065 +51 0.077 +52 0.090 +53 0.102 +54 0.114 +55 0.127 +56 0.139 +57 0.151 +58 0.163 +59 0.175 +60 0.186 +61 0.198 +62 0.210 +63 0.222 +64 0.234 +65 0.246 +66 0.258 +67 0.270 +68 0.283 +69 0.295 +70 0.308 +71 0.321 +72 0.334 +73 0.348 +74 0.362 +75 0.377 +76 0.392 +77 0.407 +78 0.423 +79 0.440 +80 0.458 +81 0.476 +82 0.495 +83 0.515 +84 0.536 +85 0.557 +86 0.580 +87 0.604 +88 0.630 +89 0.656 +90 0.684 +1 -0.205 +2 -0.241 +3 -0.274 +4 -0.303 +5 -0.329 +6 -0.352 +7 -0.372 +8 -0.389 +9 -0.403 +10 -0.415 +11 -0.425 +12 -0.432 +13 -0.437 +14 -0.440 +15 -0.440 +16 -0.440 +17 -0.437 +18 -0.433 +19 -0.427 +20 -0.420 +21 -0.411 +22 -0.401 +23 -0.390 +24 -0.378 +25 -0.365 +26 -0.351 +27 -0.336 +28 -0.321 +29 -0.305 +30 -0.288 +31 -0.271 +32 -0.253 +33 -0.235 +34 -0.216 +35 -0.197 +36 -0.178 +37 -0.159 +38 -0.139 +39 -0.119 +40 -0.099 +41 -0.080 +42 -0.060 +43 -0.040 +44 -0.020 +45 0.000 +46 0.020 +47 0.039 +48 0.059 +49 0.079 +50 0.098 +51 0.117 +52 0.136 +53 0.156 +54 0.174 +55 0.193 +56 0.212 +57 0.231 +58 0.250 +59 0.268 +60 0.287 +61 0.305 +62 0.324 +63 0.343 +64 0.362 +65 0.381 +66 0.400 +67 0.420 +68 0.439 +69 0.459 +70 0.480 +71 0.501 +72 0.523 +73 0.545 +74 0.567 +75 0.591 +76 0.615 +77 0.640 +78 0.666 +79 0.693 +80 0.722 +81 0.751 +82 0.782 +83 0.814 +84 0.847 +85 0.883 +86 0.919 +87 0.958 +88 0.999 +89 1.041 +90 1.086 +1 -0.558 +2 -0.603 +3 -0.642 +4 -0.677 +5 -0.707 +6 -0.732 +7 -0.754 +8 -0.771 +9 -0.784 +10 -0.793 +11 -0.799 +12 -0.802 +13 -0.802 +14 -0.798 +15 -0.792 +16 -0.783 +17 -0.772 +18 -0.759 +19 -0.743 +20 -0.726 +21 -0.706 +22 -0.685 +23 -0.663 +24 -0.639 +25 -0.614 +26 -0.587 +27 -0.560 +28 -0.532 +29 -0.503 +30 -0.473 +31 -0.443 +32 -0.412 +33 -0.381 +34 -0.349 +35 -0.317 +36 -0.285 +37 -0.253 +38 -0.221 +39 -0.189 +40 -0.157 +41 -0.125 +42 -0.093 +43 -0.062 +44 -0.031 +45 0.000 +46 0.030 +47 0.061 +48 0.090 +49 0.120 +50 0.149 +51 0.177 +52 0.205 +53 0.233 +54 0.260 +55 0.287 +56 0.314 +57 0.340 +58 0.366 +59 0.392 +60 0.417 +61 0.443 +62 0.468 +63 0.493 +64 0.518 +65 0.542 +66 0.568 +67 0.593 +68 0.618 +69 0.644 +70 0.670 +71 0.697 +72 0.724 +73 0.752 +74 0.780 +75 0.810 +76 0.840 +77 0.872 +78 0.905 +79 0.939 +80 0.975 +81 1.013 +82 1.052 +83 1.093 +84 1.136 +85 1.182 +86 1.230 +87 1.280 +88 1.334 +89 1.390 +90 1.449 +1 -0.523 +2 -0.582 +3 -0.634 +4 -0.681 +5 -0.722 +6 -0.757 +7 -0.788 +8 -0.813 +9 -0.834 +10 -0.850 +11 -0.861 +12 -0.869 +13 -0.873 +14 -0.874 +15 -0.870 +16 -0.864 +17 -0.855 +18 -0.843 +19 -0.828 +20 -0.811 +21 -0.792 +22 -0.770 +23 -0.747 +24 -0.722 +25 -0.695 +26 -0.666 +27 -0.637 +28 -0.606 +29 -0.574 +30 -0.541 +31 -0.507 +32 -0.473 +33 -0.438 +34 -0.402 +35 -0.366 +36 -0.330 +37 -0.293 +38 -0.256 +39 -0.220 +40 -0.183 +41 -0.146 +42 -0.109 +43 -0.073 +44 -0.036 +45 0.000 +46 0.036 +47 0.072 +48 0.107 +49 0.142 +50 0.176 +51 0.211 +52 0.245 +53 0.278 +54 0.311 +55 0.344 +56 0.377 +57 0.409 +58 0.441 +59 0.473 +60 0.505 +61 0.537 +62 0.568 +63 0.600 +64 0.632 +65 0.664 +66 0.696 +67 0.728 +68 0.761 +69 0.794 +70 0.828 +71 0.863 +72 0.898 +73 0.934 +74 0.972 +75 1.010 +76 1.050 +77 1.092 +78 1.135 +79 1.179 +80 1.226 +81 1.275 +82 1.326 +83 1.379 +84 1.435 +85 1.494 +86 1.555 +87 1.620 +88 1.689 +89 1.760 +90 1.836 +1 -0.946 +2 -1.010 +3 -1.067 +4 -1.116 +5 -1.158 +6 -1.193 +7 -1.222 +8 -1.244 +9 -1.261 +10 -1.272 +11 -1.278 +12 -1.278 +13 -1.274 +14 -1.266 +15 -1.254 +16 -1.238 +17 -1.218 +18 -1.194 +19 -1.168 +20 -1.139 +21 -1.107 +22 -1.072 +23 -1.036 +24 -0.997 +25 -0.957 +26 -0.914 +27 -0.871 +28 -0.826 +29 -0.780 +30 -0.733 +31 -0.685 +32 -0.637 +33 -0.588 +34 -0.538 +35 -0.489 +36 -0.439 +37 -0.389 +38 -0.339 +39 -0.290 +40 -0.241 +41 -0.192 +42 -0.143 +43 -0.095 +44 -0.047 +45 0.000 +46 0.046 +47 0.092 +48 0.137 +49 0.182 +50 0.225 +51 0.268 +52 0.311 +53 0.352 +54 0.393 +55 0.433 +56 0.473 +57 0.512 +58 0.550 +59 0.588 +60 0.625 +61 0.662 +62 0.698 +63 0.735 +64 0.771 +65 0.807 +66 0.843 +67 0.879 +68 0.916 +69 0.953 +70 0.990 +71 1.028 +72 1.067 +73 1.107 +74 1.148 +75 1.190 +76 1.233 +77 1.279 +78 1.326 +79 1.375 +80 1.426 +81 1.480 +82 1.537 +83 1.596 +84 1.658 +85 1.724 +86 1.793 +87 1.867 +88 1.944 +89 2.026 +90 2.112 +1 -0.906 +2 -0.981 +3 -1.048 +4 -1.106 +5 -1.156 +6 -1.199 +7 -1.234 +8 -1.263 +9 -1.285 +10 -1.302 +11 -1.312 +12 -1.317 +13 -1.317 +14 -1.311 +15 -1.302 +16 -1.288 +17 -1.270 +18 -1.248 +19 -1.222 +20 -1.194 +21 -1.162 +22 -1.128 +23 -1.091 +24 -1.052 +25 -1.010 +26 -0.967 +27 -0.922 +28 -0.876 +29 -0.828 +30 -0.779 +31 -0.729 +32 -0.678 +33 -0.627 +34 -0.575 +35 -0.522 +36 -0.470 +37 -0.417 +38 -0.364 +39 -0.311 +40 -0.259 +41 -0.206 +42 -0.154 +43 -0.102 +44 -0.051 +45 0.000 +46 0.050 +47 0.100 +48 0.149 +49 0.197 +50 0.245 +51 0.292 +52 0.339 +53 0.384 +54 0.430 +55 0.474 +56 0.518 +57 0.561 +58 0.604 +59 0.647 +60 0.689 +61 0.730 +62 0.772 +63 0.813 +64 0.854 +65 0.896 +66 0.937 +67 0.979 +68 1.021 +69 1.064 +70 1.107 +71 1.151 +72 1.196 +73 1.243 +74 1.290 +75 1.339 +76 1.390 +77 1.443 +78 1.498 +79 1.555 +80 1.614 +81 1.677 +82 1.742 +83 1.811 +84 1.883 +85 1.959 +86 2.039 +87 2.123 +88 2.212 +89 2.305 +90 2.404 +1 -1.334 +2 -1.408 +3 -1.472 +4 -1.527 +5 -1.573 +6 -1.611 +7 -1.640 +8 -1.663 +9 -1.678 +10 -1.686 +11 -1.688 +12 -1.683 +13 -1.673 +14 -1.658 +15 -1.638 +16 -1.613 +17 -1.584 +18 -1.550 +19 -1.513 +20 -1.472 +21 -1.429 +22 -1.382 +23 -1.333 +24 -1.281 +25 -1.227 +26 -1.171 +27 -1.114 +28 -1.055 +29 -0.995 +30 -0.934 +31 -0.872 +32 -0.809 +33 -0.746 +34 -0.683 +35 -0.619 +36 -0.555 +37 -0.492 +38 -0.428 +39 -0.365 +40 -0.303 +41 -0.241 +42 -0.179 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.171 +49 0.226 +50 0.280 +51 0.333 +52 0.385 +53 0.436 +54 0.485 +55 0.534 +56 0.582 +57 0.629 +58 0.675 +59 0.720 +60 0.765 +61 0.808 +62 0.852 +63 0.895 +64 0.937 +65 0.979 +66 1.021 +67 1.064 +68 1.106 +69 1.149 +70 1.192 +71 1.236 +72 1.281 +73 1.326 +74 1.374 +75 1.422 +76 1.472 +77 1.524 +78 1.579 +79 1.635 +80 1.695 +81 1.757 +82 1.822 +83 1.891 +84 1.964 +85 2.040 +86 2.121 +87 2.207 +88 2.298 +89 2.394 +90 2.496 +1 -1.267 +2 -1.344 +3 -1.411 +4 -1.469 +5 -1.518 +6 -1.559 +7 -1.591 +8 -1.616 +9 -1.633 +10 -1.644 +11 -1.648 +12 -1.647 +13 -1.639 +14 -1.626 +15 -1.608 +16 -1.585 +17 -1.557 +18 -1.526 +19 -1.491 +20 -1.452 +21 -1.410 +22 -1.365 +23 -1.317 +24 -1.267 +25 -1.214 +26 -1.160 +27 -1.104 +28 -1.046 +29 -0.987 +30 -0.927 +31 -0.866 +32 -0.804 +33 -0.742 +34 -0.679 +35 -0.616 +36 -0.553 +37 -0.490 +38 -0.427 +39 -0.364 +40 -0.302 +41 -0.240 +42 -0.179 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.172 +49 0.227 +50 0.281 +51 0.335 +52 0.387 +53 0.438 +54 0.489 +55 0.538 +56 0.587 +57 0.635 +58 0.682 +59 0.728 +60 0.773 +61 0.818 +62 0.863 +63 0.907 +64 0.951 +65 0.994 +66 1.038 +67 1.082 +68 1.126 +69 1.170 +70 1.215 +71 1.261 +72 1.307 +73 1.355 +74 1.404 +75 1.455 +76 1.507 +77 1.562 +78 1.618 +79 1.677 +80 1.739 +81 1.804 +82 1.872 +83 1.943 +84 2.019 +85 2.098 +86 2.182 +87 2.271 +88 2.365 +89 2.464 +90 2.569 +1 -1.503 +2 -1.575 +3 -1.637 +4 -1.690 +5 -1.734 +6 -1.769 +7 -1.796 +8 -1.815 +9 -1.827 +10 -1.831 +11 -1.830 +12 -1.821 +13 -1.807 +14 -1.788 +15 -1.763 +16 -1.734 +17 -1.700 +18 -1.662 +19 -1.621 +20 -1.575 +21 -1.527 +22 -1.475 +23 -1.421 +24 -1.365 +25 -1.306 +26 -1.246 +27 -1.184 +28 -1.120 +29 -1.056 +30 -0.990 +31 -0.924 +32 -0.856 +33 -0.789 +34 -0.721 +35 -0.654 +36 -0.586 +37 -0.518 +38 -0.451 +39 -0.384 +40 -0.318 +41 -0.253 +42 -0.188 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.120 +48 0.179 +49 0.236 +50 0.292 +51 0.347 +52 0.401 +53 0.453 +54 0.504 +55 0.554 +56 0.603 +57 0.651 +58 0.698 +59 0.744 +60 0.789 +61 0.833 +62 0.877 +63 0.920 +64 0.963 +65 1.005 +66 1.047 +67 1.089 +68 1.131 +69 1.173 +70 1.216 +71 1.259 +72 1.304 +73 1.349 +74 1.395 +75 1.443 +76 1.492 +77 1.544 +78 1.597 +79 1.653 +80 1.712 +81 1.773 +82 1.838 +83 1.906 +84 1.978 +85 2.055 +86 2.135 +87 2.221 +88 2.312 +89 2.408 +90 2.510 +1 -1.497 +2 -1.571 +3 -1.635 +4 -1.690 +5 -1.735 +6 -1.771 +7 -1.799 +8 -1.820 +9 -1.832 +10 -1.838 +11 -1.837 +12 -1.829 +13 -1.816 +14 -1.797 +15 -1.773 +16 -1.744 +17 -1.710 +18 -1.672 +19 -1.631 +20 -1.585 +21 -1.537 +22 -1.485 +23 -1.431 +24 -1.375 +25 -1.316 +26 -1.255 +27 -1.193 +28 -1.129 +29 -1.064 +30 -0.998 +31 -0.931 +32 -0.864 +33 -0.796 +34 -0.728 +35 -0.659 +36 -0.591 +37 -0.523 +38 -0.455 +39 -0.388 +40 -0.321 +41 -0.255 +42 -0.190 +43 -0.126 +44 -0.062 +45 0.000 +46 0.061 +47 0.122 +48 0.181 +49 0.239 +50 0.295 +51 0.351 +52 0.405 +53 0.458 +54 0.510 +55 0.561 +56 0.611 +57 0.659 +58 0.707 +59 0.754 +60 0.799 +61 0.844 +62 0.889 +63 0.933 +64 0.976 +65 1.019 +66 1.062 +67 1.105 +68 1.148 +69 1.191 +70 1.235 +71 1.279 +72 1.325 +73 1.371 +74 1.418 +75 1.467 +76 1.518 +77 1.571 +78 1.625 +79 1.683 +80 1.743 +81 1.806 +82 1.872 +83 1.942 +84 2.016 +85 2.094 +86 2.177 +87 2.264 +88 2.357 +89 2.456 +90 2.560 +1 -1.627 +2 -1.697 +3 -1.756 +4 -1.806 +5 -1.847 +6 -1.879 +7 -1.903 +8 -1.918 +9 -1.927 +10 -1.928 +11 -1.923 +12 -1.911 +13 -1.894 +14 -1.871 +15 -1.843 +16 -1.810 +17 -1.773 +18 -1.732 +19 -1.686 +20 -1.638 +21 -1.586 +22 -1.531 +23 -1.474 +24 -1.414 +25 -1.352 +26 -1.289 +27 -1.224 +28 -1.157 +29 -1.090 +30 -1.021 +31 -0.952 +32 -0.882 +33 -0.812 +34 -0.742 +35 -0.672 +36 -0.602 +37 -0.532 +38 -0.463 +39 -0.394 +40 -0.326 +41 -0.259 +42 -0.193 +43 -0.127 +44 -0.063 +45 0.000 +46 0.062 +47 0.123 +48 0.182 +49 0.240 +50 0.297 +51 0.352 +52 0.406 +53 0.459 +54 0.511 +55 0.561 +56 0.610 +57 0.658 +58 0.704 +59 0.750 +60 0.795 +61 0.838 +62 0.881 +63 0.924 +64 0.965 +65 1.007 +66 1.048 +67 1.089 +68 1.130 +69 1.171 +70 1.212 +71 1.254 +72 1.297 +73 1.340 +74 1.385 +75 1.431 +76 1.479 +77 1.529 +78 1.580 +79 1.634 +80 1.691 +81 1.751 +82 1.814 +83 1.880 +84 1.951 +85 2.025 +86 2.104 +87 2.188 +88 2.277 +89 2.372 +90 2.472 +1 -1.489 +2 -1.562 +3 -1.626 +4 -1.680 +5 -1.725 +6 -1.761 +7 -1.789 +8 -1.809 +9 -1.822 +10 -1.827 +11 -1.826 +12 -1.819 +13 -1.805 +14 -1.786 +15 -1.762 +16 -1.733 +17 -1.700 +18 -1.663 +19 -1.621 +20 -1.576 +21 -1.528 +22 -1.477 +23 -1.423 +24 -1.367 +25 -1.308 +26 -1.248 +27 -1.186 +28 -1.122 +29 -1.058 +30 -0.992 +31 -0.926 +32 -0.858 +33 -0.791 +34 -0.723 +35 -0.655 +36 -0.587 +37 -0.520 +38 -0.452 +39 -0.386 +40 -0.319 +41 -0.254 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.121 +48 0.180 +49 0.237 +50 0.293 +51 0.349 +52 0.402 +53 0.455 +54 0.507 +55 0.557 +56 0.607 +57 0.655 +58 0.702 +59 0.749 +60 0.794 +61 0.839 +62 0.883 +63 0.927 +64 0.970 +65 1.013 +66 1.055 +67 1.098 +68 1.140 +69 1.184 +70 1.227 +71 1.271 +72 1.316 +73 1.362 +74 1.409 +75 1.458 +76 1.509 +77 1.561 +78 1.616 +79 1.673 +80 1.732 +81 1.795 +82 1.861 +83 1.931 +84 2.005 +85 2.083 +86 2.165 +87 2.252 +88 2.345 +89 2.443 +90 2.547 +1 -1.555 +2 -1.631 +3 -1.696 +4 -1.751 +5 -1.797 +6 -1.834 +7 -1.862 +8 -1.882 +9 -1.895 +10 -1.900 +11 -1.898 +12 -1.890 +13 -1.875 +14 -1.855 +15 -1.830 +16 -1.800 +17 -1.765 +18 -1.725 +19 -1.682 +20 -1.635 +21 -1.585 +22 -1.532 +23 -1.476 +24 -1.417 +25 -1.356 +26 -1.294 +27 -1.229 +28 -1.163 +29 -1.096 +30 -1.028 +31 -0.959 +32 -0.889 +33 -0.819 +34 -0.749 +35 -0.679 +36 -0.608 +37 -0.538 +38 -0.469 +39 -0.399 +40 -0.331 +41 -0.263 +42 -0.196 +43 -0.129 +44 -0.064 +45 0.000 +46 0.063 +47 0.125 +48 0.186 +49 0.245 +50 0.303 +51 0.360 +52 0.416 +53 0.471 +54 0.524 +55 0.576 +56 0.627 +57 0.677 +58 0.726 +59 0.773 +60 0.820 +61 0.867 +62 0.912 +63 0.957 +64 1.001 +65 1.045 +66 1.089 +67 1.133 +68 1.177 +69 1.221 +70 1.266 +71 1.311 +72 1.358 +73 1.405 +74 1.453 +75 1.504 +76 1.555 +77 1.609 +78 1.665 +79 1.724 +80 1.786 +81 1.850 +82 1.918 +83 1.990 +84 2.066 +85 2.146 +86 2.231 +87 2.320 +88 2.416 +89 2.517 +90 2.624 +1 -1.300 +2 -1.379 +3 -1.448 +4 -1.508 +5 -1.558 +6 -1.600 +7 -1.633 +8 -1.659 +9 -1.677 +10 -1.688 +11 -1.692 +12 -1.690 +13 -1.683 +14 -1.669 +15 -1.650 +16 -1.627 +17 -1.599 +18 -1.566 +19 -1.530 +20 -1.490 +21 -1.447 +22 -1.401 +23 -1.352 +24 -1.300 +25 -1.246 +26 -1.190 +27 -1.133 +28 -1.073 +29 -1.013 +30 -0.951 +31 -0.888 +32 -0.825 +33 -0.761 +34 -0.697 +35 -0.632 +36 -0.567 +37 -0.502 +38 -0.438 +39 -0.374 +40 -0.310 +41 -0.246 +42 -0.184 +43 -0.122 +44 -0.060 +45 0.000 +46 0.060 +47 0.118 +48 0.176 +49 0.233 +50 0.288 +51 0.343 +52 0.396 +53 0.449 +54 0.501 +55 0.551 +56 0.601 +57 0.650 +58 0.698 +59 0.745 +60 0.792 +61 0.838 +62 0.884 +63 0.929 +64 0.974 +65 1.018 +66 1.063 +67 1.108 +68 1.153 +69 1.199 +70 1.245 +71 1.292 +72 1.340 +73 1.389 +74 1.440 +75 1.492 +76 1.546 +77 1.602 +78 1.660 +79 1.721 +80 1.785 +81 1.852 +82 1.922 +83 1.996 +84 2.074 +85 2.156 +86 2.243 +87 2.335 +88 2.432 +89 2.535 +90 2.644 +1 -1.365 +2 -1.440 +3 -1.506 +4 -1.562 +5 -1.609 +6 -1.647 +7 -1.678 +8 -1.700 +9 -1.716 +10 -1.724 +11 -1.726 +12 -1.721 +13 -1.711 +14 -1.695 +15 -1.674 +16 -1.649 +17 -1.619 +18 -1.585 +19 -1.546 +20 -1.505 +21 -1.460 +22 -1.412 +23 -1.362 +24 -1.309 +25 -1.254 +26 -1.197 +27 -1.138 +28 -1.078 +29 -1.017 +30 -0.954 +31 -0.891 +32 -0.827 +33 -0.762 +34 -0.697 +35 -0.632 +36 -0.567 +37 -0.502 +38 -0.437 +39 -0.373 +40 -0.309 +41 -0.246 +42 -0.183 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.117 +48 0.175 +49 0.231 +50 0.286 +51 0.340 +52 0.393 +53 0.445 +54 0.495 +55 0.545 +56 0.594 +57 0.642 +58 0.689 +59 0.735 +60 0.780 +61 0.825 +62 0.869 +63 0.913 +64 0.956 +65 0.999 +66 1.042 +67 1.086 +68 1.129 +69 1.173 +70 1.217 +71 1.262 +72 1.308 +73 1.355 +74 1.403 +75 1.453 +76 1.505 +77 1.558 +78 1.614 +79 1.672 +80 1.733 +81 1.798 +82 1.865 +83 1.936 +84 2.011 +85 2.090 +86 2.174 +87 2.262 +88 2.356 +89 2.455 +90 2.560 +1 -1.068 +2 -1.153 +3 -1.229 +4 -1.295 +5 -1.352 +6 -1.400 +7 -1.441 +8 -1.473 +9 -1.498 +10 -1.516 +11 -1.527 +12 -1.532 +13 -1.530 +14 -1.524 +15 -1.512 +16 -1.495 +17 -1.473 +18 -1.447 +19 -1.417 +20 -1.383 +21 -1.346 +22 -1.306 +23 -1.263 +24 -1.217 +25 -1.169 +26 -1.119 +27 -1.066 +28 -1.012 +29 -0.957 +30 -0.900 +31 -0.842 +32 -0.783 +33 -0.724 +34 -0.663 +35 -0.603 +36 -0.542 +37 -0.481 +38 -0.420 +39 -0.359 +40 -0.298 +41 -0.237 +42 -0.177 +43 -0.118 +44 -0.058 +45 0.000 +46 0.058 +47 0.115 +48 0.171 +49 0.227 +50 0.282 +51 0.336 +52 0.389 +53 0.441 +54 0.493 +55 0.544 +56 0.594 +57 0.644 +58 0.693 +59 0.741 +60 0.789 +61 0.837 +62 0.884 +63 0.931 +64 0.979 +65 1.026 +66 1.073 +67 1.121 +68 1.169 +69 1.217 +70 1.267 +71 1.317 +72 1.369 +73 1.422 +74 1.477 +75 1.533 +76 1.591 +77 1.651 +78 1.714 +79 1.780 +80 1.848 +81 1.920 +82 1.995 +83 2.074 +84 2.157 +85 2.245 +86 2.337 +87 2.434 +88 2.537 +89 2.645 +90 2.759 +1 -1.227 +2 -1.309 +3 -1.380 +4 -1.442 +5 -1.495 +6 -1.539 +7 -1.575 +8 -1.603 +9 -1.623 +10 -1.636 +11 -1.643 +12 -1.643 +13 -1.638 +14 -1.626 +15 -1.610 +16 -1.588 +17 -1.562 +18 -1.532 +19 -1.498 +20 -1.460 +21 -1.418 +22 -1.374 +23 -1.327 +24 -1.277 +25 -1.224 +26 -1.170 +27 -1.114 +28 -1.056 +29 -0.997 +30 -0.937 +31 -0.876 +32 -0.814 +33 -0.751 +34 -0.688 +35 -0.624 +36 -0.560 +37 -0.497 +38 -0.433 +39 -0.370 +40 -0.307 +41 -0.244 +42 -0.182 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.117 +48 0.175 +49 0.231 +50 0.287 +51 0.341 +52 0.395 +53 0.448 +54 0.499 +55 0.550 +56 0.600 +57 0.649 +58 0.698 +59 0.746 +60 0.793 +61 0.840 +62 0.886 +63 0.932 +64 0.977 +65 1.023 +66 1.069 +67 1.115 +68 1.161 +69 1.208 +70 1.255 +71 1.303 +72 1.353 +73 1.403 +74 1.455 +75 1.509 +76 1.564 +77 1.622 +78 1.682 +79 1.745 +80 1.810 +81 1.879 +82 1.951 +83 2.027 +84 2.107 +85 2.192 +86 2.281 +87 2.375 +88 2.474 +89 2.579 +90 2.690 +1 -0.995 +2 -1.083 +3 -1.161 +4 -1.230 +5 -1.289 +6 -1.340 +7 -1.382 +8 -1.417 +9 -1.444 +10 -1.464 +11 -1.477 +12 -1.484 +13 -1.485 +14 -1.481 +15 -1.471 +16 -1.456 +17 -1.436 +18 -1.412 +19 -1.385 +20 -1.353 +21 -1.318 +22 -1.279 +23 -1.238 +24 -1.194 +25 -1.147 +26 -1.099 +27 -1.048 +28 -0.995 +29 -0.941 +30 -0.886 +31 -0.829 +32 -0.772 +33 -0.714 +34 -0.655 +35 -0.595 +36 -0.535 +37 -0.475 +38 -0.415 +39 -0.355 +40 -0.295 +41 -0.235 +42 -0.176 +43 -0.117 +44 -0.058 +45 0.000 +46 0.057 +47 0.114 +48 0.170 +49 0.226 +50 0.280 +51 0.334 +52 0.388 +53 0.440 +54 0.492 +55 0.543 +56 0.594 +57 0.644 +58 0.693 +59 0.742 +60 0.791 +61 0.839 +62 0.887 +63 0.935 +64 0.983 +65 1.031 +66 1.079 +67 1.128 +68 1.177 +69 1.227 +70 1.278 +71 1.330 +72 1.383 +73 1.437 +74 1.493 +75 1.551 +76 1.611 +77 1.673 +78 1.737 +79 1.805 +80 1.875 +81 1.949 +82 2.026 +83 2.107 +84 2.192 +85 2.281 +86 2.375 +87 2.475 +88 2.579 +89 2.690 +90 2.806 +1 -1.181 +2 -1.262 +3 -1.333 +4 -1.395 +5 -1.448 +6 -1.492 +7 -1.528 +8 -1.557 +9 -1.577 +10 -1.591 +11 -1.599 +12 -1.600 +13 -1.595 +14 -1.585 +15 -1.569 +16 -1.549 +17 -1.524 +18 -1.495 +19 -1.462 +20 -1.425 +21 -1.385 +22 -1.342 +23 -1.296 +24 -1.248 +25 -1.197 +26 -1.144 +27 -1.090 +28 -1.033 +29 -0.976 +30 -0.917 +31 -0.857 +32 -0.797 +33 -0.735 +34 -0.673 +35 -0.611 +36 -0.549 +37 -0.487 +38 -0.425 +39 -0.362 +40 -0.301 +41 -0.239 +42 -0.179 +43 -0.118 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.172 +49 0.227 +50 0.282 +51 0.336 +52 0.388 +53 0.440 +54 0.491 +55 0.541 +56 0.591 +57 0.639 +58 0.687 +59 0.735 +60 0.781 +61 0.827 +62 0.873 +63 0.919 +64 0.964 +65 1.009 +66 1.055 +67 1.100 +68 1.146 +69 1.193 +70 1.240 +71 1.288 +72 1.337 +73 1.387 +74 1.439 +75 1.493 +76 1.548 +77 1.605 +78 1.665 +79 1.728 +80 1.793 +81 1.861 +82 1.933 +83 2.009 +84 2.088 +85 2.172 +86 2.260 +87 2.354 +88 2.453 +89 2.557 +90 2.667 +1 -1.028 +2 -1.111 +3 -1.184 +4 -1.248 +5 -1.303 +6 -1.350 +7 -1.389 +8 -1.420 +9 -1.444 +10 -1.462 +11 -1.473 +12 -1.477 +13 -1.476 +14 -1.470 +15 -1.458 +16 -1.442 +17 -1.421 +18 -1.396 +19 -1.368 +20 -1.335 +21 -1.300 +22 -1.261 +23 -1.219 +24 -1.175 +25 -1.128 +26 -1.080 +27 -1.029 +28 -0.977 +29 -0.924 +30 -0.869 +31 -0.813 +32 -0.756 +33 -0.699 +34 -0.641 +35 -0.582 +36 -0.523 +37 -0.464 +38 -0.405 +39 -0.346 +40 -0.288 +41 -0.229 +42 -0.171 +43 -0.114 +44 -0.057 +45 0.000 +46 0.056 +47 0.111 +48 0.166 +49 0.219 +50 0.272 +51 0.325 +52 0.376 +53 0.427 +54 0.477 +55 0.526 +56 0.575 +57 0.623 +58 0.670 +59 0.717 +60 0.764 +61 0.810 +62 0.856 +63 0.901 +64 0.947 +65 0.993 +66 1.039 +67 1.085 +68 1.132 +69 1.179 +70 1.227 +71 1.276 +72 1.326 +73 1.378 +74 1.431 +75 1.485 +76 1.542 +77 1.601 +78 1.662 +79 1.725 +80 1.792 +81 1.862 +82 1.935 +83 2.012 +84 2.092 +85 2.177 +86 2.267 +87 2.361 +88 2.461 +89 2.566 +90 2.677 +1 -1.166 +2 -1.244 +3 -1.312 +4 -1.371 +5 -1.422 +6 -1.464 +7 -1.499 +8 -1.525 +9 -1.545 +10 -1.558 +11 -1.564 +12 -1.565 +13 -1.559 +14 -1.549 +15 -1.533 +16 -1.513 +17 -1.488 +18 -1.459 +19 -1.427 +20 -1.391 +21 -1.351 +22 -1.309 +23 -1.264 +24 -1.216 +25 -1.167 +26 -1.115 +27 -1.062 +28 -1.007 +29 -0.950 +30 -0.893 +31 -0.835 +32 -0.775 +33 -0.716 +34 -0.655 +35 -0.595 +36 -0.534 +37 -0.473 +38 -0.413 +39 -0.352 +40 -0.292 +41 -0.233 +42 -0.174 +43 -0.115 +44 -0.057 +45 0.000 +46 0.056 +47 0.112 +48 0.167 +49 0.221 +50 0.274 +51 0.326 +52 0.377 +53 0.427 +54 0.476 +55 0.525 +56 0.573 +57 0.620 +58 0.666 +59 0.712 +60 0.757 +61 0.801 +62 0.846 +63 0.890 +64 0.933 +65 0.977 +66 1.021 +67 1.065 +68 1.109 +69 1.154 +70 1.199 +71 1.245 +72 1.292 +73 1.341 +74 1.391 +75 1.442 +76 1.495 +77 1.551 +78 1.608 +79 1.668 +80 1.731 +81 1.797 +82 1.866 +83 1.939 +84 2.016 +85 2.096 +86 2.182 +87 2.272 +88 2.367 +89 2.468 +90 2.574 +1 -1.077 +2 -1.156 +3 -1.226 +4 -1.286 +5 -1.338 +6 -1.382 +7 -1.418 +8 -1.446 +9 -1.468 +10 -1.482 +11 -1.491 +12 -1.493 +13 -1.490 +14 -1.482 +15 -1.469 +16 -1.451 +17 -1.428 +18 -1.402 +19 -1.372 +20 -1.338 +21 -1.301 +22 -1.261 +23 -1.219 +24 -1.174 +25 -1.127 +26 -1.078 +27 -1.027 +28 -0.974 +29 -0.920 +30 -0.865 +31 -0.809 +32 -0.752 +33 -0.694 +34 -0.636 +35 -0.578 +36 -0.519 +37 -0.460 +38 -0.402 +39 -0.343 +40 -0.285 +41 -0.227 +42 -0.169 +43 -0.112 +44 -0.056 +45 0.000 +46 0.055 +47 0.110 +48 0.163 +49 0.216 +50 0.268 +51 0.319 +52 0.370 +53 0.419 +54 0.468 +55 0.516 +56 0.564 +57 0.610 +58 0.656 +59 0.702 +60 0.747 +61 0.791 +62 0.836 +63 0.880 +64 0.924 +65 0.968 +66 1.012 +67 1.056 +68 1.101 +69 1.146 +70 1.192 +71 1.239 +72 1.287 +73 1.336 +74 1.386 +75 1.439 +76 1.493 +77 1.549 +78 1.607 +79 1.668 +80 1.732 +81 1.798 +82 1.868 +83 1.942 +84 2.019 +85 2.101 +86 2.187 +87 2.277 +88 2.373 +89 2.474 +90 2.581 +1 -1.205 +2 -1.282 +3 -1.349 +4 -1.407 +5 -1.456 +6 -1.497 +7 -1.530 +8 -1.555 +9 -1.574 +10 -1.585 +11 -1.591 +12 -1.590 +13 -1.583 +14 -1.571 +15 -1.555 +16 -1.533 +17 -1.507 +18 -1.477 +19 -1.444 +20 -1.406 +21 -1.366 +22 -1.323 +23 -1.277 +24 -1.228 +25 -1.178 +26 -1.125 +27 -1.071 +28 -1.015 +29 -0.958 +30 -0.900 +31 -0.841 +32 -0.781 +33 -0.721 +34 -0.660 +35 -0.599 +36 -0.537 +37 -0.476 +38 -0.415 +39 -0.354 +40 -0.294 +41 -0.234 +42 -0.174 +43 -0.116 +44 -0.057 +45 0.000 +46 0.057 +47 0.112 +48 0.167 +49 0.221 +50 0.274 +51 0.326 +52 0.377 +53 0.427 +54 0.477 +55 0.525 +56 0.573 +57 0.619 +58 0.665 +59 0.711 +60 0.755 +61 0.800 +62 0.843 +63 0.887 +64 0.930 +65 0.973 +66 1.016 +67 1.060 +68 1.103 +69 1.147 +70 1.192 +71 1.237 +72 1.284 +73 1.332 +74 1.381 +75 1.431 +76 1.484 +77 1.538 +78 1.595 +79 1.654 +80 1.716 +81 1.781 +82 1.849 +83 1.921 +84 1.996 +85 2.076 +86 2.160 +87 2.249 +88 2.343 +89 2.443 +90 2.548 +1 -1.078 +2 -1.157 +3 -1.226 +4 -1.287 +5 -1.339 +6 -1.383 +7 -1.419 +8 -1.447 +9 -1.469 +10 -1.484 +11 -1.492 +12 -1.495 +13 -1.492 +14 -1.484 +15 -1.470 +16 -1.452 +17 -1.430 +18 -1.404 +19 -1.373 +20 -1.340 +21 -1.303 +22 -1.263 +23 -1.220 +24 -1.175 +25 -1.128 +26 -1.079 +27 -1.028 +28 -0.975 +29 -0.921 +30 -0.866 +31 -0.810 +32 -0.753 +33 -0.695 +34 -0.637 +35 -0.578 +36 -0.520 +37 -0.461 +38 -0.402 +39 -0.344 +40 -0.285 +41 -0.227 +42 -0.169 +43 -0.112 +44 -0.056 +45 0.000 +46 0.055 +47 0.110 +48 0.163 +49 0.216 +50 0.268 +51 0.320 +52 0.370 +53 0.420 +54 0.468 +55 0.517 +56 0.564 +57 0.611 +58 0.657 +59 0.702 +60 0.747 +61 0.792 +62 0.836 +63 0.880 +64 0.924 +65 0.968 +66 1.012 +67 1.056 +68 1.101 +69 1.146 +70 1.192 +71 1.239 +72 1.287 +73 1.336 +74 1.386 +75 1.438 +76 1.492 +77 1.548 +78 1.607 +79 1.667 +80 1.731 +81 1.798 +82 1.868 +83 1.941 +84 2.018 +85 2.100 +86 2.186 +87 2.276 +88 2.372 +89 2.473 +90 2.580 +1 -1.167 +2 -1.245 +3 -1.313 +4 -1.373 +5 -1.423 +6 -1.465 +7 -1.499 +8 -1.526 +9 -1.546 +10 -1.558 +11 -1.565 +12 -1.565 +13 -1.560 +14 -1.549 +15 -1.533 +16 -1.513 +17 -1.488 +18 -1.459 +19 -1.427 +20 -1.391 +21 -1.351 +22 -1.309 +23 -1.264 +24 -1.216 +25 -1.167 +26 -1.115 +27 -1.062 +28 -1.007 +29 -0.950 +30 -0.893 +31 -0.835 +32 -0.775 +33 -0.716 +34 -0.655 +35 -0.595 +36 -0.534 +37 -0.473 +38 -0.413 +39 -0.352 +40 -0.292 +41 -0.233 +42 -0.174 +43 -0.115 +44 -0.057 +45 0.000 +46 0.056 +47 0.112 +48 0.167 +49 0.221 +50 0.274 +51 0.326 +52 0.377 +53 0.427 +54 0.476 +55 0.525 +56 0.573 +57 0.620 +58 0.666 +59 0.712 +60 0.757 +61 0.801 +62 0.846 +63 0.890 +64 0.933 +65 0.977 +66 1.021 +67 1.065 +68 1.109 +69 1.154 +70 1.199 +71 1.245 +72 1.292 +73 1.341 +74 1.391 +75 1.442 +76 1.495 +77 1.551 +78 1.608 +79 1.668 +80 1.731 +81 1.797 +82 1.866 +83 1.939 +84 2.016 +85 2.096 +86 2.182 +87 2.272 +88 2.367 +89 2.468 +90 2.574 +1 -1.029 +2 -1.112 +3 -1.186 +4 -1.250 +5 -1.305 +6 -1.352 +7 -1.391 +8 -1.422 +9 -1.446 +10 -1.464 +11 -1.475 +12 -1.479 +13 -1.478 +14 -1.472 +15 -1.460 +16 -1.444 +17 -1.423 +18 -1.398 +19 -1.369 +20 -1.337 +21 -1.301 +22 -1.262 +23 -1.221 +24 -1.176 +25 -1.130 +26 -1.081 +27 -1.031 +28 -0.979 +29 -0.925 +30 -0.870 +31 -0.814 +32 -0.757 +33 -0.700 +34 -0.641 +35 -0.583 +36 -0.524 +37 -0.465 +38 -0.406 +39 -0.347 +40 -0.288 +41 -0.230 +42 -0.171 +43 -0.114 +44 -0.057 +45 0.000 +46 0.056 +47 0.111 +48 0.166 +49 0.219 +50 0.273 +51 0.325 +52 0.376 +53 0.427 +54 0.477 +55 0.526 +56 0.575 +57 0.623 +58 0.670 +59 0.717 +60 0.764 +61 0.810 +62 0.856 +63 0.902 +64 0.947 +65 0.993 +66 1.039 +67 1.085 +68 1.132 +69 1.179 +70 1.227 +71 1.276 +72 1.326 +73 1.378 +74 1.430 +75 1.485 +76 1.542 +77 1.600 +78 1.662 +79 1.725 +80 1.792 +81 1.862 +82 1.935 +83 2.012 +84 2.092 +85 2.177 +86 2.267 +87 2.361 +88 2.461 +89 2.566 +90 2.677 +1 -1.184 +2 -1.265 +3 -1.336 +4 -1.398 +5 -1.451 +6 -1.495 +7 -1.531 +8 -1.559 +9 -1.580 +10 -1.594 +11 -1.601 +12 -1.603 +13 -1.598 +14 -1.587 +15 -1.572 +16 -1.551 +17 -1.526 +18 -1.497 +19 -1.464 +20 -1.427 +21 -1.387 +22 -1.344 +23 -1.298 +24 -1.249 +25 -1.199 +26 -1.146 +27 -1.091 +28 -1.035 +29 -0.977 +30 -0.918 +31 -0.858 +32 -0.797 +33 -0.736 +34 -0.674 +35 -0.612 +36 -0.550 +37 -0.487 +38 -0.425 +39 -0.363 +40 -0.301 +41 -0.240 +42 -0.179 +43 -0.118 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.172 +49 0.227 +50 0.282 +51 0.336 +52 0.388 +53 0.440 +54 0.491 +55 0.542 +56 0.591 +57 0.640 +58 0.687 +59 0.735 +60 0.781 +61 0.828 +62 0.873 +63 0.919 +64 0.964 +65 1.009 +66 1.055 +67 1.100 +68 1.146 +69 1.193 +70 1.240 +71 1.288 +72 1.337 +73 1.387 +74 1.439 +75 1.493 +76 1.548 +77 1.605 +78 1.665 +79 1.728 +80 1.793 +81 1.861 +82 1.933 +83 2.009 +84 2.089 +85 2.172 +86 2.261 +87 2.354 +88 2.453 +89 2.558 +90 2.668 +1 -1.000 +2 -1.088 +3 -1.165 +4 -1.234 +5 -1.293 +6 -1.344 +7 -1.386 +8 -1.420 +9 -1.447 +10 -1.467 +11 -1.481 +12 -1.487 +13 -1.488 +14 -1.484 +15 -1.474 +16 -1.459 +17 -1.439 +18 -1.415 +19 -1.387 +20 -1.355 +21 -1.320 +22 -1.281 +23 -1.240 +24 -1.195 +25 -1.149 +26 -1.100 +27 -1.049 +28 -0.997 +29 -0.942 +30 -0.887 +31 -0.830 +32 -0.773 +33 -0.714 +34 -0.655 +35 -0.596 +36 -0.536 +37 -0.476 +38 -0.415 +39 -0.355 +40 -0.295 +41 -0.235 +42 -0.176 +43 -0.117 +44 -0.058 +45 0.000 +46 0.057 +47 0.114 +48 0.170 +49 0.226 +50 0.281 +51 0.335 +52 0.388 +53 0.440 +54 0.492 +55 0.543 +56 0.594 +57 0.644 +58 0.693 +59 0.742 +60 0.791 +61 0.839 +62 0.887 +63 0.935 +64 0.983 +65 1.031 +66 1.079 +67 1.128 +68 1.177 +69 1.227 +70 1.278 +71 1.330 +72 1.383 +73 1.437 +74 1.493 +75 1.551 +76 1.611 +77 1.673 +78 1.737 +79 1.805 +80 1.875 +81 1.949 +82 2.026 +83 2.107 +84 2.192 +85 2.282 +86 2.376 +87 2.475 +88 2.580 +89 2.690 +90 2.807 +1 -1.232 +2 -1.313 +3 -1.385 +4 -1.446 +5 -1.499 +6 -1.543 +7 -1.578 +8 -1.606 +9 -1.626 +10 -1.640 +11 -1.646 +12 -1.646 +13 -1.640 +14 -1.629 +15 -1.612 +16 -1.591 +17 -1.564 +18 -1.534 +19 -1.500 +20 -1.461 +21 -1.420 +22 -1.375 +23 -1.328 +24 -1.278 +25 -1.226 +26 -1.172 +27 -1.115 +28 -1.058 +29 -0.998 +30 -0.938 +31 -0.877 +32 -0.814 +33 -0.752 +34 -0.688 +35 -0.625 +36 -0.561 +37 -0.497 +38 -0.434 +39 -0.370 +40 -0.307 +41 -0.244 +42 -0.182 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.118 +48 0.175 +49 0.232 +50 0.287 +51 0.342 +52 0.395 +53 0.448 +54 0.500 +55 0.551 +56 0.601 +57 0.650 +58 0.699 +59 0.747 +60 0.794 +61 0.841 +62 0.887 +63 0.933 +64 0.979 +65 1.025 +66 1.070 +67 1.116 +68 1.163 +69 1.210 +70 1.257 +71 1.305 +72 1.355 +73 1.405 +74 1.457 +75 1.511 +76 1.567 +77 1.624 +78 1.684 +79 1.747 +80 1.813 +81 1.882 +82 1.954 +83 2.030 +84 2.110 +85 2.194 +86 2.283 +87 2.377 +88 2.476 +89 2.581 +90 2.692 +1 -1.072 +2 -1.158 +3 -1.233 +4 -1.299 +5 -1.356 +6 -1.404 +7 -1.444 +8 -1.476 +9 -1.501 +10 -1.519 +11 -1.530 +12 -1.534 +13 -1.533 +14 -1.526 +15 -1.514 +16 -1.497 +17 -1.475 +18 -1.449 +19 -1.419 +20 -1.385 +21 -1.348 +22 -1.308 +23 -1.265 +24 -1.219 +25 -1.170 +26 -1.120 +27 -1.068 +28 -1.013 +29 -0.958 +30 -0.901 +31 -0.843 +32 -0.784 +33 -0.724 +34 -0.664 +35 -0.603 +36 -0.542 +37 -0.481 +38 -0.420 +39 -0.359 +40 -0.298 +41 -0.238 +42 -0.177 +43 -0.118 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.171 +49 0.227 +50 0.282 +51 0.336 +52 0.389 +53 0.442 +54 0.494 +55 0.545 +56 0.595 +57 0.644 +58 0.693 +59 0.742 +60 0.790 +61 0.838 +62 0.885 +63 0.932 +64 0.979 +65 1.027 +66 1.074 +67 1.122 +68 1.170 +69 1.218 +70 1.268 +71 1.319 +72 1.370 +73 1.423 +74 1.478 +75 1.534 +76 1.592 +77 1.653 +78 1.716 +79 1.781 +80 1.850 +81 1.922 +82 1.997 +83 2.076 +84 2.159 +85 2.247 +86 2.339 +87 2.436 +88 2.539 +89 2.647 +90 2.761 +1 -1.368 +2 -1.444 +3 -1.509 +4 -1.565 +5 -1.612 +6 -1.650 +7 -1.681 +8 -1.703 +9 -1.718 +10 -1.727 +11 -1.728 +12 -1.724 +13 -1.713 +14 -1.698 +15 -1.677 +16 -1.651 +17 -1.621 +18 -1.586 +19 -1.548 +20 -1.507 +21 -1.462 +22 -1.414 +23 -1.363 +24 -1.310 +25 -1.255 +26 -1.198 +27 -1.139 +28 -1.079 +29 -1.018 +30 -0.955 +31 -0.892 +32 -0.827 +33 -0.763 +34 -0.698 +35 -0.633 +36 -0.568 +37 -0.503 +38 -0.438 +39 -0.373 +40 -0.309 +41 -0.246 +42 -0.183 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.118 +48 0.175 +49 0.231 +50 0.286 +51 0.340 +52 0.393 +53 0.445 +54 0.496 +55 0.545 +56 0.594 +57 0.642 +58 0.689 +59 0.735 +60 0.781 +61 0.826 +62 0.870 +63 0.914 +64 0.957 +65 1.000 +66 1.043 +67 1.087 +68 1.130 +69 1.174 +70 1.218 +71 1.263 +72 1.309 +73 1.356 +74 1.404 +75 1.454 +76 1.506 +77 1.560 +78 1.615 +79 1.674 +80 1.735 +81 1.799 +82 1.866 +83 1.937 +84 2.012 +85 2.092 +86 2.175 +87 2.264 +88 2.358 +89 2.457 +90 2.562 +1 -1.305 +2 -1.384 +3 -1.452 +4 -1.512 +5 -1.562 +6 -1.604 +7 -1.637 +8 -1.662 +9 -1.680 +10 -1.691 +11 -1.695 +12 -1.693 +13 -1.685 +14 -1.672 +15 -1.653 +16 -1.629 +17 -1.601 +18 -1.568 +19 -1.532 +20 -1.492 +21 -1.449 +22 -1.402 +23 -1.353 +24 -1.301 +25 -1.247 +26 -1.192 +27 -1.134 +28 -1.074 +29 -1.014 +30 -0.952 +31 -0.889 +32 -0.826 +33 -0.762 +34 -0.697 +35 -0.633 +36 -0.568 +37 -0.503 +38 -0.438 +39 -0.374 +40 -0.310 +41 -0.247 +42 -0.184 +43 -0.122 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.176 +49 0.233 +50 0.289 +51 0.343 +52 0.397 +53 0.450 +54 0.501 +55 0.552 +56 0.602 +57 0.651 +58 0.699 +59 0.746 +60 0.793 +61 0.839 +62 0.885 +63 0.930 +64 0.975 +65 1.020 +66 1.065 +67 1.110 +68 1.155 +69 1.201 +70 1.247 +71 1.294 +72 1.342 +73 1.391 +74 1.442 +75 1.494 +76 1.548 +77 1.604 +78 1.663 +79 1.724 +80 1.788 +81 1.855 +82 1.925 +83 1.999 +84 2.077 +85 2.159 +86 2.246 +87 2.338 +88 2.435 +89 2.538 +90 2.647 +1 -1.559 +2 -1.635 +3 -1.700 +4 -1.755 +5 -1.801 +6 -1.838 +7 -1.866 +8 -1.886 +9 -1.899 +10 -1.904 +11 -1.902 +12 -1.894 +13 -1.879 +14 -1.859 +15 -1.834 +16 -1.803 +17 -1.768 +18 -1.729 +19 -1.686 +20 -1.639 +21 -1.588 +22 -1.535 +23 -1.479 +24 -1.420 +25 -1.359 +26 -1.296 +27 -1.232 +28 -1.166 +29 -1.098 +30 -1.030 +31 -0.961 +32 -0.891 +33 -0.821 +34 -0.750 +35 -0.680 +36 -0.610 +37 -0.539 +38 -0.469 +39 -0.400 +40 -0.331 +41 -0.263 +42 -0.196 +43 -0.130 +44 -0.064 +45 0.000 +46 0.063 +47 0.125 +48 0.186 +49 0.246 +50 0.304 +51 0.361 +52 0.417 +53 0.472 +54 0.525 +55 0.577 +56 0.628 +57 0.678 +58 0.727 +59 0.775 +60 0.822 +61 0.868 +62 0.914 +63 0.959 +64 1.003 +65 1.047 +66 1.091 +67 1.135 +68 1.179 +69 1.223 +70 1.268 +71 1.313 +72 1.360 +73 1.407 +74 1.456 +75 1.506 +76 1.558 +77 1.612 +78 1.668 +79 1.726 +80 1.788 +81 1.853 +82 1.921 +83 1.992 +84 2.068 +85 2.148 +86 2.233 +87 2.323 +88 2.419 +89 2.520 +90 2.627 +1 -1.494 +2 -1.568 +3 -1.631 +4 -1.685 +5 -1.730 +6 -1.766 +7 -1.794 +8 -1.814 +9 -1.826 +10 -1.832 +11 -1.830 +12 -1.823 +13 -1.809 +14 -1.790 +15 -1.766 +16 -1.737 +17 -1.704 +18 -1.666 +19 -1.624 +20 -1.579 +21 -1.531 +22 -1.480 +23 -1.426 +24 -1.369 +25 -1.311 +26 -1.250 +27 -1.188 +28 -1.125 +29 -1.060 +30 -0.994 +31 -0.927 +32 -0.860 +33 -0.792 +34 -0.725 +35 -0.657 +36 -0.589 +37 -0.521 +38 -0.453 +39 -0.386 +40 -0.320 +41 -0.254 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.121 +48 0.180 +49 0.238 +50 0.294 +51 0.349 +52 0.403 +53 0.456 +54 0.508 +55 0.559 +56 0.608 +57 0.656 +58 0.704 +59 0.750 +60 0.796 +61 0.841 +62 0.885 +63 0.929 +64 0.972 +65 1.015 +66 1.058 +67 1.100 +68 1.143 +69 1.186 +70 1.230 +71 1.274 +72 1.319 +73 1.365 +74 1.413 +75 1.462 +76 1.512 +77 1.565 +78 1.619 +79 1.676 +80 1.736 +81 1.799 +82 1.865 +83 1.935 +84 2.009 +85 2.086 +86 2.169 +87 2.256 +88 2.349 +89 2.447 +90 2.551 +1 -1.633 +2 -1.702 +3 -1.762 +4 -1.811 +5 -1.852 +6 -1.884 +7 -1.907 +8 -1.923 +9 -1.931 +10 -1.933 +11 -1.927 +12 -1.916 +13 -1.898 +14 -1.875 +15 -1.847 +16 -1.814 +17 -1.777 +18 -1.735 +19 -1.690 +20 -1.641 +21 -1.589 +22 -1.534 +23 -1.477 +24 -1.417 +25 -1.355 +26 -1.291 +27 -1.226 +28 -1.159 +29 -1.092 +30 -1.023 +31 -0.954 +32 -0.884 +33 -0.814 +34 -0.743 +35 -0.673 +36 -0.603 +37 -0.533 +38 -0.464 +39 -0.395 +40 -0.327 +41 -0.259 +42 -0.193 +43 -0.128 +44 -0.063 +45 0.000 +46 0.062 +47 0.123 +48 0.182 +49 0.241 +50 0.297 +51 0.353 +52 0.407 +53 0.460 +54 0.512 +55 0.562 +56 0.611 +57 0.659 +58 0.706 +59 0.752 +60 0.796 +61 0.840 +62 0.883 +63 0.926 +64 0.968 +65 1.009 +66 1.050 +67 1.091 +68 1.132 +69 1.173 +70 1.215 +71 1.257 +72 1.300 +73 1.344 +74 1.388 +75 1.435 +76 1.483 +77 1.532 +78 1.584 +79 1.638 +80 1.695 +81 1.755 +82 1.818 +83 1.885 +84 1.955 +85 2.030 +86 2.109 +87 2.193 +88 2.282 +89 2.376 +90 2.477 +1 -1.503 +2 -1.577 +3 -1.641 +4 -1.695 +5 -1.740 +6 -1.776 +7 -1.804 +8 -1.824 +9 -1.837 +10 -1.842 +11 -1.841 +12 -1.833 +13 -1.820 +14 -1.801 +15 -1.777 +16 -1.747 +17 -1.714 +18 -1.676 +19 -1.634 +20 -1.589 +21 -1.540 +22 -1.489 +23 -1.434 +24 -1.378 +25 -1.319 +26 -1.258 +27 -1.195 +28 -1.131 +29 -1.066 +30 -1.000 +31 -0.933 +32 -0.865 +33 -0.797 +34 -0.729 +35 -0.661 +36 -0.592 +37 -0.524 +38 -0.456 +39 -0.389 +40 -0.322 +41 -0.256 +42 -0.191 +43 -0.126 +44 -0.063 +45 0.000 +46 0.061 +47 0.122 +48 0.181 +49 0.239 +50 0.296 +51 0.352 +52 0.406 +53 0.459 +54 0.511 +55 0.562 +56 0.612 +57 0.661 +58 0.708 +59 0.755 +60 0.801 +61 0.846 +62 0.891 +63 0.935 +64 0.978 +65 1.022 +66 1.065 +67 1.108 +68 1.151 +69 1.194 +70 1.238 +71 1.282 +72 1.328 +73 1.374 +74 1.422 +75 1.471 +76 1.522 +77 1.575 +78 1.629 +79 1.687 +80 1.747 +81 1.810 +82 1.877 +83 1.947 +84 2.021 +85 2.099 +86 2.182 +87 2.270 +88 2.363 +89 2.461 +90 2.566 +1 -1.508 +2 -1.580 +3 -1.643 +4 -1.695 +5 -1.739 +6 -1.774 +7 -1.801 +8 -1.820 +9 -1.831 +10 -1.836 +11 -1.834 +12 -1.826 +13 -1.812 +14 -1.792 +15 -1.768 +16 -1.738 +17 -1.704 +18 -1.666 +19 -1.624 +20 -1.579 +21 -1.530 +22 -1.479 +23 -1.424 +24 -1.368 +25 -1.309 +26 -1.249 +27 -1.186 +28 -1.123 +29 -1.058 +30 -0.992 +31 -0.925 +32 -0.858 +33 -0.791 +34 -0.723 +35 -0.655 +36 -0.587 +37 -0.519 +38 -0.452 +39 -0.385 +40 -0.319 +41 -0.253 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.121 +48 0.179 +49 0.236 +50 0.293 +51 0.348 +52 0.401 +53 0.454 +54 0.505 +55 0.555 +56 0.605 +57 0.653 +58 0.700 +59 0.746 +60 0.791 +61 0.835 +62 0.879 +63 0.922 +64 0.965 +65 1.007 +66 1.049 +67 1.091 +68 1.134 +69 1.176 +70 1.219 +71 1.262 +72 1.307 +73 1.352 +74 1.399 +75 1.447 +76 1.496 +77 1.548 +78 1.601 +79 1.657 +80 1.716 +81 1.778 +82 1.843 +83 1.911 +84 1.984 +85 2.060 +86 2.141 +87 2.227 +88 2.318 +89 2.415 +90 2.517 +1 -1.273 +2 -1.350 +3 -1.417 +4 -1.475 +5 -1.524 +6 -1.565 +7 -1.597 +8 -1.622 +9 -1.639 +10 -1.650 +11 -1.654 +12 -1.652 +13 -1.645 +14 -1.631 +15 -1.613 +16 -1.590 +17 -1.563 +18 -1.531 +19 -1.496 +20 -1.457 +21 -1.414 +22 -1.369 +23 -1.321 +24 -1.271 +25 -1.218 +26 -1.164 +27 -1.107 +28 -1.049 +29 -0.990 +30 -0.930 +31 -0.869 +32 -0.807 +33 -0.744 +34 -0.681 +35 -0.618 +36 -0.555 +37 -0.492 +38 -0.428 +39 -0.366 +40 -0.303 +41 -0.241 +42 -0.180 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.116 +48 0.172 +49 0.228 +50 0.282 +51 0.336 +52 0.388 +53 0.440 +54 0.490 +55 0.540 +56 0.589 +57 0.637 +58 0.684 +59 0.730 +60 0.776 +61 0.821 +62 0.866 +63 0.910 +64 0.954 +65 0.998 +66 1.041 +67 1.085 +68 1.129 +69 1.174 +70 1.219 +71 1.265 +72 1.312 +73 1.360 +74 1.409 +75 1.460 +76 1.512 +77 1.567 +78 1.623 +79 1.682 +80 1.744 +81 1.809 +82 1.877 +83 1.949 +84 2.025 +85 2.104 +86 2.188 +87 2.277 +88 2.371 +89 2.471 +90 2.576 +1 -1.340 +2 -1.414 +3 -1.478 +4 -1.533 +5 -1.579 +6 -1.617 +7 -1.646 +8 -1.669 +9 -1.684 +10 -1.692 +11 -1.694 +12 -1.689 +13 -1.679 +14 -1.664 +15 -1.643 +16 -1.618 +17 -1.589 +18 -1.555 +19 -1.518 +20 -1.477 +21 -1.433 +22 -1.387 +23 -1.337 +24 -1.285 +25 -1.231 +26 -1.175 +27 -1.118 +28 -1.059 +29 -0.998 +30 -0.937 +31 -0.875 +32 -0.812 +33 -0.749 +34 -0.685 +35 -0.621 +36 -0.557 +37 -0.493 +38 -0.430 +39 -0.366 +40 -0.304 +41 -0.242 +42 -0.180 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.115 +48 0.172 +49 0.227 +50 0.281 +51 0.334 +52 0.386 +53 0.437 +54 0.487 +55 0.536 +56 0.584 +57 0.631 +58 0.677 +59 0.723 +60 0.767 +61 0.811 +62 0.855 +63 0.898 +64 0.940 +65 0.983 +66 1.025 +67 1.067 +68 1.110 +69 1.153 +70 1.196 +71 1.240 +72 1.285 +73 1.331 +74 1.378 +75 1.427 +76 1.477 +77 1.529 +78 1.584 +79 1.641 +80 1.700 +81 1.763 +82 1.828 +83 1.897 +84 1.970 +85 2.047 +86 2.128 +87 2.214 +88 2.305 +89 2.402 +90 2.504 +1 -0.913 +2 -0.988 +3 -1.054 +4 -1.113 +5 -1.163 +6 -1.206 +7 -1.242 +8 -1.270 +9 -1.293 +10 -1.309 +11 -1.319 +12 -1.324 +13 -1.324 +14 -1.319 +15 -1.309 +16 -1.295 +17 -1.276 +18 -1.254 +19 -1.229 +20 -1.200 +21 -1.168 +22 -1.134 +23 -1.097 +24 -1.057 +25 -1.016 +26 -0.972 +27 -0.927 +28 -0.880 +29 -0.832 +30 -0.783 +31 -0.733 +32 -0.682 +33 -0.630 +34 -0.578 +35 -0.525 +36 -0.472 +37 -0.419 +38 -0.366 +39 -0.313 +40 -0.260 +41 -0.207 +42 -0.155 +43 -0.103 +44 -0.051 +45 0.000 +46 0.051 +47 0.100 +48 0.150 +49 0.198 +50 0.246 +51 0.294 +52 0.340 +53 0.386 +54 0.432 +55 0.476 +56 0.521 +57 0.564 +58 0.607 +59 0.650 +60 0.692 +61 0.734 +62 0.775 +63 0.817 +64 0.858 +65 0.900 +66 0.941 +67 0.983 +68 1.026 +69 1.068 +70 1.112 +71 1.156 +72 1.202 +73 1.248 +74 1.296 +75 1.345 +76 1.396 +77 1.449 +78 1.504 +79 1.561 +80 1.621 +81 1.684 +82 1.749 +83 1.818 +84 1.890 +85 1.967 +86 2.047 +87 2.131 +88 2.220 +89 2.314 +90 2.413 +1 -0.954 +2 -1.019 +3 -1.075 +4 -1.124 +5 -1.166 +6 -1.201 +7 -1.229 +8 -1.252 +9 -1.268 +10 -1.279 +11 -1.285 +12 -1.285 +13 -1.281 +14 -1.273 +15 -1.260 +16 -1.244 +17 -1.223 +18 -1.200 +19 -1.173 +20 -1.144 +21 -1.112 +22 -1.077 +23 -1.040 +24 -1.001 +25 -0.961 +26 -0.918 +27 -0.875 +28 -0.829 +29 -0.783 +30 -0.736 +31 -0.688 +32 -0.639 +33 -0.590 +34 -0.541 +35 -0.491 +36 -0.441 +37 -0.391 +38 -0.341 +39 -0.291 +40 -0.241 +41 -0.192 +42 -0.143 +43 -0.095 +44 -0.047 +45 0.000 +46 0.047 +47 0.093 +48 0.138 +49 0.182 +50 0.226 +51 0.269 +52 0.312 +53 0.354 +54 0.395 +55 0.435 +56 0.474 +57 0.513 +58 0.552 +59 0.590 +60 0.627 +61 0.664 +62 0.701 +63 0.737 +64 0.774 +65 0.810 +66 0.846 +67 0.883 +68 0.919 +69 0.956 +70 0.994 +71 1.032 +72 1.071 +73 1.111 +74 1.152 +75 1.195 +76 1.239 +77 1.284 +78 1.331 +79 1.381 +80 1.432 +81 1.486 +82 1.543 +83 1.603 +84 1.665 +85 1.731 +86 1.801 +87 1.875 +88 1.952 +89 2.034 +90 2.121 +1 -0.529 +2 -0.588 +3 -0.641 +4 -0.688 +5 -0.729 +6 -0.765 +7 -0.795 +8 -0.820 +9 -0.841 +10 -0.857 +11 -0.869 +12 -0.877 +13 -0.880 +14 -0.881 +15 -0.878 +16 -0.871 +17 -0.862 +18 -0.850 +19 -0.835 +20 -0.817 +21 -0.798 +22 -0.776 +23 -0.752 +24 -0.727 +25 -0.700 +26 -0.671 +27 -0.641 +28 -0.610 +29 -0.578 +30 -0.545 +31 -0.511 +32 -0.476 +33 -0.441 +34 -0.405 +35 -0.369 +36 -0.332 +37 -0.295 +38 -0.258 +39 -0.221 +40 -0.184 +41 -0.147 +42 -0.110 +43 -0.073 +44 -0.036 +45 0.000 +46 0.036 +47 0.072 +48 0.108 +49 0.143 +50 0.178 +51 0.212 +52 0.246 +53 0.280 +54 0.313 +55 0.347 +56 0.379 +57 0.412 +58 0.444 +59 0.476 +60 0.508 +61 0.540 +62 0.572 +63 0.604 +64 0.636 +65 0.668 +66 0.700 +67 0.733 +68 0.765 +69 0.799 +70 0.833 +71 0.868 +72 0.903 +73 0.940 +74 0.977 +75 1.016 +76 1.056 +77 1.098 +78 1.141 +79 1.186 +80 1.233 +81 1.282 +82 1.333 +83 1.386 +84 1.443 +85 1.501 +86 1.563 +87 1.629 +88 1.697 +89 1.769 +90 1.845 +1 -0.564 +2 -0.609 +3 -0.649 +4 -0.684 +5 -0.714 +6 -0.740 +7 -0.761 +8 -0.778 +9 -0.791 +10 -0.801 +11 -0.807 +12 -0.809 +13 -0.809 +14 -0.805 +15 -0.799 +16 -0.790 +17 -0.779 +18 -0.765 +19 -0.750 +20 -0.732 +21 -0.712 +22 -0.691 +23 -0.669 +24 -0.644 +25 -0.619 +26 -0.592 +27 -0.565 +28 -0.536 +29 -0.507 +30 -0.477 +31 -0.446 +32 -0.415 +33 -0.384 +34 -0.352 +35 -0.320 +36 -0.288 +37 -0.255 +38 -0.223 +39 -0.190 +40 -0.158 +41 -0.126 +42 -0.094 +43 -0.062 +44 -0.031 +45 0.000 +46 0.031 +47 0.061 +48 0.091 +49 0.121 +50 0.150 +51 0.179 +52 0.207 +53 0.235 +54 0.263 +55 0.290 +56 0.317 +57 0.343 +58 0.369 +59 0.395 +60 0.421 +61 0.446 +62 0.471 +63 0.496 +64 0.522 +65 0.547 +66 0.572 +67 0.597 +68 0.623 +69 0.649 +70 0.675 +71 0.702 +72 0.729 +73 0.757 +74 0.786 +75 0.816 +76 0.846 +77 0.878 +78 0.911 +79 0.946 +80 0.982 +81 1.020 +82 1.059 +83 1.100 +84 1.144 +85 1.190 +86 1.238 +87 1.289 +88 1.342 +89 1.398 +90 1.458 +1 -0.211 +2 -0.248 +3 -0.280 +4 -0.310 +5 -0.336 +6 -0.359 +7 -0.379 +8 -0.396 +9 -0.411 +10 -0.423 +11 -0.432 +12 -0.439 +13 -0.444 +14 -0.447 +15 -0.448 +16 -0.446 +17 -0.444 +18 -0.439 +19 -0.433 +20 -0.426 +21 -0.417 +22 -0.407 +23 -0.396 +24 -0.384 +25 -0.370 +26 -0.356 +27 -0.341 +28 -0.325 +29 -0.309 +30 -0.292 +31 -0.274 +32 -0.256 +33 -0.238 +34 -0.219 +35 -0.200 +36 -0.180 +37 -0.161 +38 -0.141 +39 -0.121 +40 -0.101 +41 -0.081 +42 -0.060 +43 -0.040 +44 -0.020 +45 0.000 +46 0.020 +47 0.040 +48 0.060 +49 0.080 +50 0.099 +51 0.119 +52 0.138 +53 0.157 +54 0.177 +55 0.196 +56 0.215 +57 0.234 +58 0.252 +59 0.271 +60 0.290 +61 0.309 +62 0.328 +63 0.347 +64 0.366 +65 0.385 +66 0.404 +67 0.424 +68 0.444 +69 0.464 +70 0.485 +71 0.506 +72 0.528 +73 0.550 +74 0.573 +75 0.597 +76 0.621 +77 0.646 +78 0.673 +79 0.700 +80 0.728 +81 0.758 +82 0.789 +83 0.821 +84 0.855 +85 0.890 +86 0.927 +87 0.966 +88 1.007 +89 1.050 +90 1.095 +1 -0.174 +2 -0.197 +3 -0.217 +4 -0.235 +5 -0.251 +6 -0.265 +7 -0.277 +8 -0.287 +9 -0.295 +10 -0.302 +11 -0.307 +12 -0.311 +13 -0.313 +14 -0.313 +15 -0.313 +16 -0.311 +17 -0.308 +18 -0.305 +19 -0.300 +20 -0.294 +21 -0.287 +22 -0.280 +23 -0.271 +24 -0.263 +25 -0.253 +26 -0.243 +27 -0.232 +28 -0.221 +29 -0.210 +30 -0.198 +31 -0.186 +32 -0.173 +33 -0.161 +34 -0.148 +35 -0.135 +36 -0.121 +37 -0.108 +38 -0.094 +39 -0.081 +40 -0.067 +41 -0.054 +42 -0.040 +43 -0.027 +44 -0.013 +45 0.000 +46 0.013 +47 0.027 +48 0.040 +49 0.053 +50 0.066 +51 0.078 +52 0.091 +53 0.104 +54 0.116 +55 0.128 +56 0.141 +57 0.153 +58 0.165 +59 0.177 +60 0.189 +61 0.201 +62 0.213 +63 0.225 +64 0.237 +65 0.249 +66 0.262 +67 0.274 +68 0.286 +69 0.299 +70 0.312 +71 0.325 +72 0.339 +73 0.353 +74 0.367 +75 0.381 +76 0.397 +77 0.412 +78 0.429 +79 0.446 +80 0.463 +81 0.482 +82 0.501 +83 0.521 +84 0.542 +85 0.564 +86 0.588 +87 0.612 +88 0.638 +89 0.665 +90 0.693 +1 0.156 +2 0.146 +3 0.137 +4 0.128 +5 0.119 +6 0.111 +7 0.103 +8 0.095 +9 0.088 +10 0.081 +11 0.074 +12 0.068 +13 0.062 +14 0.056 +15 0.051 +16 0.045 +17 0.041 +18 0.036 +19 0.032 +20 0.028 +21 0.024 +22 0.020 +23 0.017 +24 0.014 +25 0.011 +26 0.009 +27 0.007 +28 0.004 +29 0.003 +30 0.001 +31 -0.000 +32 -0.002 +33 -0.003 +34 -0.003 +35 -0.004 +36 -0.005 +37 -0.005 +38 -0.005 +39 -0.005 +40 -0.004 +41 -0.004 +42 -0.003 +43 -0.002 +44 -0.001 +45 0.000 +46 0.001 +47 0.003 +48 0.005 +49 0.007 +50 0.009 +51 0.011 +52 0.013 +53 0.016 +54 0.018 +55 0.021 +56 0.024 +57 0.027 +58 0.031 +59 0.034 +60 0.038 +61 0.042 +62 0.046 +63 0.050 +64 0.054 +65 0.059 +66 0.064 +67 0.068 +68 0.073 +69 0.079 +70 0.084 +71 0.090 +72 0.095 +73 0.101 +74 0.107 +75 0.114 +76 0.120 +77 0.127 +78 0.134 +79 0.141 +80 0.148 +81 0.156 +82 0.164 +83 0.172 +84 0.180 +85 0.188 +86 0.197 +87 0.206 +88 0.215 +89 0.224 +90 0.234 +1 0.230 +2 0.234 +3 0.236 +4 0.238 +5 0.239 +6 0.239 +7 0.239 +8 0.237 +9 0.235 +10 0.233 +11 0.230 +12 0.226 +13 0.222 +14 0.217 +15 0.212 +16 0.207 +17 0.201 +18 0.195 +19 0.189 +20 0.182 +21 0.175 +22 0.168 +23 0.161 +24 0.153 +25 0.146 +26 0.138 +27 0.130 +28 0.123 +29 0.115 +30 0.107 +31 0.099 +32 0.091 +33 0.084 +34 0.076 +35 0.068 +36 0.061 +37 0.054 +38 0.046 +39 0.039 +40 0.032 +41 0.025 +42 0.019 +43 0.012 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.017 +49 -0.022 +50 -0.027 +51 -0.032 +52 -0.037 +53 -0.042 +54 -0.046 +55 -0.050 +56 -0.054 +57 -0.057 +58 -0.061 +59 -0.064 +60 -0.068 +61 -0.071 +62 -0.073 +63 -0.076 +64 -0.079 +65 -0.081 +66 -0.084 +67 -0.086 +68 -0.088 +69 -0.091 +70 -0.093 +71 -0.095 +72 -0.097 +73 -0.100 +74 -0.102 +75 -0.105 +76 -0.107 +77 -0.110 +78 -0.113 +79 -0.116 +80 -0.119 +81 -0.122 +82 -0.126 +83 -0.130 +84 -0.135 +85 -0.139 +86 -0.145 +87 -0.150 +88 -0.156 +89 -0.163 +90 -0.170 +1 0.634 +2 0.651 +3 0.666 +4 0.677 +5 0.685 +6 0.691 +7 0.694 +8 0.694 +9 0.693 +10 0.689 +11 0.683 +12 0.676 +13 0.666 +14 0.655 +15 0.643 +16 0.629 +17 0.614 +18 0.597 +19 0.579 +20 0.561 +21 0.541 +22 0.521 +23 0.500 +24 0.479 +25 0.456 +26 0.434 +27 0.411 +28 0.387 +29 0.364 +30 0.340 +31 0.316 +32 0.292 +33 0.268 +34 0.245 +35 0.221 +36 0.197 +37 0.174 +38 0.151 +39 0.128 +40 0.106 +41 0.084 +42 0.062 +43 0.041 +44 0.020 +45 -0.000 +46 -0.020 +47 -0.039 +48 -0.058 +49 -0.076 +50 -0.094 +51 -0.111 +52 -0.127 +53 -0.143 +54 -0.159 +55 -0.174 +56 -0.188 +57 -0.203 +58 -0.216 +59 -0.229 +60 -0.242 +61 -0.254 +62 -0.266 +63 -0.278 +64 -0.289 +65 -0.300 +66 -0.311 +67 -0.322 +68 -0.333 +69 -0.343 +70 -0.354 +71 -0.365 +72 -0.376 +73 -0.387 +74 -0.398 +75 -0.410 +76 -0.422 +77 -0.435 +78 -0.448 +79 -0.462 +80 -0.476 +81 -0.492 +82 -0.508 +83 -0.526 +84 -0.545 +85 -0.565 +86 -0.586 +87 -0.609 +88 -0.633 +89 -0.659 +90 -0.687 +1 0.740 +2 0.769 +3 0.794 +4 0.815 +5 0.832 +6 0.845 +7 0.855 +8 0.861 +9 0.863 +10 0.863 +11 0.860 +12 0.854 +13 0.845 +14 0.834 +15 0.821 +16 0.806 +17 0.789 +18 0.770 +19 0.749 +20 0.727 +21 0.704 +22 0.679 +23 0.653 +24 0.627 +25 0.599 +26 0.570 +27 0.541 +28 0.512 +29 0.482 +30 0.451 +31 0.420 +32 0.389 +33 0.358 +34 0.327 +35 0.296 +36 0.265 +37 0.234 +38 0.204 +39 0.173 +40 0.143 +41 0.114 +42 0.085 +43 0.056 +44 0.028 +45 -0.000 +46 -0.027 +47 -0.054 +48 -0.080 +49 -0.105 +50 -0.130 +51 -0.154 +52 -0.177 +53 -0.200 +54 -0.223 +55 -0.244 +56 -0.265 +57 -0.286 +58 -0.306 +59 -0.326 +60 -0.345 +61 -0.364 +62 -0.382 +63 -0.400 +64 -0.418 +65 -0.436 +66 -0.453 +67 -0.471 +68 -0.488 +69 -0.505 +70 -0.523 +71 -0.541 +72 -0.559 +73 -0.577 +74 -0.596 +75 -0.616 +76 -0.636 +77 -0.658 +78 -0.680 +79 -0.703 +80 -0.727 +81 -0.753 +82 -0.780 +83 -0.808 +84 -0.838 +85 -0.871 +86 -0.905 +87 -0.941 +88 -0.979 +89 -1.020 +90 -1.064 +1 1.189 +2 1.233 +3 1.270 +4 1.300 +5 1.324 +6 1.342 +7 1.355 +8 1.363 +9 1.365 +10 1.363 +11 1.356 +12 1.345 +13 1.331 +14 1.313 +15 1.291 +16 1.266 +17 1.238 +18 1.208 +19 1.175 +20 1.139 +21 1.102 +22 1.063 +23 1.022 +24 0.979 +25 0.936 +26 0.891 +27 0.845 +28 0.798 +29 0.751 +30 0.703 +31 0.655 +32 0.606 +33 0.558 +34 0.509 +35 0.460 +36 0.412 +37 0.364 +38 0.316 +39 0.269 +40 0.222 +41 0.176 +42 0.131 +43 0.087 +44 0.043 +45 -0.000 +46 -0.042 +47 -0.083 +48 -0.123 +49 -0.162 +50 -0.200 +51 -0.238 +52 -0.274 +53 -0.309 +54 -0.343 +55 -0.376 +56 -0.409 +57 -0.440 +58 -0.471 +59 -0.501 +60 -0.530 +61 -0.558 +62 -0.586 +63 -0.613 +64 -0.640 +65 -0.667 +66 -0.693 +67 -0.719 +68 -0.745 +69 -0.771 +70 -0.797 +71 -0.823 +72 -0.850 +73 -0.878 +74 -0.906 +75 -0.935 +76 -0.965 +77 -0.996 +78 -1.029 +79 -1.063 +80 -1.099 +81 -1.137 +82 -1.177 +83 -1.219 +84 -1.264 +85 -1.312 +86 -1.363 +87 -1.416 +88 -1.474 +89 -1.535 +90 -1.600 +1 1.144 +2 1.196 +3 1.241 +4 1.278 +5 1.309 +6 1.333 +7 1.352 +8 1.365 +9 1.372 +10 1.374 +11 1.371 +12 1.364 +13 1.353 +14 1.337 +15 1.318 +16 1.295 +17 1.269 +18 1.240 +19 1.208 +20 1.174 +21 1.137 +22 1.098 +23 1.057 +24 1.015 +25 0.971 +26 0.925 +27 0.879 +28 0.831 +29 0.783 +30 0.734 +31 0.684 +32 0.634 +33 0.584 +34 0.534 +35 0.483 +36 0.433 +37 0.383 +38 0.333 +39 0.284 +40 0.235 +41 0.187 +42 0.139 +43 0.092 +44 0.046 +45 -0.000 +46 -0.045 +47 -0.088 +48 -0.131 +49 -0.173 +50 -0.214 +51 -0.255 +52 -0.294 +53 -0.332 +54 -0.369 +55 -0.406 +56 -0.441 +57 -0.476 +58 -0.510 +59 -0.544 +60 -0.576 +61 -0.608 +62 -0.640 +63 -0.671 +64 -0.701 +65 -0.732 +66 -0.762 +67 -0.792 +68 -0.822 +69 -0.852 +70 -0.883 +71 -0.914 +72 -0.946 +73 -0.978 +74 -1.011 +75 -1.045 +76 -1.081 +77 -1.118 +78 -1.156 +79 -1.197 +80 -1.239 +81 -1.283 +82 -1.330 +83 -1.379 +84 -1.431 +85 -1.487 +86 -1.545 +87 -1.608 +88 -1.673 +89 -1.744 +90 -1.818 +1 1.669 +2 1.735 +3 1.791 +4 1.837 +5 1.875 +6 1.904 +7 1.925 +8 1.938 +9 1.944 +10 1.943 +11 1.935 +12 1.922 +13 1.903 +14 1.878 +15 1.848 +16 1.814 +17 1.775 +18 1.733 +19 1.686 +20 1.637 +21 1.584 +22 1.528 +23 1.470 +24 1.410 +25 1.348 +26 1.284 +27 1.218 +28 1.151 +29 1.084 +30 1.015 +31 0.946 +32 0.876 +33 0.806 +34 0.736 +35 0.666 +36 0.596 +37 0.527 +38 0.458 +39 0.390 +40 0.323 +41 0.256 +42 0.190 +43 0.126 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.179 +49 -0.236 +50 -0.292 +51 -0.347 +52 -0.400 +53 -0.451 +54 -0.502 +55 -0.551 +56 -0.598 +57 -0.645 +58 -0.690 +59 -0.734 +60 -0.778 +61 -0.820 +62 -0.861 +63 -0.902 +64 -0.942 +65 -0.982 +66 -1.021 +67 -1.060 +68 -1.099 +69 -1.139 +70 -1.178 +71 -1.218 +72 -1.259 +73 -1.300 +74 -1.343 +75 -1.387 +76 -1.432 +77 -1.479 +78 -1.529 +79 -1.580 +80 -1.634 +81 -1.691 +82 -1.752 +83 -1.815 +84 -1.883 +85 -1.954 +86 -2.030 +87 -2.110 +88 -2.196 +89 -2.287 +90 -2.384 +1 1.401 +2 1.470 +3 1.530 +4 1.582 +5 1.624 +6 1.658 +7 1.685 +8 1.704 +9 1.716 +10 1.721 +11 1.720 +12 1.713 +13 1.701 +14 1.683 +15 1.660 +16 1.633 +17 1.602 +18 1.566 +19 1.527 +20 1.485 +21 1.440 +22 1.392 +23 1.341 +24 1.288 +25 1.233 +26 1.176 +27 1.118 +28 1.058 +29 0.997 +30 0.935 +31 0.872 +32 0.809 +33 0.746 +34 0.682 +35 0.618 +36 0.554 +37 0.490 +38 0.427 +39 0.364 +40 0.301 +41 0.239 +42 0.178 +43 0.118 +44 0.058 +45 -0.000 +46 -0.057 +47 -0.114 +48 -0.169 +49 -0.224 +50 -0.277 +51 -0.329 +52 -0.380 +53 -0.429 +54 -0.478 +55 -0.526 +56 -0.572 +57 -0.618 +58 -0.663 +59 -0.706 +60 -0.750 +61 -0.792 +62 -0.834 +63 -0.875 +64 -0.916 +65 -0.956 +66 -0.996 +67 -1.037 +68 -1.077 +69 -1.118 +70 -1.159 +71 -1.201 +72 -1.243 +73 -1.287 +74 -1.332 +75 -1.378 +76 -1.426 +77 -1.475 +78 -1.527 +79 -1.581 +80 -1.638 +81 -1.697 +82 -1.760 +83 -1.826 +84 -1.896 +85 -1.969 +86 -2.047 +87 -2.130 +88 -2.218 +89 -2.310 +90 -2.409 +1 1.803 +2 1.883 +3 1.952 +4 2.010 +5 2.058 +6 2.096 +7 2.124 +8 2.143 +9 2.154 +10 2.157 +11 2.152 +12 2.141 +13 2.122 +14 2.098 +15 2.067 +16 2.031 +17 1.990 +18 1.944 +19 1.894 +20 1.840 +21 1.782 +22 1.721 +23 1.657 +24 1.591 +25 1.521 +26 1.450 +27 1.377 +28 1.303 +29 1.227 +30 1.150 +31 1.072 +32 0.994 +33 0.915 +34 0.836 +35 0.757 +36 0.678 +37 0.600 +38 0.522 +39 0.445 +40 0.368 +41 0.292 +42 0.217 +43 0.144 +44 0.071 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.271 +50 -0.336 +51 -0.399 +52 -0.460 +53 -0.520 +54 -0.578 +55 -0.635 +56 -0.691 +57 -0.745 +58 -0.799 +59 -0.851 +60 -0.902 +61 -0.952 +62 -1.001 +63 -1.049 +64 -1.097 +65 -1.144 +66 -1.191 +67 -1.238 +68 -1.285 +69 -1.332 +70 -1.380 +71 -1.428 +72 -1.477 +73 -1.528 +74 -1.579 +75 -1.633 +76 -1.688 +77 -1.745 +78 -1.804 +79 -1.867 +80 -1.932 +81 -2.001 +82 -2.074 +83 -2.150 +84 -2.231 +85 -2.317 +86 -2.407 +87 -2.504 +88 -2.606 +89 -2.715 +90 -2.830 +1 1.305 +2 1.382 +3 1.449 +4 1.506 +5 1.555 +6 1.595 +7 1.627 +8 1.651 +9 1.668 +10 1.678 +11 1.682 +12 1.679 +13 1.670 +14 1.656 +15 1.637 +16 1.613 +17 1.585 +18 1.552 +19 1.516 +20 1.476 +21 1.433 +22 1.387 +23 1.338 +24 1.286 +25 1.233 +26 1.177 +27 1.120 +28 1.061 +29 1.001 +30 0.940 +31 0.878 +32 0.815 +33 0.752 +34 0.688 +35 0.624 +36 0.560 +37 0.496 +38 0.432 +39 0.369 +40 0.306 +41 0.243 +42 0.181 +43 0.120 +44 0.060 +45 -0.000 +46 -0.059 +47 -0.117 +48 -0.173 +49 -0.229 +50 -0.284 +51 -0.338 +52 -0.390 +53 -0.442 +54 -0.493 +55 -0.543 +56 -0.592 +57 -0.640 +58 -0.687 +59 -0.733 +60 -0.779 +61 -0.824 +62 -0.868 +63 -0.913 +64 -0.956 +65 -1.000 +66 -1.044 +67 -1.088 +68 -1.132 +69 -1.176 +70 -1.221 +71 -1.267 +72 -1.313 +73 -1.361 +74 -1.410 +75 -1.461 +76 -1.514 +77 -1.568 +78 -1.625 +79 -1.684 +80 -1.746 +81 -1.811 +82 -1.879 +83 -1.951 +84 -2.027 +85 -2.107 +86 -2.191 +87 -2.281 +88 -2.375 +89 -2.475 +90 -2.581 +1 1.481 +2 1.561 +3 1.630 +4 1.689 +5 1.738 +6 1.778 +7 1.810 +8 1.833 +9 1.849 +10 1.857 +11 1.858 +12 1.852 +13 1.841 +14 1.823 +15 1.800 +16 1.772 +17 1.740 +18 1.702 +19 1.661 +20 1.616 +21 1.568 +22 1.516 +23 1.462 +24 1.405 +25 1.346 +26 1.284 +27 1.221 +28 1.156 +29 1.090 +30 1.023 +31 0.955 +32 0.886 +33 0.817 +34 0.747 +35 0.677 +36 0.608 +37 0.538 +38 0.468 +39 0.399 +40 0.331 +41 0.263 +42 0.196 +43 0.130 +44 0.064 +45 -0.000 +46 -0.063 +47 -0.126 +48 -0.187 +49 -0.247 +50 -0.306 +51 -0.363 +52 -0.420 +53 -0.475 +54 -0.529 +55 -0.582 +56 -0.634 +57 -0.685 +58 -0.735 +59 -0.784 +60 -0.833 +61 -0.880 +62 -0.927 +63 -0.974 +64 -1.020 +65 -1.066 +66 -1.111 +67 -1.157 +68 -1.203 +69 -1.249 +70 -1.296 +71 -1.344 +72 -1.392 +73 -1.442 +74 -1.493 +75 -1.545 +76 -1.600 +77 -1.656 +78 -1.715 +79 -1.777 +80 -1.841 +81 -1.908 +82 -1.980 +83 -2.054 +84 -2.133 +85 -2.217 +86 -2.305 +87 -2.398 +88 -2.497 +89 -2.602 +90 -2.713 +1 1.082 +2 1.155 +3 1.220 +4 1.275 +5 1.323 +6 1.363 +7 1.395 +8 1.421 +9 1.439 +10 1.452 +11 1.458 +12 1.459 +13 1.454 +14 1.445 +15 1.430 +16 1.412 +17 1.389 +18 1.362 +19 1.332 +20 1.298 +21 1.262 +22 1.223 +23 1.181 +24 1.137 +25 1.090 +26 1.042 +27 0.992 +28 0.941 +29 0.889 +30 0.835 +31 0.780 +32 0.725 +33 0.669 +34 0.613 +35 0.557 +36 0.500 +37 0.443 +38 0.386 +39 0.330 +40 0.274 +41 0.218 +42 0.163 +43 0.108 +44 0.054 +45 -0.000 +46 -0.053 +47 -0.105 +48 -0.156 +49 -0.207 +50 -0.256 +51 -0.305 +52 -0.353 +53 -0.400 +54 -0.447 +55 -0.492 +56 -0.537 +57 -0.582 +58 -0.625 +59 -0.668 +60 -0.710 +61 -0.752 +62 -0.794 +63 -0.835 +64 -0.876 +65 -0.917 +66 -0.958 +67 -1.000 +68 -1.041 +69 -1.083 +70 -1.126 +71 -1.169 +72 -1.214 +73 -1.259 +74 -1.306 +75 -1.354 +76 -1.404 +77 -1.456 +78 -1.510 +79 -1.566 +80 -1.625 +81 -1.687 +82 -1.752 +83 -1.820 +84 -1.891 +85 -1.967 +86 -2.047 +87 -2.131 +88 -2.220 +89 -2.314 +90 -2.413 +1 1.125 +2 1.200 +3 1.265 +4 1.321 +5 1.369 +6 1.409 +7 1.442 +8 1.467 +9 1.485 +10 1.497 +11 1.503 +12 1.503 +13 1.498 +14 1.488 +15 1.473 +16 1.453 +17 1.429 +18 1.401 +19 1.370 +20 1.335 +21 1.297 +22 1.256 +23 1.213 +24 1.168 +25 1.120 +26 1.070 +27 1.019 +28 0.966 +29 0.912 +30 0.857 +31 0.801 +32 0.744 +33 0.687 +34 0.629 +35 0.571 +36 0.513 +37 0.454 +38 0.396 +39 0.338 +40 0.281 +41 0.223 +42 0.167 +43 0.110 +44 0.055 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.160 +49 -0.212 +50 -0.262 +51 -0.312 +52 -0.361 +53 -0.410 +54 -0.457 +55 -0.504 +56 -0.549 +57 -0.594 +58 -0.639 +59 -0.682 +60 -0.726 +61 -0.768 +62 -0.811 +63 -0.853 +64 -0.894 +65 -0.936 +66 -0.978 +67 -1.020 +68 -1.062 +69 -1.105 +70 -1.148 +71 -1.192 +72 -1.237 +73 -1.283 +74 -1.330 +75 -1.379 +76 -1.430 +77 -1.483 +78 -1.537 +79 -1.594 +80 -1.654 +81 -1.716 +82 -1.782 +83 -1.851 +84 -1.924 +85 -2.000 +86 -2.081 +87 -2.167 +88 -2.257 +89 -2.352 +90 -2.453 +1 0.833 +2 0.901 +3 0.962 +4 1.014 +5 1.060 +6 1.099 +7 1.131 +8 1.157 +9 1.177 +10 1.192 +11 1.201 +12 1.205 +13 1.204 +14 1.199 +15 1.190 +16 1.177 +17 1.161 +18 1.140 +19 1.117 +20 1.091 +21 1.062 +22 1.030 +23 0.996 +24 0.960 +25 0.923 +26 0.883 +27 0.842 +28 0.799 +29 0.756 +30 0.711 +31 0.665 +32 0.619 +33 0.572 +34 0.524 +35 0.477 +36 0.429 +37 0.380 +38 0.332 +39 0.284 +40 0.236 +41 0.188 +42 0.140 +43 0.093 +44 0.046 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.136 +49 -0.180 +50 -0.223 +51 -0.266 +52 -0.309 +53 -0.350 +54 -0.391 +55 -0.432 +56 -0.472 +57 -0.511 +58 -0.550 +59 -0.589 +60 -0.627 +61 -0.665 +62 -0.703 +63 -0.740 +64 -0.778 +65 -0.815 +66 -0.853 +67 -0.891 +68 -0.930 +69 -0.968 +70 -1.008 +71 -1.048 +72 -1.089 +73 -1.132 +74 -1.175 +75 -1.220 +76 -1.266 +77 -1.314 +78 -1.365 +79 -1.417 +80 -1.471 +81 -1.528 +82 -1.588 +83 -1.651 +84 -1.717 +85 -1.786 +86 -1.859 +87 -1.936 +88 -2.018 +89 -2.104 +90 -2.194 +1 1.080 +2 1.152 +3 1.215 +4 1.270 +5 1.316 +6 1.355 +7 1.386 +8 1.411 +9 1.429 +10 1.441 +11 1.446 +12 1.447 +13 1.442 +14 1.432 +15 1.418 +16 1.399 +17 1.376 +18 1.349 +19 1.319 +20 1.286 +21 1.249 +22 1.210 +23 1.169 +24 1.125 +25 1.079 +26 1.031 +27 0.982 +28 0.931 +29 0.879 +30 0.826 +31 0.772 +32 0.717 +33 0.662 +34 0.606 +35 0.550 +36 0.494 +37 0.438 +38 0.382 +39 0.326 +40 0.271 +41 0.215 +42 0.161 +43 0.107 +44 0.053 +45 -0.000 +46 -0.052 +47 -0.104 +48 -0.154 +49 -0.204 +50 -0.253 +51 -0.302 +52 -0.349 +53 -0.396 +54 -0.442 +55 -0.487 +56 -0.531 +57 -0.574 +58 -0.617 +59 -0.660 +60 -0.701 +61 -0.743 +62 -0.784 +63 -0.825 +64 -0.865 +65 -0.906 +66 -0.946 +67 -0.987 +68 -1.028 +69 -1.069 +70 -1.111 +71 -1.154 +72 -1.197 +73 -1.242 +74 -1.288 +75 -1.335 +76 -1.385 +77 -1.435 +78 -1.488 +79 -1.544 +80 -1.602 +81 -1.662 +82 -1.726 +83 -1.793 +84 -1.863 +85 -1.937 +86 -2.015 +87 -2.098 +88 -2.185 +89 -2.277 +90 -2.375 +1 1.041 +2 1.114 +3 1.179 +4 1.234 +5 1.282 +6 1.322 +7 1.355 +8 1.381 +9 1.400 +10 1.413 +11 1.420 +12 1.421 +13 1.417 +14 1.409 +15 1.395 +16 1.378 +17 1.356 +18 1.330 +19 1.301 +20 1.269 +21 1.233 +22 1.195 +23 1.155 +24 1.112 +25 1.067 +26 1.020 +27 0.971 +28 0.922 +29 0.870 +30 0.818 +31 0.765 +32 0.711 +33 0.656 +34 0.601 +35 0.546 +36 0.490 +37 0.435 +38 0.379 +39 0.324 +40 0.269 +41 0.214 +42 0.160 +43 0.106 +44 0.053 +45 -0.000 +46 -0.052 +47 -0.103 +48 -0.154 +49 -0.203 +50 -0.252 +51 -0.300 +52 -0.348 +53 -0.394 +54 -0.440 +55 -0.485 +56 -0.529 +57 -0.573 +58 -0.616 +59 -0.658 +60 -0.700 +61 -0.742 +62 -0.783 +63 -0.824 +64 -0.865 +65 -0.906 +66 -0.946 +67 -0.987 +68 -1.029 +69 -1.071 +70 -1.113 +71 -1.156 +72 -1.200 +73 -1.245 +74 -1.292 +75 -1.340 +76 -1.390 +77 -1.441 +78 -1.495 +79 -1.551 +80 -1.609 +81 -1.670 +82 -1.735 +83 -1.802 +84 -1.873 +85 -1.948 +86 -2.027 +87 -2.111 +88 -2.199 +89 -2.292 +90 -2.390 +1 1.386 +2 1.463 +3 1.529 +4 1.585 +5 1.633 +6 1.672 +7 1.703 +8 1.725 +9 1.741 +10 1.749 +11 1.751 +12 1.746 +13 1.736 +14 1.720 +15 1.699 +16 1.673 +17 1.642 +18 1.607 +19 1.569 +20 1.527 +21 1.481 +22 1.433 +23 1.382 +24 1.328 +25 1.272 +26 1.214 +27 1.155 +28 1.094 +29 1.031 +30 0.968 +31 0.904 +32 0.839 +33 0.773 +34 0.707 +35 0.641 +36 0.575 +37 0.509 +38 0.444 +39 0.378 +40 0.314 +41 0.249 +42 0.186 +43 0.123 +44 0.061 +45 -0.000 +46 -0.060 +47 -0.119 +48 -0.177 +49 -0.234 +50 -0.290 +51 -0.345 +52 -0.399 +53 -0.451 +54 -0.503 +55 -0.553 +56 -0.603 +57 -0.651 +58 -0.699 +59 -0.746 +60 -0.792 +61 -0.837 +62 -0.882 +63 -0.927 +64 -0.971 +65 -1.014 +66 -1.058 +67 -1.102 +68 -1.146 +69 -1.190 +70 -1.235 +71 -1.281 +72 -1.327 +73 -1.375 +74 -1.423 +75 -1.474 +76 -1.526 +77 -1.580 +78 -1.636 +79 -1.695 +80 -1.757 +81 -1.822 +82 -1.889 +83 -1.961 +84 -2.037 +85 -2.116 +86 -2.201 +87 -2.290 +88 -2.384 +89 -2.484 +90 -2.590 +1 1.188 +2 1.260 +3 1.322 +4 1.376 +5 1.421 +6 1.459 +7 1.489 +8 1.511 +9 1.528 +10 1.537 +11 1.541 +12 1.539 +13 1.532 +14 1.519 +15 1.502 +16 1.481 +17 1.455 +18 1.425 +19 1.392 +20 1.356 +21 1.316 +22 1.274 +23 1.230 +24 1.183 +25 1.134 +26 1.083 +27 1.030 +28 0.976 +29 0.921 +30 0.865 +31 0.808 +32 0.750 +33 0.692 +34 0.633 +35 0.575 +36 0.516 +37 0.457 +38 0.398 +39 0.340 +40 0.282 +41 0.224 +42 0.167 +43 0.111 +44 0.055 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.160 +49 -0.211 +50 -0.262 +51 -0.312 +52 -0.361 +53 -0.408 +54 -0.455 +55 -0.501 +56 -0.547 +57 -0.591 +58 -0.635 +59 -0.678 +60 -0.720 +61 -0.762 +62 -0.803 +63 -0.844 +64 -0.885 +65 -0.926 +66 -0.966 +67 -1.007 +68 -1.048 +69 -1.089 +70 -1.131 +71 -1.174 +72 -1.217 +73 -1.261 +74 -1.307 +75 -1.354 +76 -1.403 +77 -1.454 +78 -1.506 +79 -1.561 +80 -1.619 +81 -1.679 +82 -1.743 +83 -1.809 +84 -1.880 +85 -1.954 +86 -2.032 +87 -2.115 +88 -2.202 +89 -2.295 +90 -2.393 +1 1.770 +2 1.852 +3 1.923 +4 1.982 +5 2.031 +6 2.070 +7 2.100 +8 2.120 +9 2.132 +10 2.137 +11 2.133 +12 2.122 +13 2.105 +14 2.082 +15 2.052 +16 2.017 +17 1.977 +18 1.932 +19 1.883 +20 1.830 +21 1.773 +22 1.713 +23 1.650 +24 1.584 +25 1.515 +26 1.445 +27 1.373 +28 1.299 +29 1.223 +30 1.147 +31 1.070 +32 0.992 +33 0.914 +34 0.835 +35 0.756 +36 0.678 +37 0.600 +38 0.522 +39 0.445 +40 0.368 +41 0.292 +42 0.218 +43 0.144 +44 0.071 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.272 +50 -0.337 +51 -0.400 +52 -0.462 +53 -0.522 +54 -0.581 +55 -0.638 +56 -0.695 +57 -0.749 +58 -0.803 +59 -0.856 +60 -0.907 +61 -0.958 +62 -1.008 +63 -1.057 +64 -1.106 +65 -1.154 +66 -1.202 +67 -1.249 +68 -1.297 +69 -1.345 +70 -1.394 +71 -1.443 +72 -1.493 +73 -1.545 +74 -1.597 +75 -1.652 +76 -1.708 +77 -1.766 +78 -1.827 +79 -1.890 +80 -1.957 +81 -2.027 +82 -2.100 +83 -2.178 +84 -2.260 +85 -2.347 +86 -2.439 +87 -2.536 +88 -2.640 +89 -2.749 +90 -2.866 +1 1.466 +2 1.542 +3 1.608 +4 1.665 +5 1.712 +6 1.750 +7 1.780 +8 1.802 +9 1.816 +10 1.823 +11 1.824 +12 1.818 +13 1.806 +14 1.788 +15 1.765 +16 1.737 +17 1.704 +18 1.668 +19 1.627 +20 1.583 +21 1.535 +22 1.484 +23 1.431 +24 1.375 +25 1.316 +26 1.256 +27 1.194 +28 1.131 +29 1.066 +30 1.000 +31 0.933 +32 0.866 +33 0.798 +34 0.730 +35 0.662 +36 0.593 +37 0.525 +38 0.457 +39 0.390 +40 0.323 +41 0.257 +42 0.191 +43 0.127 +44 0.063 +45 -0.000 +46 -0.062 +47 -0.123 +48 -0.182 +49 -0.241 +50 -0.298 +51 -0.354 +52 -0.409 +53 -0.463 +54 -0.516 +55 -0.567 +56 -0.618 +57 -0.667 +58 -0.716 +59 -0.763 +60 -0.810 +61 -0.856 +62 -0.902 +63 -0.947 +64 -0.991 +65 -1.036 +66 -1.080 +67 -1.124 +68 -1.168 +69 -1.213 +70 -1.258 +71 -1.304 +72 -1.351 +73 -1.398 +74 -1.447 +75 -1.498 +76 -1.550 +77 -1.605 +78 -1.661 +79 -1.720 +80 -1.782 +81 -1.847 +82 -1.916 +83 -1.988 +84 -2.064 +85 -2.144 +86 -2.229 +87 -2.319 +88 -2.414 +89 -2.515 +90 -2.622 +1 1.877 +2 1.961 +3 2.032 +4 2.092 +5 2.141 +6 2.180 +7 2.209 +8 2.229 +9 2.240 +10 2.243 +11 2.238 +12 2.225 +13 2.206 +14 2.180 +15 2.148 +16 2.111 +17 2.068 +18 2.020 +19 1.968 +20 1.912 +21 1.852 +22 1.789 +23 1.722 +24 1.653 +25 1.581 +26 1.507 +27 1.431 +28 1.354 +29 1.275 +30 1.195 +31 1.114 +32 1.033 +33 0.951 +34 0.869 +35 0.787 +36 0.705 +37 0.624 +38 0.542 +39 0.462 +40 0.382 +41 0.304 +42 0.226 +43 0.149 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.144 +48 -0.214 +49 -0.282 +50 -0.349 +51 -0.414 +52 -0.478 +53 -0.540 +54 -0.601 +55 -0.660 +56 -0.718 +57 -0.775 +58 -0.830 +59 -0.884 +60 -0.937 +61 -0.989 +62 -1.040 +63 -1.090 +64 -1.140 +65 -1.189 +66 -1.238 +67 -1.287 +68 -1.336 +69 -1.385 +70 -1.434 +71 -1.484 +72 -1.535 +73 -1.587 +74 -1.641 +75 -1.696 +76 -1.753 +77 -1.812 +78 -1.874 +79 -1.938 +80 -2.006 +81 -2.077 +82 -2.152 +83 -2.231 +84 -2.315 +85 -2.404 +86 -2.497 +87 -2.597 +88 -2.703 +89 -2.815 +90 -2.934 +1 1.471 +2 1.546 +3 1.611 +4 1.666 +5 1.712 +6 1.749 +7 1.778 +8 1.799 +9 1.813 +10 1.819 +11 1.819 +12 1.812 +13 1.800 +14 1.782 +15 1.759 +16 1.730 +17 1.698 +18 1.661 +19 1.620 +20 1.575 +21 1.527 +22 1.477 +23 1.423 +24 1.367 +25 1.309 +26 1.249 +27 1.187 +28 1.124 +29 1.060 +30 0.994 +31 0.928 +32 0.861 +33 0.793 +34 0.725 +35 0.657 +36 0.589 +37 0.522 +38 0.454 +39 0.387 +40 0.321 +41 0.255 +42 0.190 +43 0.126 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.122 +48 -0.181 +49 -0.239 +50 -0.295 +51 -0.351 +52 -0.406 +53 -0.459 +54 -0.511 +55 -0.562 +56 -0.612 +57 -0.661 +58 -0.709 +59 -0.756 +60 -0.802 +61 -0.848 +62 -0.893 +63 -0.937 +64 -0.981 +65 -1.024 +66 -1.068 +67 -1.111 +68 -1.155 +69 -1.199 +70 -1.243 +71 -1.288 +72 -1.334 +73 -1.381 +74 -1.429 +75 -1.479 +76 -1.530 +77 -1.583 +78 -1.639 +79 -1.697 +80 -1.758 +81 -1.822 +82 -1.889 +83 -1.960 +84 -2.034 +85 -2.113 +86 -2.197 +87 -2.285 +88 -2.379 +89 -2.478 +90 -2.583 +1 1.676 +2 1.754 +3 1.820 +4 1.876 +5 1.922 +6 1.959 +7 1.987 +8 2.006 +9 2.017 +10 2.021 +11 2.018 +12 2.007 +13 1.991 +14 1.968 +15 1.940 +16 1.907 +17 1.869 +18 1.827 +19 1.780 +20 1.730 +21 1.676 +22 1.619 +23 1.559 +24 1.497 +25 1.432 +26 1.366 +27 1.297 +28 1.227 +29 1.156 +30 1.084 +31 1.011 +32 0.937 +33 0.863 +34 0.789 +35 0.715 +36 0.640 +37 0.566 +38 0.493 +39 0.420 +40 0.348 +41 0.276 +42 0.206 +43 0.136 +44 0.067 +45 -0.000 +46 -0.066 +47 -0.131 +48 -0.195 +49 -0.257 +50 -0.318 +51 -0.378 +52 -0.436 +53 -0.493 +54 -0.548 +55 -0.603 +56 -0.656 +57 -0.708 +58 -0.758 +59 -0.808 +60 -0.857 +61 -0.904 +62 -0.951 +63 -0.998 +64 -1.043 +65 -1.089 +66 -1.134 +67 -1.179 +68 -1.224 +69 -1.269 +70 -1.315 +71 -1.361 +72 -1.409 +73 -1.457 +74 -1.506 +75 -1.557 +76 -1.610 +77 -1.665 +78 -1.722 +79 -1.782 +80 -1.845 +81 -1.911 +82 -1.980 +83 -2.053 +84 -2.130 +85 -2.212 +86 -2.299 +87 -2.390 +88 -2.488 +89 -2.591 +90 -2.701 +1 1.374 +2 1.446 +3 1.508 +4 1.560 +5 1.604 +6 1.640 +7 1.667 +8 1.688 +9 1.701 +10 1.707 +11 1.707 +12 1.702 +13 1.690 +14 1.673 +15 1.652 +16 1.625 +17 1.595 +18 1.560 +19 1.522 +20 1.481 +21 1.436 +22 1.388 +23 1.338 +24 1.286 +25 1.231 +26 1.175 +27 1.117 +28 1.057 +29 0.997 +30 0.935 +31 0.873 +32 0.810 +33 0.746 +34 0.682 +35 0.619 +36 0.555 +37 0.491 +38 0.428 +39 0.364 +40 0.302 +41 0.240 +42 0.179 +43 0.118 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.114 +48 -0.170 +49 -0.225 +50 -0.278 +51 -0.331 +52 -0.382 +53 -0.432 +54 -0.481 +55 -0.530 +56 -0.577 +57 -0.623 +58 -0.668 +59 -0.713 +60 -0.756 +61 -0.799 +62 -0.841 +63 -0.883 +64 -0.925 +65 -0.966 +66 -1.007 +67 -1.048 +68 -1.089 +69 -1.131 +70 -1.173 +71 -1.216 +72 -1.259 +73 -1.304 +74 -1.349 +75 -1.396 +76 -1.445 +77 -1.496 +78 -1.548 +79 -1.603 +80 -1.661 +81 -1.721 +82 -1.785 +83 -1.852 +84 -1.923 +85 -1.998 +86 -2.077 +87 -2.161 +88 -2.249 +89 -2.343 +90 -2.443 +1 1.498 +2 1.571 +3 1.633 +4 1.686 +5 1.730 +6 1.765 +7 1.792 +8 1.811 +9 1.823 +10 1.828 +11 1.826 +12 1.818 +13 1.805 +14 1.785 +15 1.761 +16 1.732 +17 1.698 +18 1.660 +19 1.618 +20 1.573 +21 1.525 +22 1.474 +23 1.420 +24 1.363 +25 1.305 +26 1.245 +27 1.183 +28 1.119 +29 1.055 +30 0.989 +31 0.923 +32 0.856 +33 0.788 +34 0.721 +35 0.653 +36 0.585 +37 0.518 +38 0.451 +39 0.384 +40 0.318 +41 0.253 +42 0.188 +43 0.125 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.120 +48 -0.179 +49 -0.236 +50 -0.292 +51 -0.347 +52 -0.400 +53 -0.453 +54 -0.504 +55 -0.554 +56 -0.603 +57 -0.651 +58 -0.698 +59 -0.744 +60 -0.789 +61 -0.834 +62 -0.877 +63 -0.920 +64 -0.963 +65 -1.005 +66 -1.047 +67 -1.090 +68 -1.132 +69 -1.174 +70 -1.217 +71 -1.260 +72 -1.305 +73 -1.350 +74 -1.397 +75 -1.445 +76 -1.494 +77 -1.546 +78 -1.599 +79 -1.655 +80 -1.714 +81 -1.776 +82 -1.841 +83 -1.909 +84 -1.982 +85 -2.058 +86 -2.139 +87 -2.225 +88 -2.316 +89 -2.413 +90 -2.515 +1 0.961 +2 1.017 +3 1.065 +4 1.107 +5 1.142 +6 1.171 +7 1.194 +8 1.211 +9 1.223 +10 1.230 +11 1.233 +12 1.230 +13 1.224 +14 1.213 +15 1.199 +16 1.182 +17 1.161 +18 1.137 +19 1.110 +20 1.081 +21 1.049 +22 1.015 +23 0.979 +24 0.942 +25 0.902 +26 0.862 +27 0.820 +28 0.777 +29 0.733 +30 0.688 +31 0.643 +32 0.597 +33 0.550 +34 0.504 +35 0.457 +36 0.410 +37 0.363 +38 0.316 +39 0.270 +40 0.224 +41 0.178 +42 0.133 +43 0.088 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.085 +48 -0.127 +49 -0.168 +50 -0.208 +51 -0.247 +52 -0.286 +53 -0.324 +54 -0.361 +55 -0.397 +56 -0.433 +57 -0.468 +58 -0.503 +59 -0.537 +60 -0.570 +61 -0.603 +62 -0.636 +63 -0.668 +64 -0.700 +65 -0.732 +66 -0.764 +67 -0.796 +68 -0.828 +69 -0.860 +70 -0.893 +71 -0.926 +72 -0.960 +73 -0.995 +74 -1.031 +75 -1.068 +76 -1.106 +77 -1.145 +78 -1.187 +79 -1.230 +80 -1.275 +81 -1.322 +82 -1.371 +83 -1.424 +84 -1.478 +85 -1.536 +86 -1.598 +87 -1.662 +88 -1.731 +89 -1.803 +90 -1.880 +1 0.968 +2 1.025 +3 1.075 +4 1.119 +5 1.155 +6 1.185 +7 1.209 +8 1.228 +9 1.240 +10 1.248 +11 1.251 +12 1.249 +13 1.243 +14 1.233 +15 1.219 +16 1.201 +17 1.180 +18 1.156 +19 1.129 +20 1.099 +21 1.067 +22 1.033 +23 0.997 +24 0.959 +25 0.919 +26 0.878 +27 0.835 +28 0.791 +29 0.747 +30 0.701 +31 0.655 +32 0.608 +33 0.561 +34 0.513 +35 0.466 +36 0.418 +37 0.370 +38 0.323 +39 0.275 +40 0.228 +41 0.182 +42 0.135 +43 0.090 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.130 +49 -0.171 +50 -0.212 +51 -0.252 +52 -0.292 +53 -0.331 +54 -0.369 +55 -0.406 +56 -0.442 +57 -0.478 +58 -0.514 +59 -0.548 +60 -0.583 +61 -0.616 +62 -0.650 +63 -0.683 +64 -0.716 +65 -0.749 +66 -0.781 +67 -0.814 +68 -0.847 +69 -0.880 +70 -0.914 +71 -0.948 +72 -0.983 +73 -1.019 +74 -1.056 +75 -1.094 +76 -1.133 +77 -1.174 +78 -1.216 +79 -1.260 +80 -1.307 +81 -1.355 +82 -1.406 +83 -1.460 +84 -1.516 +85 -1.576 +86 -1.639 +87 -1.705 +88 -1.776 +89 -1.850 +90 -1.929 +1 0.997 +2 1.053 +3 1.102 +4 1.144 +5 1.179 +6 1.208 +7 1.231 +8 1.248 +9 1.260 +10 1.266 +11 1.268 +12 1.265 +13 1.258 +14 1.247 +15 1.232 +16 1.213 +17 1.191 +18 1.166 +19 1.139 +20 1.108 +21 1.076 +22 1.041 +23 1.004 +24 0.965 +25 0.924 +26 0.883 +27 0.839 +28 0.795 +29 0.750 +30 0.704 +31 0.657 +32 0.610 +33 0.563 +34 0.515 +35 0.467 +36 0.419 +37 0.371 +38 0.323 +39 0.276 +40 0.228 +41 0.182 +42 0.135 +43 0.090 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.129 +49 -0.171 +50 -0.212 +51 -0.252 +52 -0.291 +53 -0.330 +54 -0.367 +55 -0.404 +56 -0.440 +57 -0.476 +58 -0.511 +59 -0.545 +60 -0.579 +61 -0.613 +62 -0.645 +63 -0.678 +64 -0.710 +65 -0.743 +66 -0.775 +67 -0.807 +68 -0.839 +69 -0.872 +70 -0.905 +71 -0.939 +72 -0.973 +73 -1.008 +74 -1.044 +75 -1.081 +76 -1.119 +77 -1.159 +78 -1.201 +79 -1.244 +80 -1.289 +81 -1.337 +82 -1.387 +83 -1.439 +84 -1.495 +85 -1.553 +86 -1.615 +87 -1.681 +88 -1.750 +89 -1.823 +90 -1.901 +1 1.012 +2 1.072 +3 1.124 +4 1.169 +5 1.207 +6 1.238 +7 1.263 +8 1.282 +9 1.295 +10 1.303 +11 1.306 +12 1.304 +13 1.298 +14 1.287 +15 1.272 +16 1.253 +17 1.232 +18 1.206 +19 1.178 +20 1.147 +21 1.114 +22 1.078 +23 1.040 +24 1.000 +25 0.958 +26 0.915 +27 0.871 +28 0.825 +29 0.779 +30 0.731 +31 0.683 +32 0.634 +33 0.585 +34 0.535 +35 0.485 +36 0.436 +37 0.386 +38 0.336 +39 0.287 +40 0.238 +41 0.189 +42 0.141 +43 0.093 +44 0.046 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.135 +49 -0.178 +50 -0.221 +51 -0.263 +52 -0.304 +53 -0.344 +54 -0.384 +55 -0.423 +56 -0.461 +57 -0.498 +58 -0.535 +59 -0.571 +60 -0.606 +61 -0.642 +62 -0.676 +63 -0.711 +64 -0.745 +65 -0.779 +66 -0.813 +67 -0.847 +68 -0.881 +69 -0.916 +70 -0.951 +71 -0.987 +72 -1.023 +73 -1.060 +74 -1.098 +75 -1.138 +76 -1.179 +77 -1.221 +78 -1.265 +79 -1.311 +80 -1.359 +81 -1.410 +82 -1.463 +83 -1.518 +84 -1.577 +85 -1.639 +86 -1.705 +87 -1.774 +88 -1.847 +89 -1.925 +90 -2.007 +1 1.033 +2 1.093 +3 1.145 +4 1.190 +5 1.228 +6 1.259 +7 1.284 +8 1.303 +9 1.316 +10 1.323 +11 1.326 +12 1.324 +13 1.317 +14 1.305 +15 1.290 +16 1.271 +17 1.249 +18 1.223 +19 1.194 +20 1.163 +21 1.129 +22 1.092 +23 1.054 +24 1.013 +25 0.971 +26 0.927 +27 0.882 +28 0.836 +29 0.788 +30 0.740 +31 0.691 +32 0.642 +33 0.592 +34 0.542 +35 0.491 +36 0.441 +37 0.390 +38 0.340 +39 0.290 +40 0.241 +41 0.191 +42 0.143 +43 0.094 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.092 +48 -0.136 +49 -0.180 +50 -0.223 +51 -0.266 +52 -0.307 +53 -0.348 +54 -0.388 +55 -0.427 +56 -0.465 +57 -0.503 +58 -0.540 +59 -0.576 +60 -0.612 +61 -0.647 +62 -0.682 +63 -0.717 +64 -0.751 +65 -0.785 +66 -0.819 +67 -0.854 +68 -0.888 +69 -0.923 +70 -0.958 +71 -0.994 +72 -1.030 +73 -1.067 +74 -1.106 +75 -1.145 +76 -1.186 +77 -1.229 +78 -1.273 +79 -1.319 +80 -1.367 +81 -1.418 +82 -1.471 +83 -1.527 +84 -1.586 +85 -1.649 +86 -1.714 +87 -1.784 +88 -1.858 +89 -1.935 +90 -2.018 +1 1.015 +2 1.077 +3 1.131 +4 1.178 +5 1.218 +6 1.251 +7 1.277 +8 1.298 +9 1.312 +10 1.321 +11 1.325 +12 1.323 +13 1.317 +14 1.307 +15 1.292 +16 1.274 +17 1.252 +18 1.227 +19 1.199 +20 1.168 +21 1.134 +22 1.098 +23 1.059 +24 1.019 +25 0.977 +26 0.933 +27 0.888 +28 0.842 +29 0.794 +30 0.746 +31 0.697 +32 0.647 +33 0.597 +34 0.547 +35 0.496 +36 0.445 +37 0.394 +38 0.344 +39 0.293 +40 0.243 +41 0.194 +42 0.144 +43 0.096 +44 0.047 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.138 +49 -0.183 +50 -0.227 +51 -0.270 +52 -0.312 +53 -0.353 +54 -0.394 +55 -0.434 +56 -0.473 +57 -0.511 +58 -0.549 +59 -0.586 +60 -0.623 +61 -0.659 +62 -0.695 +63 -0.731 +64 -0.766 +65 -0.802 +66 -0.837 +67 -0.872 +68 -0.908 +69 -0.944 +70 -0.980 +71 -1.017 +72 -1.055 +73 -1.093 +74 -1.133 +75 -1.174 +76 -1.216 +77 -1.260 +78 -1.306 +79 -1.354 +80 -1.404 +81 -1.456 +82 -1.512 +83 -1.569 +84 -1.630 +85 -1.695 +86 -1.763 +87 -1.835 +88 -1.911 +89 -1.991 +90 -2.076 +1 0.952 +2 1.012 +3 1.064 +4 1.109 +5 1.147 +6 1.179 +7 1.204 +8 1.224 +9 1.238 +10 1.247 +11 1.251 +12 1.250 +13 1.244 +14 1.235 +15 1.222 +16 1.205 +17 1.184 +18 1.161 +19 1.134 +20 1.105 +21 1.073 +22 1.039 +23 1.003 +24 0.965 +25 0.925 +26 0.884 +27 0.841 +28 0.798 +29 0.753 +30 0.707 +31 0.661 +32 0.614 +33 0.566 +34 0.518 +35 0.470 +36 0.422 +37 0.374 +38 0.326 +39 0.278 +40 0.231 +41 0.184 +42 0.137 +43 0.091 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.088 +48 -0.131 +49 -0.174 +50 -0.215 +51 -0.256 +52 -0.297 +53 -0.336 +54 -0.375 +55 -0.413 +56 -0.450 +57 -0.487 +58 -0.523 +59 -0.559 +60 -0.594 +61 -0.629 +62 -0.663 +63 -0.697 +64 -0.731 +65 -0.765 +66 -0.799 +67 -0.833 +68 -0.867 +69 -0.901 +70 -0.936 +71 -0.972 +72 -1.008 +73 -1.045 +74 -1.083 +75 -1.122 +76 -1.163 +77 -1.205 +78 -1.249 +79 -1.295 +80 -1.343 +81 -1.393 +82 -1.446 +83 -1.502 +84 -1.560 +85 -1.622 +86 -1.687 +87 -1.755 +88 -1.828 +89 -1.905 +90 -1.986 +1 0.797 +2 0.856 +3 0.908 +4 0.953 +5 0.992 +6 1.025 +7 1.052 +8 1.073 +9 1.089 +10 1.101 +11 1.107 +12 1.109 +13 1.107 +14 1.101 +15 1.091 +16 1.078 +17 1.062 +18 1.042 +19 1.020 +20 0.995 +21 0.968 +22 0.938 +23 0.907 +24 0.873 +25 0.838 +26 0.802 +27 0.764 +28 0.725 +29 0.685 +30 0.644 +31 0.602 +32 0.560 +33 0.517 +34 0.474 +35 0.430 +36 0.387 +37 0.343 +38 0.299 +39 0.256 +40 0.212 +41 0.169 +42 0.126 +43 0.084 +44 0.042 +45 -0.000 +46 -0.041 +47 -0.082 +48 -0.122 +49 -0.161 +50 -0.200 +51 -0.238 +52 -0.276 +53 -0.313 +54 -0.349 +55 -0.385 +56 -0.420 +57 -0.455 +58 -0.490 +59 -0.524 +60 -0.557 +61 -0.591 +62 -0.624 +63 -0.656 +64 -0.689 +65 -0.722 +66 -0.755 +67 -0.788 +68 -0.821 +69 -0.855 +70 -0.889 +71 -0.924 +72 -0.959 +73 -0.996 +74 -1.033 +75 -1.072 +76 -1.112 +77 -1.154 +78 -1.197 +79 -1.242 +80 -1.289 +81 -1.339 +82 -1.390 +83 -1.445 +84 -1.502 +85 -1.562 +86 -1.626 +87 -1.693 +88 -1.763 +89 -1.838 +90 -1.917 +1 0.611 +2 0.665 +3 0.713 +4 0.755 +5 0.791 +6 0.822 +7 0.848 +8 0.870 +9 0.886 +10 0.899 +11 0.907 +12 0.911 +13 0.912 +14 0.909 +15 0.903 +16 0.894 +17 0.882 +18 0.868 +19 0.851 +20 0.831 +21 0.810 +22 0.786 +23 0.761 +24 0.734 +25 0.705 +26 0.675 +27 0.644 +28 0.612 +29 0.579 +30 0.545 +31 0.510 +32 0.475 +33 0.439 +34 0.403 +35 0.366 +36 0.330 +37 0.293 +38 0.256 +39 0.219 +40 0.182 +41 0.145 +42 0.108 +43 0.072 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.070 +48 -0.105 +49 -0.139 +50 -0.173 +51 -0.206 +52 -0.239 +53 -0.272 +54 -0.304 +55 -0.335 +56 -0.367 +57 -0.398 +58 -0.428 +59 -0.459 +60 -0.489 +61 -0.518 +62 -0.548 +63 -0.578 +64 -0.608 +65 -0.637 +66 -0.667 +67 -0.697 +68 -0.728 +69 -0.759 +70 -0.790 +71 -0.822 +72 -0.855 +73 -0.888 +74 -0.923 +75 -0.958 +76 -0.995 +77 -1.033 +78 -1.073 +79 -1.115 +80 -1.158 +81 -1.203 +82 -1.250 +83 -1.300 +84 -1.352 +85 -1.407 +86 -1.465 +87 -1.525 +88 -1.589 +89 -1.657 +90 -1.728 +1 0.401 +2 0.453 +3 0.499 +4 0.540 +5 0.576 +6 0.608 +7 0.635 +8 0.657 +9 0.676 +10 0.691 +11 0.703 +12 0.710 +13 0.715 +14 0.717 +15 0.715 +16 0.711 +17 0.705 +18 0.695 +19 0.684 +20 0.671 +21 0.655 +22 0.638 +23 0.619 +24 0.599 +25 0.577 +26 0.554 +27 0.530 +28 0.504 +29 0.478 +30 0.451 +31 0.423 +32 0.395 +33 0.366 +34 0.336 +35 0.306 +36 0.276 +37 0.245 +38 0.215 +39 0.184 +40 0.153 +41 0.122 +42 0.092 +43 0.061 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.090 +49 -0.120 +50 -0.149 +51 -0.178 +52 -0.207 +53 -0.235 +54 -0.264 +55 -0.292 +56 -0.320 +57 -0.347 +58 -0.375 +59 -0.402 +60 -0.430 +61 -0.457 +62 -0.484 +63 -0.511 +64 -0.539 +65 -0.567 +66 -0.594 +67 -0.623 +68 -0.651 +69 -0.680 +70 -0.710 +71 -0.740 +72 -0.771 +73 -0.803 +74 -0.836 +75 -0.870 +76 -0.905 +77 -0.941 +78 -0.979 +79 -1.018 +80 -1.059 +81 -1.102 +82 -1.147 +83 -1.194 +84 -1.243 +85 -1.294 +86 -1.348 +87 -1.405 +88 -1.465 +89 -1.528 +90 -1.594 +1 0.287 +2 0.338 +3 0.384 +4 0.425 +5 0.462 +6 0.494 +7 0.522 +8 0.546 +9 0.567 +10 0.583 +11 0.597 +12 0.607 +13 0.613 +14 0.618 +15 0.619 +16 0.617 +17 0.614 +18 0.608 +19 0.599 +20 0.589 +21 0.577 +22 0.563 +23 0.548 +24 0.531 +25 0.512 +26 0.493 +27 0.472 +28 0.450 +29 0.428 +30 0.404 +31 0.380 +32 0.355 +33 0.329 +34 0.303 +35 0.276 +36 0.249 +37 0.222 +38 0.195 +39 0.167 +40 0.139 +41 0.111 +42 0.084 +43 0.056 +44 0.028 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.083 +49 -0.110 +50 -0.137 +51 -0.164 +52 -0.191 +53 -0.218 +54 -0.244 +55 -0.271 +56 -0.297 +57 -0.323 +58 -0.349 +59 -0.375 +60 -0.401 +61 -0.428 +62 -0.454 +63 -0.480 +64 -0.507 +65 -0.533 +66 -0.560 +67 -0.588 +68 -0.616 +69 -0.644 +70 -0.673 +71 -0.703 +72 -0.733 +73 -0.764 +74 -0.796 +75 -0.830 +76 -0.864 +77 -0.900 +78 -0.937 +79 -0.975 +80 -1.015 +81 -1.057 +82 -1.101 +83 -1.146 +84 -1.194 +85 -1.245 +86 -1.297 +87 -1.352 +88 -1.410 +89 -1.471 +90 -1.535 +1 0.211 +2 0.262 +3 0.309 +4 0.351 +5 0.388 +6 0.421 +7 0.450 +8 0.476 +9 0.497 +10 0.515 +11 0.530 +12 0.542 +13 0.551 +14 0.556 +15 0.560 +16 0.560 +17 0.558 +18 0.554 +19 0.548 +20 0.540 +21 0.530 +22 0.519 +23 0.505 +24 0.491 +25 0.475 +26 0.457 +27 0.439 +28 0.419 +29 0.398 +30 0.377 +31 0.355 +32 0.332 +33 0.308 +34 0.284 +35 0.260 +36 0.235 +37 0.209 +38 0.184 +39 0.158 +40 0.132 +41 0.105 +42 0.079 +43 0.053 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.053 +48 -0.079 +49 -0.105 +50 -0.131 +51 -0.157 +52 -0.183 +53 -0.209 +54 -0.235 +55 -0.261 +56 -0.286 +57 -0.312 +58 -0.338 +59 -0.363 +60 -0.389 +61 -0.415 +62 -0.441 +63 -0.467 +64 -0.493 +65 -0.520 +66 -0.547 +67 -0.574 +68 -0.602 +69 -0.631 +70 -0.660 +71 -0.690 +72 -0.720 +73 -0.752 +74 -0.784 +75 -0.818 +76 -0.852 +77 -0.888 +78 -0.926 +79 -0.964 +80 -1.005 +81 -1.047 +82 -1.091 +83 -1.137 +84 -1.185 +85 -1.235 +86 -1.288 +87 -1.343 +88 -1.401 +89 -1.461 +90 -1.525 +1 0.154 +2 0.203 +3 0.249 +4 0.289 +5 0.326 +6 0.359 +7 0.388 +8 0.413 +9 0.435 +10 0.453 +11 0.468 +12 0.481 +13 0.490 +14 0.497 +15 0.501 +16 0.503 +17 0.503 +18 0.500 +19 0.496 +20 0.489 +21 0.481 +22 0.471 +23 0.460 +24 0.447 +25 0.433 +26 0.418 +27 0.401 +28 0.384 +29 0.365 +30 0.346 +31 0.326 +32 0.305 +33 0.284 +34 0.262 +35 0.239 +36 0.217 +37 0.193 +38 0.170 +39 0.146 +40 0.122 +41 0.098 +42 0.073 +43 0.049 +44 0.025 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.074 +49 -0.098 +50 -0.123 +51 -0.147 +52 -0.171 +53 -0.196 +54 -0.220 +55 -0.244 +56 -0.269 +57 -0.293 +58 -0.317 +59 -0.342 +60 -0.366 +61 -0.391 +62 -0.416 +63 -0.441 +64 -0.466 +65 -0.492 +66 -0.518 +67 -0.544 +68 -0.571 +69 -0.599 +70 -0.627 +71 -0.656 +72 -0.685 +73 -0.716 +74 -0.747 +75 -0.780 +76 -0.813 +77 -0.848 +78 -0.884 +79 -0.922 +80 -0.961 +81 -1.002 +82 -1.044 +83 -1.088 +84 -1.135 +85 -1.183 +86 -1.234 +87 -1.287 +88 -1.343 +89 -1.402 +90 -1.463 +1 0.319 +2 0.375 +3 0.426 +4 0.472 +5 0.512 +6 0.548 +7 0.579 +8 0.605 +9 0.627 +10 0.646 +11 0.661 +12 0.672 +13 0.679 +14 0.684 +15 0.685 +16 0.683 +17 0.679 +18 0.672 +19 0.663 +20 0.652 +21 0.639 +22 0.623 +23 0.606 +24 0.587 +25 0.567 +26 0.545 +27 0.522 +28 0.498 +29 0.473 +30 0.447 +31 0.420 +32 0.392 +33 0.364 +34 0.335 +35 0.306 +36 0.276 +37 0.246 +38 0.215 +39 0.185 +40 0.154 +41 0.123 +42 0.092 +43 0.062 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.092 +49 -0.122 +50 -0.152 +51 -0.182 +52 -0.211 +53 -0.241 +54 -0.270 +55 -0.300 +56 -0.329 +57 -0.358 +58 -0.387 +59 -0.416 +60 -0.445 +61 -0.474 +62 -0.503 +63 -0.532 +64 -0.561 +65 -0.591 +66 -0.621 +67 -0.651 +68 -0.682 +69 -0.714 +70 -0.746 +71 -0.779 +72 -0.813 +73 -0.847 +74 -0.883 +75 -0.920 +76 -0.958 +77 -0.998 +78 -1.039 +79 -1.082 +80 -1.127 +81 -1.173 +82 -1.222 +83 -1.273 +84 -1.326 +85 -1.382 +86 -1.440 +87 -1.502 +88 -1.566 +89 -1.634 +90 -1.705 +1 0.472 +2 0.531 +3 0.584 +4 0.631 +5 0.673 +6 0.709 +7 0.740 +8 0.766 +9 0.788 +10 0.805 +11 0.818 +12 0.826 +13 0.831 +14 0.833 +15 0.831 +16 0.826 +17 0.818 +18 0.807 +19 0.794 +20 0.778 +21 0.760 +22 0.740 +23 0.718 +24 0.694 +25 0.669 +26 0.642 +27 0.613 +28 0.584 +29 0.553 +30 0.522 +31 0.490 +32 0.457 +33 0.423 +34 0.389 +35 0.354 +36 0.319 +37 0.284 +38 0.248 +39 0.213 +40 0.177 +41 0.141 +42 0.106 +43 0.070 +44 0.035 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.104 +49 -0.138 +50 -0.172 +51 -0.205 +52 -0.238 +53 -0.271 +54 -0.303 +55 -0.336 +56 -0.368 +57 -0.399 +58 -0.431 +59 -0.462 +60 -0.494 +61 -0.525 +62 -0.556 +63 -0.587 +64 -0.619 +65 -0.650 +66 -0.682 +67 -0.714 +68 -0.747 +69 -0.780 +70 -0.814 +71 -0.849 +72 -0.884 +73 -0.920 +74 -0.958 +75 -0.997 +76 -1.037 +77 -1.078 +78 -1.121 +79 -1.166 +80 -1.213 +81 -1.262 +82 -1.314 +83 -1.367 +84 -1.424 +85 -1.483 +86 -1.545 +87 -1.610 +88 -1.679 +89 -1.751 +90 -1.827 +1 0.702 +2 0.769 +3 0.828 +4 0.880 +5 0.925 +6 0.964 +7 0.997 +8 1.023 +9 1.045 +10 1.061 +11 1.072 +12 1.078 +13 1.080 +14 1.078 +15 1.071 +16 1.061 +17 1.048 +18 1.031 +19 1.012 +20 0.989 +21 0.964 +22 0.936 +23 0.907 +24 0.875 +25 0.841 +26 0.806 +27 0.769 +28 0.731 +29 0.691 +30 0.651 +31 0.610 +32 0.568 +33 0.525 +34 0.482 +35 0.438 +36 0.394 +37 0.350 +38 0.306 +39 0.262 +40 0.218 +41 0.173 +42 0.130 +43 0.086 +44 0.043 +45 -0.000 +46 -0.042 +47 -0.085 +48 -0.126 +49 -0.167 +50 -0.208 +51 -0.248 +52 -0.287 +53 -0.327 +54 -0.365 +55 -0.403 +56 -0.441 +57 -0.478 +58 -0.515 +59 -0.552 +60 -0.588 +61 -0.625 +62 -0.661 +63 -0.697 +64 -0.733 +65 -0.769 +66 -0.805 +67 -0.842 +68 -0.879 +69 -0.917 +70 -0.955 +71 -0.994 +72 -1.034 +73 -1.075 +74 -1.117 +75 -1.161 +76 -1.206 +77 -1.253 +78 -1.302 +79 -1.353 +80 -1.406 +81 -1.461 +82 -1.519 +83 -1.580 +84 -1.644 +85 -1.711 +86 -1.782 +87 -1.856 +88 -1.935 +89 -2.018 +90 -2.105 +1 0.882 +2 0.947 +3 1.005 +4 1.055 +5 1.098 +6 1.134 +7 1.164 +8 1.188 +9 1.206 +10 1.219 +11 1.226 +12 1.228 +13 1.226 +14 1.219 +15 1.209 +16 1.194 +17 1.176 +18 1.154 +19 1.129 +20 1.102 +21 1.072 +22 1.039 +23 1.004 +24 0.967 +25 0.928 +26 0.888 +27 0.846 +28 0.803 +29 0.758 +30 0.713 +31 0.667 +32 0.620 +33 0.573 +34 0.525 +35 0.476 +36 0.428 +37 0.380 +38 0.331 +39 0.283 +40 0.235 +41 0.187 +42 0.140 +43 0.093 +44 0.046 +45 -0.000 +46 -0.045 +47 -0.090 +48 -0.135 +49 -0.178 +50 -0.221 +51 -0.264 +52 -0.305 +53 -0.346 +54 -0.386 +55 -0.426 +56 -0.465 +57 -0.504 +58 -0.542 +59 -0.579 +60 -0.617 +61 -0.653 +62 -0.690 +63 -0.726 +64 -0.763 +65 -0.799 +66 -0.835 +67 -0.872 +68 -0.909 +69 -0.946 +70 -0.984 +71 -1.023 +72 -1.062 +73 -1.103 +74 -1.144 +75 -1.187 +76 -1.232 +77 -1.278 +78 -1.326 +79 -1.376 +80 -1.428 +81 -1.483 +82 -1.541 +83 -1.601 +84 -1.665 +85 -1.732 +86 -1.803 +87 -1.877 +88 -1.956 +89 -2.039 +90 -2.127 +1 1.038 +2 1.105 +3 1.163 +4 1.214 +5 1.257 +6 1.293 +7 1.322 +8 1.344 +9 1.361 +10 1.371 +11 1.376 +12 1.376 +13 1.370 +14 1.360 +15 1.346 +16 1.328 +17 1.306 +18 1.280 +19 1.251 +20 1.219 +21 1.184 +22 1.147 +23 1.107 +24 1.065 +25 1.021 +26 0.976 +27 0.929 +28 0.881 +29 0.831 +30 0.781 +31 0.730 +32 0.678 +33 0.626 +34 0.573 +35 0.520 +36 0.467 +37 0.414 +38 0.361 +39 0.308 +40 0.255 +41 0.203 +42 0.152 +43 0.100 +44 0.050 +45 -0.000 +46 -0.049 +47 -0.098 +48 -0.145 +49 -0.192 +50 -0.238 +51 -0.284 +52 -0.328 +53 -0.372 +54 -0.415 +55 -0.457 +56 -0.498 +57 -0.539 +58 -0.579 +59 -0.619 +60 -0.658 +61 -0.696 +62 -0.735 +63 -0.773 +64 -0.810 +65 -0.848 +66 -0.886 +67 -0.923 +68 -0.962 +69 -1.000 +70 -1.039 +71 -1.079 +72 -1.119 +73 -1.161 +74 -1.204 +75 -1.248 +76 -1.293 +77 -1.341 +78 -1.390 +79 -1.441 +80 -1.495 +81 -1.552 +82 -1.611 +83 -1.673 +84 -1.739 +85 -1.808 +86 -1.881 +87 -1.959 +88 -2.040 +89 -2.127 +90 -2.218 +1 1.122 +2 1.184 +3 1.238 +4 1.285 +5 1.324 +6 1.356 +7 1.381 +8 1.400 +9 1.413 +10 1.420 +11 1.422 +12 1.418 +13 1.410 +14 1.397 +15 1.380 +16 1.359 +17 1.334 +18 1.306 +19 1.275 +20 1.241 +21 1.204 +22 1.165 +23 1.123 +24 1.079 +25 1.034 +26 0.987 +27 0.939 +28 0.889 +29 0.839 +30 0.787 +31 0.735 +32 0.682 +33 0.629 +34 0.575 +35 0.522 +36 0.468 +37 0.414 +38 0.361 +39 0.308 +40 0.255 +41 0.203 +42 0.151 +43 0.100 +44 0.050 +45 -0.000 +46 -0.049 +47 -0.097 +48 -0.144 +49 -0.191 +50 -0.236 +51 -0.281 +52 -0.324 +53 -0.367 +54 -0.409 +55 -0.450 +56 -0.490 +57 -0.530 +58 -0.569 +59 -0.607 +60 -0.645 +61 -0.682 +62 -0.718 +63 -0.754 +64 -0.790 +65 -0.826 +66 -0.862 +67 -0.897 +68 -0.933 +69 -0.969 +70 -1.006 +71 -1.043 +72 -1.081 +73 -1.120 +74 -1.160 +75 -1.201 +76 -1.244 +77 -1.288 +78 -1.335 +79 -1.383 +80 -1.433 +81 -1.486 +82 -1.542 +83 -1.601 +84 -1.663 +85 -1.728 +86 -1.797 +87 -1.871 +88 -1.948 +89 -2.030 +90 -2.117 +1 1.054 +2 1.110 +3 1.158 +4 1.199 +5 1.234 +6 1.262 +7 1.284 +8 1.300 +9 1.311 +10 1.316 +11 1.317 +12 1.313 +13 1.304 +14 1.291 +15 1.275 +16 1.255 +17 1.232 +18 1.205 +19 1.176 +20 1.144 +21 1.109 +22 1.073 +23 1.034 +24 0.994 +25 0.952 +26 0.908 +27 0.863 +28 0.817 +29 0.771 +30 0.723 +31 0.675 +32 0.626 +33 0.577 +34 0.528 +35 0.478 +36 0.429 +37 0.380 +38 0.331 +39 0.282 +40 0.234 +41 0.186 +42 0.138 +43 0.092 +44 0.045 +45 -0.000 +46 -0.045 +47 -0.089 +48 -0.132 +49 -0.174 +50 -0.215 +51 -0.256 +52 -0.296 +53 -0.335 +54 -0.373 +55 -0.410 +56 -0.447 +57 -0.483 +58 -0.518 +59 -0.552 +60 -0.586 +61 -0.620 +62 -0.653 +63 -0.685 +64 -0.717 +65 -0.750 +66 -0.782 +67 -0.814 +68 -0.846 +69 -0.878 +70 -0.911 +71 -0.944 +72 -0.978 +73 -1.013 +74 -1.049 +75 -1.086 +76 -1.124 +77 -1.164 +78 -1.205 +79 -1.248 +80 -1.293 +81 -1.341 +82 -1.391 +83 -1.443 +84 -1.499 +85 -1.558 +86 -1.620 +87 -1.685 +88 -1.755 +89 -1.829 +90 -1.907 +1 0.956 +2 1.002 +3 1.042 +4 1.075 +5 1.103 +6 1.125 +7 1.142 +8 1.155 +9 1.162 +10 1.165 +11 1.164 +12 1.158 +13 1.149 +14 1.137 +15 1.121 +16 1.103 +17 1.081 +18 1.057 +19 1.030 +20 1.002 +21 0.971 +22 0.938 +23 0.904 +24 0.868 +25 0.830 +26 0.792 +27 0.752 +28 0.712 +29 0.671 +30 0.629 +31 0.587 +32 0.544 +33 0.501 +34 0.458 +35 0.415 +36 0.372 +37 0.329 +38 0.286 +39 0.244 +40 0.202 +41 0.161 +42 0.120 +43 0.079 +44 0.039 +45 -0.000 +46 -0.039 +47 -0.076 +48 -0.113 +49 -0.150 +50 -0.185 +51 -0.220 +52 -0.254 +53 -0.287 +54 -0.320 +55 -0.352 +56 -0.383 +57 -0.413 +58 -0.443 +59 -0.472 +60 -0.501 +61 -0.529 +62 -0.556 +63 -0.584 +64 -0.611 +65 -0.638 +66 -0.664 +67 -0.691 +68 -0.718 +69 -0.745 +70 -0.772 +71 -0.800 +72 -0.828 +73 -0.857 +74 -0.886 +75 -0.917 +76 -0.948 +77 -0.981 +78 -1.016 +79 -1.051 +80 -1.089 +81 -1.128 +82 -1.170 +83 -1.214 +84 -1.260 +85 -1.309 +86 -1.361 +87 -1.416 +88 -1.474 +89 -1.536 +90 -1.602 +1 0.796 +2 0.833 +3 0.865 +4 0.893 +5 0.915 +6 0.933 +7 0.947 +8 0.956 +9 0.962 +10 0.964 +11 0.962 +12 0.958 +13 0.950 +14 0.940 +15 0.926 +16 0.911 +17 0.893 +18 0.872 +19 0.850 +20 0.826 +21 0.801 +22 0.774 +23 0.745 +24 0.715 +25 0.684 +26 0.653 +27 0.620 +28 0.586 +29 0.552 +30 0.518 +31 0.483 +32 0.448 +33 0.413 +34 0.377 +35 0.342 +36 0.306 +37 0.271 +38 0.236 +39 0.201 +40 0.166 +41 0.132 +42 0.098 +43 0.065 +44 0.032 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.093 +49 -0.123 +50 -0.152 +51 -0.181 +52 -0.208 +53 -0.236 +54 -0.262 +55 -0.288 +56 -0.314 +57 -0.339 +58 -0.363 +59 -0.387 +60 -0.410 +61 -0.433 +62 -0.455 +63 -0.478 +64 -0.500 +65 -0.522 +66 -0.543 +67 -0.565 +68 -0.587 +69 -0.609 +70 -0.631 +71 -0.653 +72 -0.676 +73 -0.700 +74 -0.724 +75 -0.749 +76 -0.775 +77 -0.801 +78 -0.829 +79 -0.858 +80 -0.889 +81 -0.921 +82 -0.955 +83 -0.991 +84 -1.029 +85 -1.069 +86 -1.111 +87 -1.156 +88 -1.204 +89 -1.254 +90 -1.308 +1 0.668 +2 0.695 +3 0.719 +4 0.738 +5 0.754 +6 0.766 +7 0.775 +8 0.781 +9 0.784 +10 0.784 +11 0.782 +12 0.776 +13 0.769 +14 0.759 +15 0.748 +16 0.734 +17 0.719 +18 0.702 +19 0.683 +20 0.663 +21 0.642 +22 0.619 +23 0.596 +24 0.572 +25 0.547 +26 0.521 +27 0.494 +28 0.467 +29 0.440 +30 0.412 +31 0.384 +32 0.356 +33 0.327 +34 0.299 +35 0.271 +36 0.242 +37 0.214 +38 0.186 +39 0.159 +40 0.131 +41 0.104 +42 0.077 +43 0.051 +44 0.025 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.073 +49 -0.096 +50 -0.119 +51 -0.141 +52 -0.163 +53 -0.184 +54 -0.204 +55 -0.224 +56 -0.244 +57 -0.263 +58 -0.282 +59 -0.300 +60 -0.318 +61 -0.335 +62 -0.352 +63 -0.369 +64 -0.385 +65 -0.402 +66 -0.418 +67 -0.434 +68 -0.450 +69 -0.467 +70 -0.483 +71 -0.500 +72 -0.517 +73 -0.534 +74 -0.552 +75 -0.570 +76 -0.589 +77 -0.609 +78 -0.629 +79 -0.651 +80 -0.674 +81 -0.697 +82 -0.723 +83 -0.749 +84 -0.777 +85 -0.807 +86 -0.839 +87 -0.873 +88 -0.908 +89 -0.947 +90 -0.987 +1 0.420 +2 0.436 +3 0.450 +4 0.462 +5 0.471 +6 0.478 +7 0.483 +8 0.486 +9 0.488 +10 0.487 +11 0.485 +12 0.482 +13 0.477 +14 0.470 +15 0.463 +16 0.454 +17 0.444 +18 0.434 +19 0.422 +20 0.409 +21 0.396 +22 0.382 +23 0.367 +24 0.352 +25 0.337 +26 0.320 +27 0.304 +28 0.287 +29 0.270 +30 0.253 +31 0.236 +32 0.218 +33 0.201 +34 0.183 +35 0.166 +36 0.148 +37 0.131 +38 0.114 +39 0.097 +40 0.080 +41 0.064 +42 0.047 +43 0.031 +44 0.015 +45 -0.000 +46 -0.015 +47 -0.030 +48 -0.044 +49 -0.058 +50 -0.072 +51 -0.086 +52 -0.099 +53 -0.111 +54 -0.124 +55 -0.136 +56 -0.147 +57 -0.159 +58 -0.170 +59 -0.181 +60 -0.191 +61 -0.202 +62 -0.212 +63 -0.222 +64 -0.231 +65 -0.241 +66 -0.251 +67 -0.260 +68 -0.270 +69 -0.279 +70 -0.289 +71 -0.299 +72 -0.309 +73 -0.319 +74 -0.329 +75 -0.340 +76 -0.351 +77 -0.363 +78 -0.375 +79 -0.388 +80 -0.402 +81 -0.416 +82 -0.431 +83 -0.447 +84 -0.464 +85 -0.482 +86 -0.501 +87 -0.521 +88 -0.543 +89 -0.566 +90 -0.590 +1 0.226 +2 0.230 +3 0.233 +4 0.236 +5 0.237 +6 0.238 +7 0.238 +8 0.237 +9 0.235 +10 0.233 +11 0.230 +12 0.227 +13 0.223 +14 0.219 +15 0.214 +16 0.208 +17 0.203 +18 0.197 +19 0.191 +20 0.184 +21 0.177 +22 0.170 +23 0.163 +24 0.155 +25 0.148 +26 0.140 +27 0.133 +28 0.125 +29 0.117 +30 0.109 +31 0.101 +32 0.093 +33 0.085 +34 0.078 +35 0.070 +36 0.062 +37 0.055 +38 0.048 +39 0.040 +40 0.033 +41 0.026 +42 0.019 +43 0.013 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.023 +50 -0.029 +51 -0.034 +52 -0.039 +53 -0.043 +54 -0.048 +55 -0.052 +56 -0.056 +57 -0.060 +58 -0.064 +59 -0.068 +60 -0.071 +61 -0.074 +62 -0.078 +63 -0.081 +64 -0.084 +65 -0.087 +66 -0.089 +67 -0.092 +68 -0.095 +69 -0.097 +70 -0.100 +71 -0.103 +72 -0.105 +73 -0.108 +74 -0.111 +75 -0.114 +76 -0.117 +77 -0.120 +78 -0.123 +79 -0.127 +80 -0.131 +81 -0.135 +82 -0.139 +83 -0.144 +84 -0.149 +85 -0.154 +86 -0.160 +87 -0.167 +88 -0.174 +89 -0.181 +90 -0.189 +1 -0.012 +2 -0.021 +3 -0.028 +4 -0.035 +5 -0.041 +6 -0.047 +7 -0.051 +8 -0.056 +9 -0.060 +10 -0.063 +11 -0.066 +12 -0.068 +13 -0.070 +14 -0.071 +15 -0.073 +16 -0.073 +17 -0.074 +18 -0.074 +19 -0.073 +20 -0.073 +21 -0.072 +22 -0.070 +23 -0.069 +24 -0.067 +25 -0.065 +26 -0.063 +27 -0.061 +28 -0.058 +29 -0.056 +30 -0.053 +31 -0.050 +32 -0.047 +33 -0.044 +34 -0.041 +35 -0.037 +36 -0.034 +37 -0.030 +38 -0.027 +39 -0.023 +40 -0.019 +41 -0.015 +42 -0.012 +43 -0.008 +44 -0.004 +45 0.000 +46 0.004 +47 0.008 +48 0.012 +49 0.016 +50 0.020 +51 0.024 +52 0.028 +53 0.031 +54 0.035 +55 0.039 +56 0.043 +57 0.047 +58 0.051 +59 0.055 +60 0.059 +61 0.063 +62 0.068 +63 0.072 +64 0.076 +65 0.080 +66 0.084 +67 0.089 +68 0.093 +69 0.097 +70 0.102 +71 0.107 +72 0.111 +73 0.116 +74 0.121 +75 0.126 +76 0.132 +77 0.137 +78 0.143 +79 0.149 +80 0.155 +81 0.161 +82 0.167 +83 0.174 +84 0.181 +85 0.188 +86 0.196 +87 0.204 +88 0.212 +89 0.221 +90 0.230 +1 -0.172 +2 -0.192 +3 -0.209 +4 -0.224 +5 -0.238 +6 -0.250 +7 -0.260 +8 -0.268 +9 -0.275 +10 -0.280 +11 -0.284 +12 -0.287 +13 -0.288 +14 -0.288 +15 -0.287 +16 -0.285 +17 -0.282 +18 -0.278 +19 -0.274 +20 -0.268 +21 -0.262 +22 -0.255 +23 -0.247 +24 -0.239 +25 -0.230 +26 -0.220 +27 -0.211 +28 -0.200 +29 -0.190 +30 -0.179 +31 -0.168 +32 -0.156 +33 -0.145 +34 -0.133 +35 -0.121 +36 -0.109 +37 -0.097 +38 -0.085 +39 -0.073 +40 -0.061 +41 -0.048 +42 -0.036 +43 -0.024 +44 -0.012 +45 0.000 +46 0.012 +47 0.024 +48 0.035 +49 0.047 +50 0.059 +51 0.070 +52 0.081 +53 0.092 +54 0.103 +55 0.114 +56 0.125 +57 0.136 +58 0.146 +59 0.157 +60 0.167 +61 0.178 +62 0.188 +63 0.199 +64 0.209 +65 0.220 +66 0.230 +67 0.241 +68 0.252 +69 0.263 +70 0.274 +71 0.285 +72 0.297 +73 0.309 +74 0.321 +75 0.334 +76 0.347 +77 0.360 +78 0.374 +79 0.389 +80 0.404 +81 0.420 +82 0.436 +83 0.453 +84 0.472 +85 0.491 +86 0.510 +87 0.531 +88 0.553 +89 0.577 +90 0.601 +1 -0.413 +2 -0.443 +3 -0.469 +4 -0.492 +5 -0.512 +6 -0.529 +7 -0.542 +8 -0.553 +9 -0.561 +10 -0.567 +11 -0.570 +12 -0.571 +13 -0.570 +14 -0.566 +15 -0.561 +16 -0.555 +17 -0.546 +18 -0.536 +19 -0.524 +20 -0.512 +21 -0.498 +22 -0.482 +23 -0.466 +24 -0.449 +25 -0.431 +26 -0.412 +27 -0.393 +28 -0.373 +29 -0.352 +30 -0.331 +31 -0.310 +32 -0.288 +33 -0.266 +34 -0.244 +35 -0.221 +36 -0.199 +37 -0.176 +38 -0.154 +39 -0.131 +40 -0.109 +41 -0.087 +42 -0.065 +43 -0.043 +44 -0.021 +45 0.000 +46 0.021 +47 0.042 +48 0.063 +49 0.083 +50 0.103 +51 0.122 +52 0.142 +53 0.161 +54 0.179 +55 0.198 +56 0.216 +57 0.234 +58 0.251 +59 0.269 +60 0.286 +61 0.303 +62 0.320 +63 0.337 +64 0.353 +65 0.370 +66 0.387 +67 0.404 +68 0.421 +69 0.438 +70 0.455 +71 0.473 +72 0.491 +73 0.509 +74 0.528 +75 0.548 +76 0.568 +77 0.589 +78 0.610 +79 0.633 +80 0.657 +81 0.681 +82 0.707 +83 0.735 +84 0.763 +85 0.794 +86 0.825 +87 0.859 +88 0.894 +89 0.932 +90 0.971 +1 -0.576 +2 -0.614 +3 -0.648 +4 -0.678 +5 -0.703 +6 -0.724 +7 -0.741 +8 -0.755 +9 -0.765 +10 -0.771 +11 -0.774 +12 -0.775 +13 -0.772 +14 -0.767 +15 -0.760 +16 -0.750 +17 -0.738 +18 -0.724 +19 -0.708 +20 -0.690 +21 -0.670 +22 -0.650 +23 -0.627 +24 -0.604 +25 -0.579 +26 -0.554 +27 -0.528 +28 -0.500 +29 -0.472 +30 -0.444 +31 -0.415 +32 -0.386 +33 -0.356 +34 -0.326 +35 -0.296 +36 -0.266 +37 -0.236 +38 -0.206 +39 -0.176 +40 -0.146 +41 -0.116 +42 -0.087 +43 -0.057 +44 -0.029 +45 0.000 +46 0.028 +47 0.056 +48 0.083 +49 0.110 +50 0.137 +51 0.163 +52 0.188 +53 0.214 +54 0.238 +55 0.263 +56 0.287 +57 0.310 +58 0.333 +59 0.356 +60 0.379 +61 0.401 +62 0.423 +63 0.445 +64 0.467 +65 0.489 +66 0.511 +67 0.533 +68 0.555 +69 0.577 +70 0.600 +71 0.623 +72 0.647 +73 0.671 +74 0.695 +75 0.721 +76 0.747 +77 0.774 +78 0.803 +79 0.832 +80 0.863 +81 0.896 +82 0.930 +83 0.966 +84 1.003 +85 1.043 +86 1.084 +87 1.128 +88 1.175 +89 1.224 +90 1.276 +1 -0.829 +2 -0.878 +3 -0.921 +4 -0.958 +5 -0.989 +6 -1.015 +7 -1.035 +8 -1.051 +9 -1.062 +10 -1.069 +11 -1.071 +12 -1.070 +13 -1.065 +14 -1.056 +15 -1.044 +16 -1.029 +17 -1.011 +18 -0.990 +19 -0.967 +20 -0.942 +21 -0.915 +22 -0.885 +23 -0.854 +24 -0.822 +25 -0.788 +26 -0.752 +27 -0.716 +28 -0.678 +29 -0.640 +30 -0.601 +31 -0.561 +32 -0.521 +33 -0.481 +34 -0.440 +35 -0.399 +36 -0.358 +37 -0.318 +38 -0.277 +39 -0.236 +40 -0.196 +41 -0.156 +42 -0.116 +43 -0.077 +44 -0.038 +45 0.000 +46 0.038 +47 0.075 +48 0.111 +49 0.147 +50 0.182 +51 0.217 +52 0.251 +53 0.284 +54 0.317 +55 0.349 +56 0.380 +57 0.411 +58 0.441 +59 0.471 +60 0.500 +61 0.529 +62 0.558 +63 0.587 +64 0.615 +65 0.643 +66 0.671 +67 0.699 +68 0.728 +69 0.756 +70 0.785 +71 0.814 +72 0.844 +73 0.875 +74 0.906 +75 0.939 +76 0.972 +77 1.007 +78 1.043 +79 1.081 +80 1.121 +81 1.162 +82 1.206 +83 1.251 +84 1.299 +85 1.350 +86 1.404 +87 1.461 +88 1.521 +89 1.584 +90 1.651 +1 -1.008 +2 -1.065 +3 -1.114 +4 -1.156 +5 -1.192 +6 -1.221 +7 -1.244 +8 -1.262 +9 -1.273 +10 -1.280 +11 -1.282 +12 -1.279 +13 -1.272 +14 -1.260 +15 -1.245 +16 -1.226 +17 -1.204 +18 -1.179 +19 -1.151 +20 -1.121 +21 -1.087 +22 -1.052 +23 -1.015 +24 -0.976 +25 -0.935 +26 -0.892 +27 -0.849 +28 -0.804 +29 -0.758 +30 -0.712 +31 -0.665 +32 -0.617 +33 -0.569 +34 -0.521 +35 -0.472 +36 -0.424 +37 -0.375 +38 -0.327 +39 -0.279 +40 -0.231 +41 -0.184 +42 -0.137 +43 -0.091 +44 -0.045 +45 0.000 +46 0.044 +47 0.088 +48 0.131 +49 0.173 +50 0.214 +51 0.255 +52 0.295 +53 0.333 +54 0.372 +55 0.409 +56 0.446 +57 0.482 +58 0.517 +59 0.552 +60 0.586 +61 0.620 +62 0.653 +63 0.686 +64 0.719 +65 0.751 +66 0.784 +67 0.816 +68 0.849 +69 0.882 +70 0.915 +71 0.949 +72 0.983 +73 1.019 +74 1.055 +75 1.092 +76 1.131 +77 1.171 +78 1.212 +79 1.256 +80 1.301 +81 1.349 +82 1.399 +83 1.452 +84 1.508 +85 1.567 +86 1.629 +87 1.694 +88 1.764 +89 1.837 +90 1.915 +1 -1.271 +2 -1.334 +3 -1.388 +4 -1.434 +5 -1.472 +6 -1.503 +7 -1.526 +8 -1.543 +9 -1.554 +10 -1.558 +11 -1.557 +12 -1.551 +13 -1.539 +14 -1.523 +15 -1.503 +16 -1.478 +17 -1.450 +18 -1.418 +19 -1.382 +20 -1.344 +21 -1.303 +22 -1.259 +23 -1.213 +24 -1.165 +25 -1.116 +26 -1.064 +27 -1.011 +28 -0.957 +29 -0.902 +30 -0.846 +31 -0.789 +32 -0.732 +33 -0.675 +34 -0.617 +35 -0.559 +36 -0.501 +37 -0.443 +38 -0.386 +39 -0.329 +40 -0.272 +41 -0.217 +42 -0.161 +43 -0.107 +44 -0.053 +45 0.000 +46 0.052 +47 0.103 +48 0.153 +49 0.202 +50 0.250 +51 0.297 +52 0.343 +53 0.388 +54 0.432 +55 0.476 +56 0.518 +57 0.559 +58 0.599 +59 0.639 +60 0.678 +61 0.716 +62 0.753 +63 0.790 +64 0.827 +65 0.864 +66 0.900 +67 0.936 +68 0.973 +69 1.009 +70 1.046 +71 1.083 +72 1.122 +73 1.161 +74 1.201 +75 1.242 +76 1.285 +77 1.329 +78 1.375 +79 1.423 +80 1.474 +81 1.527 +82 1.583 +83 1.642 +84 1.704 +85 1.769 +86 1.839 +87 1.912 +88 1.991 +89 2.073 +90 2.161 +1 -1.416 +2 -1.478 +3 -1.531 +4 -1.576 +5 -1.613 +6 -1.642 +7 -1.664 +8 -1.678 +9 -1.687 +10 -1.689 +11 -1.685 +12 -1.675 +13 -1.661 +14 -1.641 +15 -1.617 +16 -1.589 +17 -1.556 +18 -1.520 +19 -1.481 +20 -1.439 +21 -1.394 +22 -1.346 +23 -1.296 +24 -1.244 +25 -1.189 +26 -1.134 +27 -1.077 +28 -1.018 +29 -0.959 +30 -0.899 +31 -0.838 +32 -0.777 +33 -0.715 +34 -0.654 +35 -0.592 +36 -0.530 +37 -0.469 +38 -0.408 +39 -0.348 +40 -0.288 +41 -0.228 +42 -0.170 +43 -0.112 +44 -0.056 +45 0.000 +46 0.055 +47 0.108 +48 0.161 +49 0.212 +50 0.262 +51 0.312 +52 0.360 +53 0.406 +54 0.452 +55 0.497 +56 0.540 +57 0.583 +58 0.624 +59 0.665 +60 0.704 +61 0.743 +62 0.782 +63 0.819 +64 0.857 +65 0.894 +66 0.930 +67 0.967 +68 1.003 +69 1.040 +70 1.077 +71 1.114 +72 1.153 +73 1.192 +74 1.232 +75 1.273 +76 1.315 +77 1.360 +78 1.406 +79 1.454 +80 1.505 +81 1.558 +82 1.614 +83 1.673 +84 1.736 +85 1.802 +86 1.872 +87 1.946 +88 2.025 +89 2.109 +90 2.198 +1 -1.658 +2 -1.723 +3 -1.778 +4 -1.824 +5 -1.861 +6 -1.889 +7 -1.910 +8 -1.923 +9 -1.928 +10 -1.927 +11 -1.919 +12 -1.906 +13 -1.887 +14 -1.862 +15 -1.832 +16 -1.798 +17 -1.760 +18 -1.718 +19 -1.672 +20 -1.622 +21 -1.570 +22 -1.515 +23 -1.457 +24 -1.398 +25 -1.336 +26 -1.272 +27 -1.207 +28 -1.141 +29 -1.074 +30 -1.006 +31 -0.937 +32 -0.868 +33 -0.799 +34 -0.730 +35 -0.660 +36 -0.591 +37 -0.522 +38 -0.454 +39 -0.387 +40 -0.320 +41 -0.254 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.120 +48 0.178 +49 0.234 +50 0.290 +51 0.344 +52 0.396 +53 0.447 +54 0.497 +55 0.546 +56 0.593 +57 0.639 +58 0.684 +59 0.728 +60 0.770 +61 0.812 +62 0.853 +63 0.894 +64 0.933 +65 0.972 +66 1.011 +67 1.050 +68 1.088 +69 1.127 +70 1.166 +71 1.205 +72 1.245 +73 1.286 +74 1.328 +75 1.371 +76 1.416 +77 1.462 +78 1.511 +79 1.561 +80 1.614 +81 1.670 +82 1.729 +83 1.792 +84 1.858 +85 1.928 +86 2.002 +87 2.081 +88 2.165 +89 2.254 +90 2.349 +1 -1.687 +2 -1.746 +3 -1.796 +4 -1.837 +5 -1.869 +6 -1.893 +7 -1.910 +8 -1.919 +9 -1.921 +10 -1.917 +11 -1.907 +12 -1.890 +13 -1.869 +14 -1.843 +15 -1.811 +16 -1.776 +17 -1.736 +18 -1.693 +19 -1.646 +20 -1.596 +21 -1.544 +22 -1.488 +23 -1.431 +24 -1.371 +25 -1.310 +26 -1.246 +27 -1.182 +28 -1.117 +29 -1.050 +30 -0.983 +31 -0.915 +32 -0.847 +33 -0.779 +34 -0.711 +35 -0.643 +36 -0.575 +37 -0.508 +38 -0.442 +39 -0.376 +40 -0.310 +41 -0.246 +42 -0.183 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.116 +48 0.172 +49 0.226 +50 0.279 +51 0.331 +52 0.381 +53 0.430 +54 0.478 +55 0.524 +56 0.569 +57 0.612 +58 0.655 +59 0.696 +60 0.736 +61 0.775 +62 0.814 +63 0.851 +64 0.888 +65 0.924 +66 0.960 +67 0.996 +68 1.031 +69 1.066 +70 1.102 +71 1.138 +72 1.174 +73 1.212 +74 1.250 +75 1.289 +76 1.330 +77 1.372 +78 1.416 +79 1.462 +80 1.511 +81 1.562 +82 1.616 +83 1.673 +84 1.734 +85 1.798 +86 1.867 +87 1.940 +88 2.017 +89 2.100 +90 2.188 +1 -1.781 +2 -1.839 +3 -1.887 +4 -1.926 +5 -1.956 +6 -1.978 +7 -1.993 +8 -2.000 +9 -2.000 +10 -1.993 +11 -1.981 +12 -1.962 +13 -1.938 +14 -1.910 +15 -1.876 +16 -1.838 +17 -1.796 +18 -1.750 +19 -1.701 +20 -1.648 +21 -1.593 +22 -1.535 +23 -1.475 +24 -1.413 +25 -1.349 +26 -1.283 +27 -1.216 +28 -1.148 +29 -1.079 +30 -1.010 +31 -0.940 +32 -0.870 +33 -0.800 +34 -0.729 +35 -0.659 +36 -0.590 +37 -0.521 +38 -0.452 +39 -0.384 +40 -0.318 +41 -0.252 +42 -0.187 +43 -0.123 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.175 +49 0.230 +50 0.284 +51 0.337 +52 0.388 +53 0.437 +54 0.485 +55 0.532 +56 0.577 +57 0.621 +58 0.664 +59 0.705 +60 0.745 +61 0.784 +62 0.823 +63 0.860 +64 0.897 +65 0.932 +66 0.968 +67 1.003 +68 1.038 +69 1.073 +70 1.108 +71 1.143 +72 1.179 +73 1.216 +74 1.253 +75 1.292 +76 1.332 +77 1.373 +78 1.417 +79 1.462 +80 1.510 +81 1.560 +82 1.613 +83 1.670 +84 1.730 +85 1.794 +86 1.861 +87 1.934 +88 2.011 +89 2.093 +90 2.181 +1 -1.752 +2 -1.804 +3 -1.848 +4 -1.882 +5 -1.909 +6 -1.928 +7 -1.939 +8 -1.944 +9 -1.942 +10 -1.934 +11 -1.920 +12 -1.900 +13 -1.875 +14 -1.846 +15 -1.812 +16 -1.774 +17 -1.732 +18 -1.687 +19 -1.639 +20 -1.587 +21 -1.533 +22 -1.477 +23 -1.418 +24 -1.358 +25 -1.295 +26 -1.232 +27 -1.167 +28 -1.101 +29 -1.035 +30 -0.968 +31 -0.901 +32 -0.833 +33 -0.765 +34 -0.698 +35 -0.631 +36 -0.564 +37 -0.497 +38 -0.432 +39 -0.367 +40 -0.303 +41 -0.240 +42 -0.178 +43 -0.118 +44 -0.058 +45 0.000 +46 0.057 +47 0.112 +48 0.166 +49 0.219 +50 0.270 +51 0.319 +52 0.368 +53 0.414 +54 0.459 +55 0.503 +56 0.546 +57 0.587 +58 0.627 +59 0.665 +60 0.703 +61 0.739 +62 0.774 +63 0.809 +64 0.842 +65 0.876 +66 0.908 +67 0.940 +68 0.972 +69 1.004 +70 1.036 +71 1.068 +72 1.101 +73 1.134 +74 1.168 +75 1.203 +76 1.239 +77 1.277 +78 1.316 +79 1.357 +80 1.401 +81 1.447 +82 1.495 +83 1.547 +84 1.602 +85 1.660 +86 1.723 +87 1.789 +88 1.860 +89 1.936 +90 2.017 +1 -1.741 +2 -1.796 +3 -1.842 +4 -1.878 +5 -1.907 +6 -1.928 +7 -1.941 +8 -1.947 +9 -1.946 +10 -1.939 +11 -1.926 +12 -1.908 +13 -1.884 +14 -1.855 +15 -1.822 +16 -1.785 +17 -1.743 +18 -1.698 +19 -1.650 +20 -1.599 +21 -1.545 +22 -1.489 +23 -1.430 +24 -1.369 +25 -1.307 +26 -1.243 +27 -1.178 +28 -1.112 +29 -1.045 +30 -0.978 +31 -0.910 +32 -0.842 +33 -0.774 +34 -0.706 +35 -0.638 +36 -0.570 +37 -0.503 +38 -0.437 +39 -0.372 +40 -0.307 +41 -0.243 +42 -0.181 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.114 +48 0.169 +49 0.222 +50 0.274 +51 0.325 +52 0.374 +53 0.421 +54 0.467 +55 0.512 +56 0.556 +57 0.598 +58 0.638 +59 0.678 +60 0.716 +61 0.754 +62 0.790 +63 0.826 +64 0.861 +65 0.895 +66 0.929 +67 0.962 +68 0.996 +69 1.029 +70 1.062 +71 1.096 +72 1.130 +73 1.164 +74 1.200 +75 1.236 +76 1.274 +77 1.314 +78 1.355 +79 1.398 +80 1.444 +81 1.492 +82 1.542 +83 1.596 +84 1.653 +85 1.714 +86 1.779 +87 1.848 +88 1.922 +89 2.001 +90 2.085 +1 -1.643 +2 -1.698 +3 -1.744 +4 -1.782 +5 -1.811 +6 -1.833 +7 -1.847 +8 -1.855 +9 -1.856 +10 -1.851 +11 -1.840 +12 -1.823 +13 -1.802 +14 -1.775 +15 -1.744 +16 -1.710 +17 -1.671 +18 -1.629 +19 -1.583 +20 -1.534 +21 -1.483 +22 -1.430 +23 -1.374 +24 -1.316 +25 -1.257 +26 -1.196 +27 -1.134 +28 -1.071 +29 -1.007 +30 -0.942 +31 -0.877 +32 -0.812 +33 -0.746 +34 -0.681 +35 -0.615 +36 -0.551 +37 -0.486 +38 -0.422 +39 -0.359 +40 -0.297 +41 -0.235 +42 -0.175 +43 -0.115 +44 -0.057 +45 0.000 +46 0.056 +47 0.110 +48 0.164 +49 0.215 +50 0.266 +51 0.315 +52 0.363 +53 0.409 +54 0.454 +55 0.498 +56 0.541 +57 0.582 +58 0.622 +59 0.661 +60 0.699 +61 0.736 +62 0.772 +63 0.807 +64 0.841 +65 0.876 +66 0.909 +67 0.942 +68 0.976 +69 1.009 +70 1.042 +71 1.076 +72 1.110 +73 1.145 +74 1.180 +75 1.217 +76 1.255 +77 1.295 +78 1.336 +79 1.379 +80 1.425 +81 1.473 +82 1.524 +83 1.577 +84 1.635 +85 1.695 +86 1.760 +87 1.829 +88 1.902 +89 1.981 +90 2.064 +1 -1.555 +2 -1.611 +3 -1.659 +4 -1.699 +5 -1.730 +6 -1.754 +7 -1.770 +8 -1.780 +9 -1.783 +10 -1.780 +11 -1.772 +12 -1.757 +13 -1.738 +14 -1.714 +15 -1.686 +16 -1.653 +17 -1.617 +18 -1.577 +19 -1.534 +20 -1.488 +21 -1.439 +22 -1.388 +23 -1.334 +24 -1.279 +25 -1.222 +26 -1.163 +27 -1.103 +28 -1.042 +29 -0.981 +30 -0.918 +31 -0.855 +32 -0.792 +33 -0.728 +34 -0.664 +35 -0.601 +36 -0.538 +37 -0.475 +38 -0.413 +39 -0.351 +40 -0.290 +41 -0.230 +42 -0.171 +43 -0.113 +44 -0.056 +45 0.000 +46 0.055 +47 0.108 +48 0.161 +49 0.212 +50 0.262 +51 0.310 +52 0.357 +53 0.403 +54 0.448 +55 0.492 +56 0.534 +57 0.575 +58 0.615 +59 0.654 +60 0.692 +61 0.729 +62 0.765 +63 0.801 +64 0.836 +65 0.870 +66 0.904 +67 0.938 +68 0.972 +69 1.006 +70 1.040 +71 1.074 +72 1.109 +73 1.145 +74 1.182 +75 1.220 +76 1.259 +77 1.299 +78 1.342 +79 1.386 +80 1.433 +81 1.482 +82 1.534 +83 1.589 +84 1.648 +85 1.710 +86 1.775 +87 1.845 +88 1.920 +89 1.999 +90 2.084 +1 -1.410 +2 -1.470 +3 -1.521 +4 -1.563 +5 -1.598 +6 -1.625 +7 -1.645 +8 -1.658 +9 -1.665 +10 -1.666 +11 -1.661 +12 -1.651 +13 -1.636 +14 -1.616 +15 -1.591 +16 -1.563 +17 -1.530 +18 -1.494 +19 -1.455 +20 -1.413 +21 -1.368 +22 -1.321 +23 -1.271 +24 -1.220 +25 -1.166 +26 -1.111 +27 -1.055 +28 -0.998 +29 -0.939 +30 -0.880 +31 -0.820 +32 -0.760 +33 -0.700 +34 -0.639 +35 -0.579 +36 -0.518 +37 -0.458 +38 -0.398 +39 -0.339 +40 -0.281 +41 -0.223 +42 -0.166 +43 -0.110 +44 -0.054 +45 0.000 +46 0.053 +47 0.105 +48 0.157 +49 0.207 +50 0.255 +51 0.303 +52 0.349 +53 0.395 +54 0.439 +55 0.482 +56 0.524 +57 0.565 +58 0.605 +59 0.645 +60 0.683 +61 0.721 +62 0.757 +63 0.794 +64 0.830 +65 0.865 +66 0.900 +67 0.935 +68 0.970 +69 1.005 +70 1.041 +71 1.077 +72 1.114 +73 1.151 +74 1.189 +75 1.229 +76 1.270 +77 1.313 +78 1.357 +79 1.404 +80 1.453 +81 1.504 +82 1.558 +83 1.615 +84 1.676 +85 1.740 +86 1.808 +87 1.880 +88 1.957 +89 2.038 +90 2.125 +1 -1.352 +2 -1.417 +3 -1.473 +4 -1.520 +5 -1.559 +6 -1.590 +7 -1.614 +8 -1.631 +9 -1.642 +10 -1.646 +11 -1.644 +12 -1.636 +13 -1.624 +14 -1.606 +15 -1.584 +16 -1.557 +17 -1.527 +18 -1.493 +19 -1.455 +20 -1.414 +21 -1.371 +22 -1.324 +23 -1.276 +24 -1.225 +25 -1.172 +26 -1.118 +27 -1.062 +28 -1.005 +29 -0.947 +30 -0.888 +31 -0.828 +32 -0.768 +33 -0.708 +34 -0.647 +35 -0.586 +36 -0.525 +37 -0.465 +38 -0.404 +39 -0.345 +40 -0.285 +41 -0.227 +42 -0.169 +43 -0.112 +44 -0.055 +45 0.000 +46 0.054 +47 0.108 +48 0.160 +49 0.211 +50 0.262 +51 0.311 +52 0.359 +53 0.406 +54 0.451 +55 0.496 +56 0.540 +57 0.583 +58 0.625 +59 0.666 +60 0.706 +61 0.746 +62 0.785 +63 0.824 +64 0.862 +65 0.900 +66 0.937 +67 0.975 +68 1.013 +69 1.051 +70 1.089 +71 1.128 +72 1.168 +73 1.208 +74 1.250 +75 1.293 +76 1.338 +77 1.384 +78 1.432 +79 1.483 +80 1.536 +81 1.591 +82 1.650 +83 1.711 +84 1.777 +85 1.846 +86 1.919 +87 1.996 +88 2.078 +89 2.166 +90 2.258 +1 -1.209 +2 -1.275 +3 -1.333 +4 -1.382 +5 -1.423 +6 -1.457 +7 -1.483 +8 -1.503 +9 -1.516 +10 -1.523 +11 -1.524 +12 -1.520 +13 -1.511 +14 -1.497 +15 -1.478 +16 -1.456 +17 -1.429 +18 -1.399 +19 -1.365 +20 -1.328 +21 -1.288 +22 -1.246 +23 -1.201 +24 -1.155 +25 -1.106 +26 -1.056 +27 -1.004 +28 -0.950 +29 -0.896 +30 -0.841 +31 -0.785 +32 -0.729 +33 -0.672 +34 -0.614 +35 -0.557 +36 -0.500 +37 -0.442 +38 -0.385 +39 -0.328 +40 -0.272 +41 -0.216 +42 -0.161 +43 -0.107 +44 -0.053 +45 0.000 +46 0.052 +47 0.103 +48 0.154 +49 0.203 +50 0.251 +51 0.299 +52 0.345 +53 0.391 +54 0.435 +55 0.479 +56 0.522 +57 0.564 +58 0.605 +59 0.645 +60 0.685 +61 0.725 +62 0.763 +63 0.802 +64 0.840 +65 0.877 +66 0.915 +67 0.953 +68 0.991 +69 1.029 +70 1.068 +71 1.107 +72 1.148 +73 1.189 +74 1.231 +75 1.275 +76 1.320 +77 1.367 +78 1.416 +79 1.467 +80 1.521 +81 1.577 +82 1.636 +83 1.699 +84 1.765 +85 1.834 +86 1.908 +87 1.986 +88 2.068 +89 2.155 +90 2.248 +1 -1.217 +2 -1.286 +3 -1.346 +4 -1.398 +5 -1.441 +6 -1.477 +7 -1.505 +8 -1.526 +9 -1.540 +10 -1.549 +11 -1.551 +12 -1.547 +13 -1.539 +14 -1.525 +15 -1.507 +16 -1.484 +17 -1.457 +18 -1.427 +19 -1.393 +20 -1.356 +21 -1.316 +22 -1.273 +23 -1.228 +24 -1.180 +25 -1.131 +26 -1.080 +27 -1.027 +28 -0.973 +29 -0.917 +30 -0.861 +31 -0.804 +32 -0.746 +33 -0.688 +34 -0.630 +35 -0.571 +36 -0.512 +37 -0.454 +38 -0.395 +39 -0.337 +40 -0.279 +41 -0.222 +42 -0.166 +43 -0.110 +44 -0.054 +45 0.000 +46 0.054 +47 0.106 +48 0.158 +49 0.209 +50 0.259 +51 0.308 +52 0.356 +53 0.403 +54 0.449 +55 0.494 +56 0.538 +57 0.582 +58 0.624 +59 0.666 +60 0.708 +61 0.748 +62 0.789 +63 0.829 +64 0.868 +65 0.908 +66 0.947 +67 0.987 +68 1.026 +69 1.066 +70 1.107 +71 1.148 +72 1.190 +73 1.234 +74 1.278 +75 1.324 +76 1.371 +77 1.420 +78 1.472 +79 1.525 +80 1.581 +81 1.640 +82 1.702 +83 1.767 +84 1.836 +85 1.909 +86 1.985 +87 2.067 +88 2.153 +89 2.244 +90 2.340 +1 -1.128 +2 -1.195 +3 -1.254 +4 -1.304 +5 -1.347 +6 -1.382 +7 -1.410 +8 -1.432 +9 -1.447 +10 -1.456 +11 -1.459 +12 -1.457 +13 -1.450 +14 -1.438 +15 -1.421 +16 -1.401 +17 -1.376 +18 -1.348 +19 -1.317 +20 -1.282 +21 -1.245 +22 -1.205 +23 -1.162 +24 -1.118 +25 -1.071 +26 -1.023 +27 -0.973 +28 -0.922 +29 -0.870 +30 -0.817 +31 -0.763 +32 -0.708 +33 -0.653 +34 -0.598 +35 -0.542 +36 -0.487 +37 -0.431 +38 -0.376 +39 -0.321 +40 -0.266 +41 -0.211 +42 -0.158 +43 -0.104 +44 -0.052 +45 0.000 +46 0.051 +47 0.101 +48 0.151 +49 0.199 +50 0.247 +51 0.294 +52 0.340 +53 0.385 +54 0.429 +55 0.472 +56 0.515 +57 0.557 +58 0.598 +59 0.638 +60 0.678 +61 0.717 +62 0.756 +63 0.795 +64 0.833 +65 0.872 +66 0.910 +67 0.948 +68 0.987 +69 1.026 +70 1.065 +71 1.105 +72 1.146 +73 1.188 +74 1.231 +75 1.276 +76 1.322 +77 1.370 +78 1.420 +79 1.472 +80 1.526 +81 1.584 +82 1.644 +83 1.707 +84 1.774 +85 1.844 +86 1.919 +87 1.997 +88 2.081 +89 2.169 +90 2.262 +1 -1.144 +2 -1.212 +3 -1.270 +4 -1.321 +5 -1.364 +6 -1.399 +7 -1.427 +8 -1.449 +9 -1.464 +10 -1.473 +11 -1.476 +12 -1.473 +13 -1.466 +14 -1.454 +15 -1.437 +16 -1.416 +17 -1.391 +18 -1.362 +19 -1.331 +20 -1.296 +21 -1.258 +22 -1.217 +23 -1.174 +24 -1.129 +25 -1.082 +26 -1.033 +27 -0.983 +28 -0.931 +29 -0.879 +30 -0.825 +31 -0.770 +32 -0.715 +33 -0.660 +34 -0.604 +35 -0.548 +36 -0.491 +37 -0.435 +38 -0.379 +39 -0.324 +40 -0.268 +41 -0.213 +42 -0.159 +43 -0.105 +44 -0.052 +45 0.000 +46 0.052 +47 0.102 +48 0.152 +49 0.201 +50 0.249 +51 0.296 +52 0.343 +53 0.388 +54 0.433 +55 0.476 +56 0.519 +57 0.561 +58 0.603 +59 0.643 +60 0.684 +61 0.723 +62 0.762 +63 0.801 +64 0.840 +65 0.878 +66 0.917 +67 0.955 +68 0.994 +69 1.033 +70 1.073 +71 1.113 +72 1.155 +73 1.197 +74 1.240 +75 1.285 +76 1.332 +77 1.380 +78 1.430 +79 1.482 +80 1.537 +81 1.595 +82 1.655 +83 1.719 +84 1.786 +85 1.857 +86 1.932 +87 2.011 +88 2.095 +89 2.184 +90 2.278 +1 -1.050 +2 -1.115 +3 -1.171 +4 -1.220 +5 -1.261 +6 -1.295 +7 -1.322 +8 -1.343 +9 -1.358 +10 -1.367 +11 -1.371 +12 -1.370 +13 -1.363 +14 -1.353 +15 -1.338 +16 -1.319 +17 -1.296 +18 -1.270 +19 -1.240 +20 -1.208 +21 -1.173 +22 -1.135 +23 -1.096 +24 -1.054 +25 -1.010 +26 -0.965 +27 -0.918 +28 -0.870 +29 -0.821 +30 -0.771 +31 -0.720 +32 -0.669 +33 -0.617 +34 -0.565 +35 -0.512 +36 -0.460 +37 -0.407 +38 -0.355 +39 -0.303 +40 -0.251 +41 -0.200 +42 -0.149 +43 -0.099 +44 -0.049 +45 0.000 +46 0.048 +47 0.096 +48 0.143 +49 0.189 +50 0.234 +51 0.278 +52 0.321 +53 0.364 +54 0.406 +55 0.447 +56 0.487 +57 0.527 +58 0.566 +59 0.605 +60 0.642 +61 0.680 +62 0.717 +63 0.754 +64 0.790 +65 0.827 +66 0.863 +67 0.899 +68 0.936 +69 0.973 +70 1.011 +71 1.049 +72 1.088 +73 1.129 +74 1.170 +75 1.212 +76 1.256 +77 1.302 +78 1.350 +79 1.400 +80 1.452 +81 1.507 +82 1.564 +83 1.625 +84 1.689 +85 1.756 +86 1.827 +87 1.902 +88 1.982 +89 2.066 +90 2.155 +1 -1.121 +2 -1.187 +3 -1.245 +4 -1.294 +5 -1.336 +6 -1.370 +7 -1.398 +8 -1.419 +9 -1.433 +10 -1.442 +11 -1.445 +12 -1.442 +13 -1.435 +14 -1.423 +15 -1.406 +16 -1.386 +17 -1.361 +18 -1.333 +19 -1.302 +20 -1.268 +21 -1.231 +22 -1.191 +23 -1.149 +24 -1.105 +25 -1.059 +26 -1.011 +27 -0.962 +28 -0.911 +29 -0.860 +30 -0.807 +31 -0.754 +32 -0.700 +33 -0.645 +34 -0.591 +35 -0.536 +36 -0.481 +37 -0.426 +38 -0.371 +39 -0.316 +40 -0.262 +41 -0.209 +42 -0.156 +43 -0.103 +44 -0.051 +45 0.000 +46 0.050 +47 0.100 +48 0.149 +49 0.196 +50 0.243 +51 0.290 +52 0.335 +53 0.379 +54 0.423 +55 0.465 +56 0.507 +57 0.548 +58 0.589 +59 0.628 +60 0.667 +61 0.706 +62 0.744 +63 0.782 +64 0.820 +65 0.857 +66 0.895 +67 0.932 +68 0.970 +69 1.008 +70 1.047 +71 1.086 +72 1.126 +73 1.168 +74 1.210 +75 1.254 +76 1.299 +77 1.346 +78 1.395 +79 1.446 +80 1.499 +81 1.556 +82 1.615 +83 1.677 +84 1.742 +85 1.811 +86 1.885 +87 1.962 +88 2.044 +89 2.130 +90 2.222 +1 -1.080 +2 -1.144 +3 -1.200 +4 -1.248 +5 -1.289 +6 -1.323 +7 -1.349 +8 -1.370 +9 -1.384 +10 -1.393 +11 -1.396 +12 -1.394 +13 -1.387 +14 -1.375 +15 -1.359 +16 -1.340 +17 -1.316 +18 -1.289 +19 -1.259 +20 -1.226 +21 -1.190 +22 -1.152 +23 -1.111 +24 -1.069 +25 -1.024 +26 -0.978 +27 -0.931 +28 -0.882 +29 -0.832 +30 -0.781 +31 -0.729 +32 -0.677 +33 -0.625 +34 -0.572 +35 -0.519 +36 -0.465 +37 -0.412 +38 -0.359 +39 -0.306 +40 -0.254 +41 -0.202 +42 -0.151 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.097 +48 0.144 +49 0.190 +50 0.236 +51 0.281 +52 0.325 +53 0.368 +54 0.410 +55 0.451 +56 0.492 +57 0.532 +58 0.571 +59 0.610 +60 0.648 +61 0.685 +62 0.722 +63 0.759 +64 0.796 +65 0.832 +66 0.869 +67 0.905 +68 0.942 +69 0.979 +70 1.017 +71 1.055 +72 1.094 +73 1.135 +74 1.176 +75 1.218 +76 1.262 +77 1.308 +78 1.356 +79 1.406 +80 1.458 +81 1.512 +82 1.570 +83 1.630 +84 1.694 +85 1.762 +86 1.833 +87 1.908 +88 1.988 +89 2.072 +90 2.161 +1 -1.122 +2 -1.188 +3 -1.246 +4 -1.295 +5 -1.337 +6 -1.371 +7 -1.399 +8 -1.419 +9 -1.434 +10 -1.442 +11 -1.445 +12 -1.443 +13 -1.435 +14 -1.423 +15 -1.407 +16 -1.386 +17 -1.362 +18 -1.334 +19 -1.302 +20 -1.268 +21 -1.231 +22 -1.191 +23 -1.149 +24 -1.105 +25 -1.059 +26 -1.011 +27 -0.962 +28 -0.911 +29 -0.860 +30 -0.807 +31 -0.754 +32 -0.700 +33 -0.645 +34 -0.590 +35 -0.536 +36 -0.481 +37 -0.426 +38 -0.371 +39 -0.316 +40 -0.262 +41 -0.209 +42 -0.155 +43 -0.103 +44 -0.051 +45 0.000 +46 0.050 +47 0.100 +48 0.149 +49 0.196 +50 0.243 +51 0.290 +52 0.335 +53 0.379 +54 0.423 +55 0.465 +56 0.507 +57 0.548 +58 0.589 +59 0.628 +60 0.667 +61 0.706 +62 0.744 +63 0.782 +64 0.820 +65 0.857 +66 0.895 +67 0.932 +68 0.970 +69 1.008 +70 1.047 +71 1.086 +72 1.126 +73 1.168 +74 1.210 +75 1.254 +76 1.299 +77 1.346 +78 1.395 +79 1.446 +80 1.499 +81 1.556 +82 1.615 +83 1.677 +84 1.742 +85 1.811 +86 1.885 +87 1.962 +88 2.044 +89 2.130 +90 2.222 +1 -1.053 +2 -1.118 +3 -1.174 +4 -1.222 +5 -1.263 +6 -1.297 +7 -1.324 +8 -1.345 +9 -1.359 +10 -1.368 +11 -1.372 +12 -1.371 +13 -1.364 +14 -1.353 +15 -1.338 +16 -1.319 +17 -1.296 +18 -1.270 +19 -1.241 +20 -1.208 +21 -1.173 +22 -1.136 +23 -1.096 +24 -1.054 +25 -1.010 +26 -0.965 +27 -0.918 +28 -0.870 +29 -0.821 +30 -0.771 +31 -0.720 +32 -0.669 +33 -0.617 +34 -0.565 +35 -0.512 +36 -0.460 +37 -0.407 +38 -0.355 +39 -0.303 +40 -0.251 +41 -0.200 +42 -0.149 +43 -0.099 +44 -0.049 +45 0.000 +46 0.048 +47 0.096 +48 0.143 +49 0.189 +50 0.234 +51 0.278 +52 0.321 +53 0.364 +54 0.406 +55 0.447 +56 0.487 +57 0.527 +58 0.566 +59 0.605 +60 0.642 +61 0.680 +62 0.717 +63 0.754 +64 0.790 +65 0.827 +66 0.863 +67 0.899 +68 0.936 +69 0.973 +70 1.011 +71 1.049 +72 1.088 +73 1.129 +74 1.170 +75 1.212 +76 1.256 +77 1.302 +78 1.350 +79 1.400 +80 1.452 +81 1.506 +82 1.564 +83 1.624 +84 1.688 +85 1.755 +86 1.826 +87 1.902 +88 1.981 +89 2.065 +90 2.154 +1 -1.146 +2 -1.213 +3 -1.272 +4 -1.323 +5 -1.366 +6 -1.401 +7 -1.430 +8 -1.451 +9 -1.466 +10 -1.475 +11 -1.478 +12 -1.476 +13 -1.468 +14 -1.456 +15 -1.439 +16 -1.418 +17 -1.393 +18 -1.364 +19 -1.332 +20 -1.297 +21 -1.259 +22 -1.219 +23 -1.176 +24 -1.131 +25 -1.083 +26 -1.035 +27 -0.984 +28 -0.933 +29 -0.880 +30 -0.826 +31 -0.771 +32 -0.716 +33 -0.661 +34 -0.604 +35 -0.548 +36 -0.492 +37 -0.436 +38 -0.380 +39 -0.324 +40 -0.269 +41 -0.214 +42 -0.159 +43 -0.105 +44 -0.052 +45 0.000 +46 0.052 +47 0.102 +48 0.152 +49 0.201 +50 0.249 +51 0.297 +52 0.343 +53 0.388 +54 0.433 +55 0.477 +56 0.519 +57 0.562 +58 0.603 +59 0.644 +60 0.684 +61 0.723 +62 0.763 +63 0.801 +64 0.840 +65 0.878 +66 0.917 +67 0.955 +68 0.994 +69 1.033 +70 1.073 +71 1.113 +72 1.155 +73 1.197 +74 1.240 +75 1.285 +76 1.331 +77 1.380 +78 1.430 +79 1.482 +80 1.537 +81 1.595 +82 1.655 +83 1.719 +84 1.786 +85 1.857 +86 1.932 +87 2.011 +88 2.095 +89 2.184 +90 2.278 +1 -1.131 +2 -1.198 +3 -1.257 +4 -1.307 +5 -1.350 +6 -1.385 +7 -1.413 +8 -1.435 +9 -1.450 +10 -1.459 +11 -1.462 +12 -1.460 +13 -1.452 +14 -1.440 +15 -1.424 +16 -1.403 +17 -1.379 +18 -1.350 +19 -1.319 +20 -1.284 +21 -1.247 +22 -1.206 +23 -1.164 +24 -1.119 +25 -1.073 +26 -1.024 +27 -0.975 +28 -0.924 +29 -0.871 +30 -0.818 +31 -0.764 +32 -0.709 +33 -0.654 +34 -0.599 +35 -0.543 +36 -0.487 +37 -0.432 +38 -0.376 +39 -0.321 +40 -0.266 +41 -0.212 +42 -0.158 +43 -0.104 +44 -0.052 +45 0.000 +46 0.051 +47 0.101 +48 0.151 +49 0.199 +50 0.247 +51 0.294 +52 0.340 +53 0.385 +54 0.429 +55 0.472 +56 0.515 +57 0.557 +58 0.598 +59 0.638 +60 0.678 +61 0.718 +62 0.756 +63 0.795 +64 0.833 +65 0.872 +66 0.910 +67 0.948 +68 0.987 +69 1.026 +70 1.065 +71 1.105 +72 1.146 +73 1.188 +74 1.231 +75 1.276 +76 1.322 +77 1.370 +78 1.420 +79 1.472 +80 1.527 +81 1.584 +82 1.644 +83 1.707 +84 1.774 +85 1.845 +86 1.919 +87 1.998 +88 2.081 +89 2.170 +90 2.263 +1 -1.219 +2 -1.288 +3 -1.349 +4 -1.400 +5 -1.444 +6 -1.480 +7 -1.508 +8 -1.529 +9 -1.544 +10 -1.552 +11 -1.554 +12 -1.551 +13 -1.542 +14 -1.529 +15 -1.510 +16 -1.488 +17 -1.461 +18 -1.430 +19 -1.396 +20 -1.359 +21 -1.319 +22 -1.276 +23 -1.231 +24 -1.183 +25 -1.133 +26 -1.082 +27 -1.029 +28 -0.975 +29 -0.919 +30 -0.863 +31 -0.806 +32 -0.748 +33 -0.690 +34 -0.631 +35 -0.572 +36 -0.513 +37 -0.455 +38 -0.396 +39 -0.338 +40 -0.280 +41 -0.223 +42 -0.166 +43 -0.110 +44 -0.055 +45 0.000 +46 0.054 +47 0.106 +48 0.158 +49 0.209 +50 0.259 +51 0.308 +52 0.356 +53 0.403 +54 0.449 +55 0.495 +56 0.539 +57 0.583 +58 0.625 +59 0.667 +60 0.709 +61 0.749 +62 0.790 +63 0.830 +64 0.869 +65 0.909 +66 0.948 +67 0.988 +68 1.027 +69 1.067 +70 1.108 +71 1.149 +72 1.191 +73 1.234 +74 1.279 +75 1.325 +76 1.372 +77 1.421 +78 1.472 +79 1.526 +80 1.582 +81 1.641 +82 1.703 +83 1.768 +84 1.837 +85 1.909 +86 1.986 +87 2.067 +88 2.153 +89 2.245 +90 2.341 +1 -1.214 +2 -1.280 +3 -1.337 +4 -1.386 +5 -1.427 +6 -1.460 +7 -1.487 +8 -1.506 +9 -1.519 +10 -1.526 +11 -1.527 +12 -1.523 +13 -1.514 +14 -1.499 +15 -1.481 +16 -1.458 +17 -1.431 +18 -1.401 +19 -1.367 +20 -1.330 +21 -1.290 +22 -1.248 +23 -1.203 +24 -1.156 +25 -1.107 +26 -1.057 +27 -1.005 +28 -0.952 +29 -0.897 +30 -0.842 +31 -0.786 +32 -0.729 +33 -0.672 +34 -0.615 +35 -0.558 +36 -0.500 +37 -0.443 +38 -0.386 +39 -0.329 +40 -0.272 +41 -0.217 +42 -0.161 +43 -0.107 +44 -0.053 +45 0.000 +46 0.052 +47 0.103 +48 0.154 +49 0.203 +50 0.252 +51 0.299 +52 0.346 +53 0.391 +54 0.436 +55 0.480 +56 0.523 +57 0.565 +58 0.606 +59 0.647 +60 0.686 +61 0.726 +62 0.765 +63 0.803 +64 0.841 +65 0.879 +66 0.917 +67 0.955 +68 0.993 +69 1.031 +70 1.070 +71 1.109 +72 1.150 +73 1.191 +74 1.233 +75 1.277 +76 1.322 +77 1.369 +78 1.418 +79 1.470 +80 1.523 +81 1.580 +82 1.639 +83 1.701 +84 1.767 +85 1.837 +86 1.910 +87 1.988 +88 2.070 +89 2.158 +90 2.250 +1 -1.355 +2 -1.420 +3 -1.476 +4 -1.524 +5 -1.563 +6 -1.594 +7 -1.618 +8 -1.635 +9 -1.646 +10 -1.650 +11 -1.648 +12 -1.640 +13 -1.628 +14 -1.610 +15 -1.588 +16 -1.561 +17 -1.531 +18 -1.496 +19 -1.459 +20 -1.418 +21 -1.374 +22 -1.328 +23 -1.279 +24 -1.228 +25 -1.175 +26 -1.121 +27 -1.065 +28 -1.007 +29 -0.949 +30 -0.890 +31 -0.830 +32 -0.770 +33 -0.709 +34 -0.648 +35 -0.587 +36 -0.526 +37 -0.466 +38 -0.405 +39 -0.345 +40 -0.286 +41 -0.227 +42 -0.169 +43 -0.112 +44 -0.055 +45 0.000 +46 0.054 +47 0.108 +48 0.160 +49 0.212 +50 0.262 +51 0.311 +52 0.359 +53 0.406 +54 0.452 +55 0.497 +56 0.541 +57 0.584 +58 0.626 +59 0.667 +60 0.707 +61 0.747 +62 0.786 +63 0.825 +64 0.863 +65 0.901 +66 0.938 +67 0.976 +68 1.014 +69 1.052 +70 1.090 +71 1.129 +72 1.169 +73 1.209 +74 1.251 +75 1.294 +76 1.339 +77 1.385 +78 1.433 +79 1.484 +80 1.537 +81 1.592 +82 1.651 +83 1.713 +84 1.778 +85 1.847 +86 1.920 +87 1.998 +88 2.080 +89 2.167 +90 2.260 +1 -1.415 +2 -1.474 +3 -1.525 +4 -1.567 +5 -1.602 +6 -1.629 +7 -1.649 +8 -1.662 +9 -1.669 +10 -1.669 +11 -1.664 +12 -1.654 +13 -1.639 +14 -1.618 +15 -1.594 +16 -1.565 +17 -1.533 +18 -1.497 +19 -1.457 +20 -1.415 +21 -1.370 +22 -1.323 +23 -1.273 +24 -1.221 +25 -1.168 +26 -1.113 +27 -1.056 +28 -0.999 +29 -0.940 +30 -0.881 +31 -0.821 +32 -0.761 +33 -0.700 +34 -0.640 +35 -0.579 +36 -0.519 +37 -0.459 +38 -0.399 +39 -0.340 +40 -0.281 +41 -0.223 +42 -0.166 +43 -0.110 +44 -0.054 +45 0.000 +46 0.053 +47 0.106 +48 0.157 +49 0.207 +50 0.256 +51 0.303 +52 0.350 +53 0.395 +54 0.439 +55 0.483 +56 0.525 +57 0.566 +58 0.606 +59 0.645 +60 0.684 +61 0.721 +62 0.758 +63 0.794 +64 0.830 +65 0.866 +66 0.901 +67 0.936 +68 0.971 +69 1.006 +70 1.042 +71 1.078 +72 1.115 +73 1.152 +74 1.191 +75 1.230 +76 1.272 +77 1.314 +78 1.359 +79 1.405 +80 1.454 +81 1.506 +82 1.560 +83 1.617 +84 1.678 +85 1.742 +86 1.810 +87 1.883 +88 1.960 +89 2.041 +90 2.128 +1 -1.559 +2 -1.616 +3 -1.663 +4 -1.703 +5 -1.734 +6 -1.758 +7 -1.774 +8 -1.784 +9 -1.787 +10 -1.784 +11 -1.775 +12 -1.760 +13 -1.741 +14 -1.717 +15 -1.688 +16 -1.656 +17 -1.619 +18 -1.579 +19 -1.536 +20 -1.490 +21 -1.441 +22 -1.390 +23 -1.336 +24 -1.281 +25 -1.223 +26 -1.165 +27 -1.105 +28 -1.044 +29 -0.982 +30 -0.919 +31 -0.856 +32 -0.792 +33 -0.729 +34 -0.665 +35 -0.602 +36 -0.538 +37 -0.476 +38 -0.413 +39 -0.352 +40 -0.291 +41 -0.231 +42 -0.171 +43 -0.113 +44 -0.056 +45 0.000 +46 0.055 +47 0.109 +48 0.161 +49 0.212 +50 0.262 +51 0.310 +52 0.358 +53 0.404 +54 0.448 +55 0.492 +56 0.534 +57 0.575 +58 0.615 +59 0.654 +60 0.692 +61 0.730 +62 0.766 +63 0.801 +64 0.836 +65 0.871 +66 0.905 +67 0.939 +68 0.973 +69 1.007 +70 1.041 +71 1.075 +72 1.111 +73 1.146 +74 1.183 +75 1.221 +76 1.260 +77 1.301 +78 1.343 +79 1.388 +80 1.435 +81 1.484 +82 1.536 +83 1.591 +84 1.650 +85 1.712 +86 1.778 +87 1.848 +88 1.923 +89 2.002 +90 2.087 +1 -1.646 +2 -1.702 +3 -1.748 +4 -1.785 +5 -1.815 +6 -1.837 +7 -1.851 +8 -1.859 +9 -1.860 +10 -1.855 +11 -1.844 +12 -1.827 +13 -1.806 +14 -1.779 +15 -1.748 +16 -1.713 +17 -1.675 +18 -1.632 +19 -1.587 +20 -1.538 +21 -1.487 +22 -1.433 +23 -1.377 +24 -1.319 +25 -1.260 +26 -1.198 +27 -1.136 +28 -1.073 +29 -1.009 +30 -0.944 +31 -0.879 +32 -0.813 +33 -0.748 +34 -0.682 +35 -0.617 +36 -0.552 +37 -0.487 +38 -0.423 +39 -0.360 +40 -0.297 +41 -0.236 +42 -0.175 +43 -0.116 +44 -0.057 +45 0.000 +46 0.056 +47 0.111 +48 0.164 +49 0.216 +50 0.266 +51 0.316 +52 0.363 +53 0.410 +54 0.455 +55 0.499 +56 0.541 +57 0.583 +58 0.623 +59 0.662 +60 0.700 +61 0.736 +62 0.773 +63 0.808 +64 0.842 +65 0.876 +66 0.910 +67 0.943 +68 0.977 +69 1.010 +70 1.043 +71 1.077 +72 1.111 +73 1.146 +74 1.181 +75 1.218 +76 1.256 +77 1.296 +78 1.337 +79 1.381 +80 1.426 +81 1.474 +82 1.525 +83 1.579 +84 1.636 +85 1.697 +86 1.762 +87 1.831 +88 1.905 +89 1.983 +90 2.067 +1 -1.745 +2 -1.800 +3 -1.845 +4 -1.882 +5 -1.911 +6 -1.932 +7 -1.945 +8 -1.951 +9 -1.950 +10 -1.943 +11 -1.930 +12 -1.912 +13 -1.888 +14 -1.859 +15 -1.826 +16 -1.788 +17 -1.747 +18 -1.702 +19 -1.654 +20 -1.602 +21 -1.548 +22 -1.492 +23 -1.433 +24 -1.372 +25 -1.310 +26 -1.246 +27 -1.181 +28 -1.115 +29 -1.048 +30 -0.980 +31 -0.912 +32 -0.844 +33 -0.775 +34 -0.707 +35 -0.639 +36 -0.572 +37 -0.504 +38 -0.438 +39 -0.372 +40 -0.308 +41 -0.244 +42 -0.181 +43 -0.119 +44 -0.059 +45 0.000 +46 0.058 +47 0.114 +48 0.169 +49 0.223 +50 0.275 +51 0.325 +52 0.374 +53 0.422 +54 0.468 +55 0.513 +56 0.557 +57 0.599 +58 0.640 +59 0.679 +60 0.718 +61 0.755 +62 0.792 +63 0.828 +64 0.863 +65 0.897 +66 0.931 +67 0.964 +68 0.997 +69 1.031 +70 1.064 +71 1.098 +72 1.132 +73 1.166 +74 1.202 +75 1.239 +76 1.277 +77 1.316 +78 1.357 +79 1.401 +80 1.446 +81 1.494 +82 1.545 +83 1.599 +84 1.656 +85 1.717 +86 1.783 +87 1.852 +88 1.926 +89 2.005 +90 2.089 +1 -1.756 +2 -1.808 +3 -1.852 +4 -1.886 +5 -1.913 +6 -1.932 +7 -1.943 +8 -1.948 +9 -1.946 +10 -1.938 +11 -1.924 +12 -1.904 +13 -1.879 +14 -1.850 +15 -1.816 +16 -1.778 +17 -1.736 +18 -1.691 +19 -1.642 +20 -1.591 +21 -1.536 +22 -1.480 +23 -1.421 +24 -1.360 +25 -1.298 +26 -1.234 +27 -1.170 +28 -1.104 +29 -1.037 +30 -0.970 +31 -0.902 +32 -0.835 +33 -0.767 +34 -0.699 +35 -0.632 +36 -0.565 +37 -0.498 +38 -0.433 +39 -0.368 +40 -0.304 +41 -0.241 +42 -0.179 +43 -0.118 +44 -0.058 +45 0.000 +46 0.057 +47 0.112 +48 0.167 +49 0.219 +50 0.270 +51 0.320 +52 0.368 +53 0.415 +54 0.460 +55 0.504 +56 0.547 +57 0.588 +58 0.628 +59 0.666 +60 0.704 +61 0.740 +62 0.776 +63 0.810 +64 0.844 +65 0.877 +66 0.910 +67 0.942 +68 0.974 +69 1.006 +70 1.038 +71 1.070 +72 1.103 +73 1.136 +74 1.170 +75 1.205 +76 1.242 +77 1.279 +78 1.319 +79 1.360 +80 1.404 +81 1.450 +82 1.499 +83 1.550 +84 1.605 +85 1.664 +86 1.727 +87 1.793 +88 1.865 +89 1.941 +90 2.022 +1 -1.784 +2 -1.842 +3 -1.890 +4 -1.929 +5 -1.960 +6 -1.982 +7 -1.997 +8 -2.004 +9 -2.005 +10 -1.998 +11 -1.986 +12 -1.967 +13 -1.943 +14 -1.915 +15 -1.881 +16 -1.843 +17 -1.801 +18 -1.755 +19 -1.705 +20 -1.653 +21 -1.597 +22 -1.539 +23 -1.479 +24 -1.417 +25 -1.352 +26 -1.287 +27 -1.220 +28 -1.152 +29 -1.083 +30 -1.013 +31 -0.943 +32 -0.872 +33 -0.802 +34 -0.732 +35 -0.661 +36 -0.592 +37 -0.522 +38 -0.454 +39 -0.386 +40 -0.319 +41 -0.253 +42 -0.188 +43 -0.124 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.175 +49 0.231 +50 0.285 +51 0.338 +52 0.389 +53 0.439 +54 0.487 +55 0.533 +56 0.579 +57 0.623 +58 0.665 +59 0.707 +60 0.747 +61 0.787 +62 0.825 +63 0.862 +64 0.899 +65 0.935 +66 0.971 +67 1.006 +68 1.041 +69 1.076 +70 1.111 +71 1.146 +72 1.182 +73 1.219 +74 1.257 +75 1.295 +76 1.335 +77 1.377 +78 1.420 +79 1.466 +80 1.514 +81 1.564 +82 1.618 +83 1.674 +84 1.734 +85 1.798 +86 1.866 +87 1.939 +88 2.016 +89 2.099 +90 2.187 +1 -1.693 +2 -1.752 +3 -1.801 +4 -1.842 +5 -1.874 +6 -1.898 +7 -1.914 +8 -1.923 +9 -1.926 +10 -1.921 +11 -1.911 +12 -1.895 +13 -1.873 +14 -1.847 +15 -1.815 +16 -1.780 +17 -1.740 +18 -1.697 +19 -1.650 +20 -1.600 +21 -1.547 +22 -1.491 +23 -1.434 +24 -1.374 +25 -1.312 +26 -1.249 +27 -1.185 +28 -1.119 +29 -1.052 +30 -0.985 +31 -0.917 +32 -0.849 +33 -0.781 +34 -0.713 +35 -0.644 +36 -0.577 +37 -0.509 +38 -0.442 +39 -0.376 +40 -0.311 +41 -0.247 +42 -0.183 +43 -0.121 +44 -0.060 +45 0.000 +46 0.059 +47 0.116 +48 0.172 +49 0.227 +50 0.280 +51 0.332 +52 0.382 +53 0.431 +54 0.479 +55 0.525 +56 0.570 +57 0.614 +58 0.656 +59 0.698 +60 0.738 +61 0.777 +62 0.816 +63 0.853 +64 0.890 +65 0.927 +66 0.963 +67 0.998 +68 1.034 +69 1.069 +70 1.105 +71 1.141 +72 1.178 +73 1.215 +74 1.253 +75 1.293 +76 1.334 +77 1.376 +78 1.420 +79 1.467 +80 1.515 +81 1.567 +82 1.621 +83 1.678 +84 1.739 +85 1.804 +86 1.873 +87 1.946 +88 2.024 +89 2.107 +90 2.195 +1 -1.662 +2 -1.728 +3 -1.783 +4 -1.829 +5 -1.866 +6 -1.895 +7 -1.915 +8 -1.928 +9 -1.934 +10 -1.933 +11 -1.925 +12 -1.911 +13 -1.892 +14 -1.867 +15 -1.838 +16 -1.804 +17 -1.765 +18 -1.723 +19 -1.677 +20 -1.627 +21 -1.575 +22 -1.519 +23 -1.462 +24 -1.402 +25 -1.340 +26 -1.276 +27 -1.211 +28 -1.145 +29 -1.077 +30 -1.009 +31 -0.940 +32 -0.871 +33 -0.801 +34 -0.732 +35 -0.662 +36 -0.593 +37 -0.524 +38 -0.456 +39 -0.388 +40 -0.321 +41 -0.255 +42 -0.189 +43 -0.125 +44 -0.062 +45 0.000 +46 0.061 +47 0.120 +48 0.178 +49 0.235 +50 0.290 +51 0.344 +52 0.397 +53 0.448 +54 0.498 +55 0.547 +56 0.595 +57 0.641 +58 0.686 +59 0.730 +60 0.773 +61 0.814 +62 0.856 +63 0.896 +64 0.936 +65 0.975 +66 1.014 +67 1.053 +68 1.091 +69 1.130 +70 1.169 +71 1.208 +72 1.249 +73 1.290 +74 1.332 +75 1.375 +76 1.420 +77 1.466 +78 1.515 +79 1.565 +80 1.619 +81 1.675 +82 1.734 +83 1.797 +84 1.863 +85 1.933 +86 2.008 +87 2.087 +88 2.171 +89 2.261 +90 2.356 +1 -1.420 +2 -1.483 +3 -1.536 +4 -1.581 +5 -1.618 +6 -1.647 +7 -1.669 +8 -1.684 +9 -1.692 +10 -1.694 +11 -1.690 +12 -1.681 +13 -1.666 +14 -1.646 +15 -1.622 +16 -1.594 +17 -1.561 +18 -1.525 +19 -1.486 +20 -1.443 +21 -1.398 +22 -1.350 +23 -1.300 +24 -1.248 +25 -1.193 +26 -1.138 +27 -1.080 +28 -1.022 +29 -0.962 +30 -0.902 +31 -0.841 +32 -0.780 +33 -0.718 +34 -0.656 +35 -0.594 +36 -0.532 +37 -0.471 +38 -0.409 +39 -0.349 +40 -0.289 +41 -0.229 +42 -0.171 +43 -0.113 +44 -0.056 +45 0.000 +46 0.055 +47 0.109 +48 0.161 +49 0.213 +50 0.263 +51 0.313 +52 0.361 +53 0.408 +54 0.454 +55 0.498 +56 0.542 +57 0.585 +58 0.626 +59 0.667 +60 0.707 +61 0.746 +62 0.785 +63 0.822 +64 0.860 +65 0.897 +66 0.934 +67 0.970 +68 1.007 +69 1.044 +70 1.081 +71 1.119 +72 1.157 +73 1.196 +74 1.236 +75 1.278 +76 1.320 +77 1.365 +78 1.411 +79 1.460 +80 1.510 +81 1.564 +82 1.620 +83 1.679 +84 1.742 +85 1.808 +86 1.879 +87 1.953 +88 2.033 +89 2.117 +90 2.206 +1 -1.277 +2 -1.340 +3 -1.394 +4 -1.440 +5 -1.478 +6 -1.509 +7 -1.532 +8 -1.549 +9 -1.560 +10 -1.564 +11 -1.563 +12 -1.557 +13 -1.545 +14 -1.529 +15 -1.508 +16 -1.484 +17 -1.455 +18 -1.423 +19 -1.387 +20 -1.349 +21 -1.308 +22 -1.264 +23 -1.218 +24 -1.169 +25 -1.119 +26 -1.068 +27 -1.015 +28 -0.961 +29 -0.905 +30 -0.849 +31 -0.792 +32 -0.735 +33 -0.677 +34 -0.619 +35 -0.561 +36 -0.503 +37 -0.445 +38 -0.387 +39 -0.330 +40 -0.273 +41 -0.217 +42 -0.162 +43 -0.107 +44 -0.053 +45 0.000 +46 0.052 +47 0.103 +48 0.154 +49 0.203 +50 0.251 +51 0.298 +52 0.345 +53 0.390 +54 0.434 +55 0.477 +56 0.520 +57 0.561 +58 0.601 +59 0.641 +60 0.680 +61 0.718 +62 0.756 +63 0.793 +64 0.830 +65 0.867 +66 0.903 +67 0.940 +68 0.976 +69 1.013 +70 1.050 +71 1.088 +72 1.126 +73 1.165 +74 1.205 +75 1.247 +76 1.290 +77 1.334 +78 1.380 +79 1.429 +80 1.480 +81 1.533 +82 1.589 +83 1.648 +84 1.710 +85 1.776 +86 1.846 +87 1.920 +88 1.998 +89 2.081 +90 2.169 +1 -1.014 +2 -1.071 +3 -1.120 +4 -1.162 +5 -1.198 +6 -1.227 +7 -1.250 +8 -1.268 +9 -1.279 +10 -1.286 +11 -1.288 +12 -1.285 +13 -1.277 +14 -1.266 +15 -1.251 +16 -1.232 +17 -1.210 +18 -1.184 +19 -1.156 +20 -1.125 +21 -1.092 +22 -1.057 +23 -1.019 +24 -0.980 +25 -0.939 +26 -0.896 +27 -0.852 +28 -0.808 +29 -0.762 +30 -0.715 +31 -0.668 +32 -0.620 +33 -0.571 +34 -0.523 +35 -0.474 +36 -0.425 +37 -0.377 +38 -0.328 +39 -0.280 +40 -0.232 +41 -0.185 +42 -0.138 +43 -0.091 +44 -0.045 +45 0.000 +46 0.045 +47 0.088 +48 0.131 +49 0.174 +50 0.215 +51 0.256 +52 0.296 +53 0.335 +54 0.373 +55 0.411 +56 0.448 +57 0.484 +58 0.519 +59 0.554 +60 0.588 +61 0.622 +62 0.656 +63 0.689 +64 0.722 +65 0.754 +66 0.787 +67 0.820 +68 0.852 +69 0.886 +70 0.919 +71 0.953 +72 0.988 +73 1.023 +74 1.059 +75 1.097 +76 1.136 +77 1.176 +78 1.218 +79 1.262 +80 1.307 +81 1.355 +82 1.406 +83 1.459 +84 1.515 +85 1.574 +86 1.636 +87 1.702 +88 1.772 +89 1.846 +90 1.924 +1 -0.833 +2 -0.883 +3 -0.926 +4 -0.963 +5 -0.995 +6 -1.021 +7 -1.042 +8 -1.058 +9 -1.069 +10 -1.076 +11 -1.078 +12 -1.077 +13 -1.072 +14 -1.063 +15 -1.051 +16 -1.036 +17 -1.018 +18 -0.997 +19 -0.974 +20 -0.948 +21 -0.921 +22 -0.891 +23 -0.860 +24 -0.827 +25 -0.793 +26 -0.757 +27 -0.721 +28 -0.683 +29 -0.644 +30 -0.605 +31 -0.565 +32 -0.525 +33 -0.484 +34 -0.443 +35 -0.402 +36 -0.361 +37 -0.320 +38 -0.279 +39 -0.238 +40 -0.197 +41 -0.157 +42 -0.117 +43 -0.077 +44 -0.038 +45 0.000 +46 0.038 +47 0.075 +48 0.112 +49 0.148 +50 0.183 +51 0.218 +52 0.252 +53 0.286 +54 0.318 +55 0.351 +56 0.382 +57 0.413 +58 0.444 +59 0.474 +60 0.503 +61 0.532 +62 0.561 +63 0.590 +64 0.618 +65 0.646 +66 0.675 +67 0.703 +68 0.731 +69 0.760 +70 0.789 +71 0.818 +72 0.849 +73 0.879 +74 0.911 +75 0.943 +76 0.977 +77 1.012 +78 1.048 +79 1.086 +80 1.126 +81 1.168 +82 1.211 +83 1.257 +84 1.306 +85 1.357 +86 1.411 +87 1.468 +88 1.528 +89 1.592 +90 1.659 +1 -0.580 +2 -0.619 +3 -0.654 +4 -0.684 +5 -0.709 +6 -0.730 +7 -0.748 +8 -0.761 +9 -0.771 +10 -0.778 +11 -0.781 +12 -0.782 +13 -0.779 +14 -0.774 +15 -0.767 +16 -0.757 +17 -0.744 +18 -0.730 +19 -0.714 +20 -0.696 +21 -0.677 +22 -0.656 +23 -0.633 +24 -0.609 +25 -0.585 +26 -0.559 +27 -0.532 +28 -0.505 +29 -0.477 +30 -0.448 +31 -0.419 +32 -0.389 +33 -0.359 +34 -0.329 +35 -0.299 +36 -0.268 +37 -0.238 +38 -0.207 +39 -0.177 +40 -0.147 +41 -0.117 +42 -0.087 +43 -0.058 +44 -0.029 +45 0.000 +46 0.028 +47 0.056 +48 0.084 +49 0.111 +50 0.138 +51 0.164 +52 0.190 +53 0.215 +54 0.240 +55 0.265 +56 0.289 +57 0.312 +58 0.336 +59 0.359 +60 0.382 +61 0.404 +62 0.426 +63 0.449 +64 0.471 +65 0.493 +66 0.515 +67 0.537 +68 0.559 +69 0.581 +70 0.604 +71 0.627 +72 0.651 +73 0.675 +74 0.700 +75 0.725 +76 0.752 +77 0.779 +78 0.808 +79 0.838 +80 0.869 +81 0.901 +82 0.936 +83 0.971 +84 1.009 +85 1.049 +86 1.091 +87 1.135 +88 1.182 +89 1.232 +90 1.284 +1 -0.419 +2 -0.449 +3 -0.475 +4 -0.498 +5 -0.518 +6 -0.535 +7 -0.548 +8 -0.559 +9 -0.567 +10 -0.573 +11 -0.576 +12 -0.577 +13 -0.575 +14 -0.572 +15 -0.567 +16 -0.560 +17 -0.551 +18 -0.541 +19 -0.529 +20 -0.516 +21 -0.502 +22 -0.487 +23 -0.470 +24 -0.453 +25 -0.435 +26 -0.416 +27 -0.396 +28 -0.376 +29 -0.355 +30 -0.334 +31 -0.312 +32 -0.290 +33 -0.268 +34 -0.246 +35 -0.223 +36 -0.201 +37 -0.178 +38 -0.155 +39 -0.133 +40 -0.110 +41 -0.088 +42 -0.065 +43 -0.043 +44 -0.022 +45 0.000 +46 0.021 +47 0.042 +48 0.063 +49 0.084 +50 0.104 +51 0.123 +52 0.143 +53 0.162 +54 0.181 +55 0.200 +56 0.218 +57 0.236 +58 0.254 +59 0.271 +60 0.289 +61 0.306 +62 0.323 +63 0.340 +64 0.357 +65 0.373 +66 0.390 +67 0.407 +68 0.424 +69 0.442 +70 0.459 +71 0.477 +72 0.495 +73 0.513 +74 0.533 +75 0.552 +76 0.573 +77 0.594 +78 0.615 +79 0.638 +80 0.662 +81 0.687 +82 0.713 +83 0.740 +84 0.769 +85 0.800 +86 0.832 +87 0.865 +88 0.901 +89 0.938 +90 0.978 +1 -0.179 +2 -0.199 +3 -0.216 +4 -0.232 +5 -0.245 +6 -0.257 +7 -0.267 +8 -0.275 +9 -0.282 +10 -0.287 +11 -0.291 +12 -0.293 +13 -0.294 +14 -0.294 +15 -0.293 +16 -0.291 +17 -0.288 +18 -0.284 +19 -0.279 +20 -0.273 +21 -0.266 +22 -0.259 +23 -0.251 +24 -0.243 +25 -0.234 +26 -0.224 +27 -0.214 +28 -0.204 +29 -0.193 +30 -0.182 +31 -0.171 +32 -0.159 +33 -0.147 +34 -0.135 +35 -0.123 +36 -0.111 +37 -0.099 +38 -0.086 +39 -0.074 +40 -0.062 +41 -0.049 +42 -0.037 +43 -0.024 +44 -0.012 +45 0.000 +46 0.012 +47 0.024 +48 0.036 +49 0.048 +50 0.059 +51 0.071 +52 0.082 +53 0.094 +54 0.105 +55 0.116 +56 0.127 +57 0.138 +58 0.149 +59 0.159 +60 0.170 +61 0.181 +62 0.191 +63 0.202 +64 0.212 +65 0.223 +66 0.234 +67 0.245 +68 0.256 +69 0.267 +70 0.278 +71 0.290 +72 0.301 +73 0.313 +74 0.326 +75 0.338 +76 0.352 +77 0.365 +78 0.379 +79 0.394 +80 0.409 +81 0.425 +82 0.442 +83 0.460 +84 0.478 +85 0.497 +86 0.517 +87 0.539 +88 0.561 +89 0.584 +90 0.609 +1 -0.019 +2 -0.028 +3 -0.035 +4 -0.042 +5 -0.048 +6 -0.054 +7 -0.058 +8 -0.063 +9 -0.066 +10 -0.070 +11 -0.072 +12 -0.075 +13 -0.076 +14 -0.078 +15 -0.079 +16 -0.079 +17 -0.079 +18 -0.079 +19 -0.079 +20 -0.078 +21 -0.077 +22 -0.075 +23 -0.074 +24 -0.072 +25 -0.069 +26 -0.067 +27 -0.065 +28 -0.062 +29 -0.059 +30 -0.056 +31 -0.053 +32 -0.050 +33 -0.046 +34 -0.043 +35 -0.039 +36 -0.035 +37 -0.032 +38 -0.028 +39 -0.024 +40 -0.020 +41 -0.016 +42 -0.012 +43 -0.008 +44 -0.004 +45 0.000 +46 0.004 +47 0.008 +48 0.012 +49 0.016 +50 0.020 +51 0.024 +52 0.029 +53 0.033 +54 0.037 +55 0.041 +56 0.045 +57 0.049 +58 0.053 +59 0.057 +60 0.061 +61 0.066 +62 0.070 +63 0.074 +64 0.078 +65 0.083 +66 0.087 +67 0.091 +68 0.096 +69 0.100 +70 0.105 +71 0.110 +72 0.115 +73 0.120 +74 0.125 +75 0.130 +76 0.135 +77 0.141 +78 0.147 +79 0.153 +80 0.159 +81 0.165 +82 0.172 +83 0.179 +84 0.186 +85 0.194 +86 0.202 +87 0.210 +88 0.219 +89 0.228 +90 0.237 +1 0.220 +2 0.224 +3 0.227 +4 0.229 +5 0.230 +6 0.231 +7 0.230 +8 0.229 +9 0.228 +10 0.226 +11 0.223 +12 0.219 +13 0.216 +14 0.211 +15 0.207 +16 0.201 +17 0.196 +18 0.190 +19 0.184 +20 0.178 +21 0.171 +22 0.164 +23 0.157 +24 0.150 +25 0.143 +26 0.135 +27 0.128 +28 0.120 +29 0.113 +30 0.105 +31 0.097 +32 0.090 +33 0.082 +34 0.075 +35 0.067 +36 0.060 +37 0.053 +38 0.046 +39 0.039 +40 0.032 +41 0.025 +42 0.019 +43 0.012 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.017 +49 -0.022 +50 -0.027 +51 -0.032 +52 -0.037 +53 -0.042 +54 -0.046 +55 -0.050 +56 -0.054 +57 -0.058 +58 -0.061 +59 -0.065 +60 -0.068 +61 -0.071 +62 -0.075 +63 -0.077 +64 -0.080 +65 -0.083 +66 -0.086 +67 -0.088 +68 -0.091 +69 -0.093 +70 -0.096 +71 -0.099 +72 -0.101 +73 -0.104 +74 -0.106 +75 -0.109 +76 -0.112 +77 -0.115 +78 -0.118 +79 -0.122 +80 -0.126 +81 -0.130 +82 -0.134 +83 -0.138 +84 -0.143 +85 -0.149 +86 -0.154 +87 -0.160 +88 -0.167 +89 -0.174 +90 -0.182 +1 0.412 +2 0.429 +3 0.442 +4 0.454 +5 0.463 +6 0.470 +7 0.475 +8 0.478 +9 0.480 +10 0.479 +11 0.477 +12 0.474 +13 0.469 +14 0.463 +15 0.455 +16 0.447 +17 0.437 +18 0.427 +19 0.415 +20 0.403 +21 0.390 +22 0.376 +23 0.361 +24 0.347 +25 0.331 +26 0.315 +27 0.299 +28 0.283 +29 0.266 +30 0.249 +31 0.232 +32 0.215 +33 0.198 +34 0.180 +35 0.163 +36 0.146 +37 0.129 +38 0.112 +39 0.095 +40 0.079 +41 0.063 +42 0.046 +43 0.031 +44 0.015 +45 -0.000 +46 -0.015 +47 -0.029 +48 -0.044 +49 -0.058 +50 -0.071 +51 -0.084 +52 -0.097 +53 -0.110 +54 -0.122 +55 -0.134 +56 -0.145 +57 -0.156 +58 -0.167 +59 -0.178 +60 -0.189 +61 -0.199 +62 -0.209 +63 -0.218 +64 -0.228 +65 -0.238 +66 -0.247 +67 -0.257 +68 -0.266 +69 -0.275 +70 -0.285 +71 -0.295 +72 -0.305 +73 -0.315 +74 -0.325 +75 -0.336 +76 -0.347 +77 -0.358 +78 -0.370 +79 -0.383 +80 -0.396 +81 -0.411 +82 -0.425 +83 -0.441 +84 -0.458 +85 -0.476 +86 -0.495 +87 -0.515 +88 -0.536 +89 -0.559 +90 -0.583 +1 0.660 +2 0.688 +3 0.711 +4 0.730 +5 0.746 +6 0.758 +7 0.767 +8 0.773 +9 0.776 +10 0.776 +11 0.774 +12 0.769 +13 0.761 +14 0.752 +15 0.740 +16 0.727 +17 0.711 +18 0.695 +19 0.676 +20 0.656 +21 0.635 +22 0.613 +23 0.590 +24 0.566 +25 0.541 +26 0.516 +27 0.489 +28 0.463 +29 0.436 +30 0.408 +31 0.380 +32 0.352 +33 0.324 +34 0.296 +35 0.268 +36 0.240 +37 0.212 +38 0.184 +39 0.157 +40 0.130 +41 0.103 +42 0.077 +43 0.051 +44 0.025 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.072 +49 -0.095 +50 -0.118 +51 -0.140 +52 -0.161 +53 -0.182 +54 -0.203 +55 -0.222 +56 -0.242 +57 -0.261 +58 -0.279 +59 -0.297 +60 -0.315 +61 -0.332 +62 -0.349 +63 -0.366 +64 -0.382 +65 -0.398 +66 -0.414 +67 -0.430 +68 -0.447 +69 -0.463 +70 -0.479 +71 -0.496 +72 -0.512 +73 -0.529 +74 -0.547 +75 -0.565 +76 -0.584 +77 -0.604 +78 -0.624 +79 -0.646 +80 -0.668 +81 -0.692 +82 -0.717 +83 -0.743 +84 -0.771 +85 -0.801 +86 -0.832 +87 -0.866 +88 -0.901 +89 -0.939 +90 -0.979 +1 0.787 +2 0.824 +3 0.856 +4 0.884 +5 0.906 +6 0.924 +7 0.938 +8 0.947 +9 0.953 +10 0.955 +11 0.954 +12 0.949 +13 0.942 +14 0.931 +15 0.918 +16 0.903 +17 0.885 +18 0.865 +19 0.843 +20 0.820 +21 0.794 +22 0.767 +23 0.739 +24 0.710 +25 0.679 +26 0.647 +27 0.615 +28 0.582 +29 0.548 +30 0.514 +31 0.479 +32 0.444 +33 0.409 +34 0.374 +35 0.339 +36 0.304 +37 0.269 +38 0.234 +39 0.199 +40 0.165 +41 0.131 +42 0.098 +43 0.065 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.092 +49 -0.122 +50 -0.151 +51 -0.179 +52 -0.207 +53 -0.234 +54 -0.260 +55 -0.286 +56 -0.312 +57 -0.336 +58 -0.360 +59 -0.384 +60 -0.407 +61 -0.430 +62 -0.452 +63 -0.475 +64 -0.497 +65 -0.518 +66 -0.540 +67 -0.562 +68 -0.583 +69 -0.605 +70 -0.627 +71 -0.649 +72 -0.672 +73 -0.695 +74 -0.719 +75 -0.744 +76 -0.770 +77 -0.796 +78 -0.824 +79 -0.853 +80 -0.884 +81 -0.916 +82 -0.949 +83 -0.985 +84 -1.022 +85 -1.062 +86 -1.104 +87 -1.149 +88 -1.196 +89 -1.247 +90 -1.300 +1 0.947 +2 0.992 +3 1.032 +4 1.065 +5 1.093 +6 1.115 +7 1.132 +8 1.144 +9 1.152 +10 1.155 +11 1.154 +12 1.149 +13 1.140 +14 1.127 +15 1.112 +16 1.093 +17 1.072 +18 1.048 +19 1.022 +20 0.993 +21 0.963 +22 0.930 +23 0.896 +24 0.861 +25 0.824 +26 0.785 +27 0.746 +28 0.706 +29 0.665 +30 0.624 +31 0.582 +32 0.540 +33 0.497 +34 0.455 +35 0.412 +36 0.369 +37 0.327 +38 0.284 +39 0.242 +40 0.201 +41 0.159 +42 0.119 +43 0.078 +44 0.039 +45 -0.000 +46 -0.038 +47 -0.076 +48 -0.113 +49 -0.149 +50 -0.184 +51 -0.218 +52 -0.252 +53 -0.285 +54 -0.318 +55 -0.349 +56 -0.380 +57 -0.410 +58 -0.440 +59 -0.469 +60 -0.497 +61 -0.525 +62 -0.553 +63 -0.580 +64 -0.607 +65 -0.633 +66 -0.660 +67 -0.686 +68 -0.713 +69 -0.740 +70 -0.767 +71 -0.795 +72 -0.823 +73 -0.851 +74 -0.881 +75 -0.911 +76 -0.943 +77 -0.975 +78 -1.009 +79 -1.045 +80 -1.083 +81 -1.122 +82 -1.163 +83 -1.207 +84 -1.253 +85 -1.302 +86 -1.353 +87 -1.408 +88 -1.466 +89 -1.528 +90 -1.593 +1 1.045 +2 1.100 +3 1.148 +4 1.190 +5 1.224 +6 1.252 +7 1.274 +8 1.290 +9 1.301 +10 1.306 +11 1.307 +12 1.303 +13 1.294 +14 1.282 +15 1.266 +16 1.246 +17 1.223 +18 1.196 +19 1.167 +20 1.136 +21 1.101 +22 1.065 +23 1.027 +24 0.987 +25 0.945 +26 0.902 +27 0.857 +28 0.812 +29 0.765 +30 0.718 +31 0.670 +32 0.622 +33 0.573 +34 0.524 +35 0.475 +36 0.426 +37 0.377 +38 0.329 +39 0.280 +40 0.232 +41 0.184 +42 0.137 +43 0.091 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.088 +48 -0.131 +49 -0.173 +50 -0.214 +51 -0.254 +52 -0.294 +53 -0.333 +54 -0.371 +55 -0.408 +56 -0.444 +57 -0.480 +58 -0.515 +59 -0.549 +60 -0.583 +61 -0.616 +62 -0.649 +63 -0.681 +64 -0.713 +65 -0.745 +66 -0.777 +67 -0.809 +68 -0.841 +69 -0.873 +70 -0.906 +71 -0.939 +72 -0.973 +73 -1.008 +74 -1.043 +75 -1.080 +76 -1.118 +77 -1.158 +78 -1.199 +79 -1.242 +80 -1.287 +81 -1.334 +82 -1.384 +83 -1.436 +84 -1.492 +85 -1.550 +86 -1.612 +87 -1.677 +88 -1.747 +89 -1.820 +90 -1.898 +1 1.113 +2 1.175 +3 1.229 +4 1.276 +5 1.315 +6 1.347 +7 1.372 +8 1.391 +9 1.404 +10 1.411 +11 1.413 +12 1.410 +13 1.402 +14 1.389 +15 1.372 +16 1.351 +17 1.327 +18 1.299 +19 1.268 +20 1.234 +21 1.197 +22 1.158 +23 1.117 +24 1.074 +25 1.029 +26 0.982 +27 0.934 +28 0.885 +29 0.834 +30 0.783 +31 0.731 +32 0.678 +33 0.626 +34 0.572 +35 0.519 +36 0.466 +37 0.412 +38 0.359 +39 0.306 +40 0.254 +41 0.202 +42 0.150 +43 0.100 +44 0.049 +45 -0.000 +46 -0.049 +47 -0.096 +48 -0.143 +49 -0.190 +50 -0.235 +51 -0.279 +52 -0.323 +53 -0.365 +54 -0.407 +55 -0.448 +56 -0.488 +57 -0.527 +58 -0.566 +59 -0.604 +60 -0.641 +61 -0.678 +62 -0.714 +63 -0.750 +64 -0.786 +65 -0.822 +66 -0.857 +67 -0.893 +68 -0.928 +69 -0.965 +70 -1.001 +71 -1.038 +72 -1.076 +73 -1.115 +74 -1.154 +75 -1.196 +76 -1.238 +77 -1.282 +78 -1.328 +79 -1.376 +80 -1.427 +81 -1.480 +82 -1.535 +83 -1.594 +84 -1.655 +85 -1.721 +86 -1.789 +87 -1.862 +88 -1.940 +89 -2.021 +90 -2.108 +1 1.029 +2 1.096 +3 1.154 +4 1.205 +5 1.248 +6 1.284 +7 1.313 +8 1.336 +9 1.352 +10 1.362 +11 1.367 +12 1.367 +13 1.362 +14 1.352 +15 1.338 +16 1.320 +17 1.298 +18 1.273 +19 1.244 +20 1.212 +21 1.178 +22 1.141 +23 1.101 +24 1.060 +25 1.016 +26 0.971 +27 0.924 +28 0.876 +29 0.827 +30 0.777 +31 0.726 +32 0.674 +33 0.622 +34 0.570 +35 0.517 +36 0.464 +37 0.412 +38 0.359 +39 0.306 +40 0.254 +41 0.202 +42 0.151 +43 0.100 +44 0.050 +45 -0.000 +46 -0.049 +47 -0.097 +48 -0.145 +49 -0.191 +50 -0.237 +51 -0.282 +52 -0.327 +53 -0.370 +54 -0.413 +55 -0.455 +56 -0.496 +57 -0.537 +58 -0.577 +59 -0.616 +60 -0.655 +61 -0.693 +62 -0.731 +63 -0.769 +64 -0.806 +65 -0.844 +66 -0.881 +67 -0.919 +68 -0.957 +69 -0.995 +70 -1.034 +71 -1.074 +72 -1.114 +73 -1.155 +74 -1.198 +75 -1.242 +76 -1.287 +77 -1.334 +78 -1.383 +79 -1.435 +80 -1.488 +81 -1.544 +82 -1.603 +83 -1.666 +84 -1.731 +85 -1.800 +86 -1.873 +87 -1.950 +88 -2.031 +89 -2.117 +90 -2.208 +1 0.873 +2 0.938 +3 0.996 +4 1.046 +5 1.089 +6 1.125 +7 1.155 +8 1.179 +9 1.197 +10 1.210 +11 1.217 +12 1.220 +13 1.218 +14 1.211 +15 1.201 +16 1.186 +17 1.168 +18 1.147 +19 1.122 +20 1.095 +21 1.065 +22 1.033 +23 0.998 +24 0.961 +25 0.923 +26 0.883 +27 0.841 +28 0.798 +29 0.754 +30 0.709 +31 0.663 +32 0.617 +33 0.569 +34 0.522 +35 0.474 +36 0.426 +37 0.378 +38 0.330 +39 0.282 +40 0.234 +41 0.186 +42 0.139 +43 0.092 +44 0.046 +45 -0.000 +46 -0.045 +47 -0.090 +48 -0.134 +49 -0.177 +50 -0.220 +51 -0.262 +52 -0.304 +53 -0.345 +54 -0.385 +55 -0.424 +56 -0.463 +57 -0.502 +58 -0.539 +59 -0.577 +60 -0.614 +61 -0.651 +62 -0.687 +63 -0.723 +64 -0.759 +65 -0.796 +66 -0.832 +67 -0.868 +68 -0.905 +69 -0.942 +70 -0.980 +71 -1.018 +72 -1.058 +73 -1.098 +74 -1.140 +75 -1.182 +76 -1.227 +77 -1.273 +78 -1.321 +79 -1.371 +80 -1.423 +81 -1.477 +82 -1.535 +83 -1.595 +84 -1.658 +85 -1.725 +86 -1.795 +87 -1.870 +88 -1.948 +89 -2.031 +90 -2.118 +1 0.695 +2 0.762 +3 0.821 +4 0.873 +5 0.918 +6 0.957 +7 0.990 +8 1.016 +9 1.038 +10 1.054 +11 1.065 +12 1.072 +13 1.074 +14 1.072 +15 1.065 +16 1.056 +17 1.042 +18 1.026 +19 1.006 +20 0.984 +21 0.959 +22 0.932 +23 0.902 +24 0.870 +25 0.837 +26 0.802 +27 0.765 +28 0.727 +29 0.688 +30 0.648 +31 0.607 +32 0.565 +33 0.523 +34 0.480 +35 0.436 +36 0.393 +37 0.349 +38 0.305 +39 0.261 +40 0.217 +41 0.173 +42 0.129 +43 0.086 +44 0.043 +45 -0.000 +46 -0.042 +47 -0.084 +48 -0.126 +49 -0.167 +50 -0.207 +51 -0.247 +52 -0.286 +53 -0.325 +54 -0.364 +55 -0.402 +56 -0.439 +57 -0.477 +58 -0.514 +59 -0.550 +60 -0.586 +61 -0.622 +62 -0.658 +63 -0.694 +64 -0.730 +65 -0.766 +66 -0.803 +67 -0.839 +68 -0.876 +69 -0.914 +70 -0.952 +71 -0.991 +72 -1.031 +73 -1.072 +74 -1.114 +75 -1.157 +76 -1.202 +77 -1.249 +78 -1.298 +79 -1.348 +80 -1.401 +81 -1.456 +82 -1.514 +83 -1.575 +84 -1.639 +85 -1.706 +86 -1.776 +87 -1.850 +88 -1.929 +89 -2.011 +90 -2.098 +1 0.468 +2 0.527 +3 0.580 +4 0.627 +5 0.668 +6 0.704 +7 0.735 +8 0.761 +9 0.782 +10 0.799 +11 0.812 +12 0.821 +13 0.826 +14 0.828 +15 0.826 +16 0.821 +17 0.813 +18 0.802 +19 0.789 +20 0.773 +21 0.755 +22 0.735 +23 0.714 +24 0.690 +25 0.665 +26 0.638 +27 0.610 +28 0.581 +29 0.550 +30 0.519 +31 0.487 +32 0.454 +33 0.421 +34 0.386 +35 0.352 +36 0.317 +37 0.282 +38 0.247 +39 0.212 +40 0.176 +41 0.141 +42 0.105 +43 0.070 +44 0.035 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.103 +49 -0.137 +50 -0.171 +51 -0.204 +52 -0.237 +53 -0.270 +54 -0.302 +55 -0.334 +56 -0.366 +57 -0.398 +58 -0.429 +59 -0.460 +60 -0.491 +61 -0.523 +62 -0.554 +63 -0.585 +64 -0.616 +65 -0.648 +66 -0.679 +67 -0.712 +68 -0.744 +69 -0.777 +70 -0.811 +71 -0.845 +72 -0.881 +73 -0.917 +74 -0.955 +75 -0.993 +76 -1.033 +77 -1.075 +78 -1.118 +79 -1.163 +80 -1.209 +81 -1.258 +82 -1.309 +83 -1.363 +84 -1.419 +85 -1.478 +86 -1.540 +87 -1.605 +88 -1.673 +89 -1.745 +90 -1.821 +1 0.314 +2 0.370 +3 0.421 +4 0.467 +5 0.507 +6 0.543 +7 0.574 +8 0.600 +9 0.623 +10 0.641 +11 0.656 +12 0.667 +13 0.675 +14 0.679 +15 0.681 +16 0.679 +17 0.675 +18 0.669 +19 0.660 +20 0.648 +21 0.635 +22 0.620 +23 0.603 +24 0.584 +25 0.564 +26 0.543 +27 0.520 +28 0.496 +29 0.471 +30 0.445 +31 0.418 +32 0.391 +33 0.362 +34 0.334 +35 0.304 +36 0.275 +37 0.245 +38 0.215 +39 0.184 +40 0.154 +41 0.123 +42 0.092 +43 0.061 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.091 +49 -0.121 +50 -0.151 +51 -0.181 +52 -0.211 +53 -0.240 +54 -0.270 +55 -0.299 +56 -0.328 +57 -0.357 +58 -0.386 +59 -0.414 +60 -0.443 +61 -0.472 +62 -0.501 +63 -0.530 +64 -0.560 +65 -0.589 +66 -0.619 +67 -0.650 +68 -0.680 +69 -0.712 +70 -0.744 +71 -0.777 +72 -0.811 +73 -0.845 +74 -0.881 +75 -0.918 +76 -0.956 +77 -0.995 +78 -1.036 +79 -1.079 +80 -1.124 +81 -1.170 +82 -1.218 +83 -1.269 +84 -1.322 +85 -1.378 +86 -1.436 +87 -1.497 +88 -1.562 +89 -1.629 +90 -1.700 +1 0.151 +2 0.200 +3 0.245 +4 0.286 +5 0.323 +6 0.356 +7 0.385 +8 0.410 +9 0.432 +10 0.450 +11 0.466 +12 0.478 +13 0.488 +14 0.495 +15 0.499 +16 0.501 +17 0.501 +18 0.498 +19 0.494 +20 0.488 +21 0.479 +22 0.470 +23 0.458 +24 0.446 +25 0.432 +26 0.416 +27 0.400 +28 0.383 +29 0.364 +30 0.345 +31 0.325 +32 0.304 +33 0.283 +34 0.261 +35 0.239 +36 0.216 +37 0.193 +38 0.169 +39 0.146 +40 0.122 +41 0.098 +42 0.073 +43 0.049 +44 0.024 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.073 +49 -0.098 +50 -0.122 +51 -0.147 +52 -0.171 +53 -0.195 +54 -0.220 +55 -0.244 +56 -0.268 +57 -0.293 +58 -0.317 +59 -0.341 +60 -0.366 +61 -0.390 +62 -0.415 +63 -0.440 +64 -0.466 +65 -0.491 +66 -0.517 +67 -0.544 +68 -0.570 +69 -0.598 +70 -0.626 +71 -0.655 +72 -0.684 +73 -0.715 +74 -0.746 +75 -0.778 +76 -0.812 +77 -0.847 +78 -0.883 +79 -0.920 +80 -0.959 +81 -1.000 +82 -1.042 +83 -1.086 +84 -1.133 +85 -1.181 +86 -1.232 +87 -1.285 +88 -1.341 +89 -1.399 +90 -1.460 +1 0.209 +2 0.260 +3 0.307 +4 0.349 +5 0.386 +6 0.419 +7 0.448 +8 0.474 +9 0.495 +10 0.513 +11 0.528 +12 0.540 +13 0.549 +14 0.555 +15 0.558 +16 0.558 +17 0.557 +18 0.553 +19 0.547 +20 0.539 +21 0.529 +22 0.517 +23 0.504 +24 0.489 +25 0.473 +26 0.456 +27 0.437 +28 0.418 +29 0.397 +30 0.376 +31 0.354 +32 0.331 +33 0.307 +34 0.283 +35 0.259 +36 0.234 +37 0.209 +38 0.183 +39 0.157 +40 0.131 +41 0.105 +42 0.079 +43 0.053 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.053 +48 -0.079 +49 -0.105 +50 -0.131 +51 -0.157 +52 -0.183 +53 -0.209 +54 -0.234 +55 -0.260 +56 -0.286 +57 -0.311 +58 -0.337 +59 -0.362 +60 -0.388 +61 -0.414 +62 -0.440 +63 -0.466 +64 -0.492 +65 -0.519 +66 -0.546 +67 -0.574 +68 -0.601 +69 -0.630 +70 -0.659 +71 -0.689 +72 -0.719 +73 -0.751 +74 -0.783 +75 -0.817 +76 -0.851 +77 -0.887 +78 -0.925 +79 -0.963 +80 -1.004 +81 -1.046 +82 -1.090 +83 -1.136 +84 -1.184 +85 -1.234 +86 -1.287 +87 -1.342 +88 -1.400 +89 -1.460 +90 -1.524 +1 0.287 +2 0.338 +3 0.384 +4 0.425 +5 0.462 +6 0.494 +7 0.522 +8 0.546 +9 0.567 +10 0.583 +11 0.597 +12 0.607 +13 0.613 +14 0.618 +15 0.619 +16 0.617 +17 0.614 +18 0.608 +19 0.599 +20 0.589 +21 0.577 +22 0.563 +23 0.548 +24 0.531 +25 0.512 +26 0.493 +27 0.472 +28 0.450 +29 0.428 +30 0.404 +31 0.380 +32 0.355 +33 0.329 +34 0.303 +35 0.276 +36 0.249 +37 0.222 +38 0.195 +39 0.167 +40 0.139 +41 0.111 +42 0.084 +43 0.056 +44 0.028 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.083 +49 -0.110 +50 -0.137 +51 -0.164 +52 -0.191 +53 -0.218 +54 -0.244 +55 -0.271 +56 -0.297 +57 -0.323 +58 -0.349 +59 -0.375 +60 -0.401 +61 -0.428 +62 -0.454 +63 -0.480 +64 -0.507 +65 -0.533 +66 -0.560 +67 -0.588 +68 -0.616 +69 -0.644 +70 -0.673 +71 -0.703 +72 -0.733 +73 -0.764 +74 -0.796 +75 -0.830 +76 -0.864 +77 -0.900 +78 -0.937 +79 -0.975 +80 -1.015 +81 -1.057 +82 -1.101 +83 -1.146 +84 -1.194 +85 -1.245 +86 -1.297 +87 -1.352 +88 -1.410 +89 -1.471 +90 -1.535 +1 0.400 +2 0.452 +3 0.498 +4 0.540 +5 0.576 +6 0.608 +7 0.635 +8 0.658 +9 0.677 +10 0.692 +11 0.703 +12 0.711 +13 0.716 +14 0.718 +15 0.716 +16 0.712 +17 0.706 +18 0.697 +19 0.685 +20 0.672 +21 0.657 +22 0.639 +23 0.621 +24 0.600 +25 0.578 +26 0.555 +27 0.531 +28 0.505 +29 0.479 +30 0.452 +31 0.424 +32 0.396 +33 0.366 +34 0.337 +35 0.307 +36 0.277 +37 0.246 +38 0.215 +39 0.185 +40 0.154 +41 0.123 +42 0.092 +43 0.061 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.090 +49 -0.120 +50 -0.149 +51 -0.178 +52 -0.207 +53 -0.236 +54 -0.264 +55 -0.292 +56 -0.320 +57 -0.348 +58 -0.375 +59 -0.403 +60 -0.430 +61 -0.458 +62 -0.485 +63 -0.512 +64 -0.540 +65 -0.568 +66 -0.595 +67 -0.624 +68 -0.652 +69 -0.681 +70 -0.711 +71 -0.741 +72 -0.772 +73 -0.804 +74 -0.837 +75 -0.871 +76 -0.906 +77 -0.942 +78 -0.980 +79 -1.019 +80 -1.060 +81 -1.103 +82 -1.148 +83 -1.195 +84 -1.244 +85 -1.295 +86 -1.349 +87 -1.406 +88 -1.466 +89 -1.529 +90 -1.595 +1 0.611 +2 0.665 +3 0.713 +4 0.755 +5 0.792 +6 0.823 +7 0.850 +8 0.871 +9 0.888 +10 0.900 +11 0.909 +12 0.913 +13 0.914 +14 0.911 +15 0.905 +16 0.896 +17 0.884 +18 0.869 +19 0.852 +20 0.833 +21 0.811 +22 0.788 +23 0.762 +24 0.735 +25 0.707 +26 0.677 +27 0.646 +28 0.613 +29 0.580 +30 0.546 +31 0.511 +32 0.476 +33 0.440 +34 0.404 +35 0.367 +36 0.330 +37 0.293 +38 0.256 +39 0.219 +40 0.182 +41 0.145 +42 0.108 +43 0.072 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.071 +48 -0.105 +49 -0.139 +50 -0.173 +51 -0.207 +52 -0.239 +53 -0.272 +54 -0.304 +55 -0.336 +56 -0.367 +57 -0.398 +58 -0.428 +59 -0.459 +60 -0.489 +61 -0.519 +62 -0.548 +63 -0.578 +64 -0.608 +65 -0.637 +66 -0.667 +67 -0.697 +68 -0.728 +69 -0.759 +70 -0.790 +71 -0.822 +72 -0.855 +73 -0.888 +74 -0.923 +75 -0.958 +76 -0.995 +77 -1.034 +78 -1.073 +79 -1.115 +80 -1.158 +81 -1.203 +82 -1.251 +83 -1.301 +84 -1.353 +85 -1.408 +86 -1.466 +87 -1.527 +88 -1.591 +89 -1.659 +90 -1.730 +1 0.798 +2 0.857 +3 0.909 +4 0.954 +5 0.993 +6 1.026 +7 1.053 +8 1.074 +9 1.091 +10 1.102 +11 1.109 +12 1.111 +13 1.109 +14 1.103 +15 1.093 +16 1.080 +17 1.063 +18 1.044 +19 1.021 +20 0.997 +21 0.969 +22 0.940 +23 0.908 +24 0.875 +25 0.840 +26 0.803 +27 0.765 +28 0.726 +29 0.686 +30 0.645 +31 0.603 +32 0.561 +33 0.518 +34 0.475 +35 0.431 +36 0.387 +37 0.344 +38 0.300 +39 0.256 +40 0.213 +41 0.169 +42 0.126 +43 0.084 +44 0.042 +45 -0.000 +46 -0.041 +47 -0.082 +48 -0.122 +49 -0.161 +50 -0.200 +51 -0.239 +52 -0.276 +53 -0.313 +54 -0.350 +55 -0.386 +56 -0.421 +57 -0.456 +58 -0.490 +59 -0.524 +60 -0.558 +61 -0.591 +62 -0.624 +63 -0.657 +64 -0.690 +65 -0.723 +66 -0.756 +67 -0.789 +68 -0.822 +69 -0.856 +70 -0.890 +71 -0.925 +72 -0.960 +73 -0.997 +74 -1.034 +75 -1.073 +76 -1.113 +77 -1.155 +78 -1.198 +79 -1.243 +80 -1.290 +81 -1.340 +82 -1.391 +83 -1.446 +84 -1.503 +85 -1.563 +86 -1.627 +87 -1.694 +88 -1.764 +89 -1.839 +90 -1.918 +1 0.954 +2 1.014 +3 1.066 +4 1.111 +5 1.149 +6 1.181 +7 1.206 +8 1.226 +9 1.240 +10 1.249 +11 1.252 +12 1.252 +13 1.246 +14 1.237 +15 1.223 +16 1.206 +17 1.186 +18 1.162 +19 1.136 +20 1.106 +21 1.075 +22 1.041 +23 1.004 +24 0.966 +25 0.926 +26 0.885 +27 0.842 +28 0.799 +29 0.754 +30 0.708 +31 0.662 +32 0.614 +33 0.567 +34 0.519 +35 0.471 +36 0.423 +37 0.375 +38 0.327 +39 0.279 +40 0.231 +41 0.184 +42 0.137 +43 0.091 +44 0.045 +45 -0.000 +46 -0.045 +47 -0.088 +48 -0.132 +49 -0.174 +50 -0.216 +51 -0.257 +52 -0.297 +53 -0.336 +54 -0.375 +55 -0.413 +56 -0.451 +57 -0.488 +58 -0.524 +59 -0.559 +60 -0.595 +61 -0.629 +62 -0.664 +63 -0.698 +64 -0.732 +65 -0.766 +66 -0.800 +67 -0.833 +68 -0.868 +69 -0.902 +70 -0.937 +71 -0.973 +72 -1.009 +73 -1.046 +74 -1.084 +75 -1.123 +76 -1.164 +77 -1.206 +78 -1.250 +79 -1.296 +80 -1.344 +81 -1.394 +82 -1.447 +83 -1.503 +84 -1.561 +85 -1.623 +86 -1.688 +87 -1.756 +88 -1.829 +89 -1.906 +90 -1.987 +1 1.017 +2 1.079 +3 1.133 +4 1.180 +5 1.220 +6 1.253 +7 1.279 +8 1.300 +9 1.314 +10 1.323 +11 1.327 +12 1.325 +13 1.319 +14 1.309 +15 1.294 +16 1.276 +17 1.254 +18 1.229 +19 1.201 +20 1.169 +21 1.136 +22 1.099 +23 1.061 +24 1.021 +25 0.978 +26 0.935 +27 0.889 +28 0.843 +29 0.795 +30 0.747 +31 0.698 +32 0.648 +33 0.598 +34 0.547 +35 0.497 +36 0.446 +37 0.395 +38 0.344 +39 0.294 +40 0.244 +41 0.194 +42 0.145 +43 0.096 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.138 +49 -0.183 +50 -0.227 +51 -0.270 +52 -0.312 +53 -0.354 +54 -0.394 +55 -0.434 +56 -0.473 +57 -0.512 +58 -0.550 +59 -0.587 +60 -0.624 +61 -0.660 +62 -0.696 +63 -0.732 +64 -0.767 +65 -0.802 +66 -0.838 +67 -0.873 +68 -0.909 +69 -0.945 +70 -0.981 +71 -1.018 +72 -1.056 +73 -1.094 +74 -1.134 +75 -1.175 +76 -1.218 +77 -1.262 +78 -1.308 +79 -1.355 +80 -1.405 +81 -1.458 +82 -1.513 +83 -1.571 +84 -1.632 +85 -1.696 +86 -1.765 +87 -1.836 +88 -1.912 +89 -1.993 +90 -2.078 +1 1.036 +2 1.096 +3 1.148 +4 1.193 +5 1.231 +6 1.262 +7 1.287 +8 1.306 +9 1.319 +10 1.326 +11 1.328 +12 1.326 +13 1.319 +14 1.308 +15 1.292 +16 1.273 +17 1.251 +18 1.225 +19 1.196 +20 1.164 +21 1.130 +22 1.094 +23 1.055 +24 1.014 +25 0.972 +26 0.928 +27 0.883 +28 0.837 +29 0.789 +30 0.741 +31 0.692 +32 0.642 +33 0.592 +34 0.542 +35 0.492 +36 0.441 +37 0.391 +38 0.341 +39 0.291 +40 0.241 +41 0.192 +42 0.143 +43 0.095 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.092 +48 -0.136 +49 -0.180 +50 -0.224 +51 -0.266 +52 -0.307 +53 -0.348 +54 -0.388 +55 -0.427 +56 -0.465 +57 -0.503 +58 -0.540 +59 -0.577 +60 -0.613 +61 -0.648 +62 -0.683 +63 -0.718 +64 -0.752 +65 -0.786 +66 -0.820 +67 -0.855 +68 -0.889 +69 -0.924 +70 -0.959 +71 -0.995 +72 -1.031 +73 -1.069 +74 -1.107 +75 -1.147 +76 -1.187 +77 -1.230 +78 -1.274 +79 -1.320 +80 -1.369 +81 -1.419 +82 -1.473 +83 -1.529 +84 -1.588 +85 -1.650 +86 -1.716 +87 -1.786 +88 -1.859 +89 -1.937 +90 -2.020 +1 1.014 +2 1.074 +3 1.126 +4 1.171 +5 1.209 +6 1.240 +7 1.265 +8 1.284 +9 1.297 +10 1.305 +11 1.308 +12 1.306 +13 1.299 +14 1.288 +15 1.274 +16 1.255 +17 1.233 +18 1.208 +19 1.180 +20 1.149 +21 1.115 +22 1.079 +23 1.041 +24 1.001 +25 0.960 +26 0.917 +27 0.872 +28 0.826 +29 0.780 +30 0.732 +31 0.684 +32 0.635 +33 0.586 +34 0.536 +35 0.486 +36 0.436 +37 0.386 +38 0.337 +39 0.287 +40 0.238 +41 0.190 +42 0.141 +43 0.094 +44 0.046 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.135 +49 -0.179 +50 -0.221 +51 -0.263 +52 -0.305 +53 -0.345 +54 -0.385 +55 -0.423 +56 -0.462 +57 -0.499 +58 -0.536 +59 -0.572 +60 -0.608 +61 -0.643 +62 -0.678 +63 -0.712 +64 -0.747 +65 -0.781 +66 -0.815 +67 -0.849 +68 -0.883 +69 -0.918 +70 -0.953 +71 -0.989 +72 -1.025 +73 -1.062 +74 -1.101 +75 -1.140 +76 -1.181 +77 -1.223 +78 -1.267 +79 -1.313 +80 -1.361 +81 -1.412 +82 -1.465 +83 -1.521 +84 -1.579 +85 -1.642 +86 -1.707 +87 -1.776 +88 -1.849 +89 -1.927 +90 -2.009 +1 0.999 +2 1.055 +3 1.104 +4 1.146 +5 1.181 +6 1.210 +7 1.233 +8 1.250 +9 1.262 +10 1.268 +11 1.270 +12 1.267 +13 1.260 +14 1.249 +15 1.234 +16 1.215 +17 1.193 +18 1.168 +19 1.140 +20 1.110 +21 1.077 +22 1.042 +23 1.005 +24 0.966 +25 0.926 +26 0.884 +27 0.841 +28 0.796 +29 0.751 +30 0.705 +31 0.658 +32 0.611 +33 0.563 +34 0.516 +35 0.468 +36 0.419 +37 0.371 +38 0.324 +39 0.276 +40 0.229 +41 0.182 +42 0.136 +43 0.090 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.129 +49 -0.171 +50 -0.212 +51 -0.252 +52 -0.291 +53 -0.330 +54 -0.368 +55 -0.405 +56 -0.441 +57 -0.477 +58 -0.512 +59 -0.546 +60 -0.580 +61 -0.613 +62 -0.646 +63 -0.679 +64 -0.711 +65 -0.744 +66 -0.776 +67 -0.808 +68 -0.840 +69 -0.873 +70 -0.906 +71 -0.940 +72 -0.974 +73 -1.009 +74 -1.045 +75 -1.082 +76 -1.120 +77 -1.160 +78 -1.202 +79 -1.245 +80 -1.291 +81 -1.338 +82 -1.388 +83 -1.441 +84 -1.496 +85 -1.555 +86 -1.617 +87 -1.683 +88 -1.752 +89 -1.825 +90 -1.903 +1 0.969 +2 1.026 +3 1.076 +4 1.120 +5 1.156 +6 1.186 +7 1.210 +8 1.228 +9 1.241 +10 1.249 +11 1.251 +12 1.250 +13 1.243 +14 1.233 +15 1.219 +16 1.201 +17 1.180 +18 1.156 +19 1.129 +20 1.100 +21 1.068 +22 1.033 +23 0.997 +24 0.959 +25 0.919 +26 0.878 +27 0.835 +28 0.791 +29 0.747 +30 0.701 +31 0.655 +32 0.608 +33 0.561 +34 0.513 +35 0.466 +36 0.418 +37 0.370 +38 0.323 +39 0.275 +40 0.228 +41 0.182 +42 0.135 +43 0.090 +44 0.045 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.129 +49 -0.171 +50 -0.212 +51 -0.252 +52 -0.292 +53 -0.331 +54 -0.369 +55 -0.406 +56 -0.442 +57 -0.478 +58 -0.514 +59 -0.548 +60 -0.582 +61 -0.616 +62 -0.650 +63 -0.683 +64 -0.716 +65 -0.748 +66 -0.781 +67 -0.814 +68 -0.847 +69 -0.880 +70 -0.914 +71 -0.948 +72 -0.983 +73 -1.019 +74 -1.056 +75 -1.094 +76 -1.133 +77 -1.174 +78 -1.216 +79 -1.261 +80 -1.307 +81 -1.355 +82 -1.406 +83 -1.460 +84 -1.517 +85 -1.576 +86 -1.639 +87 -1.706 +88 -1.777 +89 -1.851 +90 -1.930 +1 0.741 +2 0.777 +3 0.808 +4 0.835 +5 0.857 +6 0.875 +7 0.888 +8 0.898 +9 0.904 +10 0.907 +11 0.906 +12 0.902 +13 0.896 +14 0.886 +15 0.874 +16 0.860 +17 0.843 +18 0.824 +19 0.804 +20 0.782 +21 0.758 +22 0.732 +23 0.706 +24 0.678 +25 0.649 +26 0.619 +27 0.588 +28 0.557 +29 0.525 +30 0.492 +31 0.459 +32 0.426 +33 0.392 +34 0.359 +35 0.325 +36 0.291 +37 0.258 +38 0.224 +39 0.191 +40 0.158 +41 0.126 +42 0.094 +43 0.062 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.118 +50 -0.146 +51 -0.173 +52 -0.200 +53 -0.226 +54 -0.252 +55 -0.277 +56 -0.301 +57 -0.325 +58 -0.349 +59 -0.372 +60 -0.394 +61 -0.417 +62 -0.439 +63 -0.460 +64 -0.482 +65 -0.503 +66 -0.524 +67 -0.545 +68 -0.566 +69 -0.587 +70 -0.609 +71 -0.631 +72 -0.653 +73 -0.676 +74 -0.699 +75 -0.723 +76 -0.748 +77 -0.774 +78 -0.801 +79 -0.829 +80 -0.858 +81 -0.889 +82 -0.921 +83 -0.955 +84 -0.991 +85 -1.030 +86 -1.070 +87 -1.113 +88 -1.158 +89 -1.206 +90 -1.257 +1 0.856 +2 0.897 +3 0.932 +4 0.962 +5 0.986 +6 1.006 +7 1.021 +8 1.031 +9 1.037 +10 1.040 +11 1.039 +12 1.034 +13 1.026 +14 1.014 +15 1.000 +16 0.984 +17 0.964 +18 0.943 +19 0.919 +20 0.893 +21 0.866 +22 0.836 +23 0.806 +24 0.774 +25 0.740 +26 0.706 +27 0.671 +28 0.635 +29 0.598 +30 0.561 +31 0.523 +32 0.485 +33 0.447 +34 0.409 +35 0.370 +36 0.332 +37 0.294 +38 0.256 +39 0.218 +40 0.180 +41 0.143 +42 0.107 +43 0.071 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.068 +48 -0.101 +49 -0.134 +50 -0.165 +51 -0.196 +52 -0.227 +53 -0.257 +54 -0.286 +55 -0.314 +56 -0.342 +57 -0.369 +58 -0.395 +59 -0.421 +60 -0.447 +61 -0.472 +62 -0.497 +63 -0.521 +64 -0.545 +65 -0.569 +66 -0.593 +67 -0.616 +68 -0.640 +69 -0.664 +70 -0.688 +71 -0.712 +72 -0.737 +73 -0.763 +74 -0.789 +75 -0.816 +76 -0.844 +77 -0.873 +78 -0.903 +79 -0.934 +80 -0.967 +81 -1.002 +82 -1.038 +83 -1.077 +84 -1.117 +85 -1.160 +86 -1.205 +87 -1.254 +88 -1.305 +89 -1.359 +90 -1.416 +1 0.748 +2 0.785 +3 0.816 +4 0.842 +5 0.864 +6 0.882 +7 0.895 +8 0.905 +9 0.910 +10 0.913 +11 0.912 +12 0.908 +13 0.901 +14 0.891 +15 0.879 +16 0.865 +17 0.848 +18 0.829 +19 0.808 +20 0.786 +21 0.762 +22 0.736 +23 0.709 +24 0.681 +25 0.652 +26 0.622 +27 0.591 +28 0.559 +29 0.527 +30 0.494 +31 0.461 +32 0.427 +33 0.394 +34 0.360 +35 0.326 +36 0.292 +37 0.259 +38 0.225 +39 0.192 +40 0.159 +41 0.126 +42 0.094 +43 0.062 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.118 +50 -0.146 +51 -0.173 +52 -0.200 +53 -0.226 +54 -0.252 +55 -0.277 +56 -0.301 +57 -0.325 +58 -0.349 +59 -0.372 +60 -0.394 +61 -0.417 +62 -0.438 +63 -0.460 +64 -0.481 +65 -0.502 +66 -0.523 +67 -0.544 +68 -0.565 +69 -0.587 +70 -0.608 +71 -0.630 +72 -0.652 +73 -0.674 +74 -0.697 +75 -0.721 +76 -0.746 +77 -0.772 +78 -0.798 +79 -0.826 +80 -0.855 +81 -0.886 +82 -0.918 +83 -0.952 +84 -0.988 +85 -1.026 +86 -1.067 +87 -1.109 +88 -1.154 +89 -1.202 +90 -1.253 +1 0.912 +2 0.955 +3 0.992 +4 1.024 +5 1.050 +6 1.071 +7 1.087 +8 1.098 +9 1.105 +10 1.108 +11 1.106 +12 1.101 +13 1.093 +14 1.081 +15 1.066 +16 1.048 +17 1.027 +18 1.004 +19 0.979 +20 0.952 +21 0.922 +22 0.891 +23 0.859 +24 0.825 +25 0.789 +26 0.753 +27 0.715 +28 0.677 +29 0.638 +30 0.598 +31 0.558 +32 0.517 +33 0.477 +34 0.436 +35 0.395 +36 0.354 +37 0.313 +38 0.273 +39 0.232 +40 0.192 +41 0.153 +42 0.114 +43 0.075 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.108 +49 -0.143 +50 -0.176 +51 -0.210 +52 -0.242 +53 -0.274 +54 -0.305 +55 -0.335 +56 -0.365 +57 -0.394 +58 -0.422 +59 -0.450 +60 -0.477 +61 -0.504 +62 -0.530 +63 -0.556 +64 -0.582 +65 -0.607 +66 -0.633 +67 -0.658 +68 -0.684 +69 -0.709 +70 -0.735 +71 -0.761 +72 -0.788 +73 -0.815 +74 -0.843 +75 -0.872 +76 -0.902 +77 -0.933 +78 -0.965 +79 -0.999 +80 -1.034 +81 -1.071 +82 -1.110 +83 -1.151 +84 -1.194 +85 -1.240 +86 -1.289 +87 -1.340 +88 -1.395 +89 -1.453 +90 -1.514 +1 0.776 +2 0.816 +3 0.851 +4 0.881 +5 0.906 +6 0.926 +7 0.942 +8 0.954 +9 0.961 +10 0.965 +11 0.965 +12 0.962 +13 0.955 +14 0.946 +15 0.934 +16 0.919 +17 0.902 +18 0.882 +19 0.861 +20 0.837 +21 0.812 +22 0.785 +23 0.757 +24 0.727 +25 0.696 +26 0.664 +27 0.632 +28 0.598 +29 0.564 +30 0.529 +31 0.494 +32 0.458 +33 0.422 +34 0.386 +35 0.350 +36 0.314 +37 0.278 +38 0.242 +39 0.206 +40 0.171 +41 0.136 +42 0.101 +43 0.067 +44 0.033 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.096 +49 -0.127 +50 -0.158 +51 -0.187 +52 -0.216 +53 -0.245 +54 -0.273 +55 -0.300 +56 -0.327 +57 -0.353 +58 -0.379 +59 -0.404 +60 -0.429 +61 -0.453 +62 -0.477 +63 -0.501 +64 -0.524 +65 -0.548 +66 -0.571 +67 -0.594 +68 -0.618 +69 -0.641 +70 -0.665 +71 -0.689 +72 -0.714 +73 -0.739 +74 -0.765 +75 -0.792 +76 -0.819 +77 -0.848 +78 -0.878 +79 -0.909 +80 -0.941 +81 -0.975 +82 -1.011 +83 -1.049 +84 -1.089 +85 -1.132 +86 -1.176 +87 -1.224 +88 -1.274 +89 -1.327 +90 -1.383 +1 0.932 +2 0.979 +3 1.020 +4 1.054 +5 1.083 +6 1.106 +7 1.124 +8 1.137 +9 1.145 +10 1.149 +11 1.149 +12 1.144 +13 1.136 +14 1.124 +15 1.110 +16 1.092 +17 1.071 +18 1.047 +19 1.021 +20 0.993 +21 0.963 +22 0.931 +23 0.897 +24 0.862 +25 0.825 +26 0.787 +27 0.748 +28 0.708 +29 0.667 +30 0.626 +31 0.584 +32 0.542 +33 0.499 +34 0.457 +35 0.414 +36 0.371 +37 0.328 +38 0.286 +39 0.244 +40 0.202 +41 0.160 +42 0.119 +43 0.079 +44 0.039 +45 -0.000 +46 -0.039 +47 -0.076 +48 -0.114 +49 -0.150 +50 -0.186 +51 -0.221 +52 -0.255 +53 -0.288 +54 -0.321 +55 -0.353 +56 -0.384 +57 -0.415 +58 -0.445 +59 -0.475 +60 -0.503 +61 -0.532 +62 -0.560 +63 -0.588 +64 -0.615 +65 -0.642 +66 -0.670 +67 -0.697 +68 -0.724 +69 -0.751 +70 -0.779 +71 -0.807 +72 -0.836 +73 -0.865 +74 -0.895 +75 -0.926 +76 -0.958 +77 -0.991 +78 -1.026 +79 -1.062 +80 -1.100 +81 -1.140 +82 -1.182 +83 -1.226 +84 -1.273 +85 -1.322 +86 -1.374 +87 -1.430 +88 -1.488 +89 -1.550 +90 -1.616 +1 0.624 +2 0.663 +3 0.697 +4 0.727 +5 0.752 +6 0.773 +7 0.790 +8 0.803 +9 0.812 +10 0.818 +11 0.820 +12 0.820 +13 0.816 +14 0.810 +15 0.801 +16 0.790 +17 0.777 +18 0.761 +19 0.744 +20 0.725 +21 0.704 +22 0.682 +23 0.658 +24 0.633 +25 0.607 +26 0.580 +27 0.552 +28 0.523 +29 0.494 +30 0.464 +31 0.434 +32 0.403 +33 0.372 +34 0.340 +35 0.309 +36 0.277 +37 0.246 +38 0.214 +39 0.183 +40 0.152 +41 0.121 +42 0.090 +43 0.060 +44 0.030 +45 -0.000 +46 -0.029 +47 -0.058 +48 -0.086 +49 -0.114 +50 -0.141 +51 -0.168 +52 -0.195 +53 -0.221 +54 -0.246 +55 -0.271 +56 -0.295 +57 -0.320 +58 -0.343 +59 -0.367 +60 -0.390 +61 -0.413 +62 -0.435 +63 -0.457 +64 -0.480 +65 -0.502 +66 -0.524 +67 -0.546 +68 -0.569 +69 -0.591 +70 -0.614 +71 -0.637 +72 -0.661 +73 -0.685 +74 -0.710 +75 -0.736 +76 -0.763 +77 -0.790 +78 -0.819 +79 -0.849 +80 -0.880 +81 -0.913 +82 -0.948 +83 -0.984 +84 -1.022 +85 -1.063 +86 -1.105 +87 -1.150 +88 -1.198 +89 -1.248 +90 -1.301 +1 0.677 +2 0.720 +3 0.758 +4 0.790 +5 0.818 +6 0.841 +7 0.860 +8 0.874 +9 0.884 +10 0.891 +11 0.894 +12 0.894 +13 0.890 +14 0.884 +15 0.874 +16 0.862 +17 0.848 +18 0.831 +19 0.812 +20 0.791 +21 0.769 +22 0.744 +23 0.719 +24 0.691 +25 0.663 +26 0.634 +27 0.603 +28 0.572 +29 0.540 +30 0.507 +31 0.474 +32 0.440 +33 0.406 +34 0.372 +35 0.337 +36 0.303 +37 0.269 +38 0.234 +39 0.200 +40 0.166 +41 0.132 +42 0.098 +43 0.065 +44 0.032 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.094 +49 -0.125 +50 -0.155 +51 -0.184 +52 -0.213 +53 -0.241 +54 -0.269 +55 -0.297 +56 -0.324 +57 -0.350 +58 -0.376 +59 -0.402 +60 -0.427 +61 -0.452 +62 -0.477 +63 -0.502 +64 -0.526 +65 -0.550 +66 -0.575 +67 -0.599 +68 -0.624 +69 -0.649 +70 -0.674 +71 -0.700 +72 -0.726 +73 -0.753 +74 -0.780 +75 -0.809 +76 -0.838 +77 -0.869 +78 -0.900 +79 -0.934 +80 -0.968 +81 -1.005 +82 -1.043 +83 -1.083 +84 -1.125 +85 -1.170 +86 -1.217 +87 -1.266 +88 -1.319 +89 -1.374 +90 -1.433 +1 0.237 +2 0.270 +3 0.299 +4 0.326 +5 0.349 +6 0.369 +7 0.387 +8 0.402 +9 0.414 +10 0.424 +11 0.432 +12 0.437 +13 0.441 +14 0.442 +15 0.442 +16 0.439 +17 0.436 +18 0.430 +19 0.424 +20 0.416 +21 0.406 +22 0.396 +23 0.385 +24 0.372 +25 0.359 +26 0.345 +27 0.330 +28 0.314 +29 0.298 +30 0.281 +31 0.264 +32 0.246 +33 0.228 +34 0.210 +35 0.191 +36 0.172 +37 0.153 +38 0.134 +39 0.115 +40 0.096 +41 0.077 +42 0.057 +43 0.038 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.056 +49 -0.075 +50 -0.093 +51 -0.112 +52 -0.130 +53 -0.148 +54 -0.166 +55 -0.183 +56 -0.201 +57 -0.219 +58 -0.236 +59 -0.253 +60 -0.271 +61 -0.288 +62 -0.305 +63 -0.323 +64 -0.340 +65 -0.358 +66 -0.375 +67 -0.393 +68 -0.412 +69 -0.430 +70 -0.449 +71 -0.468 +72 -0.488 +73 -0.508 +74 -0.529 +75 -0.551 +76 -0.573 +77 -0.596 +78 -0.620 +79 -0.645 +80 -0.672 +81 -0.699 +82 -0.727 +83 -0.757 +84 -0.788 +85 -0.821 +86 -0.855 +87 -0.891 +88 -0.929 +89 -0.969 +90 -1.011 +1 0.126 +2 0.158 +3 0.187 +4 0.213 +5 0.236 +6 0.257 +7 0.275 +8 0.291 +9 0.304 +10 0.316 +11 0.325 +12 0.333 +13 0.338 +14 0.342 +15 0.344 +16 0.345 +17 0.344 +18 0.341 +19 0.338 +20 0.333 +21 0.327 +22 0.320 +23 0.312 +24 0.303 +25 0.293 +26 0.282 +27 0.271 +28 0.259 +29 0.246 +30 0.233 +31 0.219 +32 0.205 +33 0.191 +34 0.176 +35 0.161 +36 0.145 +37 0.130 +38 0.114 +39 0.098 +40 0.082 +41 0.065 +42 0.049 +43 0.033 +44 0.016 +45 -0.000 +46 -0.016 +47 -0.033 +48 -0.049 +49 -0.065 +50 -0.082 +51 -0.098 +52 -0.114 +53 -0.130 +54 -0.146 +55 -0.162 +56 -0.178 +57 -0.194 +58 -0.210 +59 -0.226 +60 -0.242 +61 -0.258 +62 -0.275 +63 -0.291 +64 -0.308 +65 -0.324 +66 -0.341 +67 -0.358 +68 -0.376 +69 -0.394 +70 -0.412 +71 -0.431 +72 -0.450 +73 -0.470 +74 -0.490 +75 -0.511 +76 -0.533 +77 -0.555 +78 -0.578 +79 -0.603 +80 -0.628 +81 -0.654 +82 -0.682 +83 -0.711 +84 -0.741 +85 -0.772 +86 -0.805 +87 -0.839 +88 -0.875 +89 -0.913 +90 -0.953 +1 -0.282 +2 -0.256 +3 -0.231 +4 -0.208 +5 -0.186 +6 -0.165 +7 -0.146 +8 -0.128 +9 -0.111 +10 -0.095 +11 -0.080 +12 -0.066 +13 -0.053 +14 -0.041 +15 -0.030 +16 -0.020 +17 -0.011 +18 -0.002 +19 0.005 +20 0.012 +21 0.018 +22 0.024 +23 0.028 +24 0.032 +25 0.036 +26 0.039 +27 0.041 +28 0.042 +29 0.043 +30 0.044 +31 0.044 +32 0.044 +33 0.043 +34 0.041 +35 0.039 +36 0.037 +37 0.035 +38 0.032 +39 0.028 +40 0.024 +41 0.020 +42 0.016 +43 0.011 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.019 +49 -0.025 +50 -0.032 +51 -0.040 +52 -0.048 +53 -0.056 +54 -0.064 +55 -0.073 +56 -0.082 +57 -0.091 +58 -0.101 +59 -0.111 +60 -0.121 +61 -0.132 +62 -0.143 +63 -0.154 +64 -0.166 +65 -0.178 +66 -0.190 +67 -0.203 +68 -0.217 +69 -0.231 +70 -0.245 +71 -0.260 +72 -0.275 +73 -0.291 +74 -0.307 +75 -0.324 +76 -0.342 +77 -0.360 +78 -0.378 +79 -0.398 +80 -0.418 +81 -0.439 +82 -0.460 +83 -0.482 +84 -0.505 +85 -0.529 +86 -0.554 +87 -0.580 +88 -0.606 +89 -0.634 +90 -0.662 +1 -0.188 +2 -0.160 +3 -0.134 +4 -0.110 +5 -0.087 +6 -0.066 +7 -0.046 +8 -0.028 +9 -0.012 +10 0.004 +11 0.017 +12 0.030 +13 0.041 +14 0.052 +15 0.061 +16 0.069 +17 0.076 +18 0.082 +19 0.087 +20 0.091 +21 0.094 +22 0.096 +23 0.098 +24 0.099 +25 0.099 +26 0.099 +27 0.098 +28 0.096 +29 0.094 +30 0.091 +31 0.088 +32 0.084 +33 0.080 +34 0.075 +35 0.070 +36 0.064 +37 0.058 +38 0.052 +39 0.046 +40 0.039 +41 0.032 +42 0.024 +43 0.016 +44 0.008 +45 -0.000 +46 -0.009 +47 -0.017 +48 -0.026 +49 -0.036 +50 -0.045 +51 -0.055 +52 -0.065 +53 -0.075 +54 -0.085 +55 -0.096 +56 -0.107 +57 -0.118 +58 -0.129 +59 -0.141 +60 -0.153 +61 -0.165 +62 -0.178 +63 -0.191 +64 -0.204 +65 -0.217 +66 -0.231 +67 -0.246 +68 -0.260 +69 -0.275 +70 -0.291 +71 -0.307 +72 -0.324 +73 -0.341 +74 -0.358 +75 -0.377 +76 -0.396 +77 -0.415 +78 -0.436 +79 -0.457 +80 -0.478 +81 -0.501 +82 -0.524 +83 -0.549 +84 -0.574 +85 -0.600 +86 -0.628 +87 -0.656 +88 -0.685 +89 -0.716 +90 -0.748 +1 -0.472 +2 -0.450 +3 -0.428 +4 -0.407 +5 -0.387 +6 -0.367 +7 -0.348 +8 -0.329 +9 -0.311 +10 -0.293 +11 -0.276 +12 -0.260 +13 -0.244 +14 -0.228 +15 -0.213 +16 -0.199 +17 -0.185 +18 -0.172 +19 -0.159 +20 -0.146 +21 -0.135 +22 -0.123 +23 -0.112 +24 -0.102 +25 -0.092 +26 -0.083 +27 -0.074 +28 -0.066 +29 -0.058 +30 -0.051 +31 -0.044 +32 -0.038 +33 -0.032 +34 -0.027 +35 -0.022 +36 -0.018 +37 -0.014 +38 -0.010 +39 -0.007 +40 -0.005 +41 -0.003 +42 -0.002 +43 -0.001 +44 -0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.003 +49 -0.005 +50 -0.007 +51 -0.010 +52 -0.013 +53 -0.017 +54 -0.021 +55 -0.025 +56 -0.031 +57 -0.036 +58 -0.042 +59 -0.049 +60 -0.056 +61 -0.063 +62 -0.071 +63 -0.080 +64 -0.089 +65 -0.098 +66 -0.108 +67 -0.118 +68 -0.129 +69 -0.140 +70 -0.152 +71 -0.164 +72 -0.177 +73 -0.190 +74 -0.204 +75 -0.218 +76 -0.233 +77 -0.248 +78 -0.263 +79 -0.280 +80 -0.296 +81 -0.313 +82 -0.331 +83 -0.349 +84 -0.368 +85 -0.387 +86 -0.406 +87 -0.427 +88 -0.447 +89 -0.468 +90 -0.490 +1 0.043 +2 0.084 +3 0.122 +4 0.156 +5 0.187 +6 0.215 +7 0.240 +8 0.262 +9 0.281 +10 0.298 +11 0.312 +12 0.324 +13 0.334 +14 0.342 +15 0.347 +16 0.351 +17 0.353 +18 0.353 +19 0.352 +20 0.349 +21 0.344 +22 0.339 +23 0.332 +24 0.324 +25 0.315 +26 0.304 +27 0.293 +28 0.281 +29 0.269 +30 0.255 +31 0.241 +32 0.226 +33 0.211 +34 0.195 +35 0.179 +36 0.162 +37 0.145 +38 0.128 +39 0.110 +40 0.092 +41 0.074 +42 0.056 +43 0.037 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.056 +49 -0.075 +50 -0.094 +51 -0.113 +52 -0.133 +53 -0.152 +54 -0.171 +55 -0.190 +56 -0.210 +57 -0.229 +58 -0.249 +59 -0.268 +60 -0.288 +61 -0.308 +62 -0.328 +63 -0.349 +64 -0.369 +65 -0.390 +66 -0.412 +67 -0.434 +68 -0.456 +69 -0.479 +70 -0.502 +71 -0.526 +72 -0.550 +73 -0.576 +74 -0.602 +75 -0.629 +76 -0.657 +77 -0.686 +78 -0.716 +79 -0.747 +80 -0.779 +81 -0.813 +82 -0.848 +83 -0.885 +84 -0.923 +85 -0.963 +86 -1.005 +87 -1.048 +88 -1.094 +89 -1.142 +90 -1.192 +1 0.088 +2 0.133 +3 0.174 +4 0.211 +5 0.245 +6 0.275 +7 0.302 +8 0.325 +9 0.346 +10 0.363 +11 0.378 +12 0.391 +13 0.400 +14 0.408 +15 0.413 +16 0.416 +17 0.417 +18 0.416 +19 0.413 +20 0.409 +21 0.403 +22 0.395 +23 0.387 +24 0.376 +25 0.365 +26 0.353 +27 0.339 +28 0.325 +29 0.310 +30 0.294 +31 0.277 +32 0.260 +33 0.242 +34 0.224 +35 0.205 +36 0.185 +37 0.166 +38 0.146 +39 0.125 +40 0.105 +41 0.084 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.043 +48 -0.064 +49 -0.085 +50 -0.107 +51 -0.128 +52 -0.149 +53 -0.171 +54 -0.192 +55 -0.214 +56 -0.235 +57 -0.257 +58 -0.279 +59 -0.300 +60 -0.322 +61 -0.344 +62 -0.367 +63 -0.389 +64 -0.412 +65 -0.435 +66 -0.458 +67 -0.482 +68 -0.507 +69 -0.532 +70 -0.557 +71 -0.583 +72 -0.610 +73 -0.638 +74 -0.666 +75 -0.695 +76 -0.726 +77 -0.757 +78 -0.790 +79 -0.824 +80 -0.860 +81 -0.896 +82 -0.935 +83 -0.975 +84 -1.017 +85 -1.061 +86 -1.106 +87 -1.154 +88 -1.204 +89 -1.257 +90 -1.312 +1 0.628 +2 0.685 +3 0.736 +4 0.780 +5 0.819 +6 0.852 +7 0.880 +8 0.903 +9 0.921 +10 0.934 +11 0.943 +12 0.948 +13 0.949 +14 0.947 +15 0.941 +16 0.932 +17 0.920 +18 0.905 +19 0.887 +20 0.867 +21 0.844 +22 0.820 +23 0.794 +24 0.766 +25 0.736 +26 0.705 +27 0.673 +28 0.639 +29 0.604 +30 0.569 +31 0.533 +32 0.496 +33 0.459 +34 0.421 +35 0.383 +36 0.344 +37 0.306 +38 0.267 +39 0.228 +40 0.190 +41 0.151 +42 0.113 +43 0.075 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.074 +48 -0.110 +49 -0.145 +50 -0.181 +51 -0.216 +52 -0.250 +53 -0.284 +54 -0.317 +55 -0.350 +56 -0.383 +57 -0.415 +58 -0.447 +59 -0.479 +60 -0.510 +61 -0.542 +62 -0.573 +63 -0.604 +64 -0.635 +65 -0.666 +66 -0.697 +67 -0.729 +68 -0.761 +69 -0.793 +70 -0.826 +71 -0.860 +72 -0.894 +73 -0.929 +74 -0.965 +75 -1.003 +76 -1.042 +77 -1.082 +78 -1.124 +79 -1.167 +80 -1.213 +81 -1.260 +82 -1.310 +83 -1.362 +84 -1.417 +85 -1.475 +86 -1.536 +87 -1.600 +88 -1.668 +89 -1.739 +90 -1.814 +1 0.710 +2 0.763 +3 0.810 +4 0.850 +5 0.885 +6 0.914 +7 0.938 +8 0.958 +9 0.972 +10 0.982 +11 0.988 +12 0.990 +13 0.988 +14 0.983 +15 0.974 +16 0.963 +17 0.948 +18 0.931 +19 0.911 +20 0.888 +21 0.864 +22 0.838 +23 0.810 +24 0.780 +25 0.749 +26 0.716 +27 0.682 +28 0.647 +29 0.612 +30 0.575 +31 0.538 +32 0.500 +33 0.462 +34 0.423 +35 0.384 +36 0.345 +37 0.306 +38 0.267 +39 0.228 +40 0.190 +41 0.151 +42 0.113 +43 0.075 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.109 +49 -0.144 +50 -0.179 +51 -0.213 +52 -0.246 +53 -0.279 +54 -0.312 +55 -0.344 +56 -0.376 +57 -0.407 +58 -0.437 +59 -0.468 +60 -0.498 +61 -0.528 +62 -0.557 +63 -0.587 +64 -0.616 +65 -0.645 +66 -0.675 +67 -0.704 +68 -0.734 +69 -0.764 +70 -0.795 +71 -0.826 +72 -0.858 +73 -0.891 +74 -0.925 +75 -0.960 +76 -0.996 +77 -1.033 +78 -1.072 +79 -1.112 +80 -1.155 +81 -1.199 +82 -1.246 +83 -1.295 +84 -1.346 +85 -1.401 +86 -1.458 +87 -1.518 +88 -1.582 +89 -1.649 +90 -1.720 +1 1.144 +2 1.204 +3 1.256 +4 1.300 +5 1.337 +6 1.367 +7 1.390 +8 1.407 +9 1.419 +10 1.424 +11 1.425 +12 1.420 +13 1.410 +14 1.397 +15 1.379 +16 1.357 +17 1.331 +18 1.303 +19 1.271 +20 1.236 +21 1.199 +22 1.159 +23 1.117 +24 1.074 +25 1.028 +26 0.981 +27 0.933 +28 0.883 +29 0.832 +30 0.781 +31 0.729 +32 0.676 +33 0.623 +34 0.570 +35 0.517 +36 0.463 +37 0.410 +38 0.357 +39 0.305 +40 0.252 +41 0.201 +42 0.149 +43 0.099 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.096 +48 -0.142 +49 -0.188 +50 -0.233 +51 -0.277 +52 -0.319 +53 -0.362 +54 -0.403 +55 -0.443 +56 -0.482 +57 -0.521 +58 -0.559 +59 -0.596 +60 -0.633 +61 -0.669 +62 -0.704 +63 -0.740 +64 -0.774 +65 -0.809 +66 -0.844 +67 -0.878 +68 -0.913 +69 -0.948 +70 -0.983 +71 -1.019 +72 -1.055 +73 -1.093 +74 -1.131 +75 -1.171 +76 -1.212 +77 -1.255 +78 -1.299 +79 -1.346 +80 -1.394 +81 -1.445 +82 -1.499 +83 -1.556 +84 -1.615 +85 -1.678 +86 -1.745 +87 -1.816 +88 -1.891 +89 -1.970 +90 -2.054 +1 1.062 +2 1.115 +3 1.161 +4 1.200 +5 1.232 +6 1.258 +7 1.278 +8 1.293 +9 1.302 +10 1.306 +11 1.306 +12 1.300 +13 1.291 +14 1.278 +15 1.260 +16 1.240 +17 1.216 +18 1.189 +19 1.160 +20 1.128 +21 1.093 +22 1.057 +23 1.018 +24 0.978 +25 0.936 +26 0.893 +27 0.849 +28 0.803 +29 0.757 +30 0.710 +31 0.662 +32 0.614 +33 0.566 +34 0.518 +35 0.469 +36 0.420 +37 0.372 +38 0.324 +39 0.276 +40 0.229 +41 0.182 +42 0.135 +43 0.090 +44 0.044 +45 -0.000 +46 -0.044 +47 -0.086 +48 -0.129 +49 -0.170 +50 -0.210 +51 -0.250 +52 -0.288 +53 -0.326 +54 -0.363 +55 -0.399 +56 -0.435 +57 -0.469 +58 -0.503 +59 -0.536 +60 -0.569 +61 -0.601 +62 -0.633 +63 -0.664 +64 -0.695 +65 -0.726 +66 -0.756 +67 -0.787 +68 -0.818 +69 -0.849 +70 -0.880 +71 -0.912 +72 -0.944 +73 -0.977 +74 -1.011 +75 -1.046 +76 -1.083 +77 -1.121 +78 -1.160 +79 -1.201 +80 -1.244 +81 -1.290 +82 -1.337 +83 -1.388 +84 -1.441 +85 -1.497 +86 -1.556 +87 -1.619 +88 -1.686 +89 -1.757 +90 -1.832 +1 1.235 +2 1.285 +3 1.329 +4 1.365 +5 1.394 +6 1.417 +7 1.433 +8 1.444 +9 1.450 +10 1.450 +11 1.445 +12 1.436 +13 1.422 +14 1.404 +15 1.382 +16 1.357 +17 1.329 +18 1.297 +19 1.263 +20 1.226 +21 1.187 +22 1.145 +23 1.102 +24 1.057 +25 1.011 +26 0.963 +27 0.914 +28 0.864 +29 0.813 +30 0.762 +31 0.710 +32 0.658 +33 0.606 +34 0.553 +35 0.501 +36 0.448 +37 0.396 +38 0.345 +39 0.293 +40 0.243 +41 0.193 +42 0.143 +43 0.095 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.135 +49 -0.178 +50 -0.220 +51 -0.261 +52 -0.301 +53 -0.340 +54 -0.378 +55 -0.415 +56 -0.452 +57 -0.487 +58 -0.521 +59 -0.555 +60 -0.588 +61 -0.620 +62 -0.651 +63 -0.682 +64 -0.713 +65 -0.743 +66 -0.773 +67 -0.803 +68 -0.833 +69 -0.863 +70 -0.893 +71 -0.924 +72 -0.955 +73 -0.987 +74 -1.019 +75 -1.053 +76 -1.088 +77 -1.124 +78 -1.162 +79 -1.202 +80 -1.243 +81 -1.287 +82 -1.333 +83 -1.382 +84 -1.433 +85 -1.488 +86 -1.546 +87 -1.608 +88 -1.673 +89 -1.743 +90 -1.817 +1 1.009 +2 1.048 +3 1.082 +4 1.110 +5 1.132 +6 1.149 +7 1.162 +8 1.169 +9 1.173 +10 1.172 +11 1.167 +12 1.159 +13 1.147 +14 1.132 +15 1.114 +16 1.093 +17 1.070 +18 1.044 +19 1.016 +20 0.986 +21 0.954 +22 0.921 +23 0.886 +24 0.849 +25 0.812 +26 0.773 +27 0.734 +28 0.693 +29 0.652 +30 0.611 +31 0.569 +32 0.527 +33 0.485 +34 0.443 +35 0.401 +36 0.359 +37 0.317 +38 0.276 +39 0.235 +40 0.194 +41 0.154 +42 0.114 +43 0.076 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.108 +49 -0.142 +50 -0.176 +51 -0.208 +52 -0.240 +53 -0.271 +54 -0.301 +55 -0.331 +56 -0.359 +57 -0.387 +58 -0.414 +59 -0.441 +60 -0.467 +61 -0.492 +62 -0.517 +63 -0.541 +64 -0.566 +65 -0.589 +66 -0.613 +67 -0.636 +68 -0.660 +69 -0.683 +70 -0.707 +71 -0.731 +72 -0.755 +73 -0.780 +74 -0.806 +75 -0.832 +76 -0.860 +77 -0.888 +78 -0.918 +79 -0.949 +80 -0.981 +81 -1.016 +82 -1.052 +83 -1.090 +84 -1.131 +85 -1.174 +86 -1.220 +87 -1.269 +88 -1.320 +89 -1.375 +90 -1.434 +1 1.005 +2 1.039 +3 1.067 +4 1.091 +5 1.109 +6 1.123 +7 1.132 +8 1.136 +9 1.137 +10 1.134 +11 1.128 +12 1.118 +13 1.105 +14 1.089 +15 1.070 +16 1.048 +17 1.025 +18 0.999 +19 0.971 +20 0.941 +21 0.910 +22 0.877 +23 0.843 +24 0.807 +25 0.771 +26 0.734 +27 0.696 +28 0.657 +29 0.618 +30 0.578 +31 0.538 +32 0.498 +33 0.458 +34 0.418 +35 0.378 +36 0.338 +37 0.298 +38 0.259 +39 0.220 +40 0.182 +41 0.144 +42 0.107 +43 0.071 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.068 +48 -0.100 +49 -0.132 +50 -0.163 +51 -0.193 +52 -0.223 +53 -0.251 +54 -0.279 +55 -0.306 +56 -0.332 +57 -0.357 +58 -0.382 +59 -0.406 +60 -0.429 +61 -0.452 +62 -0.474 +63 -0.496 +64 -0.517 +65 -0.538 +66 -0.559 +67 -0.579 +68 -0.600 +69 -0.620 +70 -0.641 +71 -0.662 +72 -0.683 +73 -0.705 +74 -0.727 +75 -0.749 +76 -0.773 +77 -0.798 +78 -0.823 +79 -0.850 +80 -0.879 +81 -0.908 +82 -0.940 +83 -0.973 +84 -1.009 +85 -1.047 +86 -1.087 +87 -1.130 +88 -1.175 +89 -1.224 +90 -1.276 +1 0.801 +2 0.826 +3 0.846 +4 0.863 +5 0.876 +6 0.885 +7 0.891 +8 0.894 +9 0.893 +10 0.890 +11 0.884 +12 0.875 +13 0.864 +14 0.851 +15 0.835 +16 0.818 +17 0.799 +18 0.778 +19 0.756 +20 0.732 +21 0.707 +22 0.681 +23 0.654 +24 0.627 +25 0.598 +26 0.569 +27 0.539 +28 0.509 +29 0.478 +30 0.447 +31 0.416 +32 0.385 +33 0.353 +34 0.322 +35 0.291 +36 0.260 +37 0.230 +38 0.199 +39 0.170 +40 0.140 +41 0.111 +42 0.082 +43 0.054 +44 0.027 +45 -0.000 +46 -0.026 +47 -0.052 +48 -0.077 +49 -0.101 +50 -0.125 +51 -0.148 +52 -0.170 +53 -0.192 +54 -0.212 +55 -0.233 +56 -0.252 +57 -0.271 +58 -0.290 +59 -0.308 +60 -0.325 +61 -0.342 +62 -0.358 +63 -0.375 +64 -0.390 +65 -0.406 +66 -0.421 +67 -0.436 +68 -0.451 +69 -0.466 +70 -0.481 +71 -0.496 +72 -0.512 +73 -0.527 +74 -0.543 +75 -0.560 +76 -0.577 +77 -0.595 +78 -0.614 +79 -0.633 +80 -0.654 +81 -0.676 +82 -0.699 +83 -0.724 +84 -0.750 +85 -0.778 +86 -0.808 +87 -0.839 +88 -0.873 +89 -0.909 +90 -0.948 +1 0.673 +2 0.688 +3 0.701 +4 0.711 +5 0.718 +6 0.722 +7 0.724 +8 0.723 +9 0.721 +10 0.716 +11 0.709 +12 0.700 +13 0.689 +14 0.677 +15 0.663 +16 0.648 +17 0.632 +18 0.614 +19 0.595 +20 0.576 +21 0.555 +22 0.534 +23 0.512 +24 0.489 +25 0.466 +26 0.443 +27 0.419 +28 0.395 +29 0.370 +30 0.346 +31 0.321 +32 0.297 +33 0.272 +34 0.248 +35 0.224 +36 0.200 +37 0.176 +38 0.153 +39 0.130 +40 0.107 +41 0.084 +42 0.063 +43 0.041 +44 0.020 +45 -0.000 +46 -0.020 +47 -0.039 +48 -0.058 +49 -0.076 +50 -0.094 +51 -0.110 +52 -0.127 +53 -0.143 +54 -0.158 +55 -0.173 +56 -0.187 +57 -0.200 +58 -0.214 +59 -0.226 +60 -0.238 +61 -0.250 +62 -0.261 +63 -0.272 +64 -0.283 +65 -0.294 +66 -0.304 +67 -0.314 +68 -0.323 +69 -0.333 +70 -0.343 +71 -0.353 +72 -0.363 +73 -0.373 +74 -0.383 +75 -0.394 +76 -0.405 +77 -0.416 +78 -0.428 +79 -0.441 +80 -0.455 +81 -0.469 +82 -0.484 +83 -0.500 +84 -0.518 +85 -0.536 +86 -0.556 +87 -0.578 +88 -0.601 +89 -0.625 +90 -0.652 +1 0.435 +2 0.440 +3 0.444 +4 0.446 +5 0.446 +6 0.445 +7 0.443 +8 0.440 +9 0.435 +10 0.430 +11 0.423 +12 0.416 +13 0.408 +14 0.399 +15 0.389 +16 0.378 +17 0.367 +18 0.356 +19 0.344 +20 0.331 +21 0.318 +22 0.305 +23 0.292 +24 0.278 +25 0.264 +26 0.250 +27 0.236 +28 0.222 +29 0.207 +30 0.193 +31 0.179 +32 0.165 +33 0.151 +34 0.137 +35 0.123 +36 0.109 +37 0.096 +38 0.083 +39 0.070 +40 0.058 +41 0.046 +42 0.034 +43 0.022 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.030 +49 -0.040 +50 -0.049 +51 -0.057 +52 -0.066 +53 -0.073 +54 -0.081 +55 -0.088 +56 -0.095 +57 -0.101 +58 -0.107 +59 -0.113 +60 -0.118 +61 -0.123 +62 -0.128 +63 -0.133 +64 -0.137 +65 -0.141 +66 -0.145 +67 -0.149 +68 -0.152 +69 -0.156 +70 -0.159 +71 -0.162 +72 -0.166 +73 -0.169 +74 -0.173 +75 -0.176 +76 -0.180 +77 -0.184 +78 -0.188 +79 -0.192 +80 -0.197 +81 -0.202 +82 -0.208 +83 -0.214 +84 -0.221 +85 -0.228 +86 -0.236 +87 -0.245 +88 -0.254 +89 -0.265 +90 -0.276 +1 0.283 +2 0.277 +3 0.271 +4 0.265 +5 0.258 +6 0.251 +7 0.244 +8 0.237 +9 0.230 +10 0.223 +11 0.215 +12 0.207 +13 0.200 +14 0.192 +15 0.184 +16 0.176 +17 0.168 +18 0.161 +19 0.153 +20 0.145 +21 0.137 +22 0.130 +23 0.122 +24 0.115 +25 0.108 +26 0.100 +27 0.093 +28 0.086 +29 0.080 +30 0.073 +31 0.067 +32 0.060 +33 0.054 +34 0.049 +35 0.043 +36 0.038 +37 0.032 +38 0.027 +39 0.023 +40 0.018 +41 0.014 +42 0.010 +43 0.007 +44 0.003 +45 0.000 +46 -0.003 +47 -0.006 +48 -0.008 +49 -0.010 +50 -0.012 +51 -0.013 +52 -0.015 +53 -0.016 +54 -0.016 +55 -0.017 +56 -0.017 +57 -0.017 +58 -0.017 +59 -0.016 +60 -0.015 +61 -0.014 +62 -0.013 +63 -0.012 +64 -0.010 +65 -0.008 +66 -0.006 +67 -0.004 +68 -0.001 +69 0.001 +70 0.004 +71 0.007 +72 0.010 +73 0.013 +74 0.017 +75 0.020 +76 0.024 +77 0.027 +78 0.031 +79 0.035 +80 0.038 +81 0.042 +82 0.046 +83 0.050 +84 0.053 +85 0.057 +86 0.061 +87 0.064 +88 0.068 +89 0.071 +90 0.074 +1 0.069 +2 0.054 +3 0.040 +4 0.027 +5 0.015 +6 0.004 +7 -0.006 +8 -0.016 +9 -0.024 +10 -0.032 +11 -0.039 +12 -0.045 +13 -0.050 +14 -0.055 +15 -0.059 +16 -0.063 +17 -0.066 +18 -0.068 +19 -0.070 +20 -0.071 +21 -0.072 +22 -0.073 +23 -0.072 +24 -0.072 +25 -0.071 +26 -0.070 +27 -0.069 +28 -0.067 +29 -0.064 +30 -0.062 +31 -0.059 +32 -0.056 +33 -0.053 +34 -0.050 +35 -0.046 +36 -0.042 +37 -0.038 +38 -0.034 +39 -0.029 +40 -0.025 +41 -0.020 +42 -0.015 +43 -0.010 +44 -0.005 +45 0.000 +46 0.005 +47 0.011 +48 0.016 +49 0.022 +50 0.028 +51 0.033 +52 0.039 +53 0.045 +54 0.051 +55 0.057 +56 0.064 +57 0.070 +58 0.077 +59 0.083 +60 0.090 +61 0.097 +62 0.104 +63 0.111 +64 0.118 +65 0.125 +66 0.133 +67 0.141 +68 0.149 +69 0.157 +70 0.165 +71 0.174 +72 0.182 +73 0.191 +74 0.201 +75 0.210 +76 0.220 +77 0.231 +78 0.241 +79 0.252 +80 0.264 +81 0.275 +82 0.288 +83 0.300 +84 0.313 +85 0.327 +86 0.341 +87 0.356 +88 0.371 +89 0.387 +90 0.404 +1 -0.079 +2 -0.104 +3 -0.126 +4 -0.147 +5 -0.165 +6 -0.181 +7 -0.196 +8 -0.209 +9 -0.219 +10 -0.229 +11 -0.236 +12 -0.243 +13 -0.248 +14 -0.251 +15 -0.253 +16 -0.254 +17 -0.254 +18 -0.253 +19 -0.250 +20 -0.247 +21 -0.243 +22 -0.238 +23 -0.232 +24 -0.226 +25 -0.219 +26 -0.211 +27 -0.203 +28 -0.194 +29 -0.185 +30 -0.175 +31 -0.165 +32 -0.154 +33 -0.144 +34 -0.133 +35 -0.121 +36 -0.110 +37 -0.098 +38 -0.086 +39 -0.074 +40 -0.062 +41 -0.050 +42 -0.037 +43 -0.025 +44 -0.012 +45 0.000 +46 0.012 +47 0.025 +48 0.037 +49 0.050 +50 0.062 +51 0.075 +52 0.087 +53 0.099 +54 0.112 +55 0.124 +56 0.136 +57 0.148 +58 0.161 +59 0.173 +60 0.185 +61 0.198 +62 0.210 +63 0.223 +64 0.236 +65 0.249 +66 0.262 +67 0.275 +68 0.288 +69 0.302 +70 0.316 +71 0.330 +72 0.345 +73 0.360 +74 0.376 +75 0.392 +76 0.408 +77 0.425 +78 0.443 +79 0.461 +80 0.481 +81 0.500 +82 0.521 +83 0.543 +84 0.566 +85 0.589 +86 0.614 +87 0.640 +88 0.667 +89 0.695 +90 0.725 +1 -0.305 +2 -0.336 +3 -0.364 +4 -0.389 +5 -0.410 +6 -0.428 +7 -0.444 +8 -0.457 +9 -0.467 +10 -0.475 +11 -0.481 +12 -0.485 +13 -0.486 +14 -0.486 +15 -0.483 +16 -0.479 +17 -0.474 +18 -0.467 +19 -0.458 +20 -0.448 +21 -0.437 +22 -0.425 +23 -0.412 +24 -0.398 +25 -0.382 +26 -0.367 +27 -0.350 +28 -0.333 +29 -0.315 +30 -0.297 +31 -0.278 +32 -0.259 +33 -0.240 +34 -0.220 +35 -0.200 +36 -0.180 +37 -0.160 +38 -0.140 +39 -0.120 +40 -0.100 +41 -0.080 +42 -0.060 +43 -0.040 +44 -0.020 +45 0.000 +46 0.020 +47 0.039 +48 0.058 +49 0.077 +50 0.096 +51 0.114 +52 0.133 +53 0.151 +54 0.169 +55 0.187 +56 0.204 +57 0.221 +58 0.239 +59 0.256 +60 0.273 +61 0.290 +62 0.307 +63 0.323 +64 0.340 +65 0.357 +66 0.374 +67 0.391 +68 0.409 +69 0.426 +70 0.444 +71 0.462 +72 0.481 +73 0.500 +74 0.520 +75 0.540 +76 0.561 +77 0.582 +78 0.605 +79 0.628 +80 0.653 +81 0.678 +82 0.705 +83 0.733 +84 0.762 +85 0.793 +86 0.826 +87 0.860 +88 0.896 +89 0.933 +90 0.973 +1 -0.473 +2 -0.516 +3 -0.554 +4 -0.588 +5 -0.617 +6 -0.642 +7 -0.663 +8 -0.680 +9 -0.693 +10 -0.704 +11 -0.710 +12 -0.714 +13 -0.715 +14 -0.713 +15 -0.709 +16 -0.702 +17 -0.693 +18 -0.681 +19 -0.668 +20 -0.653 +21 -0.636 +22 -0.618 +23 -0.598 +24 -0.577 +25 -0.555 +26 -0.531 +27 -0.507 +28 -0.482 +29 -0.456 +30 -0.429 +31 -0.402 +32 -0.374 +33 -0.346 +34 -0.317 +35 -0.289 +36 -0.260 +37 -0.231 +38 -0.201 +39 -0.172 +40 -0.143 +41 -0.114 +42 -0.085 +43 -0.057 +44 -0.028 +45 0.000 +46 0.028 +47 0.056 +48 0.083 +49 0.110 +50 0.137 +51 0.163 +52 0.189 +53 0.214 +54 0.240 +55 0.265 +56 0.289 +57 0.314 +58 0.338 +59 0.362 +60 0.386 +61 0.409 +62 0.433 +63 0.456 +64 0.479 +65 0.503 +66 0.526 +67 0.550 +68 0.574 +69 0.598 +70 0.623 +71 0.648 +72 0.674 +73 0.700 +74 0.727 +75 0.755 +76 0.784 +77 0.814 +78 0.845 +79 0.878 +80 0.911 +81 0.947 +82 0.984 +83 1.023 +84 1.063 +85 1.106 +86 1.151 +87 1.199 +88 1.249 +89 1.301 +90 1.357 +1 -0.767 +2 -0.813 +3 -0.853 +4 -0.888 +5 -0.918 +6 -0.942 +7 -0.962 +8 -0.977 +9 -0.988 +10 -0.994 +11 -0.997 +12 -0.996 +13 -0.991 +14 -0.983 +15 -0.972 +16 -0.958 +17 -0.942 +18 -0.923 +19 -0.902 +20 -0.878 +21 -0.853 +22 -0.826 +23 -0.797 +24 -0.766 +25 -0.735 +26 -0.702 +27 -0.668 +28 -0.633 +29 -0.597 +30 -0.561 +31 -0.524 +32 -0.487 +33 -0.449 +34 -0.411 +35 -0.373 +36 -0.335 +37 -0.297 +38 -0.259 +39 -0.221 +40 -0.183 +41 -0.146 +42 -0.109 +43 -0.072 +44 -0.036 +45 0.000 +46 0.035 +47 0.070 +48 0.104 +49 0.137 +50 0.170 +51 0.203 +52 0.234 +53 0.266 +54 0.296 +55 0.326 +56 0.356 +57 0.385 +58 0.413 +59 0.441 +60 0.469 +61 0.496 +62 0.523 +63 0.550 +64 0.576 +65 0.603 +66 0.629 +67 0.655 +68 0.682 +69 0.709 +70 0.736 +71 0.764 +72 0.792 +73 0.821 +74 0.850 +75 0.881 +76 0.912 +77 0.945 +78 0.979 +79 1.015 +80 1.052 +81 1.091 +82 1.132 +83 1.175 +84 1.220 +85 1.268 +86 1.318 +87 1.371 +88 1.427 +89 1.487 +90 1.550 +1 -0.937 +2 -0.992 +3 -1.040 +4 -1.081 +5 -1.115 +6 -1.143 +7 -1.166 +8 -1.183 +9 -1.195 +10 -1.202 +11 -1.204 +12 -1.202 +13 -1.196 +14 -1.186 +15 -1.172 +16 -1.155 +17 -1.135 +18 -1.111 +19 -1.085 +20 -1.057 +21 -1.026 +22 -0.993 +23 -0.958 +24 -0.921 +25 -0.883 +26 -0.843 +27 -0.802 +28 -0.760 +29 -0.717 +30 -0.673 +31 -0.629 +32 -0.584 +33 -0.538 +34 -0.493 +35 -0.447 +36 -0.401 +37 -0.355 +38 -0.310 +39 -0.264 +40 -0.219 +41 -0.174 +42 -0.130 +43 -0.086 +44 -0.043 +45 0.000 +46 0.042 +47 0.083 +48 0.124 +49 0.164 +50 0.203 +51 0.242 +52 0.280 +53 0.317 +54 0.353 +55 0.389 +56 0.424 +57 0.458 +58 0.492 +59 0.525 +60 0.558 +61 0.590 +62 0.622 +63 0.653 +64 0.685 +65 0.716 +66 0.747 +67 0.778 +68 0.809 +69 0.841 +70 0.873 +71 0.906 +72 0.939 +73 0.973 +74 1.007 +75 1.043 +76 1.081 +77 1.119 +78 1.159 +79 1.201 +80 1.245 +81 1.291 +82 1.339 +83 1.390 +84 1.443 +85 1.500 +86 1.559 +87 1.622 +88 1.689 +89 1.759 +90 1.834 +1 -1.190 +2 -1.239 +3 -1.281 +4 -1.316 +5 -1.345 +6 -1.367 +7 -1.384 +8 -1.394 +9 -1.400 +10 -1.400 +11 -1.396 +12 -1.387 +13 -1.374 +14 -1.356 +15 -1.336 +16 -1.312 +17 -1.284 +18 -1.254 +19 -1.221 +20 -1.186 +21 -1.148 +22 -1.108 +23 -1.066 +24 -1.023 +25 -0.978 +26 -0.932 +27 -0.885 +28 -0.837 +29 -0.788 +30 -0.738 +31 -0.688 +32 -0.637 +33 -0.587 +34 -0.536 +35 -0.485 +36 -0.435 +37 -0.384 +38 -0.334 +39 -0.285 +40 -0.235 +41 -0.187 +42 -0.139 +43 -0.092 +44 -0.046 +45 0.000 +46 0.045 +47 0.088 +48 0.131 +49 0.173 +50 0.214 +51 0.254 +52 0.293 +53 0.331 +54 0.368 +55 0.404 +56 0.439 +57 0.474 +58 0.507 +59 0.540 +60 0.572 +61 0.603 +62 0.634 +63 0.664 +64 0.694 +65 0.724 +66 0.753 +67 0.782 +68 0.811 +69 0.841 +70 0.870 +71 0.900 +72 0.930 +73 0.961 +74 0.993 +75 1.026 +76 1.059 +77 1.094 +78 1.131 +79 1.169 +80 1.210 +81 1.252 +82 1.296 +83 1.343 +84 1.393 +85 1.446 +86 1.502 +87 1.561 +88 1.624 +89 1.691 +90 1.762 +1 -1.420 +2 -1.475 +3 -1.522 +4 -1.561 +5 -1.592 +6 -1.616 +7 -1.633 +8 -1.644 +9 -1.649 +10 -1.647 +11 -1.641 +12 -1.629 +13 -1.612 +14 -1.591 +15 -1.566 +16 -1.537 +17 -1.504 +18 -1.467 +19 -1.428 +20 -1.386 +21 -1.341 +22 -1.294 +23 -1.245 +24 -1.194 +25 -1.141 +26 -1.087 +27 -1.031 +28 -0.975 +29 -0.917 +30 -0.859 +31 -0.800 +32 -0.741 +33 -0.682 +34 -0.623 +35 -0.564 +36 -0.505 +37 -0.446 +38 -0.388 +39 -0.330 +40 -0.273 +41 -0.217 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.052 +47 0.102 +48 0.152 +49 0.200 +50 0.247 +51 0.293 +52 0.338 +53 0.382 +54 0.424 +55 0.465 +56 0.506 +57 0.545 +58 0.583 +59 0.620 +60 0.657 +61 0.692 +62 0.727 +63 0.762 +64 0.795 +65 0.829 +66 0.862 +67 0.894 +68 0.927 +69 0.960 +70 0.993 +71 1.026 +72 1.060 +73 1.095 +74 1.130 +75 1.167 +76 1.205 +77 1.244 +78 1.285 +79 1.328 +80 1.373 +81 1.421 +82 1.471 +83 1.523 +84 1.579 +85 1.639 +86 1.702 +87 1.769 +88 1.840 +89 1.915 +90 1.996 +1 -1.622 +2 -1.667 +3 -1.704 +4 -1.734 +5 -1.756 +6 -1.771 +7 -1.780 +8 -1.782 +9 -1.779 +10 -1.770 +11 -1.756 +12 -1.737 +13 -1.713 +14 -1.685 +15 -1.653 +16 -1.618 +17 -1.579 +18 -1.537 +19 -1.492 +20 -1.445 +21 -1.395 +22 -1.343 +23 -1.289 +24 -1.234 +25 -1.177 +26 -1.119 +27 -1.060 +28 -1.000 +29 -0.939 +30 -0.878 +31 -0.817 +32 -0.755 +33 -0.694 +34 -0.632 +35 -0.571 +36 -0.510 +37 -0.450 +38 -0.391 +39 -0.332 +40 -0.274 +41 -0.217 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.051 +47 0.101 +48 0.150 +49 0.197 +50 0.243 +51 0.288 +52 0.331 +53 0.373 +54 0.413 +55 0.452 +56 0.490 +57 0.527 +58 0.562 +59 0.597 +60 0.630 +61 0.662 +62 0.693 +63 0.724 +64 0.754 +65 0.783 +66 0.811 +67 0.839 +68 0.867 +69 0.895 +70 0.923 +71 0.951 +72 0.979 +73 1.008 +74 1.038 +75 1.068 +76 1.099 +77 1.132 +78 1.166 +79 1.202 +80 1.240 +81 1.279 +82 1.322 +83 1.366 +84 1.414 +85 1.465 +86 1.520 +87 1.578 +88 1.640 +89 1.706 +90 1.777 +1 -1.571 +2 -1.614 +3 -1.649 +4 -1.676 +5 -1.697 +6 -1.711 +7 -1.719 +8 -1.720 +9 -1.717 +10 -1.707 +11 -1.693 +12 -1.675 +13 -1.651 +14 -1.624 +15 -1.593 +16 -1.559 +17 -1.521 +18 -1.480 +19 -1.437 +20 -1.391 +21 -1.343 +22 -1.293 +23 -1.241 +24 -1.187 +25 -1.132 +26 -1.076 +27 -1.019 +28 -0.961 +29 -0.903 +30 -0.844 +31 -0.785 +32 -0.726 +33 -0.666 +34 -0.607 +35 -0.549 +36 -0.490 +37 -0.432 +38 -0.375 +39 -0.319 +40 -0.263 +41 -0.208 +42 -0.155 +43 -0.102 +44 -0.050 +45 0.000 +46 0.049 +47 0.097 +48 0.144 +49 0.189 +50 0.233 +51 0.276 +52 0.317 +53 0.357 +54 0.396 +55 0.433 +56 0.469 +57 0.504 +58 0.538 +59 0.571 +60 0.603 +61 0.633 +62 0.663 +63 0.692 +64 0.720 +65 0.748 +66 0.775 +67 0.802 +68 0.828 +69 0.855 +70 0.881 +71 0.908 +72 0.934 +73 0.962 +74 0.990 +75 1.018 +76 1.048 +77 1.079 +78 1.111 +79 1.145 +80 1.181 +81 1.219 +82 1.259 +83 1.302 +84 1.347 +85 1.396 +86 1.447 +87 1.503 +88 1.562 +89 1.625 +90 1.693 +1 -1.529 +2 -1.554 +3 -1.574 +4 -1.587 +5 -1.595 +6 -1.598 +7 -1.595 +8 -1.588 +9 -1.576 +10 -1.561 +11 -1.541 +12 -1.518 +13 -1.491 +14 -1.461 +15 -1.428 +16 -1.393 +17 -1.355 +18 -1.315 +19 -1.273 +20 -1.229 +21 -1.183 +22 -1.136 +23 -1.087 +24 -1.038 +25 -0.988 +26 -0.937 +27 -0.885 +28 -0.833 +29 -0.780 +30 -0.728 +31 -0.676 +32 -0.623 +33 -0.571 +34 -0.519 +35 -0.468 +36 -0.417 +37 -0.367 +38 -0.318 +39 -0.269 +40 -0.222 +41 -0.175 +42 -0.130 +43 -0.085 +44 -0.042 +45 0.000 +46 0.041 +47 0.080 +48 0.119 +49 0.156 +50 0.191 +51 0.226 +52 0.259 +53 0.290 +54 0.321 +55 0.350 +56 0.377 +57 0.404 +58 0.429 +59 0.454 +60 0.477 +61 0.499 +62 0.520 +63 0.541 +64 0.560 +65 0.579 +66 0.597 +67 0.614 +68 0.632 +69 0.648 +70 0.665 +71 0.682 +72 0.698 +73 0.715 +74 0.732 +75 0.749 +76 0.767 +77 0.786 +78 0.806 +79 0.827 +80 0.850 +81 0.873 +82 0.899 +83 0.926 +84 0.956 +85 0.988 +86 1.022 +87 1.059 +88 1.099 +89 1.142 +90 1.189 +1 -1.416 +2 -1.448 +3 -1.473 +4 -1.492 +5 -1.506 +6 -1.514 +7 -1.517 +8 -1.515 +9 -1.508 +10 -1.497 +11 -1.482 +12 -1.463 +13 -1.440 +14 -1.414 +15 -1.385 +16 -1.353 +17 -1.319 +18 -1.282 +19 -1.243 +20 -1.202 +21 -1.159 +22 -1.114 +23 -1.068 +24 -1.021 +25 -0.973 +26 -0.924 +27 -0.874 +28 -0.824 +29 -0.773 +30 -0.722 +31 -0.671 +32 -0.620 +33 -0.568 +34 -0.518 +35 -0.467 +36 -0.417 +37 -0.367 +38 -0.319 +39 -0.270 +40 -0.223 +41 -0.176 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.041 +47 0.082 +48 0.121 +49 0.159 +50 0.195 +51 0.231 +52 0.265 +53 0.298 +54 0.330 +55 0.361 +56 0.390 +57 0.419 +58 0.446 +59 0.473 +60 0.498 +61 0.522 +62 0.546 +63 0.569 +64 0.591 +65 0.613 +66 0.634 +67 0.654 +68 0.675 +69 0.695 +70 0.715 +71 0.735 +72 0.755 +73 0.776 +74 0.797 +75 0.819 +76 0.841 +77 0.864 +78 0.889 +79 0.915 +80 0.942 +81 0.971 +82 1.001 +83 1.034 +84 1.069 +85 1.107 +86 1.147 +87 1.190 +88 1.236 +89 1.286 +90 1.339 +1 -1.434 +2 -1.465 +3 -1.490 +4 -1.508 +5 -1.521 +6 -1.528 +7 -1.530 +8 -1.528 +9 -1.520 +10 -1.509 +11 -1.493 +12 -1.473 +13 -1.450 +14 -1.423 +15 -1.394 +16 -1.361 +17 -1.326 +18 -1.289 +19 -1.249 +20 -1.208 +21 -1.164 +22 -1.119 +23 -1.073 +24 -1.025 +25 -0.977 +26 -0.927 +27 -0.877 +28 -0.826 +29 -0.775 +30 -0.724 +31 -0.673 +32 -0.621 +33 -0.570 +34 -0.519 +35 -0.468 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.271 +40 -0.223 +41 -0.176 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.041 +47 0.082 +48 0.121 +49 0.158 +50 0.195 +51 0.230 +52 0.264 +53 0.297 +54 0.329 +55 0.359 +56 0.389 +57 0.417 +58 0.444 +59 0.470 +60 0.495 +61 0.519 +62 0.543 +63 0.565 +64 0.587 +65 0.608 +66 0.629 +67 0.649 +68 0.669 +69 0.688 +70 0.708 +71 0.728 +72 0.747 +73 0.767 +74 0.788 +75 0.809 +76 0.831 +77 0.854 +78 0.878 +79 0.903 +80 0.929 +81 0.957 +82 0.988 +83 1.020 +84 1.054 +85 1.091 +86 1.130 +87 1.173 +88 1.218 +89 1.267 +90 1.320 +1 -1.191 +2 -1.228 +3 -1.259 +4 -1.284 +5 -1.303 +6 -1.317 +7 -1.326 +8 -1.330 +9 -1.329 +10 -1.324 +11 -1.315 +12 -1.302 +13 -1.286 +14 -1.266 +15 -1.244 +16 -1.218 +17 -1.190 +18 -1.159 +19 -1.126 +20 -1.091 +21 -1.054 +22 -1.016 +23 -0.975 +24 -0.934 +25 -0.892 +26 -0.848 +27 -0.804 +28 -0.759 +29 -0.713 +30 -0.667 +31 -0.621 +32 -0.574 +33 -0.528 +34 -0.481 +35 -0.435 +36 -0.389 +37 -0.343 +38 -0.298 +39 -0.253 +40 -0.209 +41 -0.166 +42 -0.123 +43 -0.081 +44 -0.040 +45 0.000 +46 0.039 +47 0.078 +48 0.115 +49 0.151 +50 0.187 +51 0.221 +52 0.255 +53 0.287 +54 0.319 +55 0.349 +56 0.379 +57 0.407 +58 0.435 +59 0.462 +60 0.488 +61 0.514 +62 0.539 +63 0.563 +64 0.587 +65 0.610 +66 0.633 +67 0.656 +68 0.679 +69 0.701 +70 0.724 +71 0.747 +72 0.770 +73 0.794 +74 0.818 +75 0.843 +76 0.869 +77 0.896 +78 0.924 +79 0.954 +80 0.985 +81 1.017 +82 1.052 +83 1.089 +84 1.128 +85 1.170 +86 1.214 +87 1.261 +88 1.312 +89 1.366 +90 1.423 +1 -1.093 +2 -1.132 +3 -1.165 +4 -1.192 +5 -1.213 +6 -1.229 +7 -1.240 +8 -1.247 +9 -1.248 +10 -1.246 +11 -1.240 +12 -1.229 +13 -1.216 +14 -1.199 +15 -1.178 +16 -1.155 +17 -1.130 +18 -1.102 +19 -1.071 +20 -1.039 +21 -1.005 +22 -0.969 +23 -0.931 +24 -0.893 +25 -0.853 +26 -0.811 +27 -0.770 +28 -0.727 +29 -0.684 +30 -0.640 +31 -0.596 +32 -0.552 +33 -0.507 +34 -0.463 +35 -0.419 +36 -0.375 +37 -0.331 +38 -0.288 +39 -0.245 +40 -0.202 +41 -0.160 +42 -0.119 +43 -0.079 +44 -0.039 +45 0.000 +46 0.038 +47 0.075 +48 0.112 +49 0.147 +50 0.182 +51 0.216 +52 0.248 +53 0.280 +54 0.311 +55 0.341 +56 0.370 +57 0.399 +58 0.427 +59 0.454 +60 0.480 +61 0.505 +62 0.530 +63 0.555 +64 0.579 +65 0.603 +66 0.627 +67 0.650 +68 0.673 +69 0.697 +70 0.720 +71 0.744 +72 0.768 +73 0.793 +74 0.818 +75 0.844 +76 0.871 +77 0.899 +78 0.928 +79 0.959 +80 0.991 +81 1.025 +82 1.061 +83 1.099 +84 1.140 +85 1.183 +86 1.229 +87 1.277 +88 1.329 +89 1.384 +90 1.443 +1 -0.930 +2 -0.980 +3 -1.023 +4 -1.059 +5 -1.090 +6 -1.115 +7 -1.134 +8 -1.149 +9 -1.158 +10 -1.163 +11 -1.164 +12 -1.160 +13 -1.152 +14 -1.141 +15 -1.127 +16 -1.109 +17 -1.088 +18 -1.065 +19 -1.039 +20 -1.011 +21 -0.980 +22 -0.948 +23 -0.914 +24 -0.878 +25 -0.841 +26 -0.803 +27 -0.763 +28 -0.722 +29 -0.681 +30 -0.639 +31 -0.596 +32 -0.553 +33 -0.510 +34 -0.466 +35 -0.423 +36 -0.379 +37 -0.336 +38 -0.292 +39 -0.249 +40 -0.206 +41 -0.164 +42 -0.122 +43 -0.081 +44 -0.040 +45 0.000 +46 0.040 +47 0.078 +48 0.116 +49 0.154 +50 0.190 +51 0.226 +52 0.262 +53 0.296 +54 0.330 +55 0.363 +56 0.395 +57 0.427 +58 0.458 +59 0.488 +60 0.518 +61 0.548 +62 0.577 +63 0.606 +64 0.634 +65 0.663 +66 0.691 +67 0.720 +68 0.748 +69 0.777 +70 0.806 +71 0.836 +72 0.866 +73 0.897 +74 0.928 +75 0.961 +76 0.995 +77 1.030 +78 1.067 +79 1.105 +80 1.145 +81 1.188 +82 1.232 +83 1.279 +84 1.328 +85 1.380 +86 1.436 +87 1.494 +88 1.556 +89 1.621 +90 1.691 +1 -0.853 +2 -0.899 +3 -0.939 +4 -0.973 +5 -1.002 +6 -1.025 +7 -1.044 +8 -1.057 +9 -1.066 +10 -1.071 +11 -1.072 +12 -1.069 +13 -1.062 +14 -1.052 +15 -1.039 +16 -1.022 +17 -1.004 +18 -0.982 +19 -0.958 +20 -0.932 +21 -0.904 +22 -0.875 +23 -0.843 +24 -0.810 +25 -0.776 +26 -0.741 +27 -0.704 +28 -0.667 +29 -0.629 +30 -0.590 +31 -0.551 +32 -0.511 +33 -0.471 +34 -0.431 +35 -0.391 +36 -0.350 +37 -0.310 +38 -0.270 +39 -0.230 +40 -0.191 +41 -0.152 +42 -0.113 +43 -0.075 +44 -0.037 +45 0.000 +46 0.037 +47 0.072 +48 0.108 +49 0.142 +50 0.176 +51 0.209 +52 0.242 +53 0.274 +54 0.305 +55 0.336 +56 0.366 +57 0.395 +58 0.424 +59 0.452 +60 0.480 +61 0.508 +62 0.535 +63 0.562 +64 0.588 +65 0.615 +66 0.641 +67 0.667 +68 0.694 +69 0.721 +70 0.748 +71 0.776 +72 0.804 +73 0.833 +74 0.862 +75 0.893 +76 0.924 +77 0.957 +78 0.992 +79 1.027 +80 1.065 +81 1.104 +82 1.146 +83 1.189 +84 1.236 +85 1.284 +86 1.336 +87 1.390 +88 1.448 +89 1.509 +90 1.574 +1 -0.763 +2 -0.817 +3 -0.864 +4 -0.906 +5 -0.941 +6 -0.971 +7 -0.995 +8 -1.014 +9 -1.029 +10 -1.038 +11 -1.044 +12 -1.045 +13 -1.042 +14 -1.036 +15 -1.026 +16 -1.013 +17 -0.997 +18 -0.979 +19 -0.957 +20 -0.933 +21 -0.908 +22 -0.880 +23 -0.850 +24 -0.818 +25 -0.785 +26 -0.751 +27 -0.715 +28 -0.678 +29 -0.640 +30 -0.602 +31 -0.563 +32 -0.523 +33 -0.483 +34 -0.442 +35 -0.402 +36 -0.361 +37 -0.320 +38 -0.279 +39 -0.238 +40 -0.198 +41 -0.158 +42 -0.118 +43 -0.078 +44 -0.039 +45 0.000 +46 0.038 +47 0.076 +48 0.113 +49 0.150 +50 0.186 +51 0.221 +52 0.256 +53 0.291 +54 0.324 +55 0.357 +56 0.390 +57 0.422 +58 0.454 +59 0.486 +60 0.517 +61 0.547 +62 0.578 +63 0.608 +64 0.638 +65 0.669 +66 0.699 +67 0.730 +68 0.760 +69 0.791 +70 0.823 +71 0.855 +72 0.888 +73 0.922 +74 0.957 +75 0.993 +76 1.030 +77 1.068 +78 1.108 +79 1.150 +80 1.194 +81 1.240 +82 1.288 +83 1.339 +84 1.392 +85 1.448 +86 1.508 +87 1.570 +88 1.636 +89 1.706 +90 1.780 +1 -0.721 +2 -0.769 +3 -0.812 +4 -0.849 +5 -0.880 +6 -0.906 +7 -0.928 +8 -0.944 +9 -0.956 +10 -0.964 +11 -0.968 +12 -0.969 +13 -0.965 +14 -0.959 +15 -0.949 +16 -0.937 +17 -0.921 +18 -0.904 +19 -0.883 +20 -0.861 +21 -0.837 +22 -0.810 +23 -0.783 +24 -0.753 +25 -0.722 +26 -0.691 +27 -0.657 +28 -0.623 +29 -0.589 +30 -0.553 +31 -0.517 +32 -0.480 +33 -0.443 +34 -0.406 +35 -0.368 +36 -0.331 +37 -0.293 +38 -0.256 +39 -0.218 +40 -0.181 +41 -0.144 +42 -0.108 +43 -0.071 +44 -0.035 +45 0.000 +46 0.035 +47 0.069 +48 0.103 +49 0.137 +50 0.169 +51 0.202 +52 0.233 +53 0.265 +54 0.295 +55 0.325 +56 0.355 +57 0.384 +58 0.413 +59 0.441 +60 0.469 +61 0.497 +62 0.524 +63 0.552 +64 0.579 +65 0.606 +66 0.633 +67 0.660 +68 0.688 +69 0.716 +70 0.744 +71 0.773 +72 0.802 +73 0.832 +74 0.863 +75 0.896 +76 0.929 +77 0.963 +78 0.999 +79 1.037 +80 1.076 +81 1.117 +82 1.160 +83 1.206 +84 1.253 +85 1.304 +86 1.357 +87 1.413 +88 1.473 +89 1.536 +90 1.602 +1 -0.673 +2 -0.725 +3 -0.771 +4 -0.811 +5 -0.846 +6 -0.875 +7 -0.899 +8 -0.919 +9 -0.933 +10 -0.944 +11 -0.950 +12 -0.952 +13 -0.951 +14 -0.947 +15 -0.939 +16 -0.928 +17 -0.914 +18 -0.897 +19 -0.878 +20 -0.857 +21 -0.834 +22 -0.809 +23 -0.782 +24 -0.753 +25 -0.723 +26 -0.692 +27 -0.659 +28 -0.626 +29 -0.591 +30 -0.556 +31 -0.520 +32 -0.484 +33 -0.447 +34 -0.409 +35 -0.372 +36 -0.334 +37 -0.296 +38 -0.259 +39 -0.221 +40 -0.184 +41 -0.146 +42 -0.109 +43 -0.072 +44 -0.036 +45 0.000 +46 0.036 +47 0.071 +48 0.105 +49 0.139 +50 0.173 +51 0.206 +52 0.239 +53 0.271 +54 0.303 +55 0.334 +56 0.365 +57 0.395 +58 0.425 +59 0.454 +60 0.484 +61 0.513 +62 0.542 +63 0.571 +64 0.599 +65 0.628 +66 0.657 +67 0.686 +68 0.715 +69 0.745 +70 0.775 +71 0.806 +72 0.837 +73 0.870 +74 0.903 +75 0.937 +76 0.973 +77 1.010 +78 1.048 +79 1.088 +80 1.130 +81 1.174 +82 1.220 +83 1.268 +84 1.319 +85 1.373 +86 1.430 +87 1.489 +88 1.552 +89 1.619 +90 1.689 +1 -0.614 +2 -0.658 +3 -0.698 +4 -0.732 +5 -0.762 +6 -0.787 +7 -0.807 +8 -0.823 +9 -0.836 +10 -0.844 +11 -0.849 +12 -0.850 +13 -0.849 +14 -0.844 +15 -0.836 +16 -0.826 +17 -0.813 +18 -0.798 +19 -0.781 +20 -0.762 +21 -0.741 +22 -0.718 +23 -0.694 +24 -0.668 +25 -0.641 +26 -0.613 +27 -0.584 +28 -0.554 +29 -0.523 +30 -0.492 +31 -0.460 +32 -0.428 +33 -0.395 +34 -0.362 +35 -0.329 +36 -0.295 +37 -0.262 +38 -0.228 +39 -0.195 +40 -0.162 +41 -0.129 +42 -0.096 +43 -0.064 +44 -0.032 +45 0.000 +46 0.031 +47 0.062 +48 0.093 +49 0.123 +50 0.152 +51 0.181 +52 0.210 +53 0.238 +54 0.266 +55 0.293 +56 0.320 +57 0.347 +58 0.373 +59 0.398 +60 0.424 +61 0.449 +62 0.474 +63 0.500 +64 0.524 +65 0.549 +66 0.574 +67 0.600 +68 0.625 +69 0.651 +70 0.677 +71 0.704 +72 0.731 +73 0.759 +74 0.788 +75 0.817 +76 0.848 +77 0.880 +78 0.914 +79 0.948 +80 0.985 +81 1.023 +82 1.063 +83 1.105 +84 1.149 +85 1.196 +86 1.245 +87 1.297 +88 1.352 +89 1.410 +90 1.471 +1 -0.643 +2 -0.692 +3 -0.736 +4 -0.774 +5 -0.807 +6 -0.835 +7 -0.858 +8 -0.876 +9 -0.890 +10 -0.900 +11 -0.906 +12 -0.908 +13 -0.907 +14 -0.902 +15 -0.895 +16 -0.884 +17 -0.871 +18 -0.856 +19 -0.837 +20 -0.817 +21 -0.795 +22 -0.771 +23 -0.745 +24 -0.718 +25 -0.689 +26 -0.659 +27 -0.628 +28 -0.596 +29 -0.564 +30 -0.530 +31 -0.496 +32 -0.461 +33 -0.426 +34 -0.390 +35 -0.355 +36 -0.319 +37 -0.283 +38 -0.247 +39 -0.211 +40 -0.175 +41 -0.139 +42 -0.104 +43 -0.069 +44 -0.034 +45 0.000 +46 0.034 +47 0.067 +48 0.100 +49 0.133 +50 0.165 +51 0.197 +52 0.228 +53 0.259 +54 0.289 +55 0.318 +56 0.348 +57 0.377 +58 0.405 +59 0.434 +60 0.462 +61 0.489 +62 0.517 +63 0.544 +64 0.572 +65 0.599 +66 0.627 +67 0.655 +68 0.683 +69 0.711 +70 0.740 +71 0.769 +72 0.800 +73 0.830 +74 0.862 +75 0.895 +76 0.929 +77 0.965 +78 1.001 +79 1.040 +80 1.080 +81 1.122 +82 1.166 +83 1.212 +84 1.261 +85 1.313 +86 1.367 +87 1.424 +88 1.484 +89 1.548 +90 1.615 +1 -0.627 +2 -0.673 +3 -0.713 +4 -0.748 +5 -0.778 +6 -0.803 +7 -0.824 +8 -0.840 +9 -0.853 +10 -0.861 +11 -0.866 +12 -0.867 +13 -0.865 +14 -0.860 +15 -0.853 +16 -0.842 +17 -0.829 +18 -0.813 +19 -0.796 +20 -0.776 +21 -0.755 +22 -0.731 +23 -0.707 +24 -0.681 +25 -0.653 +26 -0.624 +27 -0.595 +28 -0.564 +29 -0.533 +30 -0.501 +31 -0.468 +32 -0.435 +33 -0.402 +34 -0.368 +35 -0.334 +36 -0.300 +37 -0.266 +38 -0.232 +39 -0.198 +40 -0.165 +41 -0.131 +42 -0.098 +43 -0.065 +44 -0.032 +45 0.000 +46 0.032 +47 0.063 +48 0.094 +49 0.125 +50 0.155 +51 0.184 +52 0.213 +53 0.242 +54 0.270 +55 0.298 +56 0.325 +57 0.352 +58 0.378 +59 0.404 +60 0.430 +61 0.456 +62 0.481 +63 0.507 +64 0.532 +65 0.557 +66 0.582 +67 0.608 +68 0.634 +69 0.660 +70 0.686 +71 0.713 +72 0.740 +73 0.769 +74 0.798 +75 0.828 +76 0.859 +77 0.891 +78 0.925 +79 0.960 +80 0.997 +81 1.036 +82 1.076 +83 1.119 +84 1.164 +85 1.211 +86 1.261 +87 1.314 +88 1.369 +89 1.428 +90 1.490 +1 -0.643 +2 -0.693 +3 -0.737 +4 -0.775 +5 -0.808 +6 -0.836 +7 -0.859 +8 -0.877 +9 -0.892 +10 -0.901 +11 -0.908 +12 -0.910 +13 -0.909 +14 -0.904 +15 -0.897 +16 -0.886 +17 -0.873 +18 -0.857 +19 -0.839 +20 -0.819 +21 -0.797 +22 -0.773 +23 -0.747 +24 -0.719 +25 -0.691 +26 -0.661 +27 -0.630 +28 -0.598 +29 -0.565 +30 -0.531 +31 -0.497 +32 -0.462 +33 -0.427 +34 -0.391 +35 -0.355 +36 -0.319 +37 -0.283 +38 -0.247 +39 -0.211 +40 -0.175 +41 -0.140 +42 -0.104 +43 -0.069 +44 -0.034 +45 0.000 +46 0.034 +47 0.067 +48 0.101 +49 0.133 +50 0.165 +51 0.197 +52 0.228 +53 0.259 +54 0.289 +55 0.319 +56 0.348 +57 0.377 +58 0.406 +59 0.434 +60 0.462 +61 0.490 +62 0.517 +63 0.545 +64 0.572 +65 0.600 +66 0.627 +67 0.655 +68 0.683 +69 0.711 +70 0.740 +71 0.769 +72 0.799 +73 0.830 +74 0.862 +75 0.895 +76 0.929 +77 0.964 +78 1.001 +79 1.040 +80 1.080 +81 1.122 +82 1.166 +83 1.212 +84 1.261 +85 1.312 +86 1.367 +87 1.424 +88 1.484 +89 1.548 +90 1.615 +1 -0.615 +2 -0.660 +3 -0.700 +4 -0.734 +5 -0.764 +6 -0.789 +7 -0.809 +8 -0.826 +9 -0.838 +10 -0.846 +11 -0.851 +12 -0.852 +13 -0.851 +14 -0.846 +15 -0.838 +16 -0.828 +17 -0.815 +18 -0.800 +19 -0.783 +20 -0.763 +21 -0.742 +22 -0.719 +23 -0.695 +24 -0.669 +25 -0.642 +26 -0.614 +27 -0.585 +28 -0.555 +29 -0.524 +30 -0.493 +31 -0.461 +32 -0.428 +33 -0.396 +34 -0.363 +35 -0.329 +36 -0.296 +37 -0.262 +38 -0.229 +39 -0.195 +40 -0.162 +41 -0.129 +42 -0.096 +43 -0.064 +44 -0.032 +45 0.000 +46 0.031 +47 0.062 +48 0.093 +49 0.123 +50 0.152 +51 0.182 +52 0.210 +53 0.238 +54 0.266 +55 0.293 +56 0.320 +57 0.347 +58 0.373 +59 0.399 +60 0.424 +61 0.450 +62 0.475 +63 0.500 +64 0.525 +65 0.550 +66 0.575 +67 0.600 +68 0.625 +69 0.651 +70 0.677 +71 0.704 +72 0.731 +73 0.759 +74 0.788 +75 0.817 +76 0.848 +77 0.880 +78 0.913 +79 0.948 +80 0.985 +81 1.023 +82 1.063 +83 1.105 +84 1.149 +85 1.196 +86 1.245 +87 1.297 +88 1.352 +89 1.410 +90 1.471 +1 -0.676 +2 -0.728 +3 -0.774 +4 -0.815 +5 -0.849 +6 -0.878 +7 -0.902 +8 -0.922 +9 -0.936 +10 -0.947 +11 -0.953 +12 -0.955 +13 -0.954 +14 -0.949 +15 -0.941 +16 -0.930 +17 -0.916 +18 -0.900 +19 -0.881 +20 -0.859 +21 -0.836 +22 -0.811 +23 -0.783 +24 -0.755 +25 -0.725 +26 -0.693 +27 -0.661 +28 -0.627 +29 -0.592 +30 -0.557 +31 -0.521 +32 -0.484 +33 -0.447 +34 -0.410 +35 -0.372 +36 -0.335 +37 -0.297 +38 -0.259 +39 -0.221 +40 -0.184 +41 -0.146 +42 -0.109 +43 -0.072 +44 -0.036 +45 0.000 +46 0.036 +47 0.071 +48 0.105 +49 0.140 +50 0.173 +51 0.206 +52 0.239 +53 0.271 +54 0.303 +55 0.334 +56 0.365 +57 0.395 +58 0.425 +59 0.455 +60 0.484 +61 0.513 +62 0.542 +63 0.571 +64 0.599 +65 0.628 +66 0.657 +67 0.686 +68 0.715 +69 0.745 +70 0.775 +71 0.806 +72 0.837 +73 0.869 +74 0.903 +75 0.937 +76 0.973 +77 1.009 +78 1.048 +79 1.088 +80 1.130 +81 1.174 +82 1.220 +83 1.268 +84 1.319 +85 1.373 +86 1.429 +87 1.489 +88 1.552 +89 1.619 +90 1.689 +1 -0.724 +2 -0.773 +3 -0.815 +4 -0.852 +5 -0.883 +6 -0.909 +7 -0.930 +8 -0.947 +9 -0.959 +10 -0.967 +11 -0.971 +12 -0.971 +13 -0.968 +14 -0.961 +15 -0.951 +16 -0.939 +17 -0.923 +18 -0.905 +19 -0.885 +20 -0.863 +21 -0.838 +22 -0.812 +23 -0.784 +24 -0.755 +25 -0.724 +26 -0.692 +27 -0.659 +28 -0.625 +29 -0.590 +30 -0.554 +31 -0.518 +32 -0.481 +33 -0.444 +34 -0.407 +35 -0.369 +36 -0.331 +37 -0.294 +38 -0.256 +39 -0.219 +40 -0.181 +41 -0.144 +42 -0.108 +43 -0.071 +44 -0.035 +45 0.000 +46 0.035 +47 0.069 +48 0.103 +49 0.137 +50 0.170 +51 0.202 +52 0.234 +53 0.265 +54 0.296 +55 0.326 +56 0.356 +57 0.385 +58 0.413 +59 0.442 +60 0.470 +61 0.498 +62 0.525 +63 0.552 +64 0.580 +65 0.607 +66 0.634 +67 0.661 +68 0.689 +69 0.717 +70 0.745 +71 0.774 +72 0.803 +73 0.833 +74 0.865 +75 0.897 +76 0.930 +77 0.964 +78 1.000 +79 1.038 +80 1.077 +81 1.118 +82 1.161 +83 1.207 +84 1.254 +85 1.305 +86 1.358 +87 1.414 +88 1.474 +89 1.537 +90 1.603 +1 -0.765 +2 -0.819 +3 -0.867 +4 -0.908 +5 -0.944 +6 -0.974 +7 -0.998 +8 -1.018 +9 -1.032 +10 -1.042 +11 -1.047 +12 -1.048 +13 -1.046 +14 -1.040 +15 -1.030 +16 -1.017 +17 -1.001 +18 -0.982 +19 -0.961 +20 -0.937 +21 -0.911 +22 -0.883 +23 -0.853 +24 -0.821 +25 -0.788 +26 -0.753 +27 -0.717 +28 -0.680 +29 -0.643 +30 -0.604 +31 -0.565 +32 -0.525 +33 -0.485 +34 -0.444 +35 -0.403 +36 -0.362 +37 -0.321 +38 -0.280 +39 -0.239 +40 -0.198 +41 -0.158 +42 -0.118 +43 -0.078 +44 -0.039 +45 0.000 +46 0.038 +47 0.076 +48 0.113 +49 0.150 +50 0.186 +51 0.222 +52 0.257 +53 0.291 +54 0.325 +55 0.358 +56 0.391 +57 0.423 +58 0.455 +59 0.487 +60 0.518 +61 0.548 +62 0.579 +63 0.609 +64 0.640 +65 0.670 +66 0.700 +67 0.731 +68 0.761 +69 0.792 +70 0.824 +71 0.856 +72 0.889 +73 0.923 +74 0.958 +75 0.993 +76 1.031 +77 1.069 +78 1.109 +79 1.151 +80 1.195 +81 1.241 +82 1.289 +83 1.340 +84 1.393 +85 1.449 +86 1.509 +87 1.571 +88 1.637 +89 1.707 +90 1.781 +1 -0.858 +2 -0.904 +3 -0.944 +4 -0.978 +5 -1.006 +6 -1.029 +7 -1.047 +8 -1.061 +9 -1.070 +10 -1.074 +11 -1.075 +12 -1.071 +13 -1.065 +14 -1.054 +15 -1.041 +16 -1.025 +17 -1.006 +18 -0.984 +19 -0.960 +20 -0.934 +21 -0.906 +22 -0.876 +23 -0.845 +24 -0.812 +25 -0.778 +26 -0.742 +27 -0.706 +28 -0.668 +29 -0.630 +30 -0.591 +31 -0.552 +32 -0.512 +33 -0.472 +34 -0.432 +35 -0.391 +36 -0.351 +37 -0.311 +38 -0.271 +39 -0.231 +40 -0.191 +41 -0.152 +42 -0.113 +43 -0.075 +44 -0.037 +45 0.000 +46 0.037 +47 0.073 +48 0.108 +49 0.142 +50 0.176 +51 0.210 +52 0.242 +53 0.274 +54 0.306 +55 0.336 +56 0.366 +57 0.396 +58 0.424 +59 0.453 +60 0.481 +61 0.508 +62 0.535 +63 0.562 +64 0.589 +65 0.615 +66 0.642 +67 0.668 +68 0.695 +69 0.722 +70 0.749 +71 0.777 +72 0.805 +73 0.834 +74 0.863 +75 0.894 +76 0.926 +77 0.959 +78 0.993 +79 1.029 +80 1.066 +81 1.106 +82 1.147 +83 1.191 +84 1.237 +85 1.286 +86 1.337 +87 1.392 +88 1.450 +89 1.511 +90 1.576 +1 -0.935 +2 -0.984 +3 -1.027 +4 -1.064 +5 -1.094 +6 -1.119 +7 -1.138 +8 -1.152 +9 -1.162 +10 -1.166 +11 -1.167 +12 -1.163 +13 -1.155 +14 -1.144 +15 -1.129 +16 -1.112 +17 -1.091 +18 -1.067 +19 -1.041 +20 -1.013 +21 -0.982 +22 -0.950 +23 -0.916 +24 -0.880 +25 -0.842 +26 -0.804 +27 -0.764 +28 -0.724 +29 -0.682 +30 -0.640 +31 -0.597 +32 -0.554 +33 -0.511 +34 -0.467 +35 -0.423 +36 -0.380 +37 -0.336 +38 -0.293 +39 -0.250 +40 -0.207 +41 -0.164 +42 -0.122 +43 -0.081 +44 -0.040 +45 0.000 +46 0.040 +47 0.078 +48 0.117 +49 0.154 +50 0.191 +51 0.227 +52 0.262 +53 0.296 +54 0.330 +55 0.363 +56 0.395 +57 0.427 +58 0.458 +59 0.489 +60 0.519 +61 0.548 +62 0.578 +63 0.607 +64 0.635 +65 0.664 +66 0.692 +67 0.721 +68 0.749 +69 0.778 +70 0.807 +71 0.837 +72 0.867 +73 0.898 +74 0.929 +75 0.962 +76 0.996 +77 1.031 +78 1.068 +79 1.107 +80 1.147 +81 1.189 +82 1.234 +83 1.280 +84 1.330 +85 1.382 +86 1.437 +87 1.496 +88 1.558 +89 1.623 +90 1.693 +1 -1.096 +2 -1.135 +3 -1.168 +4 -1.195 +5 -1.216 +6 -1.232 +7 -1.243 +8 -1.249 +9 -1.251 +10 -1.248 +11 -1.242 +12 -1.232 +13 -1.218 +14 -1.201 +15 -1.180 +16 -1.157 +17 -1.132 +18 -1.103 +19 -1.073 +20 -1.041 +21 -1.006 +22 -0.970 +23 -0.933 +24 -0.894 +25 -0.854 +26 -0.813 +27 -0.771 +28 -0.728 +29 -0.685 +30 -0.641 +31 -0.597 +32 -0.553 +33 -0.508 +34 -0.464 +35 -0.419 +36 -0.375 +37 -0.331 +38 -0.288 +39 -0.245 +40 -0.203 +41 -0.161 +42 -0.119 +43 -0.079 +44 -0.039 +45 0.000 +46 0.038 +47 0.076 +48 0.112 +49 0.148 +50 0.182 +51 0.216 +52 0.249 +53 0.281 +54 0.312 +55 0.342 +56 0.371 +57 0.400 +58 0.428 +59 0.455 +60 0.481 +61 0.507 +62 0.532 +63 0.557 +64 0.581 +65 0.605 +66 0.628 +67 0.652 +68 0.675 +69 0.698 +70 0.722 +71 0.746 +72 0.770 +73 0.795 +74 0.820 +75 0.846 +76 0.873 +77 0.901 +78 0.931 +79 0.961 +80 0.994 +81 1.028 +82 1.064 +83 1.102 +84 1.142 +85 1.185 +86 1.231 +87 1.279 +88 1.331 +89 1.386 +90 1.445 +1 -1.193 +2 -1.230 +3 -1.261 +4 -1.287 +5 -1.306 +6 -1.320 +7 -1.329 +8 -1.333 +9 -1.333 +10 -1.328 +11 -1.319 +12 -1.306 +13 -1.290 +14 -1.270 +15 -1.247 +16 -1.222 +17 -1.193 +18 -1.163 +19 -1.129 +20 -1.094 +21 -1.057 +22 -1.019 +23 -0.978 +24 -0.937 +25 -0.894 +26 -0.851 +27 -0.806 +28 -0.761 +29 -0.715 +30 -0.669 +31 -0.623 +32 -0.576 +33 -0.529 +34 -0.483 +35 -0.436 +36 -0.390 +37 -0.344 +38 -0.299 +39 -0.254 +40 -0.210 +41 -0.166 +42 -0.124 +43 -0.082 +44 -0.040 +45 0.000 +46 0.039 +47 0.078 +48 0.115 +49 0.152 +50 0.187 +51 0.222 +52 0.255 +53 0.288 +54 0.319 +55 0.350 +56 0.379 +57 0.408 +58 0.436 +59 0.463 +60 0.489 +61 0.515 +62 0.540 +63 0.564 +64 0.588 +65 0.611 +66 0.634 +67 0.657 +68 0.680 +69 0.702 +70 0.725 +71 0.748 +72 0.771 +73 0.795 +74 0.819 +75 0.844 +76 0.870 +77 0.897 +78 0.925 +79 0.955 +80 0.986 +81 1.019 +82 1.054 +83 1.091 +84 1.130 +85 1.172 +86 1.216 +87 1.264 +88 1.314 +89 1.368 +90 1.426 +1 -1.437 +2 -1.468 +3 -1.493 +4 -1.511 +5 -1.524 +6 -1.531 +7 -1.533 +8 -1.530 +9 -1.523 +10 -1.511 +11 -1.495 +12 -1.475 +13 -1.452 +14 -1.426 +15 -1.396 +16 -1.363 +17 -1.328 +18 -1.291 +19 -1.251 +20 -1.209 +21 -1.166 +22 -1.121 +23 -1.074 +24 -1.027 +25 -0.978 +26 -0.929 +27 -0.878 +28 -0.828 +29 -0.776 +30 -0.725 +31 -0.673 +32 -0.622 +33 -0.571 +34 -0.519 +35 -0.469 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.271 +40 -0.223 +41 -0.177 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.041 +47 0.082 +48 0.121 +49 0.159 +50 0.195 +51 0.231 +52 0.265 +53 0.298 +54 0.330 +55 0.360 +56 0.390 +57 0.418 +58 0.445 +59 0.471 +60 0.496 +61 0.521 +62 0.544 +63 0.567 +64 0.588 +65 0.610 +66 0.630 +67 0.651 +68 0.671 +69 0.690 +70 0.710 +71 0.730 +72 0.750 +73 0.770 +74 0.790 +75 0.811 +76 0.833 +77 0.856 +78 0.880 +79 0.905 +80 0.932 +81 0.960 +82 0.990 +83 1.022 +84 1.057 +85 1.094 +86 1.133 +87 1.176 +88 1.221 +89 1.270 +90 1.323 +1 -1.418 +2 -1.450 +3 -1.476 +4 -1.495 +5 -1.509 +6 -1.517 +7 -1.520 +8 -1.518 +9 -1.512 +10 -1.501 +11 -1.486 +12 -1.467 +13 -1.444 +14 -1.418 +15 -1.389 +16 -1.357 +17 -1.323 +18 -1.286 +19 -1.246 +20 -1.205 +21 -1.162 +22 -1.117 +23 -1.071 +24 -1.024 +25 -0.976 +26 -0.927 +27 -0.877 +28 -0.826 +29 -0.775 +30 -0.724 +31 -0.673 +32 -0.621 +33 -0.570 +34 -0.519 +35 -0.468 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.271 +40 -0.224 +41 -0.177 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.042 +47 0.082 +48 0.121 +49 0.159 +50 0.196 +51 0.231 +52 0.266 +53 0.299 +54 0.331 +55 0.361 +56 0.391 +57 0.420 +58 0.447 +59 0.473 +60 0.499 +61 0.523 +62 0.547 +63 0.570 +64 0.592 +65 0.614 +66 0.635 +67 0.655 +68 0.676 +69 0.696 +70 0.716 +71 0.736 +72 0.756 +73 0.777 +74 0.798 +75 0.820 +76 0.842 +77 0.866 +78 0.890 +79 0.916 +80 0.944 +81 0.973 +82 1.003 +83 1.036 +84 1.071 +85 1.109 +86 1.150 +87 1.193 +88 1.239 +89 1.289 +90 1.343 +1 -1.533 +2 -1.558 +3 -1.578 +4 -1.591 +5 -1.599 +6 -1.602 +7 -1.599 +8 -1.592 +9 -1.580 +10 -1.565 +11 -1.545 +12 -1.522 +13 -1.495 +14 -1.465 +15 -1.432 +16 -1.397 +17 -1.359 +18 -1.318 +19 -1.276 +20 -1.232 +21 -1.186 +22 -1.139 +23 -1.090 +24 -1.041 +25 -0.990 +26 -0.939 +27 -0.887 +28 -0.835 +29 -0.783 +30 -0.730 +31 -0.677 +32 -0.625 +33 -0.573 +34 -0.521 +35 -0.469 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.270 +40 -0.222 +41 -0.176 +42 -0.130 +43 -0.086 +44 -0.042 +45 0.000 +46 0.041 +47 0.081 +48 0.119 +49 0.156 +50 0.192 +51 0.226 +52 0.259 +53 0.291 +54 0.321 +55 0.351 +56 0.379 +57 0.405 +58 0.431 +59 0.455 +60 0.478 +61 0.500 +62 0.522 +63 0.542 +64 0.562 +65 0.580 +66 0.599 +67 0.616 +68 0.633 +69 0.650 +70 0.667 +71 0.684 +72 0.700 +73 0.717 +74 0.734 +75 0.752 +76 0.770 +77 0.789 +78 0.809 +79 0.830 +80 0.853 +81 0.877 +82 0.902 +83 0.930 +84 0.959 +85 0.991 +86 1.026 +87 1.063 +88 1.103 +89 1.147 +90 1.194 +1 -1.574 +2 -1.617 +3 -1.652 +4 -1.679 +5 -1.700 +6 -1.714 +7 -1.722 +8 -1.724 +9 -1.720 +10 -1.711 +11 -1.697 +12 -1.678 +13 -1.655 +14 -1.627 +15 -1.596 +16 -1.562 +17 -1.524 +18 -1.483 +19 -1.440 +20 -1.394 +21 -1.346 +22 -1.295 +23 -1.243 +24 -1.190 +25 -1.135 +26 -1.079 +27 -1.021 +28 -0.963 +29 -0.905 +30 -0.846 +31 -0.787 +32 -0.727 +33 -0.668 +34 -0.609 +35 -0.550 +36 -0.491 +37 -0.433 +38 -0.376 +39 -0.320 +40 -0.264 +41 -0.209 +42 -0.155 +43 -0.102 +44 -0.051 +45 0.000 +46 0.049 +47 0.097 +48 0.144 +49 0.190 +50 0.234 +51 0.276 +52 0.318 +53 0.358 +54 0.397 +55 0.435 +56 0.471 +57 0.506 +58 0.540 +59 0.573 +60 0.604 +61 0.635 +62 0.665 +63 0.694 +64 0.723 +65 0.750 +66 0.778 +67 0.804 +68 0.831 +69 0.858 +70 0.884 +71 0.911 +72 0.938 +73 0.965 +74 0.993 +75 1.022 +76 1.052 +77 1.083 +78 1.115 +79 1.149 +80 1.185 +81 1.223 +82 1.263 +83 1.306 +84 1.352 +85 1.400 +86 1.452 +87 1.507 +88 1.567 +89 1.630 +90 1.698 +1 -1.624 +2 -1.670 +3 -1.707 +4 -1.737 +5 -1.759 +6 -1.774 +7 -1.783 +8 -1.786 +9 -1.782 +10 -1.773 +11 -1.759 +12 -1.740 +13 -1.717 +14 -1.689 +15 -1.657 +16 -1.621 +17 -1.583 +18 -1.540 +19 -1.496 +20 -1.448 +21 -1.398 +22 -1.346 +23 -1.292 +24 -1.237 +25 -1.180 +26 -1.121 +27 -1.062 +28 -1.002 +29 -0.941 +30 -0.880 +31 -0.818 +32 -0.757 +33 -0.695 +34 -0.634 +35 -0.572 +36 -0.512 +37 -0.451 +38 -0.392 +39 -0.333 +40 -0.275 +41 -0.218 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.051 +47 0.101 +48 0.150 +49 0.198 +50 0.244 +51 0.288 +52 0.332 +53 0.374 +54 0.414 +55 0.453 +56 0.491 +57 0.528 +58 0.564 +59 0.598 +60 0.631 +61 0.663 +62 0.695 +63 0.725 +64 0.755 +65 0.784 +66 0.813 +67 0.841 +68 0.869 +69 0.897 +70 0.925 +71 0.953 +72 0.981 +73 1.010 +74 1.040 +75 1.070 +76 1.102 +77 1.135 +78 1.169 +79 1.205 +80 1.243 +81 1.283 +82 1.325 +83 1.370 +84 1.418 +85 1.470 +86 1.524 +87 1.583 +88 1.645 +89 1.712 +90 1.783 +1 -1.424 +2 -1.479 +3 -1.526 +4 -1.565 +5 -1.596 +6 -1.620 +7 -1.637 +8 -1.648 +9 -1.653 +10 -1.651 +11 -1.645 +12 -1.633 +13 -1.616 +14 -1.595 +15 -1.570 +16 -1.540 +17 -1.507 +18 -1.471 +19 -1.431 +20 -1.389 +21 -1.344 +22 -1.297 +23 -1.248 +24 -1.196 +25 -1.143 +26 -1.089 +27 -1.033 +28 -0.977 +29 -0.919 +30 -0.861 +31 -0.802 +32 -0.743 +33 -0.684 +34 -0.624 +35 -0.565 +36 -0.506 +37 -0.447 +38 -0.389 +39 -0.331 +40 -0.274 +41 -0.217 +42 -0.161 +43 -0.107 +44 -0.053 +45 0.000 +46 0.052 +47 0.102 +48 0.152 +49 0.200 +50 0.248 +51 0.294 +52 0.339 +53 0.382 +54 0.425 +55 0.467 +56 0.507 +57 0.546 +58 0.585 +59 0.622 +60 0.659 +61 0.694 +62 0.729 +63 0.764 +64 0.798 +65 0.831 +66 0.864 +67 0.897 +68 0.930 +69 0.963 +70 0.996 +71 1.030 +72 1.064 +73 1.098 +74 1.134 +75 1.171 +76 1.209 +77 1.248 +78 1.289 +79 1.333 +80 1.378 +81 1.425 +82 1.476 +83 1.529 +84 1.585 +85 1.644 +86 1.708 +87 1.775 +88 1.846 +89 1.922 +90 2.003 +1 -1.193 +2 -1.242 +3 -1.285 +4 -1.320 +5 -1.349 +6 -1.372 +7 -1.388 +8 -1.399 +9 -1.404 +10 -1.405 +11 -1.401 +12 -1.392 +13 -1.379 +14 -1.362 +15 -1.341 +16 -1.317 +17 -1.289 +18 -1.259 +19 -1.226 +20 -1.190 +21 -1.152 +22 -1.112 +23 -1.071 +24 -1.027 +25 -0.982 +26 -0.936 +27 -0.888 +28 -0.840 +29 -0.791 +30 -0.741 +31 -0.691 +32 -0.640 +33 -0.589 +34 -0.538 +35 -0.487 +36 -0.436 +37 -0.386 +38 -0.335 +39 -0.286 +40 -0.236 +41 -0.188 +42 -0.140 +43 -0.092 +44 -0.046 +45 0.000 +46 0.045 +47 0.089 +48 0.132 +49 0.174 +50 0.215 +51 0.255 +52 0.294 +53 0.332 +54 0.369 +55 0.406 +56 0.441 +57 0.475 +58 0.509 +59 0.542 +60 0.574 +61 0.606 +62 0.636 +63 0.667 +64 0.697 +65 0.726 +66 0.756 +67 0.785 +68 0.814 +69 0.843 +70 0.873 +71 0.903 +72 0.933 +73 0.964 +74 0.996 +75 1.029 +76 1.063 +77 1.098 +78 1.135 +79 1.174 +80 1.214 +81 1.256 +82 1.301 +83 1.348 +84 1.398 +85 1.451 +86 1.507 +87 1.567 +88 1.630 +89 1.697 +90 1.769 +1 -0.941 +2 -0.996 +3 -1.044 +4 -1.085 +5 -1.120 +6 -1.149 +7 -1.171 +8 -1.189 +9 -1.201 +10 -1.208 +11 -1.210 +12 -1.208 +13 -1.202 +14 -1.191 +15 -1.178 +16 -1.160 +17 -1.140 +18 -1.116 +19 -1.090 +20 -1.062 +21 -1.030 +22 -0.997 +23 -0.962 +24 -0.925 +25 -0.887 +26 -0.847 +27 -0.805 +28 -0.763 +29 -0.720 +30 -0.676 +31 -0.631 +32 -0.586 +33 -0.541 +34 -0.495 +35 -0.449 +36 -0.403 +37 -0.357 +38 -0.311 +39 -0.265 +40 -0.220 +41 -0.175 +42 -0.130 +43 -0.086 +44 -0.043 +45 0.000 +46 0.042 +47 0.084 +48 0.125 +49 0.165 +50 0.204 +51 0.243 +52 0.281 +53 0.318 +54 0.354 +55 0.390 +56 0.425 +57 0.460 +58 0.494 +59 0.527 +60 0.560 +61 0.592 +62 0.624 +63 0.656 +64 0.687 +65 0.718 +66 0.749 +67 0.781 +68 0.812 +69 0.844 +70 0.876 +71 0.909 +72 0.942 +73 0.976 +74 1.011 +75 1.047 +76 1.084 +77 1.123 +78 1.163 +79 1.205 +80 1.249 +81 1.295 +82 1.344 +83 1.395 +84 1.448 +85 1.505 +86 1.565 +87 1.628 +88 1.695 +89 1.766 +90 1.841 +1 -0.770 +2 -0.817 +3 -0.857 +4 -0.892 +5 -0.922 +6 -0.947 +7 -0.966 +8 -0.981 +9 -0.992 +10 -0.998 +11 -1.001 +12 -1.000 +13 -0.995 +14 -0.987 +15 -0.976 +16 -0.962 +17 -0.945 +18 -0.926 +19 -0.905 +20 -0.881 +21 -0.856 +22 -0.829 +23 -0.800 +24 -0.769 +25 -0.737 +26 -0.704 +27 -0.670 +28 -0.635 +29 -0.599 +30 -0.563 +31 -0.526 +32 -0.488 +33 -0.451 +34 -0.413 +35 -0.374 +36 -0.336 +37 -0.298 +38 -0.259 +39 -0.221 +40 -0.184 +41 -0.146 +42 -0.109 +43 -0.072 +44 -0.036 +45 0.000 +46 0.035 +47 0.070 +48 0.104 +49 0.138 +50 0.171 +51 0.203 +52 0.235 +53 0.267 +54 0.297 +55 0.327 +56 0.357 +57 0.386 +58 0.415 +59 0.443 +60 0.470 +61 0.498 +62 0.525 +63 0.552 +64 0.578 +65 0.605 +66 0.631 +67 0.658 +68 0.685 +69 0.712 +70 0.739 +71 0.767 +72 0.795 +73 0.824 +74 0.854 +75 0.884 +76 0.916 +77 0.949 +78 0.983 +79 1.019 +80 1.056 +81 1.095 +82 1.137 +83 1.180 +84 1.225 +85 1.273 +86 1.324 +87 1.377 +88 1.434 +89 1.494 +90 1.557 +1 -0.478 +2 -0.520 +3 -0.558 +4 -0.592 +5 -0.621 +6 -0.646 +7 -0.667 +8 -0.684 +9 -0.697 +10 -0.707 +11 -0.714 +12 -0.718 +13 -0.719 +14 -0.717 +15 -0.712 +16 -0.705 +17 -0.696 +18 -0.684 +19 -0.671 +20 -0.656 +21 -0.639 +22 -0.621 +23 -0.601 +24 -0.580 +25 -0.557 +26 -0.534 +27 -0.509 +28 -0.484 +29 -0.458 +30 -0.431 +31 -0.404 +32 -0.376 +33 -0.347 +34 -0.319 +35 -0.290 +36 -0.261 +37 -0.232 +38 -0.202 +39 -0.173 +40 -0.144 +41 -0.115 +42 -0.086 +43 -0.057 +44 -0.028 +45 0.000 +46 0.028 +47 0.056 +48 0.083 +49 0.110 +50 0.137 +51 0.164 +52 0.190 +53 0.216 +54 0.241 +55 0.266 +56 0.291 +57 0.316 +58 0.340 +59 0.364 +60 0.388 +61 0.412 +62 0.435 +63 0.459 +64 0.482 +65 0.506 +66 0.530 +67 0.554 +68 0.578 +69 0.602 +70 0.627 +71 0.652 +72 0.678 +73 0.705 +74 0.732 +75 0.760 +76 0.789 +77 0.819 +78 0.850 +79 0.883 +80 0.917 +81 0.953 +82 0.990 +83 1.029 +84 1.070 +85 1.113 +86 1.158 +87 1.205 +88 1.255 +89 1.308 +90 1.364 +1 -0.309 +2 -0.340 +3 -0.368 +4 -0.393 +5 -0.414 +6 -0.432 +7 -0.448 +8 -0.461 +9 -0.471 +10 -0.479 +11 -0.485 +12 -0.488 +13 -0.490 +14 -0.489 +15 -0.487 +16 -0.483 +17 -0.477 +18 -0.470 +19 -0.461 +20 -0.451 +21 -0.440 +22 -0.428 +23 -0.415 +24 -0.400 +25 -0.385 +26 -0.369 +27 -0.353 +28 -0.335 +29 -0.317 +30 -0.299 +31 -0.280 +32 -0.261 +33 -0.242 +34 -0.222 +35 -0.202 +36 -0.182 +37 -0.161 +38 -0.141 +39 -0.121 +40 -0.100 +41 -0.080 +42 -0.060 +43 -0.040 +44 -0.020 +45 0.000 +46 0.020 +47 0.039 +48 0.058 +49 0.078 +50 0.097 +51 0.115 +52 0.134 +53 0.152 +54 0.170 +55 0.188 +56 0.205 +57 0.223 +58 0.240 +59 0.258 +60 0.275 +61 0.292 +62 0.309 +63 0.326 +64 0.343 +65 0.360 +66 0.377 +67 0.394 +68 0.411 +69 0.429 +70 0.447 +71 0.465 +72 0.484 +73 0.503 +74 0.523 +75 0.543 +76 0.565 +77 0.586 +78 0.609 +79 0.633 +80 0.657 +81 0.683 +82 0.710 +83 0.738 +84 0.767 +85 0.798 +86 0.831 +87 0.865 +88 0.901 +89 0.939 +90 0.979 +1 -0.083 +2 -0.107 +3 -0.130 +4 -0.151 +5 -0.169 +6 -0.185 +7 -0.200 +8 -0.213 +9 -0.223 +10 -0.233 +11 -0.240 +12 -0.247 +13 -0.251 +14 -0.255 +15 -0.257 +16 -0.258 +17 -0.257 +18 -0.256 +19 -0.254 +20 -0.250 +21 -0.246 +22 -0.241 +23 -0.235 +24 -0.229 +25 -0.221 +26 -0.214 +27 -0.205 +28 -0.196 +29 -0.187 +30 -0.177 +31 -0.167 +32 -0.156 +33 -0.145 +34 -0.134 +35 -0.123 +36 -0.111 +37 -0.099 +38 -0.087 +39 -0.075 +40 -0.062 +41 -0.050 +42 -0.038 +43 -0.025 +44 -0.013 +45 0.000 +46 0.013 +47 0.025 +48 0.038 +49 0.050 +50 0.063 +51 0.075 +52 0.088 +53 0.100 +54 0.113 +55 0.125 +56 0.138 +57 0.150 +58 0.162 +59 0.175 +60 0.187 +61 0.200 +62 0.213 +63 0.225 +64 0.238 +65 0.251 +66 0.264 +67 0.278 +68 0.291 +69 0.305 +70 0.319 +71 0.333 +72 0.348 +73 0.363 +74 0.379 +75 0.395 +76 0.412 +77 0.429 +78 0.447 +79 0.466 +80 0.485 +81 0.505 +82 0.526 +83 0.548 +84 0.570 +85 0.594 +86 0.619 +87 0.645 +88 0.672 +89 0.701 +90 0.731 +1 0.065 +2 0.050 +3 0.036 +4 0.023 +5 0.011 +6 -0.000 +7 -0.010 +8 -0.020 +9 -0.028 +10 -0.036 +11 -0.042 +12 -0.049 +13 -0.054 +14 -0.059 +15 -0.063 +16 -0.066 +17 -0.069 +18 -0.071 +19 -0.073 +20 -0.074 +21 -0.075 +22 -0.075 +23 -0.075 +24 -0.075 +25 -0.074 +26 -0.073 +27 -0.071 +28 -0.069 +29 -0.067 +30 -0.064 +31 -0.061 +32 -0.058 +33 -0.055 +34 -0.051 +35 -0.047 +36 -0.043 +37 -0.039 +38 -0.035 +39 -0.030 +40 -0.025 +41 -0.021 +42 -0.016 +43 -0.011 +44 -0.005 +45 0.000 +46 0.005 +47 0.011 +48 0.017 +49 0.022 +50 0.028 +51 0.034 +52 0.040 +53 0.046 +54 0.052 +55 0.059 +56 0.065 +57 0.072 +58 0.078 +59 0.085 +60 0.092 +61 0.099 +62 0.106 +63 0.113 +64 0.120 +65 0.128 +66 0.135 +67 0.143 +68 0.151 +69 0.160 +70 0.168 +71 0.177 +72 0.186 +73 0.195 +74 0.204 +75 0.214 +76 0.224 +77 0.234 +78 0.245 +79 0.256 +80 0.268 +81 0.279 +82 0.292 +83 0.305 +84 0.318 +85 0.332 +86 0.346 +87 0.361 +88 0.376 +89 0.392 +90 0.409 +1 0.278 +2 0.272 +3 0.266 +4 0.259 +5 0.253 +6 0.246 +7 0.239 +8 0.232 +9 0.225 +10 0.218 +11 0.210 +12 0.203 +13 0.195 +14 0.188 +15 0.180 +16 0.172 +17 0.165 +18 0.157 +19 0.149 +20 0.142 +21 0.134 +22 0.127 +23 0.119 +24 0.112 +25 0.105 +26 0.098 +27 0.091 +28 0.084 +29 0.077 +30 0.071 +31 0.065 +32 0.059 +33 0.053 +34 0.047 +35 0.042 +36 0.036 +37 0.031 +38 0.027 +39 0.022 +40 0.018 +41 0.014 +42 0.010 +43 0.006 +44 0.003 +45 0.000 +46 -0.003 +47 -0.005 +48 -0.008 +49 -0.010 +50 -0.011 +51 -0.013 +52 -0.014 +53 -0.015 +54 -0.015 +55 -0.016 +56 -0.016 +57 -0.016 +58 -0.016 +59 -0.015 +60 -0.014 +61 -0.013 +62 -0.012 +63 -0.010 +64 -0.009 +65 -0.007 +66 -0.004 +67 -0.002 +68 0.000 +69 0.003 +70 0.006 +71 0.009 +72 0.012 +73 0.015 +74 0.019 +75 0.022 +76 0.026 +77 0.030 +78 0.034 +79 0.037 +80 0.041 +81 0.045 +82 0.049 +83 0.053 +84 0.057 +85 0.061 +86 0.065 +87 0.068 +88 0.072 +89 0.076 +90 0.079 +1 0.429 +2 0.434 +3 0.437 +4 0.439 +5 0.440 +6 0.439 +7 0.437 +8 0.434 +9 0.430 +10 0.424 +11 0.418 +12 0.411 +13 0.403 +14 0.394 +15 0.384 +16 0.374 +17 0.363 +18 0.352 +19 0.340 +20 0.328 +21 0.315 +22 0.302 +23 0.289 +24 0.275 +25 0.261 +26 0.247 +27 0.233 +28 0.219 +29 0.205 +30 0.191 +31 0.177 +32 0.163 +33 0.149 +34 0.135 +35 0.122 +36 0.108 +37 0.095 +38 0.082 +39 0.070 +40 0.057 +41 0.045 +42 0.033 +43 0.022 +44 0.011 +45 -0.000 +46 -0.010 +47 -0.020 +48 -0.030 +49 -0.039 +50 -0.048 +51 -0.057 +52 -0.065 +53 -0.073 +54 -0.080 +55 -0.087 +56 -0.094 +57 -0.100 +58 -0.106 +59 -0.111 +60 -0.117 +61 -0.122 +62 -0.127 +63 -0.131 +64 -0.135 +65 -0.139 +66 -0.143 +67 -0.147 +68 -0.150 +69 -0.154 +70 -0.157 +71 -0.160 +72 -0.164 +73 -0.167 +74 -0.170 +75 -0.174 +76 -0.177 +77 -0.181 +78 -0.185 +79 -0.190 +80 -0.195 +81 -0.200 +82 -0.205 +83 -0.211 +84 -0.218 +85 -0.225 +86 -0.233 +87 -0.241 +88 -0.251 +89 -0.261 +90 -0.272 +1 0.667 +2 0.683 +3 0.695 +4 0.705 +5 0.712 +6 0.716 +7 0.718 +8 0.717 +9 0.714 +10 0.710 +11 0.703 +12 0.694 +13 0.683 +14 0.671 +15 0.657 +16 0.642 +17 0.626 +18 0.609 +19 0.590 +20 0.571 +21 0.550 +22 0.529 +23 0.508 +24 0.485 +25 0.462 +26 0.439 +27 0.415 +28 0.391 +29 0.367 +30 0.343 +31 0.319 +32 0.294 +33 0.270 +34 0.246 +35 0.222 +36 0.198 +37 0.175 +38 0.151 +39 0.128 +40 0.106 +41 0.084 +42 0.062 +43 0.041 +44 0.020 +45 -0.000 +46 -0.020 +47 -0.039 +48 -0.057 +49 -0.075 +50 -0.093 +51 -0.110 +52 -0.126 +53 -0.141 +54 -0.157 +55 -0.171 +56 -0.185 +57 -0.199 +58 -0.212 +59 -0.224 +60 -0.236 +61 -0.248 +62 -0.259 +63 -0.270 +64 -0.281 +65 -0.291 +66 -0.301 +67 -0.311 +68 -0.321 +69 -0.330 +70 -0.340 +71 -0.350 +72 -0.360 +73 -0.370 +74 -0.380 +75 -0.390 +76 -0.401 +77 -0.413 +78 -0.425 +79 -0.437 +80 -0.451 +81 -0.465 +82 -0.480 +83 -0.496 +84 -0.514 +85 -0.532 +86 -0.552 +87 -0.573 +88 -0.596 +89 -0.621 +90 -0.647 +1 0.795 +2 0.820 +3 0.840 +4 0.856 +5 0.869 +6 0.878 +7 0.884 +8 0.886 +9 0.886 +10 0.882 +11 0.876 +12 0.867 +13 0.856 +14 0.843 +15 0.828 +16 0.811 +17 0.792 +18 0.771 +19 0.749 +20 0.726 +21 0.701 +22 0.675 +23 0.649 +24 0.621 +25 0.593 +26 0.564 +27 0.534 +28 0.504 +29 0.474 +30 0.443 +31 0.412 +32 0.381 +33 0.350 +34 0.319 +35 0.289 +36 0.258 +37 0.228 +38 0.198 +39 0.168 +40 0.139 +41 0.110 +42 0.082 +43 0.054 +44 0.027 +45 -0.000 +46 -0.026 +47 -0.051 +48 -0.076 +49 -0.100 +50 -0.124 +51 -0.146 +52 -0.169 +53 -0.190 +54 -0.211 +55 -0.231 +56 -0.250 +57 -0.269 +58 -0.288 +59 -0.306 +60 -0.323 +61 -0.340 +62 -0.356 +63 -0.372 +64 -0.388 +65 -0.403 +66 -0.418 +67 -0.433 +68 -0.448 +69 -0.463 +70 -0.478 +71 -0.493 +72 -0.508 +73 -0.524 +74 -0.540 +75 -0.557 +76 -0.574 +77 -0.592 +78 -0.610 +79 -0.630 +80 -0.650 +81 -0.672 +82 -0.695 +83 -0.720 +84 -0.746 +85 -0.773 +86 -0.803 +87 -0.834 +88 -0.868 +89 -0.904 +90 -0.942 +1 0.997 +2 1.031 +3 1.060 +4 1.083 +5 1.101 +6 1.114 +7 1.124 +8 1.128 +9 1.129 +10 1.126 +11 1.120 +12 1.110 +13 1.097 +14 1.081 +15 1.062 +16 1.041 +17 1.018 +18 0.992 +19 0.964 +20 0.935 +21 0.904 +22 0.871 +23 0.837 +24 0.802 +25 0.766 +26 0.729 +27 0.691 +28 0.652 +29 0.613 +30 0.574 +31 0.534 +32 0.495 +33 0.455 +34 0.415 +35 0.375 +36 0.335 +37 0.296 +38 0.257 +39 0.219 +40 0.181 +41 0.143 +42 0.107 +43 0.070 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.067 +48 -0.100 +49 -0.131 +50 -0.162 +51 -0.192 +52 -0.221 +53 -0.250 +54 -0.277 +55 -0.304 +56 -0.330 +57 -0.355 +58 -0.379 +59 -0.403 +60 -0.426 +61 -0.449 +62 -0.471 +63 -0.493 +64 -0.514 +65 -0.535 +66 -0.555 +67 -0.576 +68 -0.596 +69 -0.617 +70 -0.637 +71 -0.658 +72 -0.679 +73 -0.700 +74 -0.722 +75 -0.745 +76 -0.768 +77 -0.793 +78 -0.818 +79 -0.845 +80 -0.873 +81 -0.903 +82 -0.935 +83 -0.968 +84 -1.003 +85 -1.041 +86 -1.081 +87 -1.124 +88 -1.169 +89 -1.217 +90 -1.269 +1 1.000 +2 1.039 +3 1.073 +4 1.101 +5 1.123 +6 1.140 +7 1.153 +8 1.161 +9 1.164 +10 1.163 +11 1.159 +12 1.151 +13 1.139 +14 1.124 +15 1.106 +16 1.086 +17 1.063 +18 1.037 +19 1.009 +20 0.979 +21 0.948 +22 0.914 +23 0.880 +24 0.844 +25 0.806 +26 0.768 +27 0.729 +28 0.689 +29 0.648 +30 0.607 +31 0.566 +32 0.524 +33 0.482 +34 0.440 +35 0.398 +36 0.357 +37 0.315 +38 0.274 +39 0.233 +40 0.193 +41 0.153 +42 0.114 +43 0.075 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.107 +49 -0.141 +50 -0.175 +51 -0.207 +52 -0.239 +53 -0.269 +54 -0.299 +55 -0.329 +56 -0.357 +57 -0.385 +58 -0.412 +59 -0.438 +60 -0.464 +61 -0.489 +62 -0.514 +63 -0.538 +64 -0.562 +65 -0.586 +66 -0.609 +67 -0.633 +68 -0.656 +69 -0.679 +70 -0.703 +71 -0.727 +72 -0.751 +73 -0.776 +74 -0.801 +75 -0.828 +76 -0.855 +77 -0.883 +78 -0.913 +79 -0.944 +80 -0.976 +81 -1.010 +82 -1.046 +83 -1.084 +84 -1.125 +85 -1.168 +86 -1.213 +87 -1.262 +88 -1.313 +89 -1.368 +90 -1.426 +1 1.226 +2 1.276 +3 1.320 +4 1.356 +5 1.385 +6 1.408 +7 1.425 +8 1.435 +9 1.441 +10 1.441 +11 1.436 +12 1.427 +13 1.413 +14 1.396 +15 1.374 +16 1.349 +17 1.321 +18 1.290 +19 1.256 +20 1.219 +21 1.180 +22 1.139 +23 1.096 +24 1.051 +25 1.005 +26 0.958 +27 0.909 +28 0.860 +29 0.809 +30 0.758 +31 0.706 +32 0.655 +33 0.602 +34 0.550 +35 0.498 +36 0.446 +37 0.394 +38 0.343 +39 0.292 +40 0.241 +41 0.192 +42 0.143 +43 0.094 +44 0.047 +45 -0.000 +46 -0.046 +47 -0.091 +48 -0.134 +49 -0.177 +50 -0.219 +51 -0.260 +52 -0.300 +53 -0.339 +54 -0.377 +55 -0.413 +56 -0.449 +57 -0.485 +58 -0.519 +59 -0.552 +60 -0.585 +61 -0.617 +62 -0.648 +63 -0.679 +64 -0.710 +65 -0.740 +66 -0.770 +67 -0.799 +68 -0.829 +69 -0.859 +70 -0.889 +71 -0.919 +72 -0.951 +73 -0.982 +74 -1.015 +75 -1.048 +76 -1.083 +77 -1.119 +78 -1.157 +79 -1.196 +80 -1.238 +81 -1.281 +82 -1.327 +83 -1.376 +84 -1.427 +85 -1.481 +86 -1.539 +87 -1.601 +88 -1.666 +89 -1.735 +90 -1.809 +1 1.053 +2 1.106 +3 1.152 +4 1.191 +5 1.223 +6 1.249 +7 1.269 +8 1.284 +9 1.293 +10 1.297 +11 1.297 +12 1.292 +13 1.283 +14 1.269 +15 1.253 +16 1.232 +17 1.209 +18 1.182 +19 1.153 +20 1.121 +21 1.087 +22 1.050 +23 1.012 +24 0.972 +25 0.931 +26 0.888 +27 0.844 +28 0.799 +29 0.753 +30 0.706 +31 0.659 +32 0.611 +33 0.563 +34 0.515 +35 0.466 +36 0.418 +37 0.370 +38 0.322 +39 0.275 +40 0.227 +41 0.181 +42 0.135 +43 0.089 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.086 +48 -0.128 +49 -0.169 +50 -0.209 +51 -0.248 +52 -0.287 +53 -0.324 +54 -0.361 +55 -0.397 +56 -0.432 +57 -0.467 +58 -0.501 +59 -0.534 +60 -0.566 +61 -0.598 +62 -0.630 +63 -0.661 +64 -0.692 +65 -0.722 +66 -0.753 +67 -0.783 +68 -0.814 +69 -0.845 +70 -0.876 +71 -0.908 +72 -0.940 +73 -0.973 +74 -1.007 +75 -1.042 +76 -1.078 +77 -1.116 +78 -1.155 +79 -1.196 +80 -1.239 +81 -1.284 +82 -1.331 +83 -1.382 +84 -1.434 +85 -1.490 +86 -1.550 +87 -1.612 +88 -1.679 +89 -1.749 +90 -1.824 +1 1.135 +2 1.195 +3 1.247 +4 1.291 +5 1.328 +6 1.358 +7 1.381 +8 1.399 +9 1.410 +10 1.416 +11 1.416 +12 1.412 +13 1.402 +14 1.389 +15 1.371 +16 1.349 +17 1.324 +18 1.296 +19 1.264 +20 1.229 +21 1.192 +22 1.153 +23 1.111 +24 1.068 +25 1.023 +26 0.976 +27 0.928 +28 0.878 +29 0.828 +30 0.777 +31 0.725 +32 0.673 +33 0.620 +34 0.567 +35 0.514 +36 0.461 +37 0.408 +38 0.355 +39 0.303 +40 0.251 +41 0.200 +42 0.149 +43 0.098 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.095 +48 -0.142 +49 -0.187 +50 -0.231 +51 -0.275 +52 -0.318 +53 -0.360 +54 -0.401 +55 -0.441 +56 -0.480 +57 -0.518 +58 -0.556 +59 -0.593 +60 -0.630 +61 -0.665 +62 -0.701 +63 -0.736 +64 -0.770 +65 -0.805 +66 -0.839 +67 -0.874 +68 -0.908 +69 -0.943 +70 -0.978 +71 -1.014 +72 -1.050 +73 -1.087 +74 -1.126 +75 -1.165 +76 -1.206 +77 -1.249 +78 -1.293 +79 -1.339 +80 -1.388 +81 -1.438 +82 -1.492 +83 -1.548 +84 -1.608 +85 -1.671 +86 -1.737 +87 -1.808 +88 -1.882 +89 -1.961 +90 -2.045 +1 0.703 +2 0.756 +3 0.802 +4 0.842 +5 0.877 +6 0.906 +7 0.930 +8 0.950 +9 0.964 +10 0.974 +11 0.980 +12 0.982 +13 0.980 +14 0.975 +15 0.967 +16 0.955 +17 0.941 +18 0.923 +19 0.904 +20 0.882 +21 0.858 +22 0.832 +23 0.804 +24 0.774 +25 0.743 +26 0.711 +27 0.677 +28 0.643 +29 0.607 +30 0.571 +31 0.534 +32 0.497 +33 0.459 +34 0.420 +35 0.382 +36 0.343 +37 0.304 +38 0.265 +39 0.227 +40 0.188 +41 0.150 +42 0.112 +43 0.074 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.108 +49 -0.143 +50 -0.177 +51 -0.211 +52 -0.245 +53 -0.278 +54 -0.310 +55 -0.342 +56 -0.373 +57 -0.404 +58 -0.435 +59 -0.465 +60 -0.495 +61 -0.525 +62 -0.554 +63 -0.583 +64 -0.613 +65 -0.642 +66 -0.671 +67 -0.701 +68 -0.730 +69 -0.760 +70 -0.791 +71 -0.822 +72 -0.854 +73 -0.887 +74 -0.920 +75 -0.955 +76 -0.991 +77 -1.028 +78 -1.067 +79 -1.107 +80 -1.149 +81 -1.194 +82 -1.240 +83 -1.289 +84 -1.340 +85 -1.394 +86 -1.451 +87 -1.511 +88 -1.574 +89 -1.641 +90 -1.712 +1 0.622 +2 0.679 +3 0.729 +4 0.773 +5 0.812 +6 0.845 +7 0.873 +8 0.895 +9 0.913 +10 0.927 +11 0.936 +12 0.941 +13 0.942 +14 0.940 +15 0.934 +16 0.925 +17 0.913 +18 0.898 +19 0.880 +20 0.860 +21 0.838 +22 0.814 +23 0.788 +24 0.760 +25 0.731 +26 0.700 +27 0.668 +28 0.634 +29 0.600 +30 0.565 +31 0.529 +32 0.492 +33 0.455 +34 0.418 +35 0.380 +36 0.342 +37 0.303 +38 0.265 +39 0.227 +40 0.188 +41 0.150 +42 0.112 +43 0.075 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.109 +49 -0.145 +50 -0.180 +51 -0.214 +52 -0.248 +53 -0.282 +54 -0.315 +55 -0.348 +56 -0.381 +57 -0.413 +58 -0.445 +59 -0.476 +60 -0.508 +61 -0.539 +62 -0.570 +63 -0.601 +64 -0.632 +65 -0.663 +66 -0.694 +67 -0.725 +68 -0.757 +69 -0.789 +70 -0.822 +71 -0.855 +72 -0.890 +73 -0.925 +74 -0.961 +75 -0.998 +76 -1.037 +77 -1.077 +78 -1.119 +79 -1.162 +80 -1.208 +81 -1.255 +82 -1.305 +83 -1.357 +84 -1.412 +85 -1.469 +86 -1.530 +87 -1.594 +88 -1.661 +89 -1.732 +90 -1.807 +1 0.083 +2 0.128 +3 0.169 +4 0.206 +5 0.240 +6 0.270 +7 0.297 +8 0.321 +9 0.341 +10 0.359 +11 0.374 +12 0.386 +13 0.396 +14 0.404 +15 0.409 +16 0.412 +17 0.413 +18 0.412 +19 0.410 +20 0.405 +21 0.400 +22 0.392 +23 0.384 +24 0.374 +25 0.363 +26 0.350 +27 0.337 +28 0.323 +29 0.308 +30 0.292 +31 0.275 +32 0.258 +33 0.240 +34 0.222 +35 0.203 +36 0.184 +37 0.165 +38 0.145 +39 0.125 +40 0.104 +41 0.084 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.064 +49 -0.085 +50 -0.106 +51 -0.127 +52 -0.149 +53 -0.170 +54 -0.191 +55 -0.213 +56 -0.234 +57 -0.255 +58 -0.277 +59 -0.299 +60 -0.320 +61 -0.342 +62 -0.364 +63 -0.387 +64 -0.410 +65 -0.433 +66 -0.456 +67 -0.480 +68 -0.504 +69 -0.529 +70 -0.554 +71 -0.580 +72 -0.607 +73 -0.634 +74 -0.663 +75 -0.692 +76 -0.722 +77 -0.754 +78 -0.786 +79 -0.820 +80 -0.855 +81 -0.892 +82 -0.931 +83 -0.971 +84 -1.012 +85 -1.056 +86 -1.102 +87 -1.150 +88 -1.200 +89 -1.252 +90 -1.307 +1 0.038 +2 0.079 +3 0.117 +4 0.152 +5 0.183 +6 0.211 +7 0.236 +8 0.259 +9 0.278 +10 0.295 +11 0.310 +12 0.322 +13 0.332 +14 0.339 +15 0.345 +16 0.349 +17 0.351 +18 0.351 +19 0.350 +20 0.347 +21 0.343 +22 0.337 +23 0.330 +24 0.322 +25 0.313 +26 0.303 +27 0.292 +28 0.280 +29 0.267 +30 0.254 +31 0.240 +32 0.225 +33 0.210 +34 0.194 +35 0.178 +36 0.161 +37 0.144 +38 0.127 +39 0.109 +40 0.092 +41 0.074 +42 0.055 +43 0.037 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.056 +49 -0.075 +50 -0.094 +51 -0.113 +52 -0.132 +53 -0.151 +54 -0.170 +55 -0.189 +56 -0.209 +57 -0.228 +58 -0.248 +59 -0.267 +60 -0.287 +61 -0.307 +62 -0.327 +63 -0.347 +64 -0.368 +65 -0.389 +66 -0.410 +67 -0.432 +68 -0.454 +69 -0.477 +70 -0.500 +71 -0.524 +72 -0.548 +73 -0.574 +74 -0.600 +75 -0.626 +76 -0.654 +77 -0.683 +78 -0.713 +79 -0.744 +80 -0.777 +81 -0.810 +82 -0.845 +83 -0.882 +84 -0.920 +85 -0.960 +86 -1.002 +87 -1.045 +88 -1.091 +89 -1.139 +90 -1.189 +1 -0.474 +2 -0.452 +3 -0.430 +4 -0.409 +5 -0.389 +6 -0.369 +7 -0.350 +8 -0.331 +9 -0.313 +10 -0.295 +11 -0.278 +12 -0.262 +13 -0.246 +14 -0.230 +15 -0.215 +16 -0.201 +17 -0.187 +18 -0.173 +19 -0.160 +20 -0.148 +21 -0.136 +22 -0.125 +23 -0.114 +24 -0.104 +25 -0.094 +26 -0.084 +27 -0.076 +28 -0.067 +29 -0.059 +30 -0.052 +31 -0.045 +32 -0.039 +33 -0.033 +34 -0.027 +35 -0.023 +36 -0.018 +37 -0.014 +38 -0.011 +39 -0.008 +40 -0.005 +41 -0.003 +42 -0.002 +43 -0.001 +44 -0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.003 +49 -0.004 +50 -0.007 +51 -0.009 +52 -0.013 +53 -0.016 +54 -0.020 +55 -0.025 +56 -0.030 +57 -0.036 +58 -0.042 +59 -0.048 +60 -0.055 +61 -0.063 +62 -0.071 +63 -0.079 +64 -0.088 +65 -0.097 +66 -0.107 +67 -0.117 +68 -0.128 +69 -0.139 +70 -0.151 +71 -0.163 +72 -0.176 +73 -0.189 +74 -0.203 +75 -0.217 +76 -0.231 +77 -0.247 +78 -0.262 +79 -0.278 +80 -0.295 +81 -0.312 +82 -0.329 +83 -0.348 +84 -0.366 +85 -0.385 +86 -0.405 +87 -0.425 +88 -0.445 +89 -0.466 +90 -0.488 +1 -0.188 +2 -0.160 +3 -0.134 +4 -0.110 +5 -0.087 +6 -0.066 +7 -0.046 +8 -0.028 +9 -0.012 +10 0.004 +11 0.017 +12 0.030 +13 0.041 +14 0.052 +15 0.061 +16 0.069 +17 0.076 +18 0.082 +19 0.087 +20 0.091 +21 0.094 +22 0.096 +23 0.098 +24 0.099 +25 0.099 +26 0.099 +27 0.098 +28 0.096 +29 0.094 +30 0.091 +31 0.088 +32 0.084 +33 0.080 +34 0.075 +35 0.070 +36 0.064 +37 0.058 +38 0.052 +39 0.046 +40 0.039 +41 0.032 +42 0.024 +43 0.016 +44 0.008 +45 -0.000 +46 -0.009 +47 -0.017 +48 -0.026 +49 -0.036 +50 -0.045 +51 -0.055 +52 -0.065 +53 -0.075 +54 -0.085 +55 -0.096 +56 -0.107 +57 -0.118 +58 -0.129 +59 -0.141 +60 -0.153 +61 -0.165 +62 -0.178 +63 -0.191 +64 -0.204 +65 -0.217 +66 -0.231 +67 -0.246 +68 -0.260 +69 -0.275 +70 -0.291 +71 -0.307 +72 -0.324 +73 -0.341 +74 -0.358 +75 -0.377 +76 -0.396 +77 -0.415 +78 -0.436 +79 -0.457 +80 -0.478 +81 -0.501 +82 -0.524 +83 -0.549 +84 -0.574 +85 -0.600 +86 -0.628 +87 -0.656 +88 -0.685 +89 -0.716 +90 -0.748 +1 -0.280 +2 -0.254 +3 -0.229 +4 -0.206 +5 -0.184 +6 -0.163 +7 -0.144 +8 -0.126 +9 -0.109 +10 -0.093 +11 -0.078 +12 -0.064 +13 -0.051 +14 -0.039 +15 -0.028 +16 -0.018 +17 -0.009 +18 -0.000 +19 0.007 +20 0.014 +21 0.020 +22 0.025 +23 0.030 +24 0.034 +25 0.037 +26 0.040 +27 0.042 +28 0.044 +29 0.045 +30 0.045 +31 0.045 +32 0.044 +33 0.043 +34 0.042 +35 0.040 +36 0.038 +37 0.035 +38 0.032 +39 0.028 +40 0.025 +41 0.020 +42 0.016 +43 0.011 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.019 +49 -0.026 +50 -0.033 +51 -0.040 +52 -0.048 +53 -0.056 +54 -0.064 +55 -0.073 +56 -0.082 +57 -0.092 +58 -0.101 +59 -0.111 +60 -0.122 +61 -0.132 +62 -0.143 +63 -0.155 +64 -0.167 +65 -0.179 +66 -0.191 +67 -0.204 +68 -0.218 +69 -0.232 +70 -0.246 +71 -0.261 +72 -0.276 +73 -0.292 +74 -0.308 +75 -0.325 +76 -0.343 +77 -0.361 +78 -0.380 +79 -0.399 +80 -0.419 +81 -0.440 +82 -0.461 +83 -0.483 +84 -0.507 +85 -0.530 +86 -0.555 +87 -0.581 +88 -0.607 +89 -0.635 +90 -0.663 +1 0.128 +2 0.160 +3 0.189 +4 0.215 +5 0.238 +6 0.259 +7 0.277 +8 0.293 +9 0.306 +10 0.318 +11 0.327 +12 0.335 +13 0.340 +14 0.344 +15 0.346 +16 0.346 +17 0.345 +18 0.343 +19 0.339 +20 0.335 +21 0.328 +22 0.321 +23 0.313 +24 0.304 +25 0.294 +26 0.283 +27 0.272 +28 0.260 +29 0.247 +30 0.234 +31 0.220 +32 0.206 +33 0.191 +34 0.177 +35 0.161 +36 0.146 +37 0.130 +38 0.114 +39 0.098 +40 0.082 +41 0.066 +42 0.049 +43 0.033 +44 0.016 +45 -0.000 +46 -0.016 +47 -0.033 +48 -0.049 +49 -0.066 +50 -0.082 +51 -0.098 +52 -0.114 +53 -0.130 +54 -0.147 +55 -0.163 +56 -0.179 +57 -0.195 +58 -0.211 +59 -0.227 +60 -0.243 +61 -0.259 +62 -0.275 +63 -0.292 +64 -0.308 +65 -0.325 +66 -0.342 +67 -0.359 +68 -0.377 +69 -0.395 +70 -0.413 +71 -0.432 +72 -0.451 +73 -0.471 +74 -0.491 +75 -0.512 +76 -0.534 +77 -0.556 +78 -0.580 +79 -0.604 +80 -0.629 +81 -0.655 +82 -0.683 +83 -0.712 +84 -0.742 +85 -0.773 +86 -0.806 +87 -0.840 +88 -0.876 +89 -0.914 +90 -0.954 +1 0.240 +2 0.273 +3 0.302 +4 0.329 +5 0.352 +6 0.372 +7 0.390 +8 0.405 +9 0.417 +10 0.427 +11 0.434 +12 0.440 +13 0.443 +14 0.444 +15 0.444 +16 0.442 +17 0.438 +18 0.432 +19 0.426 +20 0.418 +21 0.408 +22 0.398 +23 0.386 +24 0.374 +25 0.360 +26 0.346 +27 0.331 +28 0.315 +29 0.299 +30 0.282 +31 0.265 +32 0.247 +33 0.229 +34 0.210 +35 0.192 +36 0.173 +37 0.154 +38 0.135 +39 0.115 +40 0.096 +41 0.077 +42 0.058 +43 0.038 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.057 +49 -0.075 +50 -0.094 +51 -0.112 +52 -0.130 +53 -0.148 +54 -0.166 +55 -0.184 +56 -0.202 +57 -0.219 +58 -0.237 +59 -0.254 +60 -0.271 +61 -0.289 +62 -0.306 +63 -0.323 +64 -0.341 +65 -0.358 +66 -0.376 +67 -0.394 +68 -0.413 +69 -0.431 +70 -0.450 +71 -0.469 +72 -0.489 +73 -0.510 +74 -0.531 +75 -0.552 +76 -0.575 +77 -0.598 +78 -0.622 +79 -0.647 +80 -0.673 +81 -0.700 +82 -0.729 +83 -0.759 +84 -0.790 +85 -0.823 +86 -0.858 +87 -0.894 +88 -0.932 +89 -0.972 +90 -1.014 +1 0.681 +2 0.724 +3 0.762 +4 0.794 +5 0.822 +6 0.845 +7 0.864 +8 0.878 +9 0.888 +10 0.895 +11 0.898 +12 0.898 +13 0.894 +14 0.887 +15 0.878 +16 0.866 +17 0.851 +18 0.835 +19 0.816 +20 0.795 +21 0.772 +22 0.747 +23 0.722 +24 0.694 +25 0.666 +26 0.636 +27 0.606 +28 0.574 +29 0.542 +30 0.509 +31 0.476 +32 0.442 +33 0.408 +34 0.373 +35 0.339 +36 0.304 +37 0.270 +38 0.235 +39 0.201 +40 0.166 +41 0.132 +42 0.099 +43 0.065 +44 0.033 +45 -0.000 +46 -0.032 +47 -0.064 +48 -0.095 +49 -0.125 +50 -0.155 +51 -0.185 +52 -0.214 +53 -0.242 +54 -0.270 +55 -0.298 +56 -0.325 +57 -0.351 +58 -0.377 +59 -0.403 +60 -0.429 +61 -0.454 +62 -0.478 +63 -0.503 +64 -0.528 +65 -0.552 +66 -0.577 +67 -0.601 +68 -0.626 +69 -0.651 +70 -0.676 +71 -0.702 +72 -0.728 +73 -0.755 +74 -0.782 +75 -0.811 +76 -0.840 +77 -0.871 +78 -0.903 +79 -0.936 +80 -0.971 +81 -1.007 +82 -1.045 +83 -1.085 +84 -1.128 +85 -1.172 +86 -1.219 +87 -1.269 +88 -1.322 +89 -1.377 +90 -1.436 +1 0.629 +2 0.668 +3 0.702 +4 0.731 +5 0.756 +6 0.777 +7 0.793 +8 0.806 +9 0.815 +10 0.821 +11 0.823 +12 0.823 +13 0.819 +14 0.813 +15 0.804 +16 0.793 +17 0.779 +18 0.764 +19 0.746 +20 0.727 +21 0.706 +22 0.684 +23 0.660 +24 0.635 +25 0.609 +26 0.581 +27 0.553 +28 0.525 +29 0.495 +30 0.465 +31 0.434 +32 0.404 +33 0.372 +34 0.341 +35 0.309 +36 0.278 +37 0.246 +38 0.215 +39 0.183 +40 0.152 +41 0.121 +42 0.090 +43 0.060 +44 0.030 +45 -0.000 +46 -0.029 +47 -0.058 +48 -0.086 +49 -0.114 +50 -0.142 +51 -0.169 +52 -0.195 +53 -0.221 +54 -0.246 +55 -0.271 +56 -0.296 +57 -0.320 +58 -0.344 +59 -0.367 +60 -0.390 +61 -0.413 +62 -0.436 +63 -0.458 +64 -0.480 +65 -0.503 +66 -0.525 +67 -0.547 +68 -0.569 +69 -0.592 +70 -0.615 +71 -0.638 +72 -0.662 +73 -0.686 +74 -0.711 +75 -0.737 +76 -0.764 +77 -0.792 +78 -0.821 +79 -0.851 +80 -0.882 +81 -0.915 +82 -0.950 +83 -0.986 +84 -1.024 +85 -1.065 +86 -1.108 +87 -1.153 +88 -1.200 +89 -1.251 +90 -1.304 +1 0.935 +2 0.982 +3 1.023 +4 1.057 +5 1.086 +6 1.109 +7 1.127 +8 1.140 +9 1.149 +10 1.152 +11 1.152 +12 1.148 +13 1.140 +14 1.128 +15 1.113 +16 1.095 +17 1.074 +18 1.050 +19 1.025 +20 0.996 +21 0.966 +22 0.934 +23 0.900 +24 0.864 +25 0.828 +26 0.789 +27 0.750 +28 0.710 +29 0.669 +30 0.628 +31 0.586 +32 0.544 +33 0.501 +34 0.458 +35 0.415 +36 0.372 +37 0.329 +38 0.287 +39 0.244 +40 0.202 +41 0.161 +42 0.120 +43 0.079 +44 0.039 +45 -0.000 +46 -0.039 +47 -0.077 +48 -0.114 +49 -0.150 +50 -0.186 +51 -0.221 +52 -0.256 +53 -0.289 +54 -0.322 +55 -0.354 +56 -0.385 +57 -0.416 +58 -0.446 +59 -0.476 +60 -0.505 +61 -0.533 +62 -0.562 +63 -0.589 +64 -0.617 +65 -0.644 +66 -0.671 +67 -0.699 +68 -0.726 +69 -0.753 +70 -0.781 +71 -0.809 +72 -0.838 +73 -0.867 +74 -0.897 +75 -0.928 +76 -0.960 +77 -0.994 +78 -1.028 +79 -1.065 +80 -1.103 +81 -1.143 +82 -1.185 +83 -1.229 +84 -1.275 +85 -1.325 +86 -1.377 +87 -1.432 +88 -1.491 +89 -1.553 +90 -1.619 +1 0.779 +2 0.819 +3 0.854 +4 0.884 +5 0.909 +6 0.929 +7 0.945 +8 0.956 +9 0.964 +10 0.967 +11 0.968 +12 0.964 +13 0.958 +14 0.948 +15 0.936 +16 0.921 +17 0.904 +18 0.884 +19 0.863 +20 0.839 +21 0.814 +22 0.787 +23 0.758 +24 0.729 +25 0.698 +26 0.666 +27 0.633 +28 0.599 +29 0.565 +30 0.530 +31 0.495 +32 0.459 +33 0.423 +34 0.387 +35 0.351 +36 0.314 +37 0.278 +38 0.242 +39 0.207 +40 0.171 +41 0.136 +42 0.101 +43 0.067 +44 0.033 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.097 +49 -0.128 +50 -0.158 +51 -0.188 +52 -0.217 +53 -0.245 +54 -0.273 +55 -0.301 +56 -0.327 +57 -0.353 +58 -0.379 +59 -0.404 +60 -0.429 +61 -0.454 +62 -0.478 +63 -0.501 +64 -0.525 +65 -0.548 +66 -0.572 +67 -0.595 +68 -0.619 +69 -0.642 +70 -0.666 +71 -0.690 +72 -0.715 +73 -0.740 +74 -0.766 +75 -0.793 +76 -0.820 +77 -0.849 +78 -0.879 +79 -0.910 +80 -0.943 +81 -0.977 +82 -1.013 +83 -1.051 +84 -1.091 +85 -1.134 +86 -1.179 +87 -1.226 +88 -1.276 +89 -1.330 +90 -1.386 +1 0.914 +2 0.957 +3 0.995 +4 1.027 +5 1.053 +6 1.074 +7 1.090 +8 1.102 +9 1.109 +10 1.111 +11 1.110 +12 1.105 +13 1.096 +14 1.084 +15 1.069 +16 1.052 +17 1.031 +18 1.008 +19 0.983 +20 0.955 +21 0.926 +22 0.894 +23 0.862 +24 0.827 +25 0.792 +26 0.755 +27 0.718 +28 0.679 +29 0.640 +30 0.600 +31 0.560 +32 0.519 +33 0.478 +34 0.437 +35 0.396 +36 0.355 +37 0.314 +38 0.273 +39 0.233 +40 0.193 +41 0.153 +42 0.114 +43 0.075 +44 0.037 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.108 +49 -0.143 +50 -0.177 +51 -0.210 +52 -0.243 +53 -0.274 +54 -0.305 +55 -0.336 +56 -0.365 +57 -0.394 +58 -0.423 +59 -0.451 +60 -0.478 +61 -0.505 +62 -0.531 +63 -0.557 +64 -0.583 +65 -0.608 +66 -0.634 +67 -0.659 +68 -0.685 +69 -0.710 +70 -0.736 +71 -0.762 +72 -0.789 +73 -0.816 +74 -0.844 +75 -0.873 +76 -0.903 +77 -0.934 +78 -0.966 +79 -1.000 +80 -1.035 +81 -1.072 +82 -1.111 +83 -1.152 +84 -1.196 +85 -1.242 +86 -1.290 +87 -1.342 +88 -1.396 +89 -1.454 +90 -1.516 +1 0.752 +2 0.788 +3 0.819 +4 0.845 +5 0.867 +6 0.885 +7 0.898 +8 0.907 +9 0.913 +10 0.916 +11 0.915 +12 0.911 +13 0.904 +14 0.894 +15 0.882 +16 0.867 +17 0.850 +18 0.831 +19 0.810 +20 0.788 +21 0.763 +22 0.738 +23 0.711 +24 0.682 +25 0.653 +26 0.623 +27 0.592 +28 0.560 +29 0.528 +30 0.495 +31 0.462 +32 0.428 +33 0.395 +34 0.361 +35 0.327 +36 0.293 +37 0.259 +38 0.226 +39 0.192 +40 0.159 +41 0.127 +42 0.094 +43 0.062 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.118 +50 -0.146 +51 -0.174 +52 -0.200 +53 -0.227 +54 -0.252 +55 -0.277 +56 -0.302 +57 -0.326 +58 -0.349 +59 -0.372 +60 -0.395 +61 -0.417 +62 -0.439 +63 -0.461 +64 -0.482 +65 -0.503 +66 -0.524 +67 -0.545 +68 -0.566 +69 -0.588 +70 -0.609 +71 -0.631 +72 -0.653 +73 -0.675 +74 -0.699 +75 -0.723 +76 -0.747 +77 -0.773 +78 -0.800 +79 -0.828 +80 -0.857 +81 -0.888 +82 -0.920 +83 -0.954 +84 -0.990 +85 -1.029 +86 -1.069 +87 -1.112 +88 -1.157 +89 -1.205 +90 -1.256 +1 0.857 +2 0.898 +3 0.933 +4 0.962 +5 0.987 +6 1.007 +7 1.022 +8 1.032 +9 1.039 +10 1.041 +11 1.040 +12 1.035 +13 1.027 +14 1.016 +15 1.002 +16 0.985 +17 0.966 +18 0.944 +19 0.920 +20 0.895 +21 0.867 +22 0.838 +23 0.807 +24 0.775 +25 0.742 +26 0.707 +27 0.672 +28 0.636 +29 0.599 +30 0.562 +31 0.524 +32 0.486 +33 0.448 +34 0.409 +35 0.371 +36 0.332 +37 0.294 +38 0.256 +39 0.218 +40 0.181 +41 0.144 +42 0.107 +43 0.071 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.068 +48 -0.101 +49 -0.134 +50 -0.166 +51 -0.197 +52 -0.227 +53 -0.257 +54 -0.286 +55 -0.314 +56 -0.342 +57 -0.369 +58 -0.396 +59 -0.422 +60 -0.448 +61 -0.473 +62 -0.497 +63 -0.522 +64 -0.546 +65 -0.570 +66 -0.593 +67 -0.617 +68 -0.641 +69 -0.665 +70 -0.689 +71 -0.713 +72 -0.738 +73 -0.764 +74 -0.790 +75 -0.817 +76 -0.845 +77 -0.874 +78 -0.904 +79 -0.935 +80 -0.968 +81 -1.003 +82 -1.039 +83 -1.078 +84 -1.118 +85 -1.161 +86 -1.206 +87 -1.255 +88 -1.306 +89 -1.360 +90 -1.417 +1 0.430 +2 0.450 +3 0.467 +4 0.482 +5 0.494 +6 0.504 +7 0.511 +8 0.516 +9 0.519 +10 0.520 +11 0.519 +12 0.517 +13 0.513 +14 0.507 +15 0.500 +16 0.492 +17 0.482 +18 0.471 +19 0.459 +20 0.446 +21 0.432 +22 0.418 +23 0.402 +24 0.386 +25 0.370 +26 0.353 +27 0.335 +28 0.317 +29 0.299 +30 0.280 +31 0.261 +32 0.242 +33 0.223 +34 0.204 +35 0.185 +36 0.166 +37 0.146 +38 0.127 +39 0.109 +40 0.090 +41 0.071 +42 0.053 +43 0.035 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.067 +50 -0.082 +51 -0.098 +52 -0.113 +53 -0.128 +54 -0.142 +55 -0.156 +56 -0.170 +57 -0.183 +58 -0.197 +59 -0.210 +60 -0.222 +61 -0.235 +62 -0.247 +63 -0.259 +64 -0.271 +65 -0.282 +66 -0.294 +67 -0.306 +68 -0.317 +69 -0.329 +70 -0.341 +71 -0.353 +72 -0.365 +73 -0.378 +74 -0.390 +75 -0.404 +76 -0.417 +77 -0.431 +78 -0.446 +79 -0.461 +80 -0.477 +81 -0.494 +82 -0.512 +83 -0.531 +84 -0.550 +85 -0.571 +86 -0.593 +87 -0.617 +88 -0.642 +89 -0.668 +90 -0.696 +1 0.365 +2 0.388 +3 0.408 +4 0.425 +5 0.439 +6 0.451 +7 0.461 +8 0.468 +9 0.473 +10 0.476 +11 0.478 +12 0.477 +13 0.475 +14 0.472 +15 0.467 +16 0.460 +17 0.452 +18 0.443 +19 0.433 +20 0.422 +21 0.410 +22 0.397 +23 0.383 +24 0.368 +25 0.353 +26 0.338 +27 0.321 +28 0.305 +29 0.287 +30 0.270 +31 0.252 +32 0.234 +33 0.216 +34 0.198 +35 0.180 +36 0.161 +37 0.143 +38 0.125 +39 0.106 +40 0.088 +41 0.070 +42 0.052 +43 0.035 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.066 +50 -0.082 +51 -0.098 +52 -0.113 +53 -0.128 +54 -0.143 +55 -0.158 +56 -0.172 +57 -0.186 +58 -0.200 +59 -0.214 +60 -0.227 +61 -0.240 +62 -0.253 +63 -0.266 +64 -0.279 +65 -0.292 +66 -0.305 +67 -0.318 +68 -0.331 +69 -0.344 +70 -0.357 +71 -0.370 +72 -0.384 +73 -0.398 +74 -0.413 +75 -0.427 +76 -0.443 +77 -0.459 +78 -0.475 +79 -0.492 +80 -0.510 +81 -0.529 +82 -0.549 +83 -0.570 +84 -0.592 +85 -0.615 +86 -0.639 +87 -0.665 +88 -0.692 +89 -0.721 +90 -0.751 +1 0.411 +2 0.430 +3 0.447 +4 0.461 +5 0.472 +6 0.481 +7 0.488 +8 0.493 +9 0.496 +10 0.497 +11 0.496 +12 0.494 +13 0.490 +14 0.484 +15 0.477 +16 0.469 +17 0.460 +18 0.450 +19 0.438 +20 0.426 +21 0.413 +22 0.399 +23 0.384 +24 0.369 +25 0.353 +26 0.336 +27 0.319 +28 0.302 +29 0.285 +30 0.267 +31 0.249 +32 0.231 +33 0.213 +34 0.194 +35 0.176 +36 0.158 +37 0.140 +38 0.121 +39 0.104 +40 0.086 +41 0.068 +42 0.051 +43 0.034 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.063 +50 -0.078 +51 -0.093 +52 -0.108 +53 -0.122 +54 -0.135 +55 -0.149 +56 -0.162 +57 -0.175 +58 -0.187 +59 -0.199 +60 -0.211 +61 -0.223 +62 -0.235 +63 -0.246 +64 -0.257 +65 -0.268 +66 -0.280 +67 -0.291 +68 -0.302 +69 -0.313 +70 -0.324 +71 -0.335 +72 -0.347 +73 -0.359 +74 -0.371 +75 -0.383 +76 -0.396 +77 -0.410 +78 -0.424 +79 -0.438 +80 -0.453 +81 -0.470 +82 -0.486 +83 -0.504 +84 -0.523 +85 -0.543 +86 -0.564 +87 -0.586 +88 -0.610 +89 -0.635 +90 -0.662 +1 0.364 +2 0.389 +3 0.410 +4 0.429 +5 0.445 +6 0.458 +7 0.469 +8 0.478 +9 0.484 +10 0.488 +11 0.490 +12 0.491 +13 0.489 +14 0.486 +15 0.481 +16 0.475 +17 0.467 +18 0.458 +19 0.448 +20 0.437 +21 0.424 +22 0.411 +23 0.397 +24 0.382 +25 0.367 +26 0.351 +27 0.334 +28 0.317 +29 0.299 +30 0.281 +31 0.263 +32 0.244 +33 0.225 +34 0.206 +35 0.187 +36 0.168 +37 0.149 +38 0.130 +39 0.111 +40 0.092 +41 0.073 +42 0.055 +43 0.036 +44 0.018 +45 -0.000 +46 -0.018 +47 -0.035 +48 -0.053 +49 -0.070 +50 -0.086 +51 -0.103 +52 -0.119 +53 -0.135 +54 -0.151 +55 -0.166 +56 -0.181 +57 -0.196 +58 -0.211 +59 -0.225 +60 -0.239 +61 -0.254 +62 -0.268 +63 -0.281 +64 -0.295 +65 -0.309 +66 -0.323 +67 -0.337 +68 -0.351 +69 -0.365 +70 -0.379 +71 -0.394 +72 -0.408 +73 -0.424 +74 -0.439 +75 -0.455 +76 -0.472 +77 -0.489 +78 -0.507 +79 -0.526 +80 -0.545 +81 -0.566 +82 -0.587 +83 -0.610 +84 -0.633 +85 -0.658 +86 -0.685 +87 -0.713 +88 -0.742 +89 -0.773 +90 -0.806 +1 0.388 +2 0.411 +3 0.431 +4 0.448 +5 0.463 +6 0.475 +7 0.485 +8 0.492 +9 0.497 +10 0.500 +11 0.501 +12 0.501 +13 0.498 +14 0.494 +15 0.488 +16 0.481 +17 0.473 +18 0.463 +19 0.452 +20 0.441 +21 0.428 +22 0.414 +23 0.400 +24 0.384 +25 0.368 +26 0.352 +27 0.335 +28 0.317 +29 0.299 +30 0.281 +31 0.262 +32 0.244 +33 0.225 +34 0.206 +35 0.187 +36 0.168 +37 0.148 +38 0.129 +39 0.110 +40 0.092 +41 0.073 +42 0.054 +43 0.036 +44 0.018 +45 -0.000 +46 -0.018 +47 -0.035 +48 -0.052 +49 -0.069 +50 -0.085 +51 -0.101 +52 -0.117 +53 -0.133 +54 -0.148 +55 -0.163 +56 -0.177 +57 -0.192 +58 -0.206 +59 -0.220 +60 -0.234 +61 -0.247 +62 -0.260 +63 -0.274 +64 -0.287 +65 -0.300 +66 -0.313 +67 -0.326 +68 -0.339 +69 -0.353 +70 -0.366 +71 -0.380 +72 -0.394 +73 -0.408 +74 -0.422 +75 -0.438 +76 -0.453 +77 -0.469 +78 -0.486 +79 -0.504 +80 -0.522 +81 -0.541 +82 -0.562 +83 -0.583 +84 -0.605 +85 -0.629 +86 -0.654 +87 -0.680 +88 -0.708 +89 -0.738 +90 -0.769 +1 0.279 +2 0.305 +3 0.328 +4 0.348 +5 0.366 +6 0.381 +7 0.394 +8 0.404 +9 0.413 +10 0.419 +11 0.423 +12 0.426 +13 0.426 +14 0.425 +15 0.423 +16 0.419 +17 0.414 +18 0.407 +19 0.399 +20 0.390 +21 0.380 +22 0.369 +23 0.358 +24 0.345 +25 0.332 +26 0.318 +27 0.303 +28 0.288 +29 0.273 +30 0.257 +31 0.241 +32 0.224 +33 0.207 +34 0.190 +35 0.173 +36 0.156 +37 0.138 +38 0.121 +39 0.103 +40 0.086 +41 0.069 +42 0.051 +43 0.034 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.033 +48 -0.050 +49 -0.066 +50 -0.082 +51 -0.098 +52 -0.114 +53 -0.129 +54 -0.144 +55 -0.159 +56 -0.174 +57 -0.189 +58 -0.204 +59 -0.218 +60 -0.233 +61 -0.247 +62 -0.261 +63 -0.275 +64 -0.290 +65 -0.304 +66 -0.318 +67 -0.333 +68 -0.347 +69 -0.362 +70 -0.377 +71 -0.392 +72 -0.408 +73 -0.424 +74 -0.441 +75 -0.458 +76 -0.475 +77 -0.494 +78 -0.513 +79 -0.532 +80 -0.553 +81 -0.574 +82 -0.597 +83 -0.621 +84 -0.645 +85 -0.672 +86 -0.699 +87 -0.728 +88 -0.758 +89 -0.790 +90 -0.824 +1 0.155 +2 0.176 +3 0.194 +4 0.210 +5 0.224 +6 0.236 +7 0.247 +8 0.256 +9 0.263 +10 0.269 +11 0.274 +12 0.277 +13 0.279 +14 0.279 +15 0.279 +16 0.277 +17 0.275 +18 0.271 +19 0.267 +20 0.262 +21 0.256 +22 0.249 +23 0.242 +24 0.234 +25 0.225 +26 0.216 +27 0.207 +28 0.197 +29 0.187 +30 0.176 +31 0.165 +32 0.154 +33 0.143 +34 0.131 +35 0.119 +36 0.108 +37 0.096 +38 0.084 +39 0.072 +40 0.060 +41 0.048 +42 0.036 +43 0.024 +44 0.012 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.035 +49 -0.047 +50 -0.058 +51 -0.069 +52 -0.081 +53 -0.092 +54 -0.103 +55 -0.114 +56 -0.125 +57 -0.135 +58 -0.146 +59 -0.157 +60 -0.167 +61 -0.178 +62 -0.188 +63 -0.199 +64 -0.210 +65 -0.220 +66 -0.231 +67 -0.242 +68 -0.253 +69 -0.265 +70 -0.276 +71 -0.288 +72 -0.300 +73 -0.312 +74 -0.325 +75 -0.338 +76 -0.351 +77 -0.365 +78 -0.380 +79 -0.395 +80 -0.411 +81 -0.427 +82 -0.445 +83 -0.463 +84 -0.482 +85 -0.501 +86 -0.522 +87 -0.544 +88 -0.567 +89 -0.592 +90 -0.617 +1 -0.062 +2 -0.041 +3 -0.022 +4 -0.004 +5 0.012 +6 0.027 +7 0.040 +8 0.053 +9 0.064 +10 0.074 +11 0.082 +12 0.090 +13 0.097 +14 0.103 +15 0.108 +16 0.112 +17 0.115 +18 0.117 +19 0.119 +20 0.120 +21 0.120 +22 0.119 +23 0.118 +24 0.117 +25 0.115 +26 0.112 +27 0.109 +28 0.105 +29 0.101 +30 0.097 +31 0.092 +32 0.087 +33 0.082 +34 0.076 +35 0.070 +36 0.064 +37 0.058 +38 0.051 +39 0.044 +40 0.037 +41 0.030 +42 0.023 +43 0.015 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.032 +50 -0.040 +51 -0.049 +52 -0.057 +53 -0.066 +54 -0.075 +55 -0.083 +56 -0.092 +57 -0.101 +58 -0.110 +59 -0.120 +60 -0.129 +61 -0.139 +62 -0.148 +63 -0.158 +64 -0.168 +65 -0.179 +66 -0.189 +67 -0.200 +68 -0.211 +69 -0.222 +70 -0.234 +71 -0.246 +72 -0.258 +73 -0.271 +74 -0.284 +75 -0.297 +76 -0.311 +77 -0.326 +78 -0.341 +79 -0.356 +80 -0.372 +81 -0.389 +82 -0.406 +83 -0.424 +84 -0.443 +85 -0.462 +86 -0.483 +87 -0.504 +88 -0.526 +89 -0.549 +90 -0.573 +1 -0.284 +2 -0.271 +3 -0.257 +4 -0.244 +5 -0.232 +6 -0.220 +7 -0.208 +8 -0.197 +9 -0.186 +10 -0.175 +11 -0.164 +12 -0.154 +13 -0.145 +14 -0.135 +15 -0.126 +16 -0.118 +17 -0.109 +18 -0.101 +19 -0.093 +20 -0.086 +21 -0.079 +22 -0.072 +23 -0.066 +24 -0.059 +25 -0.054 +26 -0.048 +27 -0.043 +28 -0.038 +29 -0.033 +30 -0.029 +31 -0.025 +32 -0.021 +33 -0.018 +34 -0.015 +35 -0.012 +36 -0.009 +37 -0.007 +38 -0.005 +39 -0.004 +40 -0.002 +41 -0.001 +42 -0.001 +43 -0.000 +44 0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.002 +49 -0.003 +50 -0.005 +51 -0.007 +52 -0.009 +53 -0.011 +54 -0.014 +55 -0.017 +56 -0.020 +57 -0.023 +58 -0.027 +59 -0.031 +60 -0.036 +61 -0.040 +62 -0.045 +63 -0.051 +64 -0.056 +65 -0.062 +66 -0.068 +67 -0.074 +68 -0.081 +69 -0.088 +70 -0.095 +71 -0.103 +72 -0.110 +73 -0.118 +74 -0.127 +75 -0.135 +76 -0.144 +77 -0.154 +78 -0.163 +79 -0.173 +80 -0.183 +81 -0.194 +82 -0.204 +83 -0.215 +84 -0.227 +85 -0.238 +86 -0.250 +87 -0.262 +88 -0.275 +89 -0.288 +90 -0.301 +1 -0.638 +2 -0.628 +3 -0.618 +4 -0.606 +5 -0.594 +6 -0.581 +7 -0.567 +8 -0.553 +9 -0.538 +10 -0.523 +11 -0.507 +12 -0.491 +13 -0.475 +14 -0.458 +15 -0.441 +16 -0.424 +17 -0.406 +18 -0.389 +19 -0.371 +20 -0.354 +21 -0.336 +22 -0.319 +23 -0.301 +24 -0.284 +25 -0.267 +26 -0.250 +27 -0.233 +28 -0.217 +29 -0.201 +30 -0.185 +31 -0.170 +32 -0.154 +33 -0.140 +34 -0.125 +35 -0.111 +36 -0.098 +37 -0.085 +38 -0.072 +39 -0.061 +40 -0.049 +41 -0.038 +42 -0.028 +43 -0.018 +44 -0.009 +45 0.000 +46 0.008 +47 0.016 +48 0.022 +49 0.029 +50 0.035 +51 0.040 +52 0.044 +53 0.048 +54 0.051 +55 0.054 +56 0.056 +57 0.058 +58 0.059 +59 0.059 +60 0.059 +61 0.058 +62 0.057 +63 0.056 +64 0.053 +65 0.051 +66 0.048 +67 0.044 +68 0.040 +69 0.036 +70 0.031 +71 0.026 +72 0.021 +73 0.015 +74 0.009 +75 0.003 +76 -0.004 +77 -0.010 +78 -0.017 +79 -0.024 +80 -0.030 +81 -0.037 +82 -0.044 +83 -0.051 +84 -0.058 +85 -0.064 +86 -0.070 +87 -0.077 +88 -0.082 +89 -0.088 +90 -0.093 +1 -0.818 +2 -0.813 +3 -0.805 +4 -0.796 +5 -0.785 +6 -0.773 +7 -0.759 +8 -0.745 +9 -0.729 +10 -0.712 +11 -0.695 +12 -0.676 +13 -0.657 +14 -0.637 +15 -0.616 +16 -0.595 +17 -0.573 +18 -0.551 +19 -0.528 +20 -0.505 +21 -0.482 +22 -0.459 +23 -0.436 +24 -0.413 +25 -0.390 +26 -0.367 +27 -0.344 +28 -0.321 +29 -0.298 +30 -0.276 +31 -0.254 +32 -0.232 +33 -0.211 +34 -0.191 +35 -0.170 +36 -0.150 +37 -0.131 +38 -0.113 +39 -0.095 +40 -0.077 +41 -0.060 +42 -0.044 +43 -0.029 +44 -0.014 +45 0.000 +46 0.013 +47 0.026 +48 0.038 +49 0.049 +50 0.059 +51 0.069 +52 0.077 +53 0.086 +54 0.093 +55 0.099 +56 0.105 +57 0.110 +58 0.115 +59 0.118 +60 0.121 +61 0.124 +62 0.126 +63 0.127 +64 0.127 +65 0.127 +66 0.127 +67 0.126 +68 0.124 +69 0.122 +70 0.120 +71 0.117 +72 0.114 +73 0.111 +74 0.108 +75 0.104 +76 0.100 +77 0.097 +78 0.093 +79 0.089 +80 0.086 +81 0.082 +82 0.079 +83 0.076 +84 0.073 +85 0.071 +86 0.070 +87 0.069 +88 0.068 +89 0.069 +90 0.070 +1 -1.182 +2 -1.182 +3 -1.179 +4 -1.173 +5 -1.164 +6 -1.152 +7 -1.138 +8 -1.122 +9 -1.103 +10 -1.083 +11 -1.061 +12 -1.036 +13 -1.011 +14 -0.983 +15 -0.955 +16 -0.925 +17 -0.895 +18 -0.863 +19 -0.830 +20 -0.797 +21 -0.763 +22 -0.729 +23 -0.694 +24 -0.659 +25 -0.624 +26 -0.589 +27 -0.554 +28 -0.519 +29 -0.484 +30 -0.449 +31 -0.415 +32 -0.381 +33 -0.347 +34 -0.314 +35 -0.282 +36 -0.250 +37 -0.219 +38 -0.188 +39 -0.159 +40 -0.130 +41 -0.102 +42 -0.075 +43 -0.049 +44 -0.024 +45 0.000 +46 0.023 +47 0.045 +48 0.066 +49 0.086 +50 0.105 +51 0.123 +52 0.139 +53 0.155 +54 0.169 +55 0.183 +56 0.196 +57 0.207 +58 0.218 +59 0.227 +60 0.236 +61 0.243 +62 0.250 +63 0.256 +64 0.262 +65 0.266 +66 0.270 +67 0.273 +68 0.276 +69 0.278 +70 0.280 +71 0.281 +72 0.282 +73 0.283 +74 0.284 +75 0.285 +76 0.285 +77 0.286 +78 0.287 +79 0.289 +80 0.290 +81 0.293 +82 0.296 +83 0.299 +84 0.304 +85 0.309 +86 0.316 +87 0.324 +88 0.333 +89 0.344 +90 0.356 +1 -1.347 +2 -1.353 +3 -1.355 +4 -1.353 +5 -1.347 +6 -1.338 +7 -1.326 +8 -1.310 +9 -1.292 +10 -1.271 +11 -1.248 +12 -1.222 +13 -1.194 +14 -1.165 +15 -1.133 +16 -1.100 +17 -1.065 +18 -1.030 +19 -0.992 +20 -0.954 +21 -0.915 +22 -0.876 +23 -0.835 +24 -0.795 +25 -0.753 +26 -0.712 +27 -0.670 +28 -0.629 +29 -0.587 +30 -0.546 +31 -0.505 +32 -0.464 +33 -0.424 +34 -0.384 +35 -0.345 +36 -0.307 +37 -0.269 +38 -0.232 +39 -0.196 +40 -0.161 +41 -0.126 +42 -0.093 +43 -0.061 +44 -0.030 +45 0.000 +46 0.029 +47 0.056 +48 0.083 +49 0.108 +50 0.132 +51 0.155 +52 0.177 +53 0.197 +54 0.217 +55 0.235 +56 0.252 +57 0.268 +58 0.282 +59 0.296 +60 0.309 +61 0.320 +62 0.331 +63 0.341 +64 0.350 +65 0.358 +66 0.365 +67 0.372 +68 0.378 +69 0.384 +70 0.389 +71 0.394 +72 0.399 +73 0.403 +74 0.408 +75 0.412 +76 0.417 +77 0.422 +78 0.427 +79 0.433 +80 0.440 +81 0.447 +82 0.455 +83 0.465 +84 0.475 +85 0.487 +86 0.500 +87 0.515 +88 0.532 +89 0.551 +90 0.572 +1 -0.927 +2 -0.914 +3 -0.899 +4 -0.884 +5 -0.867 +6 -0.849 +7 -0.830 +8 -0.810 +9 -0.789 +10 -0.768 +11 -0.745 +12 -0.722 +13 -0.699 +14 -0.675 +15 -0.650 +16 -0.626 +17 -0.601 +18 -0.575 +19 -0.550 +20 -0.524 +21 -0.499 +22 -0.473 +23 -0.448 +24 -0.423 +25 -0.398 +26 -0.373 +27 -0.348 +28 -0.324 +29 -0.300 +30 -0.277 +31 -0.254 +32 -0.232 +33 -0.210 +34 -0.189 +35 -0.168 +36 -0.148 +37 -0.128 +38 -0.110 +39 -0.092 +40 -0.074 +41 -0.058 +42 -0.042 +43 -0.027 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.035 +49 0.045 +50 0.054 +51 0.062 +52 0.069 +53 0.076 +54 0.081 +55 0.086 +56 0.090 +57 0.093 +58 0.095 +59 0.096 +60 0.097 +61 0.097 +62 0.096 +63 0.094 +64 0.092 +65 0.089 +66 0.085 +67 0.081 +68 0.076 +69 0.071 +70 0.065 +71 0.059 +72 0.052 +73 0.044 +74 0.037 +75 0.029 +76 0.021 +77 0.012 +78 0.004 +79 -0.005 +80 -0.014 +81 -0.023 +82 -0.032 +83 -0.040 +84 -0.049 +85 -0.057 +86 -0.065 +87 -0.072 +88 -0.079 +89 -0.086 +90 -0.092 +1 -0.410 +2 -0.385 +3 -0.361 +4 -0.338 +5 -0.316 +6 -0.295 +7 -0.274 +8 -0.255 +9 -0.236 +10 -0.218 +11 -0.201 +12 -0.185 +13 -0.170 +14 -0.155 +15 -0.141 +16 -0.128 +17 -0.116 +18 -0.104 +19 -0.093 +20 -0.082 +21 -0.073 +22 -0.063 +23 -0.055 +24 -0.047 +25 -0.039 +26 -0.033 +27 -0.026 +28 -0.021 +29 -0.016 +30 -0.011 +31 -0.007 +32 -0.003 +33 -0.000 +34 0.002 +35 0.004 +36 0.006 +37 0.007 +38 0.008 +39 0.008 +40 0.008 +41 0.007 +42 0.006 +43 0.004 +44 0.002 +45 -0.000 +46 -0.003 +47 -0.006 +48 -0.010 +49 -0.014 +50 -0.018 +51 -0.023 +52 -0.029 +53 -0.035 +54 -0.041 +55 -0.047 +56 -0.055 +57 -0.062 +58 -0.070 +59 -0.078 +60 -0.087 +61 -0.096 +62 -0.106 +63 -0.116 +64 -0.127 +65 -0.138 +66 -0.149 +67 -0.161 +68 -0.174 +69 -0.187 +70 -0.200 +71 -0.214 +72 -0.228 +73 -0.243 +74 -0.259 +75 -0.275 +76 -0.292 +77 -0.309 +78 -0.327 +79 -0.345 +80 -0.364 +81 -0.384 +82 -0.404 +83 -0.425 +84 -0.447 +85 -0.469 +86 -0.492 +87 -0.515 +88 -0.540 +89 -0.565 +90 -0.591 +1 -0.012 +2 0.028 +3 0.065 +4 0.098 +5 0.129 +6 0.157 +7 0.181 +8 0.204 +9 0.223 +10 0.241 +11 0.255 +12 0.268 +13 0.279 +14 0.287 +15 0.294 +16 0.299 +17 0.302 +18 0.304 +19 0.304 +20 0.303 +21 0.300 +22 0.296 +23 0.291 +24 0.284 +25 0.277 +26 0.269 +27 0.259 +28 0.249 +29 0.239 +30 0.227 +31 0.215 +32 0.202 +33 0.189 +34 0.175 +35 0.160 +36 0.146 +37 0.131 +38 0.115 +39 0.099 +40 0.083 +41 0.067 +42 0.050 +43 0.034 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.052 +49 -0.069 +50 -0.087 +51 -0.104 +52 -0.122 +53 -0.140 +54 -0.158 +55 -0.176 +56 -0.194 +57 -0.212 +58 -0.230 +59 -0.249 +60 -0.268 +61 -0.287 +62 -0.306 +63 -0.325 +64 -0.345 +65 -0.365 +66 -0.386 +67 -0.406 +68 -0.428 +69 -0.450 +70 -0.472 +71 -0.495 +72 -0.519 +73 -0.543 +74 -0.568 +75 -0.594 +76 -0.621 +77 -0.649 +78 -0.678 +79 -0.708 +80 -0.739 +81 -0.771 +82 -0.805 +83 -0.840 +84 -0.877 +85 -0.916 +86 -0.956 +87 -0.998 +88 -1.041 +89 -1.087 +90 -1.135 +1 0.361 +2 0.401 +3 0.438 +4 0.470 +5 0.498 +6 0.522 +7 0.543 +8 0.561 +9 0.575 +10 0.586 +11 0.594 +12 0.599 +13 0.602 +14 0.602 +15 0.600 +16 0.595 +17 0.589 +18 0.581 +19 0.570 +20 0.559 +21 0.545 +22 0.530 +23 0.514 +24 0.497 +25 0.478 +26 0.459 +27 0.438 +28 0.417 +29 0.395 +30 0.372 +31 0.349 +32 0.325 +33 0.301 +34 0.276 +35 0.252 +36 0.227 +37 0.201 +38 0.176 +39 0.151 +40 0.125 +41 0.100 +42 0.075 +43 0.050 +44 0.025 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.073 +49 -0.097 +50 -0.121 +51 -0.144 +52 -0.168 +53 -0.191 +54 -0.213 +55 -0.236 +56 -0.258 +57 -0.280 +58 -0.302 +59 -0.324 +60 -0.346 +61 -0.367 +62 -0.389 +63 -0.411 +64 -0.432 +65 -0.454 +66 -0.476 +67 -0.498 +68 -0.521 +69 -0.544 +70 -0.567 +71 -0.591 +72 -0.615 +73 -0.640 +74 -0.666 +75 -0.692 +76 -0.720 +77 -0.749 +78 -0.778 +79 -0.809 +80 -0.841 +81 -0.875 +82 -0.910 +83 -0.947 +84 -0.986 +85 -1.027 +86 -1.070 +87 -1.115 +88 -1.162 +89 -1.212 +90 -1.265 +1 0.627 +2 0.675 +3 0.717 +4 0.754 +5 0.786 +6 0.813 +7 0.835 +8 0.853 +9 0.866 +10 0.876 +11 0.881 +12 0.883 +13 0.882 +14 0.878 +15 0.870 +16 0.860 +17 0.847 +18 0.832 +19 0.814 +20 0.794 +21 0.773 +22 0.749 +23 0.724 +24 0.698 +25 0.670 +26 0.641 +27 0.611 +28 0.580 +29 0.548 +30 0.515 +31 0.482 +32 0.448 +33 0.414 +34 0.379 +35 0.344 +36 0.310 +37 0.275 +38 0.240 +39 0.205 +40 0.170 +41 0.135 +42 0.101 +43 0.067 +44 0.033 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.098 +49 -0.129 +50 -0.160 +51 -0.191 +52 -0.221 +53 -0.251 +54 -0.280 +55 -0.309 +56 -0.337 +57 -0.366 +58 -0.393 +59 -0.421 +60 -0.448 +61 -0.474 +62 -0.501 +63 -0.528 +64 -0.554 +65 -0.581 +66 -0.607 +67 -0.634 +68 -0.661 +69 -0.688 +70 -0.716 +71 -0.744 +72 -0.773 +73 -0.803 +74 -0.833 +75 -0.865 +76 -0.897 +77 -0.931 +78 -0.967 +79 -1.003 +80 -1.042 +81 -1.082 +82 -1.124 +83 -1.168 +84 -1.215 +85 -1.264 +86 -1.316 +87 -1.370 +88 -1.428 +89 -1.489 +90 -1.553 +1 0.834 +2 0.878 +3 0.916 +4 0.949 +5 0.976 +6 0.998 +7 1.015 +8 1.028 +9 1.036 +10 1.041 +11 1.041 +12 1.038 +13 1.031 +14 1.021 +15 1.008 +16 0.992 +17 0.973 +18 0.952 +19 0.929 +20 0.904 +21 0.876 +22 0.847 +23 0.817 +24 0.785 +25 0.752 +26 0.717 +27 0.682 +28 0.646 +29 0.609 +30 0.571 +31 0.533 +32 0.494 +33 0.456 +34 0.417 +35 0.378 +36 0.339 +37 0.300 +38 0.261 +39 0.223 +40 0.184 +41 0.147 +42 0.109 +43 0.072 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.070 +48 -0.104 +49 -0.137 +50 -0.170 +51 -0.202 +52 -0.234 +53 -0.264 +54 -0.294 +55 -0.324 +56 -0.353 +57 -0.381 +58 -0.409 +59 -0.436 +60 -0.463 +61 -0.489 +62 -0.515 +63 -0.541 +64 -0.566 +65 -0.591 +66 -0.617 +67 -0.642 +68 -0.667 +69 -0.693 +70 -0.719 +71 -0.745 +72 -0.772 +73 -0.800 +74 -0.828 +75 -0.857 +76 -0.887 +77 -0.919 +78 -0.951 +79 -0.985 +80 -1.021 +81 -1.059 +82 -1.098 +83 -1.140 +84 -1.184 +85 -1.230 +86 -1.280 +87 -1.332 +88 -1.387 +89 -1.445 +90 -1.507 +1 0.862 +2 0.904 +3 0.940 +4 0.971 +5 0.997 +6 1.018 +7 1.033 +8 1.045 +9 1.052 +10 1.055 +11 1.054 +12 1.049 +13 1.042 +14 1.030 +15 1.016 +16 1.000 +17 0.980 +18 0.958 +19 0.934 +20 0.908 +21 0.880 +22 0.851 +23 0.820 +24 0.787 +25 0.753 +26 0.719 +27 0.683 +28 0.646 +29 0.609 +30 0.571 +31 0.533 +32 0.494 +33 0.455 +34 0.416 +35 0.377 +36 0.338 +37 0.299 +38 0.260 +39 0.222 +40 0.184 +41 0.146 +42 0.109 +43 0.072 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.103 +49 -0.136 +50 -0.168 +51 -0.200 +52 -0.231 +53 -0.261 +54 -0.291 +55 -0.320 +56 -0.348 +57 -0.376 +58 -0.403 +59 -0.429 +60 -0.455 +61 -0.481 +62 -0.506 +63 -0.531 +64 -0.556 +65 -0.580 +66 -0.605 +67 -0.629 +68 -0.654 +69 -0.678 +70 -0.703 +71 -0.728 +72 -0.754 +73 -0.780 +74 -0.807 +75 -0.835 +76 -0.864 +77 -0.894 +78 -0.926 +79 -0.958 +80 -0.993 +81 -1.029 +82 -1.067 +83 -1.107 +84 -1.149 +85 -1.194 +86 -1.242 +87 -1.292 +88 -1.345 +89 -1.402 +90 -1.462 +1 0.906 +2 0.940 +3 0.969 +4 0.992 +5 1.011 +6 1.025 +7 1.035 +8 1.041 +9 1.044 +10 1.042 +11 1.037 +12 1.029 +13 1.018 +14 1.004 +15 0.988 +16 0.969 +17 0.948 +18 0.925 +19 0.899 +20 0.873 +21 0.844 +22 0.814 +23 0.783 +24 0.750 +25 0.717 +26 0.683 +27 0.648 +28 0.612 +29 0.576 +30 0.539 +31 0.502 +32 0.465 +33 0.428 +34 0.390 +35 0.353 +36 0.316 +37 0.279 +38 0.243 +39 0.206 +40 0.171 +41 0.135 +42 0.101 +43 0.066 +44 0.033 +45 -0.000 +46 -0.032 +47 -0.064 +48 -0.095 +49 -0.125 +50 -0.154 +51 -0.183 +52 -0.210 +53 -0.238 +54 -0.264 +55 -0.290 +56 -0.315 +57 -0.339 +58 -0.362 +59 -0.385 +60 -0.408 +61 -0.430 +62 -0.451 +63 -0.473 +64 -0.493 +65 -0.514 +66 -0.534 +67 -0.554 +68 -0.574 +69 -0.595 +70 -0.615 +71 -0.636 +72 -0.656 +73 -0.678 +74 -0.700 +75 -0.722 +76 -0.746 +77 -0.770 +78 -0.795 +79 -0.822 +80 -0.850 +81 -0.879 +82 -0.911 +83 -0.943 +84 -0.978 +85 -1.015 +86 -1.055 +87 -1.097 +88 -1.141 +89 -1.189 +90 -1.239 +1 0.791 +2 0.821 +3 0.846 +4 0.866 +5 0.883 +6 0.896 +7 0.905 +8 0.910 +9 0.912 +10 0.911 +11 0.906 +12 0.900 +13 0.890 +14 0.878 +15 0.863 +16 0.847 +17 0.829 +18 0.808 +19 0.786 +20 0.763 +21 0.738 +22 0.712 +23 0.684 +24 0.656 +25 0.627 +26 0.597 +27 0.566 +28 0.535 +29 0.503 +30 0.471 +31 0.439 +32 0.406 +33 0.374 +34 0.341 +35 0.308 +36 0.276 +37 0.244 +38 0.212 +39 0.180 +40 0.149 +41 0.118 +42 0.088 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.083 +49 -0.109 +50 -0.134 +51 -0.159 +52 -0.184 +53 -0.207 +54 -0.230 +55 -0.253 +56 -0.274 +57 -0.295 +58 -0.316 +59 -0.336 +60 -0.356 +61 -0.375 +62 -0.394 +63 -0.412 +64 -0.430 +65 -0.448 +66 -0.466 +67 -0.483 +68 -0.501 +69 -0.518 +70 -0.536 +71 -0.554 +72 -0.572 +73 -0.591 +74 -0.610 +75 -0.630 +76 -0.650 +77 -0.671 +78 -0.693 +79 -0.717 +80 -0.741 +81 -0.767 +82 -0.794 +83 -0.823 +84 -0.853 +85 -0.886 +86 -0.920 +87 -0.957 +88 -0.996 +89 -1.038 +90 -1.082 +1 0.808 +2 0.830 +3 0.849 +4 0.863 +5 0.874 +6 0.881 +7 0.886 +8 0.887 +9 0.885 +10 0.880 +11 0.873 +12 0.863 +13 0.852 +14 0.838 +15 0.822 +16 0.804 +17 0.784 +18 0.763 +19 0.741 +20 0.717 +21 0.692 +22 0.667 +23 0.640 +24 0.612 +25 0.584 +26 0.555 +27 0.525 +28 0.496 +29 0.465 +30 0.435 +31 0.404 +32 0.374 +33 0.343 +34 0.313 +35 0.283 +36 0.252 +37 0.223 +38 0.193 +39 0.164 +40 0.135 +41 0.107 +42 0.080 +43 0.052 +44 0.026 +45 -0.000 +46 -0.025 +47 -0.050 +48 -0.074 +49 -0.097 +50 -0.120 +51 -0.142 +52 -0.163 +53 -0.183 +54 -0.203 +55 -0.223 +56 -0.241 +57 -0.259 +58 -0.276 +59 -0.293 +60 -0.309 +61 -0.325 +62 -0.341 +63 -0.355 +64 -0.370 +65 -0.384 +66 -0.398 +67 -0.412 +68 -0.426 +69 -0.439 +70 -0.453 +71 -0.467 +72 -0.481 +73 -0.495 +74 -0.509 +75 -0.525 +76 -0.540 +77 -0.556 +78 -0.573 +79 -0.591 +80 -0.610 +81 -0.630 +82 -0.651 +83 -0.674 +84 -0.698 +85 -0.723 +86 -0.751 +87 -0.780 +88 -0.812 +89 -0.845 +90 -0.881 +1 0.562 +2 0.576 +3 0.588 +4 0.597 +5 0.604 +6 0.608 +7 0.611 +8 0.611 +9 0.609 +10 0.605 +11 0.600 +12 0.593 +13 0.584 +14 0.574 +15 0.563 +16 0.551 +17 0.537 +18 0.522 +19 0.507 +20 0.490 +21 0.473 +22 0.455 +23 0.437 +24 0.418 +25 0.398 +26 0.378 +27 0.358 +28 0.337 +29 0.317 +30 0.296 +31 0.275 +32 0.254 +33 0.233 +34 0.213 +35 0.192 +36 0.171 +37 0.151 +38 0.131 +39 0.111 +40 0.092 +41 0.073 +42 0.054 +43 0.036 +44 0.018 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.066 +50 -0.081 +51 -0.096 +52 -0.110 +53 -0.124 +54 -0.137 +55 -0.150 +56 -0.162 +57 -0.174 +58 -0.186 +59 -0.197 +60 -0.208 +61 -0.218 +62 -0.228 +63 -0.238 +64 -0.248 +65 -0.257 +66 -0.266 +67 -0.275 +68 -0.284 +69 -0.293 +70 -0.302 +71 -0.311 +72 -0.320 +73 -0.329 +74 -0.339 +75 -0.349 +76 -0.359 +77 -0.369 +78 -0.381 +79 -0.392 +80 -0.405 +81 -0.418 +82 -0.432 +83 -0.447 +84 -0.462 +85 -0.479 +86 -0.498 +87 -0.517 +88 -0.538 +89 -0.560 +90 -0.584 +1 0.505 +2 0.511 +3 0.515 +4 0.517 +5 0.518 +6 0.517 +7 0.515 +8 0.511 +9 0.505 +10 0.499 +11 0.492 +12 0.483 +13 0.473 +14 0.463 +15 0.452 +16 0.439 +17 0.427 +18 0.413 +19 0.399 +20 0.385 +21 0.370 +22 0.354 +23 0.339 +24 0.323 +25 0.306 +26 0.290 +27 0.274 +28 0.257 +29 0.241 +30 0.224 +31 0.207 +32 0.191 +33 0.175 +34 0.159 +35 0.143 +36 0.127 +37 0.112 +38 0.096 +39 0.082 +40 0.067 +41 0.053 +42 0.039 +43 0.026 +44 0.013 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.035 +49 -0.046 +50 -0.056 +51 -0.066 +52 -0.076 +53 -0.085 +54 -0.094 +55 -0.102 +56 -0.109 +57 -0.117 +58 -0.124 +59 -0.130 +60 -0.136 +61 -0.142 +62 -0.148 +63 -0.153 +64 -0.158 +65 -0.163 +66 -0.167 +67 -0.171 +68 -0.175 +69 -0.179 +70 -0.183 +71 -0.187 +72 -0.191 +73 -0.194 +74 -0.198 +75 -0.202 +76 -0.206 +77 -0.211 +78 -0.216 +79 -0.221 +80 -0.226 +81 -0.232 +82 -0.238 +83 -0.245 +84 -0.253 +85 -0.261 +86 -0.270 +87 -0.280 +88 -0.290 +89 -0.302 +90 -0.315 +1 0.220 +2 0.216 +3 0.212 +4 0.208 +5 0.203 +6 0.198 +7 0.193 +8 0.188 +9 0.182 +10 0.177 +11 0.171 +12 0.165 +13 0.159 +14 0.154 +15 0.148 +16 0.142 +17 0.135 +18 0.129 +19 0.123 +20 0.117 +21 0.111 +22 0.105 +23 0.099 +24 0.093 +25 0.088 +26 0.082 +27 0.076 +28 0.071 +29 0.065 +30 0.060 +31 0.055 +32 0.050 +33 0.045 +34 0.040 +35 0.036 +36 0.031 +37 0.027 +38 0.023 +39 0.019 +40 0.015 +41 0.012 +42 0.009 +43 0.006 +44 0.003 +45 -0.000 +46 -0.002 +47 -0.005 +48 -0.007 +49 -0.009 +50 -0.010 +51 -0.012 +52 -0.013 +53 -0.014 +54 -0.015 +55 -0.016 +56 -0.016 +57 -0.016 +58 -0.016 +59 -0.016 +60 -0.016 +61 -0.015 +62 -0.015 +63 -0.014 +64 -0.013 +65 -0.012 +66 -0.011 +67 -0.009 +68 -0.008 +69 -0.006 +70 -0.004 +71 -0.002 +72 -0.000 +73 0.002 +74 0.004 +75 0.006 +76 0.009 +77 0.011 +78 0.013 +79 0.016 +80 0.018 +81 0.021 +82 0.023 +83 0.025 +84 0.027 +85 0.030 +86 0.032 +87 0.034 +88 0.036 +89 0.037 +90 0.039 +1 0.170 +2 0.159 +3 0.148 +4 0.137 +5 0.127 +6 0.117 +7 0.108 +8 0.100 +9 0.091 +10 0.083 +11 0.076 +12 0.069 +13 0.062 +14 0.056 +15 0.050 +16 0.044 +17 0.039 +18 0.034 +19 0.029 +20 0.025 +21 0.021 +22 0.017 +23 0.013 +24 0.010 +25 0.007 +26 0.005 +27 0.002 +28 0.000 +29 -0.001 +30 -0.003 +31 -0.004 +32 -0.005 +33 -0.006 +34 -0.007 +35 -0.007 +36 -0.007 +37 -0.007 +38 -0.007 +39 -0.007 +40 -0.006 +41 -0.005 +42 -0.004 +43 -0.003 +44 -0.002 +45 0.000 +46 0.002 +47 0.004 +48 0.006 +49 0.008 +50 0.011 +51 0.014 +52 0.016 +53 0.019 +54 0.023 +55 0.026 +56 0.030 +57 0.033 +58 0.037 +59 0.042 +60 0.046 +61 0.050 +62 0.055 +63 0.060 +64 0.065 +65 0.070 +66 0.075 +67 0.081 +68 0.087 +69 0.093 +70 0.099 +71 0.105 +72 0.112 +73 0.119 +74 0.126 +75 0.133 +76 0.141 +77 0.148 +78 0.156 +79 0.164 +80 0.173 +81 0.182 +82 0.190 +83 0.200 +84 0.209 +85 0.219 +86 0.229 +87 0.239 +88 0.250 +89 0.261 +90 0.272 +1 -0.139 +2 -0.159 +3 -0.177 +4 -0.193 +5 -0.207 +6 -0.219 +7 -0.230 +8 -0.239 +9 -0.247 +10 -0.253 +11 -0.257 +12 -0.261 +13 -0.263 +14 -0.264 +15 -0.264 +16 -0.263 +17 -0.261 +18 -0.258 +19 -0.254 +20 -0.249 +21 -0.244 +22 -0.237 +23 -0.231 +24 -0.223 +25 -0.215 +26 -0.207 +27 -0.198 +28 -0.189 +29 -0.179 +30 -0.169 +31 -0.159 +32 -0.148 +33 -0.137 +34 -0.126 +35 -0.115 +36 -0.104 +37 -0.092 +38 -0.081 +39 -0.069 +40 -0.058 +41 -0.046 +42 -0.035 +43 -0.023 +44 -0.012 +45 0.000 +46 0.011 +47 0.023 +48 0.034 +49 0.045 +50 0.057 +51 0.068 +52 0.079 +53 0.089 +54 0.100 +55 0.111 +56 0.122 +57 0.132 +58 0.143 +59 0.153 +60 0.164 +61 0.174 +62 0.185 +63 0.195 +64 0.206 +65 0.216 +66 0.227 +67 0.238 +68 0.249 +69 0.260 +70 0.271 +71 0.283 +72 0.294 +73 0.306 +74 0.319 +75 0.332 +76 0.345 +77 0.358 +78 0.373 +79 0.387 +80 0.403 +81 0.419 +82 0.435 +83 0.453 +84 0.471 +85 0.490 +86 0.510 +87 0.531 +88 0.553 +89 0.577 +90 0.601 +1 -0.213 +2 -0.237 +3 -0.259 +4 -0.278 +5 -0.295 +6 -0.310 +7 -0.322 +8 -0.333 +9 -0.341 +10 -0.348 +11 -0.353 +12 -0.356 +13 -0.358 +14 -0.358 +15 -0.357 +16 -0.355 +17 -0.351 +18 -0.346 +19 -0.340 +20 -0.333 +21 -0.326 +22 -0.317 +23 -0.307 +24 -0.297 +25 -0.286 +26 -0.274 +27 -0.262 +28 -0.250 +29 -0.237 +30 -0.223 +31 -0.209 +32 -0.195 +33 -0.181 +34 -0.166 +35 -0.151 +36 -0.136 +37 -0.121 +38 -0.106 +39 -0.091 +40 -0.076 +41 -0.060 +42 -0.045 +43 -0.030 +44 -0.015 +45 0.000 +46 0.015 +47 0.030 +48 0.044 +49 0.059 +50 0.073 +51 0.087 +52 0.101 +53 0.115 +54 0.129 +55 0.143 +56 0.156 +57 0.170 +58 0.183 +59 0.197 +60 0.210 +61 0.223 +62 0.236 +63 0.249 +64 0.262 +65 0.276 +66 0.289 +67 0.302 +68 0.316 +69 0.330 +70 0.344 +71 0.358 +72 0.373 +73 0.388 +74 0.404 +75 0.420 +76 0.436 +77 0.453 +78 0.471 +79 0.489 +80 0.508 +81 0.528 +82 0.549 +83 0.571 +84 0.594 +85 0.618 +86 0.643 +87 0.670 +88 0.698 +89 0.727 +90 0.758 +1 -0.569 +2 -0.603 +3 -0.633 +4 -0.659 +5 -0.681 +6 -0.699 +7 -0.714 +8 -0.725 +9 -0.733 +10 -0.737 +11 -0.739 +12 -0.738 +13 -0.735 +14 -0.729 +15 -0.721 +16 -0.711 +17 -0.698 +18 -0.684 +19 -0.669 +20 -0.651 +21 -0.632 +22 -0.612 +23 -0.591 +24 -0.568 +25 -0.545 +26 -0.520 +27 -0.495 +28 -0.469 +29 -0.443 +30 -0.416 +31 -0.389 +32 -0.361 +33 -0.333 +34 -0.305 +35 -0.277 +36 -0.248 +37 -0.220 +38 -0.192 +39 -0.164 +40 -0.136 +41 -0.108 +42 -0.081 +43 -0.053 +44 -0.026 +45 0.000 +46 0.026 +47 0.052 +48 0.077 +49 0.102 +50 0.126 +51 0.150 +52 0.174 +53 0.197 +54 0.220 +55 0.242 +56 0.264 +57 0.285 +58 0.306 +59 0.327 +60 0.347 +61 0.368 +62 0.388 +63 0.407 +64 0.427 +65 0.446 +66 0.466 +67 0.486 +68 0.505 +69 0.525 +70 0.545 +71 0.565 +72 0.586 +73 0.607 +74 0.629 +75 0.652 +76 0.675 +77 0.699 +78 0.724 +79 0.750 +80 0.777 +81 0.806 +82 0.836 +83 0.867 +84 0.901 +85 0.936 +86 0.973 +87 1.012 +88 1.053 +89 1.097 +90 1.143 +1 -0.698 +2 -0.735 +3 -0.767 +4 -0.795 +5 -0.818 +6 -0.837 +7 -0.851 +8 -0.862 +9 -0.869 +10 -0.873 +11 -0.874 +12 -0.871 +13 -0.865 +14 -0.857 +15 -0.846 +16 -0.833 +17 -0.818 +18 -0.800 +19 -0.781 +20 -0.760 +21 -0.737 +22 -0.713 +23 -0.687 +24 -0.660 +25 -0.633 +26 -0.604 +27 -0.574 +28 -0.544 +29 -0.513 +30 -0.481 +31 -0.449 +32 -0.417 +33 -0.384 +34 -0.351 +35 -0.319 +36 -0.286 +37 -0.253 +38 -0.220 +39 -0.188 +40 -0.156 +41 -0.124 +42 -0.092 +43 -0.061 +44 -0.030 +45 0.000 +46 0.030 +47 0.059 +48 0.088 +49 0.116 +50 0.144 +51 0.171 +52 0.197 +53 0.224 +54 0.249 +55 0.274 +56 0.298 +57 0.322 +58 0.346 +59 0.369 +60 0.392 +61 0.414 +62 0.436 +63 0.458 +64 0.479 +65 0.501 +66 0.522 +67 0.543 +68 0.565 +69 0.586 +70 0.608 +71 0.630 +72 0.653 +73 0.676 +74 0.699 +75 0.724 +76 0.749 +77 0.775 +78 0.802 +79 0.831 +80 0.860 +81 0.892 +82 0.924 +83 0.959 +84 0.995 +85 1.034 +86 1.074 +87 1.117 +88 1.163 +89 1.211 +90 1.262 +1 -1.067 +2 -1.110 +3 -1.146 +4 -1.176 +5 -1.201 +6 -1.220 +7 -1.234 +8 -1.243 +9 -1.247 +10 -1.247 +11 -1.242 +12 -1.234 +13 -1.222 +14 -1.206 +15 -1.187 +16 -1.166 +17 -1.141 +18 -1.114 +19 -1.084 +20 -1.053 +21 -1.019 +22 -0.983 +23 -0.946 +24 -0.907 +25 -0.868 +26 -0.827 +27 -0.784 +28 -0.742 +29 -0.698 +30 -0.654 +31 -0.609 +32 -0.565 +33 -0.520 +34 -0.475 +35 -0.430 +36 -0.385 +37 -0.340 +38 -0.296 +39 -0.252 +40 -0.208 +41 -0.165 +42 -0.123 +43 -0.081 +44 -0.040 +45 0.000 +46 0.039 +47 0.078 +48 0.116 +49 0.153 +50 0.189 +51 0.224 +52 0.259 +53 0.292 +54 0.325 +55 0.356 +56 0.387 +57 0.418 +58 0.447 +59 0.476 +60 0.504 +61 0.531 +62 0.558 +63 0.585 +64 0.611 +65 0.637 +66 0.662 +67 0.688 +68 0.713 +69 0.738 +70 0.764 +71 0.790 +72 0.816 +73 0.843 +74 0.871 +75 0.899 +76 0.928 +77 0.959 +78 0.991 +79 1.024 +80 1.059 +81 1.095 +82 1.134 +83 1.175 +84 1.218 +85 1.264 +86 1.312 +87 1.364 +88 1.419 +89 1.477 +90 1.539 +1 -1.141 +2 -1.179 +3 -1.210 +4 -1.235 +5 -1.255 +6 -1.270 +7 -1.279 +8 -1.284 +9 -1.284 +10 -1.280 +11 -1.272 +12 -1.261 +13 -1.245 +14 -1.227 +15 -1.206 +16 -1.181 +17 -1.154 +18 -1.125 +19 -1.093 +20 -1.060 +21 -1.024 +22 -0.987 +23 -0.949 +24 -0.909 +25 -0.867 +26 -0.825 +27 -0.782 +28 -0.739 +29 -0.695 +30 -0.650 +31 -0.605 +32 -0.560 +33 -0.515 +34 -0.470 +35 -0.425 +36 -0.380 +37 -0.335 +38 -0.291 +39 -0.248 +40 -0.205 +41 -0.162 +42 -0.120 +43 -0.080 +44 -0.039 +45 0.000 +46 0.038 +47 0.076 +48 0.113 +49 0.148 +50 0.183 +51 0.217 +52 0.250 +53 0.282 +54 0.313 +55 0.343 +56 0.372 +57 0.400 +58 0.428 +59 0.454 +60 0.480 +61 0.506 +62 0.530 +63 0.554 +64 0.578 +65 0.601 +66 0.624 +67 0.647 +68 0.669 +69 0.691 +70 0.714 +71 0.737 +72 0.760 +73 0.783 +74 0.807 +75 0.832 +76 0.857 +77 0.884 +78 0.912 +79 0.941 +80 0.971 +81 1.004 +82 1.038 +83 1.074 +84 1.112 +85 1.153 +86 1.196 +87 1.242 +88 1.291 +89 1.344 +90 1.400 +1 -1.525 +2 -1.564 +3 -1.596 +4 -1.620 +5 -1.638 +6 -1.650 +7 -1.656 +8 -1.656 +9 -1.651 +10 -1.641 +11 -1.626 +12 -1.607 +13 -1.584 +14 -1.557 +15 -1.526 +16 -1.492 +17 -1.456 +18 -1.416 +19 -1.374 +20 -1.329 +21 -1.283 +22 -1.235 +23 -1.184 +24 -1.133 +25 -1.080 +26 -1.026 +27 -0.972 +28 -0.916 +29 -0.860 +30 -0.804 +31 -0.747 +32 -0.691 +33 -0.634 +34 -0.578 +35 -0.522 +36 -0.466 +37 -0.411 +38 -0.357 +39 -0.303 +40 -0.250 +41 -0.198 +42 -0.147 +43 -0.097 +44 -0.048 +45 0.000 +46 0.047 +47 0.092 +48 0.136 +49 0.179 +50 0.220 +51 0.261 +52 0.300 +53 0.337 +54 0.374 +55 0.409 +56 0.443 +57 0.476 +58 0.507 +59 0.538 +60 0.567 +61 0.596 +62 0.624 +63 0.650 +64 0.676 +65 0.702 +66 0.727 +67 0.752 +68 0.776 +69 0.800 +70 0.824 +71 0.848 +72 0.873 +73 0.897 +74 0.923 +75 0.949 +76 0.976 +77 1.004 +78 1.033 +79 1.064 +80 1.097 +81 1.131 +82 1.168 +83 1.207 +84 1.248 +85 1.292 +86 1.340 +87 1.390 +88 1.445 +89 1.503 +90 1.565 +1 -1.494 +2 -1.520 +3 -1.539 +4 -1.553 +5 -1.561 +6 -1.564 +7 -1.562 +8 -1.555 +9 -1.545 +10 -1.529 +11 -1.511 +12 -1.488 +13 -1.462 +14 -1.433 +15 -1.401 +16 -1.367 +17 -1.330 +18 -1.291 +19 -1.249 +20 -1.206 +21 -1.162 +22 -1.116 +23 -1.068 +24 -1.020 +25 -0.971 +26 -0.921 +27 -0.870 +28 -0.819 +29 -0.768 +30 -0.716 +31 -0.664 +32 -0.613 +33 -0.562 +34 -0.511 +35 -0.461 +36 -0.411 +37 -0.362 +38 -0.313 +39 -0.265 +40 -0.219 +41 -0.173 +42 -0.128 +43 -0.084 +44 -0.041 +45 0.000 +46 0.040 +47 0.079 +48 0.117 +49 0.154 +50 0.189 +51 0.223 +52 0.255 +53 0.287 +54 0.317 +55 0.346 +56 0.373 +57 0.400 +58 0.425 +59 0.449 +60 0.472 +61 0.494 +62 0.515 +63 0.535 +64 0.555 +65 0.574 +66 0.592 +67 0.609 +68 0.627 +69 0.643 +70 0.660 +71 0.677 +72 0.693 +73 0.710 +74 0.727 +75 0.745 +76 0.763 +77 0.782 +78 0.801 +79 0.822 +80 0.845 +81 0.868 +82 0.894 +83 0.921 +84 0.950 +85 0.982 +86 1.016 +87 1.052 +88 1.092 +89 1.135 +90 1.181 +1 -1.671 +2 -1.687 +3 -1.697 +4 -1.702 +5 -1.702 +6 -1.697 +7 -1.687 +8 -1.673 +9 -1.654 +10 -1.632 +11 -1.606 +12 -1.577 +13 -1.545 +14 -1.510 +15 -1.472 +16 -1.432 +17 -1.390 +18 -1.346 +19 -1.300 +20 -1.252 +21 -1.203 +22 -1.153 +23 -1.102 +24 -1.049 +25 -0.997 +26 -0.943 +27 -0.890 +28 -0.836 +29 -0.782 +30 -0.728 +31 -0.674 +32 -0.621 +33 -0.568 +34 -0.516 +35 -0.464 +36 -0.413 +37 -0.362 +38 -0.313 +39 -0.265 +40 -0.218 +41 -0.172 +42 -0.127 +43 -0.083 +44 -0.041 +45 0.000 +46 0.040 +47 0.078 +48 0.114 +49 0.150 +50 0.183 +51 0.216 +52 0.246 +53 0.276 +54 0.304 +55 0.330 +56 0.355 +57 0.379 +58 0.401 +59 0.422 +60 0.442 +61 0.461 +62 0.478 +63 0.495 +64 0.510 +65 0.524 +66 0.538 +67 0.551 +68 0.564 +69 0.576 +70 0.587 +71 0.598 +72 0.609 +73 0.620 +74 0.631 +75 0.643 +76 0.655 +77 0.667 +78 0.680 +79 0.694 +80 0.709 +81 0.726 +82 0.743 +83 0.763 +84 0.784 +85 0.807 +86 0.833 +87 0.861 +88 0.892 +89 0.925 +90 0.962 +1 -1.535 +2 -1.534 +3 -1.528 +4 -1.520 +5 -1.507 +6 -1.491 +7 -1.472 +8 -1.450 +9 -1.426 +10 -1.398 +11 -1.369 +12 -1.337 +13 -1.303 +14 -1.268 +15 -1.231 +16 -1.192 +17 -1.152 +18 -1.111 +19 -1.069 +20 -1.026 +21 -0.982 +22 -0.937 +23 -0.893 +24 -0.847 +25 -0.802 +26 -0.757 +27 -0.711 +28 -0.666 +29 -0.621 +30 -0.576 +31 -0.532 +32 -0.488 +33 -0.445 +34 -0.402 +35 -0.361 +36 -0.320 +37 -0.280 +38 -0.241 +39 -0.203 +40 -0.166 +41 -0.131 +42 -0.096 +43 -0.063 +44 -0.031 +45 0.000 +46 0.029 +47 0.057 +48 0.084 +49 0.109 +50 0.133 +51 0.156 +52 0.177 +53 0.197 +54 0.215 +55 0.233 +56 0.248 +57 0.263 +58 0.276 +59 0.288 +60 0.299 +61 0.308 +62 0.317 +63 0.324 +64 0.330 +65 0.336 +66 0.340 +67 0.344 +68 0.347 +69 0.349 +70 0.351 +71 0.352 +72 0.353 +73 0.354 +74 0.354 +75 0.354 +76 0.355 +77 0.355 +78 0.356 +79 0.357 +80 0.358 +81 0.361 +82 0.364 +83 0.368 +84 0.373 +85 0.379 +86 0.387 +87 0.396 +88 0.407 +89 0.420 +90 0.435 +1 -1.529 +2 -1.534 +3 -1.535 +4 -1.532 +5 -1.525 +6 -1.514 +7 -1.499 +8 -1.481 +9 -1.460 +10 -1.436 +11 -1.409 +12 -1.379 +13 -1.348 +14 -1.314 +15 -1.278 +16 -1.240 +17 -1.200 +18 -1.160 +19 -1.118 +20 -1.074 +21 -1.030 +22 -0.985 +23 -0.940 +24 -0.894 +25 -0.847 +26 -0.800 +27 -0.753 +28 -0.706 +29 -0.660 +30 -0.613 +31 -0.567 +32 -0.521 +33 -0.476 +34 -0.431 +35 -0.387 +36 -0.344 +37 -0.301 +38 -0.260 +39 -0.219 +40 -0.180 +41 -0.141 +42 -0.104 +43 -0.068 +44 -0.034 +45 0.000 +46 0.032 +47 0.063 +48 0.093 +49 0.121 +50 0.148 +51 0.173 +52 0.197 +53 0.220 +54 0.241 +55 0.261 +56 0.280 +57 0.298 +58 0.314 +59 0.329 +60 0.343 +61 0.355 +62 0.367 +63 0.378 +64 0.387 +65 0.396 +66 0.404 +67 0.411 +68 0.418 +69 0.424 +70 0.429 +71 0.434 +72 0.439 +73 0.444 +74 0.448 +75 0.453 +76 0.458 +77 0.463 +78 0.468 +79 0.474 +80 0.481 +81 0.489 +82 0.498 +83 0.508 +84 0.519 +85 0.532 +86 0.546 +87 0.563 +88 0.581 +89 0.602 +90 0.625 +1 -1.323 +2 -1.335 +3 -1.343 +4 -1.346 +5 -1.345 +6 -1.340 +7 -1.332 +8 -1.320 +9 -1.305 +10 -1.288 +11 -1.267 +12 -1.244 +13 -1.218 +14 -1.190 +15 -1.160 +16 -1.128 +17 -1.095 +18 -1.060 +19 -1.023 +20 -0.985 +21 -0.947 +22 -0.907 +23 -0.867 +24 -0.825 +25 -0.784 +26 -0.742 +27 -0.699 +28 -0.657 +29 -0.614 +30 -0.572 +31 -0.530 +32 -0.488 +33 -0.446 +34 -0.405 +35 -0.364 +36 -0.324 +37 -0.284 +38 -0.246 +39 -0.208 +40 -0.171 +41 -0.135 +42 -0.099 +43 -0.065 +44 -0.032 +45 0.000 +46 0.031 +47 0.061 +48 0.090 +49 0.117 +50 0.144 +51 0.169 +52 0.193 +53 0.216 +54 0.238 +55 0.258 +56 0.278 +57 0.296 +58 0.313 +59 0.330 +60 0.345 +61 0.360 +62 0.373 +63 0.386 +64 0.398 +65 0.409 +66 0.420 +67 0.430 +68 0.439 +69 0.448 +70 0.457 +71 0.466 +72 0.474 +73 0.482 +74 0.491 +75 0.500 +76 0.509 +77 0.518 +78 0.528 +79 0.539 +80 0.551 +81 0.563 +82 0.577 +83 0.592 +84 0.609 +85 0.627 +86 0.646 +87 0.668 +88 0.692 +89 0.718 +90 0.747 +1 -1.241 +2 -1.258 +3 -1.270 +4 -1.278 +5 -1.281 +6 -1.280 +7 -1.276 +8 -1.268 +9 -1.257 +10 -1.242 +11 -1.225 +12 -1.205 +13 -1.182 +14 -1.157 +15 -1.130 +16 -1.100 +17 -1.069 +18 -1.037 +19 -1.002 +20 -0.967 +21 -0.930 +22 -0.892 +23 -0.853 +24 -0.814 +25 -0.774 +26 -0.733 +27 -0.692 +28 -0.651 +29 -0.609 +30 -0.568 +31 -0.527 +32 -0.485 +33 -0.444 +34 -0.404 +35 -0.364 +36 -0.324 +37 -0.285 +38 -0.246 +39 -0.209 +40 -0.172 +41 -0.135 +42 -0.100 +43 -0.066 +44 -0.032 +45 0.000 +46 0.031 +47 0.062 +48 0.091 +49 0.119 +50 0.146 +51 0.172 +52 0.197 +53 0.221 +54 0.244 +55 0.266 +56 0.287 +57 0.306 +58 0.325 +59 0.343 +60 0.360 +61 0.376 +62 0.391 +63 0.406 +64 0.419 +65 0.433 +66 0.445 +67 0.457 +68 0.469 +69 0.481 +70 0.492 +71 0.503 +72 0.514 +73 0.525 +74 0.537 +75 0.549 +76 0.561 +77 0.573 +78 0.587 +79 0.601 +80 0.616 +81 0.632 +82 0.650 +83 0.669 +84 0.689 +85 0.712 +86 0.736 +87 0.762 +88 0.790 +89 0.821 +90 0.855 +1 -0.967 +2 -0.988 +3 -1.004 +4 -1.016 +5 -1.024 +6 -1.029 +7 -1.030 +8 -1.027 +9 -1.022 +10 -1.014 +11 -1.003 +12 -0.990 +13 -0.974 +14 -0.956 +15 -0.936 +16 -0.914 +17 -0.890 +18 -0.865 +19 -0.838 +20 -0.810 +21 -0.781 +22 -0.751 +23 -0.719 +24 -0.687 +25 -0.655 +26 -0.622 +27 -0.588 +28 -0.554 +29 -0.519 +30 -0.485 +31 -0.450 +32 -0.416 +33 -0.382 +34 -0.347 +35 -0.313 +36 -0.280 +37 -0.246 +38 -0.213 +39 -0.181 +40 -0.149 +41 -0.118 +42 -0.087 +43 -0.058 +44 -0.028 +45 0.000 +46 0.028 +47 0.055 +48 0.081 +49 0.106 +50 0.130 +51 0.154 +52 0.177 +53 0.199 +54 0.220 +55 0.240 +56 0.260 +57 0.278 +58 0.296 +59 0.314 +60 0.330 +61 0.347 +62 0.362 +63 0.377 +64 0.391 +65 0.406 +66 0.419 +67 0.433 +68 0.446 +69 0.459 +70 0.472 +71 0.485 +72 0.498 +73 0.512 +74 0.525 +75 0.539 +76 0.554 +77 0.569 +78 0.585 +79 0.602 +80 0.619 +81 0.638 +82 0.658 +83 0.680 +84 0.703 +85 0.727 +86 0.754 +87 0.782 +88 0.813 +89 0.846 +90 0.881 +1 -0.939 +2 -0.968 +3 -0.991 +4 -1.010 +5 -1.025 +6 -1.035 +7 -1.042 +8 -1.044 +9 -1.044 +10 -1.039 +11 -1.032 +12 -1.022 +13 -1.009 +14 -0.993 +15 -0.975 +16 -0.954 +17 -0.932 +18 -0.908 +19 -0.882 +20 -0.854 +21 -0.825 +22 -0.795 +23 -0.763 +24 -0.731 +25 -0.697 +26 -0.663 +27 -0.628 +28 -0.593 +29 -0.557 +30 -0.521 +31 -0.485 +32 -0.448 +33 -0.412 +34 -0.376 +35 -0.339 +36 -0.303 +37 -0.268 +38 -0.232 +39 -0.198 +40 -0.163 +41 -0.129 +42 -0.096 +43 -0.063 +44 -0.031 +45 0.000 +46 0.031 +47 0.060 +48 0.090 +49 0.118 +50 0.145 +51 0.172 +52 0.198 +53 0.223 +54 0.247 +55 0.271 +56 0.294 +57 0.316 +58 0.338 +59 0.358 +60 0.379 +61 0.398 +62 0.418 +63 0.436 +64 0.455 +65 0.473 +66 0.490 +67 0.508 +68 0.525 +69 0.543 +70 0.560 +71 0.578 +72 0.595 +73 0.614 +74 0.632 +75 0.652 +76 0.672 +77 0.692 +78 0.714 +79 0.737 +80 0.761 +81 0.786 +82 0.813 +83 0.841 +84 0.872 +85 0.904 +86 0.938 +87 0.975 +88 1.014 +89 1.056 +90 1.101 +1 -0.673 +2 -0.701 +3 -0.725 +4 -0.745 +5 -0.761 +6 -0.774 +7 -0.783 +8 -0.789 +9 -0.792 +10 -0.792 +11 -0.790 +12 -0.785 +13 -0.777 +14 -0.768 +15 -0.756 +16 -0.742 +17 -0.727 +18 -0.709 +19 -0.691 +20 -0.671 +21 -0.649 +22 -0.627 +23 -0.603 +24 -0.578 +25 -0.553 +26 -0.527 +27 -0.500 +28 -0.473 +29 -0.445 +30 -0.417 +31 -0.389 +32 -0.360 +33 -0.331 +34 -0.303 +35 -0.274 +36 -0.245 +37 -0.217 +38 -0.189 +39 -0.161 +40 -0.133 +41 -0.105 +42 -0.078 +43 -0.052 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.074 +49 0.098 +50 0.121 +51 0.143 +52 0.165 +53 0.186 +54 0.207 +55 0.228 +56 0.248 +57 0.267 +58 0.286 +59 0.304 +60 0.322 +61 0.340 +62 0.357 +63 0.374 +64 0.391 +65 0.408 +66 0.425 +67 0.441 +68 0.458 +69 0.474 +70 0.491 +71 0.508 +72 0.525 +73 0.543 +74 0.561 +75 0.580 +76 0.599 +77 0.620 +78 0.641 +79 0.663 +80 0.686 +81 0.710 +82 0.736 +83 0.763 +84 0.792 +85 0.823 +86 0.855 +87 0.889 +88 0.926 +89 0.965 +90 1.006 +1 -0.715 +2 -0.750 +3 -0.780 +4 -0.806 +5 -0.827 +6 -0.844 +7 -0.857 +8 -0.866 +9 -0.872 +10 -0.875 +11 -0.874 +12 -0.870 +13 -0.864 +14 -0.854 +15 -0.843 +16 -0.829 +17 -0.813 +18 -0.794 +19 -0.775 +20 -0.753 +21 -0.730 +22 -0.705 +23 -0.679 +24 -0.652 +25 -0.624 +26 -0.595 +27 -0.566 +28 -0.535 +29 -0.504 +30 -0.473 +31 -0.441 +32 -0.409 +33 -0.377 +34 -0.345 +35 -0.312 +36 -0.280 +37 -0.248 +38 -0.215 +39 -0.184 +40 -0.152 +41 -0.121 +42 -0.090 +43 -0.059 +44 -0.029 +45 0.000 +46 0.029 +47 0.057 +48 0.085 +49 0.113 +50 0.139 +51 0.166 +52 0.191 +53 0.216 +54 0.241 +55 0.265 +56 0.288 +57 0.311 +58 0.333 +59 0.355 +60 0.377 +61 0.398 +62 0.419 +63 0.440 +64 0.460 +65 0.480 +66 0.500 +67 0.521 +68 0.541 +69 0.561 +70 0.582 +71 0.603 +72 0.624 +73 0.646 +74 0.669 +75 0.692 +76 0.716 +77 0.741 +78 0.767 +79 0.795 +80 0.823 +81 0.853 +82 0.885 +83 0.919 +84 0.954 +85 0.991 +86 1.031 +87 1.073 +88 1.118 +89 1.165 +90 1.215 +1 -0.495 +2 -0.527 +3 -0.555 +4 -0.579 +5 -0.600 +6 -0.617 +7 -0.631 +8 -0.642 +9 -0.649 +10 -0.654 +11 -0.657 +12 -0.656 +13 -0.654 +14 -0.649 +15 -0.642 +16 -0.633 +17 -0.623 +18 -0.610 +19 -0.596 +20 -0.581 +21 -0.564 +22 -0.547 +23 -0.528 +24 -0.508 +25 -0.487 +26 -0.465 +27 -0.443 +28 -0.420 +29 -0.396 +30 -0.372 +31 -0.348 +32 -0.323 +33 -0.298 +34 -0.273 +35 -0.247 +36 -0.222 +37 -0.197 +38 -0.172 +39 -0.146 +40 -0.121 +41 -0.097 +42 -0.072 +43 -0.048 +44 -0.024 +45 0.000 +46 0.023 +47 0.046 +48 0.069 +49 0.091 +50 0.113 +51 0.135 +52 0.156 +53 0.177 +54 0.197 +55 0.217 +56 0.237 +57 0.256 +58 0.275 +59 0.294 +60 0.313 +61 0.331 +62 0.349 +63 0.368 +64 0.386 +65 0.404 +66 0.422 +67 0.440 +68 0.458 +69 0.476 +70 0.495 +71 0.514 +72 0.534 +73 0.554 +74 0.574 +75 0.595 +76 0.617 +77 0.640 +78 0.664 +79 0.689 +80 0.715 +81 0.742 +82 0.771 +83 0.801 +84 0.833 +85 0.867 +86 0.902 +87 0.940 +88 0.980 +89 1.022 +90 1.066 +1 -0.562 +2 -0.597 +3 -0.627 +4 -0.653 +5 -0.675 +6 -0.693 +7 -0.708 +8 -0.719 +9 -0.727 +10 -0.732 +11 -0.734 +12 -0.733 +13 -0.729 +14 -0.724 +15 -0.716 +16 -0.705 +17 -0.693 +18 -0.679 +19 -0.663 +20 -0.646 +21 -0.627 +22 -0.607 +23 -0.586 +24 -0.563 +25 -0.540 +26 -0.516 +27 -0.491 +28 -0.465 +29 -0.439 +30 -0.412 +31 -0.385 +32 -0.357 +33 -0.330 +34 -0.302 +35 -0.274 +36 -0.246 +37 -0.218 +38 -0.190 +39 -0.162 +40 -0.134 +41 -0.107 +42 -0.080 +43 -0.053 +44 -0.026 +45 0.000 +46 0.026 +47 0.051 +48 0.076 +49 0.101 +50 0.125 +51 0.148 +52 0.171 +53 0.194 +54 0.217 +55 0.238 +56 0.260 +57 0.281 +58 0.302 +59 0.322 +60 0.342 +61 0.362 +62 0.382 +63 0.402 +64 0.421 +65 0.441 +66 0.460 +67 0.479 +68 0.499 +69 0.519 +70 0.539 +71 0.559 +72 0.580 +73 0.602 +74 0.624 +75 0.647 +76 0.670 +77 0.695 +78 0.720 +79 0.747 +80 0.775 +81 0.804 +82 0.835 +83 0.868 +84 0.902 +85 0.938 +86 0.977 +87 1.017 +88 1.060 +89 1.105 +90 1.153 +1 -0.337 +2 -0.366 +3 -0.391 +4 -0.414 +5 -0.433 +6 -0.449 +7 -0.463 +8 -0.474 +9 -0.483 +10 -0.489 +11 -0.493 +12 -0.495 +13 -0.495 +14 -0.493 +15 -0.490 +16 -0.484 +17 -0.478 +18 -0.470 +19 -0.460 +20 -0.449 +21 -0.437 +22 -0.424 +23 -0.411 +24 -0.396 +25 -0.380 +26 -0.364 +27 -0.347 +28 -0.329 +29 -0.311 +30 -0.293 +31 -0.274 +32 -0.255 +33 -0.236 +34 -0.216 +35 -0.196 +36 -0.177 +37 -0.157 +38 -0.137 +39 -0.117 +40 -0.097 +41 -0.077 +42 -0.058 +43 -0.038 +44 -0.019 +45 0.000 +46 0.019 +47 0.038 +48 0.056 +49 0.074 +50 0.092 +51 0.110 +52 0.127 +53 0.144 +54 0.161 +55 0.178 +56 0.195 +57 0.211 +58 0.227 +59 0.243 +60 0.259 +61 0.275 +62 0.290 +63 0.306 +64 0.322 +65 0.337 +66 0.353 +67 0.369 +68 0.385 +69 0.401 +70 0.418 +71 0.435 +72 0.452 +73 0.470 +74 0.489 +75 0.508 +76 0.527 +77 0.548 +78 0.569 +79 0.591 +80 0.615 +81 0.639 +82 0.665 +83 0.692 +84 0.720 +85 0.750 +86 0.781 +87 0.814 +88 0.849 +89 0.886 +90 0.925 +1 -0.496 +2 -0.529 +3 -0.558 +4 -0.583 +5 -0.604 +6 -0.622 +7 -0.636 +8 -0.648 +9 -0.656 +10 -0.661 +11 -0.664 +12 -0.664 +13 -0.662 +14 -0.657 +15 -0.650 +16 -0.642 +17 -0.631 +18 -0.619 +19 -0.605 +20 -0.589 +21 -0.573 +22 -0.555 +23 -0.535 +24 -0.515 +25 -0.494 +26 -0.472 +27 -0.450 +28 -0.426 +29 -0.402 +30 -0.378 +31 -0.353 +32 -0.328 +33 -0.303 +34 -0.277 +35 -0.252 +36 -0.226 +37 -0.200 +38 -0.175 +39 -0.149 +40 -0.124 +41 -0.098 +42 -0.073 +43 -0.049 +44 -0.024 +45 0.000 +46 0.024 +47 0.047 +48 0.070 +49 0.093 +50 0.115 +51 0.137 +52 0.159 +53 0.180 +54 0.201 +55 0.222 +56 0.242 +57 0.261 +58 0.281 +59 0.300 +60 0.319 +61 0.338 +62 0.357 +63 0.375 +64 0.394 +65 0.412 +66 0.431 +67 0.449 +68 0.468 +69 0.487 +70 0.506 +71 0.526 +72 0.546 +73 0.566 +74 0.587 +75 0.609 +76 0.632 +77 0.655 +78 0.680 +79 0.705 +80 0.732 +81 0.760 +82 0.790 +83 0.821 +84 0.854 +85 0.888 +86 0.925 +87 0.963 +88 1.004 +89 1.047 +90 1.093 +1 -0.346 +2 -0.376 +3 -0.402 +4 -0.426 +5 -0.446 +6 -0.463 +7 -0.478 +8 -0.489 +9 -0.499 +10 -0.505 +11 -0.510 +12 -0.512 +13 -0.512 +14 -0.510 +15 -0.507 +16 -0.502 +17 -0.495 +18 -0.486 +19 -0.477 +20 -0.466 +21 -0.453 +22 -0.440 +23 -0.426 +24 -0.410 +25 -0.394 +26 -0.377 +27 -0.360 +28 -0.342 +29 -0.323 +30 -0.304 +31 -0.285 +32 -0.265 +33 -0.245 +34 -0.224 +35 -0.204 +36 -0.183 +37 -0.163 +38 -0.142 +39 -0.121 +40 -0.101 +41 -0.080 +42 -0.060 +43 -0.040 +44 -0.020 +45 0.000 +46 0.020 +47 0.039 +48 0.058 +49 0.077 +50 0.096 +51 0.114 +52 0.132 +53 0.150 +54 0.168 +55 0.185 +56 0.202 +57 0.219 +58 0.236 +59 0.253 +60 0.269 +61 0.286 +62 0.302 +63 0.318 +64 0.334 +65 0.351 +66 0.367 +67 0.384 +68 0.401 +69 0.418 +70 0.435 +71 0.453 +72 0.471 +73 0.489 +74 0.509 +75 0.529 +76 0.549 +77 0.570 +78 0.593 +79 0.616 +80 0.640 +81 0.666 +82 0.692 +83 0.721 +84 0.750 +85 0.781 +86 0.814 +87 0.848 +88 0.885 +89 0.923 +90 0.964 +1 -0.497 +2 -0.530 +3 -0.559 +4 -0.584 +5 -0.605 +6 -0.623 +7 -0.637 +8 -0.648 +9 -0.656 +10 -0.662 +11 -0.664 +12 -0.664 +13 -0.662 +14 -0.657 +15 -0.651 +16 -0.642 +17 -0.631 +18 -0.619 +19 -0.605 +20 -0.590 +21 -0.573 +22 -0.555 +23 -0.536 +24 -0.515 +25 -0.494 +26 -0.472 +27 -0.450 +28 -0.426 +29 -0.402 +30 -0.378 +31 -0.353 +32 -0.328 +33 -0.303 +34 -0.277 +35 -0.252 +36 -0.226 +37 -0.200 +38 -0.175 +39 -0.149 +40 -0.124 +41 -0.098 +42 -0.073 +43 -0.049 +44 -0.024 +45 0.000 +46 0.024 +47 0.047 +48 0.070 +49 0.093 +50 0.115 +51 0.137 +52 0.159 +53 0.180 +54 0.201 +55 0.222 +56 0.242 +57 0.261 +58 0.281 +59 0.300 +60 0.319 +61 0.338 +62 0.357 +63 0.375 +64 0.394 +65 0.412 +66 0.431 +67 0.449 +68 0.468 +69 0.487 +70 0.506 +71 0.526 +72 0.546 +73 0.566 +74 0.587 +75 0.609 +76 0.632 +77 0.655 +78 0.680 +79 0.706 +80 0.732 +81 0.760 +82 0.790 +83 0.821 +84 0.854 +85 0.888 +86 0.925 +87 0.964 +88 1.004 +89 1.047 +90 1.093 +1 -0.338 +2 -0.366 +3 -0.392 +4 -0.415 +5 -0.434 +6 -0.451 +7 -0.464 +8 -0.476 +9 -0.484 +10 -0.491 +11 -0.495 +12 -0.497 +13 -0.497 +14 -0.495 +15 -0.491 +16 -0.486 +17 -0.479 +18 -0.471 +19 -0.462 +20 -0.451 +21 -0.439 +22 -0.426 +23 -0.412 +24 -0.397 +25 -0.382 +26 -0.365 +27 -0.348 +28 -0.331 +29 -0.313 +30 -0.294 +31 -0.275 +32 -0.256 +33 -0.236 +34 -0.217 +35 -0.197 +36 -0.177 +37 -0.157 +38 -0.137 +39 -0.117 +40 -0.097 +41 -0.078 +42 -0.058 +43 -0.038 +44 -0.019 +45 0.000 +46 0.019 +47 0.038 +48 0.056 +49 0.074 +50 0.092 +51 0.110 +52 0.127 +53 0.145 +54 0.162 +55 0.178 +56 0.195 +57 0.211 +58 0.227 +59 0.243 +60 0.259 +61 0.275 +62 0.291 +63 0.306 +64 0.322 +65 0.337 +66 0.353 +67 0.369 +68 0.385 +69 0.401 +70 0.418 +71 0.435 +72 0.452 +73 0.470 +74 0.489 +75 0.508 +76 0.527 +77 0.548 +78 0.569 +79 0.591 +80 0.615 +81 0.639 +82 0.665 +83 0.691 +84 0.720 +85 0.750 +86 0.781 +87 0.814 +88 0.849 +89 0.886 +90 0.925 +1 -0.565 +2 -0.600 +3 -0.629 +4 -0.655 +5 -0.677 +6 -0.695 +7 -0.709 +8 -0.720 +9 -0.728 +10 -0.733 +11 -0.735 +12 -0.734 +13 -0.730 +14 -0.724 +15 -0.716 +16 -0.706 +17 -0.694 +18 -0.680 +19 -0.664 +20 -0.646 +21 -0.627 +22 -0.607 +23 -0.586 +24 -0.564 +25 -0.540 +26 -0.516 +27 -0.491 +28 -0.465 +29 -0.439 +30 -0.412 +31 -0.385 +32 -0.357 +33 -0.330 +34 -0.302 +35 -0.274 +36 -0.246 +37 -0.217 +38 -0.190 +39 -0.162 +40 -0.134 +41 -0.107 +42 -0.080 +43 -0.053 +44 -0.026 +45 0.000 +46 0.026 +47 0.051 +48 0.076 +49 0.101 +50 0.125 +51 0.148 +52 0.171 +53 0.194 +54 0.216 +55 0.238 +56 0.260 +57 0.281 +58 0.302 +59 0.322 +60 0.342 +61 0.362 +62 0.382 +63 0.402 +64 0.421 +65 0.441 +66 0.460 +67 0.479 +68 0.499 +69 0.519 +70 0.539 +71 0.559 +72 0.580 +73 0.602 +74 0.624 +75 0.647 +76 0.670 +77 0.695 +78 0.720 +79 0.747 +80 0.775 +81 0.805 +82 0.835 +83 0.868 +84 0.902 +85 0.938 +86 0.977 +87 1.017 +88 1.060 +89 1.105 +90 1.153 +1 -0.499 +2 -0.531 +3 -0.559 +4 -0.583 +5 -0.604 +6 -0.621 +7 -0.635 +8 -0.646 +9 -0.653 +10 -0.658 +11 -0.661 +12 -0.660 +13 -0.658 +14 -0.653 +15 -0.646 +16 -0.637 +17 -0.626 +18 -0.614 +19 -0.600 +20 -0.584 +21 -0.568 +22 -0.550 +23 -0.531 +24 -0.510 +25 -0.489 +26 -0.468 +27 -0.445 +28 -0.422 +29 -0.398 +30 -0.374 +31 -0.349 +32 -0.325 +33 -0.299 +34 -0.274 +35 -0.249 +36 -0.223 +37 -0.198 +38 -0.172 +39 -0.147 +40 -0.122 +41 -0.097 +42 -0.072 +43 -0.048 +44 -0.024 +45 0.000 +46 0.024 +47 0.047 +48 0.069 +49 0.092 +50 0.114 +51 0.135 +52 0.157 +53 0.178 +54 0.198 +55 0.218 +56 0.238 +57 0.257 +58 0.276 +59 0.295 +60 0.314 +61 0.332 +62 0.351 +63 0.369 +64 0.387 +65 0.405 +66 0.423 +67 0.441 +68 0.459 +69 0.477 +70 0.496 +71 0.515 +72 0.534 +73 0.554 +74 0.575 +75 0.596 +76 0.618 +77 0.641 +78 0.665 +79 0.690 +80 0.716 +81 0.743 +82 0.772 +83 0.802 +84 0.834 +85 0.867 +86 0.903 +87 0.940 +88 0.980 +89 1.022 +90 1.066 +1 -0.718 +2 -0.753 +3 -0.783 +4 -0.809 +5 -0.830 +6 -0.847 +7 -0.860 +8 -0.869 +9 -0.875 +10 -0.877 +11 -0.876 +12 -0.872 +13 -0.866 +14 -0.857 +15 -0.845 +16 -0.831 +17 -0.815 +18 -0.796 +19 -0.776 +20 -0.755 +21 -0.731 +22 -0.707 +23 -0.681 +24 -0.654 +25 -0.626 +26 -0.597 +27 -0.567 +28 -0.536 +29 -0.505 +30 -0.474 +31 -0.442 +32 -0.410 +33 -0.378 +34 -0.345 +35 -0.313 +36 -0.280 +37 -0.248 +38 -0.216 +39 -0.184 +40 -0.152 +41 -0.121 +42 -0.090 +43 -0.060 +44 -0.030 +45 0.000 +46 0.029 +47 0.058 +48 0.085 +49 0.113 +50 0.140 +51 0.166 +52 0.192 +53 0.217 +54 0.241 +55 0.265 +56 0.289 +57 0.311 +58 0.334 +59 0.356 +60 0.378 +61 0.399 +62 0.420 +63 0.440 +64 0.461 +65 0.481 +66 0.501 +67 0.522 +68 0.542 +69 0.562 +70 0.583 +71 0.604 +72 0.625 +73 0.647 +74 0.670 +75 0.693 +76 0.717 +77 0.742 +78 0.768 +79 0.795 +80 0.824 +81 0.854 +82 0.886 +83 0.919 +84 0.955 +85 0.992 +86 1.031 +87 1.073 +88 1.118 +89 1.165 +90 1.215 +1 -0.676 +2 -0.704 +3 -0.728 +4 -0.748 +5 -0.764 +6 -0.777 +7 -0.786 +8 -0.792 +9 -0.795 +10 -0.795 +11 -0.792 +12 -0.787 +13 -0.780 +14 -0.770 +15 -0.758 +16 -0.744 +17 -0.729 +18 -0.711 +19 -0.693 +20 -0.672 +21 -0.651 +22 -0.628 +23 -0.605 +24 -0.580 +25 -0.554 +26 -0.528 +27 -0.501 +28 -0.474 +29 -0.446 +30 -0.418 +31 -0.390 +32 -0.361 +33 -0.332 +34 -0.303 +35 -0.275 +36 -0.246 +37 -0.217 +38 -0.189 +39 -0.161 +40 -0.133 +41 -0.106 +42 -0.079 +43 -0.052 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.074 +49 0.098 +50 0.121 +51 0.143 +52 0.165 +53 0.187 +54 0.208 +55 0.228 +56 0.248 +57 0.267 +58 0.286 +59 0.305 +60 0.323 +61 0.341 +62 0.358 +63 0.375 +64 0.392 +65 0.409 +66 0.425 +67 0.442 +68 0.459 +69 0.475 +70 0.492 +71 0.509 +72 0.526 +73 0.544 +74 0.562 +75 0.581 +76 0.601 +77 0.621 +78 0.642 +79 0.664 +80 0.687 +81 0.712 +82 0.737 +83 0.765 +84 0.794 +85 0.824 +86 0.857 +87 0.891 +88 0.928 +89 0.967 +90 1.008 +1 -0.941 +2 -0.970 +3 -0.994 +4 -1.013 +5 -1.028 +6 -1.039 +7 -1.045 +8 -1.048 +9 -1.047 +10 -1.043 +11 -1.036 +12 -1.025 +13 -1.012 +14 -0.996 +15 -0.978 +16 -0.958 +17 -0.935 +18 -0.911 +19 -0.885 +20 -0.857 +21 -0.828 +22 -0.798 +23 -0.766 +24 -0.733 +25 -0.700 +26 -0.666 +27 -0.631 +28 -0.595 +29 -0.559 +30 -0.523 +31 -0.487 +32 -0.450 +33 -0.414 +34 -0.377 +35 -0.341 +36 -0.305 +37 -0.269 +38 -0.233 +39 -0.198 +40 -0.164 +41 -0.130 +42 -0.096 +43 -0.064 +44 -0.031 +45 0.000 +46 0.031 +47 0.061 +48 0.090 +49 0.118 +50 0.146 +51 0.173 +52 0.199 +53 0.224 +54 0.248 +55 0.272 +56 0.295 +57 0.317 +58 0.339 +59 0.359 +60 0.380 +61 0.399 +62 0.419 +63 0.437 +64 0.456 +65 0.474 +66 0.491 +67 0.509 +68 0.526 +69 0.544 +70 0.561 +71 0.579 +72 0.596 +73 0.615 +74 0.633 +75 0.652 +76 0.672 +77 0.693 +78 0.715 +79 0.738 +80 0.762 +81 0.787 +82 0.814 +83 0.842 +84 0.873 +85 0.905 +86 0.939 +87 0.976 +88 1.015 +89 1.057 +90 1.102 +1 -0.971 +2 -0.991 +3 -1.007 +4 -1.019 +5 -1.027 +6 -1.031 +7 -1.032 +8 -1.030 +9 -1.025 +10 -1.017 +11 -1.006 +12 -0.992 +13 -0.976 +14 -0.958 +15 -0.938 +16 -0.916 +17 -0.892 +18 -0.867 +19 -0.840 +20 -0.812 +21 -0.783 +22 -0.752 +23 -0.721 +24 -0.689 +25 -0.656 +26 -0.623 +27 -0.589 +28 -0.555 +29 -0.521 +30 -0.486 +31 -0.451 +32 -0.417 +33 -0.382 +34 -0.348 +35 -0.314 +36 -0.280 +37 -0.247 +38 -0.214 +39 -0.181 +40 -0.150 +41 -0.118 +42 -0.088 +43 -0.058 +44 -0.028 +45 0.000 +46 0.028 +47 0.055 +48 0.081 +49 0.106 +50 0.131 +51 0.154 +52 0.177 +53 0.199 +54 0.220 +55 0.241 +56 0.260 +57 0.279 +58 0.297 +59 0.314 +60 0.331 +61 0.347 +62 0.363 +63 0.378 +64 0.392 +65 0.406 +66 0.420 +67 0.434 +68 0.447 +69 0.460 +70 0.473 +71 0.486 +72 0.499 +73 0.513 +74 0.526 +75 0.540 +76 0.555 +77 0.570 +78 0.586 +79 0.603 +80 0.621 +81 0.639 +82 0.659 +83 0.681 +84 0.704 +85 0.729 +86 0.755 +87 0.783 +88 0.814 +89 0.847 +90 0.882 +1 -1.244 +2 -1.261 +3 -1.273 +4 -1.281 +5 -1.284 +6 -1.283 +7 -1.279 +8 -1.271 +9 -1.259 +10 -1.245 +11 -1.227 +12 -1.207 +13 -1.184 +14 -1.159 +15 -1.132 +16 -1.103 +17 -1.071 +18 -1.039 +19 -1.004 +20 -0.969 +21 -0.932 +22 -0.894 +23 -0.855 +24 -0.815 +25 -0.775 +26 -0.734 +27 -0.693 +28 -0.652 +29 -0.611 +30 -0.569 +31 -0.528 +32 -0.486 +33 -0.445 +34 -0.404 +35 -0.364 +36 -0.324 +37 -0.285 +38 -0.247 +39 -0.209 +40 -0.172 +41 -0.136 +42 -0.100 +43 -0.066 +44 -0.032 +45 0.000 +46 0.031 +47 0.062 +48 0.091 +49 0.119 +50 0.147 +51 0.173 +52 0.198 +53 0.222 +54 0.245 +55 0.266 +56 0.287 +57 0.307 +58 0.326 +59 0.344 +60 0.360 +61 0.377 +62 0.392 +63 0.406 +64 0.420 +65 0.433 +66 0.446 +67 0.458 +68 0.470 +69 0.482 +70 0.493 +71 0.504 +72 0.515 +73 0.527 +74 0.538 +75 0.550 +76 0.562 +77 0.575 +78 0.588 +79 0.602 +80 0.618 +81 0.634 +82 0.651 +83 0.670 +84 0.691 +85 0.713 +86 0.737 +87 0.764 +88 0.792 +89 0.823 +90 0.857 +1 -1.326 +2 -1.338 +3 -1.346 +4 -1.349 +5 -1.348 +6 -1.343 +7 -1.335 +8 -1.323 +9 -1.308 +10 -1.290 +11 -1.269 +12 -1.246 +13 -1.220 +14 -1.192 +15 -1.162 +16 -1.130 +17 -1.097 +18 -1.062 +19 -1.025 +20 -0.987 +21 -0.948 +22 -0.909 +23 -0.868 +24 -0.827 +25 -0.785 +26 -0.743 +27 -0.701 +28 -0.658 +29 -0.616 +30 -0.573 +31 -0.531 +32 -0.489 +33 -0.447 +34 -0.405 +35 -0.365 +36 -0.324 +37 -0.285 +38 -0.246 +39 -0.208 +40 -0.171 +41 -0.135 +42 -0.100 +43 -0.065 +44 -0.032 +45 0.000 +46 0.031 +47 0.061 +48 0.090 +49 0.117 +50 0.144 +51 0.169 +52 0.193 +53 0.216 +54 0.238 +55 0.259 +56 0.278 +57 0.297 +58 0.314 +59 0.330 +60 0.346 +61 0.360 +62 0.374 +63 0.387 +64 0.399 +65 0.410 +66 0.420 +67 0.430 +68 0.440 +69 0.449 +70 0.458 +71 0.467 +72 0.475 +73 0.484 +74 0.492 +75 0.501 +76 0.510 +77 0.520 +78 0.530 +79 0.540 +80 0.552 +81 0.565 +82 0.579 +83 0.594 +84 0.610 +85 0.628 +86 0.648 +87 0.670 +88 0.694 +89 0.720 +90 0.749 +1 -1.532 +2 -1.538 +3 -1.539 +4 -1.535 +5 -1.528 +6 -1.517 +7 -1.502 +8 -1.484 +9 -1.462 +10 -1.438 +11 -1.411 +12 -1.382 +13 -1.350 +14 -1.316 +15 -1.280 +16 -1.242 +17 -1.202 +18 -1.161 +19 -1.119 +20 -1.076 +21 -1.032 +22 -0.987 +23 -0.941 +24 -0.895 +25 -0.848 +26 -0.801 +27 -0.754 +28 -0.708 +29 -0.661 +30 -0.614 +31 -0.568 +32 -0.522 +33 -0.476 +34 -0.432 +35 -0.388 +36 -0.344 +37 -0.302 +38 -0.260 +39 -0.220 +40 -0.180 +41 -0.142 +42 -0.104 +43 -0.068 +44 -0.034 +45 0.000 +46 0.032 +47 0.063 +48 0.093 +49 0.121 +50 0.148 +51 0.174 +52 0.198 +53 0.221 +54 0.242 +55 0.262 +56 0.281 +57 0.299 +58 0.315 +59 0.330 +60 0.344 +61 0.357 +62 0.368 +63 0.379 +64 0.389 +65 0.398 +66 0.406 +67 0.413 +68 0.419 +69 0.425 +70 0.431 +71 0.436 +72 0.441 +73 0.446 +74 0.450 +75 0.455 +76 0.460 +77 0.465 +78 0.471 +79 0.477 +80 0.484 +81 0.492 +82 0.501 +83 0.511 +84 0.522 +85 0.535 +86 0.549 +87 0.566 +88 0.584 +89 0.605 +90 0.628 +1 -1.537 +2 -1.536 +3 -1.531 +4 -1.522 +5 -1.510 +6 -1.494 +7 -1.475 +8 -1.454 +9 -1.429 +10 -1.402 +11 -1.372 +12 -1.341 +13 -1.307 +14 -1.271 +15 -1.234 +16 -1.195 +17 -1.155 +18 -1.114 +19 -1.072 +20 -1.029 +21 -0.985 +22 -0.940 +23 -0.895 +24 -0.850 +25 -0.805 +26 -0.759 +27 -0.713 +28 -0.668 +29 -0.623 +30 -0.578 +31 -0.534 +32 -0.490 +33 -0.446 +34 -0.404 +35 -0.362 +36 -0.321 +37 -0.281 +38 -0.242 +39 -0.204 +40 -0.167 +41 -0.131 +42 -0.096 +43 -0.063 +44 -0.031 +45 0.000 +46 0.030 +47 0.058 +48 0.085 +49 0.110 +50 0.134 +51 0.157 +52 0.178 +53 0.198 +54 0.216 +55 0.234 +56 0.249 +57 0.264 +58 0.277 +59 0.289 +60 0.300 +61 0.310 +62 0.318 +63 0.326 +64 0.332 +65 0.337 +66 0.342 +67 0.346 +68 0.349 +69 0.351 +70 0.353 +71 0.354 +72 0.355 +73 0.356 +74 0.356 +75 0.357 +76 0.357 +77 0.358 +78 0.358 +79 0.359 +80 0.361 +81 0.364 +82 0.367 +83 0.371 +84 0.376 +85 0.382 +86 0.390 +87 0.400 +88 0.411 +89 0.424 +90 0.439 +1 -1.673 +2 -1.689 +3 -1.699 +4 -1.704 +5 -1.704 +6 -1.699 +7 -1.689 +8 -1.675 +9 -1.656 +10 -1.634 +11 -1.608 +12 -1.579 +13 -1.547 +14 -1.512 +15 -1.474 +16 -1.434 +17 -1.392 +18 -1.347 +19 -1.301 +20 -1.254 +21 -1.204 +22 -1.154 +23 -1.103 +24 -1.051 +25 -0.998 +26 -0.945 +27 -0.891 +28 -0.837 +29 -0.783 +30 -0.729 +31 -0.675 +32 -0.622 +33 -0.569 +34 -0.516 +35 -0.464 +36 -0.413 +37 -0.363 +38 -0.314 +39 -0.265 +40 -0.218 +41 -0.172 +42 -0.127 +43 -0.083 +44 -0.041 +45 0.000 +46 0.040 +47 0.078 +48 0.115 +49 0.150 +50 0.184 +51 0.216 +52 0.247 +53 0.276 +54 0.304 +55 0.331 +56 0.356 +57 0.380 +58 0.402 +59 0.423 +60 0.443 +61 0.462 +62 0.479 +63 0.496 +64 0.511 +65 0.526 +66 0.540 +67 0.553 +68 0.565 +69 0.577 +70 0.589 +71 0.600 +72 0.611 +73 0.623 +74 0.634 +75 0.645 +76 0.657 +77 0.670 +78 0.683 +79 0.697 +80 0.712 +81 0.729 +82 0.747 +83 0.766 +84 0.787 +85 0.811 +86 0.836 +87 0.865 +88 0.895 +89 0.929 +90 0.966 +1 -1.496 +2 -1.522 +3 -1.541 +4 -1.555 +5 -1.563 +6 -1.566 +7 -1.564 +8 -1.557 +9 -1.546 +10 -1.531 +11 -1.512 +12 -1.490 +13 -1.464 +14 -1.435 +15 -1.403 +16 -1.369 +17 -1.332 +18 -1.292 +19 -1.251 +20 -1.208 +21 -1.163 +22 -1.117 +23 -1.070 +24 -1.021 +25 -0.972 +26 -0.922 +27 -0.871 +28 -0.820 +29 -0.769 +30 -0.717 +31 -0.665 +32 -0.614 +33 -0.563 +34 -0.512 +35 -0.461 +36 -0.411 +37 -0.362 +38 -0.314 +39 -0.266 +40 -0.219 +41 -0.173 +42 -0.128 +43 -0.084 +44 -0.042 +45 0.000 +46 0.040 +47 0.079 +48 0.117 +49 0.154 +50 0.189 +51 0.223 +52 0.256 +53 0.287 +54 0.317 +55 0.346 +56 0.374 +57 0.400 +58 0.426 +59 0.450 +60 0.473 +61 0.495 +62 0.516 +63 0.537 +64 0.556 +65 0.575 +66 0.593 +67 0.611 +68 0.628 +69 0.645 +70 0.662 +71 0.679 +72 0.695 +73 0.712 +74 0.729 +75 0.747 +76 0.765 +77 0.784 +78 0.804 +79 0.825 +80 0.848 +81 0.872 +82 0.897 +83 0.925 +84 0.954 +85 0.986 +86 1.020 +87 1.057 +88 1.097 +89 1.140 +90 1.186 +1 -1.526 +2 -1.565 +3 -1.597 +4 -1.622 +5 -1.640 +6 -1.652 +7 -1.658 +8 -1.658 +9 -1.653 +10 -1.643 +11 -1.629 +12 -1.610 +13 -1.587 +14 -1.560 +15 -1.529 +16 -1.495 +17 -1.459 +18 -1.419 +19 -1.377 +20 -1.332 +21 -1.286 +22 -1.237 +23 -1.187 +24 -1.136 +25 -1.083 +26 -1.029 +27 -0.974 +28 -0.919 +29 -0.862 +30 -0.806 +31 -0.749 +32 -0.693 +33 -0.636 +34 -0.579 +35 -0.523 +36 -0.467 +37 -0.412 +38 -0.357 +39 -0.304 +40 -0.251 +41 -0.198 +42 -0.147 +43 -0.097 +44 -0.048 +45 0.000 +46 0.047 +47 0.092 +48 0.136 +49 0.179 +50 0.221 +51 0.262 +52 0.301 +53 0.338 +54 0.375 +55 0.410 +56 0.444 +57 0.477 +58 0.509 +59 0.540 +60 0.569 +61 0.598 +62 0.626 +63 0.653 +64 0.679 +65 0.704 +66 0.730 +67 0.754 +68 0.779 +69 0.803 +70 0.827 +71 0.851 +72 0.876 +73 0.901 +74 0.926 +75 0.952 +76 0.980 +77 1.008 +78 1.037 +79 1.068 +80 1.101 +81 1.136 +82 1.172 +83 1.211 +84 1.253 +85 1.297 +86 1.345 +87 1.396 +88 1.450 +89 1.509 +90 1.571 +1 -1.143 +2 -1.181 +3 -1.212 +4 -1.237 +5 -1.257 +6 -1.272 +7 -1.281 +8 -1.286 +9 -1.286 +10 -1.282 +11 -1.274 +12 -1.263 +13 -1.247 +14 -1.229 +15 -1.207 +16 -1.183 +17 -1.156 +18 -1.127 +19 -1.095 +20 -1.061 +21 -1.026 +22 -0.989 +23 -0.950 +24 -0.910 +25 -0.869 +26 -0.827 +27 -0.784 +28 -0.740 +29 -0.696 +30 -0.651 +31 -0.606 +32 -0.561 +33 -0.516 +34 -0.470 +35 -0.425 +36 -0.380 +37 -0.336 +38 -0.292 +39 -0.248 +40 -0.205 +41 -0.162 +42 -0.121 +43 -0.080 +44 -0.039 +45 0.000 +46 0.039 +47 0.076 +48 0.113 +49 0.149 +50 0.184 +51 0.217 +52 0.250 +53 0.282 +54 0.313 +55 0.344 +56 0.373 +57 0.401 +58 0.429 +59 0.455 +60 0.481 +61 0.507 +62 0.531 +63 0.556 +64 0.579 +65 0.603 +66 0.626 +67 0.648 +68 0.671 +69 0.693 +70 0.716 +71 0.739 +72 0.762 +73 0.786 +74 0.810 +75 0.835 +76 0.860 +77 0.887 +78 0.915 +79 0.944 +80 0.975 +81 1.007 +82 1.042 +83 1.078 +84 1.116 +85 1.157 +86 1.201 +87 1.247 +88 1.297 +89 1.350 +90 1.406 +1 -1.068 +2 -1.111 +3 -1.148 +4 -1.178 +5 -1.203 +6 -1.222 +7 -1.236 +8 -1.245 +9 -1.250 +10 -1.249 +11 -1.245 +12 -1.237 +13 -1.225 +14 -1.209 +15 -1.190 +16 -1.169 +17 -1.144 +18 -1.117 +19 -1.087 +20 -1.055 +21 -1.022 +22 -0.986 +23 -0.949 +24 -0.910 +25 -0.870 +26 -0.829 +27 -0.787 +28 -0.744 +29 -0.700 +30 -0.656 +31 -0.611 +32 -0.566 +33 -0.521 +34 -0.476 +35 -0.431 +36 -0.386 +37 -0.341 +38 -0.297 +39 -0.253 +40 -0.209 +41 -0.166 +42 -0.123 +43 -0.082 +44 -0.040 +45 0.000 +46 0.040 +47 0.078 +48 0.116 +49 0.153 +50 0.190 +51 0.225 +52 0.260 +53 0.293 +54 0.326 +55 0.358 +56 0.389 +57 0.419 +58 0.449 +59 0.478 +60 0.506 +61 0.533 +62 0.560 +63 0.587 +64 0.613 +65 0.639 +66 0.665 +67 0.690 +68 0.716 +69 0.741 +70 0.767 +71 0.793 +72 0.819 +73 0.846 +74 0.874 +75 0.903 +76 0.932 +77 0.963 +78 0.995 +79 1.028 +80 1.063 +81 1.100 +82 1.139 +83 1.180 +84 1.223 +85 1.269 +86 1.318 +87 1.369 +88 1.424 +89 1.483 +90 1.545 +1 -0.700 +2 -0.737 +3 -0.769 +4 -0.797 +5 -0.820 +6 -0.839 +7 -0.853 +8 -0.864 +9 -0.871 +10 -0.875 +11 -0.876 +12 -0.873 +13 -0.867 +14 -0.859 +15 -0.848 +16 -0.835 +17 -0.820 +18 -0.802 +19 -0.783 +20 -0.761 +21 -0.739 +22 -0.714 +23 -0.689 +24 -0.662 +25 -0.634 +26 -0.605 +27 -0.575 +28 -0.545 +29 -0.514 +30 -0.482 +31 -0.450 +32 -0.418 +33 -0.385 +34 -0.352 +35 -0.319 +36 -0.286 +37 -0.253 +38 -0.221 +39 -0.188 +40 -0.156 +41 -0.124 +42 -0.092 +43 -0.061 +44 -0.030 +45 0.000 +46 0.030 +47 0.059 +48 0.088 +49 0.116 +50 0.144 +51 0.171 +52 0.198 +53 0.224 +54 0.250 +55 0.275 +56 0.299 +57 0.323 +58 0.347 +59 0.370 +60 0.393 +61 0.415 +62 0.437 +63 0.459 +64 0.481 +65 0.502 +66 0.524 +67 0.545 +68 0.566 +69 0.588 +70 0.610 +71 0.632 +72 0.655 +73 0.678 +74 0.702 +75 0.726 +76 0.752 +77 0.778 +78 0.805 +79 0.834 +80 0.864 +81 0.895 +82 0.928 +83 0.962 +84 0.999 +85 1.038 +86 1.078 +87 1.122 +88 1.167 +89 1.216 +90 1.267 +1 -0.571 +2 -0.605 +3 -0.635 +4 -0.661 +5 -0.683 +6 -0.701 +7 -0.716 +8 -0.727 +9 -0.734 +10 -0.739 +11 -0.741 +12 -0.740 +13 -0.737 +14 -0.731 +15 -0.723 +16 -0.712 +17 -0.700 +18 -0.686 +19 -0.670 +20 -0.653 +21 -0.634 +22 -0.614 +23 -0.592 +24 -0.570 +25 -0.546 +26 -0.522 +27 -0.496 +28 -0.471 +29 -0.444 +30 -0.417 +31 -0.390 +32 -0.362 +33 -0.334 +34 -0.306 +35 -0.277 +36 -0.249 +37 -0.221 +38 -0.192 +39 -0.164 +40 -0.136 +41 -0.108 +42 -0.081 +43 -0.053 +44 -0.027 +45 0.000 +46 0.026 +47 0.052 +48 0.077 +49 0.102 +50 0.127 +51 0.151 +52 0.174 +53 0.198 +54 0.220 +55 0.243 +56 0.265 +57 0.286 +58 0.307 +59 0.328 +60 0.349 +61 0.369 +62 0.389 +63 0.409 +64 0.428 +65 0.448 +66 0.468 +67 0.487 +68 0.507 +69 0.527 +70 0.547 +71 0.567 +72 0.588 +73 0.610 +74 0.632 +75 0.654 +76 0.677 +77 0.702 +78 0.727 +79 0.753 +80 0.780 +81 0.809 +82 0.839 +83 0.871 +84 0.904 +85 0.939 +86 0.976 +87 1.015 +88 1.057 +89 1.101 +90 1.147 +1 -0.212 +2 -0.237 +3 -0.259 +4 -0.279 +5 -0.296 +6 -0.311 +7 -0.324 +8 -0.335 +9 -0.343 +10 -0.350 +11 -0.355 +12 -0.359 +13 -0.361 +14 -0.361 +15 -0.360 +16 -0.358 +17 -0.354 +18 -0.349 +19 -0.343 +20 -0.336 +21 -0.328 +22 -0.320 +23 -0.310 +24 -0.300 +25 -0.289 +26 -0.277 +27 -0.265 +28 -0.252 +29 -0.239 +30 -0.225 +31 -0.211 +32 -0.197 +33 -0.182 +34 -0.167 +35 -0.152 +36 -0.137 +37 -0.122 +38 -0.107 +39 -0.092 +40 -0.076 +41 -0.061 +42 -0.046 +43 -0.030 +44 -0.015 +45 0.000 +46 0.015 +47 0.030 +48 0.045 +49 0.059 +50 0.074 +51 0.088 +52 0.102 +53 0.116 +54 0.130 +55 0.144 +56 0.158 +57 0.171 +58 0.185 +59 0.198 +60 0.211 +61 0.224 +62 0.238 +63 0.251 +64 0.264 +65 0.277 +66 0.291 +67 0.304 +68 0.318 +69 0.332 +70 0.346 +71 0.360 +72 0.375 +73 0.390 +74 0.406 +75 0.422 +76 0.438 +77 0.455 +78 0.473 +79 0.492 +80 0.511 +81 0.531 +82 0.552 +83 0.574 +84 0.597 +85 0.621 +86 0.647 +87 0.673 +88 0.701 +89 0.731 +90 0.762 +1 -0.141 +2 -0.161 +3 -0.179 +4 -0.195 +5 -0.209 +6 -0.221 +7 -0.232 +8 -0.241 +9 -0.249 +10 -0.255 +11 -0.259 +12 -0.263 +13 -0.265 +14 -0.266 +15 -0.266 +16 -0.265 +17 -0.262 +18 -0.259 +19 -0.255 +20 -0.251 +21 -0.245 +22 -0.239 +23 -0.232 +24 -0.225 +25 -0.217 +26 -0.208 +27 -0.199 +28 -0.190 +29 -0.180 +30 -0.170 +31 -0.160 +32 -0.149 +33 -0.138 +34 -0.127 +35 -0.116 +36 -0.104 +37 -0.093 +38 -0.081 +39 -0.070 +40 -0.058 +41 -0.047 +42 -0.035 +43 -0.023 +44 -0.012 +45 0.000 +46 0.012 +47 0.023 +48 0.034 +49 0.046 +50 0.057 +51 0.068 +52 0.079 +53 0.090 +54 0.101 +55 0.112 +56 0.123 +57 0.133 +58 0.144 +59 0.154 +60 0.165 +61 0.175 +62 0.186 +63 0.197 +64 0.207 +65 0.218 +66 0.229 +67 0.239 +68 0.250 +69 0.262 +70 0.273 +71 0.285 +72 0.296 +73 0.309 +74 0.321 +75 0.334 +76 0.347 +77 0.361 +78 0.375 +79 0.390 +80 0.406 +81 0.422 +82 0.439 +83 0.456 +84 0.474 +85 0.494 +86 0.514 +87 0.535 +88 0.557 +89 0.581 +90 0.605 +1 0.168 +2 0.156 +3 0.145 +4 0.135 +5 0.125 +6 0.115 +7 0.106 +8 0.098 +9 0.089 +10 0.082 +11 0.074 +12 0.067 +13 0.060 +14 0.054 +15 0.048 +16 0.042 +17 0.037 +18 0.032 +19 0.027 +20 0.023 +21 0.019 +22 0.015 +23 0.012 +24 0.009 +25 0.006 +26 0.004 +27 0.001 +28 -0.001 +29 -0.002 +30 -0.004 +31 -0.005 +32 -0.006 +33 -0.007 +34 -0.008 +35 -0.008 +36 -0.008 +37 -0.008 +38 -0.008 +39 -0.007 +40 -0.007 +41 -0.006 +42 -0.004 +43 -0.003 +44 -0.002 +45 0.000 +46 0.002 +47 0.004 +48 0.006 +49 0.009 +50 0.011 +51 0.014 +52 0.017 +53 0.020 +54 0.023 +55 0.027 +56 0.031 +57 0.034 +58 0.038 +59 0.043 +60 0.047 +61 0.052 +62 0.056 +63 0.061 +64 0.066 +65 0.072 +66 0.077 +67 0.083 +68 0.089 +69 0.095 +70 0.101 +71 0.107 +72 0.114 +73 0.121 +74 0.128 +75 0.135 +76 0.143 +77 0.151 +78 0.159 +79 0.167 +80 0.175 +81 0.184 +82 0.193 +83 0.202 +84 0.211 +85 0.221 +86 0.231 +87 0.241 +88 0.252 +89 0.263 +90 0.274 +1 0.217 +2 0.213 +3 0.209 +4 0.205 +5 0.200 +6 0.195 +7 0.190 +8 0.185 +9 0.180 +10 0.174 +11 0.169 +12 0.163 +13 0.157 +14 0.152 +15 0.146 +16 0.140 +17 0.134 +18 0.128 +19 0.122 +20 0.116 +21 0.110 +22 0.104 +23 0.098 +24 0.092 +25 0.086 +26 0.081 +27 0.075 +28 0.070 +29 0.064 +30 0.059 +31 0.054 +32 0.049 +33 0.044 +34 0.039 +35 0.035 +36 0.031 +37 0.026 +38 0.023 +39 0.019 +40 0.015 +41 0.012 +42 0.008 +43 0.005 +44 0.003 +45 -0.000 +46 -0.002 +47 -0.005 +48 -0.007 +49 -0.008 +50 -0.010 +51 -0.011 +52 -0.013 +53 -0.013 +54 -0.014 +55 -0.015 +56 -0.015 +57 -0.015 +58 -0.015 +59 -0.015 +60 -0.015 +61 -0.014 +62 -0.013 +63 -0.012 +64 -0.011 +65 -0.010 +66 -0.009 +67 -0.007 +68 -0.006 +69 -0.004 +70 -0.002 +71 -0.000 +72 0.002 +73 0.004 +74 0.006 +75 0.009 +76 0.011 +77 0.013 +78 0.016 +79 0.018 +80 0.021 +81 0.023 +82 0.025 +83 0.028 +84 0.030 +85 0.032 +86 0.034 +87 0.036 +88 0.038 +89 0.039 +90 0.041 +1 0.503 +2 0.509 +3 0.513 +4 0.515 +5 0.515 +6 0.514 +7 0.511 +8 0.507 +9 0.502 +10 0.496 +11 0.488 +12 0.479 +13 0.470 +14 0.459 +15 0.448 +16 0.436 +17 0.423 +18 0.410 +19 0.396 +20 0.381 +21 0.366 +22 0.351 +23 0.336 +24 0.320 +25 0.304 +26 0.288 +27 0.271 +28 0.255 +29 0.238 +30 0.222 +31 0.206 +32 0.189 +33 0.173 +34 0.157 +35 0.141 +36 0.126 +37 0.111 +38 0.096 +39 0.081 +40 0.066 +41 0.052 +42 0.039 +43 0.025 +44 0.012 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.035 +49 -0.046 +50 -0.056 +51 -0.066 +52 -0.075 +53 -0.084 +54 -0.093 +55 -0.101 +56 -0.109 +57 -0.116 +58 -0.123 +59 -0.129 +60 -0.136 +61 -0.141 +62 -0.147 +63 -0.152 +64 -0.157 +65 -0.162 +66 -0.166 +67 -0.170 +68 -0.174 +69 -0.178 +70 -0.182 +71 -0.186 +72 -0.190 +73 -0.193 +74 -0.197 +75 -0.201 +76 -0.205 +77 -0.210 +78 -0.214 +79 -0.219 +80 -0.225 +81 -0.231 +82 -0.237 +83 -0.244 +84 -0.251 +85 -0.259 +86 -0.268 +87 -0.278 +88 -0.289 +89 -0.300 +90 -0.313 +1 0.557 +2 0.571 +3 0.583 +4 0.592 +5 0.599 +6 0.603 +7 0.606 +8 0.606 +9 0.604 +10 0.601 +11 0.595 +12 0.588 +13 0.580 +14 0.570 +15 0.559 +16 0.547 +17 0.533 +18 0.519 +19 0.503 +20 0.487 +21 0.470 +22 0.452 +23 0.434 +24 0.415 +25 0.395 +26 0.376 +27 0.355 +28 0.335 +29 0.315 +30 0.294 +31 0.273 +32 0.253 +33 0.232 +34 0.211 +35 0.191 +36 0.170 +37 0.150 +38 0.130 +39 0.111 +40 0.091 +41 0.072 +42 0.054 +43 0.035 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.065 +50 -0.080 +51 -0.095 +52 -0.109 +53 -0.123 +54 -0.136 +55 -0.149 +56 -0.161 +57 -0.173 +58 -0.184 +59 -0.196 +60 -0.206 +61 -0.217 +62 -0.227 +63 -0.236 +64 -0.246 +65 -0.255 +66 -0.264 +67 -0.273 +68 -0.282 +69 -0.291 +70 -0.300 +71 -0.309 +72 -0.318 +73 -0.327 +74 -0.337 +75 -0.346 +76 -0.357 +77 -0.367 +78 -0.378 +79 -0.390 +80 -0.402 +81 -0.415 +82 -0.429 +83 -0.444 +84 -0.460 +85 -0.477 +86 -0.495 +87 -0.514 +88 -0.535 +89 -0.557 +90 -0.581 +1 0.803 +2 0.825 +3 0.843 +4 0.857 +5 0.868 +6 0.875 +7 0.879 +8 0.880 +9 0.879 +10 0.874 +11 0.867 +12 0.857 +13 0.846 +14 0.832 +15 0.816 +16 0.798 +17 0.779 +18 0.758 +19 0.736 +20 0.712 +21 0.688 +22 0.662 +23 0.635 +24 0.608 +25 0.580 +26 0.551 +27 0.522 +28 0.492 +29 0.462 +30 0.432 +31 0.402 +32 0.371 +33 0.341 +34 0.311 +35 0.281 +36 0.251 +37 0.221 +38 0.192 +39 0.163 +40 0.135 +41 0.107 +42 0.079 +43 0.052 +44 0.026 +45 -0.000 +46 -0.025 +47 -0.050 +48 -0.073 +49 -0.097 +50 -0.119 +51 -0.141 +52 -0.162 +53 -0.182 +54 -0.202 +55 -0.221 +56 -0.240 +57 -0.258 +58 -0.275 +59 -0.292 +60 -0.308 +61 -0.324 +62 -0.339 +63 -0.354 +64 -0.368 +65 -0.382 +66 -0.396 +67 -0.410 +68 -0.424 +69 -0.437 +70 -0.451 +71 -0.465 +72 -0.479 +73 -0.493 +74 -0.507 +75 -0.522 +76 -0.538 +77 -0.554 +78 -0.571 +79 -0.589 +80 -0.608 +81 -0.627 +82 -0.649 +83 -0.671 +84 -0.695 +85 -0.720 +86 -0.748 +87 -0.777 +88 -0.808 +89 -0.841 +90 -0.877 +1 0.784 +2 0.814 +3 0.839 +4 0.859 +5 0.876 +6 0.889 +7 0.898 +8 0.903 +9 0.905 +10 0.904 +11 0.900 +12 0.893 +13 0.884 +14 0.872 +15 0.858 +16 0.841 +17 0.823 +18 0.803 +19 0.781 +20 0.758 +21 0.733 +22 0.707 +23 0.680 +24 0.652 +25 0.623 +26 0.593 +27 0.562 +28 0.531 +29 0.500 +30 0.468 +31 0.436 +32 0.404 +33 0.371 +34 0.339 +35 0.307 +36 0.274 +37 0.242 +38 0.211 +39 0.179 +40 0.148 +41 0.118 +42 0.087 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.082 +49 -0.108 +50 -0.134 +51 -0.158 +52 -0.183 +53 -0.206 +54 -0.229 +55 -0.251 +56 -0.273 +57 -0.294 +58 -0.314 +59 -0.334 +60 -0.354 +61 -0.373 +62 -0.391 +63 -0.410 +64 -0.428 +65 -0.445 +66 -0.463 +67 -0.480 +68 -0.498 +69 -0.515 +70 -0.533 +71 -0.551 +72 -0.569 +73 -0.588 +74 -0.607 +75 -0.626 +76 -0.647 +77 -0.668 +78 -0.690 +79 -0.713 +80 -0.737 +81 -0.763 +82 -0.790 +83 -0.819 +84 -0.849 +85 -0.882 +86 -0.916 +87 -0.953 +88 -0.991 +89 -1.033 +90 -1.077 +1 0.899 +2 0.933 +3 0.962 +4 0.985 +5 1.004 +6 1.018 +7 1.028 +8 1.035 +9 1.037 +10 1.035 +11 1.031 +12 1.023 +13 1.012 +14 0.998 +15 0.982 +16 0.963 +17 0.942 +18 0.919 +19 0.894 +20 0.868 +21 0.839 +22 0.809 +23 0.778 +24 0.746 +25 0.713 +26 0.679 +27 0.644 +28 0.608 +29 0.572 +30 0.536 +31 0.499 +32 0.462 +33 0.425 +34 0.388 +35 0.351 +36 0.314 +37 0.278 +38 0.241 +39 0.205 +40 0.170 +41 0.135 +42 0.100 +43 0.066 +44 0.033 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.094 +49 -0.124 +50 -0.153 +51 -0.182 +52 -0.209 +53 -0.236 +54 -0.263 +55 -0.288 +56 -0.313 +57 -0.337 +58 -0.361 +59 -0.383 +60 -0.406 +61 -0.428 +62 -0.449 +63 -0.470 +64 -0.491 +65 -0.511 +66 -0.531 +67 -0.552 +68 -0.572 +69 -0.592 +70 -0.612 +71 -0.632 +72 -0.653 +73 -0.675 +74 -0.696 +75 -0.719 +76 -0.742 +77 -0.767 +78 -0.792 +79 -0.818 +80 -0.846 +81 -0.876 +82 -0.907 +83 -0.939 +84 -0.974 +85 -1.011 +86 -1.050 +87 -1.092 +88 -1.136 +89 -1.184 +90 -1.234 +1 0.855 +2 0.897 +3 0.933 +4 0.964 +5 0.989 +6 1.009 +7 1.025 +8 1.036 +9 1.043 +10 1.046 +11 1.046 +12 1.041 +13 1.033 +14 1.023 +15 1.009 +16 0.992 +17 0.973 +18 0.951 +19 0.927 +20 0.902 +21 0.874 +22 0.845 +23 0.814 +24 0.781 +25 0.748 +26 0.713 +27 0.678 +28 0.642 +29 0.605 +30 0.567 +31 0.529 +32 0.491 +33 0.452 +34 0.413 +35 0.374 +36 0.336 +37 0.297 +38 0.258 +39 0.220 +40 0.182 +41 0.145 +42 0.108 +43 0.071 +44 0.035 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.102 +49 -0.135 +50 -0.167 +51 -0.199 +52 -0.230 +53 -0.260 +54 -0.289 +55 -0.318 +56 -0.346 +57 -0.374 +58 -0.401 +59 -0.427 +60 -0.453 +61 -0.479 +62 -0.504 +63 -0.529 +64 -0.553 +65 -0.578 +66 -0.602 +67 -0.626 +68 -0.651 +69 -0.675 +70 -0.700 +71 -0.725 +72 -0.751 +73 -0.777 +74 -0.804 +75 -0.832 +76 -0.861 +77 -0.891 +78 -0.922 +79 -0.955 +80 -0.989 +81 -1.025 +82 -1.062 +83 -1.102 +84 -1.144 +85 -1.189 +86 -1.236 +87 -1.286 +88 -1.339 +89 -1.395 +90 -1.455 +1 0.826 +2 0.870 +3 0.908 +4 0.941 +5 0.968 +6 0.990 +7 1.008 +8 1.020 +9 1.029 +10 1.033 +11 1.034 +12 1.031 +13 1.024 +14 1.014 +15 1.001 +16 0.986 +17 0.967 +18 0.946 +19 0.923 +20 0.898 +21 0.871 +22 0.843 +23 0.812 +24 0.780 +25 0.747 +26 0.713 +27 0.678 +28 0.642 +29 0.605 +30 0.568 +31 0.530 +32 0.492 +33 0.453 +34 0.415 +35 0.376 +36 0.337 +37 0.298 +38 0.260 +39 0.222 +40 0.184 +41 0.146 +42 0.109 +43 0.072 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.070 +48 -0.104 +49 -0.137 +50 -0.169 +51 -0.201 +52 -0.232 +53 -0.263 +54 -0.293 +55 -0.322 +56 -0.351 +57 -0.379 +58 -0.407 +59 -0.434 +60 -0.461 +61 -0.487 +62 -0.513 +63 -0.538 +64 -0.564 +65 -0.589 +66 -0.614 +67 -0.639 +68 -0.665 +69 -0.690 +70 -0.716 +71 -0.742 +72 -0.769 +73 -0.796 +74 -0.824 +75 -0.853 +76 -0.884 +77 -0.915 +78 -0.947 +79 -0.981 +80 -1.017 +81 -1.054 +82 -1.093 +83 -1.135 +84 -1.179 +85 -1.225 +86 -1.274 +87 -1.326 +88 -1.380 +89 -1.438 +90 -1.500 +1 0.620 +2 0.668 +3 0.710 +4 0.746 +5 0.778 +6 0.805 +7 0.827 +8 0.844 +9 0.858 +10 0.867 +11 0.873 +12 0.875 +13 0.874 +14 0.870 +15 0.863 +16 0.852 +17 0.840 +18 0.825 +19 0.807 +20 0.788 +21 0.766 +22 0.743 +23 0.718 +24 0.692 +25 0.665 +26 0.636 +27 0.606 +28 0.575 +29 0.543 +30 0.511 +31 0.478 +32 0.444 +33 0.411 +34 0.376 +35 0.342 +36 0.307 +37 0.273 +38 0.238 +39 0.203 +40 0.169 +41 0.134 +42 0.100 +43 0.067 +44 0.033 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.097 +49 -0.128 +50 -0.159 +51 -0.190 +52 -0.220 +53 -0.249 +54 -0.278 +55 -0.307 +56 -0.335 +57 -0.363 +58 -0.391 +59 -0.418 +60 -0.445 +61 -0.472 +62 -0.498 +63 -0.524 +64 -0.551 +65 -0.577 +66 -0.604 +67 -0.630 +68 -0.657 +69 -0.684 +70 -0.712 +71 -0.740 +72 -0.769 +73 -0.799 +74 -0.829 +75 -0.860 +76 -0.893 +77 -0.927 +78 -0.962 +79 -0.998 +80 -1.037 +81 -1.077 +82 -1.119 +83 -1.163 +84 -1.209 +85 -1.258 +86 -1.310 +87 -1.364 +88 -1.421 +89 -1.482 +90 -1.546 +1 0.355 +2 0.395 +3 0.431 +4 0.463 +5 0.491 +6 0.515 +7 0.536 +8 0.553 +9 0.567 +10 0.578 +11 0.586 +12 0.592 +13 0.594 +14 0.595 +15 0.592 +16 0.588 +17 0.582 +18 0.574 +19 0.564 +20 0.552 +21 0.539 +22 0.524 +23 0.508 +24 0.491 +25 0.473 +26 0.453 +27 0.433 +28 0.412 +29 0.390 +30 0.368 +31 0.345 +32 0.322 +33 0.298 +34 0.273 +35 0.249 +36 0.224 +37 0.199 +38 0.174 +39 0.149 +40 0.124 +41 0.099 +42 0.074 +43 0.049 +44 0.025 +45 -0.000 +46 -0.024 +47 -0.049 +48 -0.073 +49 -0.096 +50 -0.120 +51 -0.143 +52 -0.166 +53 -0.189 +54 -0.212 +55 -0.234 +56 -0.256 +57 -0.278 +58 -0.300 +59 -0.322 +60 -0.343 +61 -0.365 +62 -0.387 +63 -0.408 +64 -0.430 +65 -0.451 +66 -0.473 +67 -0.496 +68 -0.518 +69 -0.541 +70 -0.564 +71 -0.588 +72 -0.612 +73 -0.637 +74 -0.663 +75 -0.689 +76 -0.717 +77 -0.745 +78 -0.775 +79 -0.806 +80 -0.838 +81 -0.871 +82 -0.906 +83 -0.943 +84 -0.982 +85 -1.022 +86 -1.065 +87 -1.110 +88 -1.157 +89 -1.207 +90 -1.259 +1 -0.016 +2 0.024 +3 0.060 +4 0.094 +5 0.124 +6 0.151 +7 0.176 +8 0.198 +9 0.218 +10 0.235 +11 0.250 +12 0.263 +13 0.273 +14 0.282 +15 0.289 +16 0.294 +17 0.297 +18 0.299 +19 0.299 +20 0.298 +21 0.295 +22 0.291 +23 0.286 +24 0.280 +25 0.273 +26 0.265 +27 0.256 +28 0.246 +29 0.235 +30 0.224 +31 0.212 +32 0.199 +33 0.186 +34 0.173 +35 0.158 +36 0.144 +37 0.129 +38 0.114 +39 0.098 +40 0.082 +41 0.066 +42 0.050 +43 0.033 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.051 +49 -0.068 +50 -0.086 +51 -0.103 +52 -0.121 +53 -0.138 +54 -0.156 +55 -0.174 +56 -0.192 +57 -0.210 +58 -0.228 +59 -0.247 +60 -0.266 +61 -0.284 +62 -0.304 +63 -0.323 +64 -0.343 +65 -0.363 +66 -0.383 +67 -0.404 +68 -0.425 +69 -0.447 +70 -0.469 +71 -0.492 +72 -0.515 +73 -0.540 +74 -0.565 +75 -0.591 +76 -0.617 +77 -0.645 +78 -0.674 +79 -0.704 +80 -0.735 +81 -0.767 +82 -0.801 +83 -0.836 +84 -0.873 +85 -0.911 +86 -0.951 +87 -0.992 +88 -1.036 +89 -1.081 +90 -1.129 +1 -0.414 +2 -0.389 +3 -0.365 +4 -0.342 +5 -0.320 +6 -0.299 +7 -0.278 +8 -0.259 +9 -0.240 +10 -0.223 +11 -0.206 +12 -0.189 +13 -0.174 +14 -0.159 +15 -0.145 +16 -0.132 +17 -0.119 +18 -0.107 +19 -0.096 +20 -0.086 +21 -0.076 +22 -0.066 +23 -0.058 +24 -0.050 +25 -0.042 +26 -0.035 +27 -0.029 +28 -0.023 +29 -0.018 +30 -0.013 +31 -0.009 +32 -0.005 +33 -0.002 +34 0.001 +35 0.003 +36 0.005 +37 0.006 +38 0.007 +39 0.007 +40 0.007 +41 0.007 +42 0.006 +43 0.004 +44 0.002 +45 -0.000 +46 -0.003 +47 -0.006 +48 -0.009 +49 -0.014 +50 -0.018 +51 -0.023 +52 -0.028 +53 -0.034 +54 -0.040 +55 -0.046 +56 -0.053 +57 -0.061 +58 -0.069 +59 -0.077 +60 -0.086 +61 -0.095 +62 -0.104 +63 -0.114 +64 -0.125 +65 -0.136 +66 -0.147 +67 -0.159 +68 -0.172 +69 -0.185 +70 -0.198 +71 -0.212 +72 -0.226 +73 -0.241 +74 -0.257 +75 -0.273 +76 -0.289 +77 -0.306 +78 -0.324 +79 -0.342 +80 -0.361 +81 -0.381 +82 -0.401 +83 -0.422 +84 -0.443 +85 -0.466 +86 -0.488 +87 -0.512 +88 -0.536 +89 -0.561 +90 -0.587 +1 -0.929 +2 -0.916 +3 -0.901 +4 -0.886 +5 -0.869 +6 -0.851 +7 -0.832 +8 -0.812 +9 -0.791 +10 -0.770 +11 -0.747 +12 -0.724 +13 -0.701 +14 -0.677 +15 -0.652 +16 -0.627 +17 -0.602 +18 -0.577 +19 -0.552 +20 -0.526 +21 -0.500 +22 -0.475 +23 -0.449 +24 -0.424 +25 -0.399 +26 -0.374 +27 -0.350 +28 -0.325 +29 -0.301 +30 -0.278 +31 -0.255 +32 -0.233 +33 -0.211 +34 -0.189 +35 -0.168 +36 -0.148 +37 -0.129 +38 -0.110 +39 -0.092 +40 -0.075 +41 -0.058 +42 -0.042 +43 -0.027 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.035 +49 0.045 +50 0.054 +51 0.062 +52 0.069 +53 0.076 +54 0.082 +55 0.086 +56 0.090 +57 0.093 +58 0.096 +59 0.097 +60 0.098 +61 0.098 +62 0.097 +63 0.095 +64 0.093 +65 0.090 +66 0.086 +67 0.082 +68 0.077 +69 0.072 +70 0.066 +71 0.060 +72 0.053 +73 0.046 +74 0.038 +75 0.030 +76 0.022 +77 0.013 +78 0.005 +79 -0.004 +80 -0.013 +81 -0.021 +82 -0.030 +83 -0.039 +84 -0.047 +85 -0.055 +86 -0.063 +87 -0.071 +88 -0.078 +89 -0.084 +90 -0.090 +1 -1.347 +2 -1.353 +3 -1.355 +4 -1.353 +5 -1.348 +6 -1.339 +7 -1.327 +8 -1.312 +9 -1.294 +10 -1.273 +11 -1.249 +12 -1.224 +13 -1.196 +14 -1.166 +15 -1.135 +16 -1.102 +17 -1.067 +18 -1.031 +19 -0.994 +20 -0.956 +21 -0.917 +22 -0.877 +23 -0.837 +24 -0.796 +25 -0.755 +26 -0.713 +27 -0.672 +28 -0.630 +29 -0.588 +30 -0.547 +31 -0.506 +32 -0.465 +33 -0.425 +34 -0.385 +35 -0.346 +36 -0.307 +37 -0.269 +38 -0.232 +39 -0.196 +40 -0.161 +41 -0.127 +42 -0.093 +43 -0.061 +44 -0.030 +45 0.000 +46 0.029 +47 0.057 +48 0.083 +49 0.108 +50 0.133 +51 0.155 +52 0.177 +53 0.198 +54 0.217 +55 0.235 +56 0.252 +57 0.268 +58 0.283 +59 0.296 +60 0.309 +61 0.320 +62 0.331 +63 0.341 +64 0.350 +65 0.358 +66 0.365 +67 0.372 +68 0.378 +69 0.384 +70 0.389 +71 0.394 +72 0.399 +73 0.403 +74 0.408 +75 0.412 +76 0.417 +77 0.422 +78 0.427 +79 0.433 +80 0.440 +81 0.447 +82 0.455 +83 0.465 +84 0.475 +85 0.487 +86 0.501 +87 0.516 +88 0.533 +89 0.552 +90 0.573 +1 -1.180 +2 -1.181 +3 -1.178 +4 -1.172 +5 -1.163 +6 -1.152 +7 -1.138 +8 -1.121 +9 -1.103 +10 -1.082 +11 -1.060 +12 -1.036 +13 -1.010 +14 -0.983 +15 -0.955 +16 -0.925 +17 -0.894 +18 -0.863 +19 -0.830 +20 -0.797 +21 -0.763 +22 -0.729 +23 -0.694 +24 -0.659 +25 -0.624 +26 -0.589 +27 -0.554 +28 -0.519 +29 -0.484 +30 -0.449 +31 -0.415 +32 -0.381 +33 -0.347 +34 -0.314 +35 -0.281 +36 -0.250 +37 -0.219 +38 -0.188 +39 -0.159 +40 -0.130 +41 -0.102 +42 -0.075 +43 -0.049 +44 -0.024 +45 0.000 +46 0.023 +47 0.045 +48 0.066 +49 0.086 +50 0.105 +51 0.122 +52 0.139 +53 0.155 +54 0.169 +55 0.183 +56 0.195 +57 0.207 +58 0.217 +59 0.227 +60 0.235 +61 0.243 +62 0.250 +63 0.256 +64 0.261 +65 0.266 +66 0.269 +67 0.273 +68 0.275 +69 0.277 +70 0.279 +71 0.280 +72 0.281 +73 0.282 +74 0.283 +75 0.283 +76 0.284 +77 0.285 +78 0.286 +79 0.287 +80 0.289 +81 0.291 +82 0.294 +83 0.298 +84 0.303 +85 0.308 +86 0.315 +87 0.323 +88 0.332 +89 0.343 +90 0.355 +1 -0.816 +2 -0.810 +3 -0.802 +4 -0.793 +5 -0.782 +6 -0.770 +7 -0.756 +8 -0.741 +9 -0.726 +10 -0.709 +11 -0.691 +12 -0.672 +13 -0.653 +14 -0.633 +15 -0.612 +16 -0.591 +17 -0.569 +18 -0.547 +19 -0.525 +20 -0.502 +21 -0.479 +22 -0.456 +23 -0.433 +24 -0.410 +25 -0.387 +26 -0.364 +27 -0.341 +28 -0.319 +29 -0.296 +30 -0.274 +31 -0.252 +32 -0.231 +33 -0.210 +34 -0.189 +35 -0.169 +36 -0.149 +37 -0.130 +38 -0.112 +39 -0.094 +40 -0.077 +41 -0.060 +42 -0.044 +43 -0.029 +44 -0.014 +45 0.000 +46 0.013 +47 0.026 +48 0.037 +49 0.048 +50 0.059 +51 0.068 +52 0.077 +53 0.085 +54 0.092 +55 0.099 +56 0.104 +57 0.109 +58 0.114 +59 0.118 +60 0.121 +61 0.123 +62 0.125 +63 0.126 +64 0.126 +65 0.126 +66 0.126 +67 0.125 +68 0.123 +69 0.121 +70 0.119 +71 0.116 +72 0.113 +73 0.110 +74 0.107 +75 0.103 +76 0.099 +77 0.096 +78 0.092 +79 0.088 +80 0.084 +81 0.081 +82 0.078 +83 0.075 +84 0.072 +85 0.070 +86 0.068 +87 0.067 +88 0.067 +89 0.067 +90 0.068 +1 -0.635 +2 -0.625 +3 -0.614 +4 -0.602 +5 -0.590 +6 -0.577 +7 -0.563 +8 -0.549 +9 -0.534 +10 -0.519 +11 -0.503 +12 -0.487 +13 -0.471 +14 -0.454 +15 -0.437 +16 -0.420 +17 -0.403 +18 -0.385 +19 -0.368 +20 -0.350 +21 -0.333 +22 -0.316 +23 -0.298 +24 -0.281 +25 -0.264 +26 -0.247 +27 -0.231 +28 -0.215 +29 -0.199 +30 -0.183 +31 -0.168 +32 -0.153 +33 -0.138 +34 -0.124 +35 -0.110 +36 -0.097 +37 -0.084 +38 -0.072 +39 -0.060 +40 -0.048 +41 -0.038 +42 -0.027 +43 -0.018 +44 -0.009 +45 0.000 +46 0.008 +47 0.015 +48 0.022 +49 0.028 +50 0.034 +51 0.039 +52 0.044 +53 0.047 +54 0.051 +55 0.053 +56 0.055 +57 0.057 +58 0.058 +59 0.058 +60 0.058 +61 0.058 +62 0.056 +63 0.055 +64 0.052 +65 0.050 +66 0.047 +67 0.043 +68 0.039 +69 0.035 +70 0.030 +71 0.025 +72 0.019 +73 0.014 +74 0.008 +75 0.002 +76 -0.005 +77 -0.011 +78 -0.018 +79 -0.025 +80 -0.032 +81 -0.039 +82 -0.046 +83 -0.053 +84 -0.059 +85 -0.066 +86 -0.073 +87 -0.079 +88 -0.085 +89 -0.091 +90 -0.096 +1 -0.280 +2 -0.267 +3 -0.253 +4 -0.241 +5 -0.228 +6 -0.216 +7 -0.204 +8 -0.193 +9 -0.182 +10 -0.171 +11 -0.160 +12 -0.150 +13 -0.141 +14 -0.131 +15 -0.123 +16 -0.114 +17 -0.106 +18 -0.098 +19 -0.090 +20 -0.083 +21 -0.076 +22 -0.069 +23 -0.063 +24 -0.057 +25 -0.051 +26 -0.046 +27 -0.040 +28 -0.036 +29 -0.031 +30 -0.027 +31 -0.023 +32 -0.020 +33 -0.016 +34 -0.013 +35 -0.011 +36 -0.008 +37 -0.006 +38 -0.004 +39 -0.003 +40 -0.002 +41 -0.001 +42 -0.000 +43 0.000 +44 0.000 +45 -0.000 +46 -0.001 +47 -0.001 +48 -0.002 +49 -0.004 +50 -0.005 +51 -0.007 +52 -0.009 +53 -0.012 +54 -0.015 +55 -0.018 +56 -0.021 +57 -0.025 +58 -0.029 +59 -0.033 +60 -0.037 +61 -0.042 +62 -0.047 +63 -0.052 +64 -0.058 +65 -0.064 +66 -0.070 +67 -0.076 +68 -0.083 +69 -0.090 +70 -0.097 +71 -0.105 +72 -0.112 +73 -0.120 +74 -0.129 +75 -0.138 +76 -0.147 +77 -0.156 +78 -0.165 +79 -0.175 +80 -0.186 +81 -0.196 +82 -0.207 +83 -0.218 +84 -0.229 +85 -0.241 +86 -0.253 +87 -0.265 +88 -0.278 +89 -0.291 +90 -0.304 +1 -0.058 +2 -0.037 +3 -0.018 +4 -0.000 +5 0.016 +6 0.031 +7 0.044 +8 0.057 +9 0.068 +10 0.078 +11 0.086 +12 0.094 +13 0.101 +14 0.107 +15 0.111 +16 0.115 +17 0.118 +18 0.121 +19 0.122 +20 0.123 +21 0.123 +22 0.122 +23 0.121 +24 0.120 +25 0.117 +26 0.114 +27 0.111 +28 0.108 +29 0.103 +30 0.099 +31 0.094 +32 0.089 +33 0.083 +34 0.078 +35 0.072 +36 0.065 +37 0.059 +38 0.052 +39 0.045 +40 0.038 +41 0.031 +42 0.023 +43 0.016 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.033 +50 -0.041 +51 -0.049 +52 -0.058 +53 -0.067 +54 -0.075 +55 -0.084 +56 -0.093 +57 -0.102 +58 -0.112 +59 -0.121 +60 -0.131 +61 -0.140 +62 -0.150 +63 -0.160 +64 -0.170 +65 -0.180 +66 -0.191 +67 -0.202 +68 -0.213 +69 -0.224 +70 -0.236 +71 -0.248 +72 -0.260 +73 -0.273 +74 -0.286 +75 -0.300 +76 -0.314 +77 -0.328 +78 -0.343 +79 -0.359 +80 -0.375 +81 -0.392 +82 -0.409 +83 -0.427 +84 -0.446 +85 -0.466 +86 -0.486 +87 -0.507 +88 -0.530 +89 -0.553 +90 -0.577 +1 0.161 +2 0.181 +3 0.199 +4 0.215 +5 0.229 +6 0.241 +7 0.252 +8 0.261 +9 0.268 +10 0.274 +11 0.278 +12 0.281 +13 0.283 +14 0.283 +15 0.283 +16 0.281 +17 0.278 +18 0.275 +19 0.270 +20 0.265 +21 0.259 +22 0.252 +23 0.244 +24 0.236 +25 0.228 +26 0.219 +27 0.209 +28 0.199 +29 0.189 +30 0.178 +31 0.167 +32 0.156 +33 0.144 +34 0.133 +35 0.121 +36 0.109 +37 0.097 +38 0.085 +39 0.073 +40 0.060 +41 0.048 +42 0.036 +43 0.024 +44 0.012 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.036 +49 -0.047 +50 -0.059 +51 -0.070 +52 -0.082 +53 -0.093 +54 -0.104 +55 -0.115 +56 -0.126 +57 -0.137 +58 -0.148 +59 -0.159 +60 -0.169 +61 -0.180 +62 -0.191 +63 -0.201 +64 -0.212 +65 -0.223 +66 -0.234 +67 -0.245 +68 -0.256 +69 -0.267 +70 -0.279 +71 -0.291 +72 -0.303 +73 -0.315 +74 -0.328 +75 -0.341 +76 -0.355 +77 -0.369 +78 -0.383 +79 -0.398 +80 -0.414 +81 -0.431 +82 -0.448 +83 -0.466 +84 -0.485 +85 -0.505 +86 -0.526 +87 -0.547 +88 -0.570 +89 -0.595 +90 -0.620 +1 0.284 +2 0.310 +3 0.333 +4 0.353 +5 0.371 +6 0.386 +7 0.399 +8 0.409 +9 0.417 +10 0.424 +11 0.428 +12 0.430 +13 0.431 +14 0.430 +15 0.427 +16 0.423 +17 0.417 +18 0.411 +19 0.403 +20 0.394 +21 0.384 +22 0.373 +23 0.361 +24 0.348 +25 0.335 +26 0.321 +27 0.306 +28 0.291 +29 0.275 +30 0.259 +31 0.243 +32 0.226 +33 0.209 +34 0.192 +35 0.174 +36 0.157 +37 0.139 +38 0.122 +39 0.104 +40 0.087 +41 0.069 +42 0.052 +43 0.034 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.067 +50 -0.083 +51 -0.099 +52 -0.114 +53 -0.130 +54 -0.145 +55 -0.160 +56 -0.175 +57 -0.190 +58 -0.205 +59 -0.220 +60 -0.234 +61 -0.248 +62 -0.263 +63 -0.277 +64 -0.291 +65 -0.306 +66 -0.320 +67 -0.334 +68 -0.349 +69 -0.364 +70 -0.379 +71 -0.394 +72 -0.410 +73 -0.426 +74 -0.443 +75 -0.460 +76 -0.478 +77 -0.496 +78 -0.515 +79 -0.535 +80 -0.556 +81 -0.577 +82 -0.600 +83 -0.624 +84 -0.649 +85 -0.675 +86 -0.702 +87 -0.731 +88 -0.762 +89 -0.794 +90 -0.828 +1 0.393 +2 0.416 +3 0.436 +4 0.453 +5 0.468 +6 0.480 +7 0.490 +8 0.497 +9 0.502 +10 0.505 +11 0.506 +12 0.505 +13 0.502 +14 0.498 +15 0.493 +16 0.485 +17 0.477 +18 0.467 +19 0.456 +20 0.444 +21 0.431 +22 0.417 +23 0.403 +24 0.387 +25 0.371 +26 0.354 +27 0.337 +28 0.319 +29 0.301 +30 0.283 +31 0.264 +32 0.245 +33 0.226 +34 0.207 +35 0.188 +36 0.169 +37 0.149 +38 0.130 +39 0.111 +40 0.092 +41 0.073 +42 0.055 +43 0.036 +44 0.018 +45 -0.000 +46 -0.018 +47 -0.035 +48 -0.052 +49 -0.069 +50 -0.086 +51 -0.102 +52 -0.118 +53 -0.133 +54 -0.149 +55 -0.164 +56 -0.178 +57 -0.193 +58 -0.207 +59 -0.221 +60 -0.235 +61 -0.248 +62 -0.262 +63 -0.275 +64 -0.288 +65 -0.302 +66 -0.315 +67 -0.328 +68 -0.341 +69 -0.354 +70 -0.368 +71 -0.382 +72 -0.396 +73 -0.410 +74 -0.425 +75 -0.440 +76 -0.456 +77 -0.472 +78 -0.489 +79 -0.506 +80 -0.525 +81 -0.544 +82 -0.565 +83 -0.586 +84 -0.608 +85 -0.632 +86 -0.657 +87 -0.684 +88 -0.712 +89 -0.742 +90 -0.773 +1 0.368 +2 0.393 +3 0.414 +4 0.433 +5 0.449 +6 0.462 +7 0.473 +8 0.482 +9 0.488 +10 0.492 +11 0.494 +12 0.494 +13 0.493 +14 0.490 +15 0.485 +16 0.478 +17 0.471 +18 0.462 +19 0.451 +20 0.440 +21 0.428 +22 0.414 +23 0.400 +24 0.385 +25 0.369 +26 0.353 +27 0.336 +28 0.319 +29 0.301 +30 0.283 +31 0.265 +32 0.246 +33 0.227 +34 0.208 +35 0.189 +36 0.169 +37 0.150 +38 0.131 +39 0.112 +40 0.093 +41 0.074 +42 0.055 +43 0.037 +44 0.018 +45 -0.000 +46 -0.018 +47 -0.036 +48 -0.053 +49 -0.070 +50 -0.087 +51 -0.104 +52 -0.120 +53 -0.136 +54 -0.152 +55 -0.167 +56 -0.182 +57 -0.197 +58 -0.212 +59 -0.226 +60 -0.241 +61 -0.255 +62 -0.269 +63 -0.283 +64 -0.297 +65 -0.311 +66 -0.325 +67 -0.339 +68 -0.353 +69 -0.367 +70 -0.381 +71 -0.396 +72 -0.410 +73 -0.426 +74 -0.441 +75 -0.457 +76 -0.474 +77 -0.491 +78 -0.509 +79 -0.528 +80 -0.548 +81 -0.568 +82 -0.590 +83 -0.612 +84 -0.636 +85 -0.661 +86 -0.688 +87 -0.715 +88 -0.745 +89 -0.776 +90 -0.809 +1 0.416 +2 0.435 +3 0.451 +4 0.465 +5 0.476 +6 0.485 +7 0.492 +8 0.496 +9 0.499 +10 0.500 +11 0.499 +12 0.496 +13 0.492 +14 0.487 +15 0.480 +16 0.471 +17 0.462 +18 0.452 +19 0.440 +20 0.428 +21 0.414 +22 0.400 +23 0.385 +24 0.370 +25 0.354 +26 0.338 +27 0.321 +28 0.303 +29 0.286 +30 0.268 +31 0.250 +32 0.232 +33 0.213 +34 0.195 +35 0.177 +36 0.158 +37 0.140 +38 0.122 +39 0.104 +40 0.086 +41 0.068 +42 0.051 +43 0.034 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.064 +50 -0.079 +51 -0.094 +52 -0.108 +53 -0.122 +54 -0.136 +55 -0.149 +56 -0.163 +57 -0.175 +58 -0.188 +59 -0.200 +60 -0.212 +61 -0.224 +62 -0.236 +63 -0.247 +64 -0.259 +65 -0.270 +66 -0.281 +67 -0.292 +68 -0.303 +69 -0.315 +70 -0.326 +71 -0.337 +72 -0.349 +73 -0.361 +74 -0.373 +75 -0.386 +76 -0.399 +77 -0.412 +78 -0.426 +79 -0.441 +80 -0.456 +81 -0.472 +82 -0.489 +83 -0.507 +84 -0.526 +85 -0.546 +86 -0.567 +87 -0.589 +88 -0.613 +89 -0.638 +90 -0.665 +1 0.367 +2 0.390 +3 0.409 +4 0.427 +5 0.441 +6 0.453 +7 0.463 +8 0.470 +9 0.475 +10 0.479 +11 0.480 +12 0.480 +13 0.478 +14 0.474 +15 0.469 +16 0.462 +17 0.454 +18 0.445 +19 0.435 +20 0.424 +21 0.412 +22 0.398 +23 0.385 +24 0.370 +25 0.355 +26 0.339 +27 0.323 +28 0.306 +29 0.289 +30 0.271 +31 0.253 +32 0.235 +33 0.217 +34 0.199 +35 0.180 +36 0.162 +37 0.143 +38 0.125 +39 0.107 +40 0.088 +41 0.070 +42 0.052 +43 0.035 +44 0.017 +45 -0.000 +46 -0.017 +47 -0.034 +48 -0.050 +49 -0.067 +50 -0.082 +51 -0.098 +52 -0.114 +53 -0.129 +54 -0.143 +55 -0.158 +56 -0.172 +57 -0.186 +58 -0.200 +59 -0.214 +60 -0.227 +61 -0.240 +62 -0.253 +63 -0.266 +64 -0.279 +65 -0.292 +66 -0.305 +67 -0.318 +68 -0.331 +69 -0.344 +70 -0.357 +71 -0.370 +72 -0.384 +73 -0.398 +74 -0.413 +75 -0.427 +76 -0.443 +77 -0.459 +78 -0.475 +79 -0.493 +80 -0.511 +81 -0.530 +82 -0.550 +83 -0.570 +84 -0.592 +85 -0.616 +86 -0.640 +87 -0.666 +88 -0.693 +89 -0.722 +90 -0.753 +1 0.264 +2 0.263 +3 0.261 +4 0.259 +5 0.256 +6 0.253 +7 0.249 +8 0.244 +9 0.240 +10 0.235 +11 0.229 +12 0.224 +13 0.218 +14 0.211 +15 0.205 +16 0.198 +17 0.191 +18 0.184 +19 0.177 +20 0.169 +21 0.162 +22 0.154 +23 0.147 +24 0.139 +25 0.132 +26 0.124 +27 0.116 +28 0.109 +29 0.101 +30 0.094 +31 0.087 +32 0.079 +33 0.072 +34 0.065 +35 0.059 +36 0.052 +37 0.045 +38 0.039 +39 0.033 +40 0.027 +41 0.021 +42 0.015 +43 0.010 +44 0.005 +45 -0.000 +46 -0.005 +47 -0.009 +48 -0.013 +49 -0.017 +50 -0.021 +51 -0.025 +52 -0.028 +53 -0.031 +54 -0.034 +55 -0.036 +56 -0.038 +57 -0.041 +58 -0.042 +59 -0.044 +60 -0.045 +61 -0.047 +62 -0.048 +63 -0.048 +64 -0.049 +65 -0.049 +66 -0.050 +67 -0.050 +68 -0.050 +69 -0.049 +70 -0.049 +71 -0.049 +72 -0.048 +73 -0.047 +74 -0.047 +75 -0.046 +76 -0.045 +77 -0.044 +78 -0.043 +79 -0.042 +80 -0.042 +81 -0.041 +82 -0.040 +83 -0.040 +84 -0.039 +85 -0.039 +86 -0.039 +87 -0.039 +88 -0.039 +89 -0.039 +90 -0.040 +1 0.293 +2 0.298 +3 0.302 +4 0.305 +5 0.307 +6 0.308 +7 0.307 +8 0.306 +9 0.304 +10 0.301 +11 0.298 +12 0.293 +13 0.288 +14 0.283 +15 0.277 +16 0.270 +17 0.263 +18 0.255 +19 0.247 +20 0.238 +21 0.230 +22 0.221 +23 0.211 +24 0.202 +25 0.192 +26 0.182 +27 0.172 +28 0.162 +29 0.152 +30 0.142 +31 0.132 +32 0.122 +33 0.112 +34 0.101 +35 0.092 +36 0.082 +37 0.072 +38 0.062 +39 0.053 +40 0.043 +41 0.034 +42 0.025 +43 0.017 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.023 +49 -0.031 +50 -0.038 +51 -0.044 +52 -0.051 +53 -0.057 +54 -0.063 +55 -0.069 +56 -0.075 +57 -0.080 +58 -0.085 +59 -0.090 +60 -0.094 +61 -0.099 +62 -0.103 +63 -0.107 +64 -0.111 +65 -0.115 +66 -0.118 +67 -0.122 +68 -0.125 +69 -0.129 +70 -0.132 +71 -0.135 +72 -0.139 +73 -0.142 +74 -0.145 +75 -0.148 +76 -0.152 +77 -0.156 +78 -0.159 +79 -0.163 +80 -0.168 +81 -0.172 +82 -0.177 +83 -0.182 +84 -0.188 +85 -0.194 +86 -0.200 +87 -0.207 +88 -0.214 +89 -0.222 +90 -0.231 +1 0.222 +2 0.219 +3 0.216 +4 0.213 +5 0.209 +6 0.205 +7 0.201 +8 0.196 +9 0.191 +10 0.186 +11 0.181 +12 0.176 +13 0.170 +14 0.164 +15 0.159 +16 0.153 +17 0.147 +18 0.141 +19 0.135 +20 0.129 +21 0.123 +22 0.117 +23 0.110 +24 0.104 +25 0.098 +26 0.092 +27 0.086 +28 0.080 +29 0.075 +30 0.069 +31 0.063 +32 0.058 +33 0.053 +34 0.047 +35 0.042 +36 0.037 +37 0.032 +38 0.028 +39 0.023 +40 0.019 +41 0.015 +42 0.011 +43 0.007 +44 0.003 +45 -0.000 +46 -0.003 +47 -0.006 +48 -0.009 +49 -0.012 +50 -0.014 +51 -0.016 +52 -0.018 +53 -0.020 +54 -0.022 +55 -0.023 +56 -0.024 +57 -0.025 +58 -0.026 +59 -0.027 +60 -0.027 +61 -0.027 +62 -0.027 +63 -0.027 +64 -0.027 +65 -0.027 +66 -0.026 +67 -0.025 +68 -0.024 +69 -0.023 +70 -0.022 +71 -0.021 +72 -0.019 +73 -0.018 +74 -0.016 +75 -0.014 +76 -0.012 +77 -0.011 +78 -0.009 +79 -0.007 +80 -0.005 +81 -0.003 +82 -0.001 +83 0.001 +84 0.003 +85 0.005 +86 0.007 +87 0.009 +88 0.011 +89 0.012 +90 0.014 +1 0.270 +2 0.277 +3 0.283 +4 0.288 +5 0.291 +6 0.293 +7 0.294 +8 0.295 +9 0.294 +10 0.292 +11 0.290 +12 0.286 +13 0.282 +14 0.278 +15 0.272 +16 0.266 +17 0.260 +18 0.253 +19 0.245 +20 0.237 +21 0.229 +22 0.221 +23 0.212 +24 0.203 +25 0.193 +26 0.184 +27 0.174 +28 0.164 +29 0.154 +30 0.144 +31 0.134 +32 0.124 +33 0.114 +34 0.104 +35 0.094 +36 0.084 +37 0.074 +38 0.064 +39 0.054 +40 0.045 +41 0.036 +42 0.026 +43 0.017 +44 0.009 +45 -0.000 +46 -0.008 +47 -0.017 +48 -0.024 +49 -0.032 +50 -0.040 +51 -0.047 +52 -0.054 +53 -0.061 +54 -0.067 +55 -0.074 +56 -0.080 +57 -0.086 +58 -0.091 +59 -0.097 +60 -0.102 +61 -0.107 +62 -0.112 +63 -0.117 +64 -0.122 +65 -0.126 +66 -0.131 +67 -0.135 +68 -0.139 +69 -0.144 +70 -0.148 +71 -0.152 +72 -0.157 +73 -0.161 +74 -0.165 +75 -0.170 +76 -0.175 +77 -0.180 +78 -0.185 +79 -0.190 +80 -0.196 +81 -0.202 +82 -0.208 +83 -0.214 +84 -0.222 +85 -0.229 +86 -0.237 +87 -0.246 +88 -0.255 +89 -0.265 +90 -0.276 +1 0.157 +2 0.157 +3 0.158 +4 0.158 +5 0.157 +6 0.156 +7 0.155 +8 0.153 +9 0.151 +10 0.149 +11 0.146 +12 0.143 +13 0.140 +14 0.137 +15 0.133 +16 0.129 +17 0.125 +18 0.121 +19 0.117 +20 0.112 +21 0.108 +22 0.103 +23 0.099 +24 0.094 +25 0.089 +26 0.084 +27 0.080 +28 0.075 +29 0.070 +30 0.065 +31 0.060 +32 0.055 +33 0.051 +34 0.046 +35 0.041 +36 0.037 +37 0.032 +38 0.028 +39 0.024 +40 0.019 +41 0.015 +42 0.011 +43 0.007 +44 0.004 +45 -0.000 +46 -0.004 +47 -0.007 +48 -0.010 +49 -0.013 +50 -0.016 +51 -0.019 +52 -0.022 +53 -0.024 +54 -0.027 +55 -0.029 +56 -0.031 +57 -0.033 +58 -0.035 +59 -0.037 +60 -0.039 +61 -0.040 +62 -0.042 +63 -0.043 +64 -0.044 +65 -0.045 +66 -0.047 +67 -0.048 +68 -0.048 +69 -0.049 +70 -0.050 +71 -0.051 +72 -0.051 +73 -0.052 +74 -0.053 +75 -0.053 +76 -0.054 +77 -0.055 +78 -0.055 +79 -0.056 +80 -0.057 +81 -0.058 +82 -0.059 +83 -0.060 +84 -0.061 +85 -0.062 +86 -0.063 +87 -0.065 +88 -0.067 +89 -0.069 +90 -0.071 +1 0.162 +2 0.170 +3 0.178 +4 0.184 +5 0.189 +6 0.193 +7 0.197 +8 0.199 +9 0.201 +10 0.201 +11 0.201 +12 0.201 +13 0.199 +14 0.198 +15 0.195 +16 0.192 +17 0.188 +18 0.184 +19 0.180 +20 0.175 +21 0.170 +22 0.164 +23 0.158 +24 0.152 +25 0.146 +26 0.139 +27 0.132 +28 0.125 +29 0.118 +30 0.111 +31 0.104 +32 0.096 +33 0.089 +34 0.081 +35 0.074 +36 0.066 +37 0.058 +38 0.051 +39 0.043 +40 0.036 +41 0.029 +42 0.021 +43 0.014 +44 0.007 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.020 +49 -0.027 +50 -0.033 +51 -0.040 +52 -0.046 +53 -0.052 +54 -0.058 +55 -0.064 +56 -0.069 +57 -0.075 +58 -0.080 +59 -0.086 +60 -0.091 +61 -0.096 +62 -0.101 +63 -0.106 +64 -0.111 +65 -0.116 +66 -0.121 +67 -0.126 +68 -0.131 +69 -0.136 +70 -0.141 +71 -0.146 +72 -0.151 +73 -0.156 +74 -0.162 +75 -0.167 +76 -0.173 +77 -0.179 +78 -0.185 +79 -0.192 +80 -0.198 +81 -0.205 +82 -0.213 +83 -0.220 +84 -0.229 +85 -0.237 +86 -0.246 +87 -0.256 +88 -0.266 +89 -0.277 +90 -0.288 +1 -0.129 +2 -0.132 +3 -0.134 +4 -0.135 +5 -0.136 +6 -0.136 +7 -0.136 +8 -0.136 +9 -0.135 +10 -0.134 +11 -0.132 +12 -0.130 +13 -0.128 +14 -0.126 +15 -0.123 +16 -0.120 +17 -0.117 +18 -0.113 +19 -0.110 +20 -0.106 +21 -0.102 +22 -0.098 +23 -0.094 +24 -0.090 +25 -0.085 +26 -0.081 +27 -0.077 +28 -0.072 +29 -0.068 +30 -0.063 +31 -0.058 +32 -0.054 +33 -0.049 +34 -0.045 +35 -0.041 +36 -0.036 +37 -0.032 +38 -0.028 +39 -0.023 +40 -0.019 +41 -0.015 +42 -0.011 +43 -0.007 +44 -0.004 +45 0.000 +46 0.004 +47 0.007 +48 0.010 +49 0.014 +50 0.017 +51 0.020 +52 0.022 +53 0.025 +54 0.028 +55 0.030 +56 0.033 +57 0.035 +58 0.037 +59 0.040 +60 0.042 +61 0.044 +62 0.046 +63 0.047 +64 0.049 +65 0.051 +66 0.053 +67 0.054 +68 0.056 +69 0.057 +70 0.059 +71 0.061 +72 0.062 +73 0.064 +74 0.066 +75 0.067 +76 0.069 +77 0.071 +78 0.073 +79 0.075 +80 0.078 +81 0.080 +82 0.083 +83 0.085 +84 0.088 +85 0.092 +86 0.095 +87 0.099 +88 0.103 +89 0.107 +90 0.112 +1 -0.220 +2 -0.217 +3 -0.213 +4 -0.210 +5 -0.206 +6 -0.202 +7 -0.197 +8 -0.193 +9 -0.188 +10 -0.183 +11 -0.178 +12 -0.172 +13 -0.167 +14 -0.161 +15 -0.155 +16 -0.149 +17 -0.143 +18 -0.137 +19 -0.131 +20 -0.125 +21 -0.119 +22 -0.113 +23 -0.107 +24 -0.101 +25 -0.095 +26 -0.089 +27 -0.083 +28 -0.077 +29 -0.072 +30 -0.066 +31 -0.061 +32 -0.055 +33 -0.050 +34 -0.045 +35 -0.040 +36 -0.035 +37 -0.031 +38 -0.026 +39 -0.022 +40 -0.018 +41 -0.014 +42 -0.010 +43 -0.006 +44 -0.003 +45 0.000 +46 0.003 +47 0.006 +48 0.008 +49 0.011 +50 0.013 +51 0.015 +52 0.016 +53 0.018 +54 0.019 +55 0.020 +56 0.021 +57 0.022 +58 0.022 +59 0.023 +60 0.023 +61 0.023 +62 0.022 +63 0.022 +64 0.021 +65 0.021 +66 0.020 +67 0.019 +68 0.018 +69 0.016 +70 0.015 +71 0.014 +72 0.012 +73 0.010 +74 0.009 +75 0.007 +76 0.005 +77 0.003 +78 0.001 +79 -0.001 +80 -0.003 +81 -0.005 +82 -0.006 +83 -0.008 +84 -0.010 +85 -0.012 +86 -0.013 +87 -0.015 +88 -0.016 +89 -0.017 +90 -0.018 +1 -0.605 +2 -0.614 +3 -0.621 +4 -0.626 +5 -0.628 +6 -0.628 +7 -0.627 +8 -0.623 +9 -0.618 +10 -0.612 +11 -0.604 +12 -0.594 +13 -0.583 +14 -0.571 +15 -0.558 +16 -0.544 +17 -0.529 +18 -0.513 +19 -0.496 +20 -0.478 +21 -0.460 +22 -0.442 +23 -0.423 +24 -0.403 +25 -0.384 +26 -0.364 +27 -0.343 +28 -0.323 +29 -0.302 +30 -0.282 +31 -0.262 +32 -0.241 +33 -0.221 +34 -0.201 +35 -0.181 +36 -0.161 +37 -0.142 +38 -0.123 +39 -0.104 +40 -0.085 +41 -0.067 +42 -0.050 +43 -0.033 +44 -0.016 +45 0.000 +46 0.016 +47 0.031 +48 0.045 +49 0.060 +50 0.073 +51 0.086 +52 0.099 +53 0.111 +54 0.122 +55 0.133 +56 0.143 +57 0.153 +58 0.163 +59 0.172 +60 0.180 +61 0.188 +62 0.196 +63 0.204 +64 0.211 +65 0.217 +66 0.224 +67 0.230 +68 0.236 +69 0.242 +70 0.248 +71 0.254 +72 0.260 +73 0.265 +74 0.271 +75 0.278 +76 0.284 +77 0.291 +78 0.298 +79 0.305 +80 0.313 +81 0.321 +82 0.331 +83 0.341 +84 0.351 +85 0.363 +86 0.375 +87 0.389 +88 0.404 +89 0.420 +90 0.437 +1 -0.853 +2 -0.861 +3 -0.867 +4 -0.870 +5 -0.870 +6 -0.868 +7 -0.863 +8 -0.856 +9 -0.847 +10 -0.836 +11 -0.823 +12 -0.808 +13 -0.792 +14 -0.774 +15 -0.755 +16 -0.734 +17 -0.713 +18 -0.690 +19 -0.667 +20 -0.642 +21 -0.617 +22 -0.592 +23 -0.565 +24 -0.539 +25 -0.512 +26 -0.484 +27 -0.457 +28 -0.429 +29 -0.402 +30 -0.374 +31 -0.346 +32 -0.319 +33 -0.292 +34 -0.265 +35 -0.238 +36 -0.212 +37 -0.186 +38 -0.161 +39 -0.136 +40 -0.112 +41 -0.088 +42 -0.065 +43 -0.043 +44 -0.021 +45 0.000 +46 0.020 +47 0.040 +48 0.059 +49 0.077 +50 0.095 +51 0.111 +52 0.127 +53 0.142 +54 0.157 +55 0.170 +56 0.183 +57 0.196 +58 0.207 +59 0.218 +60 0.229 +61 0.238 +62 0.247 +63 0.256 +64 0.264 +65 0.272 +66 0.279 +67 0.286 +68 0.293 +69 0.299 +70 0.305 +71 0.311 +72 0.317 +73 0.323 +74 0.329 +75 0.335 +76 0.342 +77 0.348 +78 0.355 +79 0.363 +80 0.371 +81 0.380 +82 0.389 +83 0.400 +84 0.411 +85 0.424 +86 0.437 +87 0.452 +88 0.469 +89 0.486 +90 0.506 +1 -1.145 +2 -1.161 +3 -1.173 +4 -1.180 +5 -1.184 +6 -1.184 +7 -1.180 +8 -1.173 +9 -1.163 +10 -1.150 +11 -1.134 +12 -1.115 +13 -1.094 +14 -1.071 +15 -1.046 +16 -1.019 +17 -0.991 +18 -0.961 +19 -0.929 +20 -0.896 +21 -0.862 +22 -0.827 +23 -0.791 +24 -0.755 +25 -0.718 +26 -0.680 +27 -0.642 +28 -0.604 +29 -0.565 +30 -0.527 +31 -0.489 +32 -0.450 +33 -0.412 +34 -0.375 +35 -0.338 +36 -0.301 +37 -0.264 +38 -0.229 +39 -0.194 +40 -0.159 +41 -0.126 +42 -0.093 +43 -0.061 +44 -0.030 +45 0.000 +46 0.029 +47 0.057 +48 0.085 +49 0.111 +50 0.136 +51 0.160 +52 0.184 +53 0.206 +54 0.227 +55 0.247 +56 0.267 +57 0.285 +58 0.302 +59 0.319 +60 0.335 +61 0.350 +62 0.364 +63 0.377 +64 0.390 +65 0.403 +66 0.414 +67 0.426 +68 0.437 +69 0.448 +70 0.458 +71 0.468 +72 0.479 +73 0.489 +74 0.500 +75 0.511 +76 0.522 +77 0.534 +78 0.546 +79 0.559 +80 0.573 +81 0.588 +82 0.605 +83 0.622 +84 0.641 +85 0.662 +86 0.684 +87 0.708 +88 0.734 +89 0.763 +90 0.794 +1 -1.412 +2 -1.432 +3 -1.446 +4 -1.456 +5 -1.460 +6 -1.460 +7 -1.455 +8 -1.446 +9 -1.434 +10 -1.418 +11 -1.398 +12 -1.375 +13 -1.350 +14 -1.321 +15 -1.290 +16 -1.257 +17 -1.222 +18 -1.185 +19 -1.146 +20 -1.105 +21 -1.063 +22 -1.020 +23 -0.976 +24 -0.931 +25 -0.885 +26 -0.839 +27 -0.792 +28 -0.745 +29 -0.697 +30 -0.650 +31 -0.603 +32 -0.556 +33 -0.509 +34 -0.462 +35 -0.416 +36 -0.371 +37 -0.326 +38 -0.282 +39 -0.239 +40 -0.197 +41 -0.155 +42 -0.115 +43 -0.075 +44 -0.037 +45 0.000 +46 0.036 +47 0.071 +48 0.104 +49 0.137 +50 0.168 +51 0.198 +52 0.226 +53 0.254 +54 0.280 +55 0.305 +56 0.329 +57 0.352 +58 0.373 +59 0.394 +60 0.413 +61 0.432 +62 0.449 +63 0.466 +64 0.482 +65 0.497 +66 0.511 +67 0.525 +68 0.539 +69 0.552 +70 0.565 +71 0.578 +72 0.591 +73 0.603 +74 0.616 +75 0.630 +76 0.644 +77 0.658 +78 0.673 +79 0.689 +80 0.707 +81 0.725 +82 0.745 +83 0.767 +84 0.790 +85 0.815 +86 0.843 +87 0.872 +88 0.905 +89 0.940 +90 0.978 +1 -2.047 +2 -2.086 +3 -2.115 +4 -2.136 +5 -2.150 +6 -2.156 +7 -2.155 +8 -2.148 +9 -2.135 +10 -2.115 +11 -2.090 +12 -2.060 +13 -2.026 +14 -1.987 +15 -1.943 +16 -1.896 +17 -1.846 +18 -1.792 +19 -1.736 +20 -1.676 +21 -1.615 +22 -1.551 +23 -1.486 +24 -1.419 +25 -1.351 +26 -1.282 +27 -1.212 +28 -1.141 +29 -1.070 +30 -0.998 +31 -0.926 +32 -0.855 +33 -0.784 +34 -0.713 +35 -0.643 +36 -0.573 +37 -0.505 +38 -0.437 +39 -0.371 +40 -0.305 +41 -0.241 +42 -0.179 +43 -0.118 +44 -0.058 +45 0.000 +46 0.056 +47 0.111 +48 0.164 +49 0.215 +50 0.265 +51 0.312 +52 0.358 +53 0.402 +54 0.445 +55 0.485 +56 0.524 +57 0.562 +58 0.597 +59 0.632 +60 0.664 +61 0.696 +62 0.726 +63 0.755 +64 0.783 +65 0.810 +66 0.836 +67 0.861 +68 0.886 +69 0.911 +70 0.935 +71 0.959 +72 0.983 +73 1.008 +74 1.033 +75 1.059 +76 1.086 +77 1.113 +78 1.143 +79 1.173 +80 1.206 +81 1.241 +82 1.278 +83 1.318 +84 1.360 +85 1.406 +86 1.456 +87 1.509 +88 1.567 +89 1.629 +90 1.696 +1 -1.086 +2 -1.088 +3 -1.087 +4 -1.083 +5 -1.077 +6 -1.068 +7 -1.056 +8 -1.043 +9 -1.027 +10 -1.009 +11 -0.989 +12 -0.967 +13 -0.944 +14 -0.920 +15 -0.894 +16 -0.867 +17 -0.839 +18 -0.810 +19 -0.780 +20 -0.749 +21 -0.718 +22 -0.686 +23 -0.654 +24 -0.622 +25 -0.589 +26 -0.556 +27 -0.523 +28 -0.490 +29 -0.458 +30 -0.425 +31 -0.393 +32 -0.361 +33 -0.329 +34 -0.298 +35 -0.267 +36 -0.237 +37 -0.208 +38 -0.179 +39 -0.151 +40 -0.124 +41 -0.097 +42 -0.072 +43 -0.047 +44 -0.023 +45 0.000 +46 0.022 +47 0.043 +48 0.063 +49 0.083 +50 0.101 +51 0.118 +52 0.134 +53 0.150 +54 0.164 +55 0.177 +56 0.190 +57 0.201 +58 0.212 +59 0.221 +60 0.230 +61 0.238 +62 0.246 +63 0.252 +64 0.258 +65 0.263 +66 0.268 +67 0.272 +68 0.275 +69 0.278 +70 0.281 +71 0.283 +72 0.286 +73 0.288 +74 0.289 +75 0.291 +76 0.293 +77 0.295 +78 0.298 +79 0.300 +80 0.304 +81 0.307 +82 0.312 +83 0.317 +84 0.323 +85 0.330 +86 0.338 +87 0.347 +88 0.358 +89 0.370 +90 0.384 +1 -0.618 +2 -0.609 +3 -0.599 +4 -0.588 +5 -0.577 +6 -0.565 +7 -0.552 +8 -0.538 +9 -0.524 +10 -0.510 +11 -0.495 +12 -0.479 +13 -0.464 +14 -0.448 +15 -0.431 +16 -0.415 +17 -0.398 +18 -0.381 +19 -0.364 +20 -0.347 +21 -0.330 +22 -0.313 +23 -0.296 +24 -0.280 +25 -0.263 +26 -0.247 +27 -0.230 +28 -0.214 +29 -0.198 +30 -0.183 +31 -0.168 +32 -0.153 +33 -0.139 +34 -0.124 +35 -0.111 +36 -0.097 +37 -0.085 +38 -0.072 +39 -0.060 +40 -0.049 +41 -0.038 +42 -0.028 +43 -0.018 +44 -0.009 +45 0.000 +46 0.008 +47 0.016 +48 0.023 +49 0.029 +50 0.035 +51 0.041 +52 0.045 +53 0.050 +54 0.053 +55 0.056 +56 0.059 +57 0.061 +58 0.062 +59 0.063 +60 0.063 +61 0.063 +62 0.062 +63 0.061 +64 0.060 +65 0.058 +66 0.055 +67 0.052 +68 0.049 +69 0.045 +70 0.041 +71 0.037 +72 0.032 +73 0.027 +74 0.022 +75 0.016 +76 0.011 +77 0.005 +78 -0.001 +79 -0.007 +80 -0.013 +81 -0.019 +82 -0.025 +83 -0.031 +84 -0.037 +85 -0.042 +86 -0.048 +87 -0.053 +88 -0.058 +89 -0.063 +90 -0.067 +1 -0.055 +2 -0.026 +3 0.001 +4 0.025 +5 0.048 +6 0.069 +7 0.087 +8 0.104 +9 0.119 +10 0.132 +11 0.144 +12 0.154 +13 0.163 +14 0.170 +15 0.176 +16 0.181 +17 0.184 +18 0.187 +19 0.188 +20 0.188 +21 0.188 +22 0.186 +23 0.184 +24 0.180 +25 0.176 +26 0.172 +27 0.166 +28 0.161 +29 0.154 +30 0.147 +31 0.139 +32 0.132 +33 0.123 +34 0.114 +35 0.105 +36 0.096 +37 0.086 +38 0.076 +39 0.066 +40 0.055 +41 0.045 +42 0.034 +43 0.023 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.023 +48 -0.035 +49 -0.047 +50 -0.059 +51 -0.071 +52 -0.083 +53 -0.095 +54 -0.108 +55 -0.120 +56 -0.133 +57 -0.145 +58 -0.158 +59 -0.171 +60 -0.185 +61 -0.198 +62 -0.212 +63 -0.226 +64 -0.240 +65 -0.254 +66 -0.269 +67 -0.284 +68 -0.299 +69 -0.315 +70 -0.331 +71 -0.348 +72 -0.365 +73 -0.382 +74 -0.401 +75 -0.419 +76 -0.439 +77 -0.459 +78 -0.480 +79 -0.502 +80 -0.524 +81 -0.548 +82 -0.572 +83 -0.597 +84 -0.624 +85 -0.652 +86 -0.680 +87 -0.711 +88 -0.742 +89 -0.775 +90 -0.809 +1 0.241 +2 0.268 +3 0.291 +4 0.312 +5 0.330 +6 0.346 +7 0.359 +8 0.370 +9 0.379 +10 0.386 +11 0.391 +12 0.395 +13 0.396 +14 0.396 +15 0.394 +16 0.391 +17 0.387 +18 0.382 +19 0.375 +20 0.367 +21 0.358 +22 0.348 +23 0.337 +24 0.326 +25 0.314 +26 0.301 +27 0.287 +28 0.273 +29 0.259 +30 0.244 +31 0.229 +32 0.213 +33 0.197 +34 0.181 +35 0.165 +36 0.149 +37 0.132 +38 0.115 +39 0.099 +40 0.082 +41 0.066 +42 0.049 +43 0.033 +44 0.016 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.064 +50 -0.079 +51 -0.095 +52 -0.110 +53 -0.125 +54 -0.140 +55 -0.155 +56 -0.169 +57 -0.184 +58 -0.198 +59 -0.213 +60 -0.227 +61 -0.241 +62 -0.255 +63 -0.269 +64 -0.284 +65 -0.298 +66 -0.312 +67 -0.327 +68 -0.342 +69 -0.357 +70 -0.372 +71 -0.388 +72 -0.404 +73 -0.420 +74 -0.437 +75 -0.454 +76 -0.472 +77 -0.491 +78 -0.511 +79 -0.531 +80 -0.552 +81 -0.574 +82 -0.597 +83 -0.621 +84 -0.647 +85 -0.673 +86 -0.701 +87 -0.731 +88 -0.762 +89 -0.795 +90 -0.829 +1 0.688 +2 0.727 +3 0.760 +4 0.788 +5 0.812 +6 0.832 +7 0.847 +8 0.858 +9 0.866 +10 0.870 +11 0.871 +12 0.869 +13 0.864 +14 0.856 +15 0.846 +16 0.833 +17 0.818 +18 0.800 +19 0.781 +20 0.760 +21 0.738 +22 0.713 +23 0.688 +24 0.661 +25 0.633 +26 0.605 +27 0.575 +28 0.545 +29 0.514 +30 0.482 +31 0.450 +32 0.418 +33 0.385 +34 0.352 +35 0.319 +36 0.287 +37 0.254 +38 0.221 +39 0.188 +40 0.156 +41 0.124 +42 0.093 +43 0.061 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.059 +48 -0.088 +49 -0.117 +50 -0.144 +51 -0.172 +52 -0.199 +53 -0.225 +54 -0.250 +55 -0.276 +56 -0.300 +57 -0.324 +58 -0.348 +59 -0.372 +60 -0.395 +61 -0.417 +62 -0.440 +63 -0.462 +64 -0.484 +65 -0.506 +66 -0.527 +67 -0.549 +68 -0.571 +69 -0.594 +70 -0.616 +71 -0.639 +72 -0.662 +73 -0.686 +74 -0.711 +75 -0.736 +76 -0.762 +77 -0.789 +78 -0.818 +79 -0.847 +80 -0.878 +81 -0.911 +82 -0.945 +83 -0.981 +84 -1.019 +85 -1.059 +86 -1.102 +87 -1.147 +88 -1.194 +89 -1.245 +90 -1.298 +1 0.833 +2 0.867 +3 0.896 +4 0.920 +5 0.939 +6 0.954 +7 0.965 +8 0.972 +9 0.975 +10 0.975 +11 0.972 +12 0.965 +13 0.956 +14 0.943 +15 0.929 +16 0.912 +17 0.892 +18 0.871 +19 0.848 +20 0.823 +21 0.797 +22 0.769 +23 0.740 +24 0.709 +25 0.678 +26 0.646 +27 0.613 +28 0.580 +29 0.546 +30 0.511 +31 0.476 +32 0.441 +33 0.406 +34 0.371 +35 0.336 +36 0.300 +37 0.266 +38 0.231 +39 0.197 +40 0.163 +41 0.129 +42 0.096 +43 0.063 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.090 +49 -0.119 +50 -0.147 +51 -0.175 +52 -0.202 +53 -0.228 +54 -0.253 +55 -0.278 +56 -0.302 +57 -0.325 +58 -0.348 +59 -0.371 +60 -0.393 +61 -0.414 +62 -0.435 +63 -0.456 +64 -0.476 +65 -0.496 +66 -0.516 +67 -0.536 +68 -0.556 +69 -0.576 +70 -0.596 +71 -0.616 +72 -0.637 +73 -0.658 +74 -0.680 +75 -0.702 +76 -0.726 +77 -0.750 +78 -0.775 +79 -0.801 +80 -0.829 +81 -0.858 +82 -0.889 +83 -0.921 +84 -0.955 +85 -0.992 +86 -1.030 +87 -1.072 +88 -1.115 +89 -1.162 +90 -1.211 +1 1.027 +2 1.062 +3 1.092 +4 1.117 +5 1.136 +6 1.150 +7 1.160 +8 1.165 +9 1.167 +10 1.164 +11 1.157 +12 1.147 +13 1.134 +14 1.118 +15 1.099 +16 1.077 +17 1.053 +18 1.027 +19 0.998 +20 0.968 +21 0.936 +22 0.902 +23 0.867 +24 0.831 +25 0.793 +26 0.755 +27 0.716 +28 0.676 +29 0.636 +30 0.595 +31 0.554 +32 0.513 +33 0.471 +34 0.430 +35 0.389 +36 0.348 +37 0.307 +38 0.267 +39 0.227 +40 0.188 +41 0.149 +42 0.111 +43 0.073 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.070 +48 -0.104 +49 -0.136 +50 -0.168 +51 -0.200 +52 -0.230 +53 -0.259 +54 -0.288 +55 -0.316 +56 -0.343 +57 -0.369 +58 -0.394 +59 -0.419 +60 -0.443 +61 -0.467 +62 -0.490 +63 -0.512 +64 -0.534 +65 -0.556 +66 -0.578 +67 -0.599 +68 -0.620 +69 -0.642 +70 -0.663 +71 -0.685 +72 -0.707 +73 -0.729 +74 -0.752 +75 -0.776 +76 -0.800 +77 -0.826 +78 -0.852 +79 -0.880 +80 -0.910 +81 -0.941 +82 -0.974 +83 -1.008 +84 -1.045 +85 -1.084 +86 -1.126 +87 -1.171 +88 -1.218 +89 -1.268 +90 -1.322 +1 1.026 +2 1.054 +3 1.076 +4 1.093 +5 1.106 +6 1.115 +7 1.119 +8 1.120 +9 1.117 +10 1.111 +11 1.101 +12 1.088 +13 1.073 +14 1.055 +15 1.035 +16 1.012 +17 0.987 +18 0.960 +19 0.932 +20 0.902 +21 0.871 +22 0.838 +23 0.804 +24 0.769 +25 0.733 +26 0.697 +27 0.660 +28 0.622 +29 0.584 +30 0.546 +31 0.508 +32 0.469 +33 0.431 +34 0.392 +35 0.354 +36 0.317 +37 0.279 +38 0.242 +39 0.206 +40 0.170 +41 0.134 +42 0.100 +43 0.066 +44 0.032 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.092 +49 -0.122 +50 -0.150 +51 -0.177 +52 -0.204 +53 -0.229 +54 -0.254 +55 -0.278 +56 -0.301 +57 -0.324 +58 -0.345 +59 -0.366 +60 -0.386 +61 -0.406 +62 -0.425 +63 -0.443 +64 -0.461 +65 -0.479 +66 -0.496 +67 -0.513 +68 -0.530 +69 -0.546 +70 -0.563 +71 -0.580 +72 -0.597 +73 -0.614 +74 -0.632 +75 -0.650 +76 -0.669 +77 -0.689 +78 -0.710 +79 -0.731 +80 -0.754 +81 -0.778 +82 -0.804 +83 -0.832 +84 -0.861 +85 -0.892 +86 -0.925 +87 -0.961 +88 -0.999 +89 -1.040 +90 -1.084 +1 1.038 +2 1.063 +3 1.084 +4 1.100 +5 1.112 +6 1.120 +7 1.123 +8 1.123 +9 1.119 +10 1.112 +11 1.102 +12 1.088 +13 1.072 +14 1.054 +15 1.033 +16 1.010 +17 0.985 +18 0.958 +19 0.929 +20 0.899 +21 0.867 +22 0.834 +23 0.800 +24 0.765 +25 0.729 +26 0.693 +27 0.656 +28 0.618 +29 0.580 +30 0.542 +31 0.504 +32 0.465 +33 0.427 +34 0.389 +35 0.351 +36 0.314 +37 0.277 +38 0.240 +39 0.204 +40 0.168 +41 0.133 +42 0.099 +43 0.065 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.091 +49 -0.120 +50 -0.148 +51 -0.175 +52 -0.201 +53 -0.226 +54 -0.250 +55 -0.274 +56 -0.296 +57 -0.318 +58 -0.339 +59 -0.359 +60 -0.379 +61 -0.398 +62 -0.416 +63 -0.434 +64 -0.451 +65 -0.468 +66 -0.485 +67 -0.501 +68 -0.517 +69 -0.533 +70 -0.549 +71 -0.565 +72 -0.581 +73 -0.598 +74 -0.615 +75 -0.632 +76 -0.650 +77 -0.669 +78 -0.689 +79 -0.709 +80 -0.731 +81 -0.755 +82 -0.779 +83 -0.806 +84 -0.834 +85 -0.864 +86 -0.896 +87 -0.930 +88 -0.967 +89 -1.007 +90 -1.049 +1 1.039 +2 1.058 +3 1.073 +4 1.084 +5 1.091 +6 1.094 +7 1.094 +8 1.090 +9 1.083 +10 1.073 +11 1.061 +12 1.045 +13 1.028 +14 1.008 +15 0.986 +16 0.962 +17 0.936 +18 0.909 +19 0.880 +20 0.850 +21 0.819 +22 0.787 +23 0.754 +24 0.720 +25 0.685 +26 0.650 +27 0.614 +28 0.578 +29 0.542 +30 0.506 +31 0.470 +32 0.433 +33 0.397 +34 0.361 +35 0.326 +36 0.291 +37 0.256 +38 0.222 +39 0.188 +40 0.155 +41 0.122 +42 0.091 +43 0.060 +44 0.029 +45 -0.000 +46 -0.029 +47 -0.056 +48 -0.083 +49 -0.109 +50 -0.134 +51 -0.158 +52 -0.181 +53 -0.204 +54 -0.225 +55 -0.246 +56 -0.266 +57 -0.285 +58 -0.303 +59 -0.320 +60 -0.337 +61 -0.353 +62 -0.368 +63 -0.383 +64 -0.397 +65 -0.411 +66 -0.424 +67 -0.437 +68 -0.450 +69 -0.463 +70 -0.475 +71 -0.487 +72 -0.500 +73 -0.513 +74 -0.526 +75 -0.539 +76 -0.553 +77 -0.567 +78 -0.583 +79 -0.599 +80 -0.616 +81 -0.634 +82 -0.653 +83 -0.674 +84 -0.696 +85 -0.720 +86 -0.746 +87 -0.774 +88 -0.804 +89 -0.836 +90 -0.871 +1 0.884 +2 0.898 +3 0.909 +4 0.916 +5 0.920 +6 0.921 +7 0.919 +8 0.915 +9 0.908 +10 0.898 +11 0.886 +12 0.873 +13 0.857 +14 0.840 +15 0.820 +16 0.800 +17 0.778 +18 0.754 +19 0.730 +20 0.704 +21 0.678 +22 0.651 +23 0.623 +24 0.594 +25 0.565 +26 0.536 +27 0.506 +28 0.476 +29 0.446 +30 0.416 +31 0.386 +32 0.356 +33 0.326 +34 0.296 +35 0.267 +36 0.238 +37 0.209 +38 0.181 +39 0.153 +40 0.126 +41 0.100 +42 0.074 +43 0.048 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.067 +49 -0.088 +50 -0.108 +51 -0.128 +52 -0.146 +53 -0.164 +54 -0.181 +55 -0.197 +56 -0.213 +57 -0.228 +58 -0.242 +59 -0.256 +60 -0.268 +61 -0.281 +62 -0.292 +63 -0.304 +64 -0.314 +65 -0.325 +66 -0.335 +67 -0.344 +68 -0.354 +69 -0.363 +70 -0.372 +71 -0.381 +72 -0.390 +73 -0.399 +74 -0.409 +75 -0.418 +76 -0.428 +77 -0.439 +78 -0.450 +79 -0.462 +80 -0.474 +81 -0.487 +82 -0.502 +83 -0.517 +84 -0.534 +85 -0.552 +86 -0.572 +87 -0.593 +88 -0.615 +89 -0.640 +90 -0.667 +1 0.817 +2 0.824 +3 0.828 +4 0.829 +5 0.828 +6 0.825 +7 0.819 +8 0.811 +9 0.802 +10 0.790 +11 0.777 +12 0.763 +13 0.747 +14 0.729 +15 0.710 +16 0.691 +17 0.670 +18 0.648 +19 0.626 +20 0.602 +21 0.578 +22 0.554 +23 0.529 +24 0.504 +25 0.478 +26 0.452 +27 0.426 +28 0.400 +29 0.374 +30 0.348 +31 0.322 +32 0.296 +33 0.271 +34 0.246 +35 0.221 +36 0.196 +37 0.172 +38 0.149 +39 0.126 +40 0.103 +41 0.081 +42 0.060 +43 0.039 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.054 +49 -0.070 +50 -0.086 +51 -0.101 +52 -0.116 +53 -0.129 +54 -0.142 +55 -0.154 +56 -0.166 +57 -0.177 +58 -0.187 +59 -0.197 +60 -0.205 +61 -0.214 +62 -0.222 +63 -0.229 +64 -0.236 +65 -0.242 +66 -0.248 +67 -0.254 +68 -0.259 +69 -0.264 +70 -0.269 +71 -0.274 +72 -0.278 +73 -0.283 +74 -0.288 +75 -0.293 +76 -0.298 +77 -0.303 +78 -0.309 +79 -0.315 +80 -0.322 +81 -0.329 +82 -0.337 +83 -0.346 +84 -0.355 +85 -0.366 +86 -0.378 +87 -0.391 +88 -0.405 +89 -0.421 +90 -0.438 +1 0.592 +2 0.591 +3 0.588 +4 0.584 +5 0.579 +6 0.572 +7 0.565 +8 0.556 +9 0.546 +10 0.535 +11 0.523 +12 0.511 +13 0.497 +14 0.483 +15 0.469 +16 0.454 +17 0.438 +18 0.422 +19 0.406 +20 0.389 +21 0.372 +22 0.355 +23 0.338 +24 0.321 +25 0.303 +26 0.286 +27 0.269 +28 0.251 +29 0.234 +30 0.217 +31 0.200 +32 0.184 +33 0.167 +34 0.151 +35 0.135 +36 0.120 +37 0.105 +38 0.090 +39 0.076 +40 0.062 +41 0.049 +42 0.036 +43 0.023 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.031 +49 -0.040 +50 -0.049 +51 -0.057 +52 -0.065 +53 -0.072 +54 -0.079 +55 -0.085 +56 -0.090 +57 -0.096 +58 -0.100 +59 -0.104 +60 -0.108 +61 -0.111 +62 -0.114 +63 -0.116 +64 -0.118 +65 -0.120 +66 -0.121 +67 -0.122 +68 -0.122 +69 -0.123 +70 -0.123 +71 -0.123 +72 -0.123 +73 -0.123 +74 -0.122 +75 -0.122 +76 -0.122 +77 -0.121 +78 -0.121 +79 -0.121 +80 -0.122 +81 -0.122 +82 -0.123 +83 -0.124 +84 -0.126 +85 -0.128 +86 -0.130 +87 -0.134 +88 -0.138 +89 -0.142 +90 -0.148 +1 0.520 +2 0.513 +3 0.505 +4 0.497 +5 0.488 +6 0.478 +7 0.468 +8 0.457 +9 0.445 +10 0.433 +11 0.421 +12 0.408 +13 0.395 +14 0.382 +15 0.368 +16 0.354 +17 0.340 +18 0.326 +19 0.311 +20 0.297 +21 0.283 +22 0.268 +23 0.254 +24 0.240 +25 0.225 +26 0.211 +27 0.197 +28 0.184 +29 0.170 +30 0.157 +31 0.144 +32 0.131 +33 0.119 +34 0.107 +35 0.095 +36 0.084 +37 0.073 +38 0.062 +39 0.052 +40 0.042 +41 0.033 +42 0.024 +43 0.015 +44 0.008 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.020 +49 -0.025 +50 -0.030 +51 -0.035 +52 -0.039 +53 -0.043 +54 -0.046 +55 -0.049 +56 -0.051 +57 -0.053 +58 -0.054 +59 -0.055 +60 -0.055 +61 -0.055 +62 -0.055 +63 -0.054 +64 -0.053 +65 -0.051 +66 -0.050 +67 -0.047 +68 -0.045 +69 -0.042 +70 -0.039 +71 -0.036 +72 -0.032 +73 -0.029 +74 -0.025 +75 -0.021 +76 -0.017 +77 -0.012 +78 -0.008 +79 -0.004 +80 0.000 +81 0.004 +82 0.008 +83 0.012 +84 0.016 +85 0.019 +86 0.023 +87 0.025 +88 0.028 +89 0.030 +90 0.032 +1 0.257 +2 0.243 +3 0.230 +4 0.217 +5 0.204 +6 0.192 +7 0.180 +8 0.169 +9 0.158 +10 0.147 +11 0.137 +12 0.127 +13 0.118 +14 0.109 +15 0.101 +16 0.092 +17 0.085 +18 0.077 +19 0.070 +20 0.063 +21 0.057 +22 0.051 +23 0.045 +24 0.040 +25 0.035 +26 0.030 +27 0.026 +28 0.022 +29 0.018 +30 0.015 +31 0.012 +32 0.009 +33 0.007 +34 0.005 +35 0.003 +36 0.001 +37 -0.000 +38 -0.001 +39 -0.002 +40 -0.002 +41 -0.002 +42 -0.002 +43 -0.002 +44 -0.001 +45 0.000 +46 0.001 +47 0.003 +48 0.005 +49 0.007 +50 0.009 +51 0.012 +52 0.014 +53 0.017 +54 0.021 +55 0.024 +56 0.028 +57 0.032 +58 0.037 +59 0.042 +60 0.046 +61 0.052 +62 0.057 +63 0.063 +64 0.069 +65 0.075 +66 0.081 +67 0.088 +68 0.095 +69 0.102 +70 0.110 +71 0.118 +72 0.126 +73 0.134 +74 0.143 +75 0.152 +76 0.161 +77 0.170 +78 0.180 +79 0.190 +80 0.200 +81 0.211 +82 0.222 +83 0.233 +84 0.244 +85 0.256 +86 0.268 +87 0.280 +88 0.293 +89 0.306 +90 0.319 +1 0.150 +2 0.134 +3 0.119 +4 0.104 +5 0.091 +6 0.078 +7 0.067 +8 0.055 +9 0.045 +10 0.036 +11 0.027 +12 0.019 +13 0.011 +14 0.004 +15 -0.002 +16 -0.008 +17 -0.013 +18 -0.018 +19 -0.022 +20 -0.025 +21 -0.029 +22 -0.031 +23 -0.033 +24 -0.035 +25 -0.037 +26 -0.038 +27 -0.038 +28 -0.038 +29 -0.038 +30 -0.038 +31 -0.037 +32 -0.036 +33 -0.035 +34 -0.033 +35 -0.031 +36 -0.029 +37 -0.027 +38 -0.024 +39 -0.021 +40 -0.018 +41 -0.015 +42 -0.012 +43 -0.008 +44 -0.004 +45 0.000 +46 0.004 +47 0.009 +48 0.013 +49 0.018 +50 0.023 +51 0.028 +52 0.033 +53 0.039 +54 0.045 +55 0.050 +56 0.056 +57 0.062 +58 0.069 +59 0.075 +60 0.082 +61 0.089 +62 0.096 +63 0.103 +64 0.111 +65 0.118 +66 0.126 +67 0.134 +68 0.143 +69 0.151 +70 0.160 +71 0.169 +72 0.178 +73 0.188 +74 0.198 +75 0.208 +76 0.219 +77 0.230 +78 0.241 +79 0.253 +80 0.265 +81 0.277 +82 0.290 +83 0.303 +84 0.317 +85 0.331 +86 0.346 +87 0.361 +88 0.377 +89 0.393 +90 0.410 +1 -0.164 +2 -0.190 +3 -0.214 +4 -0.234 +5 -0.253 +6 -0.269 +7 -0.283 +8 -0.296 +9 -0.306 +10 -0.314 +11 -0.320 +12 -0.325 +13 -0.328 +14 -0.330 +15 -0.330 +16 -0.329 +17 -0.327 +18 -0.324 +19 -0.319 +20 -0.313 +21 -0.307 +22 -0.299 +23 -0.291 +24 -0.282 +25 -0.272 +26 -0.261 +27 -0.250 +28 -0.239 +29 -0.227 +30 -0.214 +31 -0.201 +32 -0.188 +33 -0.174 +34 -0.160 +35 -0.146 +36 -0.132 +37 -0.118 +38 -0.103 +39 -0.088 +40 -0.074 +41 -0.059 +42 -0.044 +43 -0.029 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.044 +49 0.058 +50 0.072 +51 0.087 +52 0.101 +53 0.115 +54 0.129 +55 0.142 +56 0.156 +57 0.170 +58 0.184 +59 0.197 +60 0.211 +61 0.224 +62 0.238 +63 0.252 +64 0.265 +65 0.279 +66 0.293 +67 0.307 +68 0.322 +69 0.336 +70 0.351 +71 0.366 +72 0.382 +73 0.398 +74 0.414 +75 0.431 +76 0.448 +77 0.466 +78 0.485 +79 0.504 +80 0.524 +81 0.545 +82 0.567 +83 0.590 +84 0.614 +85 0.640 +86 0.666 +87 0.694 +88 0.723 +89 0.753 +90 0.785 +1 -0.342 +2 -0.367 +3 -0.390 +4 -0.409 +5 -0.426 +6 -0.440 +7 -0.452 +8 -0.461 +9 -0.468 +10 -0.473 +11 -0.476 +12 -0.477 +13 -0.476 +14 -0.474 +15 -0.469 +16 -0.464 +17 -0.457 +18 -0.449 +19 -0.439 +20 -0.429 +21 -0.417 +22 -0.404 +23 -0.391 +24 -0.376 +25 -0.361 +26 -0.346 +27 -0.330 +28 -0.313 +29 -0.296 +30 -0.278 +31 -0.260 +32 -0.242 +33 -0.223 +34 -0.205 +35 -0.186 +36 -0.167 +37 -0.148 +38 -0.129 +39 -0.111 +40 -0.092 +41 -0.073 +42 -0.055 +43 -0.036 +44 -0.018 +45 0.000 +46 0.018 +47 0.035 +48 0.053 +49 0.070 +50 0.087 +51 0.103 +52 0.120 +53 0.136 +54 0.152 +55 0.167 +56 0.183 +57 0.198 +58 0.213 +59 0.228 +60 0.242 +61 0.257 +62 0.271 +63 0.285 +64 0.300 +65 0.314 +66 0.328 +67 0.342 +68 0.357 +69 0.371 +70 0.386 +71 0.401 +72 0.416 +73 0.432 +74 0.448 +75 0.465 +76 0.482 +77 0.500 +78 0.518 +79 0.537 +80 0.557 +81 0.578 +82 0.600 +83 0.623 +84 0.647 +85 0.673 +86 0.699 +87 0.728 +88 0.757 +89 0.789 +90 0.822 +1 -0.673 +2 -0.705 +3 -0.732 +4 -0.756 +5 -0.775 +6 -0.790 +7 -0.802 +8 -0.811 +9 -0.816 +10 -0.818 +11 -0.817 +12 -0.813 +13 -0.807 +14 -0.798 +15 -0.787 +16 -0.774 +17 -0.759 +18 -0.742 +19 -0.723 +20 -0.703 +21 -0.682 +22 -0.659 +23 -0.634 +24 -0.609 +25 -0.583 +26 -0.556 +27 -0.528 +28 -0.500 +29 -0.471 +30 -0.442 +31 -0.412 +32 -0.382 +33 -0.352 +34 -0.322 +35 -0.292 +36 -0.262 +37 -0.231 +38 -0.202 +39 -0.172 +40 -0.142 +41 -0.113 +42 -0.084 +43 -0.056 +44 -0.028 +45 0.000 +46 0.027 +47 0.054 +48 0.080 +49 0.105 +50 0.131 +51 0.155 +52 0.179 +53 0.202 +54 0.225 +55 0.248 +56 0.270 +57 0.291 +58 0.312 +59 0.333 +60 0.353 +61 0.373 +62 0.392 +63 0.411 +64 0.430 +65 0.449 +66 0.468 +67 0.486 +68 0.505 +69 0.524 +70 0.543 +71 0.562 +72 0.582 +73 0.602 +74 0.622 +75 0.644 +76 0.665 +77 0.688 +78 0.712 +79 0.736 +80 0.762 +81 0.789 +82 0.818 +83 0.848 +84 0.879 +85 0.913 +86 0.948 +87 0.986 +88 1.026 +89 1.068 +90 1.113 +1 -0.793 +2 -0.815 +3 -0.833 +4 -0.848 +5 -0.859 +6 -0.867 +7 -0.871 +8 -0.872 +9 -0.871 +10 -0.867 +11 -0.860 +12 -0.851 +13 -0.839 +14 -0.826 +15 -0.810 +16 -0.793 +17 -0.774 +18 -0.753 +19 -0.732 +20 -0.708 +21 -0.684 +22 -0.659 +23 -0.632 +24 -0.605 +25 -0.577 +26 -0.549 +27 -0.520 +28 -0.491 +29 -0.461 +30 -0.431 +31 -0.401 +32 -0.371 +33 -0.341 +34 -0.310 +35 -0.280 +36 -0.251 +37 -0.221 +38 -0.192 +39 -0.163 +40 -0.135 +41 -0.107 +42 -0.079 +43 -0.052 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.074 +49 0.097 +50 0.120 +51 0.142 +52 0.163 +53 0.184 +54 0.203 +55 0.223 +56 0.241 +57 0.260 +58 0.277 +59 0.294 +60 0.310 +61 0.326 +62 0.342 +63 0.357 +64 0.371 +65 0.386 +66 0.400 +67 0.414 +68 0.428 +69 0.441 +70 0.455 +71 0.469 +72 0.483 +73 0.497 +74 0.511 +75 0.526 +76 0.542 +77 0.558 +78 0.574 +79 0.592 +80 0.610 +81 0.630 +82 0.650 +83 0.672 +84 0.695 +85 0.720 +86 0.747 +87 0.775 +88 0.805 +89 0.837 +90 0.872 +1 -1.183 +2 -1.210 +3 -1.232 +4 -1.248 +5 -1.260 +6 -1.267 +7 -1.270 +8 -1.269 +9 -1.263 +10 -1.254 +11 -1.242 +12 -1.226 +13 -1.208 +14 -1.186 +15 -1.162 +16 -1.135 +17 -1.107 +18 -1.076 +19 -1.043 +20 -1.009 +21 -0.973 +22 -0.936 +23 -0.897 +24 -0.858 +25 -0.818 +26 -0.776 +27 -0.735 +28 -0.692 +29 -0.650 +30 -0.607 +31 -0.564 +32 -0.521 +33 -0.478 +34 -0.435 +35 -0.393 +36 -0.351 +37 -0.309 +38 -0.268 +39 -0.228 +40 -0.188 +41 -0.149 +42 -0.110 +43 -0.073 +44 -0.036 +45 0.000 +46 0.035 +47 0.069 +48 0.102 +49 0.134 +50 0.165 +51 0.195 +52 0.224 +53 0.251 +54 0.278 +55 0.304 +56 0.329 +57 0.353 +58 0.377 +59 0.399 +60 0.420 +61 0.441 +62 0.461 +63 0.480 +64 0.499 +65 0.517 +66 0.535 +67 0.553 +68 0.570 +69 0.587 +70 0.604 +71 0.621 +72 0.638 +73 0.656 +74 0.673 +75 0.692 +76 0.710 +77 0.730 +78 0.751 +79 0.772 +80 0.795 +81 0.819 +82 0.845 +83 0.873 +84 0.902 +85 0.933 +86 0.967 +87 1.003 +88 1.042 +89 1.083 +90 1.128 +1 -1.157 +2 -1.166 +3 -1.171 +4 -1.173 +5 -1.171 +6 -1.166 +7 -1.158 +8 -1.147 +9 -1.133 +10 -1.117 +11 -1.098 +12 -1.077 +13 -1.054 +14 -1.030 +15 -1.003 +16 -0.975 +17 -0.946 +18 -0.915 +19 -0.883 +20 -0.850 +21 -0.817 +22 -0.782 +23 -0.747 +24 -0.711 +25 -0.675 +26 -0.639 +27 -0.602 +28 -0.565 +29 -0.529 +30 -0.492 +31 -0.455 +32 -0.419 +33 -0.383 +34 -0.348 +35 -0.313 +36 -0.278 +37 -0.244 +38 -0.211 +39 -0.178 +40 -0.146 +41 -0.115 +42 -0.085 +43 -0.056 +44 -0.027 +45 0.000 +46 0.027 +47 0.052 +48 0.077 +49 0.100 +50 0.123 +51 0.144 +52 0.164 +53 0.184 +54 0.202 +55 0.220 +56 0.236 +57 0.252 +58 0.266 +59 0.280 +60 0.293 +61 0.305 +62 0.316 +63 0.326 +64 0.336 +65 0.345 +66 0.354 +67 0.362 +68 0.369 +69 0.376 +70 0.383 +71 0.390 +72 0.396 +73 0.402 +74 0.409 +75 0.415 +76 0.422 +77 0.429 +78 0.437 +79 0.445 +80 0.454 +81 0.463 +82 0.474 +83 0.485 +84 0.498 +85 0.512 +86 0.528 +87 0.545 +88 0.564 +89 0.584 +90 0.607 +1 -1.316 +2 -1.316 +3 -1.313 +4 -1.307 +5 -1.297 +6 -1.284 +7 -1.269 +8 -1.251 +9 -1.231 +10 -1.208 +11 -1.183 +12 -1.157 +13 -1.128 +14 -1.098 +15 -1.067 +16 -1.034 +17 -0.999 +18 -0.964 +19 -0.928 +20 -0.891 +21 -0.854 +22 -0.815 +23 -0.777 +24 -0.738 +25 -0.699 +26 -0.659 +27 -0.620 +28 -0.581 +29 -0.542 +30 -0.503 +31 -0.465 +32 -0.427 +33 -0.389 +34 -0.352 +35 -0.316 +36 -0.280 +37 -0.245 +38 -0.211 +39 -0.178 +40 -0.146 +41 -0.115 +42 -0.084 +43 -0.055 +44 -0.027 +45 0.000 +46 0.026 +47 0.051 +48 0.074 +49 0.097 +50 0.118 +51 0.138 +52 0.157 +53 0.175 +54 0.191 +55 0.207 +56 0.221 +57 0.234 +58 0.246 +59 0.257 +60 0.267 +61 0.276 +62 0.284 +63 0.292 +64 0.298 +65 0.303 +66 0.308 +67 0.312 +68 0.316 +69 0.319 +70 0.321 +71 0.323 +72 0.325 +73 0.326 +74 0.328 +75 0.329 +76 0.330 +77 0.332 +78 0.333 +79 0.335 +80 0.338 +81 0.341 +82 0.345 +83 0.350 +84 0.355 +85 0.362 +86 0.370 +87 0.380 +88 0.391 +89 0.403 +90 0.418 +1 -1.227 +2 -1.195 +3 -1.162 +4 -1.129 +5 -1.095 +6 -1.061 +7 -1.026 +8 -0.991 +9 -0.956 +10 -0.921 +11 -0.886 +12 -0.851 +13 -0.816 +14 -0.781 +15 -0.746 +16 -0.712 +17 -0.677 +18 -0.643 +19 -0.610 +20 -0.577 +21 -0.544 +22 -0.512 +23 -0.480 +24 -0.449 +25 -0.419 +26 -0.390 +27 -0.361 +28 -0.333 +29 -0.305 +30 -0.279 +31 -0.253 +32 -0.229 +33 -0.205 +34 -0.182 +35 -0.160 +36 -0.139 +37 -0.120 +38 -0.101 +39 -0.083 +40 -0.067 +41 -0.051 +42 -0.037 +43 -0.023 +44 -0.011 +45 -0.000 +46 0.010 +47 0.019 +48 0.026 +49 0.033 +50 0.038 +51 0.042 +52 0.045 +53 0.047 +54 0.047 +55 0.047 +56 0.045 +57 0.042 +58 0.038 +59 0.033 +60 0.027 +61 0.019 +62 0.011 +63 0.002 +64 -0.009 +65 -0.020 +66 -0.033 +67 -0.046 +68 -0.061 +69 -0.076 +70 -0.092 +71 -0.109 +72 -0.127 +73 -0.145 +74 -0.165 +75 -0.185 +76 -0.206 +77 -0.227 +78 -0.249 +79 -0.272 +80 -0.295 +81 -0.318 +82 -0.342 +83 -0.367 +84 -0.391 +85 -0.416 +86 -0.441 +87 -0.467 +88 -0.492 +89 -0.518 +90 -0.543 +1 -1.107 +2 -1.093 +3 -1.077 +4 -1.060 +5 -1.041 +6 -1.021 +7 -0.999 +8 -0.976 +9 -0.952 +10 -0.927 +11 -0.901 +12 -0.874 +13 -0.846 +14 -0.818 +15 -0.789 +16 -0.759 +17 -0.730 +18 -0.700 +19 -0.669 +20 -0.639 +21 -0.608 +22 -0.577 +23 -0.547 +24 -0.516 +25 -0.486 +26 -0.456 +27 -0.427 +28 -0.397 +29 -0.368 +30 -0.340 +31 -0.312 +32 -0.285 +33 -0.258 +34 -0.232 +35 -0.207 +36 -0.182 +37 -0.159 +38 -0.136 +39 -0.113 +40 -0.092 +41 -0.072 +42 -0.052 +43 -0.034 +44 -0.017 +45 0.000 +46 0.016 +47 0.030 +48 0.044 +49 0.056 +50 0.068 +51 0.078 +52 0.087 +53 0.096 +54 0.103 +55 0.109 +56 0.115 +57 0.119 +58 0.123 +59 0.125 +60 0.127 +61 0.127 +62 0.127 +63 0.126 +64 0.124 +65 0.121 +66 0.118 +67 0.114 +68 0.109 +69 0.103 +70 0.097 +71 0.090 +72 0.083 +73 0.076 +74 0.068 +75 0.059 +76 0.051 +77 0.042 +78 0.033 +79 0.024 +80 0.015 +81 0.006 +82 -0.003 +83 -0.012 +84 -0.020 +85 -0.028 +86 -0.035 +87 -0.042 +88 -0.049 +89 -0.054 +90 -0.059 +1 -0.913 +2 -0.904 +3 -0.892 +4 -0.879 +5 -0.865 +6 -0.849 +7 -0.832 +8 -0.814 +9 -0.795 +10 -0.775 +11 -0.754 +12 -0.733 +13 -0.710 +14 -0.687 +15 -0.663 +16 -0.639 +17 -0.615 +18 -0.590 +19 -0.565 +20 -0.540 +21 -0.514 +22 -0.489 +23 -0.463 +24 -0.438 +25 -0.413 +26 -0.388 +27 -0.363 +28 -0.338 +29 -0.314 +30 -0.290 +31 -0.266 +32 -0.243 +33 -0.221 +34 -0.199 +35 -0.177 +36 -0.156 +37 -0.136 +38 -0.117 +39 -0.098 +40 -0.080 +41 -0.062 +42 -0.045 +43 -0.029 +44 -0.014 +45 0.000 +46 0.014 +47 0.026 +48 0.038 +49 0.049 +50 0.059 +51 0.069 +52 0.077 +53 0.085 +54 0.092 +55 0.098 +56 0.103 +57 0.107 +58 0.111 +59 0.114 +60 0.116 +61 0.117 +62 0.118 +63 0.118 +64 0.117 +65 0.115 +66 0.113 +67 0.111 +68 0.108 +69 0.104 +70 0.100 +71 0.096 +72 0.091 +73 0.085 +74 0.080 +75 0.074 +76 0.068 +77 0.062 +78 0.056 +79 0.050 +80 0.044 +81 0.038 +82 0.032 +83 0.027 +84 0.022 +85 0.017 +86 0.012 +87 0.009 +88 0.005 +89 0.003 +90 0.001 +1 -0.800 +2 -0.798 +3 -0.794 +4 -0.789 +5 -0.781 +6 -0.772 +7 -0.761 +8 -0.749 +9 -0.735 +10 -0.721 +11 -0.705 +12 -0.688 +13 -0.670 +14 -0.651 +15 -0.631 +16 -0.611 +17 -0.590 +18 -0.568 +19 -0.546 +20 -0.524 +21 -0.501 +22 -0.478 +23 -0.455 +24 -0.432 +25 -0.408 +26 -0.385 +27 -0.361 +28 -0.338 +29 -0.315 +30 -0.292 +31 -0.269 +32 -0.247 +33 -0.225 +34 -0.203 +35 -0.182 +36 -0.161 +37 -0.141 +38 -0.121 +39 -0.102 +40 -0.084 +41 -0.066 +42 -0.048 +43 -0.031 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.042 +49 0.054 +50 0.066 +51 0.077 +52 0.088 +53 0.097 +54 0.106 +55 0.114 +56 0.122 +57 0.129 +58 0.135 +59 0.140 +60 0.145 +61 0.150 +62 0.153 +63 0.156 +64 0.159 +65 0.161 +66 0.163 +67 0.164 +68 0.164 +69 0.165 +70 0.165 +71 0.165 +72 0.164 +73 0.164 +74 0.163 +75 0.162 +76 0.162 +77 0.161 +78 0.160 +79 0.160 +80 0.160 +81 0.160 +82 0.161 +83 0.162 +84 0.163 +85 0.165 +86 0.168 +87 0.172 +88 0.176 +89 0.182 +90 0.188 +1 -0.517 +2 -0.515 +3 -0.512 +4 -0.508 +5 -0.503 +6 -0.497 +7 -0.490 +8 -0.481 +9 -0.473 +10 -0.463 +11 -0.452 +12 -0.441 +13 -0.430 +14 -0.417 +15 -0.405 +16 -0.391 +17 -0.378 +18 -0.364 +19 -0.350 +20 -0.335 +21 -0.320 +22 -0.306 +23 -0.291 +24 -0.276 +25 -0.261 +26 -0.245 +27 -0.230 +28 -0.216 +29 -0.201 +30 -0.186 +31 -0.171 +32 -0.157 +33 -0.143 +34 -0.129 +35 -0.116 +36 -0.102 +37 -0.090 +38 -0.077 +39 -0.065 +40 -0.053 +41 -0.042 +42 -0.030 +43 -0.020 +44 -0.010 +45 0.000 +46 0.009 +47 0.018 +48 0.026 +49 0.034 +50 0.042 +51 0.049 +52 0.055 +53 0.061 +54 0.067 +55 0.072 +56 0.076 +57 0.081 +58 0.084 +59 0.088 +60 0.091 +61 0.093 +62 0.095 +63 0.097 +64 0.098 +65 0.100 +66 0.100 +67 0.101 +68 0.101 +69 0.101 +70 0.101 +71 0.101 +72 0.100 +73 0.100 +74 0.099 +75 0.098 +76 0.098 +77 0.097 +78 0.096 +79 0.096 +80 0.095 +81 0.095 +82 0.095 +83 0.096 +84 0.097 +85 0.098 +86 0.099 +87 0.101 +88 0.104 +89 0.107 +90 0.111 +1 -0.454 +2 -0.465 +3 -0.474 +4 -0.480 +5 -0.485 +6 -0.488 +7 -0.489 +8 -0.489 +9 -0.487 +10 -0.483 +11 -0.479 +12 -0.473 +13 -0.465 +14 -0.457 +15 -0.448 +16 -0.438 +17 -0.427 +18 -0.415 +19 -0.402 +20 -0.389 +21 -0.375 +22 -0.361 +23 -0.346 +24 -0.331 +25 -0.315 +26 -0.299 +27 -0.283 +28 -0.267 +29 -0.251 +30 -0.234 +31 -0.217 +32 -0.201 +33 -0.184 +34 -0.168 +35 -0.151 +36 -0.135 +37 -0.119 +38 -0.103 +39 -0.088 +40 -0.072 +41 -0.057 +42 -0.042 +43 -0.028 +44 -0.014 +45 0.000 +46 0.013 +47 0.027 +48 0.039 +49 0.052 +50 0.063 +51 0.075 +52 0.086 +53 0.097 +54 0.107 +55 0.117 +56 0.127 +57 0.136 +58 0.145 +59 0.154 +60 0.162 +61 0.171 +62 0.178 +63 0.186 +64 0.193 +65 0.201 +66 0.208 +67 0.215 +68 0.221 +69 0.228 +70 0.235 +71 0.242 +72 0.249 +73 0.256 +74 0.263 +75 0.271 +76 0.278 +77 0.286 +78 0.295 +79 0.304 +80 0.313 +81 0.323 +82 0.334 +83 0.345 +84 0.357 +85 0.370 +86 0.384 +87 0.399 +88 0.415 +89 0.432 +90 0.450 +1 -0.169 +2 -0.174 +3 -0.179 +4 -0.183 +5 -0.186 +6 -0.188 +7 -0.190 +8 -0.190 +9 -0.190 +10 -0.190 +11 -0.189 +12 -0.187 +13 -0.185 +14 -0.182 +15 -0.179 +16 -0.175 +17 -0.171 +18 -0.167 +19 -0.162 +20 -0.157 +21 -0.152 +22 -0.146 +23 -0.140 +24 -0.134 +25 -0.128 +26 -0.122 +27 -0.116 +28 -0.109 +29 -0.103 +30 -0.096 +31 -0.089 +32 -0.083 +33 -0.076 +34 -0.069 +35 -0.063 +36 -0.056 +37 -0.049 +38 -0.043 +39 -0.036 +40 -0.030 +41 -0.024 +42 -0.018 +43 -0.012 +44 -0.006 +45 0.000 +46 0.006 +47 0.011 +48 0.017 +49 0.022 +50 0.027 +51 0.032 +52 0.037 +53 0.041 +54 0.046 +55 0.050 +56 0.055 +57 0.059 +58 0.063 +59 0.067 +60 0.071 +61 0.074 +62 0.078 +63 0.082 +64 0.085 +65 0.089 +66 0.092 +67 0.096 +68 0.099 +69 0.102 +70 0.106 +71 0.110 +72 0.113 +73 0.117 +74 0.121 +75 0.125 +76 0.129 +77 0.133 +78 0.138 +79 0.142 +80 0.148 +81 0.153 +82 0.159 +83 0.165 +84 0.171 +85 0.178 +86 0.185 +87 0.193 +88 0.201 +89 0.210 +90 0.219 +1 -0.182 +2 -0.199 +3 -0.215 +4 -0.229 +5 -0.241 +6 -0.251 +7 -0.260 +8 -0.267 +9 -0.273 +10 -0.277 +11 -0.280 +12 -0.282 +13 -0.282 +14 -0.282 +15 -0.280 +16 -0.278 +17 -0.274 +18 -0.270 +19 -0.265 +20 -0.259 +21 -0.252 +22 -0.245 +23 -0.237 +24 -0.229 +25 -0.220 +26 -0.211 +27 -0.201 +28 -0.191 +29 -0.181 +30 -0.170 +31 -0.159 +32 -0.148 +33 -0.137 +34 -0.126 +35 -0.114 +36 -0.103 +37 -0.091 +38 -0.080 +39 -0.068 +40 -0.057 +41 -0.045 +42 -0.034 +43 -0.022 +44 -0.011 +45 0.000 +46 0.011 +47 0.022 +48 0.033 +49 0.043 +50 0.054 +51 0.064 +52 0.075 +53 0.085 +54 0.095 +55 0.105 +56 0.115 +57 0.124 +58 0.134 +59 0.144 +60 0.153 +61 0.162 +62 0.172 +63 0.181 +64 0.191 +65 0.200 +66 0.210 +67 0.219 +68 0.229 +69 0.239 +70 0.249 +71 0.259 +72 0.270 +73 0.281 +74 0.292 +75 0.304 +76 0.316 +77 0.328 +78 0.341 +79 0.355 +80 0.369 +81 0.384 +82 0.400 +83 0.416 +84 0.433 +85 0.451 +86 0.470 +87 0.491 +88 0.512 +89 0.534 +90 0.558 +1 0.058 +2 0.048 +3 0.038 +4 0.029 +5 0.021 +6 0.013 +7 0.006 +8 0.000 +9 -0.006 +10 -0.011 +11 -0.016 +12 -0.020 +13 -0.024 +14 -0.027 +15 -0.030 +16 -0.033 +17 -0.035 +18 -0.037 +19 -0.038 +20 -0.039 +21 -0.040 +22 -0.041 +23 -0.041 +24 -0.041 +25 -0.041 +26 -0.040 +27 -0.039 +28 -0.038 +29 -0.037 +30 -0.036 +31 -0.034 +32 -0.033 +33 -0.031 +34 -0.029 +35 -0.027 +36 -0.025 +37 -0.022 +38 -0.020 +39 -0.017 +40 -0.015 +41 -0.012 +42 -0.009 +43 -0.006 +44 -0.003 +45 0.000 +46 0.003 +47 0.006 +48 0.010 +49 0.013 +50 0.017 +51 0.020 +52 0.024 +53 0.027 +54 0.031 +55 0.035 +56 0.039 +57 0.043 +58 0.047 +59 0.051 +60 0.055 +61 0.060 +62 0.064 +63 0.069 +64 0.074 +65 0.078 +66 0.083 +67 0.089 +68 0.094 +69 0.099 +70 0.105 +71 0.111 +72 0.117 +73 0.123 +74 0.130 +75 0.137 +76 0.144 +77 0.151 +78 0.158 +79 0.166 +80 0.175 +81 0.183 +82 0.192 +83 0.201 +84 0.211 +85 0.221 +86 0.232 +87 0.243 +88 0.254 +89 0.266 +90 0.279 +1 0.004 +2 -0.012 +3 -0.028 +4 -0.042 +5 -0.055 +6 -0.067 +7 -0.077 +8 -0.086 +9 -0.095 +10 -0.102 +11 -0.108 +12 -0.113 +13 -0.118 +14 -0.121 +15 -0.124 +16 -0.126 +17 -0.127 +18 -0.128 +19 -0.128 +20 -0.127 +21 -0.126 +22 -0.124 +23 -0.122 +24 -0.119 +25 -0.116 +26 -0.113 +27 -0.109 +28 -0.104 +29 -0.100 +30 -0.095 +31 -0.090 +32 -0.084 +33 -0.079 +34 -0.073 +35 -0.067 +36 -0.061 +37 -0.054 +38 -0.048 +39 -0.041 +40 -0.035 +41 -0.028 +42 -0.021 +43 -0.014 +44 -0.007 +45 0.000 +46 0.007 +47 0.014 +48 0.021 +49 0.029 +50 0.036 +51 0.043 +52 0.051 +53 0.058 +54 0.065 +55 0.073 +56 0.080 +57 0.088 +58 0.096 +59 0.103 +60 0.111 +61 0.119 +62 0.127 +63 0.135 +64 0.143 +65 0.152 +66 0.160 +67 0.169 +68 0.178 +69 0.188 +70 0.197 +71 0.207 +72 0.217 +73 0.227 +74 0.238 +75 0.249 +76 0.261 +77 0.273 +78 0.285 +79 0.298 +80 0.312 +81 0.326 +82 0.340 +83 0.356 +84 0.372 +85 0.389 +86 0.406 +87 0.425 +88 0.444 +89 0.464 +90 0.485 +1 0.258 +2 0.250 +3 0.243 +4 0.235 +5 0.228 +6 0.221 +7 0.213 +8 0.205 +9 0.198 +10 0.190 +11 0.183 +12 0.175 +13 0.168 +14 0.161 +15 0.153 +16 0.146 +17 0.139 +18 0.132 +19 0.125 +20 0.118 +21 0.111 +22 0.105 +23 0.098 +24 0.092 +25 0.086 +26 0.080 +27 0.074 +28 0.068 +29 0.062 +30 0.057 +31 0.052 +32 0.047 +33 0.042 +34 0.037 +35 0.033 +36 0.028 +37 0.024 +38 0.021 +39 0.017 +40 0.014 +41 0.010 +42 0.007 +43 0.005 +44 0.002 +45 0.000 +46 -0.002 +47 -0.004 +48 -0.005 +49 -0.007 +50 -0.008 +51 -0.009 +52 -0.009 +53 -0.009 +54 -0.009 +55 -0.009 +56 -0.009 +57 -0.008 +58 -0.007 +59 -0.006 +60 -0.005 +61 -0.003 +62 -0.001 +63 0.001 +64 0.003 +65 0.006 +66 0.009 +67 0.012 +68 0.015 +69 0.018 +70 0.022 +71 0.026 +72 0.030 +73 0.034 +74 0.039 +75 0.044 +76 0.049 +77 0.054 +78 0.059 +79 0.065 +80 0.070 +81 0.076 +82 0.082 +83 0.088 +84 0.094 +85 0.101 +86 0.108 +87 0.114 +88 0.121 +89 0.128 +90 0.135 +1 0.094 +2 0.078 +3 0.064 +4 0.050 +5 0.038 +6 0.026 +7 0.016 +8 0.006 +9 -0.003 +10 -0.011 +11 -0.019 +12 -0.025 +13 -0.031 +14 -0.037 +15 -0.041 +16 -0.045 +17 -0.049 +18 -0.052 +19 -0.054 +20 -0.056 +21 -0.058 +22 -0.059 +23 -0.059 +24 -0.059 +25 -0.059 +26 -0.059 +27 -0.058 +28 -0.056 +29 -0.055 +30 -0.053 +31 -0.051 +32 -0.049 +33 -0.046 +34 -0.043 +35 -0.040 +36 -0.037 +37 -0.033 +38 -0.030 +39 -0.026 +40 -0.022 +41 -0.018 +42 -0.014 +43 -0.009 +44 -0.005 +45 0.000 +46 0.005 +47 0.010 +48 0.015 +49 0.020 +50 0.025 +51 0.030 +52 0.036 +53 0.041 +54 0.047 +55 0.053 +56 0.059 +57 0.065 +58 0.071 +59 0.078 +60 0.084 +61 0.091 +62 0.098 +63 0.105 +64 0.112 +65 0.119 +66 0.127 +67 0.135 +68 0.143 +69 0.151 +70 0.160 +71 0.169 +72 0.178 +73 0.188 +74 0.198 +75 0.208 +76 0.218 +77 0.229 +78 0.241 +79 0.253 +80 0.265 +81 0.278 +82 0.292 +83 0.306 +84 0.320 +85 0.335 +86 0.351 +87 0.367 +88 0.385 +89 0.402 +90 0.421 +1 0.263 +2 0.254 +3 0.245 +4 0.236 +5 0.227 +6 0.218 +7 0.210 +8 0.201 +9 0.193 +10 0.184 +11 0.176 +12 0.168 +13 0.160 +14 0.152 +15 0.145 +16 0.137 +17 0.130 +18 0.122 +19 0.115 +20 0.108 +21 0.102 +22 0.095 +23 0.089 +24 0.082 +25 0.076 +26 0.070 +27 0.065 +28 0.059 +29 0.054 +30 0.049 +31 0.044 +32 0.040 +33 0.035 +34 0.031 +35 0.027 +36 0.023 +37 0.020 +38 0.016 +39 0.013 +40 0.011 +41 0.008 +42 0.006 +43 0.003 +44 0.002 +45 0.000 +46 -0.001 +47 -0.003 +48 -0.003 +49 -0.004 +50 -0.004 +51 -0.005 +52 -0.004 +53 -0.004 +54 -0.003 +55 -0.002 +56 -0.001 +57 0.000 +58 0.002 +59 0.004 +60 0.006 +61 0.008 +62 0.011 +63 0.014 +64 0.017 +65 0.020 +66 0.024 +67 0.028 +68 0.032 +69 0.036 +70 0.041 +71 0.046 +72 0.051 +73 0.056 +74 0.062 +75 0.068 +76 0.074 +77 0.080 +78 0.087 +79 0.093 +80 0.100 +81 0.107 +82 0.115 +83 0.122 +84 0.130 +85 0.138 +86 0.146 +87 0.155 +88 0.163 +89 0.172 +90 0.181 +1 0.094 +2 0.078 +3 0.063 +4 0.050 +5 0.037 +6 0.025 +7 0.015 +8 0.005 +9 -0.004 +10 -0.013 +11 -0.020 +12 -0.027 +13 -0.033 +14 -0.038 +15 -0.043 +16 -0.047 +17 -0.051 +18 -0.053 +19 -0.056 +20 -0.058 +21 -0.059 +22 -0.060 +23 -0.061 +24 -0.061 +25 -0.060 +26 -0.060 +27 -0.059 +28 -0.058 +29 -0.056 +30 -0.054 +31 -0.052 +32 -0.049 +33 -0.047 +34 -0.044 +35 -0.041 +36 -0.037 +37 -0.034 +38 -0.030 +39 -0.026 +40 -0.022 +41 -0.018 +42 -0.014 +43 -0.009 +44 -0.005 +45 0.000 +46 0.005 +47 0.010 +48 0.015 +49 0.020 +50 0.025 +51 0.031 +52 0.036 +53 0.042 +54 0.047 +55 0.053 +56 0.059 +57 0.065 +58 0.072 +59 0.078 +60 0.084 +61 0.091 +62 0.098 +63 0.105 +64 0.112 +65 0.120 +66 0.127 +67 0.135 +68 0.143 +69 0.151 +70 0.160 +71 0.169 +72 0.178 +73 0.188 +74 0.197 +75 0.208 +76 0.218 +77 0.229 +78 0.241 +79 0.253 +80 0.265 +81 0.278 +82 0.291 +83 0.305 +84 0.320 +85 0.335 +86 0.351 +87 0.367 +88 0.384 +89 0.402 +90 0.421 +1 0.256 +2 0.248 +3 0.241 +4 0.234 +5 0.226 +6 0.218 +7 0.211 +8 0.203 +9 0.196 +10 0.188 +11 0.181 +12 0.173 +13 0.166 +14 0.159 +15 0.151 +16 0.144 +17 0.137 +18 0.130 +19 0.123 +20 0.116 +21 0.110 +22 0.103 +23 0.097 +24 0.090 +25 0.084 +26 0.078 +27 0.073 +28 0.067 +29 0.061 +30 0.056 +31 0.051 +32 0.046 +33 0.041 +34 0.037 +35 0.032 +36 0.028 +37 0.024 +38 0.020 +39 0.017 +40 0.013 +41 0.010 +42 0.007 +43 0.005 +44 0.002 +45 0.000 +46 -0.002 +47 -0.004 +48 -0.005 +49 -0.006 +50 -0.008 +51 -0.008 +52 -0.009 +53 -0.009 +54 -0.009 +55 -0.009 +56 -0.009 +57 -0.008 +58 -0.007 +59 -0.006 +60 -0.005 +61 -0.003 +62 -0.001 +63 0.001 +64 0.003 +65 0.006 +66 0.009 +67 0.012 +68 0.015 +69 0.018 +70 0.022 +71 0.026 +72 0.030 +73 0.034 +74 0.039 +75 0.043 +76 0.048 +77 0.053 +78 0.059 +79 0.064 +80 0.070 +81 0.075 +82 0.081 +83 0.088 +84 0.094 +85 0.100 +86 0.107 +87 0.113 +88 0.120 +89 0.127 +90 0.134 +1 0.001 +2 -0.016 +3 -0.031 +4 -0.045 +5 -0.058 +6 -0.070 +7 -0.080 +8 -0.089 +9 -0.097 +10 -0.105 +11 -0.111 +12 -0.116 +13 -0.120 +14 -0.124 +15 -0.126 +16 -0.128 +17 -0.130 +18 -0.130 +19 -0.130 +20 -0.129 +21 -0.128 +22 -0.126 +23 -0.124 +24 -0.121 +25 -0.118 +26 -0.114 +27 -0.110 +28 -0.106 +29 -0.101 +30 -0.096 +31 -0.091 +32 -0.085 +33 -0.080 +34 -0.074 +35 -0.068 +36 -0.061 +37 -0.055 +38 -0.048 +39 -0.042 +40 -0.035 +41 -0.028 +42 -0.021 +43 -0.014 +44 -0.007 +45 0.000 +46 0.007 +47 0.014 +48 0.022 +49 0.029 +50 0.036 +51 0.043 +52 0.051 +53 0.058 +54 0.066 +55 0.073 +56 0.081 +57 0.088 +58 0.096 +59 0.104 +60 0.111 +61 0.119 +62 0.127 +63 0.135 +64 0.144 +65 0.152 +66 0.161 +67 0.169 +68 0.178 +69 0.188 +70 0.197 +71 0.207 +72 0.217 +73 0.227 +74 0.238 +75 0.249 +76 0.261 +77 0.272 +78 0.285 +79 0.298 +80 0.311 +81 0.326 +82 0.340 +83 0.356 +84 0.372 +85 0.388 +86 0.406 +87 0.424 +88 0.444 +89 0.464 +90 0.485 +1 0.054 +2 0.044 +3 0.035 +4 0.026 +5 0.018 +6 0.011 +7 0.004 +8 -0.003 +9 -0.008 +10 -0.014 +11 -0.018 +12 -0.022 +13 -0.026 +14 -0.029 +15 -0.032 +16 -0.035 +17 -0.037 +18 -0.039 +19 -0.040 +20 -0.041 +21 -0.042 +22 -0.042 +23 -0.042 +24 -0.042 +25 -0.042 +26 -0.041 +27 -0.041 +28 -0.040 +29 -0.038 +30 -0.037 +31 -0.035 +32 -0.034 +33 -0.032 +34 -0.030 +35 -0.028 +36 -0.025 +37 -0.023 +38 -0.020 +39 -0.018 +40 -0.015 +41 -0.012 +42 -0.009 +43 -0.006 +44 -0.003 +45 0.000 +46 0.003 +47 0.007 +48 0.010 +49 0.013 +50 0.017 +51 0.020 +52 0.024 +53 0.028 +54 0.032 +55 0.035 +56 0.039 +57 0.043 +58 0.048 +59 0.052 +60 0.056 +61 0.061 +62 0.065 +63 0.070 +64 0.074 +65 0.079 +66 0.084 +67 0.089 +68 0.095 +69 0.100 +70 0.106 +71 0.112 +72 0.118 +73 0.124 +74 0.131 +75 0.137 +76 0.145 +77 0.152 +78 0.159 +79 0.167 +80 0.175 +81 0.184 +82 0.193 +83 0.202 +84 0.212 +85 0.222 +86 0.232 +87 0.243 +88 0.255 +89 0.267 +90 0.279 +1 -0.186 +2 -0.204 +3 -0.219 +4 -0.233 +5 -0.245 +6 -0.255 +7 -0.264 +8 -0.271 +9 -0.276 +10 -0.280 +11 -0.283 +12 -0.285 +13 -0.285 +14 -0.285 +15 -0.283 +16 -0.280 +17 -0.277 +18 -0.272 +19 -0.267 +20 -0.261 +21 -0.254 +22 -0.247 +23 -0.239 +24 -0.230 +25 -0.221 +26 -0.212 +27 -0.202 +28 -0.192 +29 -0.182 +30 -0.171 +31 -0.160 +32 -0.149 +33 -0.138 +34 -0.126 +35 -0.115 +36 -0.103 +37 -0.092 +38 -0.080 +39 -0.069 +40 -0.057 +41 -0.045 +42 -0.034 +43 -0.023 +44 -0.011 +45 0.000 +46 0.011 +47 0.022 +48 0.033 +49 0.044 +50 0.054 +51 0.065 +52 0.075 +53 0.085 +54 0.095 +55 0.105 +56 0.115 +57 0.125 +58 0.134 +59 0.144 +60 0.153 +61 0.163 +62 0.172 +63 0.181 +64 0.191 +65 0.200 +66 0.210 +67 0.219 +68 0.229 +69 0.239 +70 0.249 +71 0.259 +72 0.270 +73 0.281 +74 0.292 +75 0.304 +76 0.316 +77 0.328 +78 0.341 +79 0.355 +80 0.369 +81 0.384 +82 0.399 +83 0.416 +84 0.433 +85 0.451 +86 0.470 +87 0.491 +88 0.512 +89 0.534 +90 0.558 +1 -0.171 +2 -0.177 +3 -0.182 +4 -0.186 +5 -0.189 +6 -0.191 +7 -0.193 +8 -0.194 +9 -0.194 +10 -0.193 +11 -0.192 +12 -0.191 +13 -0.188 +14 -0.186 +15 -0.182 +16 -0.179 +17 -0.175 +18 -0.170 +19 -0.165 +20 -0.160 +21 -0.155 +22 -0.149 +23 -0.143 +24 -0.137 +25 -0.131 +26 -0.125 +27 -0.118 +28 -0.111 +29 -0.105 +30 -0.098 +31 -0.091 +32 -0.084 +33 -0.078 +34 -0.071 +35 -0.064 +36 -0.057 +37 -0.050 +38 -0.044 +39 -0.037 +40 -0.031 +41 -0.024 +42 -0.018 +43 -0.012 +44 -0.006 +45 0.000 +46 0.006 +47 0.011 +48 0.017 +49 0.022 +50 0.027 +51 0.032 +52 0.037 +53 0.042 +54 0.047 +55 0.051 +56 0.055 +57 0.060 +58 0.064 +59 0.068 +60 0.072 +61 0.075 +62 0.079 +63 0.083 +64 0.086 +65 0.090 +66 0.093 +67 0.097 +68 0.100 +69 0.104 +70 0.107 +71 0.111 +72 0.114 +73 0.118 +74 0.122 +75 0.126 +76 0.130 +77 0.134 +78 0.139 +79 0.143 +80 0.148 +81 0.154 +82 0.159 +83 0.165 +84 0.172 +85 0.178 +86 0.186 +87 0.193 +88 0.202 +89 0.211 +90 0.220 +1 -0.457 +2 -0.468 +3 -0.476 +4 -0.483 +5 -0.488 +6 -0.491 +7 -0.492 +8 -0.492 +9 -0.490 +10 -0.487 +11 -0.482 +12 -0.476 +13 -0.469 +14 -0.461 +15 -0.452 +16 -0.441 +17 -0.430 +18 -0.418 +19 -0.406 +20 -0.392 +21 -0.378 +22 -0.364 +23 -0.349 +24 -0.334 +25 -0.318 +26 -0.302 +27 -0.286 +28 -0.269 +29 -0.253 +30 -0.236 +31 -0.219 +32 -0.203 +33 -0.186 +34 -0.169 +35 -0.153 +36 -0.136 +37 -0.120 +38 -0.104 +39 -0.088 +40 -0.073 +41 -0.058 +42 -0.043 +43 -0.028 +44 -0.014 +45 0.000 +46 0.014 +47 0.027 +48 0.040 +49 0.052 +50 0.064 +51 0.076 +52 0.087 +53 0.098 +54 0.108 +55 0.118 +56 0.128 +57 0.137 +58 0.146 +59 0.155 +60 0.163 +61 0.172 +62 0.179 +63 0.187 +64 0.194 +65 0.202 +66 0.209 +67 0.216 +68 0.222 +69 0.229 +70 0.236 +71 0.243 +72 0.250 +73 0.257 +74 0.264 +75 0.271 +76 0.279 +77 0.287 +78 0.296 +79 0.304 +80 0.314 +81 0.324 +82 0.334 +83 0.346 +84 0.358 +85 0.371 +86 0.385 +87 0.400 +88 0.416 +89 0.433 +90 0.451 +1 -0.520 +2 -0.518 +3 -0.515 +4 -0.511 +5 -0.506 +6 -0.500 +7 -0.492 +8 -0.484 +9 -0.475 +10 -0.465 +11 -0.455 +12 -0.444 +13 -0.432 +14 -0.420 +15 -0.407 +16 -0.393 +17 -0.380 +18 -0.366 +19 -0.351 +20 -0.337 +21 -0.322 +22 -0.307 +23 -0.292 +24 -0.277 +25 -0.262 +26 -0.247 +27 -0.232 +28 -0.217 +29 -0.202 +30 -0.187 +31 -0.172 +32 -0.158 +33 -0.144 +34 -0.130 +35 -0.116 +36 -0.103 +37 -0.090 +38 -0.077 +39 -0.065 +40 -0.053 +41 -0.042 +42 -0.031 +43 -0.020 +44 -0.010 +45 0.000 +46 0.009 +47 0.018 +48 0.027 +49 0.035 +50 0.042 +51 0.049 +52 0.056 +53 0.062 +54 0.067 +55 0.072 +56 0.077 +57 0.081 +58 0.085 +59 0.088 +60 0.091 +61 0.094 +62 0.096 +63 0.098 +64 0.099 +65 0.100 +66 0.101 +67 0.102 +68 0.102 +69 0.102 +70 0.102 +71 0.102 +72 0.101 +73 0.101 +74 0.100 +75 0.099 +76 0.099 +77 0.098 +78 0.097 +79 0.097 +80 0.096 +81 0.096 +82 0.096 +83 0.097 +84 0.098 +85 0.099 +86 0.100 +87 0.102 +88 0.105 +89 0.108 +90 0.112 +1 -0.804 +2 -0.802 +3 -0.798 +4 -0.792 +5 -0.784 +6 -0.775 +7 -0.764 +8 -0.752 +9 -0.738 +10 -0.723 +11 -0.707 +12 -0.690 +13 -0.672 +14 -0.653 +15 -0.633 +16 -0.613 +17 -0.592 +18 -0.570 +19 -0.548 +20 -0.526 +21 -0.503 +22 -0.480 +23 -0.456 +24 -0.433 +25 -0.410 +26 -0.386 +27 -0.363 +28 -0.339 +29 -0.316 +30 -0.293 +31 -0.270 +32 -0.248 +33 -0.226 +34 -0.204 +35 -0.183 +36 -0.162 +37 -0.142 +38 -0.122 +39 -0.102 +40 -0.084 +41 -0.066 +42 -0.048 +43 -0.032 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.042 +49 0.055 +50 0.067 +51 0.078 +52 0.088 +53 0.098 +54 0.107 +55 0.115 +56 0.123 +57 0.129 +58 0.136 +59 0.141 +60 0.146 +61 0.150 +62 0.154 +63 0.157 +64 0.160 +65 0.162 +66 0.163 +67 0.165 +68 0.165 +69 0.166 +70 0.166 +71 0.166 +72 0.165 +73 0.165 +74 0.164 +75 0.164 +76 0.163 +77 0.162 +78 0.162 +79 0.161 +80 0.161 +81 0.161 +82 0.162 +83 0.163 +84 0.164 +85 0.166 +86 0.169 +87 0.173 +88 0.177 +89 0.183 +90 0.189 +1 -0.915 +2 -0.905 +3 -0.894 +4 -0.880 +5 -0.866 +6 -0.850 +7 -0.833 +8 -0.815 +9 -0.796 +10 -0.776 +11 -0.755 +12 -0.733 +13 -0.710 +14 -0.687 +15 -0.664 +16 -0.640 +17 -0.615 +18 -0.590 +19 -0.565 +20 -0.540 +21 -0.514 +22 -0.489 +23 -0.463 +24 -0.438 +25 -0.413 +26 -0.388 +27 -0.363 +28 -0.338 +29 -0.314 +30 -0.290 +31 -0.266 +32 -0.243 +33 -0.221 +34 -0.199 +35 -0.177 +36 -0.157 +37 -0.136 +38 -0.117 +39 -0.098 +40 -0.080 +41 -0.062 +42 -0.045 +43 -0.029 +44 -0.014 +45 0.000 +46 0.014 +47 0.026 +48 0.038 +49 0.049 +50 0.059 +51 0.069 +52 0.077 +53 0.085 +54 0.092 +55 0.098 +56 0.103 +57 0.108 +58 0.111 +59 0.114 +60 0.116 +61 0.117 +62 0.118 +63 0.118 +64 0.117 +65 0.116 +66 0.114 +67 0.112 +68 0.109 +69 0.105 +70 0.101 +71 0.097 +72 0.092 +73 0.087 +74 0.081 +75 0.076 +76 0.070 +77 0.064 +78 0.058 +79 0.052 +80 0.046 +81 0.040 +82 0.034 +83 0.029 +84 0.023 +85 0.019 +86 0.014 +87 0.010 +88 0.007 +89 0.005 +90 0.003 +1 -1.108 +2 -1.094 +3 -1.078 +4 -1.061 +5 -1.042 +6 -1.022 +7 -1.000 +8 -0.977 +9 -0.953 +10 -0.927 +11 -0.901 +12 -0.874 +13 -0.846 +14 -0.818 +15 -0.789 +16 -0.760 +17 -0.730 +18 -0.700 +19 -0.669 +20 -0.639 +21 -0.608 +22 -0.577 +23 -0.547 +24 -0.516 +25 -0.486 +26 -0.456 +27 -0.427 +28 -0.397 +29 -0.368 +30 -0.340 +31 -0.312 +32 -0.285 +33 -0.258 +34 -0.232 +35 -0.207 +36 -0.182 +37 -0.159 +38 -0.136 +39 -0.114 +40 -0.092 +41 -0.072 +42 -0.053 +43 -0.034 +44 -0.017 +45 0.000 +46 0.016 +47 0.030 +48 0.044 +49 0.056 +50 0.068 +51 0.078 +52 0.087 +53 0.096 +54 0.103 +55 0.110 +56 0.115 +57 0.120 +58 0.123 +59 0.126 +60 0.127 +61 0.128 +62 0.128 +63 0.126 +64 0.125 +65 0.122 +66 0.118 +67 0.114 +68 0.110 +69 0.104 +70 0.098 +71 0.091 +72 0.084 +73 0.077 +74 0.069 +75 0.061 +76 0.052 +77 0.043 +78 0.034 +79 0.025 +80 0.016 +81 0.008 +82 -0.001 +83 -0.010 +84 -0.018 +85 -0.026 +86 -0.033 +87 -0.040 +88 -0.047 +89 -0.052 +90 -0.057 +1 -1.228 +2 -1.196 +3 -1.163 +4 -1.130 +5 -1.096 +6 -1.062 +7 -1.027 +8 -0.993 +9 -0.958 +10 -0.923 +11 -0.887 +12 -0.852 +13 -0.817 +14 -0.782 +15 -0.747 +16 -0.713 +17 -0.679 +18 -0.645 +19 -0.611 +20 -0.578 +21 -0.545 +22 -0.513 +23 -0.482 +24 -0.451 +25 -0.420 +26 -0.391 +27 -0.362 +28 -0.334 +29 -0.306 +30 -0.280 +31 -0.254 +32 -0.230 +33 -0.206 +34 -0.183 +35 -0.161 +36 -0.140 +37 -0.120 +38 -0.101 +39 -0.084 +40 -0.067 +41 -0.051 +42 -0.037 +43 -0.023 +44 -0.011 +45 -0.000 +46 0.010 +47 0.019 +48 0.026 +49 0.033 +50 0.038 +51 0.042 +52 0.045 +53 0.047 +54 0.048 +55 0.047 +56 0.046 +57 0.043 +58 0.039 +59 0.034 +60 0.028 +61 0.021 +62 0.012 +63 0.003 +64 -0.007 +65 -0.019 +66 -0.031 +67 -0.044 +68 -0.059 +69 -0.074 +70 -0.090 +71 -0.107 +72 -0.125 +73 -0.143 +74 -0.163 +75 -0.183 +76 -0.203 +77 -0.225 +78 -0.247 +79 -0.269 +80 -0.292 +81 -0.316 +82 -0.340 +83 -0.364 +84 -0.389 +85 -0.413 +86 -0.439 +87 -0.464 +88 -0.489 +89 -0.515 +90 -0.540 +1 -1.316 +2 -1.317 +3 -1.314 +4 -1.307 +5 -1.298 +6 -1.286 +7 -1.270 +8 -1.253 +9 -1.232 +10 -1.210 +11 -1.185 +12 -1.158 +13 -1.130 +14 -1.100 +15 -1.068 +16 -1.035 +17 -1.001 +18 -0.966 +19 -0.930 +20 -0.893 +21 -0.855 +22 -0.817 +23 -0.778 +24 -0.739 +25 -0.700 +26 -0.661 +27 -0.621 +28 -0.582 +29 -0.543 +30 -0.504 +31 -0.465 +32 -0.427 +33 -0.390 +34 -0.353 +35 -0.316 +36 -0.281 +37 -0.246 +38 -0.212 +39 -0.179 +40 -0.146 +41 -0.115 +42 -0.085 +43 -0.055 +44 -0.027 +45 0.000 +46 0.026 +47 0.051 +48 0.074 +49 0.097 +50 0.118 +51 0.138 +52 0.157 +53 0.175 +54 0.192 +55 0.207 +56 0.222 +57 0.235 +58 0.247 +59 0.258 +60 0.268 +61 0.277 +62 0.285 +63 0.292 +64 0.299 +65 0.304 +66 0.309 +67 0.313 +68 0.317 +69 0.320 +70 0.322 +71 0.324 +72 0.326 +73 0.327 +74 0.329 +75 0.330 +76 0.331 +77 0.333 +78 0.335 +79 0.337 +80 0.340 +81 0.343 +82 0.347 +83 0.352 +84 0.358 +85 0.364 +86 0.373 +87 0.382 +88 0.393 +89 0.406 +90 0.421 +1 -1.156 +2 -1.165 +3 -1.171 +4 -1.173 +5 -1.171 +6 -1.166 +7 -1.158 +8 -1.147 +9 -1.134 +10 -1.117 +11 -1.099 +12 -1.078 +13 -1.056 +14 -1.031 +15 -1.004 +16 -0.977 +17 -0.947 +18 -0.916 +19 -0.885 +20 -0.852 +21 -0.818 +22 -0.784 +23 -0.748 +24 -0.713 +25 -0.676 +26 -0.640 +27 -0.603 +28 -0.567 +29 -0.530 +30 -0.493 +31 -0.456 +32 -0.420 +33 -0.384 +34 -0.348 +35 -0.313 +36 -0.279 +37 -0.245 +38 -0.211 +39 -0.179 +40 -0.147 +41 -0.116 +42 -0.085 +43 -0.056 +44 -0.028 +45 0.000 +46 0.027 +47 0.052 +48 0.077 +49 0.100 +50 0.123 +51 0.144 +52 0.165 +53 0.184 +54 0.203 +55 0.220 +56 0.237 +57 0.252 +58 0.267 +59 0.281 +60 0.293 +61 0.305 +62 0.317 +63 0.327 +64 0.337 +65 0.346 +66 0.354 +67 0.362 +68 0.370 +69 0.377 +70 0.384 +71 0.391 +72 0.397 +73 0.404 +74 0.410 +75 0.417 +76 0.424 +77 0.431 +78 0.438 +79 0.447 +80 0.455 +81 0.465 +82 0.476 +83 0.487 +84 0.500 +85 0.514 +86 0.530 +87 0.547 +88 0.566 +89 0.587 +90 0.610 +1 -1.182 +2 -1.209 +3 -1.231 +4 -1.248 +5 -1.260 +6 -1.267 +7 -1.270 +8 -1.269 +9 -1.264 +10 -1.255 +11 -1.243 +12 -1.227 +13 -1.209 +14 -1.187 +15 -1.163 +16 -1.137 +17 -1.108 +18 -1.077 +19 -1.044 +20 -1.010 +21 -0.974 +22 -0.937 +23 -0.899 +24 -0.859 +25 -0.819 +26 -0.778 +27 -0.736 +28 -0.694 +29 -0.651 +30 -0.608 +31 -0.565 +32 -0.522 +33 -0.479 +34 -0.436 +35 -0.394 +36 -0.352 +37 -0.310 +38 -0.269 +39 -0.228 +40 -0.188 +41 -0.149 +42 -0.110 +43 -0.073 +44 -0.036 +45 0.000 +46 0.035 +47 0.069 +48 0.102 +49 0.134 +50 0.165 +51 0.195 +52 0.224 +53 0.252 +54 0.279 +55 0.305 +56 0.330 +57 0.354 +58 0.378 +59 0.400 +60 0.421 +61 0.442 +62 0.462 +63 0.482 +64 0.501 +65 0.519 +66 0.537 +67 0.555 +68 0.572 +69 0.589 +70 0.606 +71 0.623 +72 0.640 +73 0.658 +74 0.676 +75 0.694 +76 0.713 +77 0.733 +78 0.753 +79 0.775 +80 0.798 +81 0.822 +82 0.848 +83 0.876 +84 0.905 +85 0.937 +86 0.971 +87 1.007 +88 1.046 +89 1.087 +90 1.132 +1 -0.793 +2 -0.815 +3 -0.833 +4 -0.848 +5 -0.859 +6 -0.867 +7 -0.871 +8 -0.872 +9 -0.871 +10 -0.866 +11 -0.860 +12 -0.850 +13 -0.839 +14 -0.825 +15 -0.810 +16 -0.793 +17 -0.774 +18 -0.753 +19 -0.731 +20 -0.708 +21 -0.684 +22 -0.659 +23 -0.632 +24 -0.605 +25 -0.577 +26 -0.549 +27 -0.520 +28 -0.491 +29 -0.461 +30 -0.431 +31 -0.401 +32 -0.371 +33 -0.341 +34 -0.310 +35 -0.281 +36 -0.251 +37 -0.221 +38 -0.192 +39 -0.163 +40 -0.135 +41 -0.107 +42 -0.079 +43 -0.052 +44 -0.026 +45 0.000 +46 0.025 +47 0.050 +48 0.074 +49 0.097 +50 0.120 +51 0.142 +52 0.163 +53 0.184 +54 0.204 +55 0.223 +56 0.242 +57 0.260 +58 0.277 +59 0.294 +60 0.311 +61 0.327 +62 0.342 +63 0.357 +64 0.372 +65 0.387 +66 0.401 +67 0.415 +68 0.428 +69 0.442 +70 0.456 +71 0.470 +72 0.484 +73 0.498 +74 0.513 +75 0.528 +76 0.543 +77 0.559 +78 0.576 +79 0.594 +80 0.612 +81 0.632 +82 0.652 +83 0.674 +84 0.698 +85 0.723 +86 0.749 +87 0.778 +88 0.808 +89 0.840 +90 0.875 +1 -0.672 +2 -0.704 +3 -0.732 +4 -0.755 +5 -0.775 +6 -0.791 +7 -0.803 +8 -0.811 +9 -0.816 +10 -0.818 +11 -0.818 +12 -0.814 +13 -0.808 +14 -0.799 +15 -0.788 +16 -0.775 +17 -0.760 +18 -0.743 +19 -0.725 +20 -0.704 +21 -0.683 +22 -0.660 +23 -0.636 +24 -0.610 +25 -0.584 +26 -0.557 +27 -0.530 +28 -0.501 +29 -0.472 +30 -0.443 +31 -0.413 +32 -0.383 +33 -0.353 +34 -0.323 +35 -0.293 +36 -0.262 +37 -0.232 +38 -0.202 +39 -0.172 +40 -0.143 +41 -0.113 +42 -0.084 +43 -0.056 +44 -0.028 +45 0.000 +46 0.027 +47 0.054 +48 0.080 +49 0.106 +50 0.131 +51 0.156 +52 0.180 +53 0.203 +54 0.226 +55 0.249 +56 0.271 +57 0.292 +58 0.313 +59 0.334 +60 0.354 +61 0.374 +62 0.393 +63 0.413 +64 0.432 +65 0.451 +66 0.469 +67 0.488 +68 0.507 +69 0.526 +70 0.545 +71 0.564 +72 0.584 +73 0.604 +74 0.625 +75 0.646 +76 0.668 +77 0.691 +78 0.714 +79 0.739 +80 0.765 +81 0.792 +82 0.821 +83 0.851 +84 0.883 +85 0.916 +86 0.952 +87 0.990 +88 1.030 +89 1.072 +90 1.117 +1 -0.342 +2 -0.368 +3 -0.390 +4 -0.409 +5 -0.426 +6 -0.440 +7 -0.452 +8 -0.461 +9 -0.468 +10 -0.473 +11 -0.476 +12 -0.477 +13 -0.476 +14 -0.473 +15 -0.469 +16 -0.464 +17 -0.457 +18 -0.449 +19 -0.439 +20 -0.428 +21 -0.417 +22 -0.404 +23 -0.391 +24 -0.376 +25 -0.361 +26 -0.346 +27 -0.330 +28 -0.313 +29 -0.296 +30 -0.278 +31 -0.260 +32 -0.242 +33 -0.223 +34 -0.205 +35 -0.186 +36 -0.167 +37 -0.148 +38 -0.130 +39 -0.111 +40 -0.092 +41 -0.073 +42 -0.055 +43 -0.036 +44 -0.018 +45 0.000 +46 0.018 +47 0.035 +48 0.053 +49 0.070 +50 0.087 +51 0.103 +52 0.120 +53 0.136 +54 0.152 +55 0.168 +56 0.183 +57 0.198 +58 0.213 +59 0.228 +60 0.243 +61 0.257 +62 0.272 +63 0.286 +64 0.300 +65 0.314 +66 0.329 +67 0.343 +68 0.358 +69 0.372 +70 0.387 +71 0.402 +72 0.417 +73 0.433 +74 0.449 +75 0.466 +76 0.483 +77 0.501 +78 0.520 +79 0.539 +80 0.559 +81 0.580 +82 0.602 +83 0.625 +84 0.650 +85 0.675 +86 0.702 +87 0.730 +88 0.760 +89 0.792 +90 0.825 +1 -0.164 +2 -0.190 +3 -0.214 +4 -0.234 +5 -0.253 +6 -0.269 +7 -0.283 +8 -0.295 +9 -0.306 +10 -0.314 +11 -0.320 +12 -0.325 +13 -0.328 +14 -0.330 +15 -0.330 +16 -0.329 +17 -0.327 +18 -0.323 +19 -0.319 +20 -0.313 +21 -0.307 +22 -0.299 +23 -0.291 +24 -0.282 +25 -0.272 +26 -0.261 +27 -0.250 +28 -0.239 +29 -0.227 +30 -0.214 +31 -0.201 +32 -0.188 +33 -0.174 +34 -0.160 +35 -0.146 +36 -0.132 +37 -0.118 +38 -0.103 +39 -0.088 +40 -0.074 +41 -0.059 +42 -0.044 +43 -0.029 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.044 +49 0.058 +50 0.072 +51 0.087 +52 0.101 +53 0.115 +54 0.129 +55 0.143 +56 0.157 +57 0.170 +58 0.184 +59 0.198 +60 0.211 +61 0.225 +62 0.239 +63 0.252 +64 0.266 +65 0.280 +66 0.294 +67 0.308 +68 0.323 +69 0.337 +70 0.352 +71 0.367 +72 0.383 +73 0.399 +74 0.415 +75 0.432 +76 0.449 +77 0.468 +78 0.486 +79 0.506 +80 0.526 +81 0.547 +82 0.569 +83 0.592 +84 0.616 +85 0.641 +86 0.668 +87 0.695 +88 0.725 +89 0.755 +90 0.787 +1 0.152 +2 0.135 +3 0.120 +4 0.106 +5 0.092 +6 0.079 +7 0.067 +8 0.056 +9 0.046 +10 0.036 +11 0.027 +12 0.019 +13 0.011 +14 0.004 +15 -0.002 +16 -0.008 +17 -0.013 +18 -0.018 +19 -0.022 +20 -0.025 +21 -0.029 +22 -0.031 +23 -0.033 +24 -0.035 +25 -0.037 +26 -0.038 +27 -0.038 +28 -0.038 +29 -0.038 +30 -0.038 +31 -0.037 +32 -0.036 +33 -0.035 +34 -0.033 +35 -0.031 +36 -0.029 +37 -0.027 +38 -0.024 +39 -0.021 +40 -0.018 +41 -0.015 +42 -0.012 +43 -0.008 +44 -0.004 +45 0.000 +46 0.004 +47 0.009 +48 0.013 +49 0.018 +50 0.023 +51 0.028 +52 0.033 +53 0.039 +54 0.044 +55 0.050 +56 0.056 +57 0.062 +58 0.069 +59 0.075 +60 0.082 +61 0.089 +62 0.096 +63 0.103 +64 0.110 +65 0.118 +66 0.126 +67 0.134 +68 0.143 +69 0.151 +70 0.160 +71 0.169 +72 0.179 +73 0.188 +74 0.198 +75 0.209 +76 0.219 +77 0.230 +78 0.242 +79 0.253 +80 0.265 +81 0.278 +82 0.291 +83 0.304 +84 0.318 +85 0.332 +86 0.347 +87 0.363 +88 0.378 +89 0.395 +90 0.412 +1 0.259 +2 0.245 +3 0.231 +4 0.218 +5 0.205 +6 0.193 +7 0.181 +8 0.169 +9 0.158 +10 0.148 +11 0.138 +12 0.128 +13 0.118 +14 0.109 +15 0.101 +16 0.093 +17 0.085 +18 0.077 +19 0.070 +20 0.063 +21 0.057 +22 0.051 +23 0.045 +24 0.040 +25 0.035 +26 0.030 +27 0.026 +28 0.022 +29 0.018 +30 0.015 +31 0.012 +32 0.009 +33 0.007 +34 0.005 +35 0.003 +36 0.001 +37 -0.000 +38 -0.001 +39 -0.002 +40 -0.002 +41 -0.002 +42 -0.002 +43 -0.002 +44 -0.001 +45 0.000 +46 0.001 +47 0.003 +48 0.005 +49 0.007 +50 0.009 +51 0.012 +52 0.014 +53 0.017 +54 0.021 +55 0.024 +56 0.028 +57 0.032 +58 0.037 +59 0.042 +60 0.046 +61 0.052 +62 0.057 +63 0.063 +64 0.069 +65 0.075 +66 0.081 +67 0.088 +68 0.095 +69 0.102 +70 0.110 +71 0.118 +72 0.126 +73 0.134 +74 0.143 +75 0.152 +76 0.161 +77 0.170 +78 0.180 +79 0.190 +80 0.200 +81 0.211 +82 0.222 +83 0.233 +84 0.245 +85 0.256 +86 0.268 +87 0.281 +88 0.294 +89 0.307 +90 0.320 +1 0.520 +2 0.513 +3 0.505 +4 0.497 +5 0.488 +6 0.478 +7 0.468 +8 0.457 +9 0.445 +10 0.433 +11 0.421 +12 0.408 +13 0.395 +14 0.382 +15 0.368 +16 0.354 +17 0.340 +18 0.326 +19 0.311 +20 0.297 +21 0.283 +22 0.268 +23 0.254 +24 0.240 +25 0.225 +26 0.211 +27 0.197 +28 0.184 +29 0.170 +30 0.157 +31 0.144 +32 0.131 +33 0.119 +34 0.107 +35 0.095 +36 0.084 +37 0.073 +38 0.062 +39 0.052 +40 0.042 +41 0.033 +42 0.024 +43 0.015 +44 0.008 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.020 +49 -0.025 +50 -0.030 +51 -0.035 +52 -0.039 +53 -0.043 +54 -0.046 +55 -0.049 +56 -0.051 +57 -0.053 +58 -0.054 +59 -0.055 +60 -0.055 +61 -0.055 +62 -0.055 +63 -0.054 +64 -0.053 +65 -0.051 +66 -0.050 +67 -0.047 +68 -0.045 +69 -0.042 +70 -0.039 +71 -0.036 +72 -0.032 +73 -0.029 +74 -0.025 +75 -0.021 +76 -0.017 +77 -0.012 +78 -0.008 +79 -0.004 +80 0.000 +81 0.004 +82 0.008 +83 0.012 +84 0.016 +85 0.019 +86 0.023 +87 0.025 +88 0.028 +89 0.030 +90 0.032 +1 0.592 +2 0.591 +3 0.588 +4 0.584 +5 0.579 +6 0.572 +7 0.565 +8 0.556 +9 0.546 +10 0.535 +11 0.523 +12 0.511 +13 0.497 +14 0.484 +15 0.469 +16 0.454 +17 0.438 +18 0.422 +19 0.406 +20 0.389 +21 0.373 +22 0.355 +23 0.338 +24 0.321 +25 0.303 +26 0.286 +27 0.269 +28 0.251 +29 0.234 +30 0.217 +31 0.200 +32 0.184 +33 0.167 +34 0.151 +35 0.135 +36 0.120 +37 0.105 +38 0.090 +39 0.076 +40 0.062 +41 0.049 +42 0.036 +43 0.023 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.031 +49 -0.040 +50 -0.049 +51 -0.057 +52 -0.065 +53 -0.072 +54 -0.079 +55 -0.085 +56 -0.090 +57 -0.095 +58 -0.100 +59 -0.104 +60 -0.108 +61 -0.111 +62 -0.114 +63 -0.116 +64 -0.118 +65 -0.120 +66 -0.121 +67 -0.122 +68 -0.122 +69 -0.123 +70 -0.123 +71 -0.123 +72 -0.123 +73 -0.123 +74 -0.122 +75 -0.122 +76 -0.122 +77 -0.122 +78 -0.121 +79 -0.122 +80 -0.122 +81 -0.122 +82 -0.123 +83 -0.125 +84 -0.126 +85 -0.128 +86 -0.131 +87 -0.134 +88 -0.139 +89 -0.143 +90 -0.149 +1 0.817 +2 0.824 +3 0.828 +4 0.829 +5 0.828 +6 0.825 +7 0.819 +8 0.811 +9 0.802 +10 0.790 +11 0.777 +12 0.763 +13 0.747 +14 0.729 +15 0.711 +16 0.691 +17 0.670 +18 0.648 +19 0.626 +20 0.602 +21 0.578 +22 0.554 +23 0.529 +24 0.504 +25 0.478 +26 0.452 +27 0.426 +28 0.400 +29 0.374 +30 0.348 +31 0.322 +32 0.296 +33 0.271 +34 0.246 +35 0.221 +36 0.196 +37 0.172 +38 0.149 +39 0.126 +40 0.103 +41 0.081 +42 0.060 +43 0.039 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.054 +49 -0.070 +50 -0.086 +51 -0.101 +52 -0.116 +53 -0.129 +54 -0.142 +55 -0.154 +56 -0.166 +57 -0.177 +58 -0.187 +59 -0.197 +60 -0.205 +61 -0.214 +62 -0.222 +63 -0.229 +64 -0.236 +65 -0.242 +66 -0.248 +67 -0.254 +68 -0.259 +69 -0.264 +70 -0.269 +71 -0.274 +72 -0.278 +73 -0.283 +74 -0.288 +75 -0.293 +76 -0.298 +77 -0.303 +78 -0.309 +79 -0.315 +80 -0.322 +81 -0.329 +82 -0.337 +83 -0.346 +84 -0.356 +85 -0.367 +86 -0.378 +87 -0.391 +88 -0.406 +89 -0.422 +90 -0.439 +1 0.882 +2 0.896 +3 0.907 +4 0.914 +5 0.918 +6 0.919 +7 0.917 +8 0.913 +9 0.905 +10 0.896 +11 0.884 +12 0.871 +13 0.855 +14 0.838 +15 0.818 +16 0.798 +17 0.776 +18 0.753 +19 0.728 +20 0.703 +21 0.676 +22 0.649 +23 0.621 +24 0.593 +25 0.564 +26 0.535 +27 0.505 +28 0.475 +29 0.445 +30 0.415 +31 0.385 +32 0.355 +33 0.325 +34 0.296 +35 0.266 +36 0.237 +37 0.209 +38 0.181 +39 0.153 +40 0.126 +41 0.100 +42 0.074 +43 0.048 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.067 +49 -0.088 +50 -0.108 +51 -0.127 +52 -0.146 +53 -0.164 +54 -0.181 +55 -0.197 +56 -0.213 +57 -0.228 +58 -0.242 +59 -0.255 +60 -0.268 +61 -0.280 +62 -0.292 +63 -0.303 +64 -0.314 +65 -0.325 +66 -0.335 +67 -0.344 +68 -0.354 +69 -0.363 +70 -0.372 +71 -0.381 +72 -0.390 +73 -0.399 +74 -0.409 +75 -0.418 +76 -0.429 +77 -0.439 +78 -0.450 +79 -0.462 +80 -0.474 +81 -0.488 +82 -0.502 +83 -0.518 +84 -0.534 +85 -0.552 +86 -0.572 +87 -0.593 +88 -0.616 +89 -0.640 +90 -0.667 +1 1.034 +2 1.054 +3 1.069 +4 1.080 +5 1.087 +6 1.090 +7 1.090 +8 1.087 +9 1.080 +10 1.070 +11 1.058 +12 1.043 +13 1.025 +14 1.005 +15 0.983 +16 0.960 +17 0.934 +18 0.907 +19 0.878 +20 0.848 +21 0.817 +22 0.785 +23 0.752 +24 0.718 +25 0.684 +26 0.649 +27 0.613 +28 0.577 +29 0.541 +30 0.505 +31 0.469 +32 0.433 +33 0.397 +34 0.361 +35 0.325 +36 0.290 +37 0.255 +38 0.221 +39 0.188 +40 0.154 +41 0.122 +42 0.090 +43 0.059 +44 0.029 +45 -0.000 +46 -0.029 +47 -0.056 +48 -0.083 +49 -0.109 +50 -0.134 +51 -0.158 +52 -0.181 +53 -0.203 +54 -0.225 +55 -0.245 +56 -0.265 +57 -0.284 +58 -0.302 +59 -0.320 +60 -0.336 +61 -0.352 +62 -0.367 +63 -0.382 +64 -0.396 +65 -0.410 +66 -0.423 +67 -0.436 +68 -0.449 +69 -0.462 +70 -0.474 +71 -0.486 +72 -0.499 +73 -0.512 +74 -0.525 +75 -0.538 +76 -0.552 +77 -0.566 +78 -0.581 +79 -0.597 +80 -0.614 +81 -0.633 +82 -0.652 +83 -0.673 +84 -0.695 +85 -0.719 +86 -0.745 +87 -0.773 +88 -0.803 +89 -0.835 +90 -0.870 +1 1.033 +2 1.058 +3 1.079 +4 1.095 +5 1.107 +6 1.115 +7 1.118 +8 1.118 +9 1.114 +10 1.107 +11 1.097 +12 1.084 +13 1.068 +14 1.049 +15 1.029 +16 1.006 +17 0.981 +18 0.954 +19 0.925 +20 0.895 +21 0.863 +22 0.831 +23 0.797 +24 0.762 +25 0.726 +26 0.690 +27 0.653 +28 0.616 +29 0.578 +30 0.540 +31 0.502 +32 0.464 +33 0.426 +34 0.388 +35 0.350 +36 0.313 +37 0.276 +38 0.239 +39 0.203 +40 0.167 +41 0.132 +42 0.098 +43 0.065 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.091 +49 -0.120 +50 -0.147 +51 -0.174 +52 -0.200 +53 -0.225 +54 -0.250 +55 -0.273 +56 -0.295 +57 -0.317 +58 -0.338 +59 -0.358 +60 -0.378 +61 -0.397 +62 -0.415 +63 -0.433 +64 -0.450 +65 -0.467 +66 -0.484 +67 -0.500 +68 -0.516 +69 -0.532 +70 -0.548 +71 -0.564 +72 -0.580 +73 -0.597 +74 -0.614 +75 -0.631 +76 -0.649 +77 -0.668 +78 -0.687 +79 -0.708 +80 -0.730 +81 -0.753 +82 -0.778 +83 -0.804 +84 -0.832 +85 -0.862 +86 -0.894 +87 -0.928 +88 -0.965 +89 -1.004 +90 -1.046 +1 1.021 +2 1.048 +3 1.070 +4 1.087 +5 1.100 +6 1.109 +7 1.113 +8 1.114 +9 1.111 +10 1.104 +11 1.095 +12 1.082 +13 1.067 +14 1.049 +15 1.029 +16 1.006 +17 0.982 +18 0.955 +19 0.927 +20 0.897 +21 0.866 +22 0.833 +23 0.799 +24 0.765 +25 0.729 +26 0.693 +27 0.656 +28 0.619 +29 0.581 +30 0.543 +31 0.505 +32 0.467 +33 0.428 +34 0.390 +35 0.352 +36 0.315 +37 0.278 +38 0.241 +39 0.205 +40 0.169 +41 0.134 +42 0.099 +43 0.065 +44 0.032 +45 -0.000 +46 -0.032 +47 -0.062 +48 -0.092 +49 -0.121 +50 -0.149 +51 -0.176 +52 -0.203 +53 -0.228 +54 -0.253 +55 -0.277 +56 -0.300 +57 -0.322 +58 -0.344 +59 -0.364 +60 -0.385 +61 -0.404 +62 -0.423 +63 -0.441 +64 -0.459 +65 -0.477 +66 -0.494 +67 -0.511 +68 -0.528 +69 -0.544 +70 -0.561 +71 -0.578 +72 -0.595 +73 -0.612 +74 -0.630 +75 -0.648 +76 -0.667 +77 -0.687 +78 -0.707 +79 -0.729 +80 -0.752 +81 -0.776 +82 -0.802 +83 -0.829 +84 -0.858 +85 -0.890 +86 -0.923 +87 -0.958 +88 -0.997 +89 -1.037 +90 -1.081 +1 1.020 +2 1.055 +3 1.085 +4 1.110 +5 1.129 +6 1.143 +7 1.153 +8 1.159 +9 1.160 +10 1.157 +11 1.151 +12 1.141 +13 1.128 +14 1.112 +15 1.093 +16 1.071 +17 1.047 +18 1.021 +19 0.993 +20 0.963 +21 0.931 +22 0.897 +23 0.862 +24 0.826 +25 0.789 +26 0.751 +27 0.712 +28 0.673 +29 0.633 +30 0.592 +31 0.551 +32 0.510 +33 0.469 +34 0.428 +35 0.387 +36 0.346 +37 0.306 +38 0.266 +39 0.226 +40 0.187 +41 0.148 +42 0.110 +43 0.073 +44 0.036 +45 -0.000 +46 -0.035 +47 -0.070 +48 -0.103 +49 -0.136 +50 -0.168 +51 -0.199 +52 -0.229 +53 -0.258 +54 -0.287 +55 -0.314 +56 -0.341 +57 -0.367 +58 -0.392 +59 -0.417 +60 -0.441 +61 -0.465 +62 -0.487 +63 -0.510 +64 -0.532 +65 -0.554 +66 -0.575 +67 -0.596 +68 -0.617 +69 -0.639 +70 -0.660 +71 -0.682 +72 -0.703 +73 -0.726 +74 -0.749 +75 -0.772 +76 -0.797 +77 -0.822 +78 -0.849 +79 -0.877 +80 -0.906 +81 -0.937 +82 -0.970 +83 -1.004 +84 -1.041 +85 -1.080 +86 -1.122 +87 -1.166 +88 -1.213 +89 -1.263 +90 -1.317 +1 0.828 +2 0.861 +3 0.890 +4 0.914 +5 0.933 +6 0.948 +7 0.959 +8 0.966 +9 0.969 +10 0.969 +11 0.966 +12 0.959 +13 0.950 +14 0.938 +15 0.923 +16 0.906 +17 0.887 +18 0.866 +19 0.843 +20 0.818 +21 0.792 +22 0.764 +23 0.735 +24 0.705 +25 0.674 +26 0.642 +27 0.610 +28 0.576 +29 0.542 +30 0.508 +31 0.473 +32 0.439 +33 0.404 +34 0.369 +35 0.334 +36 0.299 +37 0.264 +38 0.230 +39 0.195 +40 0.162 +41 0.128 +42 0.095 +43 0.063 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.090 +49 -0.119 +50 -0.147 +51 -0.174 +52 -0.200 +53 -0.226 +54 -0.252 +55 -0.276 +56 -0.300 +57 -0.324 +58 -0.347 +59 -0.369 +60 -0.391 +61 -0.412 +62 -0.433 +63 -0.453 +64 -0.474 +65 -0.494 +66 -0.514 +67 -0.533 +68 -0.553 +69 -0.573 +70 -0.593 +71 -0.613 +72 -0.634 +73 -0.655 +74 -0.677 +75 -0.699 +76 -0.722 +77 -0.746 +78 -0.771 +79 -0.797 +80 -0.825 +81 -0.854 +82 -0.885 +83 -0.917 +84 -0.951 +85 -0.987 +86 -1.026 +87 -1.067 +88 -1.110 +89 -1.157 +90 -1.206 +1 0.682 +2 0.720 +3 0.753 +4 0.781 +5 0.805 +6 0.824 +7 0.840 +8 0.851 +9 0.859 +10 0.863 +11 0.865 +12 0.862 +13 0.857 +14 0.850 +15 0.839 +16 0.827 +17 0.812 +18 0.795 +19 0.776 +20 0.755 +21 0.732 +22 0.709 +23 0.683 +24 0.657 +25 0.629 +26 0.601 +27 0.571 +28 0.541 +29 0.510 +30 0.479 +31 0.447 +32 0.415 +33 0.383 +34 0.350 +35 0.318 +36 0.285 +37 0.252 +38 0.220 +39 0.187 +40 0.155 +41 0.124 +42 0.092 +43 0.061 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.059 +48 -0.088 +49 -0.116 +50 -0.144 +51 -0.171 +52 -0.198 +53 -0.224 +54 -0.249 +55 -0.274 +56 -0.299 +57 -0.323 +58 -0.347 +59 -0.370 +60 -0.393 +61 -0.416 +62 -0.438 +63 -0.460 +64 -0.482 +65 -0.504 +66 -0.526 +67 -0.548 +68 -0.569 +69 -0.592 +70 -0.614 +71 -0.637 +72 -0.660 +73 -0.684 +74 -0.708 +75 -0.733 +76 -0.760 +77 -0.787 +78 -0.815 +79 -0.844 +80 -0.875 +81 -0.908 +82 -0.942 +83 -0.977 +84 -1.015 +85 -1.055 +86 -1.097 +87 -1.142 +88 -1.189 +89 -1.239 +90 -1.292 +1 0.235 +2 0.261 +3 0.285 +4 0.306 +5 0.324 +6 0.340 +7 0.353 +8 0.365 +9 0.374 +10 0.381 +11 0.386 +12 0.390 +13 0.392 +14 0.392 +15 0.390 +16 0.387 +17 0.383 +18 0.378 +19 0.371 +20 0.363 +21 0.355 +22 0.345 +23 0.334 +24 0.323 +25 0.311 +26 0.298 +27 0.285 +28 0.271 +29 0.257 +30 0.242 +31 0.227 +32 0.211 +33 0.196 +34 0.180 +35 0.164 +36 0.147 +37 0.131 +38 0.115 +39 0.098 +40 0.082 +41 0.065 +42 0.049 +43 0.032 +44 0.016 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.063 +50 -0.079 +51 -0.094 +52 -0.109 +53 -0.124 +54 -0.139 +55 -0.153 +56 -0.168 +57 -0.182 +58 -0.197 +59 -0.211 +60 -0.225 +61 -0.239 +62 -0.253 +63 -0.267 +64 -0.281 +65 -0.295 +66 -0.310 +67 -0.324 +68 -0.339 +69 -0.354 +70 -0.369 +71 -0.385 +72 -0.400 +73 -0.417 +74 -0.434 +75 -0.451 +76 -0.469 +77 -0.487 +78 -0.507 +79 -0.527 +80 -0.548 +81 -0.570 +82 -0.593 +83 -0.617 +84 -0.643 +85 -0.669 +86 -0.697 +87 -0.727 +88 -0.758 +89 -0.791 +90 -0.825 +1 -0.059 +2 -0.030 +3 -0.003 +4 0.022 +5 0.044 +6 0.064 +7 0.083 +8 0.100 +9 0.115 +10 0.128 +11 0.140 +12 0.150 +13 0.159 +14 0.166 +15 0.172 +16 0.177 +17 0.181 +18 0.183 +19 0.184 +20 0.185 +21 0.184 +22 0.183 +23 0.181 +24 0.178 +25 0.174 +26 0.169 +27 0.164 +28 0.158 +29 0.152 +30 0.145 +31 0.138 +32 0.130 +33 0.122 +34 0.113 +35 0.104 +36 0.095 +37 0.085 +38 0.075 +39 0.065 +40 0.055 +41 0.044 +42 0.033 +43 0.022 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.023 +48 -0.035 +49 -0.046 +50 -0.058 +51 -0.070 +52 -0.082 +53 -0.094 +54 -0.107 +55 -0.119 +56 -0.132 +57 -0.144 +58 -0.157 +59 -0.170 +60 -0.183 +61 -0.197 +62 -0.210 +63 -0.224 +64 -0.238 +65 -0.252 +66 -0.267 +67 -0.282 +68 -0.297 +69 -0.313 +70 -0.329 +71 -0.346 +72 -0.363 +73 -0.380 +74 -0.398 +75 -0.417 +76 -0.436 +77 -0.457 +78 -0.477 +79 -0.499 +80 -0.521 +81 -0.545 +82 -0.569 +83 -0.594 +84 -0.621 +85 -0.648 +86 -0.677 +87 -0.707 +88 -0.738 +89 -0.771 +90 -0.805 +1 -0.619 +2 -0.610 +3 -0.601 +4 -0.590 +5 -0.579 +6 -0.567 +7 -0.554 +8 -0.541 +9 -0.527 +10 -0.513 +11 -0.498 +12 -0.483 +13 -0.467 +14 -0.451 +15 -0.434 +16 -0.418 +17 -0.401 +18 -0.384 +19 -0.367 +20 -0.350 +21 -0.333 +22 -0.316 +23 -0.299 +24 -0.282 +25 -0.266 +26 -0.249 +27 -0.233 +28 -0.217 +29 -0.201 +30 -0.185 +31 -0.170 +32 -0.155 +33 -0.140 +34 -0.126 +35 -0.112 +36 -0.099 +37 -0.086 +38 -0.073 +39 -0.061 +40 -0.050 +41 -0.039 +42 -0.028 +43 -0.018 +44 -0.009 +45 0.000 +46 0.008 +47 0.016 +48 0.023 +49 0.030 +50 0.036 +51 0.041 +52 0.046 +53 0.050 +54 0.054 +55 0.057 +56 0.060 +57 0.062 +58 0.063 +59 0.064 +60 0.064 +61 0.064 +62 0.063 +63 0.062 +64 0.061 +65 0.059 +66 0.056 +67 0.053 +68 0.050 +69 0.046 +70 0.042 +71 0.038 +72 0.033 +73 0.028 +74 0.023 +75 0.017 +76 0.012 +77 0.006 +78 0.000 +79 -0.006 +80 -0.012 +81 -0.018 +82 -0.024 +83 -0.030 +84 -0.035 +85 -0.041 +86 -0.046 +87 -0.052 +88 -0.056 +89 -0.061 +90 -0.065 +1 -1.088 +2 -1.090 +3 -1.089 +4 -1.085 +5 -1.078 +6 -1.069 +7 -1.057 +8 -1.043 +9 -1.027 +10 -1.009 +11 -0.989 +12 -0.968 +13 -0.945 +14 -0.920 +15 -0.894 +16 -0.867 +17 -0.839 +18 -0.810 +19 -0.780 +20 -0.749 +21 -0.718 +22 -0.686 +23 -0.654 +24 -0.622 +25 -0.589 +26 -0.556 +27 -0.523 +28 -0.490 +29 -0.458 +30 -0.425 +31 -0.393 +32 -0.361 +33 -0.329 +34 -0.298 +35 -0.267 +36 -0.237 +37 -0.208 +38 -0.179 +39 -0.151 +40 -0.124 +41 -0.097 +42 -0.072 +43 -0.047 +44 -0.023 +45 0.000 +46 0.022 +47 0.043 +48 0.063 +49 0.083 +50 0.101 +51 0.118 +52 0.134 +53 0.150 +54 0.164 +55 0.178 +56 0.190 +57 0.202 +58 0.212 +59 0.222 +60 0.231 +61 0.239 +62 0.246 +63 0.253 +64 0.259 +65 0.264 +66 0.269 +67 0.273 +68 0.276 +69 0.279 +70 0.282 +71 0.284 +72 0.287 +73 0.289 +74 0.291 +75 0.293 +76 0.294 +77 0.297 +78 0.299 +79 0.302 +80 0.305 +81 0.309 +82 0.313 +83 0.318 +84 0.324 +85 0.331 +86 0.339 +87 0.349 +88 0.359 +89 0.371 +90 0.385 +1 -2.046 +2 -2.084 +3 -2.114 +4 -2.135 +5 -2.149 +6 -2.155 +7 -2.155 +8 -2.147 +9 -2.134 +10 -2.114 +11 -2.090 +12 -2.060 +13 -2.025 +14 -1.986 +15 -1.943 +16 -1.896 +17 -1.845 +18 -1.792 +19 -1.735 +20 -1.676 +21 -1.615 +22 -1.551 +23 -1.486 +24 -1.419 +25 -1.351 +26 -1.282 +27 -1.211 +28 -1.141 +29 -1.069 +30 -0.998 +31 -0.926 +32 -0.855 +33 -0.784 +34 -0.713 +35 -0.643 +36 -0.573 +37 -0.505 +38 -0.437 +39 -0.371 +40 -0.305 +41 -0.241 +42 -0.179 +43 -0.118 +44 -0.058 +45 0.000 +46 0.056 +47 0.111 +48 0.164 +49 0.215 +50 0.265 +51 0.312 +52 0.358 +53 0.402 +54 0.445 +55 0.485 +56 0.524 +57 0.562 +58 0.598 +59 0.632 +60 0.665 +61 0.696 +62 0.726 +63 0.755 +64 0.783 +65 0.810 +66 0.836 +67 0.861 +68 0.886 +69 0.911 +70 0.935 +71 0.959 +72 0.983 +73 1.008 +74 1.033 +75 1.059 +76 1.085 +77 1.113 +78 1.142 +79 1.173 +80 1.205 +81 1.240 +82 1.277 +83 1.317 +84 1.359 +85 1.405 +86 1.455 +87 1.508 +88 1.565 +89 1.627 +90 1.694 +1 -1.412 +2 -1.431 +3 -1.445 +4 -1.454 +5 -1.458 +6 -1.458 +7 -1.453 +8 -1.444 +9 -1.431 +10 -1.415 +11 -1.395 +12 -1.372 +13 -1.347 +14 -1.318 +15 -1.287 +16 -1.254 +17 -1.219 +18 -1.181 +19 -1.143 +20 -1.102 +21 -1.060 +22 -1.017 +23 -0.973 +24 -0.928 +25 -0.882 +26 -0.836 +27 -0.789 +28 -0.742 +29 -0.695 +30 -0.648 +31 -0.601 +32 -0.554 +33 -0.507 +34 -0.461 +35 -0.415 +36 -0.370 +37 -0.325 +38 -0.281 +39 -0.238 +40 -0.196 +41 -0.155 +42 -0.114 +43 -0.075 +44 -0.037 +45 0.000 +46 0.036 +47 0.071 +48 0.104 +49 0.136 +50 0.167 +51 0.197 +52 0.226 +53 0.253 +54 0.279 +55 0.304 +56 0.328 +57 0.350 +58 0.372 +59 0.392 +60 0.412 +61 0.430 +62 0.447 +63 0.464 +64 0.480 +65 0.495 +66 0.510 +67 0.523 +68 0.537 +69 0.550 +70 0.563 +71 0.576 +72 0.588 +73 0.601 +74 0.614 +75 0.628 +76 0.641 +77 0.656 +78 0.671 +79 0.687 +80 0.704 +81 0.723 +82 0.743 +83 0.764 +84 0.787 +85 0.813 +86 0.840 +87 0.870 +88 0.902 +89 0.937 +90 0.975 +1 -1.142 +2 -1.158 +3 -1.169 +4 -1.177 +5 -1.180 +6 -1.180 +7 -1.176 +8 -1.169 +9 -1.159 +10 -1.146 +11 -1.130 +12 -1.111 +13 -1.091 +14 -1.068 +15 -1.043 +16 -1.016 +17 -0.987 +18 -0.957 +19 -0.925 +20 -0.893 +21 -0.859 +22 -0.824 +23 -0.788 +24 -0.752 +25 -0.715 +26 -0.677 +27 -0.640 +28 -0.601 +29 -0.563 +30 -0.525 +31 -0.487 +32 -0.449 +33 -0.411 +34 -0.373 +35 -0.336 +36 -0.300 +37 -0.263 +38 -0.228 +39 -0.193 +40 -0.159 +41 -0.125 +42 -0.093 +43 -0.061 +44 -0.030 +45 0.000 +46 0.029 +47 0.057 +48 0.084 +49 0.110 +50 0.136 +51 0.160 +52 0.183 +53 0.205 +54 0.226 +55 0.246 +56 0.266 +57 0.284 +58 0.301 +59 0.318 +60 0.333 +61 0.348 +62 0.362 +63 0.376 +64 0.389 +65 0.401 +66 0.413 +67 0.424 +68 0.435 +69 0.446 +70 0.456 +71 0.466 +72 0.477 +73 0.487 +74 0.497 +75 0.508 +76 0.519 +77 0.531 +78 0.544 +79 0.557 +80 0.571 +81 0.585 +82 0.602 +83 0.619 +84 0.638 +85 0.658 +86 0.680 +87 0.705 +88 0.731 +89 0.759 +90 0.790 +1 -0.847 +2 -0.856 +3 -0.862 +4 -0.865 +5 -0.865 +6 -0.863 +7 -0.858 +8 -0.851 +9 -0.842 +10 -0.831 +11 -0.818 +12 -0.804 +13 -0.787 +14 -0.770 +15 -0.751 +16 -0.730 +17 -0.709 +18 -0.687 +19 -0.663 +20 -0.639 +21 -0.614 +22 -0.589 +23 -0.562 +24 -0.536 +25 -0.509 +26 -0.482 +27 -0.455 +28 -0.427 +29 -0.400 +30 -0.372 +31 -0.345 +32 -0.317 +33 -0.290 +34 -0.264 +35 -0.237 +36 -0.211 +37 -0.185 +38 -0.160 +39 -0.135 +40 -0.111 +41 -0.088 +42 -0.065 +43 -0.043 +44 -0.021 +45 0.000 +46 0.020 +47 0.040 +48 0.059 +49 0.077 +50 0.094 +51 0.110 +52 0.126 +53 0.141 +54 0.156 +55 0.169 +56 0.182 +57 0.194 +58 0.206 +59 0.216 +60 0.227 +61 0.236 +62 0.245 +63 0.254 +64 0.262 +65 0.269 +66 0.276 +67 0.283 +68 0.290 +69 0.296 +70 0.302 +71 0.308 +72 0.314 +73 0.320 +74 0.326 +75 0.332 +76 0.338 +77 0.345 +78 0.352 +79 0.359 +80 0.367 +81 0.376 +82 0.385 +83 0.396 +84 0.407 +85 0.419 +86 0.433 +87 0.448 +88 0.464 +89 0.482 +90 0.501 +1 -0.601 +2 -0.610 +3 -0.617 +4 -0.621 +5 -0.623 +6 -0.623 +7 -0.621 +8 -0.618 +9 -0.613 +10 -0.606 +11 -0.598 +12 -0.588 +13 -0.577 +14 -0.565 +15 -0.552 +16 -0.538 +17 -0.523 +18 -0.507 +19 -0.491 +20 -0.474 +21 -0.456 +22 -0.437 +23 -0.418 +24 -0.399 +25 -0.380 +26 -0.360 +27 -0.340 +28 -0.320 +29 -0.299 +30 -0.279 +31 -0.259 +32 -0.239 +33 -0.218 +34 -0.199 +35 -0.179 +36 -0.159 +37 -0.140 +38 -0.121 +39 -0.103 +40 -0.085 +41 -0.067 +42 -0.049 +43 -0.032 +44 -0.016 +45 0.000 +46 0.015 +47 0.030 +48 0.045 +49 0.059 +50 0.072 +51 0.085 +52 0.098 +53 0.110 +54 0.121 +55 0.132 +56 0.142 +57 0.152 +58 0.161 +59 0.170 +60 0.179 +61 0.187 +62 0.194 +63 0.202 +64 0.209 +65 0.216 +66 0.222 +67 0.228 +68 0.234 +69 0.240 +70 0.246 +71 0.252 +72 0.258 +73 0.263 +74 0.269 +75 0.275 +76 0.282 +77 0.288 +78 0.295 +79 0.302 +80 0.310 +81 0.319 +82 0.328 +83 0.337 +84 0.348 +85 0.359 +86 0.372 +87 0.385 +88 0.399 +89 0.415 +90 0.432 +1 -0.214 +2 -0.211 +3 -0.208 +4 -0.204 +5 -0.200 +6 -0.196 +7 -0.191 +8 -0.187 +9 -0.182 +10 -0.177 +11 -0.172 +12 -0.166 +13 -0.161 +14 -0.155 +15 -0.149 +16 -0.144 +17 -0.138 +18 -0.132 +19 -0.126 +20 -0.120 +21 -0.114 +22 -0.108 +23 -0.102 +24 -0.097 +25 -0.091 +26 -0.085 +27 -0.079 +28 -0.074 +29 -0.068 +30 -0.063 +31 -0.058 +32 -0.053 +33 -0.048 +34 -0.043 +35 -0.038 +36 -0.033 +37 -0.029 +38 -0.025 +39 -0.021 +40 -0.017 +41 -0.013 +42 -0.009 +43 -0.006 +44 -0.003 +45 0.000 +46 0.003 +47 0.005 +48 0.008 +49 0.010 +50 0.012 +51 0.014 +52 0.015 +53 0.016 +54 0.018 +55 0.019 +56 0.019 +57 0.020 +58 0.020 +59 0.021 +60 0.021 +61 0.020 +62 0.020 +63 0.020 +64 0.019 +65 0.018 +66 0.017 +67 0.016 +68 0.015 +69 0.013 +70 0.012 +71 0.010 +72 0.009 +73 0.007 +74 0.005 +75 0.003 +76 0.001 +77 -0.001 +78 -0.003 +79 -0.005 +80 -0.007 +81 -0.008 +82 -0.010 +83 -0.012 +84 -0.014 +85 -0.016 +86 -0.018 +87 -0.019 +88 -0.021 +89 -0.022 +90 -0.023 +1 -0.124 +2 -0.126 +3 -0.128 +4 -0.129 +5 -0.130 +6 -0.130 +7 -0.130 +8 -0.130 +9 -0.129 +10 -0.128 +11 -0.126 +12 -0.125 +13 -0.122 +14 -0.120 +15 -0.117 +16 -0.115 +17 -0.111 +18 -0.108 +19 -0.105 +20 -0.101 +21 -0.097 +22 -0.094 +23 -0.090 +24 -0.086 +25 -0.081 +26 -0.077 +27 -0.073 +28 -0.069 +29 -0.064 +30 -0.060 +31 -0.056 +32 -0.051 +33 -0.047 +34 -0.043 +35 -0.039 +36 -0.034 +37 -0.030 +38 -0.026 +39 -0.022 +40 -0.018 +41 -0.014 +42 -0.011 +43 -0.007 +44 -0.003 +45 0.000 +46 0.003 +47 0.007 +48 0.010 +49 0.013 +50 0.016 +51 0.019 +52 0.021 +53 0.024 +54 0.026 +55 0.029 +56 0.031 +57 0.033 +58 0.036 +59 0.038 +60 0.040 +61 0.041 +62 0.043 +63 0.045 +64 0.047 +65 0.048 +66 0.050 +67 0.051 +68 0.053 +69 0.054 +70 0.056 +71 0.058 +72 0.059 +73 0.061 +74 0.062 +75 0.064 +76 0.066 +77 0.068 +78 0.069 +79 0.072 +80 0.074 +81 0.076 +82 0.079 +83 0.081 +84 0.084 +85 0.087 +86 0.091 +87 0.094 +88 0.098 +89 0.102 +90 0.107 +1 0.167 +2 0.176 +3 0.183 +4 0.190 +5 0.195 +6 0.199 +7 0.203 +8 0.205 +9 0.207 +10 0.207 +11 0.207 +12 0.207 +13 0.205 +14 0.203 +15 0.201 +16 0.198 +17 0.194 +18 0.190 +19 0.185 +20 0.180 +21 0.175 +22 0.169 +23 0.163 +24 0.156 +25 0.150 +26 0.143 +27 0.136 +28 0.129 +29 0.121 +30 0.114 +31 0.106 +32 0.099 +33 0.091 +34 0.083 +35 0.076 +36 0.068 +37 0.060 +38 0.052 +39 0.045 +40 0.037 +41 0.029 +42 0.022 +43 0.014 +44 0.007 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.021 +49 -0.028 +50 -0.034 +51 -0.041 +52 -0.047 +53 -0.053 +54 -0.059 +55 -0.065 +56 -0.071 +57 -0.077 +58 -0.082 +59 -0.088 +60 -0.093 +61 -0.098 +62 -0.104 +63 -0.109 +64 -0.114 +65 -0.119 +66 -0.124 +67 -0.129 +68 -0.134 +69 -0.139 +70 -0.144 +71 -0.149 +72 -0.154 +73 -0.160 +74 -0.165 +75 -0.171 +76 -0.177 +77 -0.183 +78 -0.189 +79 -0.195 +80 -0.202 +81 -0.209 +82 -0.217 +83 -0.224 +84 -0.233 +85 -0.241 +86 -0.251 +87 -0.260 +88 -0.271 +89 -0.281 +90 -0.293 +1 0.162 +2 0.163 +3 0.163 +4 0.163 +5 0.163 +6 0.162 +7 0.161 +8 0.159 +9 0.157 +10 0.155 +11 0.152 +12 0.149 +13 0.146 +14 0.143 +15 0.139 +16 0.135 +17 0.131 +18 0.127 +19 0.122 +20 0.118 +21 0.113 +22 0.108 +23 0.103 +24 0.098 +25 0.093 +26 0.088 +27 0.083 +28 0.078 +29 0.073 +30 0.068 +31 0.063 +32 0.058 +33 0.053 +34 0.048 +35 0.043 +36 0.038 +37 0.034 +38 0.029 +39 0.025 +40 0.020 +41 0.016 +42 0.012 +43 0.008 +44 0.004 +45 -0.000 +46 -0.004 +47 -0.007 +48 -0.011 +49 -0.014 +50 -0.017 +51 -0.020 +52 -0.023 +53 -0.025 +54 -0.028 +55 -0.030 +56 -0.033 +57 -0.035 +58 -0.037 +59 -0.039 +60 -0.040 +61 -0.042 +62 -0.043 +63 -0.045 +64 -0.046 +65 -0.047 +66 -0.048 +67 -0.049 +68 -0.050 +69 -0.051 +70 -0.052 +71 -0.053 +72 -0.054 +73 -0.054 +74 -0.055 +75 -0.056 +76 -0.056 +77 -0.057 +78 -0.058 +79 -0.059 +80 -0.060 +81 -0.061 +82 -0.062 +83 -0.063 +84 -0.064 +85 -0.066 +86 -0.067 +87 -0.069 +88 -0.071 +89 -0.073 +90 -0.076 +1 0.275 +2 0.282 +3 0.288 +4 0.293 +5 0.296 +6 0.298 +7 0.299 +8 0.299 +9 0.299 +10 0.297 +11 0.294 +12 0.291 +13 0.287 +14 0.282 +15 0.276 +16 0.270 +17 0.264 +18 0.257 +19 0.249 +20 0.241 +21 0.233 +22 0.224 +23 0.215 +24 0.205 +25 0.196 +26 0.186 +27 0.176 +28 0.166 +29 0.156 +30 0.146 +31 0.136 +32 0.125 +33 0.115 +34 0.105 +35 0.095 +36 0.085 +37 0.075 +38 0.065 +39 0.055 +40 0.045 +41 0.036 +42 0.027 +43 0.018 +44 0.009 +45 -0.000 +46 -0.008 +47 -0.017 +48 -0.025 +49 -0.033 +50 -0.040 +51 -0.048 +52 -0.055 +53 -0.062 +54 -0.068 +55 -0.075 +56 -0.081 +57 -0.087 +58 -0.093 +59 -0.098 +60 -0.103 +61 -0.109 +62 -0.114 +63 -0.119 +64 -0.123 +65 -0.128 +66 -0.133 +67 -0.137 +68 -0.141 +69 -0.146 +70 -0.150 +71 -0.154 +72 -0.159 +73 -0.163 +74 -0.168 +75 -0.172 +76 -0.177 +77 -0.182 +78 -0.187 +79 -0.193 +80 -0.198 +81 -0.204 +82 -0.211 +83 -0.218 +84 -0.225 +85 -0.232 +86 -0.241 +87 -0.250 +88 -0.259 +89 -0.269 +90 -0.280 +1 0.226 +2 0.223 +3 0.220 +4 0.217 +5 0.213 +6 0.209 +7 0.205 +8 0.200 +9 0.195 +10 0.190 +11 0.185 +12 0.180 +13 0.174 +14 0.168 +15 0.162 +16 0.156 +17 0.150 +18 0.144 +19 0.138 +20 0.132 +21 0.126 +22 0.120 +23 0.113 +24 0.107 +25 0.101 +26 0.095 +27 0.089 +28 0.083 +29 0.077 +30 0.071 +31 0.065 +32 0.060 +33 0.054 +34 0.049 +35 0.043 +36 0.038 +37 0.033 +38 0.029 +39 0.024 +40 0.020 +41 0.015 +42 0.011 +43 0.007 +44 0.004 +45 -0.000 +46 -0.003 +47 -0.006 +48 -0.009 +49 -0.012 +50 -0.015 +51 -0.017 +52 -0.019 +53 -0.021 +54 -0.023 +55 -0.024 +56 -0.025 +57 -0.027 +58 -0.027 +59 -0.028 +60 -0.029 +61 -0.029 +62 -0.029 +63 -0.029 +64 -0.029 +65 -0.028 +66 -0.028 +67 -0.027 +68 -0.026 +69 -0.025 +70 -0.024 +71 -0.023 +72 -0.021 +73 -0.020 +74 -0.018 +75 -0.017 +76 -0.015 +77 -0.013 +78 -0.011 +79 -0.009 +80 -0.007 +81 -0.005 +82 -0.004 +83 -0.002 +84 0.000 +85 0.002 +86 0.004 +87 0.006 +88 0.007 +89 0.009 +90 0.010 +1 0.295 +2 0.300 +3 0.304 +4 0.307 +5 0.309 +6 0.310 +7 0.309 +8 0.308 +9 0.306 +10 0.303 +11 0.300 +12 0.295 +13 0.290 +14 0.285 +15 0.278 +16 0.272 +17 0.264 +18 0.257 +19 0.249 +20 0.240 +21 0.231 +22 0.222 +23 0.213 +24 0.203 +25 0.194 +26 0.184 +27 0.174 +28 0.163 +29 0.153 +30 0.143 +31 0.133 +32 0.123 +33 0.112 +34 0.102 +35 0.092 +36 0.082 +37 0.072 +38 0.063 +39 0.053 +40 0.044 +41 0.035 +42 0.026 +43 0.017 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.031 +50 -0.038 +51 -0.045 +52 -0.051 +53 -0.058 +54 -0.064 +55 -0.070 +56 -0.075 +57 -0.081 +58 -0.086 +59 -0.091 +60 -0.095 +61 -0.100 +62 -0.104 +63 -0.108 +64 -0.112 +65 -0.116 +66 -0.119 +67 -0.123 +68 -0.126 +69 -0.130 +70 -0.133 +71 -0.136 +72 -0.140 +73 -0.143 +74 -0.146 +75 -0.150 +76 -0.153 +77 -0.157 +78 -0.161 +79 -0.165 +80 -0.169 +81 -0.174 +82 -0.178 +83 -0.184 +84 -0.189 +85 -0.195 +86 -0.202 +87 -0.209 +88 -0.216 +89 -0.224 +90 -0.233 +1 -0.115 +2 -0.139 +3 -0.160 +4 -0.178 +5 -0.195 +6 -0.210 +7 -0.223 +8 -0.234 +9 -0.243 +10 -0.251 +11 -0.257 +12 -0.262 +13 -0.265 +14 -0.268 +15 -0.268 +16 -0.268 +17 -0.267 +18 -0.264 +19 -0.261 +20 -0.257 +21 -0.252 +22 -0.246 +23 -0.239 +24 -0.232 +25 -0.224 +26 -0.216 +27 -0.207 +28 -0.197 +29 -0.187 +30 -0.177 +31 -0.166 +32 -0.155 +33 -0.144 +34 -0.133 +35 -0.121 +36 -0.109 +37 -0.098 +38 -0.086 +39 -0.073 +40 -0.061 +41 -0.049 +42 -0.037 +43 -0.024 +44 -0.012 +45 0.000 +46 0.012 +47 0.024 +48 0.036 +49 0.049 +50 0.061 +51 0.072 +52 0.084 +53 0.096 +54 0.108 +55 0.120 +56 0.131 +57 0.143 +58 0.155 +59 0.166 +60 0.178 +61 0.190 +62 0.202 +63 0.213 +64 0.225 +65 0.238 +66 0.250 +67 0.262 +68 0.275 +69 0.288 +70 0.301 +71 0.315 +72 0.328 +73 0.343 +74 0.358 +75 0.373 +76 0.389 +77 0.405 +78 0.422 +79 0.440 +80 0.459 +81 0.478 +82 0.498 +83 0.519 +84 0.542 +85 0.565 +86 0.589 +87 0.615 +88 0.642 +89 0.670 +90 0.700 +1 -0.287 +2 -0.305 +3 -0.321 +4 -0.335 +5 -0.346 +6 -0.355 +7 -0.363 +8 -0.369 +9 -0.373 +10 -0.376 +11 -0.377 +12 -0.376 +13 -0.375 +14 -0.372 +15 -0.368 +16 -0.363 +17 -0.356 +18 -0.349 +19 -0.341 +20 -0.332 +21 -0.323 +22 -0.312 +23 -0.301 +24 -0.290 +25 -0.278 +26 -0.265 +27 -0.252 +28 -0.239 +29 -0.226 +30 -0.212 +31 -0.198 +32 -0.184 +33 -0.170 +34 -0.155 +35 -0.141 +36 -0.126 +37 -0.112 +38 -0.098 +39 -0.083 +40 -0.069 +41 -0.055 +42 -0.041 +43 -0.027 +44 -0.013 +45 0.000 +46 0.013 +47 0.026 +48 0.039 +49 0.052 +50 0.064 +51 0.076 +52 0.088 +53 0.100 +54 0.112 +55 0.123 +56 0.134 +57 0.145 +58 0.156 +59 0.166 +60 0.177 +61 0.187 +62 0.197 +63 0.207 +64 0.218 +65 0.228 +66 0.238 +67 0.248 +68 0.258 +69 0.268 +70 0.279 +71 0.290 +72 0.301 +73 0.312 +74 0.323 +75 0.335 +76 0.348 +77 0.361 +78 0.374 +79 0.388 +80 0.403 +81 0.418 +82 0.435 +83 0.452 +84 0.470 +85 0.489 +86 0.509 +87 0.530 +88 0.553 +89 0.577 +90 0.602 +1 -0.185 +2 -0.210 +3 -0.233 +4 -0.252 +5 -0.270 +6 -0.285 +7 -0.298 +8 -0.310 +9 -0.319 +10 -0.326 +11 -0.332 +12 -0.336 +13 -0.338 +14 -0.339 +15 -0.338 +16 -0.337 +17 -0.334 +18 -0.329 +19 -0.324 +20 -0.318 +21 -0.311 +22 -0.303 +23 -0.294 +24 -0.284 +25 -0.274 +26 -0.263 +27 -0.251 +28 -0.239 +29 -0.227 +30 -0.214 +31 -0.201 +32 -0.187 +33 -0.174 +34 -0.160 +35 -0.145 +36 -0.131 +37 -0.117 +38 -0.102 +39 -0.087 +40 -0.073 +41 -0.058 +42 -0.044 +43 -0.029 +44 -0.014 +45 0.000 +46 0.014 +47 0.029 +48 0.043 +49 0.057 +50 0.071 +51 0.085 +52 0.098 +53 0.112 +54 0.125 +55 0.139 +56 0.152 +57 0.165 +58 0.178 +59 0.192 +60 0.205 +61 0.218 +62 0.231 +63 0.244 +64 0.257 +65 0.271 +66 0.284 +67 0.298 +68 0.312 +69 0.326 +70 0.340 +71 0.355 +72 0.370 +73 0.385 +74 0.401 +75 0.418 +76 0.435 +77 0.453 +78 0.472 +79 0.491 +80 0.511 +81 0.532 +82 0.554 +83 0.577 +84 0.601 +85 0.627 +86 0.654 +87 0.682 +88 0.711 +89 0.742 +90 0.775 +1 -0.374 +2 -0.391 +3 -0.406 +4 -0.419 +5 -0.429 +6 -0.437 +7 -0.443 +8 -0.448 +9 -0.450 +10 -0.451 +11 -0.450 +12 -0.448 +13 -0.444 +14 -0.439 +15 -0.433 +16 -0.425 +17 -0.417 +18 -0.407 +19 -0.397 +20 -0.385 +21 -0.373 +22 -0.361 +23 -0.347 +24 -0.333 +25 -0.319 +26 -0.304 +27 -0.289 +28 -0.273 +29 -0.257 +30 -0.241 +31 -0.225 +32 -0.208 +33 -0.192 +34 -0.175 +35 -0.159 +36 -0.142 +37 -0.126 +38 -0.109 +39 -0.093 +40 -0.077 +41 -0.061 +42 -0.046 +43 -0.030 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.043 +49 0.057 +50 0.070 +51 0.084 +52 0.096 +53 0.109 +54 0.121 +55 0.133 +56 0.145 +57 0.156 +58 0.168 +59 0.179 +60 0.189 +61 0.200 +62 0.210 +63 0.220 +64 0.231 +65 0.241 +66 0.251 +67 0.261 +68 0.271 +69 0.281 +70 0.291 +71 0.301 +72 0.312 +73 0.323 +74 0.334 +75 0.345 +76 0.357 +77 0.370 +78 0.383 +79 0.396 +80 0.411 +81 0.426 +82 0.442 +83 0.458 +84 0.476 +85 0.495 +86 0.515 +87 0.536 +88 0.558 +89 0.582 +90 0.607 +1 -0.342 +2 -0.365 +3 -0.385 +4 -0.402 +5 -0.417 +6 -0.429 +7 -0.439 +8 -0.447 +9 -0.453 +10 -0.456 +11 -0.458 +12 -0.458 +13 -0.457 +14 -0.453 +15 -0.449 +16 -0.443 +17 -0.435 +18 -0.427 +19 -0.417 +20 -0.407 +21 -0.395 +22 -0.383 +23 -0.370 +24 -0.356 +25 -0.341 +26 -0.326 +27 -0.310 +28 -0.294 +29 -0.278 +30 -0.261 +31 -0.244 +32 -0.227 +33 -0.209 +34 -0.192 +35 -0.174 +36 -0.156 +37 -0.138 +38 -0.121 +39 -0.103 +40 -0.085 +41 -0.068 +42 -0.051 +43 -0.034 +44 -0.017 +45 0.000 +46 0.016 +47 0.033 +48 0.049 +49 0.064 +50 0.080 +51 0.095 +52 0.110 +53 0.125 +54 0.139 +55 0.153 +56 0.167 +57 0.181 +58 0.195 +59 0.208 +60 0.221 +61 0.234 +62 0.247 +63 0.260 +64 0.273 +65 0.286 +66 0.299 +67 0.311 +68 0.324 +69 0.338 +70 0.351 +71 0.365 +72 0.379 +73 0.393 +74 0.408 +75 0.423 +76 0.438 +77 0.455 +78 0.472 +79 0.490 +80 0.508 +81 0.528 +82 0.548 +83 0.570 +84 0.592 +85 0.616 +86 0.642 +87 0.668 +88 0.697 +89 0.726 +90 0.758 +1 -0.595 +2 -0.612 +3 -0.626 +4 -0.637 +5 -0.646 +6 -0.652 +7 -0.656 +8 -0.657 +9 -0.656 +10 -0.653 +11 -0.648 +12 -0.641 +13 -0.632 +14 -0.622 +15 -0.611 +16 -0.598 +17 -0.583 +18 -0.568 +19 -0.552 +20 -0.534 +21 -0.516 +22 -0.497 +23 -0.477 +24 -0.456 +25 -0.435 +26 -0.414 +27 -0.392 +28 -0.370 +29 -0.348 +30 -0.325 +31 -0.302 +32 -0.280 +33 -0.257 +34 -0.234 +35 -0.211 +36 -0.189 +37 -0.167 +38 -0.145 +39 -0.123 +40 -0.102 +41 -0.080 +42 -0.060 +43 -0.039 +44 -0.019 +45 0.000 +46 0.019 +47 0.038 +48 0.056 +49 0.073 +50 0.090 +51 0.107 +52 0.123 +53 0.138 +54 0.154 +55 0.168 +56 0.182 +57 0.196 +58 0.209 +59 0.222 +60 0.235 +61 0.247 +62 0.259 +63 0.270 +64 0.281 +65 0.292 +66 0.303 +67 0.314 +68 0.325 +69 0.335 +70 0.346 +71 0.357 +72 0.368 +73 0.379 +74 0.390 +75 0.402 +76 0.414 +77 0.427 +78 0.440 +79 0.454 +80 0.469 +81 0.484 +82 0.501 +83 0.518 +84 0.537 +85 0.557 +86 0.578 +87 0.601 +88 0.625 +89 0.650 +90 0.678 +1 -0.727 +2 -0.754 +3 -0.778 +4 -0.797 +5 -0.813 +6 -0.825 +7 -0.833 +8 -0.839 +9 -0.841 +10 -0.840 +11 -0.836 +12 -0.830 +13 -0.821 +14 -0.810 +15 -0.797 +16 -0.782 +17 -0.765 +18 -0.747 +19 -0.726 +20 -0.705 +21 -0.682 +22 -0.658 +23 -0.633 +24 -0.607 +25 -0.580 +26 -0.552 +27 -0.524 +28 -0.495 +29 -0.466 +30 -0.436 +31 -0.406 +32 -0.376 +33 -0.346 +34 -0.316 +35 -0.286 +36 -0.256 +37 -0.226 +38 -0.196 +39 -0.167 +40 -0.138 +41 -0.110 +42 -0.082 +43 -0.054 +44 -0.027 +45 0.000 +46 0.026 +47 0.052 +48 0.077 +49 0.101 +50 0.125 +51 0.148 +52 0.171 +53 0.193 +54 0.214 +55 0.235 +56 0.255 +57 0.275 +58 0.294 +59 0.313 +60 0.332 +61 0.349 +62 0.367 +63 0.384 +64 0.401 +65 0.418 +66 0.435 +67 0.451 +68 0.468 +69 0.484 +70 0.501 +71 0.518 +72 0.535 +73 0.553 +74 0.571 +75 0.589 +76 0.609 +77 0.629 +78 0.649 +79 0.671 +80 0.694 +81 0.719 +82 0.744 +83 0.771 +84 0.800 +85 0.830 +86 0.863 +87 0.897 +88 0.934 +89 0.973 +90 1.014 +1 -1.049 +2 -1.073 +3 -1.091 +4 -1.106 +5 -1.116 +6 -1.122 +7 -1.124 +8 -1.123 +9 -1.118 +10 -1.110 +11 -1.098 +12 -1.084 +13 -1.068 +14 -1.048 +15 -1.027 +16 -1.003 +17 -0.978 +18 -0.950 +19 -0.921 +20 -0.891 +21 -0.859 +22 -0.826 +23 -0.792 +24 -0.757 +25 -0.721 +26 -0.685 +27 -0.648 +28 -0.611 +29 -0.573 +30 -0.535 +31 -0.497 +32 -0.459 +33 -0.421 +34 -0.383 +35 -0.346 +36 -0.309 +37 -0.272 +38 -0.236 +39 -0.200 +40 -0.165 +41 -0.131 +42 -0.097 +43 -0.064 +44 -0.031 +45 0.000 +46 0.031 +47 0.060 +48 0.089 +49 0.117 +50 0.145 +51 0.171 +52 0.196 +53 0.221 +54 0.244 +55 0.267 +56 0.289 +57 0.310 +58 0.330 +59 0.350 +60 0.368 +61 0.386 +62 0.404 +63 0.421 +64 0.437 +65 0.453 +66 0.469 +67 0.484 +68 0.499 +69 0.514 +70 0.529 +71 0.544 +72 0.559 +73 0.574 +74 0.590 +75 0.606 +76 0.623 +77 0.640 +78 0.658 +79 0.678 +80 0.698 +81 0.719 +82 0.742 +83 0.767 +84 0.793 +85 0.821 +86 0.851 +87 0.883 +88 0.918 +89 0.955 +90 0.995 +1 -1.236 +2 -1.271 +3 -1.298 +4 -1.320 +5 -1.337 +6 -1.348 +7 -1.355 +8 -1.356 +9 -1.353 +10 -1.346 +11 -1.335 +12 -1.321 +13 -1.302 +14 -1.281 +15 -1.257 +16 -1.230 +17 -1.200 +18 -1.168 +19 -1.134 +20 -1.097 +21 -1.059 +22 -1.020 +23 -0.979 +24 -0.937 +25 -0.893 +26 -0.849 +27 -0.804 +28 -0.759 +29 -0.712 +30 -0.666 +31 -0.619 +32 -0.573 +33 -0.526 +34 -0.479 +35 -0.433 +36 -0.387 +37 -0.341 +38 -0.296 +39 -0.251 +40 -0.208 +41 -0.164 +42 -0.122 +43 -0.080 +44 -0.040 +45 0.000 +46 0.039 +47 0.077 +48 0.113 +49 0.149 +50 0.184 +51 0.218 +52 0.250 +53 0.282 +54 0.312 +55 0.342 +56 0.370 +57 0.398 +58 0.425 +59 0.451 +60 0.476 +61 0.500 +62 0.523 +63 0.546 +64 0.569 +65 0.590 +66 0.612 +67 0.633 +68 0.654 +69 0.675 +70 0.696 +71 0.717 +72 0.738 +73 0.760 +74 0.782 +75 0.805 +76 0.829 +77 0.854 +78 0.879 +79 0.907 +80 0.935 +81 0.965 +82 0.997 +83 1.031 +84 1.068 +85 1.106 +86 1.148 +87 1.192 +88 1.239 +89 1.290 +90 1.344 +1 -1.663 +2 -1.696 +3 -1.723 +4 -1.742 +5 -1.755 +6 -1.762 +7 -1.763 +8 -1.758 +9 -1.748 +10 -1.734 +11 -1.714 +12 -1.691 +13 -1.663 +14 -1.632 +15 -1.597 +16 -1.559 +17 -1.518 +18 -1.475 +19 -1.429 +20 -1.381 +21 -1.331 +22 -1.279 +23 -1.225 +24 -1.171 +25 -1.115 +26 -1.058 +27 -1.001 +28 -0.942 +29 -0.884 +30 -0.825 +31 -0.766 +32 -0.707 +33 -0.649 +34 -0.590 +35 -0.532 +36 -0.475 +37 -0.418 +38 -0.362 +39 -0.307 +40 -0.253 +41 -0.200 +42 -0.148 +43 -0.098 +44 -0.048 +45 0.000 +46 0.047 +47 0.092 +48 0.137 +49 0.179 +50 0.221 +51 0.260 +52 0.299 +53 0.336 +54 0.371 +55 0.406 +56 0.438 +57 0.470 +58 0.500 +59 0.529 +60 0.557 +61 0.584 +62 0.610 +63 0.635 +64 0.659 +65 0.682 +66 0.705 +67 0.727 +68 0.748 +69 0.770 +70 0.791 +71 0.812 +72 0.834 +73 0.855 +74 0.877 +75 0.900 +76 0.924 +77 0.948 +78 0.974 +79 1.001 +80 1.030 +81 1.061 +82 1.093 +83 1.128 +84 1.166 +85 1.206 +86 1.249 +87 1.295 +88 1.345 +89 1.399 +90 1.457 +1 -1.723 +2 -1.761 +3 -1.792 +4 -1.815 +5 -1.831 +6 -1.840 +7 -1.843 +8 -1.841 +9 -1.832 +10 -1.818 +11 -1.800 +12 -1.776 +13 -1.749 +14 -1.717 +15 -1.682 +16 -1.643 +17 -1.601 +18 -1.556 +19 -1.508 +20 -1.458 +21 -1.406 +22 -1.352 +23 -1.296 +24 -1.239 +25 -1.180 +26 -1.120 +27 -1.060 +28 -0.999 +29 -0.937 +30 -0.875 +31 -0.813 +32 -0.751 +33 -0.689 +34 -0.627 +35 -0.566 +36 -0.505 +37 -0.445 +38 -0.386 +39 -0.327 +40 -0.270 +41 -0.213 +42 -0.158 +43 -0.104 +44 -0.051 +45 0.000 +46 0.050 +47 0.099 +48 0.146 +49 0.192 +50 0.236 +51 0.279 +52 0.320 +53 0.360 +54 0.398 +55 0.435 +56 0.471 +57 0.505 +58 0.538 +59 0.570 +60 0.600 +61 0.629 +62 0.658 +63 0.685 +64 0.712 +65 0.737 +66 0.762 +67 0.787 +68 0.811 +69 0.835 +70 0.859 +71 0.883 +72 0.907 +73 0.931 +74 0.956 +75 0.982 +76 1.009 +77 1.036 +78 1.065 +79 1.096 +80 1.128 +81 1.162 +82 1.199 +83 1.238 +84 1.280 +85 1.324 +86 1.372 +87 1.424 +88 1.479 +89 1.538 +90 1.602 +1 -2.170 +2 -2.210 +3 -2.241 +4 -2.264 +5 -2.278 +6 -2.285 +7 -2.284 +8 -2.276 +9 -2.261 +10 -2.241 +11 -2.214 +12 -2.183 +13 -2.146 +14 -2.104 +15 -2.059 +16 -2.009 +17 -1.955 +18 -1.898 +19 -1.838 +20 -1.776 +21 -1.711 +22 -1.643 +23 -1.574 +24 -1.503 +25 -1.431 +26 -1.358 +27 -1.283 +28 -1.208 +29 -1.133 +30 -1.057 +31 -0.981 +32 -0.905 +33 -0.830 +34 -0.755 +35 -0.681 +36 -0.607 +37 -0.535 +38 -0.463 +39 -0.393 +40 -0.323 +41 -0.256 +42 -0.189 +43 -0.125 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.174 +49 0.228 +50 0.280 +51 0.331 +52 0.379 +53 0.426 +54 0.471 +55 0.514 +56 0.555 +57 0.595 +58 0.633 +59 0.669 +60 0.704 +61 0.737 +62 0.769 +63 0.800 +64 0.830 +65 0.858 +66 0.886 +67 0.913 +68 0.939 +69 0.965 +70 0.991 +71 1.017 +72 1.043 +73 1.069 +74 1.095 +75 1.123 +76 1.151 +77 1.181 +78 1.212 +79 1.245 +80 1.279 +81 1.316 +82 1.356 +83 1.398 +84 1.444 +85 1.493 +86 1.546 +87 1.602 +88 1.664 +89 1.730 +90 1.801 +1 -2.136 +2 -2.180 +3 -2.215 +4 -2.241 +5 -2.259 +6 -2.269 +7 -2.271 +8 -2.266 +9 -2.254 +10 -2.236 +11 -2.211 +12 -2.182 +13 -2.147 +14 -2.107 +15 -2.062 +16 -2.014 +17 -1.962 +18 -1.906 +19 -1.847 +20 -1.785 +21 -1.720 +22 -1.654 +23 -1.585 +24 -1.514 +25 -1.442 +26 -1.369 +27 -1.295 +28 -1.220 +29 -1.144 +30 -1.068 +31 -0.992 +32 -0.916 +33 -0.840 +34 -0.765 +35 -0.690 +36 -0.615 +37 -0.542 +38 -0.470 +39 -0.398 +40 -0.328 +41 -0.260 +42 -0.193 +43 -0.127 +44 -0.063 +45 0.000 +46 0.061 +47 0.120 +48 0.177 +49 0.233 +50 0.286 +51 0.338 +52 0.388 +53 0.436 +54 0.483 +55 0.527 +56 0.570 +57 0.611 +58 0.650 +59 0.688 +60 0.725 +61 0.760 +62 0.794 +63 0.826 +64 0.857 +65 0.888 +66 0.918 +67 0.947 +68 0.975 +69 1.003 +70 1.031 +71 1.059 +72 1.087 +73 1.115 +74 1.145 +75 1.174 +76 1.205 +77 1.238 +78 1.272 +79 1.307 +80 1.345 +81 1.385 +82 1.428 +83 1.473 +84 1.522 +85 1.575 +86 1.631 +87 1.691 +88 1.757 +89 1.827 +90 1.902 +1 -1.922 +2 -1.953 +3 -1.977 +4 -1.993 +5 -2.002 +6 -2.005 +7 -2.001 +8 -1.992 +9 -1.977 +10 -1.956 +11 -1.931 +12 -1.902 +13 -1.868 +14 -1.830 +15 -1.789 +16 -1.744 +17 -1.696 +18 -1.646 +19 -1.593 +20 -1.538 +21 -1.480 +22 -1.421 +23 -1.360 +24 -1.298 +25 -1.235 +26 -1.171 +27 -1.107 +28 -1.041 +29 -0.976 +30 -0.910 +31 -0.844 +32 -0.779 +33 -0.714 +34 -0.649 +35 -0.585 +36 -0.521 +37 -0.459 +38 -0.397 +39 -0.336 +40 -0.277 +41 -0.219 +42 -0.162 +43 -0.106 +44 -0.052 +45 0.000 +46 0.051 +47 0.100 +48 0.148 +49 0.194 +50 0.238 +51 0.281 +52 0.322 +53 0.362 +54 0.399 +55 0.435 +56 0.470 +57 0.503 +58 0.534 +59 0.564 +60 0.593 +61 0.620 +62 0.647 +63 0.672 +64 0.695 +65 0.719 +66 0.741 +67 0.762 +68 0.783 +69 0.804 +70 0.824 +71 0.844 +72 0.864 +73 0.885 +74 0.905 +75 0.927 +76 0.949 +77 0.972 +78 0.996 +79 1.021 +80 1.049 +81 1.078 +82 1.109 +83 1.142 +84 1.178 +85 1.217 +86 1.259 +87 1.304 +88 1.353 +89 1.407 +90 1.464 +1 -1.155 +2 -1.170 +3 -1.180 +4 -1.186 +5 -1.188 +6 -1.187 +7 -1.182 +8 -1.174 +9 -1.162 +10 -1.149 +11 -1.132 +12 -1.113 +13 -1.091 +14 -1.068 +15 -1.042 +16 -1.015 +17 -0.986 +18 -0.955 +19 -0.924 +20 -0.891 +21 -0.856 +22 -0.821 +23 -0.785 +24 -0.749 +25 -0.712 +26 -0.674 +27 -0.636 +28 -0.598 +29 -0.560 +30 -0.522 +31 -0.484 +32 -0.446 +33 -0.408 +34 -0.371 +35 -0.334 +36 -0.297 +37 -0.261 +38 -0.226 +39 -0.191 +40 -0.157 +41 -0.124 +42 -0.092 +43 -0.060 +44 -0.030 +45 0.000 +46 0.029 +47 0.057 +48 0.083 +49 0.109 +50 0.134 +51 0.158 +52 0.181 +53 0.202 +54 0.223 +55 0.243 +56 0.262 +57 0.280 +58 0.296 +59 0.313 +60 0.328 +61 0.342 +62 0.356 +63 0.369 +64 0.381 +65 0.393 +66 0.404 +67 0.415 +68 0.425 +69 0.435 +70 0.445 +71 0.455 +72 0.464 +73 0.474 +74 0.484 +75 0.494 +76 0.504 +77 0.515 +78 0.526 +79 0.538 +80 0.551 +81 0.565 +82 0.580 +83 0.597 +84 0.614 +85 0.633 +86 0.654 +87 0.677 +88 0.702 +89 0.729 +90 0.758 +1 -0.767 +2 -0.760 +3 -0.753 +4 -0.744 +5 -0.733 +6 -0.721 +7 -0.708 +8 -0.694 +9 -0.679 +10 -0.663 +11 -0.646 +12 -0.629 +13 -0.610 +14 -0.592 +15 -0.572 +16 -0.552 +17 -0.532 +18 -0.511 +19 -0.490 +20 -0.469 +21 -0.447 +22 -0.426 +23 -0.404 +24 -0.382 +25 -0.361 +26 -0.339 +27 -0.318 +28 -0.297 +29 -0.276 +30 -0.255 +31 -0.235 +32 -0.215 +33 -0.195 +34 -0.176 +35 -0.157 +36 -0.139 +37 -0.121 +38 -0.104 +39 -0.087 +40 -0.071 +41 -0.056 +42 -0.041 +43 -0.026 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.035 +49 0.045 +50 0.054 +51 0.063 +52 0.071 +53 0.078 +54 0.085 +55 0.091 +56 0.096 +57 0.100 +58 0.104 +59 0.108 +60 0.110 +61 0.112 +62 0.113 +63 0.114 +64 0.115 +65 0.114 +66 0.113 +67 0.112 +68 0.111 +69 0.108 +70 0.106 +71 0.103 +72 0.100 +73 0.097 +74 0.093 +75 0.089 +76 0.086 +77 0.082 +78 0.078 +79 0.074 +80 0.070 +81 0.066 +82 0.063 +83 0.059 +84 0.056 +85 0.054 +86 0.052 +87 0.050 +88 0.049 +89 0.049 +90 0.049 +1 -0.193 +2 -0.183 +3 -0.174 +4 -0.165 +5 -0.156 +6 -0.148 +7 -0.139 +8 -0.131 +9 -0.124 +10 -0.116 +11 -0.109 +12 -0.102 +13 -0.096 +14 -0.089 +15 -0.083 +16 -0.077 +17 -0.071 +18 -0.066 +19 -0.061 +20 -0.056 +21 -0.051 +22 -0.046 +23 -0.042 +24 -0.038 +25 -0.034 +26 -0.030 +27 -0.027 +28 -0.024 +29 -0.021 +30 -0.018 +31 -0.015 +32 -0.013 +33 -0.011 +34 -0.009 +35 -0.007 +36 -0.005 +37 -0.004 +38 -0.003 +39 -0.002 +40 -0.001 +41 -0.000 +42 -0.000 +43 0.000 +44 0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.002 +49 -0.003 +50 -0.004 +51 -0.005 +52 -0.007 +53 -0.008 +54 -0.010 +55 -0.012 +56 -0.014 +57 -0.017 +58 -0.020 +59 -0.022 +60 -0.026 +61 -0.029 +62 -0.032 +63 -0.036 +64 -0.040 +65 -0.044 +66 -0.048 +67 -0.052 +68 -0.057 +69 -0.062 +70 -0.067 +71 -0.072 +72 -0.078 +73 -0.083 +74 -0.089 +75 -0.095 +76 -0.102 +77 -0.108 +78 -0.115 +79 -0.122 +80 -0.129 +81 -0.137 +82 -0.145 +83 -0.153 +84 -0.161 +85 -0.169 +86 -0.178 +87 -0.187 +88 -0.196 +89 -0.205 +90 -0.215 +1 0.107 +2 0.129 +3 0.149 +4 0.167 +5 0.183 +6 0.197 +7 0.210 +8 0.220 +9 0.230 +10 0.237 +11 0.243 +12 0.248 +13 0.251 +14 0.254 +15 0.255 +16 0.255 +17 0.253 +18 0.251 +19 0.248 +20 0.244 +21 0.239 +22 0.234 +23 0.228 +24 0.221 +25 0.214 +26 0.206 +27 0.197 +28 0.188 +29 0.179 +30 0.169 +31 0.159 +32 0.149 +33 0.138 +34 0.127 +35 0.116 +36 0.105 +37 0.093 +38 0.082 +39 0.070 +40 0.059 +41 0.047 +42 0.035 +43 0.023 +44 0.012 +45 -0.000 +46 -0.012 +47 -0.023 +48 -0.035 +49 -0.047 +50 -0.058 +51 -0.070 +52 -0.081 +53 -0.093 +54 -0.104 +55 -0.115 +56 -0.127 +57 -0.138 +58 -0.149 +59 -0.160 +60 -0.172 +61 -0.183 +62 -0.194 +63 -0.206 +64 -0.217 +65 -0.229 +66 -0.241 +67 -0.253 +68 -0.265 +69 -0.277 +70 -0.290 +71 -0.303 +72 -0.316 +73 -0.330 +74 -0.344 +75 -0.359 +76 -0.374 +77 -0.390 +78 -0.406 +79 -0.423 +80 -0.441 +81 -0.459 +82 -0.478 +83 -0.498 +84 -0.519 +85 -0.541 +86 -0.565 +87 -0.589 +88 -0.614 +89 -0.641 +90 -0.669 +1 0.533 +2 0.554 +3 0.571 +4 0.586 +5 0.598 +6 0.607 +7 0.614 +8 0.618 +9 0.620 +10 0.619 +11 0.617 +12 0.612 +13 0.606 +14 0.598 +15 0.589 +16 0.578 +17 0.565 +18 0.552 +19 0.537 +20 0.521 +21 0.504 +22 0.487 +23 0.468 +24 0.449 +25 0.429 +26 0.409 +27 0.388 +28 0.366 +29 0.345 +30 0.323 +31 0.301 +32 0.279 +33 0.256 +34 0.234 +35 0.212 +36 0.190 +37 0.168 +38 0.146 +39 0.124 +40 0.103 +41 0.081 +42 0.061 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.057 +49 -0.075 +50 -0.093 +51 -0.110 +52 -0.127 +53 -0.143 +54 -0.159 +55 -0.175 +56 -0.190 +57 -0.205 +58 -0.219 +59 -0.234 +60 -0.247 +61 -0.261 +62 -0.274 +63 -0.287 +64 -0.300 +65 -0.312 +66 -0.325 +67 -0.337 +68 -0.350 +69 -0.362 +70 -0.375 +71 -0.388 +72 -0.401 +73 -0.414 +74 -0.428 +75 -0.442 +76 -0.456 +77 -0.471 +78 -0.487 +79 -0.504 +80 -0.521 +81 -0.540 +82 -0.559 +83 -0.579 +84 -0.601 +85 -0.624 +86 -0.648 +87 -0.674 +88 -0.702 +89 -0.731 +90 -0.762 +1 0.608 +2 0.633 +3 0.654 +4 0.671 +5 0.685 +6 0.696 +7 0.704 +8 0.709 +9 0.711 +10 0.711 +11 0.708 +12 0.703 +13 0.696 +14 0.688 +15 0.677 +16 0.664 +17 0.650 +18 0.635 +19 0.618 +20 0.600 +21 0.580 +22 0.560 +23 0.539 +24 0.517 +25 0.494 +26 0.470 +27 0.446 +28 0.422 +29 0.397 +30 0.372 +31 0.347 +32 0.321 +33 0.295 +34 0.270 +35 0.244 +36 0.219 +37 0.193 +38 0.168 +39 0.143 +40 0.118 +41 0.094 +42 0.070 +43 0.046 +44 0.023 +45 -0.000 +46 -0.022 +47 -0.044 +48 -0.066 +49 -0.087 +50 -0.107 +51 -0.127 +52 -0.147 +53 -0.165 +54 -0.184 +55 -0.202 +56 -0.219 +57 -0.237 +58 -0.253 +59 -0.269 +60 -0.285 +61 -0.301 +62 -0.316 +63 -0.331 +64 -0.346 +65 -0.361 +66 -0.375 +67 -0.389 +68 -0.404 +69 -0.418 +70 -0.433 +71 -0.448 +72 -0.463 +73 -0.478 +74 -0.494 +75 -0.510 +76 -0.527 +77 -0.545 +78 -0.563 +79 -0.582 +80 -0.603 +81 -0.624 +82 -0.646 +83 -0.670 +84 -0.695 +85 -0.722 +86 -0.750 +87 -0.780 +88 -0.812 +89 -0.846 +90 -0.882 +1 0.903 +2 0.922 +3 0.938 +4 0.949 +5 0.957 +6 0.961 +7 0.963 +8 0.961 +9 0.956 +10 0.948 +11 0.938 +12 0.926 +13 0.911 +14 0.894 +15 0.876 +16 0.855 +17 0.833 +18 0.809 +19 0.784 +20 0.758 +21 0.731 +22 0.703 +23 0.673 +24 0.643 +25 0.613 +26 0.582 +27 0.550 +28 0.518 +29 0.486 +30 0.454 +31 0.422 +32 0.389 +33 0.357 +34 0.325 +35 0.293 +36 0.262 +37 0.231 +38 0.200 +39 0.170 +40 0.140 +41 0.111 +42 0.082 +43 0.054 +44 0.027 +45 -0.000 +46 -0.026 +47 -0.051 +48 -0.075 +49 -0.099 +50 -0.122 +51 -0.144 +52 -0.165 +53 -0.186 +54 -0.206 +55 -0.225 +56 -0.243 +57 -0.261 +58 -0.277 +59 -0.294 +60 -0.309 +61 -0.324 +62 -0.339 +63 -0.353 +64 -0.367 +65 -0.380 +66 -0.393 +67 -0.405 +68 -0.418 +69 -0.430 +70 -0.442 +71 -0.454 +72 -0.467 +73 -0.479 +74 -0.492 +75 -0.505 +76 -0.519 +77 -0.533 +78 -0.548 +79 -0.564 +80 -0.580 +81 -0.598 +82 -0.617 +83 -0.637 +84 -0.659 +85 -0.682 +86 -0.707 +87 -0.733 +88 -0.762 +89 -0.793 +90 -0.826 +1 0.803 +2 0.823 +3 0.839 +4 0.852 +5 0.861 +6 0.867 +7 0.869 +8 0.869 +9 0.866 +10 0.861 +11 0.853 +12 0.842 +13 0.830 +14 0.816 +15 0.799 +16 0.781 +17 0.762 +18 0.741 +19 0.719 +20 0.695 +21 0.671 +22 0.645 +23 0.619 +24 0.592 +25 0.564 +26 0.536 +27 0.507 +28 0.478 +29 0.449 +30 0.419 +31 0.389 +32 0.360 +33 0.330 +34 0.301 +35 0.271 +36 0.242 +37 0.214 +38 0.185 +39 0.157 +40 0.130 +41 0.103 +42 0.076 +43 0.050 +44 0.025 +45 -0.000 +46 -0.024 +47 -0.048 +48 -0.070 +49 -0.093 +50 -0.114 +51 -0.135 +52 -0.155 +53 -0.174 +54 -0.193 +55 -0.211 +56 -0.228 +57 -0.245 +58 -0.261 +59 -0.277 +60 -0.292 +61 -0.306 +62 -0.320 +63 -0.334 +64 -0.347 +65 -0.360 +66 -0.373 +67 -0.385 +68 -0.398 +69 -0.410 +70 -0.422 +71 -0.434 +72 -0.447 +73 -0.459 +74 -0.472 +75 -0.486 +76 -0.500 +77 -0.514 +78 -0.529 +79 -0.545 +80 -0.562 +81 -0.580 +82 -0.599 +83 -0.619 +84 -0.641 +85 -0.664 +86 -0.689 +87 -0.715 +88 -0.744 +89 -0.774 +90 -0.807 +1 1.073 +2 1.089 +3 1.101 +4 1.109 +5 1.113 +6 1.114 +7 1.111 +8 1.105 +9 1.096 +10 1.084 +11 1.070 +12 1.053 +13 1.033 +14 1.012 +15 0.989 +16 0.964 +17 0.937 +18 0.909 +19 0.879 +20 0.848 +21 0.816 +22 0.783 +23 0.749 +24 0.715 +25 0.680 +26 0.645 +27 0.609 +28 0.573 +29 0.536 +30 0.500 +31 0.464 +32 0.428 +33 0.392 +34 0.356 +35 0.321 +36 0.286 +37 0.251 +38 0.217 +39 0.184 +40 0.152 +41 0.120 +42 0.089 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.081 +49 -0.106 +50 -0.130 +51 -0.153 +52 -0.175 +53 -0.197 +54 -0.217 +55 -0.237 +56 -0.255 +57 -0.273 +58 -0.290 +59 -0.306 +60 -0.321 +61 -0.336 +62 -0.350 +63 -0.363 +64 -0.376 +65 -0.388 +66 -0.400 +67 -0.411 +68 -0.422 +69 -0.433 +70 -0.444 +71 -0.455 +72 -0.465 +73 -0.476 +74 -0.487 +75 -0.498 +76 -0.510 +77 -0.522 +78 -0.535 +79 -0.549 +80 -0.563 +81 -0.579 +82 -0.596 +83 -0.614 +84 -0.633 +85 -0.654 +86 -0.677 +87 -0.702 +88 -0.729 +89 -0.758 +90 -0.789 +1 0.782 +2 0.794 +3 0.803 +4 0.810 +5 0.813 +6 0.814 +7 0.812 +8 0.808 +9 0.802 +10 0.793 +11 0.783 +12 0.771 +13 0.757 +14 0.741 +15 0.724 +16 0.706 +17 0.687 +18 0.666 +19 0.644 +20 0.622 +21 0.598 +22 0.574 +23 0.550 +24 0.525 +25 0.499 +26 0.473 +27 0.447 +28 0.420 +29 0.394 +30 0.367 +31 0.340 +32 0.314 +33 0.287 +34 0.261 +35 0.235 +36 0.210 +37 0.185 +38 0.160 +39 0.135 +40 0.111 +41 0.088 +42 0.065 +43 0.043 +44 0.021 +45 -0.000 +46 -0.020 +47 -0.040 +48 -0.059 +49 -0.078 +50 -0.095 +51 -0.113 +52 -0.129 +53 -0.145 +54 -0.160 +55 -0.174 +56 -0.188 +57 -0.201 +58 -0.213 +59 -0.225 +60 -0.237 +61 -0.247 +62 -0.258 +63 -0.268 +64 -0.277 +65 -0.286 +66 -0.295 +67 -0.304 +68 -0.312 +69 -0.320 +70 -0.328 +71 -0.336 +72 -0.344 +73 -0.352 +74 -0.360 +75 -0.369 +76 -0.378 +77 -0.387 +78 -0.397 +79 -0.407 +80 -0.419 +81 -0.430 +82 -0.443 +83 -0.457 +84 -0.472 +85 -0.488 +86 -0.505 +87 -0.524 +88 -0.544 +89 -0.566 +90 -0.590 +1 0.940 +2 0.948 +3 0.952 +4 0.953 +5 0.952 +6 0.948 +7 0.941 +8 0.932 +9 0.921 +10 0.908 +11 0.893 +12 0.876 +13 0.857 +14 0.837 +15 0.816 +16 0.793 +17 0.769 +18 0.744 +19 0.718 +20 0.691 +21 0.663 +22 0.635 +23 0.607 +24 0.578 +25 0.548 +26 0.518 +27 0.489 +28 0.459 +29 0.429 +30 0.399 +31 0.369 +32 0.340 +33 0.311 +34 0.282 +35 0.253 +36 0.225 +37 0.198 +38 0.171 +39 0.144 +40 0.118 +41 0.093 +42 0.069 +43 0.045 +44 0.022 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.062 +49 -0.081 +50 -0.099 +51 -0.116 +52 -0.132 +53 -0.148 +54 -0.163 +55 -0.177 +56 -0.190 +57 -0.202 +58 -0.214 +59 -0.225 +60 -0.235 +61 -0.245 +62 -0.253 +63 -0.262 +64 -0.269 +65 -0.277 +66 -0.283 +67 -0.290 +68 -0.296 +69 -0.302 +70 -0.307 +71 -0.312 +72 -0.318 +73 -0.323 +74 -0.328 +75 -0.334 +76 -0.339 +77 -0.345 +78 -0.352 +79 -0.358 +80 -0.366 +81 -0.374 +82 -0.383 +83 -0.393 +84 -0.404 +85 -0.416 +86 -0.429 +87 -0.444 +88 -0.460 +89 -0.477 +90 -0.497 +1 0.557 +2 0.558 +3 0.558 +4 0.556 +5 0.553 +6 0.548 +7 0.543 +8 0.536 +9 0.527 +10 0.518 +11 0.508 +12 0.497 +13 0.485 +14 0.473 +15 0.459 +16 0.445 +17 0.431 +18 0.416 +19 0.401 +20 0.385 +21 0.369 +22 0.352 +23 0.336 +24 0.319 +25 0.302 +26 0.285 +27 0.269 +28 0.252 +29 0.235 +30 0.218 +31 0.201 +32 0.185 +33 0.169 +34 0.153 +35 0.137 +36 0.122 +37 0.106 +38 0.092 +39 0.077 +40 0.063 +41 0.050 +42 0.037 +43 0.024 +44 0.012 +45 -0.000 +46 -0.011 +47 -0.022 +48 -0.032 +49 -0.042 +50 -0.051 +51 -0.060 +52 -0.069 +53 -0.076 +54 -0.084 +55 -0.090 +56 -0.097 +57 -0.103 +58 -0.108 +59 -0.113 +60 -0.117 +61 -0.122 +62 -0.125 +63 -0.129 +64 -0.132 +65 -0.134 +66 -0.137 +67 -0.139 +68 -0.141 +69 -0.142 +70 -0.144 +71 -0.145 +72 -0.147 +73 -0.148 +74 -0.149 +75 -0.150 +76 -0.152 +77 -0.153 +78 -0.155 +79 -0.157 +80 -0.159 +81 -0.161 +82 -0.164 +83 -0.167 +84 -0.171 +85 -0.175 +86 -0.180 +87 -0.186 +88 -0.193 +89 -0.200 +90 -0.208 +1 0.684 +2 0.682 +3 0.679 +4 0.674 +5 0.667 +6 0.659 +7 0.650 +8 0.639 +9 0.627 +10 0.614 +11 0.601 +12 0.586 +13 0.570 +14 0.554 +15 0.537 +16 0.520 +17 0.502 +18 0.483 +19 0.464 +20 0.445 +21 0.426 +22 0.406 +23 0.386 +24 0.366 +25 0.346 +26 0.326 +27 0.306 +28 0.286 +29 0.267 +30 0.247 +31 0.228 +32 0.209 +33 0.190 +34 0.172 +35 0.154 +36 0.136 +37 0.119 +38 0.102 +39 0.086 +40 0.070 +41 0.055 +42 0.040 +43 0.026 +44 0.013 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.035 +49 -0.045 +50 -0.055 +51 -0.064 +52 -0.073 +53 -0.081 +54 -0.088 +55 -0.095 +56 -0.101 +57 -0.106 +58 -0.111 +59 -0.116 +60 -0.120 +61 -0.123 +62 -0.126 +63 -0.128 +64 -0.130 +65 -0.131 +66 -0.132 +67 -0.133 +68 -0.133 +69 -0.133 +70 -0.133 +71 -0.133 +72 -0.132 +73 -0.131 +74 -0.130 +75 -0.129 +76 -0.129 +77 -0.128 +78 -0.127 +79 -0.127 +80 -0.126 +81 -0.126 +82 -0.127 +83 -0.127 +84 -0.129 +85 -0.130 +86 -0.133 +87 -0.136 +88 -0.140 +89 -0.144 +90 -0.150 +1 0.236 +2 0.229 +3 0.221 +4 0.214 +5 0.206 +6 0.198 +7 0.191 +8 0.184 +9 0.176 +10 0.169 +11 0.161 +12 0.154 +13 0.147 +14 0.140 +15 0.133 +16 0.126 +17 0.119 +18 0.113 +19 0.106 +20 0.100 +21 0.094 +22 0.088 +23 0.082 +24 0.076 +25 0.070 +26 0.065 +27 0.060 +28 0.055 +29 0.050 +30 0.045 +31 0.041 +32 0.036 +33 0.032 +34 0.028 +35 0.025 +36 0.021 +37 0.018 +38 0.015 +39 0.012 +40 0.009 +41 0.007 +42 0.005 +43 0.003 +44 0.001 +45 0.000 +46 -0.001 +47 -0.002 +48 -0.003 +49 -0.003 +50 -0.004 +51 -0.004 +52 -0.004 +53 -0.003 +54 -0.003 +55 -0.002 +56 -0.001 +57 0.001 +58 0.002 +59 0.004 +60 0.006 +61 0.008 +62 0.010 +63 0.013 +64 0.016 +65 0.019 +66 0.022 +67 0.025 +68 0.029 +69 0.032 +70 0.036 +71 0.040 +72 0.044 +73 0.048 +74 0.053 +75 0.057 +76 0.062 +77 0.067 +78 0.072 +79 0.077 +80 0.082 +81 0.087 +82 0.093 +83 0.098 +84 0.104 +85 0.109 +86 0.115 +87 0.120 +88 0.126 +89 0.131 +90 0.137 +1 0.301 +2 0.294 +3 0.286 +4 0.279 +5 0.271 +6 0.263 +7 0.255 +8 0.247 +9 0.238 +10 0.230 +11 0.221 +12 0.213 +13 0.204 +14 0.196 +15 0.187 +16 0.179 +17 0.171 +18 0.162 +19 0.154 +20 0.146 +21 0.138 +22 0.130 +23 0.122 +24 0.114 +25 0.106 +26 0.099 +27 0.092 +28 0.085 +29 0.078 +30 0.071 +31 0.065 +32 0.058 +33 0.052 +34 0.046 +35 0.041 +36 0.036 +37 0.031 +38 0.026 +39 0.021 +40 0.017 +41 0.013 +42 0.009 +43 0.006 +44 0.003 +45 0.000 +46 -0.003 +47 -0.005 +48 -0.007 +49 -0.008 +50 -0.010 +51 -0.011 +52 -0.012 +53 -0.012 +54 -0.013 +55 -0.013 +56 -0.012 +57 -0.012 +58 -0.011 +59 -0.010 +60 -0.008 +61 -0.007 +62 -0.005 +63 -0.002 +64 -0.000 +65 0.003 +66 0.005 +67 0.009 +68 0.012 +69 0.015 +70 0.019 +71 0.023 +72 0.027 +73 0.031 +74 0.035 +75 0.040 +76 0.045 +77 0.049 +78 0.054 +79 0.059 +80 0.064 +81 0.069 +82 0.074 +83 0.079 +84 0.084 +85 0.089 +86 0.094 +87 0.099 +88 0.104 +89 0.109 +90 0.114 +1 -0.213 +2 -0.227 +3 -0.240 +4 -0.251 +5 -0.261 +6 -0.269 +7 -0.276 +8 -0.281 +9 -0.285 +10 -0.287 +11 -0.289 +12 -0.289 +13 -0.288 +14 -0.286 +15 -0.284 +16 -0.280 +17 -0.276 +18 -0.271 +19 -0.265 +20 -0.258 +21 -0.251 +22 -0.243 +23 -0.235 +24 -0.227 +25 -0.217 +26 -0.208 +27 -0.198 +28 -0.188 +29 -0.178 +30 -0.167 +31 -0.156 +32 -0.145 +33 -0.134 +34 -0.123 +35 -0.112 +36 -0.100 +37 -0.089 +38 -0.078 +39 -0.066 +40 -0.055 +41 -0.044 +42 -0.033 +43 -0.022 +44 -0.011 +45 0.000 +46 0.011 +47 0.021 +48 0.032 +49 0.042 +50 0.052 +51 0.062 +52 0.072 +53 0.081 +54 0.091 +55 0.100 +56 0.109 +57 0.118 +58 0.127 +59 0.136 +60 0.144 +61 0.153 +62 0.162 +63 0.170 +64 0.178 +65 0.187 +66 0.195 +67 0.203 +68 0.212 +69 0.220 +70 0.229 +71 0.238 +72 0.247 +73 0.256 +74 0.265 +75 0.275 +76 0.285 +77 0.295 +78 0.305 +79 0.316 +80 0.328 +81 0.340 +82 0.353 +83 0.366 +84 0.380 +85 0.394 +86 0.410 +87 0.426 +88 0.443 +89 0.461 +90 0.480 +1 -0.215 +2 -0.227 +3 -0.238 +4 -0.247 +5 -0.255 +6 -0.261 +7 -0.267 +8 -0.270 +9 -0.273 +10 -0.275 +11 -0.275 +12 -0.275 +13 -0.273 +14 -0.271 +15 -0.268 +16 -0.264 +17 -0.259 +18 -0.254 +19 -0.248 +20 -0.242 +21 -0.234 +22 -0.227 +23 -0.219 +24 -0.211 +25 -0.202 +26 -0.193 +27 -0.183 +28 -0.174 +29 -0.164 +30 -0.154 +31 -0.144 +32 -0.134 +33 -0.123 +34 -0.113 +35 -0.102 +36 -0.092 +37 -0.081 +38 -0.071 +39 -0.060 +40 -0.050 +41 -0.040 +42 -0.030 +43 -0.020 +44 -0.010 +45 0.000 +46 0.010 +47 0.019 +48 0.028 +49 0.038 +50 0.047 +51 0.055 +52 0.064 +53 0.073 +54 0.081 +55 0.089 +56 0.097 +57 0.105 +58 0.113 +59 0.120 +60 0.128 +61 0.135 +62 0.142 +63 0.149 +64 0.157 +65 0.164 +66 0.171 +67 0.178 +68 0.185 +69 0.192 +70 0.199 +71 0.206 +72 0.214 +73 0.221 +74 0.229 +75 0.237 +76 0.245 +77 0.254 +78 0.262 +79 0.272 +80 0.281 +81 0.291 +82 0.302 +83 0.313 +84 0.325 +85 0.337 +86 0.350 +87 0.364 +88 0.378 +89 0.394 +90 0.410 +1 -0.730 +2 -0.746 +3 -0.760 +4 -0.770 +5 -0.777 +6 -0.781 +7 -0.783 +8 -0.782 +9 -0.779 +10 -0.773 +11 -0.765 +12 -0.756 +13 -0.744 +14 -0.731 +15 -0.716 +16 -0.700 +17 -0.682 +18 -0.663 +19 -0.643 +20 -0.622 +21 -0.599 +22 -0.577 +23 -0.553 +24 -0.529 +25 -0.504 +26 -0.478 +27 -0.453 +28 -0.427 +29 -0.400 +30 -0.374 +31 -0.348 +32 -0.321 +33 -0.295 +34 -0.268 +35 -0.242 +36 -0.216 +37 -0.191 +38 -0.165 +39 -0.140 +40 -0.116 +41 -0.092 +42 -0.068 +43 -0.045 +44 -0.022 +45 0.000 +46 0.022 +47 0.042 +48 0.063 +49 0.082 +50 0.101 +51 0.120 +52 0.138 +53 0.155 +54 0.171 +55 0.187 +56 0.203 +57 0.218 +58 0.232 +59 0.246 +60 0.259 +61 0.271 +62 0.284 +63 0.296 +64 0.307 +65 0.318 +66 0.329 +67 0.340 +68 0.350 +69 0.361 +70 0.371 +71 0.381 +72 0.392 +73 0.402 +74 0.413 +75 0.424 +76 0.435 +77 0.447 +78 0.460 +79 0.473 +80 0.486 +81 0.501 +82 0.516 +83 0.533 +84 0.550 +85 0.569 +86 0.589 +87 0.611 +88 0.634 +89 0.659 +90 0.686 +1 -0.659 +2 -0.664 +3 -0.667 +4 -0.668 +5 -0.667 +6 -0.664 +7 -0.659 +8 -0.653 +9 -0.645 +10 -0.636 +11 -0.626 +12 -0.614 +13 -0.601 +14 -0.587 +15 -0.572 +16 -0.556 +17 -0.539 +18 -0.522 +19 -0.504 +20 -0.485 +21 -0.466 +22 -0.446 +23 -0.426 +24 -0.406 +25 -0.385 +26 -0.365 +27 -0.344 +28 -0.323 +29 -0.302 +30 -0.281 +31 -0.260 +32 -0.240 +33 -0.219 +34 -0.199 +35 -0.179 +36 -0.159 +37 -0.140 +38 -0.121 +39 -0.102 +40 -0.084 +41 -0.066 +42 -0.049 +43 -0.032 +44 -0.016 +45 0.000 +46 0.015 +47 0.030 +48 0.044 +49 0.057 +50 0.070 +51 0.083 +52 0.094 +53 0.106 +54 0.116 +55 0.126 +56 0.136 +57 0.145 +58 0.153 +59 0.161 +60 0.168 +61 0.175 +62 0.181 +63 0.187 +64 0.193 +65 0.198 +66 0.203 +67 0.208 +68 0.212 +69 0.216 +70 0.220 +71 0.224 +72 0.227 +73 0.231 +74 0.235 +75 0.238 +76 0.242 +77 0.246 +78 0.250 +79 0.255 +80 0.259 +81 0.265 +82 0.270 +83 0.277 +84 0.284 +85 0.291 +86 0.300 +87 0.309 +88 0.319 +89 0.331 +90 0.343 +1 -1.172 +2 -1.177 +3 -1.179 +4 -1.177 +5 -1.172 +6 -1.164 +7 -1.154 +8 -1.140 +9 -1.124 +10 -1.106 +11 -1.086 +12 -1.064 +13 -1.040 +14 -1.014 +15 -0.987 +16 -0.958 +17 -0.928 +18 -0.897 +19 -0.864 +20 -0.831 +21 -0.797 +22 -0.763 +23 -0.728 +24 -0.692 +25 -0.656 +26 -0.620 +27 -0.584 +28 -0.548 +29 -0.512 +30 -0.476 +31 -0.440 +32 -0.405 +33 -0.370 +34 -0.335 +35 -0.301 +36 -0.267 +37 -0.235 +38 -0.202 +39 -0.171 +40 -0.140 +41 -0.110 +42 -0.081 +43 -0.053 +44 -0.026 +45 0.000 +46 0.025 +47 0.049 +48 0.073 +49 0.095 +50 0.116 +51 0.136 +52 0.155 +53 0.173 +54 0.190 +55 0.206 +56 0.220 +57 0.234 +58 0.247 +59 0.259 +60 0.271 +61 0.281 +62 0.290 +63 0.299 +64 0.307 +65 0.314 +66 0.321 +67 0.327 +68 0.332 +69 0.337 +70 0.342 +71 0.346 +72 0.351 +73 0.355 +74 0.359 +75 0.363 +76 0.367 +77 0.371 +78 0.376 +79 0.381 +80 0.387 +81 0.394 +82 0.401 +83 0.409 +84 0.418 +85 0.428 +86 0.440 +87 0.453 +88 0.468 +89 0.484 +90 0.502 +1 -0.940 +2 -0.926 +3 -0.910 +4 -0.894 +5 -0.876 +6 -0.857 +7 -0.837 +8 -0.817 +9 -0.795 +10 -0.773 +11 -0.750 +12 -0.726 +13 -0.702 +14 -0.678 +15 -0.653 +16 -0.628 +17 -0.602 +18 -0.577 +19 -0.551 +20 -0.525 +21 -0.499 +22 -0.473 +23 -0.448 +24 -0.422 +25 -0.397 +26 -0.372 +27 -0.348 +28 -0.323 +29 -0.299 +30 -0.276 +31 -0.253 +32 -0.231 +33 -0.209 +34 -0.187 +35 -0.167 +36 -0.147 +37 -0.127 +38 -0.109 +39 -0.091 +40 -0.074 +41 -0.057 +42 -0.042 +43 -0.027 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.034 +49 0.044 +50 0.053 +51 0.061 +52 0.068 +53 0.074 +54 0.079 +55 0.084 +56 0.087 +57 0.090 +58 0.092 +59 0.093 +60 0.093 +61 0.093 +62 0.092 +63 0.090 +64 0.087 +65 0.083 +66 0.079 +67 0.075 +68 0.069 +69 0.063 +70 0.057 +71 0.050 +72 0.043 +73 0.035 +74 0.027 +75 0.018 +76 0.009 +77 -0.000 +78 -0.009 +79 -0.019 +80 -0.028 +81 -0.038 +82 -0.048 +83 -0.057 +84 -0.066 +85 -0.076 +86 -0.084 +87 -0.093 +88 -0.101 +89 -0.109 +90 -0.116 +1 -1.227 +2 -1.200 +3 -1.171 +4 -1.142 +5 -1.112 +6 -1.081 +7 -1.050 +8 -1.018 +9 -0.985 +10 -0.952 +11 -0.919 +12 -0.885 +13 -0.852 +14 -0.818 +15 -0.784 +16 -0.750 +17 -0.716 +18 -0.682 +19 -0.649 +20 -0.615 +21 -0.582 +22 -0.550 +23 -0.518 +24 -0.486 +25 -0.455 +26 -0.424 +27 -0.394 +28 -0.365 +29 -0.336 +30 -0.308 +31 -0.281 +32 -0.255 +33 -0.229 +34 -0.204 +35 -0.181 +36 -0.158 +37 -0.136 +38 -0.116 +39 -0.096 +40 -0.077 +41 -0.060 +42 -0.043 +43 -0.028 +44 -0.013 +45 -0.000 +46 0.012 +47 0.023 +48 0.033 +49 0.041 +50 0.049 +51 0.055 +52 0.060 +53 0.064 +54 0.067 +55 0.069 +56 0.070 +57 0.069 +58 0.067 +59 0.064 +60 0.061 +61 0.056 +62 0.050 +63 0.043 +64 0.035 +65 0.026 +66 0.016 +67 0.005 +68 -0.007 +69 -0.020 +70 -0.033 +71 -0.047 +72 -0.062 +73 -0.078 +74 -0.094 +75 -0.111 +76 -0.129 +77 -0.147 +78 -0.166 +79 -0.185 +80 -0.204 +81 -0.224 +82 -0.244 +83 -0.264 +84 -0.285 +85 -0.305 +86 -0.326 +87 -0.346 +88 -0.367 +89 -0.387 +90 -0.407 +1 -1.034 +2 -0.994 +3 -0.956 +4 -0.918 +5 -0.880 +6 -0.843 +7 -0.806 +8 -0.771 +9 -0.735 +10 -0.701 +11 -0.667 +12 -0.633 +13 -0.601 +14 -0.569 +15 -0.538 +16 -0.507 +17 -0.477 +18 -0.449 +19 -0.420 +20 -0.393 +21 -0.366 +22 -0.341 +23 -0.316 +24 -0.292 +25 -0.269 +26 -0.246 +27 -0.225 +28 -0.204 +29 -0.185 +30 -0.166 +31 -0.148 +32 -0.131 +33 -0.115 +34 -0.100 +35 -0.086 +36 -0.073 +37 -0.061 +38 -0.050 +39 -0.040 +40 -0.031 +41 -0.023 +42 -0.016 +43 -0.009 +44 -0.004 +45 -0.000 +46 0.003 +47 0.005 +48 0.007 +49 0.007 +50 0.006 +51 0.004 +52 0.001 +53 -0.003 +54 -0.008 +55 -0.013 +56 -0.020 +57 -0.028 +58 -0.037 +59 -0.047 +60 -0.057 +61 -0.069 +62 -0.082 +63 -0.096 +64 -0.110 +65 -0.126 +66 -0.143 +67 -0.160 +68 -0.178 +69 -0.198 +70 -0.218 +71 -0.239 +72 -0.261 +73 -0.284 +74 -0.308 +75 -0.332 +76 -0.358 +77 -0.384 +78 -0.411 +79 -0.439 +80 -0.468 +81 -0.497 +82 -0.528 +83 -0.559 +84 -0.590 +85 -0.623 +86 -0.656 +87 -0.690 +88 -0.724 +89 -0.759 +90 -0.795 +1 -1.160 +2 -1.127 +3 -1.093 +4 -1.059 +5 -1.025 +6 -0.991 +7 -0.956 +8 -0.922 +9 -0.887 +10 -0.853 +11 -0.818 +12 -0.784 +13 -0.750 +14 -0.717 +15 -0.683 +16 -0.650 +17 -0.618 +18 -0.586 +19 -0.554 +20 -0.523 +21 -0.492 +22 -0.462 +23 -0.433 +24 -0.404 +25 -0.376 +26 -0.348 +27 -0.322 +28 -0.296 +29 -0.271 +30 -0.247 +31 -0.224 +32 -0.201 +33 -0.180 +34 -0.159 +35 -0.140 +36 -0.121 +37 -0.104 +38 -0.087 +39 -0.071 +40 -0.057 +41 -0.043 +42 -0.031 +43 -0.019 +44 -0.009 +45 -0.000 +46 0.008 +47 0.015 +48 0.021 +49 0.026 +50 0.029 +51 0.032 +52 0.034 +53 0.034 +54 0.033 +55 0.031 +56 0.028 +57 0.024 +58 0.019 +59 0.013 +60 0.006 +61 -0.002 +62 -0.012 +63 -0.022 +64 -0.033 +65 -0.046 +66 -0.059 +67 -0.073 +68 -0.088 +69 -0.104 +70 -0.121 +71 -0.139 +72 -0.157 +73 -0.177 +74 -0.197 +75 -0.218 +76 -0.239 +77 -0.261 +78 -0.284 +79 -0.308 +80 -0.332 +81 -0.356 +82 -0.382 +83 -0.407 +84 -0.433 +85 -0.459 +86 -0.486 +87 -0.513 +88 -0.540 +89 -0.568 +90 -0.595 +1 -0.729 +2 -0.698 +3 -0.668 +4 -0.638 +5 -0.609 +6 -0.581 +7 -0.553 +8 -0.526 +9 -0.499 +10 -0.473 +11 -0.448 +12 -0.423 +13 -0.399 +14 -0.376 +15 -0.353 +16 -0.332 +17 -0.310 +18 -0.290 +19 -0.270 +20 -0.251 +21 -0.232 +22 -0.214 +23 -0.197 +24 -0.181 +25 -0.165 +26 -0.150 +27 -0.136 +28 -0.122 +29 -0.109 +30 -0.097 +31 -0.086 +32 -0.075 +33 -0.065 +34 -0.055 +35 -0.047 +36 -0.039 +37 -0.032 +38 -0.025 +39 -0.019 +40 -0.014 +41 -0.010 +42 -0.006 +43 -0.004 +44 -0.001 +45 -0.000 +46 0.001 +47 0.001 +48 -0.000 +49 -0.002 +50 -0.004 +51 -0.007 +52 -0.010 +53 -0.015 +54 -0.020 +55 -0.025 +56 -0.032 +57 -0.039 +58 -0.047 +59 -0.056 +60 -0.065 +61 -0.075 +62 -0.086 +63 -0.097 +64 -0.109 +65 -0.122 +66 -0.136 +67 -0.150 +68 -0.165 +69 -0.181 +70 -0.197 +71 -0.214 +72 -0.232 +73 -0.250 +74 -0.269 +75 -0.289 +76 -0.309 +77 -0.330 +78 -0.352 +79 -0.374 +80 -0.397 +81 -0.421 +82 -0.445 +83 -0.470 +84 -0.495 +85 -0.521 +86 -0.548 +87 -0.575 +88 -0.603 +89 -0.632 +90 -0.661 +1 -0.777 +2 -0.752 +3 -0.726 +4 -0.701 +5 -0.676 +6 -0.651 +7 -0.626 +8 -0.601 +9 -0.577 +10 -0.552 +11 -0.528 +12 -0.505 +13 -0.481 +14 -0.458 +15 -0.435 +16 -0.413 +17 -0.391 +18 -0.369 +19 -0.348 +20 -0.327 +21 -0.307 +22 -0.287 +23 -0.267 +24 -0.249 +25 -0.230 +26 -0.213 +27 -0.196 +28 -0.179 +29 -0.163 +30 -0.148 +31 -0.133 +32 -0.119 +33 -0.106 +34 -0.093 +35 -0.081 +36 -0.070 +37 -0.059 +38 -0.049 +39 -0.040 +40 -0.032 +41 -0.024 +42 -0.017 +43 -0.010 +44 -0.005 +45 -0.000 +46 0.004 +47 0.007 +48 0.010 +49 0.012 +50 0.013 +51 0.013 +52 0.013 +53 0.012 +54 0.010 +55 0.007 +56 0.004 +57 -0.000 +58 -0.005 +59 -0.010 +60 -0.017 +61 -0.024 +62 -0.031 +63 -0.040 +64 -0.049 +65 -0.059 +66 -0.069 +67 -0.080 +68 -0.092 +69 -0.104 +70 -0.117 +71 -0.131 +72 -0.145 +73 -0.159 +74 -0.175 +75 -0.191 +76 -0.207 +77 -0.224 +78 -0.241 +79 -0.259 +80 -0.277 +81 -0.296 +82 -0.315 +83 -0.335 +84 -0.355 +85 -0.375 +86 -0.396 +87 -0.417 +88 -0.438 +89 -0.459 +90 -0.481 +1 -0.282 +2 -0.256 +3 -0.232 +4 -0.209 +5 -0.187 +6 -0.166 +7 -0.147 +8 -0.129 +9 -0.112 +10 -0.096 +11 -0.081 +12 -0.067 +13 -0.054 +14 -0.043 +15 -0.032 +16 -0.021 +17 -0.012 +18 -0.004 +19 0.004 +20 0.011 +21 0.017 +22 0.022 +23 0.027 +24 0.031 +25 0.035 +26 0.037 +27 0.040 +28 0.041 +29 0.042 +30 0.043 +31 0.043 +32 0.043 +33 0.042 +34 0.041 +35 0.039 +36 0.037 +37 0.034 +38 0.031 +39 0.028 +40 0.024 +41 0.020 +42 0.015 +43 0.011 +44 0.005 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.025 +50 -0.032 +51 -0.039 +52 -0.047 +53 -0.055 +54 -0.063 +55 -0.072 +56 -0.081 +57 -0.090 +58 -0.100 +59 -0.109 +60 -0.120 +61 -0.130 +62 -0.141 +63 -0.152 +64 -0.164 +65 -0.176 +66 -0.188 +67 -0.201 +68 -0.214 +69 -0.228 +70 -0.242 +71 -0.257 +72 -0.272 +73 -0.287 +74 -0.303 +75 -0.320 +76 -0.337 +77 -0.354 +78 -0.373 +79 -0.392 +80 -0.411 +81 -0.431 +82 -0.452 +83 -0.474 +84 -0.496 +85 -0.519 +86 -0.543 +87 -0.568 +88 -0.594 +89 -0.620 +90 -0.648 +1 -0.371 +2 -0.357 +3 -0.343 +4 -0.329 +5 -0.315 +6 -0.301 +7 -0.288 +8 -0.275 +9 -0.262 +10 -0.249 +11 -0.237 +12 -0.225 +13 -0.213 +14 -0.202 +15 -0.190 +16 -0.179 +17 -0.168 +18 -0.158 +19 -0.148 +20 -0.138 +21 -0.128 +22 -0.119 +23 -0.110 +24 -0.102 +25 -0.093 +26 -0.085 +27 -0.078 +28 -0.071 +29 -0.064 +30 -0.057 +31 -0.051 +32 -0.045 +33 -0.039 +34 -0.034 +35 -0.029 +36 -0.025 +37 -0.020 +38 -0.017 +39 -0.013 +40 -0.010 +41 -0.007 +42 -0.005 +43 -0.003 +44 -0.001 +45 -0.000 +46 0.001 +47 0.001 +48 0.002 +49 0.001 +50 0.001 +51 0.000 +52 -0.001 +53 -0.003 +54 -0.005 +55 -0.007 +56 -0.010 +57 -0.013 +58 -0.016 +59 -0.020 +60 -0.024 +61 -0.029 +62 -0.033 +63 -0.039 +64 -0.044 +65 -0.050 +66 -0.056 +67 -0.063 +68 -0.069 +69 -0.077 +70 -0.084 +71 -0.092 +72 -0.100 +73 -0.108 +74 -0.117 +75 -0.126 +76 -0.135 +77 -0.145 +78 -0.155 +79 -0.165 +80 -0.175 +81 -0.186 +82 -0.197 +83 -0.208 +84 -0.219 +85 -0.231 +86 -0.243 +87 -0.255 +88 -0.268 +89 -0.280 +90 -0.293 +1 0.121 +2 0.139 +3 0.156 +4 0.171 +5 0.184 +6 0.196 +7 0.206 +8 0.214 +9 0.221 +10 0.227 +11 0.232 +12 0.235 +13 0.237 +14 0.238 +15 0.238 +16 0.238 +17 0.236 +18 0.233 +19 0.230 +20 0.226 +21 0.221 +22 0.216 +23 0.209 +24 0.203 +25 0.196 +26 0.188 +27 0.180 +28 0.172 +29 0.163 +30 0.154 +31 0.145 +32 0.135 +33 0.125 +34 0.115 +35 0.105 +36 0.095 +37 0.085 +38 0.074 +39 0.064 +40 0.053 +41 0.042 +42 0.032 +43 0.021 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.031 +49 -0.042 +50 -0.052 +51 -0.062 +52 -0.072 +53 -0.082 +54 -0.092 +55 -0.102 +56 -0.112 +57 -0.122 +58 -0.132 +59 -0.142 +60 -0.151 +61 -0.161 +62 -0.171 +63 -0.181 +64 -0.191 +65 -0.201 +66 -0.211 +67 -0.221 +68 -0.231 +69 -0.241 +70 -0.252 +71 -0.263 +72 -0.274 +73 -0.285 +74 -0.297 +75 -0.309 +76 -0.321 +77 -0.334 +78 -0.348 +79 -0.362 +80 -0.376 +81 -0.391 +82 -0.407 +83 -0.423 +84 -0.440 +85 -0.458 +86 -0.477 +87 -0.497 +88 -0.517 +89 -0.539 +90 -0.562 +1 -0.035 +2 -0.029 +3 -0.022 +4 -0.016 +5 -0.011 +6 -0.006 +7 -0.001 +8 0.003 +9 0.007 +10 0.010 +11 0.014 +12 0.016 +13 0.019 +14 0.021 +15 0.023 +16 0.025 +17 0.027 +18 0.028 +19 0.029 +20 0.030 +21 0.030 +22 0.031 +23 0.031 +24 0.031 +25 0.030 +26 0.030 +27 0.030 +28 0.029 +29 0.028 +30 0.027 +31 0.026 +32 0.025 +33 0.023 +34 0.022 +35 0.020 +36 0.019 +37 0.017 +38 0.015 +39 0.013 +40 0.011 +41 0.009 +42 0.007 +43 0.005 +44 0.002 +45 -0.000 +46 -0.002 +47 -0.005 +48 -0.007 +49 -0.010 +50 -0.013 +51 -0.015 +52 -0.018 +53 -0.021 +54 -0.024 +55 -0.027 +56 -0.029 +57 -0.032 +58 -0.036 +59 -0.039 +60 -0.042 +61 -0.045 +62 -0.048 +63 -0.052 +64 -0.055 +65 -0.058 +66 -0.062 +67 -0.066 +68 -0.069 +69 -0.073 +70 -0.077 +71 -0.081 +72 -0.085 +73 -0.089 +74 -0.094 +75 -0.098 +76 -0.103 +77 -0.107 +78 -0.112 +79 -0.117 +80 -0.122 +81 -0.127 +82 -0.133 +83 -0.139 +84 -0.144 +85 -0.150 +86 -0.157 +87 -0.163 +88 -0.170 +89 -0.177 +90 -0.184 +1 0.416 +2 0.429 +3 0.440 +4 0.448 +5 0.455 +6 0.460 +7 0.463 +8 0.464 +9 0.464 +10 0.462 +11 0.459 +12 0.454 +13 0.449 +14 0.442 +15 0.434 +16 0.425 +17 0.415 +18 0.404 +19 0.393 +20 0.381 +21 0.368 +22 0.354 +23 0.340 +24 0.326 +25 0.311 +26 0.296 +27 0.281 +28 0.265 +29 0.249 +30 0.233 +31 0.217 +32 0.201 +33 0.184 +34 0.168 +35 0.152 +36 0.136 +37 0.120 +38 0.104 +39 0.089 +40 0.073 +41 0.058 +42 0.043 +43 0.028 +44 0.014 +45 -0.000 +46 -0.014 +47 -0.027 +48 -0.040 +49 -0.053 +50 -0.065 +51 -0.077 +52 -0.089 +53 -0.101 +54 -0.112 +55 -0.122 +56 -0.133 +57 -0.143 +58 -0.152 +59 -0.162 +60 -0.171 +61 -0.180 +62 -0.188 +63 -0.197 +64 -0.205 +65 -0.213 +66 -0.221 +67 -0.229 +68 -0.237 +69 -0.244 +70 -0.252 +71 -0.260 +72 -0.268 +73 -0.276 +74 -0.284 +75 -0.292 +76 -0.301 +77 -0.310 +78 -0.319 +79 -0.329 +80 -0.339 +81 -0.350 +82 -0.361 +83 -0.373 +84 -0.386 +85 -0.400 +86 -0.414 +87 -0.430 +88 -0.446 +89 -0.464 +90 -0.483 +1 0.223 +2 0.228 +3 0.233 +4 0.237 +5 0.240 +6 0.242 +7 0.243 +8 0.243 +9 0.243 +10 0.241 +11 0.239 +12 0.237 +13 0.234 +14 0.230 +15 0.225 +16 0.221 +17 0.215 +18 0.210 +19 0.203 +20 0.197 +21 0.190 +22 0.183 +23 0.176 +24 0.168 +25 0.161 +26 0.153 +27 0.145 +28 0.137 +29 0.128 +30 0.120 +31 0.112 +32 0.103 +33 0.095 +34 0.087 +35 0.078 +36 0.070 +37 0.062 +38 0.054 +39 0.046 +40 0.038 +41 0.030 +42 0.022 +43 0.015 +44 0.007 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.021 +49 -0.027 +50 -0.033 +51 -0.040 +52 -0.046 +53 -0.051 +54 -0.057 +55 -0.062 +56 -0.067 +57 -0.073 +58 -0.077 +59 -0.082 +60 -0.087 +61 -0.091 +62 -0.095 +63 -0.099 +64 -0.103 +65 -0.107 +66 -0.111 +67 -0.115 +68 -0.119 +69 -0.122 +70 -0.126 +71 -0.130 +72 -0.133 +73 -0.137 +74 -0.141 +75 -0.145 +76 -0.149 +77 -0.153 +78 -0.157 +79 -0.161 +80 -0.166 +81 -0.171 +82 -0.176 +83 -0.181 +84 -0.187 +85 -0.193 +86 -0.200 +87 -0.207 +88 -0.214 +89 -0.222 +90 -0.231 +1 0.676 +2 0.690 +3 0.702 +4 0.710 +5 0.716 +6 0.719 +7 0.720 +8 0.719 +9 0.715 +10 0.710 +11 0.702 +12 0.693 +13 0.682 +14 0.669 +15 0.656 +16 0.640 +17 0.624 +18 0.606 +19 0.588 +20 0.568 +21 0.548 +22 0.527 +23 0.505 +24 0.483 +25 0.460 +26 0.437 +27 0.413 +28 0.389 +29 0.365 +30 0.341 +31 0.317 +32 0.293 +33 0.268 +34 0.244 +35 0.221 +36 0.197 +37 0.174 +38 0.150 +39 0.128 +40 0.105 +41 0.083 +42 0.062 +43 0.041 +44 0.020 +45 -0.000 +46 -0.020 +47 -0.039 +48 -0.057 +49 -0.075 +50 -0.092 +51 -0.109 +52 -0.125 +53 -0.141 +54 -0.156 +55 -0.170 +56 -0.184 +57 -0.197 +58 -0.210 +59 -0.222 +60 -0.234 +61 -0.246 +62 -0.257 +63 -0.267 +64 -0.278 +65 -0.287 +66 -0.297 +67 -0.307 +68 -0.316 +69 -0.325 +70 -0.334 +71 -0.343 +72 -0.352 +73 -0.361 +74 -0.371 +75 -0.380 +76 -0.390 +77 -0.400 +78 -0.411 +79 -0.422 +80 -0.434 +81 -0.447 +82 -0.460 +83 -0.475 +84 -0.490 +85 -0.506 +86 -0.524 +87 -0.543 +88 -0.563 +89 -0.585 +90 -0.608 +1 0.353 +2 0.359 +3 0.364 +4 0.367 +5 0.369 +6 0.370 +7 0.369 +8 0.368 +9 0.366 +10 0.362 +11 0.358 +12 0.353 +13 0.347 +14 0.340 +15 0.332 +16 0.324 +17 0.316 +18 0.306 +19 0.297 +20 0.287 +21 0.276 +22 0.265 +23 0.254 +24 0.243 +25 0.231 +26 0.219 +27 0.207 +28 0.195 +29 0.183 +30 0.171 +31 0.159 +32 0.147 +33 0.134 +34 0.122 +35 0.110 +36 0.098 +37 0.087 +38 0.075 +39 0.064 +40 0.053 +41 0.042 +42 0.031 +43 0.020 +44 0.010 +45 -0.000 +46 -0.010 +47 -0.019 +48 -0.028 +49 -0.037 +50 -0.046 +51 -0.054 +52 -0.062 +53 -0.070 +54 -0.077 +55 -0.084 +56 -0.091 +57 -0.097 +58 -0.103 +59 -0.109 +60 -0.115 +61 -0.120 +62 -0.126 +63 -0.131 +64 -0.135 +65 -0.140 +66 -0.144 +67 -0.149 +68 -0.153 +69 -0.157 +70 -0.161 +71 -0.165 +72 -0.169 +73 -0.173 +74 -0.177 +75 -0.181 +76 -0.185 +77 -0.190 +78 -0.194 +79 -0.199 +80 -0.204 +81 -0.210 +82 -0.215 +83 -0.221 +84 -0.228 +85 -0.235 +86 -0.242 +87 -0.251 +88 -0.259 +89 -0.269 +90 -0.279 +1 0.698 +2 0.710 +3 0.719 +4 0.726 +5 0.730 +6 0.732 +7 0.731 +8 0.728 +9 0.723 +10 0.716 +11 0.708 +12 0.697 +13 0.685 +14 0.672 +15 0.657 +16 0.641 +17 0.624 +18 0.606 +19 0.586 +20 0.566 +21 0.546 +22 0.524 +23 0.502 +24 0.479 +25 0.456 +26 0.433 +27 0.409 +28 0.385 +29 0.361 +30 0.337 +31 0.313 +32 0.289 +33 0.265 +34 0.241 +35 0.217 +36 0.194 +37 0.171 +38 0.148 +39 0.125 +40 0.103 +41 0.082 +42 0.060 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.055 +49 -0.073 +50 -0.089 +51 -0.106 +52 -0.121 +53 -0.136 +54 -0.150 +55 -0.164 +56 -0.177 +57 -0.190 +58 -0.202 +59 -0.213 +60 -0.224 +61 -0.235 +62 -0.245 +63 -0.255 +64 -0.264 +65 -0.273 +66 -0.281 +67 -0.290 +68 -0.298 +69 -0.306 +70 -0.314 +71 -0.322 +72 -0.330 +73 -0.338 +74 -0.346 +75 -0.354 +76 -0.362 +77 -0.371 +78 -0.381 +79 -0.390 +80 -0.401 +81 -0.412 +82 -0.423 +83 -0.436 +84 -0.449 +85 -0.464 +86 -0.479 +87 -0.496 +88 -0.514 +89 -0.534 +90 -0.555 +1 0.351 +2 0.358 +3 0.362 +4 0.366 +5 0.368 +6 0.369 +7 0.369 +8 0.367 +9 0.365 +10 0.361 +11 0.357 +12 0.352 +13 0.346 +14 0.339 +15 0.332 +16 0.324 +17 0.315 +18 0.306 +19 0.297 +20 0.287 +21 0.276 +22 0.265 +23 0.254 +24 0.243 +25 0.231 +26 0.219 +27 0.207 +28 0.195 +29 0.183 +30 0.171 +31 0.159 +32 0.147 +33 0.134 +34 0.122 +35 0.110 +36 0.098 +37 0.087 +38 0.075 +39 0.064 +40 0.053 +41 0.042 +42 0.031 +43 0.020 +44 0.010 +45 -0.000 +46 -0.010 +47 -0.019 +48 -0.028 +49 -0.037 +50 -0.046 +51 -0.054 +52 -0.062 +53 -0.070 +54 -0.077 +55 -0.084 +56 -0.091 +57 -0.097 +58 -0.103 +59 -0.109 +60 -0.115 +61 -0.120 +62 -0.126 +63 -0.131 +64 -0.135 +65 -0.140 +66 -0.144 +67 -0.149 +68 -0.153 +69 -0.157 +70 -0.161 +71 -0.165 +72 -0.169 +73 -0.173 +74 -0.177 +75 -0.181 +76 -0.185 +77 -0.190 +78 -0.194 +79 -0.199 +80 -0.204 +81 -0.209 +82 -0.215 +83 -0.221 +84 -0.228 +85 -0.235 +86 -0.242 +87 -0.251 +88 -0.259 +89 -0.269 +90 -0.279 +1 0.675 +2 0.689 +3 0.700 +4 0.709 +5 0.715 +6 0.718 +7 0.719 +8 0.718 +9 0.715 +10 0.709 +11 0.702 +12 0.692 +13 0.682 +14 0.669 +15 0.655 +16 0.640 +17 0.624 +18 0.606 +19 0.587 +20 0.568 +21 0.548 +22 0.527 +23 0.505 +24 0.482 +25 0.460 +26 0.436 +27 0.413 +28 0.389 +29 0.365 +30 0.341 +31 0.317 +32 0.293 +33 0.268 +34 0.244 +35 0.221 +36 0.197 +37 0.174 +38 0.150 +39 0.128 +40 0.105 +41 0.083 +42 0.062 +43 0.041 +44 0.020 +45 -0.000 +46 -0.020 +47 -0.039 +48 -0.057 +49 -0.075 +50 -0.092 +51 -0.109 +52 -0.125 +53 -0.141 +54 -0.156 +55 -0.170 +56 -0.184 +57 -0.197 +58 -0.210 +59 -0.222 +60 -0.234 +61 -0.246 +62 -0.257 +63 -0.267 +64 -0.277 +65 -0.287 +66 -0.297 +67 -0.307 +68 -0.316 +69 -0.325 +70 -0.334 +71 -0.343 +72 -0.352 +73 -0.361 +74 -0.371 +75 -0.380 +76 -0.390 +77 -0.401 +78 -0.411 +79 -0.423 +80 -0.435 +81 -0.447 +82 -0.461 +83 -0.475 +84 -0.490 +85 -0.507 +86 -0.524 +87 -0.543 +88 -0.564 +89 -0.586 +90 -0.609 +1 0.221 +2 0.227 +3 0.231 +4 0.235 +5 0.238 +6 0.240 +7 0.241 +8 0.241 +9 0.241 +10 0.239 +11 0.237 +12 0.235 +13 0.231 +14 0.228 +15 0.223 +16 0.219 +17 0.213 +18 0.208 +19 0.202 +20 0.195 +21 0.189 +22 0.182 +23 0.174 +24 0.167 +25 0.159 +26 0.151 +27 0.143 +28 0.135 +29 0.127 +30 0.119 +31 0.111 +32 0.102 +33 0.094 +34 0.086 +35 0.078 +36 0.069 +37 0.061 +38 0.053 +39 0.045 +40 0.037 +41 0.030 +42 0.022 +43 0.014 +44 0.007 +45 -0.000 +46 -0.007 +47 -0.014 +48 -0.020 +49 -0.027 +50 -0.033 +51 -0.039 +52 -0.045 +53 -0.051 +54 -0.057 +55 -0.062 +56 -0.067 +57 -0.072 +58 -0.077 +59 -0.082 +60 -0.086 +61 -0.091 +62 -0.095 +63 -0.099 +64 -0.103 +65 -0.107 +66 -0.111 +67 -0.115 +68 -0.119 +69 -0.122 +70 -0.126 +71 -0.130 +72 -0.133 +73 -0.137 +74 -0.141 +75 -0.145 +76 -0.149 +77 -0.153 +78 -0.157 +79 -0.162 +80 -0.166 +81 -0.171 +82 -0.177 +83 -0.182 +84 -0.188 +85 -0.194 +86 -0.201 +87 -0.208 +88 -0.215 +89 -0.223 +90 -0.232 +1 0.413 +2 0.426 +3 0.437 +4 0.445 +5 0.452 +6 0.457 +7 0.460 +8 0.461 +9 0.461 +10 0.459 +11 0.456 +12 0.452 +13 0.446 +14 0.439 +15 0.432 +16 0.423 +17 0.413 +18 0.402 +19 0.391 +20 0.379 +21 0.366 +22 0.353 +23 0.339 +24 0.325 +25 0.310 +26 0.295 +27 0.279 +28 0.264 +29 0.248 +30 0.232 +31 0.216 +32 0.200 +33 0.184 +34 0.168 +35 0.151 +36 0.135 +37 0.120 +38 0.104 +39 0.088 +40 0.073 +41 0.058 +42 0.043 +43 0.028 +44 0.014 +45 -0.000 +46 -0.014 +47 -0.027 +48 -0.040 +49 -0.053 +50 -0.065 +51 -0.077 +52 -0.089 +53 -0.100 +54 -0.111 +55 -0.122 +56 -0.132 +57 -0.142 +58 -0.152 +59 -0.161 +60 -0.171 +61 -0.179 +62 -0.188 +63 -0.197 +64 -0.205 +65 -0.213 +66 -0.221 +67 -0.229 +68 -0.236 +69 -0.244 +70 -0.252 +71 -0.260 +72 -0.268 +73 -0.276 +74 -0.284 +75 -0.292 +76 -0.301 +77 -0.310 +78 -0.319 +79 -0.329 +80 -0.339 +81 -0.350 +82 -0.362 +83 -0.374 +84 -0.387 +85 -0.401 +86 -0.415 +87 -0.431 +88 -0.447 +89 -0.465 +90 -0.484 +1 -0.039 +2 -0.032 +3 -0.025 +4 -0.020 +5 -0.014 +6 -0.009 +7 -0.004 +8 0.000 +9 0.004 +10 0.008 +11 0.011 +12 0.014 +13 0.017 +14 0.019 +15 0.021 +16 0.023 +17 0.025 +18 0.026 +19 0.027 +20 0.028 +21 0.029 +22 0.029 +23 0.029 +24 0.029 +25 0.029 +26 0.029 +27 0.028 +28 0.028 +29 0.027 +30 0.026 +31 0.025 +32 0.024 +33 0.023 +34 0.021 +35 0.020 +36 0.018 +37 0.016 +38 0.015 +39 0.013 +40 0.011 +41 0.009 +42 0.007 +43 0.005 +44 0.002 +45 -0.000 +46 -0.002 +47 -0.005 +48 -0.007 +49 -0.010 +50 -0.012 +51 -0.015 +52 -0.018 +53 -0.020 +54 -0.023 +55 -0.026 +56 -0.029 +57 -0.032 +58 -0.035 +59 -0.038 +60 -0.041 +61 -0.044 +62 -0.047 +63 -0.051 +64 -0.054 +65 -0.058 +66 -0.061 +67 -0.065 +68 -0.068 +69 -0.072 +70 -0.076 +71 -0.080 +72 -0.084 +73 -0.088 +74 -0.093 +75 -0.097 +76 -0.102 +77 -0.106 +78 -0.111 +79 -0.116 +80 -0.121 +81 -0.127 +82 -0.132 +83 -0.138 +84 -0.144 +85 -0.150 +86 -0.156 +87 -0.163 +88 -0.170 +89 -0.177 +90 -0.184 +1 0.118 +2 0.136 +3 0.153 +4 0.168 +5 0.181 +6 0.193 +7 0.203 +8 0.211 +9 0.219 +10 0.225 +11 0.229 +12 0.233 +13 0.235 +14 0.236 +15 0.236 +16 0.236 +17 0.234 +18 0.231 +19 0.228 +20 0.224 +21 0.219 +22 0.214 +23 0.208 +24 0.201 +25 0.194 +26 0.187 +27 0.179 +28 0.171 +29 0.162 +30 0.153 +31 0.144 +32 0.134 +33 0.125 +34 0.115 +35 0.105 +36 0.094 +37 0.084 +38 0.074 +39 0.063 +40 0.053 +41 0.042 +42 0.032 +43 0.021 +44 0.010 +45 -0.000 +46 -0.010 +47 -0.021 +48 -0.031 +49 -0.041 +50 -0.052 +51 -0.062 +52 -0.072 +53 -0.082 +54 -0.092 +55 -0.102 +56 -0.112 +57 -0.121 +58 -0.131 +59 -0.141 +60 -0.151 +61 -0.160 +62 -0.170 +63 -0.180 +64 -0.190 +65 -0.200 +66 -0.210 +67 -0.220 +68 -0.230 +69 -0.240 +70 -0.251 +71 -0.262 +72 -0.273 +73 -0.284 +74 -0.296 +75 -0.308 +76 -0.321 +77 -0.333 +78 -0.347 +79 -0.361 +80 -0.375 +81 -0.390 +82 -0.406 +83 -0.423 +84 -0.440 +85 -0.458 +86 -0.477 +87 -0.496 +88 -0.517 +89 -0.539 +90 -0.562 +1 -0.374 +2 -0.360 +3 -0.346 +4 -0.332 +5 -0.318 +6 -0.304 +7 -0.291 +8 -0.278 +9 -0.265 +10 -0.252 +11 -0.240 +12 -0.228 +13 -0.216 +14 -0.204 +15 -0.193 +16 -0.181 +17 -0.171 +18 -0.160 +19 -0.150 +20 -0.140 +21 -0.130 +22 -0.121 +23 -0.112 +24 -0.103 +25 -0.095 +26 -0.087 +27 -0.079 +28 -0.072 +29 -0.065 +30 -0.058 +31 -0.052 +32 -0.046 +33 -0.040 +34 -0.035 +35 -0.030 +36 -0.025 +37 -0.021 +38 -0.017 +39 -0.013 +40 -0.010 +41 -0.008 +42 -0.005 +43 -0.003 +44 -0.001 +45 -0.000 +46 0.001 +47 0.002 +48 0.002 +49 0.002 +50 0.001 +51 0.000 +52 -0.001 +53 -0.003 +54 -0.005 +55 -0.007 +56 -0.010 +57 -0.013 +58 -0.016 +59 -0.020 +60 -0.024 +61 -0.028 +62 -0.033 +63 -0.038 +64 -0.044 +65 -0.050 +66 -0.056 +67 -0.063 +68 -0.069 +69 -0.077 +70 -0.084 +71 -0.092 +72 -0.100 +73 -0.108 +74 -0.117 +75 -0.126 +76 -0.135 +77 -0.145 +78 -0.155 +79 -0.165 +80 -0.175 +81 -0.186 +82 -0.197 +83 -0.208 +84 -0.220 +85 -0.231 +86 -0.243 +87 -0.255 +88 -0.268 +89 -0.280 +90 -0.293 +1 -0.284 +2 -0.258 +3 -0.234 +4 -0.211 +5 -0.189 +6 -0.169 +7 -0.149 +8 -0.131 +9 -0.114 +10 -0.098 +11 -0.083 +12 -0.069 +13 -0.057 +14 -0.045 +15 -0.034 +16 -0.023 +17 -0.014 +18 -0.006 +19 0.002 +20 0.009 +21 0.015 +22 0.021 +23 0.025 +24 0.030 +25 0.033 +26 0.036 +27 0.038 +28 0.040 +29 0.041 +30 0.042 +31 0.042 +32 0.042 +33 0.041 +34 0.040 +35 0.038 +36 0.036 +37 0.034 +38 0.031 +39 0.027 +40 0.024 +41 0.020 +42 0.015 +43 0.011 +44 0.005 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.025 +50 -0.032 +51 -0.039 +52 -0.047 +53 -0.055 +54 -0.063 +55 -0.072 +56 -0.081 +57 -0.090 +58 -0.099 +59 -0.109 +60 -0.119 +61 -0.130 +62 -0.141 +63 -0.152 +64 -0.164 +65 -0.176 +66 -0.188 +67 -0.201 +68 -0.214 +69 -0.228 +70 -0.242 +71 -0.257 +72 -0.272 +73 -0.287 +74 -0.303 +75 -0.320 +76 -0.337 +77 -0.355 +78 -0.373 +79 -0.392 +80 -0.411 +81 -0.432 +82 -0.453 +83 -0.474 +84 -0.497 +85 -0.520 +86 -0.544 +87 -0.568 +88 -0.594 +89 -0.621 +90 -0.648 +1 -0.777 +2 -0.752 +3 -0.727 +4 -0.702 +5 -0.677 +6 -0.652 +7 -0.627 +8 -0.603 +9 -0.578 +10 -0.554 +11 -0.530 +12 -0.506 +13 -0.483 +14 -0.460 +15 -0.437 +16 -0.414 +17 -0.392 +18 -0.371 +19 -0.349 +20 -0.328 +21 -0.308 +22 -0.288 +23 -0.269 +24 -0.250 +25 -0.232 +26 -0.214 +27 -0.197 +28 -0.180 +29 -0.164 +30 -0.149 +31 -0.134 +32 -0.120 +33 -0.107 +34 -0.094 +35 -0.082 +36 -0.070 +37 -0.060 +38 -0.050 +39 -0.040 +40 -0.032 +41 -0.024 +42 -0.017 +43 -0.011 +44 -0.005 +45 -0.000 +46 0.004 +47 0.008 +48 0.010 +49 0.012 +50 0.013 +51 0.014 +52 0.013 +53 0.012 +54 0.010 +55 0.008 +56 0.004 +57 0.000 +58 -0.005 +59 -0.010 +60 -0.016 +61 -0.023 +62 -0.031 +63 -0.040 +64 -0.049 +65 -0.058 +66 -0.069 +67 -0.080 +68 -0.092 +69 -0.104 +70 -0.117 +71 -0.131 +72 -0.145 +73 -0.160 +74 -0.175 +75 -0.191 +76 -0.207 +77 -0.224 +78 -0.241 +79 -0.259 +80 -0.278 +81 -0.296 +82 -0.316 +83 -0.335 +84 -0.355 +85 -0.375 +86 -0.396 +87 -0.417 +88 -0.438 +89 -0.459 +90 -0.481 +1 -0.729 +2 -0.698 +3 -0.668 +4 -0.638 +5 -0.609 +6 -0.581 +7 -0.553 +8 -0.526 +9 -0.499 +10 -0.473 +11 -0.448 +12 -0.423 +13 -0.399 +14 -0.376 +15 -0.353 +16 -0.332 +17 -0.310 +18 -0.290 +19 -0.270 +20 -0.251 +21 -0.232 +22 -0.214 +23 -0.197 +24 -0.181 +25 -0.165 +26 -0.150 +27 -0.136 +28 -0.122 +29 -0.109 +30 -0.097 +31 -0.086 +32 -0.075 +33 -0.065 +34 -0.055 +35 -0.047 +36 -0.039 +37 -0.032 +38 -0.025 +39 -0.019 +40 -0.014 +41 -0.010 +42 -0.006 +43 -0.004 +44 -0.001 +45 -0.000 +46 0.001 +47 0.001 +48 -0.000 +49 -0.002 +50 -0.004 +51 -0.007 +52 -0.010 +53 -0.015 +54 -0.020 +55 -0.025 +56 -0.032 +57 -0.039 +58 -0.047 +59 -0.056 +60 -0.065 +61 -0.075 +62 -0.086 +63 -0.097 +64 -0.109 +65 -0.122 +66 -0.136 +67 -0.150 +68 -0.165 +69 -0.181 +70 -0.197 +71 -0.214 +72 -0.232 +73 -0.250 +74 -0.269 +75 -0.289 +76 -0.309 +77 -0.330 +78 -0.352 +79 -0.374 +80 -0.397 +81 -0.421 +82 -0.445 +83 -0.470 +84 -0.495 +85 -0.521 +86 -0.548 +87 -0.575 +88 -0.603 +89 -0.632 +90 -0.661 +1 -1.160 +2 -1.126 +3 -1.093 +4 -1.059 +5 -1.025 +6 -0.991 +7 -0.957 +8 -0.922 +9 -0.888 +10 -0.853 +11 -0.819 +12 -0.785 +13 -0.751 +14 -0.718 +15 -0.684 +16 -0.652 +17 -0.619 +18 -0.587 +19 -0.555 +20 -0.524 +21 -0.493 +22 -0.463 +23 -0.434 +24 -0.405 +25 -0.377 +26 -0.350 +27 -0.323 +28 -0.297 +29 -0.272 +30 -0.248 +31 -0.225 +32 -0.202 +33 -0.181 +34 -0.160 +35 -0.140 +36 -0.122 +37 -0.104 +38 -0.087 +39 -0.072 +40 -0.057 +41 -0.044 +42 -0.031 +43 -0.020 +44 -0.009 +45 -0.000 +46 0.008 +47 0.015 +48 0.021 +49 0.026 +50 0.030 +51 0.032 +52 0.034 +53 0.034 +54 0.034 +55 0.032 +56 0.029 +57 0.025 +58 0.020 +59 0.014 +60 0.007 +61 -0.002 +62 -0.011 +63 -0.021 +64 -0.032 +65 -0.045 +66 -0.058 +67 -0.072 +68 -0.087 +69 -0.103 +70 -0.120 +71 -0.138 +72 -0.156 +73 -0.176 +74 -0.196 +75 -0.217 +76 -0.238 +77 -0.260 +78 -0.283 +79 -0.307 +80 -0.331 +81 -0.355 +82 -0.381 +83 -0.406 +84 -0.432 +85 -0.458 +86 -0.485 +87 -0.512 +88 -0.539 +89 -0.567 +90 -0.594 +1 -1.032 +2 -0.993 +3 -0.955 +4 -0.917 +5 -0.879 +6 -0.842 +7 -0.806 +8 -0.770 +9 -0.735 +10 -0.700 +11 -0.666 +12 -0.633 +13 -0.600 +14 -0.568 +15 -0.537 +16 -0.507 +17 -0.477 +18 -0.448 +19 -0.420 +20 -0.393 +21 -0.366 +22 -0.341 +23 -0.316 +24 -0.292 +25 -0.268 +26 -0.246 +27 -0.225 +28 -0.204 +29 -0.185 +30 -0.166 +31 -0.148 +32 -0.131 +33 -0.115 +34 -0.101 +35 -0.087 +36 -0.073 +37 -0.061 +38 -0.050 +39 -0.040 +40 -0.031 +41 -0.023 +42 -0.016 +43 -0.009 +44 -0.004 +45 -0.000 +46 0.003 +47 0.005 +48 0.007 +49 0.007 +50 0.006 +51 0.004 +52 0.001 +53 -0.002 +54 -0.007 +55 -0.013 +56 -0.020 +57 -0.028 +58 -0.036 +59 -0.046 +60 -0.057 +61 -0.069 +62 -0.081 +63 -0.095 +64 -0.110 +65 -0.125 +66 -0.142 +67 -0.159 +68 -0.178 +69 -0.197 +70 -0.217 +71 -0.238 +72 -0.260 +73 -0.283 +74 -0.307 +75 -0.331 +76 -0.357 +77 -0.383 +78 -0.410 +79 -0.438 +80 -0.466 +81 -0.496 +82 -0.526 +83 -0.557 +84 -0.589 +85 -0.621 +86 -0.654 +87 -0.688 +88 -0.722 +89 -0.757 +90 -0.793 +1 -1.225 +2 -1.198 +3 -1.170 +4 -1.141 +5 -1.111 +6 -1.080 +7 -1.049 +8 -1.017 +9 -0.985 +10 -0.952 +11 -0.918 +12 -0.885 +13 -0.851 +14 -0.817 +15 -0.783 +16 -0.750 +17 -0.716 +18 -0.682 +19 -0.648 +20 -0.615 +21 -0.582 +22 -0.550 +23 -0.517 +24 -0.486 +25 -0.455 +26 -0.424 +27 -0.394 +28 -0.365 +29 -0.336 +30 -0.308 +31 -0.281 +32 -0.255 +33 -0.229 +34 -0.204 +35 -0.181 +36 -0.158 +37 -0.136 +38 -0.116 +39 -0.096 +40 -0.077 +41 -0.060 +42 -0.043 +43 -0.028 +44 -0.013 +45 -0.000 +46 0.012 +47 0.023 +48 0.033 +49 0.041 +50 0.049 +51 0.055 +52 0.060 +53 0.064 +54 0.067 +55 0.069 +56 0.069 +57 0.069 +58 0.067 +59 0.064 +60 0.061 +61 0.056 +62 0.050 +63 0.043 +64 0.035 +65 0.026 +66 0.016 +67 0.005 +68 -0.007 +69 -0.020 +70 -0.033 +71 -0.047 +72 -0.062 +73 -0.078 +74 -0.094 +75 -0.111 +76 -0.129 +77 -0.147 +78 -0.166 +79 -0.185 +80 -0.204 +81 -0.224 +82 -0.244 +83 -0.264 +84 -0.284 +85 -0.305 +86 -0.325 +87 -0.346 +88 -0.366 +89 -0.386 +90 -0.406 +1 -0.937 +2 -0.923 +3 -0.908 +4 -0.892 +5 -0.874 +6 -0.855 +7 -0.836 +8 -0.815 +9 -0.794 +10 -0.771 +11 -0.749 +12 -0.725 +13 -0.701 +14 -0.677 +15 -0.652 +16 -0.627 +17 -0.601 +18 -0.576 +19 -0.550 +20 -0.525 +21 -0.499 +22 -0.473 +23 -0.448 +24 -0.422 +25 -0.397 +26 -0.372 +27 -0.348 +28 -0.323 +29 -0.299 +30 -0.276 +31 -0.253 +32 -0.231 +33 -0.209 +34 -0.188 +35 -0.167 +36 -0.147 +37 -0.128 +38 -0.109 +39 -0.091 +40 -0.074 +41 -0.057 +42 -0.042 +43 -0.027 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.034 +49 0.044 +50 0.053 +51 0.061 +52 0.068 +53 0.074 +54 0.079 +55 0.084 +56 0.088 +57 0.090 +58 0.092 +59 0.094 +60 0.094 +61 0.093 +62 0.092 +63 0.090 +64 0.088 +65 0.084 +66 0.080 +67 0.076 +68 0.070 +69 0.064 +70 0.058 +71 0.051 +72 0.044 +73 0.036 +74 0.028 +75 0.019 +76 0.010 +77 0.001 +78 -0.008 +79 -0.018 +80 -0.027 +81 -0.037 +82 -0.046 +83 -0.056 +84 -0.065 +85 -0.074 +86 -0.083 +87 -0.092 +88 -0.100 +89 -0.108 +90 -0.115 +1 -1.169 +2 -1.174 +3 -1.176 +4 -1.175 +5 -1.170 +6 -1.162 +7 -1.152 +8 -1.139 +9 -1.123 +10 -1.105 +11 -1.085 +12 -1.063 +13 -1.039 +14 -1.013 +15 -0.986 +16 -0.957 +17 -0.927 +18 -0.896 +19 -0.864 +20 -0.831 +21 -0.797 +22 -0.763 +23 -0.728 +24 -0.692 +25 -0.656 +26 -0.620 +27 -0.584 +28 -0.548 +29 -0.512 +30 -0.476 +31 -0.440 +32 -0.405 +33 -0.370 +34 -0.335 +35 -0.301 +36 -0.268 +37 -0.235 +38 -0.202 +39 -0.171 +40 -0.140 +41 -0.110 +42 -0.081 +43 -0.053 +44 -0.026 +45 0.000 +46 0.025 +47 0.049 +48 0.073 +49 0.095 +50 0.116 +51 0.136 +52 0.155 +53 0.173 +54 0.190 +55 0.206 +56 0.221 +57 0.235 +58 0.248 +59 0.260 +60 0.271 +61 0.281 +62 0.291 +63 0.300 +64 0.308 +65 0.315 +66 0.321 +67 0.328 +68 0.333 +69 0.338 +70 0.343 +71 0.347 +72 0.352 +73 0.356 +74 0.360 +75 0.364 +76 0.368 +77 0.373 +78 0.378 +79 0.383 +80 0.389 +81 0.395 +82 0.402 +83 0.411 +84 0.420 +85 0.430 +86 0.442 +87 0.455 +88 0.469 +89 0.486 +90 0.504 +1 -0.657 +2 -0.662 +3 -0.665 +4 -0.666 +5 -0.665 +6 -0.662 +7 -0.657 +8 -0.651 +9 -0.643 +10 -0.634 +11 -0.624 +12 -0.612 +13 -0.599 +14 -0.585 +15 -0.570 +16 -0.554 +17 -0.537 +18 -0.520 +19 -0.502 +20 -0.483 +21 -0.464 +22 -0.445 +23 -0.425 +24 -0.404 +25 -0.384 +26 -0.363 +27 -0.343 +28 -0.322 +29 -0.301 +30 -0.280 +31 -0.259 +32 -0.239 +33 -0.218 +34 -0.198 +35 -0.178 +36 -0.158 +37 -0.139 +38 -0.120 +39 -0.102 +40 -0.084 +41 -0.066 +42 -0.049 +43 -0.032 +44 -0.016 +45 0.000 +46 0.015 +47 0.030 +48 0.044 +49 0.057 +50 0.070 +51 0.082 +52 0.094 +53 0.105 +54 0.116 +55 0.126 +56 0.135 +57 0.144 +58 0.153 +59 0.160 +60 0.168 +61 0.175 +62 0.181 +63 0.187 +64 0.193 +65 0.198 +66 0.203 +67 0.208 +68 0.212 +69 0.216 +70 0.220 +71 0.224 +72 0.228 +73 0.231 +74 0.235 +75 0.239 +76 0.242 +77 0.246 +78 0.251 +79 0.255 +80 0.260 +81 0.266 +82 0.271 +83 0.278 +84 0.285 +85 0.293 +86 0.301 +87 0.311 +88 0.321 +89 0.332 +90 0.345 +1 -0.728 +2 -0.745 +3 -0.758 +4 -0.768 +5 -0.775 +6 -0.779 +7 -0.781 +8 -0.780 +9 -0.777 +10 -0.771 +11 -0.763 +12 -0.754 +13 -0.742 +14 -0.729 +15 -0.714 +16 -0.698 +17 -0.680 +18 -0.661 +19 -0.641 +20 -0.620 +21 -0.598 +22 -0.575 +23 -0.551 +24 -0.527 +25 -0.502 +26 -0.477 +27 -0.451 +28 -0.425 +29 -0.399 +30 -0.373 +31 -0.347 +32 -0.320 +33 -0.294 +34 -0.268 +35 -0.242 +36 -0.216 +37 -0.190 +38 -0.165 +39 -0.140 +40 -0.115 +41 -0.091 +42 -0.068 +43 -0.045 +44 -0.022 +45 0.000 +46 0.021 +47 0.042 +48 0.063 +49 0.082 +50 0.101 +51 0.120 +52 0.137 +53 0.155 +54 0.171 +55 0.187 +56 0.203 +57 0.217 +58 0.232 +59 0.245 +60 0.258 +61 0.271 +62 0.284 +63 0.295 +64 0.307 +65 0.318 +66 0.329 +67 0.340 +68 0.350 +69 0.361 +70 0.371 +71 0.381 +72 0.392 +73 0.402 +74 0.413 +75 0.424 +76 0.436 +77 0.448 +78 0.460 +79 0.473 +80 0.487 +81 0.501 +82 0.517 +83 0.533 +84 0.551 +85 0.570 +86 0.590 +87 0.612 +88 0.635 +89 0.660 +90 0.687 +1 -0.212 +2 -0.224 +3 -0.235 +4 -0.244 +5 -0.252 +6 -0.258 +7 -0.264 +8 -0.268 +9 -0.270 +10 -0.272 +11 -0.273 +12 -0.272 +13 -0.271 +14 -0.269 +15 -0.265 +16 -0.262 +17 -0.257 +18 -0.252 +19 -0.246 +20 -0.240 +21 -0.233 +22 -0.225 +23 -0.217 +24 -0.209 +25 -0.200 +26 -0.191 +27 -0.182 +28 -0.173 +29 -0.163 +30 -0.153 +31 -0.143 +32 -0.133 +33 -0.122 +34 -0.112 +35 -0.102 +36 -0.091 +37 -0.081 +38 -0.071 +39 -0.060 +40 -0.050 +41 -0.040 +42 -0.030 +43 -0.020 +44 -0.010 +45 0.000 +46 0.010 +47 0.019 +48 0.028 +49 0.037 +50 0.046 +51 0.055 +52 0.064 +53 0.072 +54 0.081 +55 0.089 +56 0.097 +57 0.105 +58 0.112 +59 0.120 +60 0.127 +61 0.135 +62 0.142 +63 0.149 +64 0.156 +65 0.163 +66 0.171 +67 0.178 +68 0.185 +69 0.192 +70 0.199 +71 0.206 +72 0.214 +73 0.221 +74 0.229 +75 0.237 +76 0.245 +77 0.254 +78 0.263 +79 0.272 +80 0.282 +81 0.292 +82 0.302 +83 0.313 +84 0.325 +85 0.337 +86 0.350 +87 0.364 +88 0.378 +89 0.394 +90 0.410 +1 -0.209 +2 -0.224 +3 -0.237 +4 -0.248 +5 -0.258 +6 -0.266 +7 -0.273 +8 -0.278 +9 -0.282 +10 -0.285 +11 -0.286 +12 -0.287 +13 -0.286 +14 -0.284 +15 -0.282 +16 -0.278 +17 -0.274 +18 -0.269 +19 -0.263 +20 -0.257 +21 -0.249 +22 -0.242 +23 -0.234 +24 -0.225 +25 -0.216 +26 -0.207 +27 -0.197 +28 -0.187 +29 -0.177 +30 -0.166 +31 -0.155 +32 -0.144 +33 -0.133 +34 -0.122 +35 -0.111 +36 -0.100 +37 -0.088 +38 -0.077 +39 -0.066 +40 -0.055 +41 -0.044 +42 -0.033 +43 -0.022 +44 -0.011 +45 0.000 +46 0.011 +47 0.021 +48 0.031 +49 0.042 +50 0.052 +51 0.061 +52 0.071 +53 0.081 +54 0.090 +55 0.099 +56 0.109 +57 0.117 +58 0.126 +59 0.135 +60 0.144 +61 0.152 +62 0.161 +63 0.169 +64 0.177 +65 0.186 +66 0.194 +67 0.202 +68 0.211 +69 0.219 +70 0.228 +71 0.237 +72 0.246 +73 0.255 +74 0.264 +75 0.274 +76 0.284 +77 0.294 +78 0.305 +79 0.316 +80 0.327 +81 0.339 +82 0.352 +83 0.365 +84 0.379 +85 0.394 +86 0.409 +87 0.426 +88 0.443 +89 0.461 +90 0.480 +1 0.306 +2 0.298 +3 0.291 +4 0.283 +5 0.275 +6 0.267 +7 0.259 +8 0.250 +9 0.242 +10 0.233 +11 0.225 +12 0.216 +13 0.207 +14 0.199 +15 0.190 +16 0.181 +17 0.173 +18 0.164 +19 0.156 +20 0.148 +21 0.139 +22 0.131 +23 0.123 +24 0.115 +25 0.108 +26 0.100 +27 0.093 +28 0.086 +29 0.079 +30 0.072 +31 0.065 +32 0.059 +33 0.053 +34 0.047 +35 0.042 +36 0.036 +37 0.031 +38 0.026 +39 0.022 +40 0.017 +41 0.013 +42 0.010 +43 0.006 +44 0.003 +45 0.000 +46 -0.003 +47 -0.005 +48 -0.007 +49 -0.009 +50 -0.010 +51 -0.011 +52 -0.012 +53 -0.013 +54 -0.013 +55 -0.013 +56 -0.013 +57 -0.012 +58 -0.011 +59 -0.010 +60 -0.009 +61 -0.007 +62 -0.005 +63 -0.003 +64 -0.001 +65 0.002 +66 0.005 +67 0.008 +68 0.011 +69 0.014 +70 0.018 +71 0.022 +72 0.026 +73 0.030 +74 0.034 +75 0.039 +76 0.043 +77 0.048 +78 0.053 +79 0.058 +80 0.063 +81 0.068 +82 0.073 +83 0.078 +84 0.083 +85 0.088 +86 0.093 +87 0.098 +88 0.103 +89 0.108 +90 0.113 +1 0.238 +2 0.231 +3 0.224 +4 0.216 +5 0.209 +6 0.202 +7 0.194 +8 0.187 +9 0.180 +10 0.172 +11 0.165 +12 0.158 +13 0.151 +14 0.144 +15 0.137 +16 0.130 +17 0.123 +18 0.116 +19 0.110 +20 0.103 +21 0.097 +22 0.091 +23 0.085 +24 0.079 +25 0.073 +26 0.067 +27 0.062 +28 0.057 +29 0.052 +30 0.047 +31 0.042 +32 0.038 +33 0.034 +34 0.030 +35 0.026 +36 0.022 +37 0.019 +38 0.016 +39 0.013 +40 0.010 +41 0.008 +42 0.005 +43 0.003 +44 0.002 +45 0.000 +46 -0.001 +47 -0.002 +48 -0.003 +49 -0.004 +50 -0.004 +51 -0.004 +52 -0.004 +53 -0.004 +54 -0.003 +55 -0.002 +56 -0.001 +57 -0.000 +58 0.001 +59 0.003 +60 0.005 +61 0.007 +62 0.009 +63 0.012 +64 0.015 +65 0.018 +66 0.021 +67 0.024 +68 0.028 +69 0.031 +70 0.035 +71 0.039 +72 0.043 +73 0.047 +74 0.052 +75 0.056 +76 0.061 +77 0.066 +78 0.071 +79 0.076 +80 0.081 +81 0.086 +82 0.091 +83 0.096 +84 0.102 +85 0.107 +86 0.112 +87 0.118 +88 0.123 +89 0.129 +90 0.134 +1 0.688 +2 0.686 +3 0.682 +4 0.677 +5 0.670 +6 0.662 +7 0.652 +8 0.642 +9 0.630 +10 0.617 +11 0.603 +12 0.588 +13 0.573 +14 0.556 +15 0.539 +16 0.522 +17 0.504 +18 0.485 +19 0.466 +20 0.447 +21 0.427 +22 0.407 +23 0.388 +24 0.367 +25 0.347 +26 0.327 +27 0.307 +28 0.287 +29 0.268 +30 0.248 +31 0.229 +32 0.210 +33 0.191 +34 0.172 +35 0.154 +36 0.137 +37 0.119 +38 0.103 +39 0.086 +40 0.071 +41 0.055 +42 0.041 +43 0.027 +44 0.013 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.035 +49 -0.046 +50 -0.056 +51 -0.065 +52 -0.073 +53 -0.081 +54 -0.089 +55 -0.096 +56 -0.102 +57 -0.107 +58 -0.112 +59 -0.117 +60 -0.121 +61 -0.124 +62 -0.127 +63 -0.129 +64 -0.131 +65 -0.133 +66 -0.134 +67 -0.135 +68 -0.135 +69 -0.135 +70 -0.135 +71 -0.135 +72 -0.134 +73 -0.133 +74 -0.133 +75 -0.132 +76 -0.131 +77 -0.130 +78 -0.130 +79 -0.129 +80 -0.129 +81 -0.129 +82 -0.130 +83 -0.131 +84 -0.132 +85 -0.134 +86 -0.136 +87 -0.140 +88 -0.143 +89 -0.148 +90 -0.154 +1 0.560 +2 0.561 +3 0.561 +4 0.559 +5 0.556 +6 0.551 +7 0.546 +8 0.538 +9 0.530 +10 0.521 +11 0.511 +12 0.500 +13 0.488 +14 0.475 +15 0.462 +16 0.448 +17 0.433 +18 0.418 +19 0.403 +20 0.387 +21 0.371 +22 0.354 +23 0.338 +24 0.321 +25 0.304 +26 0.287 +27 0.270 +28 0.253 +29 0.236 +30 0.219 +31 0.202 +32 0.186 +33 0.169 +34 0.153 +35 0.138 +36 0.122 +37 0.107 +38 0.092 +39 0.078 +40 0.064 +41 0.050 +42 0.037 +43 0.024 +44 0.012 +45 -0.000 +46 -0.011 +47 -0.022 +48 -0.033 +49 -0.042 +50 -0.052 +51 -0.060 +52 -0.069 +53 -0.077 +54 -0.084 +55 -0.091 +56 -0.097 +57 -0.103 +58 -0.108 +59 -0.113 +60 -0.118 +61 -0.122 +62 -0.126 +63 -0.129 +64 -0.132 +65 -0.135 +66 -0.138 +67 -0.140 +68 -0.142 +69 -0.143 +70 -0.145 +71 -0.146 +72 -0.148 +73 -0.149 +74 -0.150 +75 -0.152 +76 -0.153 +77 -0.155 +78 -0.157 +79 -0.158 +80 -0.161 +81 -0.163 +82 -0.166 +83 -0.170 +84 -0.174 +85 -0.178 +86 -0.183 +87 -0.189 +88 -0.196 +89 -0.204 +90 -0.212 +1 0.942 +2 0.950 +3 0.954 +4 0.955 +5 0.954 +6 0.950 +7 0.943 +8 0.934 +9 0.923 +10 0.910 +11 0.895 +12 0.878 +13 0.859 +14 0.839 +15 0.817 +16 0.794 +17 0.770 +18 0.745 +19 0.719 +20 0.692 +21 0.665 +22 0.637 +23 0.608 +24 0.579 +25 0.549 +26 0.520 +27 0.490 +28 0.460 +29 0.430 +30 0.400 +31 0.370 +32 0.341 +33 0.311 +34 0.282 +35 0.254 +36 0.226 +37 0.198 +38 0.171 +39 0.145 +40 0.119 +41 0.094 +42 0.069 +43 0.045 +44 0.022 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.062 +49 -0.081 +50 -0.099 +51 -0.116 +52 -0.133 +53 -0.149 +54 -0.163 +55 -0.178 +56 -0.191 +57 -0.203 +58 -0.215 +59 -0.226 +60 -0.236 +61 -0.246 +62 -0.255 +63 -0.263 +64 -0.271 +65 -0.278 +66 -0.285 +67 -0.292 +68 -0.298 +69 -0.303 +70 -0.309 +71 -0.314 +72 -0.320 +73 -0.325 +74 -0.330 +75 -0.336 +76 -0.342 +77 -0.348 +78 -0.354 +79 -0.361 +80 -0.369 +81 -0.377 +82 -0.386 +83 -0.396 +84 -0.407 +85 -0.419 +86 -0.433 +87 -0.447 +88 -0.464 +89 -0.481 +90 -0.501 +1 0.781 +2 0.793 +3 0.803 +4 0.809 +5 0.813 +6 0.814 +7 0.812 +8 0.808 +9 0.802 +10 0.794 +11 0.784 +12 0.772 +13 0.758 +14 0.742 +15 0.725 +16 0.707 +17 0.688 +18 0.667 +19 0.646 +20 0.623 +21 0.600 +22 0.576 +23 0.551 +24 0.526 +25 0.500 +26 0.474 +27 0.448 +28 0.421 +29 0.395 +30 0.368 +31 0.341 +32 0.315 +33 0.288 +34 0.262 +35 0.236 +36 0.210 +37 0.185 +38 0.160 +39 0.136 +40 0.112 +41 0.088 +42 0.065 +43 0.043 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.040 +48 -0.060 +49 -0.078 +50 -0.096 +51 -0.113 +52 -0.130 +53 -0.145 +54 -0.160 +55 -0.175 +56 -0.189 +57 -0.202 +58 -0.214 +59 -0.226 +60 -0.238 +61 -0.249 +62 -0.259 +63 -0.269 +64 -0.279 +65 -0.288 +66 -0.297 +67 -0.305 +68 -0.314 +69 -0.322 +70 -0.330 +71 -0.338 +72 -0.346 +73 -0.354 +74 -0.363 +75 -0.371 +76 -0.380 +77 -0.390 +78 -0.400 +79 -0.410 +80 -0.421 +81 -0.433 +82 -0.446 +83 -0.460 +84 -0.475 +85 -0.491 +86 -0.508 +87 -0.527 +88 -0.547 +89 -0.569 +90 -0.593 +1 1.071 +2 1.088 +3 1.100 +4 1.108 +5 1.112 +6 1.113 +7 1.110 +8 1.104 +9 1.095 +10 1.083 +11 1.069 +12 1.052 +13 1.033 +14 1.011 +15 0.988 +16 0.963 +17 0.936 +18 0.908 +19 0.879 +20 0.848 +21 0.816 +22 0.783 +23 0.749 +24 0.715 +25 0.680 +26 0.644 +27 0.609 +28 0.573 +29 0.536 +30 0.500 +31 0.464 +32 0.428 +33 0.392 +34 0.356 +35 0.321 +36 0.286 +37 0.251 +38 0.217 +39 0.184 +40 0.152 +41 0.120 +42 0.089 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.081 +49 -0.106 +50 -0.130 +51 -0.153 +52 -0.176 +53 -0.197 +54 -0.217 +55 -0.237 +56 -0.256 +57 -0.273 +58 -0.290 +59 -0.306 +60 -0.322 +61 -0.337 +62 -0.351 +63 -0.364 +64 -0.377 +65 -0.389 +66 -0.401 +67 -0.412 +68 -0.423 +69 -0.434 +70 -0.445 +71 -0.456 +72 -0.466 +73 -0.477 +74 -0.488 +75 -0.500 +76 -0.511 +77 -0.524 +78 -0.537 +79 -0.550 +80 -0.565 +81 -0.580 +82 -0.597 +83 -0.615 +84 -0.635 +85 -0.656 +86 -0.679 +87 -0.704 +88 -0.731 +89 -0.760 +90 -0.791 +1 0.802 +2 0.822 +3 0.838 +4 0.850 +5 0.859 +6 0.865 +7 0.867 +8 0.867 +9 0.864 +10 0.859 +11 0.851 +12 0.840 +13 0.828 +14 0.814 +15 0.797 +16 0.779 +17 0.760 +18 0.739 +19 0.717 +20 0.693 +21 0.669 +22 0.643 +23 0.617 +24 0.590 +25 0.562 +26 0.534 +27 0.506 +28 0.477 +29 0.447 +30 0.418 +31 0.388 +32 0.359 +33 0.329 +34 0.300 +35 0.271 +36 0.242 +37 0.213 +38 0.185 +39 0.157 +40 0.129 +41 0.102 +42 0.076 +43 0.050 +44 0.025 +45 -0.000 +46 -0.024 +47 -0.048 +48 -0.070 +49 -0.092 +50 -0.114 +51 -0.134 +52 -0.155 +53 -0.174 +54 -0.193 +55 -0.211 +56 -0.228 +57 -0.245 +58 -0.261 +59 -0.276 +60 -0.291 +61 -0.306 +62 -0.320 +63 -0.334 +64 -0.347 +65 -0.360 +66 -0.373 +67 -0.385 +68 -0.397 +69 -0.410 +70 -0.422 +71 -0.434 +72 -0.447 +73 -0.459 +74 -0.472 +75 -0.486 +76 -0.500 +77 -0.514 +78 -0.529 +79 -0.545 +80 -0.562 +81 -0.580 +82 -0.599 +83 -0.619 +84 -0.641 +85 -0.664 +86 -0.689 +87 -0.715 +88 -0.744 +89 -0.774 +90 -0.807 +1 0.898 +2 0.918 +3 0.933 +4 0.945 +5 0.953 +6 0.958 +7 0.959 +8 0.957 +9 0.953 +10 0.945 +11 0.935 +12 0.923 +13 0.908 +14 0.892 +15 0.873 +16 0.853 +17 0.831 +18 0.807 +19 0.782 +20 0.756 +21 0.729 +22 0.701 +23 0.672 +24 0.642 +25 0.611 +26 0.580 +27 0.549 +28 0.517 +29 0.485 +30 0.453 +31 0.421 +32 0.389 +33 0.356 +34 0.324 +35 0.293 +36 0.261 +37 0.230 +38 0.199 +39 0.169 +40 0.139 +41 0.110 +42 0.082 +43 0.054 +44 0.027 +45 -0.000 +46 -0.026 +47 -0.051 +48 -0.075 +49 -0.099 +50 -0.122 +51 -0.144 +52 -0.165 +53 -0.185 +54 -0.205 +55 -0.224 +56 -0.242 +57 -0.260 +58 -0.277 +59 -0.293 +60 -0.309 +61 -0.324 +62 -0.338 +63 -0.352 +64 -0.366 +65 -0.379 +66 -0.392 +67 -0.404 +68 -0.417 +69 -0.429 +70 -0.441 +71 -0.453 +72 -0.466 +73 -0.478 +74 -0.491 +75 -0.504 +76 -0.518 +77 -0.532 +78 -0.547 +79 -0.563 +80 -0.579 +81 -0.597 +82 -0.616 +83 -0.636 +84 -0.658 +85 -0.681 +86 -0.706 +87 -0.733 +88 -0.762 +89 -0.793 +90 -0.826 +1 0.605 +2 0.629 +3 0.650 +4 0.667 +5 0.681 +6 0.692 +7 0.700 +8 0.705 +9 0.707 +10 0.707 +11 0.704 +12 0.699 +13 0.692 +14 0.684 +15 0.673 +16 0.660 +17 0.646 +18 0.631 +19 0.614 +20 0.596 +21 0.577 +22 0.557 +23 0.536 +24 0.514 +25 0.491 +26 0.468 +27 0.444 +28 0.420 +29 0.395 +30 0.370 +31 0.345 +32 0.319 +33 0.294 +34 0.268 +35 0.243 +36 0.217 +37 0.192 +38 0.167 +39 0.142 +40 0.118 +41 0.093 +42 0.069 +43 0.046 +44 0.023 +45 -0.000 +46 -0.022 +47 -0.044 +48 -0.065 +49 -0.086 +50 -0.107 +51 -0.127 +52 -0.146 +53 -0.165 +54 -0.183 +55 -0.201 +56 -0.219 +57 -0.236 +58 -0.252 +59 -0.269 +60 -0.284 +61 -0.300 +62 -0.315 +63 -0.330 +64 -0.345 +65 -0.360 +66 -0.374 +67 -0.388 +68 -0.403 +69 -0.417 +70 -0.432 +71 -0.447 +72 -0.462 +73 -0.477 +74 -0.493 +75 -0.509 +76 -0.526 +77 -0.544 +78 -0.562 +79 -0.581 +80 -0.601 +81 -0.623 +82 -0.645 +83 -0.669 +84 -0.694 +85 -0.720 +86 -0.748 +87 -0.778 +88 -0.810 +89 -0.844 +90 -0.880 +1 0.527 +2 0.548 +3 0.566 +4 0.581 +5 0.593 +6 0.602 +7 0.609 +8 0.614 +9 0.616 +10 0.615 +11 0.613 +12 0.609 +13 0.603 +14 0.595 +15 0.586 +16 0.575 +17 0.563 +18 0.549 +19 0.535 +20 0.519 +21 0.502 +22 0.485 +23 0.466 +24 0.447 +25 0.427 +26 0.407 +27 0.386 +28 0.365 +29 0.344 +30 0.322 +31 0.300 +32 0.278 +33 0.256 +34 0.234 +35 0.211 +36 0.189 +37 0.167 +38 0.145 +39 0.124 +40 0.102 +41 0.081 +42 0.060 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.038 +48 -0.057 +49 -0.075 +50 -0.093 +51 -0.110 +52 -0.127 +53 -0.143 +54 -0.159 +55 -0.175 +56 -0.190 +57 -0.205 +58 -0.219 +59 -0.233 +60 -0.247 +61 -0.260 +62 -0.273 +63 -0.286 +64 -0.299 +65 -0.312 +66 -0.324 +67 -0.337 +68 -0.349 +69 -0.361 +70 -0.374 +71 -0.387 +72 -0.400 +73 -0.413 +74 -0.427 +75 -0.441 +76 -0.455 +77 -0.470 +78 -0.486 +79 -0.502 +80 -0.520 +81 -0.538 +82 -0.557 +83 -0.578 +84 -0.599 +85 -0.622 +86 -0.646 +87 -0.672 +88 -0.700 +89 -0.729 +90 -0.760 +1 0.101 +2 0.124 +3 0.144 +4 0.162 +5 0.178 +6 0.192 +7 0.205 +8 0.216 +9 0.225 +10 0.233 +11 0.239 +12 0.244 +13 0.247 +14 0.249 +15 0.251 +16 0.251 +17 0.250 +18 0.248 +19 0.245 +20 0.241 +21 0.236 +22 0.231 +23 0.225 +24 0.218 +25 0.211 +26 0.203 +27 0.195 +28 0.186 +29 0.177 +30 0.167 +31 0.157 +32 0.147 +33 0.136 +34 0.126 +35 0.115 +36 0.104 +37 0.092 +38 0.081 +39 0.070 +40 0.058 +41 0.046 +42 0.035 +43 0.023 +44 0.012 +45 -0.000 +46 -0.012 +47 -0.023 +48 -0.035 +49 -0.046 +50 -0.058 +51 -0.069 +52 -0.080 +53 -0.092 +54 -0.103 +55 -0.114 +56 -0.125 +57 -0.137 +58 -0.148 +59 -0.159 +60 -0.170 +61 -0.181 +62 -0.193 +63 -0.204 +64 -0.216 +65 -0.227 +66 -0.239 +67 -0.251 +68 -0.263 +69 -0.275 +70 -0.288 +71 -0.301 +72 -0.314 +73 -0.328 +74 -0.342 +75 -0.357 +76 -0.372 +77 -0.387 +78 -0.404 +79 -0.421 +80 -0.438 +81 -0.457 +82 -0.476 +83 -0.496 +84 -0.517 +85 -0.539 +86 -0.562 +87 -0.586 +88 -0.611 +89 -0.638 +90 -0.666 +1 -0.195 +2 -0.185 +3 -0.176 +4 -0.168 +5 -0.159 +6 -0.151 +7 -0.143 +8 -0.135 +9 -0.127 +10 -0.120 +11 -0.113 +12 -0.106 +13 -0.099 +14 -0.093 +15 -0.087 +16 -0.081 +17 -0.075 +18 -0.069 +19 -0.064 +20 -0.059 +21 -0.054 +22 -0.050 +23 -0.045 +24 -0.041 +25 -0.037 +26 -0.033 +27 -0.029 +28 -0.026 +29 -0.023 +30 -0.020 +31 -0.017 +32 -0.015 +33 -0.012 +34 -0.010 +35 -0.008 +36 -0.007 +37 -0.005 +38 -0.004 +39 -0.003 +40 -0.002 +41 -0.001 +42 -0.000 +43 -0.000 +44 0.000 +45 -0.000 +46 -0.000 +47 -0.001 +48 -0.001 +49 -0.002 +50 -0.003 +51 -0.005 +52 -0.006 +53 -0.008 +54 -0.009 +55 -0.011 +56 -0.014 +57 -0.016 +58 -0.019 +59 -0.022 +60 -0.025 +61 -0.028 +62 -0.031 +63 -0.035 +64 -0.039 +65 -0.043 +66 -0.047 +67 -0.051 +68 -0.056 +69 -0.061 +70 -0.066 +71 -0.071 +72 -0.077 +73 -0.082 +74 -0.088 +75 -0.094 +76 -0.101 +77 -0.107 +78 -0.114 +79 -0.121 +80 -0.128 +81 -0.135 +82 -0.143 +83 -0.151 +84 -0.159 +85 -0.167 +86 -0.176 +87 -0.184 +88 -0.193 +89 -0.203 +90 -0.212 +1 -0.770 +2 -0.764 +3 -0.756 +4 -0.747 +5 -0.736 +6 -0.724 +7 -0.711 +8 -0.697 +9 -0.682 +10 -0.666 +11 -0.649 +12 -0.631 +13 -0.613 +14 -0.594 +15 -0.574 +16 -0.554 +17 -0.534 +18 -0.513 +19 -0.492 +20 -0.470 +21 -0.449 +22 -0.427 +23 -0.405 +24 -0.384 +25 -0.362 +26 -0.340 +27 -0.319 +28 -0.298 +29 -0.277 +30 -0.256 +31 -0.236 +32 -0.215 +33 -0.196 +34 -0.176 +35 -0.158 +36 -0.139 +37 -0.121 +38 -0.104 +39 -0.087 +40 -0.071 +41 -0.056 +42 -0.041 +43 -0.027 +44 -0.013 +45 0.000 +46 0.012 +47 0.024 +48 0.035 +49 0.045 +50 0.054 +51 0.063 +52 0.071 +53 0.079 +54 0.085 +55 0.091 +56 0.096 +57 0.101 +58 0.105 +59 0.108 +60 0.111 +61 0.113 +62 0.114 +63 0.115 +64 0.115 +65 0.115 +66 0.114 +67 0.113 +68 0.112 +69 0.109 +70 0.107 +71 0.104 +72 0.101 +73 0.098 +74 0.094 +75 0.091 +76 0.087 +77 0.083 +78 0.079 +79 0.075 +80 0.071 +81 0.067 +82 0.064 +83 0.060 +84 0.057 +85 0.055 +86 0.053 +87 0.051 +88 0.050 +89 0.050 +90 0.050 +1 -1.156 +2 -1.170 +3 -1.180 +4 -1.187 +5 -1.189 +6 -1.188 +7 -1.183 +8 -1.175 +9 -1.164 +10 -1.150 +11 -1.133 +12 -1.114 +13 -1.093 +14 -1.069 +15 -1.044 +16 -1.017 +17 -0.988 +18 -0.957 +19 -0.925 +20 -0.892 +21 -0.858 +22 -0.823 +23 -0.787 +24 -0.750 +25 -0.713 +26 -0.676 +27 -0.638 +28 -0.600 +29 -0.561 +30 -0.523 +31 -0.485 +32 -0.447 +33 -0.409 +34 -0.371 +35 -0.334 +36 -0.298 +37 -0.262 +38 -0.226 +39 -0.192 +40 -0.158 +41 -0.124 +42 -0.092 +43 -0.060 +44 -0.030 +45 0.000 +46 0.029 +47 0.057 +48 0.083 +49 0.109 +50 0.134 +51 0.158 +52 0.181 +53 0.203 +54 0.223 +55 0.243 +56 0.262 +57 0.280 +58 0.297 +59 0.313 +60 0.328 +61 0.342 +62 0.356 +63 0.369 +64 0.381 +65 0.393 +66 0.404 +67 0.415 +68 0.425 +69 0.435 +70 0.445 +71 0.455 +72 0.464 +73 0.474 +74 0.484 +75 0.494 +76 0.504 +77 0.515 +78 0.526 +79 0.538 +80 0.551 +81 0.565 +82 0.580 +83 0.596 +84 0.614 +85 0.633 +86 0.654 +87 0.677 +88 0.702 +89 0.729 +90 0.758 +1 -1.919 +2 -1.951 +3 -1.974 +4 -1.991 +5 -2.000 +6 -2.003 +7 -1.999 +8 -1.990 +9 -1.975 +10 -1.955 +11 -1.930 +12 -1.901 +13 -1.867 +14 -1.830 +15 -1.788 +16 -1.744 +17 -1.696 +18 -1.646 +19 -1.593 +20 -1.537 +21 -1.480 +22 -1.421 +23 -1.360 +24 -1.298 +25 -1.235 +26 -1.171 +27 -1.107 +28 -1.041 +29 -0.976 +30 -0.910 +31 -0.844 +32 -0.779 +33 -0.714 +34 -0.649 +35 -0.585 +36 -0.521 +37 -0.459 +38 -0.397 +39 -0.336 +40 -0.277 +41 -0.219 +42 -0.162 +43 -0.106 +44 -0.052 +45 0.000 +46 0.051 +47 0.100 +48 0.148 +49 0.194 +50 0.238 +51 0.281 +52 0.322 +53 0.361 +54 0.399 +55 0.435 +56 0.470 +57 0.503 +58 0.534 +59 0.564 +60 0.593 +61 0.620 +62 0.646 +63 0.671 +64 0.695 +65 0.718 +66 0.740 +67 0.761 +68 0.782 +69 0.803 +70 0.823 +71 0.843 +72 0.863 +73 0.883 +74 0.904 +75 0.925 +76 0.947 +77 0.970 +78 0.994 +79 1.020 +80 1.047 +81 1.076 +82 1.107 +83 1.140 +84 1.176 +85 1.215 +86 1.257 +87 1.302 +88 1.351 +89 1.405 +90 1.462 +1 -2.135 +2 -2.179 +3 -2.214 +4 -2.240 +5 -2.257 +6 -2.266 +7 -2.268 +8 -2.263 +9 -2.251 +10 -2.233 +11 -2.208 +12 -2.179 +13 -2.144 +14 -2.104 +15 -2.059 +16 -2.011 +17 -1.958 +18 -1.903 +19 -1.844 +20 -1.782 +21 -1.717 +22 -1.651 +23 -1.582 +24 -1.512 +25 -1.440 +26 -1.366 +27 -1.292 +28 -1.217 +29 -1.142 +30 -1.066 +31 -0.990 +32 -0.914 +33 -0.838 +34 -0.763 +35 -0.688 +36 -0.614 +37 -0.541 +38 -0.469 +39 -0.398 +40 -0.328 +41 -0.259 +42 -0.192 +43 -0.126 +44 -0.062 +45 0.000 +46 0.061 +47 0.120 +48 0.177 +49 0.232 +50 0.286 +51 0.337 +52 0.387 +53 0.435 +54 0.482 +55 0.526 +56 0.569 +57 0.610 +58 0.649 +59 0.687 +60 0.723 +61 0.758 +62 0.792 +63 0.824 +64 0.856 +65 0.886 +66 0.916 +67 0.945 +68 0.973 +69 1.001 +70 1.029 +71 1.057 +72 1.085 +73 1.113 +74 1.142 +75 1.172 +76 1.203 +77 1.235 +78 1.269 +79 1.305 +80 1.342 +81 1.382 +82 1.425 +83 1.471 +84 1.520 +85 1.572 +86 1.628 +87 1.689 +88 1.754 +89 1.824 +90 1.899 +1 -2.165 +2 -2.205 +3 -2.236 +4 -2.259 +5 -2.273 +6 -2.280 +7 -2.279 +8 -2.271 +9 -2.257 +10 -2.236 +11 -2.210 +12 -2.178 +13 -2.141 +14 -2.100 +15 -2.054 +16 -2.005 +17 -1.951 +18 -1.895 +19 -1.835 +20 -1.772 +21 -1.707 +22 -1.640 +23 -1.571 +24 -1.500 +25 -1.428 +26 -1.355 +27 -1.281 +28 -1.206 +29 -1.131 +30 -1.055 +31 -0.979 +32 -0.904 +33 -0.829 +34 -0.754 +35 -0.680 +36 -0.606 +37 -0.534 +38 -0.462 +39 -0.392 +40 -0.323 +41 -0.255 +42 -0.189 +43 -0.124 +44 -0.061 +45 0.000 +46 0.060 +47 0.117 +48 0.173 +49 0.228 +50 0.280 +51 0.330 +52 0.379 +53 0.425 +54 0.470 +55 0.513 +56 0.554 +57 0.594 +58 0.632 +59 0.668 +60 0.703 +61 0.736 +62 0.768 +63 0.798 +64 0.828 +65 0.856 +66 0.884 +67 0.911 +68 0.937 +69 0.963 +70 0.989 +71 1.015 +72 1.040 +73 1.066 +74 1.093 +75 1.120 +76 1.149 +77 1.178 +78 1.209 +79 1.242 +80 1.276 +81 1.313 +82 1.353 +83 1.395 +84 1.440 +85 1.489 +86 1.542 +87 1.598 +88 1.659 +89 1.725 +90 1.796 +1 -1.718 +2 -1.756 +3 -1.786 +4 -1.809 +5 -1.825 +6 -1.834 +7 -1.837 +8 -1.835 +9 -1.826 +10 -1.812 +11 -1.794 +12 -1.771 +13 -1.743 +14 -1.711 +15 -1.676 +16 -1.637 +17 -1.595 +18 -1.550 +19 -1.503 +20 -1.453 +21 -1.401 +22 -1.347 +23 -1.291 +24 -1.234 +25 -1.176 +26 -1.116 +27 -1.056 +28 -0.995 +29 -0.934 +30 -0.872 +31 -0.810 +32 -0.748 +33 -0.686 +34 -0.625 +35 -0.564 +36 -0.503 +37 -0.443 +38 -0.384 +39 -0.326 +40 -0.269 +41 -0.213 +42 -0.158 +43 -0.104 +44 -0.051 +45 0.000 +46 0.050 +47 0.098 +48 0.145 +49 0.191 +50 0.235 +51 0.278 +52 0.319 +53 0.359 +54 0.397 +55 0.434 +56 0.469 +57 0.503 +58 0.536 +59 0.568 +60 0.598 +61 0.627 +62 0.655 +63 0.683 +64 0.709 +65 0.735 +66 0.760 +67 0.784 +68 0.808 +69 0.832 +70 0.856 +71 0.880 +72 0.904 +73 0.928 +74 0.953 +75 0.979 +76 1.005 +77 1.033 +78 1.062 +79 1.092 +80 1.124 +81 1.159 +82 1.195 +83 1.234 +84 1.275 +85 1.320 +86 1.368 +87 1.419 +88 1.474 +89 1.533 +90 1.597 +1 -1.656 +2 -1.689 +3 -1.716 +4 -1.735 +5 -1.748 +6 -1.755 +7 -1.756 +8 -1.751 +9 -1.741 +10 -1.727 +11 -1.708 +12 -1.684 +13 -1.657 +14 -1.626 +15 -1.591 +16 -1.553 +17 -1.513 +18 -1.469 +19 -1.424 +20 -1.376 +21 -1.326 +22 -1.274 +23 -1.221 +24 -1.166 +25 -1.111 +26 -1.054 +27 -0.997 +28 -0.939 +29 -0.881 +30 -0.822 +31 -0.763 +32 -0.705 +33 -0.646 +34 -0.588 +35 -0.530 +36 -0.473 +37 -0.417 +38 -0.361 +39 -0.306 +40 -0.252 +41 -0.200 +42 -0.148 +43 -0.097 +44 -0.048 +45 0.000 +46 0.047 +47 0.092 +48 0.136 +49 0.179 +50 0.220 +51 0.259 +52 0.298 +53 0.335 +54 0.370 +55 0.404 +56 0.437 +57 0.468 +58 0.498 +59 0.527 +60 0.555 +61 0.582 +62 0.608 +63 0.632 +64 0.656 +65 0.679 +66 0.702 +67 0.724 +68 0.746 +69 0.767 +70 0.788 +71 0.809 +72 0.830 +73 0.852 +74 0.874 +75 0.897 +76 0.920 +77 0.945 +78 0.970 +79 0.997 +80 1.026 +81 1.057 +82 1.089 +83 1.124 +84 1.161 +85 1.201 +86 1.244 +87 1.290 +88 1.340 +89 1.393 +90 1.451 +1 -1.228 +2 -1.262 +3 -1.290 +4 -1.312 +5 -1.329 +6 -1.340 +7 -1.347 +8 -1.349 +9 -1.346 +10 -1.339 +11 -1.328 +12 -1.314 +13 -1.296 +14 -1.274 +15 -1.250 +16 -1.223 +17 -1.194 +18 -1.162 +19 -1.128 +20 -1.092 +21 -1.054 +22 -1.015 +23 -0.974 +24 -0.932 +25 -0.889 +26 -0.845 +27 -0.800 +28 -0.755 +29 -0.709 +30 -0.663 +31 -0.617 +32 -0.570 +33 -0.524 +34 -0.477 +35 -0.431 +36 -0.385 +37 -0.340 +38 -0.295 +39 -0.250 +40 -0.207 +41 -0.164 +42 -0.121 +43 -0.080 +44 -0.040 +45 0.000 +46 0.039 +47 0.076 +48 0.113 +49 0.149 +50 0.183 +51 0.217 +52 0.249 +53 0.281 +54 0.311 +55 0.340 +56 0.369 +57 0.396 +58 0.423 +59 0.449 +60 0.474 +61 0.498 +62 0.521 +63 0.544 +64 0.566 +65 0.588 +66 0.609 +67 0.630 +68 0.651 +69 0.672 +70 0.693 +71 0.714 +72 0.735 +73 0.757 +74 0.779 +75 0.802 +76 0.825 +77 0.850 +78 0.875 +79 0.902 +80 0.931 +81 0.961 +82 0.993 +83 1.026 +84 1.063 +85 1.101 +86 1.142 +87 1.186 +88 1.233 +89 1.283 +90 1.337 +1 -1.042 +2 -1.066 +3 -1.085 +4 -1.099 +5 -1.109 +6 -1.115 +7 -1.117 +8 -1.116 +9 -1.111 +10 -1.103 +11 -1.092 +12 -1.078 +13 -1.061 +14 -1.042 +15 -1.021 +16 -0.997 +17 -0.972 +18 -0.945 +19 -0.916 +20 -0.886 +21 -0.854 +22 -0.821 +23 -0.787 +24 -0.753 +25 -0.717 +26 -0.681 +27 -0.644 +28 -0.607 +29 -0.570 +30 -0.532 +31 -0.494 +32 -0.457 +33 -0.419 +34 -0.381 +35 -0.344 +36 -0.307 +37 -0.271 +38 -0.235 +39 -0.199 +40 -0.164 +41 -0.130 +42 -0.096 +43 -0.063 +44 -0.031 +45 0.000 +46 0.030 +47 0.060 +48 0.089 +49 0.117 +50 0.144 +51 0.170 +52 0.195 +53 0.219 +54 0.243 +55 0.265 +56 0.287 +57 0.308 +58 0.328 +59 0.348 +60 0.366 +61 0.384 +62 0.402 +63 0.419 +64 0.435 +65 0.451 +66 0.466 +67 0.481 +68 0.496 +69 0.511 +70 0.526 +71 0.541 +72 0.556 +73 0.571 +74 0.586 +75 0.602 +76 0.619 +77 0.636 +78 0.654 +79 0.673 +80 0.694 +81 0.715 +82 0.738 +83 0.762 +84 0.788 +85 0.816 +86 0.845 +87 0.877 +88 0.912 +89 0.948 +90 0.988 +1 -0.718 +2 -0.746 +3 -0.770 +4 -0.789 +5 -0.805 +6 -0.817 +7 -0.826 +8 -0.831 +9 -0.833 +10 -0.833 +11 -0.829 +12 -0.823 +13 -0.815 +14 -0.804 +15 -0.791 +16 -0.776 +17 -0.759 +18 -0.741 +19 -0.721 +20 -0.700 +21 -0.677 +22 -0.653 +23 -0.628 +24 -0.602 +25 -0.575 +26 -0.548 +27 -0.520 +28 -0.491 +29 -0.462 +30 -0.433 +31 -0.403 +32 -0.374 +33 -0.344 +34 -0.314 +35 -0.284 +36 -0.254 +37 -0.225 +38 -0.195 +39 -0.166 +40 -0.137 +41 -0.109 +42 -0.081 +43 -0.054 +44 -0.027 +45 0.000 +46 0.026 +47 0.051 +48 0.076 +49 0.100 +50 0.124 +51 0.147 +52 0.170 +53 0.192 +54 0.213 +55 0.234 +56 0.254 +57 0.273 +58 0.293 +59 0.311 +60 0.329 +61 0.347 +62 0.365 +63 0.382 +64 0.399 +65 0.416 +66 0.432 +67 0.449 +68 0.465 +69 0.481 +70 0.498 +71 0.515 +72 0.532 +73 0.549 +74 0.567 +75 0.586 +76 0.605 +77 0.625 +78 0.646 +79 0.667 +80 0.690 +81 0.714 +82 0.740 +83 0.767 +84 0.795 +85 0.825 +86 0.858 +87 0.892 +88 0.928 +89 0.967 +90 1.008 +1 -0.586 +2 -0.603 +3 -0.618 +4 -0.629 +5 -0.638 +6 -0.644 +7 -0.648 +8 -0.649 +9 -0.648 +10 -0.646 +11 -0.641 +12 -0.634 +13 -0.626 +14 -0.616 +15 -0.605 +16 -0.592 +17 -0.578 +18 -0.563 +19 -0.546 +20 -0.529 +21 -0.511 +22 -0.492 +23 -0.472 +24 -0.452 +25 -0.431 +26 -0.410 +27 -0.388 +28 -0.367 +29 -0.344 +30 -0.322 +31 -0.300 +32 -0.277 +33 -0.254 +34 -0.232 +35 -0.210 +36 -0.187 +37 -0.165 +38 -0.143 +39 -0.122 +40 -0.101 +41 -0.080 +42 -0.059 +43 -0.039 +44 -0.019 +45 0.000 +46 0.019 +47 0.037 +48 0.055 +49 0.072 +50 0.089 +51 0.106 +52 0.122 +53 0.137 +54 0.152 +55 0.166 +56 0.180 +57 0.194 +58 0.207 +59 0.220 +60 0.232 +61 0.244 +62 0.256 +63 0.267 +64 0.278 +65 0.289 +66 0.300 +67 0.310 +68 0.321 +69 0.331 +70 0.342 +71 0.353 +72 0.363 +73 0.374 +74 0.386 +75 0.397 +76 0.410 +77 0.422 +78 0.435 +79 0.449 +80 0.464 +81 0.479 +82 0.496 +83 0.513 +84 0.531 +85 0.551 +86 0.572 +87 0.595 +88 0.619 +89 0.645 +90 0.672 +1 -0.336 +2 -0.358 +3 -0.378 +4 -0.395 +5 -0.410 +6 -0.422 +7 -0.432 +8 -0.440 +9 -0.446 +10 -0.450 +11 -0.452 +12 -0.452 +13 -0.450 +14 -0.447 +15 -0.443 +16 -0.437 +17 -0.430 +18 -0.421 +19 -0.412 +20 -0.402 +21 -0.390 +22 -0.378 +23 -0.365 +24 -0.351 +25 -0.337 +26 -0.322 +27 -0.307 +28 -0.291 +29 -0.275 +30 -0.258 +31 -0.241 +32 -0.224 +33 -0.207 +34 -0.189 +35 -0.172 +36 -0.154 +37 -0.137 +38 -0.119 +39 -0.102 +40 -0.085 +41 -0.067 +42 -0.050 +43 -0.033 +44 -0.017 +45 0.000 +46 0.016 +47 0.032 +48 0.048 +49 0.064 +50 0.079 +51 0.094 +52 0.109 +53 0.124 +54 0.138 +55 0.152 +56 0.166 +57 0.179 +58 0.193 +59 0.206 +60 0.219 +61 0.232 +62 0.245 +63 0.258 +64 0.270 +65 0.283 +66 0.296 +67 0.309 +68 0.322 +69 0.335 +70 0.348 +71 0.362 +72 0.375 +73 0.390 +74 0.404 +75 0.419 +76 0.435 +77 0.451 +78 0.468 +79 0.486 +80 0.504 +81 0.523 +82 0.544 +83 0.565 +84 0.588 +85 0.612 +86 0.637 +87 0.663 +88 0.691 +89 0.721 +90 0.752 +1 -0.369 +2 -0.386 +3 -0.401 +4 -0.413 +5 -0.423 +6 -0.431 +7 -0.437 +8 -0.441 +9 -0.444 +10 -0.445 +11 -0.444 +12 -0.442 +13 -0.438 +14 -0.433 +15 -0.427 +16 -0.419 +17 -0.411 +18 -0.402 +19 -0.391 +20 -0.380 +21 -0.368 +22 -0.356 +23 -0.343 +24 -0.329 +25 -0.315 +26 -0.300 +27 -0.285 +28 -0.270 +29 -0.254 +30 -0.238 +31 -0.222 +32 -0.206 +33 -0.189 +34 -0.173 +35 -0.157 +36 -0.141 +37 -0.124 +38 -0.108 +39 -0.092 +40 -0.076 +41 -0.061 +42 -0.045 +43 -0.030 +44 -0.015 +45 0.000 +46 0.015 +47 0.029 +48 0.043 +49 0.056 +50 0.070 +51 0.083 +52 0.096 +53 0.108 +54 0.120 +55 0.132 +56 0.144 +57 0.155 +58 0.166 +59 0.177 +60 0.188 +61 0.198 +62 0.209 +63 0.219 +64 0.229 +65 0.239 +66 0.249 +67 0.259 +68 0.269 +69 0.279 +70 0.289 +71 0.299 +72 0.310 +73 0.321 +74 0.332 +75 0.343 +76 0.355 +77 0.367 +78 0.380 +79 0.394 +80 0.408 +81 0.423 +82 0.438 +83 0.455 +84 0.473 +85 0.491 +86 0.511 +87 0.532 +88 0.554 +89 0.577 +90 0.602 +1 -0.180 +2 -0.205 +3 -0.227 +4 -0.247 +5 -0.265 +6 -0.280 +7 -0.294 +8 -0.305 +9 -0.314 +10 -0.321 +11 -0.327 +12 -0.331 +13 -0.334 +14 -0.335 +15 -0.334 +16 -0.333 +17 -0.330 +18 -0.326 +19 -0.321 +20 -0.314 +21 -0.307 +22 -0.299 +23 -0.291 +24 -0.281 +25 -0.271 +26 -0.260 +27 -0.249 +28 -0.237 +29 -0.225 +30 -0.212 +31 -0.199 +32 -0.186 +33 -0.172 +34 -0.158 +35 -0.144 +36 -0.130 +37 -0.116 +38 -0.101 +39 -0.087 +40 -0.072 +41 -0.058 +42 -0.043 +43 -0.029 +44 -0.014 +45 0.000 +46 0.014 +47 0.028 +48 0.042 +49 0.056 +50 0.070 +51 0.084 +52 0.098 +53 0.111 +54 0.124 +55 0.138 +56 0.151 +57 0.164 +58 0.177 +59 0.190 +60 0.203 +61 0.216 +62 0.229 +63 0.242 +64 0.256 +65 0.269 +66 0.282 +67 0.296 +68 0.310 +69 0.324 +70 0.338 +71 0.353 +72 0.368 +73 0.383 +74 0.399 +75 0.416 +76 0.433 +77 0.451 +78 0.469 +79 0.488 +80 0.508 +81 0.529 +82 0.551 +83 0.574 +84 0.598 +85 0.624 +86 0.650 +87 0.678 +88 0.708 +89 0.738 +90 0.771 +1 -0.286 +2 -0.303 +3 -0.319 +4 -0.333 +5 -0.344 +6 -0.353 +7 -0.361 +8 -0.367 +9 -0.371 +10 -0.374 +11 -0.375 +12 -0.374 +13 -0.373 +14 -0.370 +15 -0.366 +16 -0.361 +17 -0.355 +18 -0.347 +19 -0.339 +20 -0.331 +21 -0.321 +22 -0.311 +23 -0.300 +24 -0.288 +25 -0.276 +26 -0.264 +27 -0.251 +28 -0.238 +29 -0.225 +30 -0.211 +31 -0.197 +32 -0.183 +33 -0.169 +34 -0.155 +35 -0.140 +36 -0.126 +37 -0.111 +38 -0.097 +39 -0.083 +40 -0.069 +41 -0.055 +42 -0.041 +43 -0.027 +44 -0.013 +45 0.000 +46 0.013 +47 0.026 +48 0.039 +49 0.052 +50 0.064 +51 0.076 +52 0.088 +53 0.100 +54 0.111 +55 0.122 +56 0.133 +57 0.144 +58 0.155 +59 0.166 +60 0.176 +61 0.186 +62 0.197 +63 0.207 +64 0.217 +65 0.227 +66 0.237 +67 0.247 +68 0.257 +69 0.268 +70 0.278 +71 0.289 +72 0.300 +73 0.311 +74 0.322 +75 0.334 +76 0.347 +77 0.359 +78 0.373 +79 0.387 +80 0.402 +81 0.417 +82 0.433 +83 0.450 +84 0.468 +85 0.487 +86 0.507 +87 0.529 +88 0.551 +89 0.575 +90 0.600 +1 -0.218 +2 -0.266 +3 -0.310 +4 -0.349 +5 -0.384 +6 -0.415 +7 -0.442 +8 -0.466 +9 -0.486 +10 -0.502 +11 -0.516 +12 -0.526 +13 -0.534 +14 -0.539 +15 -0.541 +16 -0.541 +17 -0.539 +18 -0.535 +19 -0.529 +20 -0.520 +21 -0.510 +22 -0.499 +23 -0.486 +24 -0.471 +25 -0.456 +26 -0.439 +27 -0.421 +28 -0.402 +29 -0.382 +30 -0.361 +31 -0.340 +32 -0.317 +33 -0.295 +34 -0.272 +35 -0.248 +36 -0.224 +37 -0.200 +38 -0.175 +39 -0.150 +40 -0.126 +41 -0.101 +42 -0.075 +43 -0.050 +44 -0.025 +45 0.000 +46 0.025 +47 0.050 +48 0.075 +49 0.100 +50 0.125 +51 0.149 +52 0.174 +53 0.198 +54 0.223 +55 0.247 +56 0.272 +57 0.296 +58 0.320 +59 0.344 +60 0.369 +61 0.393 +62 0.418 +63 0.442 +64 0.467 +65 0.493 +66 0.518 +67 0.544 +68 0.570 +69 0.597 +70 0.625 +71 0.653 +72 0.682 +73 0.712 +74 0.743 +75 0.775 +76 0.808 +77 0.842 +78 0.877 +79 0.914 +80 0.953 +81 0.993 +82 1.035 +83 1.079 +84 1.125 +85 1.173 +86 1.223 +87 1.276 +88 1.332 +89 1.390 +90 1.451 +1 -0.311 +2 -0.352 +3 -0.388 +4 -0.420 +5 -0.449 +6 -0.474 +7 -0.495 +8 -0.513 +9 -0.528 +10 -0.540 +11 -0.549 +12 -0.555 +13 -0.559 +14 -0.560 +15 -0.559 +16 -0.556 +17 -0.550 +18 -0.543 +19 -0.534 +20 -0.524 +21 -0.512 +22 -0.498 +23 -0.484 +24 -0.468 +25 -0.451 +26 -0.433 +27 -0.414 +28 -0.394 +29 -0.373 +30 -0.352 +31 -0.330 +32 -0.308 +33 -0.285 +34 -0.262 +35 -0.239 +36 -0.215 +37 -0.191 +38 -0.168 +39 -0.144 +40 -0.119 +41 -0.095 +42 -0.071 +43 -0.048 +44 -0.024 +45 0.000 +46 0.024 +47 0.047 +48 0.070 +49 0.093 +50 0.116 +51 0.139 +52 0.161 +53 0.183 +54 0.205 +55 0.227 +56 0.249 +57 0.270 +58 0.292 +59 0.313 +60 0.334 +61 0.356 +62 0.377 +63 0.398 +64 0.420 +65 0.442 +66 0.463 +67 0.485 +68 0.508 +69 0.531 +70 0.554 +71 0.578 +72 0.602 +73 0.627 +74 0.653 +75 0.680 +76 0.708 +77 0.737 +78 0.767 +79 0.798 +80 0.830 +81 0.864 +82 0.900 +83 0.937 +84 0.976 +85 1.018 +86 1.061 +87 1.106 +88 1.154 +89 1.204 +90 1.257 +1 -0.312 +2 -0.363 +3 -0.409 +4 -0.450 +5 -0.486 +6 -0.518 +7 -0.546 +8 -0.569 +9 -0.589 +10 -0.605 +11 -0.618 +12 -0.627 +13 -0.634 +14 -0.637 +15 -0.638 +16 -0.636 +17 -0.631 +18 -0.624 +19 -0.615 +20 -0.604 +21 -0.592 +22 -0.577 +23 -0.561 +24 -0.543 +25 -0.524 +26 -0.504 +27 -0.482 +28 -0.460 +29 -0.436 +30 -0.412 +31 -0.387 +32 -0.361 +33 -0.335 +34 -0.308 +35 -0.281 +36 -0.254 +37 -0.226 +38 -0.198 +39 -0.170 +40 -0.141 +41 -0.113 +42 -0.085 +43 -0.056 +44 -0.028 +45 0.000 +46 0.028 +47 0.056 +48 0.084 +49 0.111 +50 0.139 +51 0.166 +52 0.193 +53 0.220 +54 0.246 +55 0.273 +56 0.299 +57 0.326 +58 0.352 +59 0.378 +60 0.404 +61 0.430 +62 0.457 +63 0.483 +64 0.509 +65 0.536 +66 0.563 +67 0.591 +68 0.619 +69 0.647 +70 0.676 +71 0.706 +72 0.736 +73 0.767 +74 0.800 +75 0.833 +76 0.868 +77 0.904 +78 0.941 +79 0.980 +80 1.020 +81 1.062 +82 1.107 +83 1.153 +84 1.201 +85 1.252 +86 1.305 +87 1.361 +88 1.420 +89 1.482 +90 1.547 +1 -0.443 +2 -0.483 +3 -0.519 +4 -0.551 +5 -0.578 +6 -0.601 +7 -0.621 +8 -0.637 +9 -0.650 +10 -0.659 +11 -0.666 +12 -0.669 +13 -0.670 +14 -0.668 +15 -0.664 +16 -0.657 +17 -0.649 +18 -0.638 +19 -0.625 +20 -0.611 +21 -0.595 +22 -0.578 +23 -0.560 +24 -0.540 +25 -0.519 +26 -0.497 +27 -0.474 +28 -0.450 +29 -0.426 +30 -0.401 +31 -0.375 +32 -0.349 +33 -0.323 +34 -0.296 +35 -0.270 +36 -0.242 +37 -0.215 +38 -0.188 +39 -0.161 +40 -0.134 +41 -0.107 +42 -0.080 +43 -0.053 +44 -0.026 +45 0.000 +46 0.026 +47 0.052 +48 0.077 +49 0.102 +50 0.127 +51 0.152 +52 0.176 +53 0.200 +54 0.224 +55 0.247 +56 0.270 +57 0.293 +58 0.315 +59 0.338 +60 0.360 +61 0.382 +62 0.404 +63 0.426 +64 0.448 +65 0.470 +66 0.492 +67 0.515 +68 0.538 +69 0.561 +70 0.584 +71 0.608 +72 0.632 +73 0.658 +74 0.684 +75 0.710 +76 0.738 +77 0.767 +78 0.797 +79 0.828 +80 0.861 +81 0.895 +82 0.931 +83 0.968 +84 1.008 +85 1.049 +86 1.093 +87 1.139 +88 1.188 +89 1.239 +90 1.293 +1 -0.531 +2 -0.580 +3 -0.624 +4 -0.663 +5 -0.696 +6 -0.725 +7 -0.749 +8 -0.768 +9 -0.784 +10 -0.796 +11 -0.804 +12 -0.808 +13 -0.809 +14 -0.807 +15 -0.802 +16 -0.795 +17 -0.784 +18 -0.772 +19 -0.757 +20 -0.740 +21 -0.721 +22 -0.700 +23 -0.678 +24 -0.654 +25 -0.628 +26 -0.602 +27 -0.574 +28 -0.546 +29 -0.516 +30 -0.486 +31 -0.455 +32 -0.424 +33 -0.392 +34 -0.359 +35 -0.327 +36 -0.294 +37 -0.261 +38 -0.228 +39 -0.195 +40 -0.162 +41 -0.129 +42 -0.097 +43 -0.064 +44 -0.032 +45 0.000 +46 0.032 +47 0.063 +48 0.094 +49 0.124 +50 0.155 +51 0.184 +52 0.214 +53 0.243 +54 0.272 +55 0.300 +56 0.328 +57 0.356 +58 0.383 +59 0.411 +60 0.438 +61 0.464 +62 0.491 +63 0.518 +64 0.545 +65 0.572 +66 0.599 +67 0.626 +68 0.654 +69 0.682 +70 0.710 +71 0.739 +72 0.769 +73 0.799 +74 0.831 +75 0.863 +76 0.897 +77 0.932 +78 0.968 +79 1.006 +80 1.046 +81 1.087 +82 1.131 +83 1.176 +84 1.224 +85 1.274 +86 1.327 +87 1.383 +88 1.442 +89 1.504 +90 1.569 +1 -0.723 +2 -0.764 +3 -0.800 +4 -0.831 +5 -0.857 +6 -0.878 +7 -0.895 +8 -0.908 +9 -0.917 +10 -0.922 +11 -0.923 +12 -0.921 +13 -0.916 +14 -0.908 +15 -0.897 +16 -0.884 +17 -0.868 +18 -0.850 +19 -0.830 +20 -0.808 +21 -0.784 +22 -0.758 +23 -0.731 +24 -0.703 +25 -0.674 +26 -0.643 +27 -0.612 +28 -0.579 +29 -0.547 +30 -0.513 +31 -0.479 +32 -0.445 +33 -0.410 +34 -0.375 +35 -0.340 +36 -0.305 +37 -0.270 +38 -0.235 +39 -0.201 +40 -0.166 +41 -0.132 +42 -0.099 +43 -0.065 +44 -0.032 +45 0.000 +46 0.032 +47 0.063 +48 0.094 +49 0.125 +50 0.154 +51 0.183 +52 0.212 +53 0.240 +54 0.268 +55 0.294 +56 0.321 +57 0.347 +58 0.372 +59 0.397 +60 0.422 +61 0.446 +62 0.471 +63 0.494 +64 0.518 +65 0.542 +66 0.565 +67 0.589 +68 0.613 +69 0.637 +70 0.661 +71 0.686 +72 0.711 +73 0.737 +74 0.763 +75 0.791 +76 0.819 +77 0.849 +78 0.880 +79 0.912 +80 0.945 +81 0.981 +82 1.018 +83 1.057 +84 1.098 +85 1.142 +86 1.188 +87 1.237 +88 1.288 +89 1.343 +90 1.401 +1 -0.980 +2 -1.035 +3 -1.083 +4 -1.124 +5 -1.158 +6 -1.186 +7 -1.208 +8 -1.225 +9 -1.236 +10 -1.242 +11 -1.244 +12 -1.241 +13 -1.234 +14 -1.223 +15 -1.208 +16 -1.189 +17 -1.168 +18 -1.143 +19 -1.116 +20 -1.086 +21 -1.054 +22 -1.019 +23 -0.983 +24 -0.945 +25 -0.905 +26 -0.864 +27 -0.822 +28 -0.778 +29 -0.734 +30 -0.689 +31 -0.643 +32 -0.597 +33 -0.550 +34 -0.504 +35 -0.457 +36 -0.410 +37 -0.363 +38 -0.316 +39 -0.269 +40 -0.223 +41 -0.178 +42 -0.132 +43 -0.088 +44 -0.043 +45 0.000 +46 0.043 +47 0.085 +48 0.126 +49 0.167 +50 0.207 +51 0.246 +52 0.284 +53 0.322 +54 0.358 +55 0.394 +56 0.430 +57 0.464 +58 0.498 +59 0.532 +60 0.565 +61 0.597 +62 0.629 +63 0.661 +64 0.692 +65 0.724 +66 0.755 +67 0.786 +68 0.818 +69 0.850 +70 0.882 +71 0.915 +72 0.948 +73 0.982 +74 1.018 +75 1.054 +76 1.091 +77 1.130 +78 1.171 +79 1.214 +80 1.258 +81 1.305 +82 1.354 +83 1.406 +84 1.460 +85 1.518 +86 1.579 +87 1.643 +88 1.711 +89 1.783 +90 1.860 +1 -1.223 +2 -1.271 +3 -1.311 +4 -1.345 +5 -1.372 +6 -1.393 +7 -1.408 +8 -1.417 +9 -1.421 +10 -1.420 +11 -1.414 +12 -1.404 +13 -1.390 +14 -1.372 +15 -1.350 +16 -1.325 +17 -1.296 +18 -1.265 +19 -1.231 +20 -1.195 +21 -1.156 +22 -1.115 +23 -1.073 +24 -1.029 +25 -0.983 +26 -0.936 +27 -0.888 +28 -0.840 +29 -0.790 +30 -0.740 +31 -0.689 +32 -0.639 +33 -0.588 +34 -0.536 +35 -0.485 +36 -0.435 +37 -0.384 +38 -0.334 +39 -0.284 +40 -0.235 +41 -0.186 +42 -0.139 +43 -0.092 +44 -0.045 +45 0.000 +46 0.044 +47 0.088 +48 0.130 +49 0.172 +50 0.213 +51 0.252 +52 0.291 +53 0.328 +54 0.365 +55 0.400 +56 0.435 +57 0.469 +58 0.501 +59 0.534 +60 0.565 +61 0.596 +62 0.626 +63 0.655 +64 0.684 +65 0.713 +66 0.741 +67 0.770 +68 0.798 +69 0.826 +70 0.855 +71 0.884 +72 0.913 +73 0.943 +74 0.974 +75 1.006 +76 1.039 +77 1.073 +78 1.109 +79 1.147 +80 1.186 +81 1.228 +82 1.271 +83 1.318 +84 1.367 +85 1.419 +86 1.474 +87 1.533 +88 1.595 +89 1.661 +90 1.732 +1 -1.514 +2 -1.574 +3 -1.625 +4 -1.668 +5 -1.702 +6 -1.728 +7 -1.748 +8 -1.760 +9 -1.765 +10 -1.764 +11 -1.757 +12 -1.745 +13 -1.728 +14 -1.705 +15 -1.679 +16 -1.647 +17 -1.612 +18 -1.574 +19 -1.532 +20 -1.487 +21 -1.439 +22 -1.388 +23 -1.335 +24 -1.281 +25 -1.224 +26 -1.166 +27 -1.107 +28 -1.046 +29 -0.984 +30 -0.922 +31 -0.859 +32 -0.796 +33 -0.732 +34 -0.669 +35 -0.605 +36 -0.542 +37 -0.479 +38 -0.416 +39 -0.354 +40 -0.293 +41 -0.233 +42 -0.173 +43 -0.114 +44 -0.057 +45 0.000 +46 0.055 +47 0.110 +48 0.163 +49 0.215 +50 0.265 +51 0.315 +52 0.363 +53 0.410 +54 0.456 +55 0.500 +56 0.544 +57 0.586 +58 0.627 +59 0.667 +60 0.707 +61 0.745 +62 0.783 +63 0.820 +64 0.856 +65 0.892 +66 0.928 +67 0.964 +68 0.999 +69 1.035 +70 1.071 +71 1.107 +72 1.144 +73 1.182 +74 1.221 +75 1.261 +76 1.302 +77 1.346 +78 1.390 +79 1.437 +80 1.487 +81 1.539 +82 1.594 +83 1.652 +84 1.713 +85 1.778 +86 1.847 +87 1.921 +88 1.999 +89 2.082 +90 2.170 +1 -1.825 +2 -1.881 +3 -1.928 +4 -1.965 +5 -1.994 +6 -2.015 +7 -2.028 +8 -2.033 +9 -2.032 +10 -2.024 +11 -2.010 +12 -1.990 +13 -1.965 +14 -1.935 +15 -1.899 +16 -1.860 +17 -1.817 +18 -1.770 +19 -1.719 +20 -1.665 +21 -1.609 +22 -1.550 +23 -1.488 +24 -1.425 +25 -1.360 +26 -1.294 +27 -1.226 +28 -1.157 +29 -1.087 +30 -1.017 +31 -0.946 +32 -0.875 +33 -0.804 +34 -0.733 +35 -0.663 +36 -0.593 +37 -0.523 +38 -0.454 +39 -0.386 +40 -0.319 +41 -0.253 +42 -0.188 +43 -0.124 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.175 +49 0.230 +50 0.284 +51 0.336 +52 0.387 +53 0.436 +54 0.484 +55 0.530 +56 0.575 +57 0.619 +58 0.661 +59 0.702 +60 0.741 +61 0.780 +62 0.817 +63 0.854 +64 0.890 +65 0.925 +66 0.960 +67 0.994 +68 1.028 +69 1.062 +70 1.096 +71 1.130 +72 1.165 +73 1.201 +74 1.237 +75 1.275 +76 1.313 +77 1.354 +78 1.396 +79 1.440 +80 1.487 +81 1.536 +82 1.588 +83 1.643 +84 1.702 +85 1.765 +86 1.831 +87 1.902 +88 1.978 +89 2.059 +90 2.146 +1 -1.949 +2 -2.010 +3 -2.061 +4 -2.101 +5 -2.133 +6 -2.156 +7 -2.170 +8 -2.177 +9 -2.176 +10 -2.168 +11 -2.153 +12 -2.132 +13 -2.106 +14 -2.073 +15 -2.036 +16 -1.994 +17 -1.948 +18 -1.898 +19 -1.844 +20 -1.786 +21 -1.726 +22 -1.663 +23 -1.597 +24 -1.529 +25 -1.460 +26 -1.388 +27 -1.316 +28 -1.242 +29 -1.167 +30 -1.092 +31 -1.016 +32 -0.940 +33 -0.864 +34 -0.788 +35 -0.712 +36 -0.637 +37 -0.562 +38 -0.488 +39 -0.415 +40 -0.343 +41 -0.272 +42 -0.202 +43 -0.133 +44 -0.066 +45 0.000 +46 0.064 +47 0.127 +48 0.188 +49 0.248 +50 0.306 +51 0.362 +52 0.417 +53 0.470 +54 0.521 +55 0.571 +56 0.619 +57 0.666 +58 0.712 +59 0.756 +60 0.799 +61 0.840 +62 0.881 +63 0.921 +64 0.959 +65 0.998 +66 1.035 +67 1.072 +68 1.109 +69 1.146 +70 1.183 +71 1.220 +72 1.258 +73 1.297 +74 1.336 +75 1.377 +76 1.419 +77 1.463 +78 1.509 +79 1.557 +80 1.607 +81 1.660 +82 1.717 +83 1.777 +84 1.840 +85 1.908 +86 1.980 +87 2.057 +88 2.140 +89 2.227 +90 2.321 +1 -2.258 +2 -2.317 +3 -2.365 +4 -2.403 +5 -2.431 +6 -2.450 +7 -2.459 +8 -2.460 +9 -2.454 +10 -2.440 +11 -2.419 +12 -2.391 +13 -2.357 +14 -2.317 +15 -2.272 +16 -2.222 +17 -2.168 +18 -2.109 +19 -2.047 +20 -1.981 +21 -1.912 +22 -1.840 +23 -1.765 +24 -1.689 +25 -1.610 +26 -1.530 +27 -1.449 +28 -1.366 +29 -1.283 +30 -1.199 +31 -1.115 +32 -1.030 +33 -0.946 +34 -0.862 +35 -0.778 +36 -0.695 +37 -0.613 +38 -0.532 +39 -0.452 +40 -0.373 +41 -0.295 +42 -0.219 +43 -0.144 +44 -0.071 +45 0.000 +46 0.070 +47 0.137 +48 0.203 +49 0.267 +50 0.329 +51 0.389 +52 0.448 +53 0.504 +54 0.558 +55 0.611 +56 0.662 +57 0.711 +58 0.758 +59 0.804 +60 0.848 +61 0.891 +62 0.932 +63 0.972 +64 1.012 +65 1.050 +66 1.088 +67 1.125 +68 1.161 +69 1.198 +70 1.234 +71 1.271 +72 1.308 +73 1.345 +74 1.384 +75 1.423 +76 1.464 +77 1.507 +78 1.552 +79 1.599 +80 1.648 +81 1.700 +82 1.756 +83 1.815 +84 1.878 +85 1.946 +86 2.018 +87 2.095 +88 2.177 +89 2.265 +90 2.360 +1 -2.298 +2 -2.362 +3 -2.414 +4 -2.455 +5 -2.486 +6 -2.507 +7 -2.519 +8 -2.522 +9 -2.517 +10 -2.504 +11 -2.484 +12 -2.457 +13 -2.423 +14 -2.383 +15 -2.338 +16 -2.288 +17 -2.233 +18 -2.173 +19 -2.109 +20 -2.042 +21 -1.972 +22 -1.898 +23 -1.822 +24 -1.743 +25 -1.663 +26 -1.581 +27 -1.497 +28 -1.412 +29 -1.326 +30 -1.240 +31 -1.153 +32 -1.066 +33 -0.979 +34 -0.892 +35 -0.806 +36 -0.720 +37 -0.635 +38 -0.551 +39 -0.468 +40 -0.387 +41 -0.306 +42 -0.227 +43 -0.150 +44 -0.074 +45 0.000 +46 0.072 +47 0.143 +48 0.211 +49 0.278 +50 0.343 +51 0.405 +52 0.466 +53 0.525 +54 0.582 +55 0.637 +56 0.690 +57 0.742 +58 0.792 +59 0.840 +60 0.886 +61 0.932 +62 0.975 +63 1.018 +64 1.060 +65 1.101 +66 1.141 +67 1.180 +68 1.219 +69 1.258 +70 1.297 +71 1.336 +72 1.376 +73 1.416 +74 1.457 +75 1.500 +76 1.544 +77 1.590 +78 1.638 +79 1.688 +80 1.741 +81 1.797 +82 1.856 +83 1.919 +84 1.987 +85 2.058 +86 2.135 +87 2.217 +88 2.304 +89 2.398 +90 2.498 +1 -1.971 +2 -2.019 +3 -2.059 +4 -2.089 +5 -2.111 +6 -2.125 +7 -2.132 +8 -2.131 +9 -2.124 +10 -2.110 +11 -2.091 +12 -2.065 +13 -2.035 +14 -2.000 +15 -1.960 +16 -1.916 +17 -1.868 +18 -1.817 +19 -1.763 +20 -1.705 +21 -1.645 +22 -1.583 +23 -1.518 +24 -1.452 +25 -1.384 +26 -1.315 +27 -1.244 +28 -1.173 +29 -1.101 +30 -1.029 +31 -0.956 +32 -0.884 +33 -0.811 +34 -0.739 +35 -0.667 +36 -0.596 +37 -0.525 +38 -0.455 +39 -0.387 +40 -0.319 +41 -0.252 +42 -0.187 +43 -0.123 +44 -0.061 +45 0.000 +46 0.059 +47 0.117 +48 0.173 +49 0.228 +50 0.281 +51 0.332 +52 0.381 +53 0.429 +54 0.475 +55 0.520 +56 0.563 +57 0.604 +58 0.644 +59 0.683 +60 0.720 +61 0.756 +62 0.790 +63 0.824 +64 0.857 +65 0.889 +66 0.920 +67 0.951 +68 0.981 +69 1.011 +70 1.041 +71 1.071 +72 1.102 +73 1.132 +74 1.164 +75 1.197 +76 1.230 +77 1.265 +78 1.302 +79 1.341 +80 1.381 +81 1.424 +82 1.470 +83 1.519 +84 1.571 +85 1.627 +86 1.687 +87 1.750 +88 1.819 +89 1.892 +90 1.971 +1 -1.250 +2 -1.282 +3 -1.307 +4 -1.327 +5 -1.342 +6 -1.352 +7 -1.356 +8 -1.356 +9 -1.352 +10 -1.344 +11 -1.332 +12 -1.316 +13 -1.297 +14 -1.275 +15 -1.250 +16 -1.222 +17 -1.192 +18 -1.160 +19 -1.125 +20 -1.089 +21 -1.050 +22 -1.011 +23 -0.970 +24 -0.928 +25 -0.884 +26 -0.840 +27 -0.795 +28 -0.750 +29 -0.704 +30 -0.658 +31 -0.612 +32 -0.565 +33 -0.519 +34 -0.473 +35 -0.427 +36 -0.381 +37 -0.336 +38 -0.292 +39 -0.248 +40 -0.204 +41 -0.162 +42 -0.120 +43 -0.079 +44 -0.039 +45 0.000 +46 0.038 +47 0.075 +48 0.111 +49 0.146 +50 0.180 +51 0.213 +52 0.245 +53 0.276 +54 0.305 +55 0.334 +56 0.362 +57 0.388 +58 0.414 +59 0.439 +60 0.463 +61 0.486 +62 0.509 +63 0.531 +64 0.552 +65 0.573 +66 0.593 +67 0.613 +68 0.633 +69 0.652 +70 0.672 +71 0.692 +72 0.712 +73 0.732 +74 0.752 +75 0.774 +76 0.796 +77 0.819 +78 0.843 +79 0.868 +80 0.894 +81 0.923 +82 0.953 +83 0.984 +84 1.018 +85 1.055 +86 1.093 +87 1.135 +88 1.179 +89 1.227 +90 1.278 +1 -0.755 +2 -0.764 +3 -0.770 +4 -0.773 +5 -0.774 +6 -0.773 +7 -0.769 +8 -0.763 +9 -0.756 +10 -0.746 +11 -0.735 +12 -0.722 +13 -0.708 +14 -0.693 +15 -0.676 +16 -0.658 +17 -0.639 +18 -0.619 +19 -0.598 +20 -0.576 +21 -0.554 +22 -0.531 +23 -0.508 +24 -0.484 +25 -0.460 +26 -0.436 +27 -0.411 +28 -0.387 +29 -0.362 +30 -0.337 +31 -0.312 +32 -0.288 +33 -0.263 +34 -0.239 +35 -0.215 +36 -0.192 +37 -0.168 +38 -0.146 +39 -0.123 +40 -0.101 +41 -0.080 +42 -0.059 +43 -0.039 +44 -0.019 +45 0.000 +46 0.018 +47 0.036 +48 0.054 +49 0.070 +50 0.086 +51 0.101 +52 0.116 +53 0.130 +54 0.143 +55 0.155 +56 0.167 +57 0.179 +58 0.189 +59 0.200 +60 0.209 +61 0.218 +62 0.227 +63 0.235 +64 0.243 +65 0.250 +66 0.257 +67 0.264 +68 0.270 +69 0.276 +70 0.282 +71 0.288 +72 0.294 +73 0.300 +74 0.306 +75 0.312 +76 0.318 +77 0.324 +78 0.331 +79 0.339 +80 0.347 +81 0.355 +82 0.365 +83 0.375 +84 0.385 +85 0.397 +86 0.410 +87 0.424 +88 0.440 +89 0.457 +90 0.475 +1 -0.222 +2 -0.228 +3 -0.233 +4 -0.237 +5 -0.240 +6 -0.242 +7 -0.243 +8 -0.244 +9 -0.243 +10 -0.242 +11 -0.240 +12 -0.237 +13 -0.234 +14 -0.230 +15 -0.226 +16 -0.221 +17 -0.216 +18 -0.210 +19 -0.204 +20 -0.197 +21 -0.191 +22 -0.184 +23 -0.176 +24 -0.169 +25 -0.161 +26 -0.153 +27 -0.145 +28 -0.137 +29 -0.128 +30 -0.120 +31 -0.112 +32 -0.103 +33 -0.095 +34 -0.086 +35 -0.078 +36 -0.070 +37 -0.062 +38 -0.053 +39 -0.045 +40 -0.037 +41 -0.030 +42 -0.022 +43 -0.015 +44 -0.007 +45 0.000 +46 0.007 +47 0.014 +48 0.020 +49 0.027 +50 0.033 +51 0.039 +52 0.045 +53 0.051 +54 0.056 +55 0.062 +56 0.067 +57 0.072 +58 0.077 +59 0.081 +60 0.086 +61 0.090 +62 0.094 +63 0.098 +64 0.102 +65 0.106 +66 0.110 +67 0.114 +68 0.118 +69 0.121 +70 0.125 +71 0.129 +72 0.132 +73 0.136 +74 0.140 +75 0.144 +76 0.148 +77 0.153 +78 0.157 +79 0.162 +80 0.167 +81 0.172 +82 0.178 +83 0.184 +84 0.190 +85 0.197 +86 0.204 +87 0.212 +88 0.220 +89 0.229 +90 0.238 +1 0.206 +2 0.215 +3 0.223 +4 0.230 +5 0.236 +6 0.241 +7 0.244 +8 0.246 +9 0.248 +10 0.248 +11 0.248 +12 0.247 +13 0.245 +14 0.242 +15 0.238 +16 0.234 +17 0.230 +18 0.224 +19 0.219 +20 0.212 +21 0.206 +22 0.199 +23 0.191 +24 0.184 +25 0.176 +26 0.168 +27 0.159 +28 0.151 +29 0.142 +30 0.133 +31 0.124 +32 0.115 +33 0.106 +34 0.097 +35 0.088 +36 0.079 +37 0.069 +38 0.060 +39 0.051 +40 0.043 +41 0.034 +42 0.025 +43 0.017 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.031 +50 -0.039 +51 -0.046 +52 -0.053 +53 -0.060 +54 -0.067 +55 -0.074 +56 -0.080 +57 -0.087 +58 -0.093 +59 -0.099 +60 -0.105 +61 -0.111 +62 -0.116 +63 -0.122 +64 -0.128 +65 -0.133 +66 -0.139 +67 -0.144 +68 -0.150 +69 -0.155 +70 -0.161 +71 -0.167 +72 -0.173 +73 -0.178 +74 -0.185 +75 -0.191 +76 -0.197 +77 -0.204 +78 -0.211 +79 -0.219 +80 -0.226 +81 -0.235 +82 -0.243 +83 -0.252 +84 -0.262 +85 -0.272 +86 -0.283 +87 -0.294 +88 -0.306 +89 -0.319 +90 -0.333 +1 0.635 +2 0.644 +3 0.651 +4 0.656 +5 0.658 +6 0.658 +7 0.656 +8 0.653 +9 0.647 +10 0.640 +11 0.632 +12 0.622 +13 0.610 +14 0.598 +15 0.584 +16 0.569 +17 0.553 +18 0.536 +19 0.519 +20 0.501 +21 0.482 +22 0.462 +23 0.442 +24 0.422 +25 0.401 +26 0.380 +27 0.359 +28 0.338 +29 0.316 +30 0.295 +31 0.274 +32 0.252 +33 0.231 +34 0.210 +35 0.189 +36 0.169 +37 0.148 +38 0.128 +39 0.109 +40 0.089 +41 0.071 +42 0.052 +43 0.034 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.062 +50 -0.077 +51 -0.090 +52 -0.103 +53 -0.116 +54 -0.128 +55 -0.139 +56 -0.150 +57 -0.161 +58 -0.171 +59 -0.180 +60 -0.189 +61 -0.198 +62 -0.206 +63 -0.214 +64 -0.221 +65 -0.228 +66 -0.235 +67 -0.242 +68 -0.248 +69 -0.255 +70 -0.261 +71 -0.267 +72 -0.273 +73 -0.280 +74 -0.286 +75 -0.293 +76 -0.299 +77 -0.307 +78 -0.314 +79 -0.322 +80 -0.330 +81 -0.339 +82 -0.349 +83 -0.360 +84 -0.371 +85 -0.383 +86 -0.397 +87 -0.411 +88 -0.427 +89 -0.444 +90 -0.462 +1 0.845 +2 0.860 +3 0.872 +4 0.881 +5 0.886 +6 0.888 +7 0.888 +8 0.885 +9 0.879 +10 0.871 +11 0.860 +12 0.848 +13 0.834 +14 0.817 +15 0.800 +16 0.780 +17 0.759 +18 0.737 +19 0.714 +20 0.689 +21 0.664 +22 0.638 +23 0.611 +24 0.583 +25 0.555 +26 0.527 +27 0.498 +28 0.469 +29 0.439 +30 0.410 +31 0.381 +32 0.351 +33 0.322 +34 0.293 +35 0.264 +36 0.235 +37 0.207 +38 0.180 +39 0.152 +40 0.125 +41 0.099 +42 0.073 +43 0.048 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.067 +49 -0.088 +50 -0.109 +51 -0.128 +52 -0.147 +53 -0.165 +54 -0.182 +55 -0.199 +56 -0.215 +57 -0.230 +58 -0.245 +59 -0.259 +60 -0.273 +61 -0.286 +62 -0.298 +63 -0.310 +64 -0.321 +65 -0.332 +66 -0.343 +67 -0.354 +68 -0.364 +69 -0.374 +70 -0.384 +71 -0.394 +72 -0.404 +73 -0.414 +74 -0.425 +75 -0.435 +76 -0.446 +77 -0.458 +78 -0.470 +79 -0.483 +80 -0.497 +81 -0.511 +82 -0.527 +83 -0.543 +84 -0.561 +85 -0.580 +86 -0.601 +87 -0.623 +88 -0.647 +89 -0.673 +90 -0.701 +1 1.157 +2 1.169 +3 1.177 +4 1.182 +5 1.182 +6 1.179 +7 1.173 +8 1.163 +9 1.151 +10 1.136 +11 1.119 +12 1.099 +13 1.077 +14 1.052 +15 1.026 +16 0.999 +17 0.970 +18 0.939 +19 0.907 +20 0.874 +21 0.840 +22 0.805 +23 0.769 +24 0.733 +25 0.696 +26 0.659 +27 0.622 +28 0.584 +29 0.547 +30 0.509 +31 0.472 +32 0.434 +33 0.397 +34 0.361 +35 0.324 +36 0.289 +37 0.254 +38 0.219 +39 0.185 +40 0.152 +41 0.120 +42 0.089 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.054 +48 -0.080 +49 -0.105 +50 -0.129 +51 -0.151 +52 -0.173 +53 -0.194 +54 -0.213 +55 -0.232 +56 -0.250 +57 -0.267 +58 -0.282 +59 -0.297 +60 -0.312 +61 -0.325 +62 -0.337 +63 -0.349 +64 -0.360 +65 -0.371 +66 -0.381 +67 -0.390 +68 -0.400 +69 -0.408 +70 -0.417 +71 -0.425 +72 -0.434 +73 -0.442 +74 -0.451 +75 -0.459 +76 -0.468 +77 -0.478 +78 -0.488 +79 -0.499 +80 -0.510 +81 -0.523 +82 -0.536 +83 -0.551 +84 -0.567 +85 -0.584 +86 -0.604 +87 -0.625 +88 -0.648 +89 -0.673 +90 -0.700 +1 1.176 +2 1.191 +3 1.202 +4 1.208 +5 1.211 +6 1.210 +7 1.205 +8 1.197 +9 1.186 +10 1.172 +11 1.155 +12 1.136 +13 1.114 +14 1.090 +15 1.064 +16 1.036 +17 1.007 +18 0.976 +19 0.943 +20 0.909 +21 0.875 +22 0.839 +23 0.802 +24 0.765 +25 0.727 +26 0.689 +27 0.650 +28 0.611 +29 0.572 +30 0.533 +31 0.494 +32 0.455 +33 0.417 +34 0.379 +35 0.341 +36 0.304 +37 0.267 +38 0.231 +39 0.195 +40 0.161 +41 0.127 +42 0.094 +43 0.062 +44 0.030 +45 -0.000 +46 -0.029 +47 -0.058 +48 -0.085 +49 -0.111 +50 -0.137 +51 -0.161 +52 -0.184 +53 -0.206 +54 -0.227 +55 -0.248 +56 -0.267 +57 -0.285 +58 -0.302 +59 -0.319 +60 -0.334 +61 -0.349 +62 -0.363 +63 -0.376 +64 -0.389 +65 -0.401 +66 -0.413 +67 -0.424 +68 -0.434 +69 -0.445 +70 -0.455 +71 -0.465 +72 -0.475 +73 -0.485 +74 -0.495 +75 -0.506 +76 -0.517 +77 -0.529 +78 -0.541 +79 -0.554 +80 -0.567 +81 -0.582 +82 -0.598 +83 -0.615 +84 -0.634 +85 -0.655 +86 -0.677 +87 -0.701 +88 -0.727 +89 -0.756 +90 -0.787 +1 1.461 +2 1.475 +3 1.483 +4 1.487 +5 1.486 +6 1.481 +7 1.472 +8 1.459 +9 1.443 +10 1.423 +11 1.400 +12 1.374 +13 1.346 +14 1.315 +15 1.282 +16 1.247 +17 1.210 +18 1.171 +19 1.131 +20 1.089 +21 1.046 +22 1.002 +23 0.958 +24 0.912 +25 0.866 +26 0.820 +27 0.773 +28 0.726 +29 0.679 +30 0.632 +31 0.585 +32 0.539 +33 0.493 +34 0.447 +35 0.402 +36 0.358 +37 0.314 +38 0.271 +39 0.230 +40 0.189 +41 0.149 +42 0.110 +43 0.072 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.067 +48 -0.099 +49 -0.129 +50 -0.158 +51 -0.186 +52 -0.213 +53 -0.238 +54 -0.262 +55 -0.285 +56 -0.306 +57 -0.327 +58 -0.346 +59 -0.364 +60 -0.381 +61 -0.396 +62 -0.411 +63 -0.425 +64 -0.439 +65 -0.451 +66 -0.463 +67 -0.474 +68 -0.484 +69 -0.494 +70 -0.504 +71 -0.514 +72 -0.523 +73 -0.532 +74 -0.542 +75 -0.552 +76 -0.562 +77 -0.572 +78 -0.584 +79 -0.596 +80 -0.609 +81 -0.623 +82 -0.639 +83 -0.655 +84 -0.674 +85 -0.694 +86 -0.717 +87 -0.741 +88 -0.768 +89 -0.798 +90 -0.830 +1 1.266 +2 1.277 +3 1.285 +4 1.288 +5 1.287 +6 1.283 +7 1.275 +8 1.264 +9 1.249 +10 1.232 +11 1.212 +12 1.190 +13 1.166 +14 1.139 +15 1.110 +16 1.080 +17 1.048 +18 1.014 +19 0.979 +20 0.943 +21 0.906 +22 0.868 +23 0.829 +24 0.790 +25 0.750 +26 0.710 +27 0.669 +28 0.628 +29 0.588 +30 0.547 +31 0.507 +32 0.466 +33 0.426 +34 0.387 +35 0.348 +36 0.310 +37 0.272 +38 0.235 +39 0.199 +40 0.163 +41 0.129 +42 0.095 +43 0.062 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.058 +48 -0.086 +49 -0.112 +50 -0.137 +51 -0.161 +52 -0.184 +53 -0.206 +54 -0.227 +55 -0.246 +56 -0.265 +57 -0.282 +58 -0.299 +59 -0.315 +60 -0.329 +61 -0.343 +62 -0.356 +63 -0.368 +64 -0.379 +65 -0.390 +66 -0.400 +67 -0.410 +68 -0.419 +69 -0.428 +70 -0.436 +71 -0.444 +72 -0.452 +73 -0.461 +74 -0.469 +75 -0.477 +76 -0.486 +77 -0.495 +78 -0.505 +79 -0.516 +80 -0.527 +81 -0.540 +82 -0.553 +83 -0.568 +84 -0.584 +85 -0.602 +86 -0.621 +87 -0.643 +88 -0.666 +89 -0.692 +90 -0.720 +1 1.421 +2 1.430 +3 1.434 +4 1.434 +5 1.430 +6 1.422 +7 1.411 +8 1.396 +9 1.378 +10 1.357 +11 1.333 +12 1.306 +13 1.278 +14 1.247 +15 1.214 +16 1.179 +17 1.143 +18 1.105 +19 1.066 +20 1.025 +21 0.984 +22 0.942 +23 0.899 +24 0.855 +25 0.811 +26 0.767 +27 0.722 +28 0.678 +29 0.633 +30 0.589 +31 0.545 +32 0.501 +33 0.458 +34 0.415 +35 0.373 +36 0.331 +37 0.291 +38 0.251 +39 0.212 +40 0.174 +41 0.137 +42 0.101 +43 0.066 +44 0.033 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.090 +49 -0.118 +50 -0.144 +51 -0.169 +52 -0.193 +53 -0.215 +54 -0.237 +55 -0.257 +56 -0.276 +57 -0.293 +58 -0.310 +59 -0.325 +60 -0.339 +61 -0.353 +62 -0.365 +63 -0.376 +64 -0.387 +65 -0.397 +66 -0.406 +67 -0.414 +68 -0.422 +69 -0.429 +70 -0.436 +71 -0.443 +72 -0.449 +73 -0.456 +74 -0.462 +75 -0.469 +76 -0.476 +77 -0.483 +78 -0.491 +79 -0.499 +80 -0.508 +81 -0.519 +82 -0.530 +83 -0.543 +84 -0.557 +85 -0.572 +86 -0.590 +87 -0.609 +88 -0.631 +89 -0.655 +90 -0.681 +1 1.104 +2 1.109 +3 1.111 +4 1.109 +5 1.104 +6 1.096 +7 1.086 +8 1.073 +9 1.058 +10 1.041 +11 1.022 +12 1.000 +13 0.978 +14 0.953 +15 0.927 +16 0.900 +17 0.871 +18 0.842 +19 0.811 +20 0.780 +21 0.748 +22 0.715 +23 0.682 +24 0.649 +25 0.615 +26 0.581 +27 0.547 +28 0.513 +29 0.479 +30 0.445 +31 0.411 +32 0.378 +33 0.345 +34 0.313 +35 0.281 +36 0.249 +37 0.219 +38 0.188 +39 0.159 +40 0.130 +41 0.103 +42 0.076 +43 0.050 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.067 +49 -0.088 +50 -0.107 +51 -0.125 +52 -0.143 +53 -0.159 +54 -0.175 +55 -0.189 +56 -0.203 +57 -0.216 +58 -0.227 +59 -0.238 +60 -0.248 +61 -0.258 +62 -0.266 +63 -0.274 +64 -0.281 +65 -0.287 +66 -0.293 +67 -0.298 +68 -0.303 +69 -0.308 +70 -0.312 +71 -0.316 +72 -0.320 +73 -0.323 +74 -0.327 +75 -0.331 +76 -0.335 +77 -0.339 +78 -0.343 +79 -0.348 +80 -0.354 +81 -0.360 +82 -0.367 +83 -0.375 +84 -0.384 +85 -0.395 +86 -0.406 +87 -0.419 +88 -0.434 +89 -0.450 +90 -0.468 +1 1.205 +2 1.208 +3 1.208 +4 1.205 +5 1.198 +6 1.188 +7 1.176 +8 1.161 +9 1.144 +10 1.124 +11 1.102 +12 1.079 +13 1.053 +14 1.026 +15 0.997 +16 0.968 +17 0.936 +18 0.904 +19 0.871 +20 0.837 +21 0.802 +22 0.767 +23 0.731 +24 0.694 +25 0.658 +26 0.621 +27 0.585 +28 0.548 +29 0.511 +30 0.475 +31 0.439 +32 0.403 +33 0.368 +34 0.333 +35 0.299 +36 0.265 +37 0.232 +38 0.200 +39 0.169 +40 0.139 +41 0.109 +42 0.080 +43 0.052 +44 0.026 +45 -0.000 +46 -0.025 +47 -0.048 +48 -0.071 +49 -0.092 +50 -0.113 +51 -0.132 +52 -0.150 +53 -0.168 +54 -0.184 +55 -0.199 +56 -0.213 +57 -0.226 +58 -0.238 +59 -0.249 +60 -0.259 +61 -0.268 +62 -0.276 +63 -0.284 +64 -0.291 +65 -0.297 +66 -0.302 +67 -0.307 +68 -0.312 +69 -0.315 +70 -0.319 +71 -0.322 +72 -0.325 +73 -0.328 +74 -0.331 +75 -0.334 +76 -0.337 +77 -0.340 +78 -0.344 +79 -0.348 +80 -0.352 +81 -0.358 +82 -0.364 +83 -0.371 +84 -0.379 +85 -0.388 +86 -0.399 +87 -0.411 +88 -0.425 +89 -0.441 +90 -0.458 +1 0.805 +2 0.805 +3 0.803 +4 0.798 +5 0.792 +6 0.784 +7 0.774 +8 0.763 +9 0.750 +10 0.736 +11 0.720 +12 0.704 +13 0.686 +14 0.667 +15 0.648 +16 0.628 +17 0.607 +18 0.585 +19 0.563 +20 0.540 +21 0.517 +22 0.493 +23 0.470 +24 0.446 +25 0.422 +26 0.398 +27 0.374 +28 0.350 +29 0.327 +30 0.303 +31 0.280 +32 0.257 +33 0.234 +34 0.212 +35 0.190 +36 0.168 +37 0.147 +38 0.127 +39 0.107 +40 0.087 +41 0.069 +42 0.050 +43 0.033 +44 0.016 +45 -0.000 +46 -0.015 +47 -0.030 +48 -0.044 +49 -0.057 +50 -0.070 +51 -0.082 +52 -0.093 +53 -0.103 +54 -0.113 +55 -0.122 +56 -0.130 +57 -0.137 +58 -0.144 +59 -0.151 +60 -0.156 +61 -0.161 +62 -0.166 +63 -0.169 +64 -0.173 +65 -0.176 +66 -0.178 +67 -0.180 +68 -0.182 +69 -0.183 +70 -0.184 +71 -0.185 +72 -0.185 +73 -0.186 +74 -0.186 +75 -0.187 +76 -0.187 +77 -0.188 +78 -0.189 +79 -0.190 +80 -0.191 +81 -0.193 +82 -0.195 +83 -0.198 +84 -0.201 +85 -0.205 +86 -0.210 +87 -0.216 +88 -0.223 +89 -0.231 +90 -0.240 +1 0.829 +2 0.831 +3 0.830 +4 0.828 +5 0.823 +6 0.816 +7 0.808 +8 0.797 +9 0.785 +10 0.771 +11 0.756 +12 0.740 +13 0.722 +14 0.704 +15 0.684 +16 0.663 +17 0.642 +18 0.620 +19 0.597 +20 0.573 +21 0.549 +22 0.525 +23 0.500 +24 0.476 +25 0.450 +26 0.425 +27 0.400 +28 0.375 +29 0.350 +30 0.325 +31 0.300 +32 0.276 +33 0.252 +34 0.228 +35 0.204 +36 0.181 +37 0.159 +38 0.137 +39 0.116 +40 0.095 +41 0.074 +42 0.055 +43 0.036 +44 0.018 +45 -0.000 +46 -0.017 +47 -0.033 +48 -0.048 +49 -0.063 +50 -0.077 +51 -0.090 +52 -0.103 +53 -0.114 +54 -0.125 +55 -0.136 +56 -0.145 +57 -0.154 +58 -0.162 +59 -0.170 +60 -0.176 +61 -0.183 +62 -0.188 +63 -0.193 +64 -0.198 +65 -0.202 +66 -0.206 +67 -0.209 +68 -0.212 +69 -0.215 +70 -0.217 +71 -0.219 +72 -0.221 +73 -0.223 +74 -0.225 +75 -0.227 +76 -0.229 +77 -0.231 +78 -0.234 +79 -0.236 +80 -0.240 +81 -0.243 +82 -0.247 +83 -0.252 +84 -0.258 +85 -0.264 +86 -0.272 +87 -0.280 +88 -0.289 +89 -0.300 +90 -0.312 +1 0.356 +2 0.352 +3 0.348 +4 0.343 +5 0.337 +6 0.331 +7 0.324 +8 0.317 +9 0.310 +10 0.302 +11 0.294 +12 0.285 +13 0.276 +14 0.267 +15 0.258 +16 0.249 +17 0.239 +18 0.229 +19 0.220 +20 0.210 +21 0.200 +22 0.190 +23 0.180 +24 0.170 +25 0.160 +26 0.150 +27 0.140 +28 0.131 +29 0.121 +30 0.112 +31 0.103 +32 0.094 +33 0.085 +34 0.077 +35 0.068 +36 0.060 +37 0.052 +38 0.045 +39 0.037 +40 0.030 +41 0.024 +42 0.017 +43 0.011 +44 0.005 +45 -0.000 +46 -0.005 +47 -0.010 +48 -0.014 +49 -0.019 +50 -0.022 +51 -0.026 +52 -0.029 +53 -0.032 +54 -0.034 +55 -0.037 +56 -0.038 +57 -0.040 +58 -0.041 +59 -0.042 +60 -0.043 +61 -0.043 +62 -0.043 +63 -0.043 +64 -0.043 +65 -0.042 +66 -0.041 +67 -0.040 +68 -0.039 +69 -0.038 +70 -0.036 +71 -0.034 +72 -0.032 +73 -0.030 +74 -0.028 +75 -0.026 +76 -0.024 +77 -0.022 +78 -0.020 +79 -0.018 +80 -0.016 +81 -0.014 +82 -0.012 +83 -0.010 +84 -0.009 +85 -0.007 +86 -0.006 +87 -0.006 +88 -0.005 +89 -0.005 +90 -0.005 +1 0.302 +2 0.303 +3 0.303 +4 0.302 +5 0.301 +6 0.299 +7 0.296 +8 0.292 +9 0.288 +10 0.283 +11 0.278 +12 0.272 +13 0.266 +14 0.259 +15 0.252 +16 0.244 +17 0.236 +18 0.228 +19 0.220 +20 0.211 +21 0.203 +22 0.194 +23 0.185 +24 0.175 +25 0.166 +26 0.157 +27 0.148 +28 0.138 +29 0.129 +30 0.120 +31 0.111 +32 0.102 +33 0.093 +34 0.084 +35 0.075 +36 0.067 +37 0.059 +38 0.051 +39 0.043 +40 0.035 +41 0.027 +42 0.020 +43 0.013 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.023 +50 -0.028 +51 -0.033 +52 -0.038 +53 -0.042 +54 -0.046 +55 -0.050 +56 -0.054 +57 -0.057 +58 -0.060 +59 -0.063 +60 -0.066 +61 -0.068 +62 -0.070 +63 -0.072 +64 -0.074 +65 -0.076 +66 -0.077 +67 -0.078 +68 -0.080 +69 -0.081 +70 -0.082 +71 -0.083 +72 -0.084 +73 -0.085 +74 -0.086 +75 -0.087 +76 -0.088 +77 -0.090 +78 -0.091 +79 -0.092 +80 -0.094 +81 -0.096 +82 -0.098 +83 -0.101 +84 -0.104 +85 -0.107 +86 -0.110 +87 -0.114 +88 -0.119 +89 -0.124 +90 -0.129 +1 -0.169 +2 -0.171 +3 -0.172 +4 -0.173 +5 -0.173 +6 -0.173 +7 -0.172 +8 -0.171 +9 -0.169 +10 -0.167 +11 -0.164 +12 -0.161 +13 -0.158 +14 -0.155 +15 -0.151 +16 -0.147 +17 -0.143 +18 -0.139 +19 -0.134 +20 -0.129 +21 -0.124 +22 -0.119 +23 -0.114 +24 -0.109 +25 -0.103 +26 -0.098 +27 -0.093 +28 -0.087 +29 -0.082 +30 -0.076 +31 -0.070 +32 -0.065 +33 -0.060 +34 -0.054 +35 -0.049 +36 -0.043 +37 -0.038 +38 -0.033 +39 -0.028 +40 -0.023 +41 -0.018 +42 -0.013 +43 -0.009 +44 -0.004 +45 0.000 +46 0.004 +47 0.008 +48 0.012 +49 0.016 +50 0.020 +51 0.023 +52 0.027 +53 0.030 +54 0.033 +55 0.036 +56 0.039 +57 0.041 +58 0.044 +59 0.046 +60 0.048 +61 0.050 +62 0.052 +63 0.054 +64 0.056 +65 0.058 +66 0.059 +67 0.061 +68 0.062 +69 0.064 +70 0.065 +71 0.066 +72 0.068 +73 0.069 +74 0.070 +75 0.071 +76 0.072 +77 0.074 +78 0.075 +79 0.076 +80 0.078 +81 0.079 +82 0.081 +83 0.083 +84 0.085 +85 0.087 +86 0.089 +87 0.092 +88 0.095 +89 0.098 +90 0.101 +1 -0.146 +2 -0.134 +3 -0.123 +4 -0.112 +5 -0.102 +6 -0.092 +7 -0.084 +8 -0.075 +9 -0.067 +10 -0.060 +11 -0.053 +12 -0.046 +13 -0.040 +14 -0.034 +15 -0.029 +16 -0.024 +17 -0.019 +18 -0.015 +19 -0.011 +20 -0.007 +21 -0.004 +22 -0.001 +23 0.001 +24 0.004 +25 0.006 +26 0.007 +27 0.009 +28 0.010 +29 0.011 +30 0.012 +31 0.013 +32 0.013 +33 0.013 +34 0.013 +35 0.013 +36 0.012 +37 0.012 +38 0.011 +39 0.010 +40 0.008 +41 0.007 +42 0.006 +43 0.004 +44 0.002 +45 -0.000 +46 -0.002 +47 -0.004 +48 -0.007 +49 -0.010 +50 -0.012 +51 -0.015 +52 -0.018 +53 -0.022 +54 -0.025 +55 -0.029 +56 -0.032 +57 -0.036 +58 -0.040 +59 -0.044 +60 -0.049 +61 -0.053 +62 -0.058 +63 -0.063 +64 -0.068 +65 -0.073 +66 -0.079 +67 -0.085 +68 -0.090 +69 -0.097 +70 -0.103 +71 -0.110 +72 -0.116 +73 -0.124 +74 -0.131 +75 -0.139 +76 -0.147 +77 -0.155 +78 -0.163 +79 -0.172 +80 -0.181 +81 -0.191 +82 -0.201 +83 -0.211 +84 -0.222 +85 -0.233 +86 -0.244 +87 -0.256 +88 -0.268 +89 -0.281 +90 -0.294 +1 -0.616 +2 -0.605 +3 -0.593 +4 -0.581 +5 -0.568 +6 -0.554 +7 -0.540 +8 -0.526 +9 -0.511 +10 -0.495 +11 -0.480 +12 -0.464 +13 -0.448 +14 -0.431 +15 -0.415 +16 -0.398 +17 -0.381 +18 -0.364 +19 -0.347 +20 -0.331 +21 -0.314 +22 -0.297 +23 -0.281 +24 -0.264 +25 -0.248 +26 -0.232 +27 -0.216 +28 -0.201 +29 -0.186 +30 -0.171 +31 -0.157 +32 -0.142 +33 -0.129 +34 -0.115 +35 -0.102 +36 -0.090 +37 -0.078 +38 -0.066 +39 -0.055 +40 -0.045 +41 -0.035 +42 -0.025 +43 -0.016 +44 -0.008 +45 0.000 +46 0.007 +47 0.014 +48 0.020 +49 0.026 +50 0.031 +51 0.035 +52 0.039 +53 0.042 +54 0.045 +55 0.047 +56 0.049 +57 0.050 +58 0.050 +59 0.050 +60 0.049 +61 0.048 +62 0.047 +63 0.044 +64 0.042 +65 0.039 +66 0.035 +67 0.031 +68 0.026 +69 0.021 +70 0.016 +71 0.010 +72 0.004 +73 -0.002 +74 -0.009 +75 -0.016 +76 -0.023 +77 -0.030 +78 -0.038 +79 -0.046 +80 -0.054 +81 -0.062 +82 -0.070 +83 -0.078 +84 -0.086 +85 -0.094 +86 -0.102 +87 -0.110 +88 -0.118 +89 -0.126 +90 -0.133 +1 -0.427 +2 -0.395 +3 -0.364 +4 -0.335 +5 -0.307 +6 -0.281 +7 -0.256 +8 -0.232 +9 -0.210 +10 -0.188 +11 -0.169 +12 -0.150 +13 -0.132 +14 -0.116 +15 -0.100 +16 -0.086 +17 -0.072 +18 -0.060 +19 -0.048 +20 -0.038 +21 -0.028 +22 -0.019 +23 -0.011 +24 -0.004 +25 0.002 +26 0.008 +27 0.013 +28 0.017 +29 0.021 +30 0.024 +31 0.026 +32 0.028 +33 0.029 +34 0.030 +35 0.029 +36 0.029 +37 0.028 +38 0.026 +39 0.024 +40 0.021 +41 0.018 +42 0.014 +43 0.010 +44 0.005 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.025 +50 -0.033 +51 -0.040 +52 -0.049 +53 -0.057 +54 -0.067 +55 -0.076 +56 -0.086 +57 -0.097 +58 -0.108 +59 -0.119 +60 -0.131 +61 -0.144 +62 -0.157 +63 -0.170 +64 -0.184 +65 -0.199 +66 -0.214 +67 -0.230 +68 -0.246 +69 -0.263 +70 -0.280 +71 -0.298 +72 -0.317 +73 -0.336 +74 -0.356 +75 -0.377 +76 -0.398 +77 -0.420 +78 -0.443 +79 -0.467 +80 -0.492 +81 -0.517 +82 -0.544 +83 -0.571 +84 -0.599 +85 -0.628 +86 -0.659 +87 -0.690 +88 -0.722 +89 -0.755 +90 -0.790 +1 -0.652 +2 -0.607 +3 -0.563 +4 -0.522 +5 -0.482 +6 -0.444 +7 -0.408 +8 -0.374 +9 -0.342 +10 -0.311 +11 -0.282 +12 -0.254 +13 -0.228 +14 -0.204 +15 -0.181 +16 -0.159 +17 -0.139 +18 -0.120 +19 -0.102 +20 -0.086 +21 -0.071 +22 -0.057 +23 -0.044 +24 -0.032 +25 -0.022 +26 -0.012 +27 -0.004 +28 0.004 +29 0.010 +30 0.016 +31 0.021 +32 0.024 +33 0.027 +34 0.029 +35 0.031 +36 0.031 +37 0.031 +38 0.029 +39 0.027 +40 0.025 +41 0.021 +42 0.017 +43 0.012 +44 0.006 +45 -0.000 +46 -0.007 +47 -0.015 +48 -0.023 +49 -0.032 +50 -0.042 +51 -0.053 +52 -0.064 +53 -0.075 +54 -0.088 +55 -0.101 +56 -0.115 +57 -0.129 +58 -0.145 +59 -0.161 +60 -0.177 +61 -0.195 +62 -0.213 +63 -0.232 +64 -0.251 +65 -0.272 +66 -0.293 +67 -0.315 +68 -0.338 +69 -0.361 +70 -0.386 +71 -0.411 +72 -0.438 +73 -0.465 +74 -0.493 +75 -0.522 +76 -0.553 +77 -0.584 +78 -0.616 +79 -0.650 +80 -0.684 +81 -0.720 +82 -0.757 +83 -0.795 +84 -0.835 +85 -0.875 +86 -0.917 +87 -0.961 +88 -1.006 +89 -1.052 +90 -1.100 +1 -0.508 +2 -0.450 +3 -0.394 +4 -0.343 +5 -0.294 +6 -0.249 +7 -0.206 +8 -0.167 +9 -0.130 +10 -0.096 +11 -0.065 +12 -0.037 +13 -0.010 +14 0.014 +15 0.035 +16 0.055 +17 0.072 +18 0.088 +19 0.101 +20 0.113 +21 0.123 +22 0.132 +23 0.138 +24 0.144 +25 0.148 +26 0.150 +27 0.151 +28 0.151 +29 0.150 +30 0.147 +31 0.143 +32 0.139 +33 0.133 +34 0.126 +35 0.119 +36 0.110 +37 0.101 +38 0.091 +39 0.080 +40 0.068 +41 0.056 +42 0.043 +43 0.029 +44 0.015 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.049 +49 -0.066 +50 -0.084 +51 -0.102 +52 -0.121 +53 -0.141 +54 -0.161 +55 -0.182 +56 -0.203 +57 -0.226 +58 -0.248 +59 -0.271 +60 -0.295 +61 -0.320 +62 -0.345 +63 -0.371 +64 -0.398 +65 -0.426 +66 -0.454 +67 -0.484 +68 -0.514 +69 -0.545 +70 -0.577 +71 -0.610 +72 -0.644 +73 -0.680 +74 -0.716 +75 -0.754 +76 -0.793 +77 -0.834 +78 -0.876 +79 -0.919 +80 -0.964 +81 -1.011 +82 -1.059 +83 -1.109 +84 -1.161 +85 -1.215 +86 -1.271 +87 -1.329 +88 -1.389 +89 -1.452 +90 -1.517 +1 -0.566 +2 -0.513 +3 -0.463 +4 -0.416 +5 -0.372 +6 -0.330 +7 -0.291 +8 -0.254 +9 -0.220 +10 -0.187 +11 -0.157 +12 -0.129 +13 -0.104 +14 -0.080 +15 -0.057 +16 -0.037 +17 -0.019 +18 -0.002 +19 0.014 +20 0.027 +21 0.039 +22 0.050 +23 0.059 +24 0.067 +25 0.074 +26 0.080 +27 0.084 +28 0.087 +29 0.089 +30 0.090 +31 0.090 +32 0.089 +33 0.087 +34 0.084 +35 0.080 +36 0.076 +37 0.070 +38 0.064 +39 0.057 +40 0.049 +41 0.041 +42 0.032 +43 0.022 +44 0.011 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.037 +49 -0.051 +50 -0.065 +51 -0.080 +52 -0.096 +53 -0.112 +54 -0.129 +55 -0.146 +56 -0.165 +57 -0.183 +58 -0.203 +59 -0.223 +60 -0.243 +61 -0.265 +62 -0.287 +63 -0.310 +64 -0.333 +65 -0.358 +66 -0.383 +67 -0.409 +68 -0.436 +69 -0.463 +70 -0.492 +71 -0.522 +72 -0.552 +73 -0.584 +74 -0.617 +75 -0.651 +76 -0.686 +77 -0.722 +78 -0.759 +79 -0.798 +80 -0.838 +81 -0.880 +82 -0.923 +83 -0.967 +84 -1.013 +85 -1.061 +86 -1.111 +87 -1.162 +88 -1.215 +89 -1.270 +90 -1.327 +1 -0.141 +2 -0.086 +3 -0.036 +4 0.010 +5 0.053 +6 0.092 +7 0.127 +8 0.159 +9 0.188 +10 0.214 +11 0.236 +12 0.256 +13 0.273 +14 0.288 +15 0.300 +16 0.310 +17 0.318 +18 0.323 +19 0.327 +20 0.328 +21 0.328 +22 0.326 +23 0.323 +24 0.318 +25 0.312 +26 0.304 +27 0.295 +28 0.285 +29 0.274 +30 0.262 +31 0.249 +32 0.235 +33 0.220 +34 0.205 +35 0.189 +36 0.172 +37 0.155 +38 0.137 +39 0.119 +40 0.100 +41 0.080 +42 0.061 +43 0.041 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.063 +49 -0.085 +50 -0.107 +51 -0.129 +52 -0.151 +53 -0.174 +54 -0.197 +55 -0.220 +56 -0.243 +57 -0.267 +58 -0.291 +59 -0.315 +60 -0.339 +61 -0.364 +62 -0.390 +63 -0.415 +64 -0.442 +65 -0.468 +66 -0.496 +67 -0.524 +68 -0.552 +69 -0.582 +70 -0.612 +71 -0.643 +72 -0.675 +73 -0.708 +74 -0.742 +75 -0.777 +76 -0.813 +77 -0.851 +78 -0.890 +79 -0.931 +80 -0.973 +81 -1.016 +82 -1.062 +83 -1.109 +84 -1.159 +85 -1.210 +86 -1.263 +87 -1.319 +88 -1.378 +89 -1.438 +90 -1.502 +1 -0.124 +2 -0.076 +3 -0.032 +4 0.009 +5 0.047 +6 0.081 +7 0.113 +8 0.141 +9 0.166 +10 0.189 +11 0.209 +12 0.227 +13 0.242 +14 0.255 +15 0.266 +16 0.274 +17 0.281 +18 0.286 +19 0.289 +20 0.291 +21 0.290 +22 0.289 +23 0.286 +24 0.281 +25 0.276 +26 0.269 +27 0.261 +28 0.252 +29 0.243 +30 0.232 +31 0.220 +32 0.208 +33 0.195 +34 0.182 +35 0.167 +36 0.152 +37 0.137 +38 0.121 +39 0.105 +40 0.088 +41 0.071 +42 0.054 +43 0.036 +44 0.018 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.056 +49 -0.075 +50 -0.095 +51 -0.114 +52 -0.134 +53 -0.154 +54 -0.174 +55 -0.195 +56 -0.216 +57 -0.237 +58 -0.258 +59 -0.279 +60 -0.301 +61 -0.323 +62 -0.346 +63 -0.369 +64 -0.392 +65 -0.416 +66 -0.440 +67 -0.465 +68 -0.490 +69 -0.516 +70 -0.543 +71 -0.571 +72 -0.599 +73 -0.628 +74 -0.658 +75 -0.689 +76 -0.722 +77 -0.755 +78 -0.790 +79 -0.825 +80 -0.863 +81 -0.901 +82 -0.942 +83 -0.984 +84 -1.027 +85 -1.073 +86 -1.120 +87 -1.169 +88 -1.221 +89 -1.275 +90 -1.331 +1 0.369 +2 0.421 +3 0.468 +4 0.510 +5 0.547 +6 0.579 +7 0.607 +8 0.631 +9 0.651 +10 0.667 +11 0.679 +12 0.688 +13 0.693 +14 0.695 +15 0.695 +16 0.692 +17 0.686 +18 0.678 +19 0.667 +20 0.655 +21 0.640 +22 0.624 +23 0.606 +24 0.586 +25 0.565 +26 0.543 +27 0.519 +28 0.495 +29 0.469 +30 0.443 +31 0.416 +32 0.388 +33 0.360 +34 0.331 +35 0.301 +36 0.272 +37 0.242 +38 0.212 +39 0.182 +40 0.151 +41 0.121 +42 0.091 +43 0.060 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.118 +50 -0.147 +51 -0.176 +52 -0.205 +53 -0.233 +54 -0.261 +55 -0.289 +56 -0.317 +57 -0.345 +58 -0.372 +59 -0.400 +60 -0.427 +61 -0.454 +62 -0.482 +63 -0.509 +64 -0.536 +65 -0.564 +66 -0.592 +67 -0.620 +68 -0.649 +69 -0.678 +70 -0.708 +71 -0.738 +72 -0.770 +73 -0.802 +74 -0.834 +75 -0.868 +76 -0.904 +77 -0.940 +78 -0.978 +79 -1.017 +80 -1.058 +81 -1.101 +82 -1.146 +83 -1.193 +84 -1.242 +85 -1.294 +86 -1.348 +87 -1.405 +88 -1.464 +89 -1.527 +90 -1.593 +1 0.336 +2 0.374 +3 0.409 +4 0.439 +5 0.466 +6 0.489 +7 0.509 +8 0.526 +9 0.539 +10 0.550 +11 0.557 +12 0.562 +13 0.565 +14 0.566 +15 0.564 +16 0.560 +17 0.554 +18 0.546 +19 0.537 +20 0.526 +21 0.513 +22 0.499 +23 0.484 +24 0.468 +25 0.450 +26 0.432 +27 0.413 +28 0.393 +29 0.372 +30 0.351 +31 0.329 +32 0.307 +33 0.284 +34 0.261 +35 0.238 +36 0.214 +37 0.190 +38 0.167 +39 0.143 +40 0.119 +41 0.095 +42 0.071 +43 0.047 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.069 +49 -0.092 +50 -0.115 +51 -0.137 +52 -0.159 +53 -0.181 +54 -0.203 +55 -0.224 +56 -0.245 +57 -0.266 +58 -0.287 +59 -0.308 +60 -0.329 +61 -0.350 +62 -0.370 +63 -0.391 +64 -0.412 +65 -0.432 +66 -0.453 +67 -0.475 +68 -0.496 +69 -0.518 +70 -0.540 +71 -0.563 +72 -0.586 +73 -0.610 +74 -0.634 +75 -0.659 +76 -0.685 +77 -0.713 +78 -0.741 +79 -0.770 +80 -0.800 +81 -0.832 +82 -0.866 +83 -0.901 +84 -0.937 +85 -0.975 +86 -1.016 +87 -1.058 +88 -1.103 +89 -1.150 +90 -1.199 +1 0.844 +2 0.890 +3 0.930 +4 0.964 +5 0.992 +6 1.015 +7 1.033 +8 1.047 +9 1.056 +10 1.061 +11 1.062 +12 1.059 +13 1.052 +14 1.042 +15 1.029 +16 1.014 +17 0.995 +18 0.974 +19 0.950 +20 0.925 +21 0.897 +22 0.868 +23 0.837 +24 0.804 +25 0.770 +26 0.735 +27 0.699 +28 0.662 +29 0.624 +30 0.586 +31 0.547 +32 0.508 +33 0.468 +34 0.428 +35 0.388 +36 0.348 +37 0.308 +38 0.269 +39 0.229 +40 0.190 +41 0.151 +42 0.112 +43 0.074 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.107 +49 -0.142 +50 -0.176 +51 -0.209 +52 -0.241 +53 -0.273 +54 -0.304 +55 -0.335 +56 -0.364 +57 -0.394 +58 -0.423 +59 -0.451 +60 -0.479 +61 -0.506 +62 -0.533 +63 -0.560 +64 -0.586 +65 -0.613 +66 -0.639 +67 -0.665 +68 -0.692 +69 -0.718 +70 -0.745 +71 -0.772 +72 -0.800 +73 -0.829 +74 -0.858 +75 -0.888 +76 -0.919 +77 -0.951 +78 -0.985 +79 -1.020 +80 -1.057 +81 -1.096 +82 -1.136 +83 -1.179 +84 -1.224 +85 -1.271 +86 -1.322 +87 -1.375 +88 -1.431 +89 -1.491 +90 -1.554 +1 0.734 +2 0.765 +3 0.791 +4 0.814 +5 0.832 +6 0.846 +7 0.857 +8 0.864 +9 0.868 +10 0.868 +11 0.866 +12 0.861 +13 0.853 +14 0.842 +15 0.830 +16 0.815 +17 0.798 +18 0.780 +19 0.759 +20 0.737 +21 0.714 +22 0.689 +23 0.664 +24 0.637 +25 0.609 +26 0.580 +27 0.551 +28 0.521 +29 0.491 +30 0.460 +31 0.429 +32 0.397 +33 0.366 +34 0.334 +35 0.303 +36 0.271 +37 0.240 +38 0.209 +39 0.178 +40 0.147 +41 0.117 +42 0.087 +43 0.057 +44 0.028 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.082 +49 -0.108 +50 -0.134 +51 -0.159 +52 -0.183 +53 -0.207 +54 -0.231 +55 -0.253 +56 -0.275 +57 -0.297 +58 -0.318 +59 -0.339 +60 -0.359 +61 -0.379 +62 -0.398 +63 -0.417 +64 -0.436 +65 -0.455 +66 -0.473 +67 -0.492 +68 -0.510 +69 -0.528 +70 -0.547 +71 -0.566 +72 -0.585 +73 -0.605 +74 -0.625 +75 -0.645 +76 -0.667 +77 -0.689 +78 -0.712 +79 -0.736 +80 -0.761 +81 -0.788 +82 -0.816 +83 -0.845 +84 -0.877 +85 -0.910 +86 -0.945 +87 -0.982 +88 -1.021 +89 -1.063 +90 -1.108 +1 1.208 +2 1.247 +3 1.280 +4 1.306 +5 1.327 +6 1.342 +7 1.352 +8 1.357 +9 1.357 +10 1.353 +11 1.345 +12 1.332 +13 1.316 +14 1.297 +15 1.274 +16 1.248 +17 1.220 +18 1.189 +19 1.155 +20 1.120 +21 1.082 +22 1.043 +23 1.002 +24 0.960 +25 0.917 +26 0.872 +27 0.827 +28 0.781 +29 0.734 +30 0.687 +31 0.640 +32 0.592 +33 0.544 +34 0.496 +35 0.449 +36 0.401 +37 0.354 +38 0.308 +39 0.262 +40 0.216 +41 0.171 +42 0.127 +43 0.084 +44 0.042 +45 -0.000 +46 -0.041 +47 -0.080 +48 -0.119 +49 -0.157 +50 -0.194 +51 -0.230 +52 -0.264 +53 -0.298 +54 -0.331 +55 -0.363 +56 -0.394 +57 -0.424 +58 -0.453 +59 -0.481 +60 -0.508 +61 -0.535 +62 -0.561 +63 -0.587 +64 -0.612 +65 -0.636 +66 -0.661 +67 -0.685 +68 -0.708 +69 -0.732 +70 -0.756 +71 -0.780 +72 -0.804 +73 -0.829 +74 -0.855 +75 -0.881 +76 -0.908 +77 -0.936 +78 -0.965 +79 -0.996 +80 -1.028 +81 -1.062 +82 -1.098 +83 -1.137 +84 -1.177 +85 -1.220 +86 -1.266 +87 -1.315 +88 -1.366 +89 -1.422 +90 -1.481 +1 1.048 +2 1.077 +3 1.102 +4 1.121 +5 1.135 +6 1.145 +7 1.151 +8 1.152 +9 1.150 +10 1.144 +11 1.135 +12 1.123 +13 1.108 +14 1.090 +15 1.070 +16 1.047 +17 1.022 +18 0.995 +19 0.966 +20 0.935 +21 0.903 +22 0.869 +23 0.835 +24 0.799 +25 0.762 +26 0.725 +27 0.686 +28 0.648 +29 0.609 +30 0.569 +31 0.529 +32 0.489 +33 0.450 +34 0.410 +35 0.370 +36 0.331 +37 0.292 +38 0.254 +39 0.215 +40 0.178 +41 0.141 +42 0.105 +43 0.069 +44 0.034 +45 -0.000 +46 -0.033 +47 -0.066 +48 -0.097 +49 -0.128 +50 -0.158 +51 -0.187 +52 -0.215 +53 -0.243 +54 -0.269 +55 -0.294 +56 -0.319 +57 -0.343 +58 -0.366 +59 -0.389 +60 -0.410 +61 -0.431 +62 -0.452 +63 -0.472 +64 -0.491 +65 -0.510 +66 -0.529 +67 -0.547 +68 -0.566 +69 -0.584 +70 -0.602 +71 -0.620 +72 -0.639 +73 -0.657 +74 -0.677 +75 -0.696 +76 -0.717 +77 -0.738 +78 -0.760 +79 -0.783 +80 -0.808 +81 -0.834 +82 -0.861 +83 -0.890 +84 -0.921 +85 -0.953 +86 -0.988 +87 -1.026 +88 -1.066 +89 -1.108 +90 -1.154 +1 1.517 +2 1.557 +3 1.590 +4 1.616 +5 1.635 +6 1.648 +7 1.655 +8 1.656 +9 1.651 +10 1.642 +11 1.628 +12 1.610 +13 1.587 +14 1.561 +15 1.531 +16 1.497 +17 1.461 +18 1.422 +19 1.380 +20 1.336 +21 1.289 +22 1.241 +23 1.191 +24 1.140 +25 1.087 +26 1.033 +27 0.978 +28 0.923 +29 0.867 +30 0.810 +31 0.753 +32 0.696 +33 0.639 +34 0.583 +35 0.526 +36 0.470 +37 0.415 +38 0.360 +39 0.306 +40 0.252 +41 0.200 +42 0.148 +43 0.098 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.138 +49 -0.181 +50 -0.223 +51 -0.264 +52 -0.304 +53 -0.342 +54 -0.379 +55 -0.415 +56 -0.450 +57 -0.483 +58 -0.516 +59 -0.547 +60 -0.577 +61 -0.607 +62 -0.635 +63 -0.663 +64 -0.690 +65 -0.716 +66 -0.742 +67 -0.767 +68 -0.792 +69 -0.817 +70 -0.842 +71 -0.867 +72 -0.892 +73 -0.918 +74 -0.944 +75 -0.971 +76 -0.999 +77 -1.028 +78 -1.058 +79 -1.090 +80 -1.124 +81 -1.159 +82 -1.197 +83 -1.236 +84 -1.279 +85 -1.324 +86 -1.373 +87 -1.424 +88 -1.480 +89 -1.539 +90 -1.602 +1 1.211 +2 1.240 +3 1.264 +4 1.282 +5 1.295 +6 1.303 +7 1.307 +8 1.306 +9 1.301 +10 1.293 +11 1.281 +12 1.265 +13 1.246 +14 1.225 +15 1.200 +16 1.173 +17 1.144 +18 1.112 +19 1.079 +20 1.044 +21 1.007 +22 0.969 +23 0.929 +24 0.889 +25 0.847 +26 0.805 +27 0.762 +28 0.718 +29 0.674 +30 0.630 +31 0.586 +32 0.541 +33 0.497 +34 0.452 +35 0.409 +36 0.365 +37 0.322 +38 0.279 +39 0.237 +40 0.195 +41 0.155 +42 0.115 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.106 +49 -0.140 +50 -0.172 +51 -0.204 +52 -0.234 +53 -0.263 +54 -0.292 +55 -0.319 +56 -0.345 +57 -0.371 +58 -0.395 +59 -0.419 +60 -0.442 +61 -0.464 +62 -0.485 +63 -0.506 +64 -0.526 +65 -0.545 +66 -0.564 +67 -0.583 +68 -0.601 +69 -0.620 +70 -0.638 +71 -0.656 +72 -0.675 +73 -0.693 +74 -0.713 +75 -0.732 +76 -0.752 +77 -0.774 +78 -0.796 +79 -0.819 +80 -0.843 +81 -0.869 +82 -0.896 +83 -0.926 +84 -0.957 +85 -0.990 +86 -1.025 +87 -1.064 +88 -1.104 +89 -1.148 +90 -1.195 +1 1.555 +2 1.593 +3 1.623 +4 1.647 +5 1.664 +6 1.675 +7 1.680 +8 1.679 +9 1.673 +10 1.663 +11 1.647 +12 1.627 +13 1.603 +14 1.576 +15 1.544 +16 1.510 +17 1.472 +18 1.432 +19 1.389 +20 1.343 +21 1.296 +22 1.247 +23 1.196 +24 1.144 +25 1.091 +26 1.036 +27 0.981 +28 0.925 +29 0.868 +30 0.811 +31 0.754 +32 0.697 +33 0.639 +34 0.582 +35 0.526 +36 0.470 +37 0.414 +38 0.359 +39 0.305 +40 0.252 +41 0.199 +42 0.148 +43 0.097 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.092 +48 -0.137 +49 -0.180 +50 -0.222 +51 -0.262 +52 -0.301 +53 -0.339 +54 -0.375 +55 -0.410 +56 -0.444 +57 -0.477 +58 -0.508 +59 -0.539 +60 -0.568 +61 -0.596 +62 -0.624 +63 -0.650 +64 -0.676 +65 -0.701 +66 -0.726 +67 -0.750 +68 -0.774 +69 -0.797 +70 -0.821 +71 -0.845 +72 -0.868 +73 -0.892 +74 -0.917 +75 -0.943 +76 -0.969 +77 -0.996 +78 -1.024 +79 -1.054 +80 -1.086 +81 -1.119 +82 -1.155 +83 -1.193 +84 -1.233 +85 -1.276 +86 -1.322 +87 -1.372 +88 -1.424 +89 -1.481 +90 -1.542 +1 1.210 +2 1.239 +3 1.263 +4 1.281 +5 1.294 +6 1.302 +7 1.306 +8 1.305 +9 1.301 +10 1.292 +11 1.280 +12 1.265 +13 1.246 +14 1.224 +15 1.200 +16 1.173 +17 1.144 +18 1.112 +19 1.079 +20 1.044 +21 1.007 +22 0.969 +23 0.929 +24 0.889 +25 0.847 +26 0.805 +27 0.762 +28 0.718 +29 0.674 +30 0.630 +31 0.586 +32 0.541 +33 0.497 +34 0.452 +35 0.409 +36 0.365 +37 0.322 +38 0.279 +39 0.237 +40 0.195 +41 0.155 +42 0.115 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.106 +49 -0.140 +50 -0.172 +51 -0.204 +52 -0.234 +53 -0.263 +54 -0.292 +55 -0.319 +56 -0.345 +57 -0.371 +58 -0.395 +59 -0.419 +60 -0.442 +61 -0.464 +62 -0.485 +63 -0.506 +64 -0.526 +65 -0.545 +66 -0.564 +67 -0.583 +68 -0.601 +69 -0.620 +70 -0.638 +71 -0.656 +72 -0.675 +73 -0.693 +74 -0.713 +75 -0.732 +76 -0.753 +77 -0.774 +78 -0.796 +79 -0.819 +80 -0.843 +81 -0.869 +82 -0.897 +83 -0.926 +84 -0.957 +85 -0.990 +86 -1.026 +87 -1.064 +88 -1.105 +89 -1.149 +90 -1.196 +1 1.516 +2 1.556 +3 1.589 +4 1.615 +5 1.634 +6 1.647 +7 1.654 +8 1.655 +9 1.651 +10 1.642 +11 1.628 +12 1.609 +13 1.587 +14 1.561 +15 1.531 +16 1.497 +17 1.461 +18 1.422 +19 1.380 +20 1.335 +21 1.289 +22 1.241 +23 1.191 +24 1.139 +25 1.087 +26 1.033 +27 0.978 +28 0.923 +29 0.867 +30 0.810 +31 0.753 +32 0.696 +33 0.639 +34 0.583 +35 0.526 +36 0.470 +37 0.415 +38 0.360 +39 0.306 +40 0.252 +41 0.200 +42 0.148 +43 0.098 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.138 +49 -0.181 +50 -0.223 +51 -0.264 +52 -0.304 +53 -0.342 +54 -0.379 +55 -0.415 +56 -0.450 +57 -0.483 +58 -0.516 +59 -0.547 +60 -0.577 +61 -0.607 +62 -0.635 +63 -0.663 +64 -0.690 +65 -0.716 +66 -0.742 +67 -0.767 +68 -0.792 +69 -0.817 +70 -0.842 +71 -0.867 +72 -0.892 +73 -0.918 +74 -0.944 +75 -0.971 +76 -0.999 +77 -1.028 +78 -1.059 +79 -1.090 +80 -1.124 +81 -1.159 +82 -1.197 +83 -1.237 +84 -1.279 +85 -1.325 +86 -1.373 +87 -1.425 +88 -1.480 +89 -1.540 +90 -1.603 +1 1.045 +2 1.075 +3 1.099 +4 1.118 +5 1.133 +6 1.143 +7 1.149 +8 1.151 +9 1.149 +10 1.143 +11 1.134 +12 1.122 +13 1.107 +14 1.089 +15 1.069 +16 1.046 +17 1.021 +18 0.994 +19 0.965 +20 0.935 +21 0.903 +22 0.869 +23 0.835 +24 0.799 +25 0.762 +26 0.725 +27 0.686 +28 0.648 +29 0.608 +30 0.569 +31 0.529 +32 0.489 +33 0.450 +34 0.410 +35 0.370 +36 0.331 +37 0.292 +38 0.254 +39 0.215 +40 0.178 +41 0.141 +42 0.105 +43 0.069 +44 0.034 +45 -0.000 +46 -0.033 +47 -0.066 +48 -0.097 +49 -0.128 +50 -0.158 +51 -0.187 +52 -0.215 +53 -0.243 +54 -0.269 +55 -0.294 +56 -0.319 +57 -0.343 +58 -0.366 +59 -0.389 +60 -0.410 +61 -0.431 +62 -0.452 +63 -0.472 +64 -0.491 +65 -0.510 +66 -0.529 +67 -0.547 +68 -0.566 +69 -0.584 +70 -0.602 +71 -0.620 +72 -0.639 +73 -0.658 +74 -0.677 +75 -0.696 +76 -0.717 +77 -0.738 +78 -0.760 +79 -0.784 +80 -0.808 +81 -0.834 +82 -0.861 +83 -0.890 +84 -0.921 +85 -0.954 +86 -0.989 +87 -1.026 +88 -1.066 +89 -1.109 +90 -1.155 +1 1.204 +2 1.244 +3 1.277 +4 1.303 +5 1.324 +6 1.339 +7 1.349 +8 1.354 +9 1.355 +10 1.350 +11 1.342 +12 1.330 +13 1.314 +14 1.294 +15 1.272 +16 1.246 +17 1.218 +18 1.187 +19 1.153 +20 1.118 +21 1.081 +22 1.041 +23 1.001 +24 0.959 +25 0.915 +26 0.871 +27 0.826 +28 0.780 +29 0.733 +30 0.686 +31 0.639 +32 0.591 +33 0.543 +34 0.496 +35 0.448 +36 0.401 +37 0.354 +38 0.307 +39 0.261 +40 0.216 +41 0.171 +42 0.127 +43 0.084 +44 0.042 +45 -0.000 +46 -0.041 +47 -0.080 +48 -0.119 +49 -0.157 +50 -0.194 +51 -0.229 +52 -0.264 +53 -0.298 +54 -0.331 +55 -0.363 +56 -0.393 +57 -0.423 +58 -0.452 +59 -0.481 +60 -0.508 +61 -0.535 +62 -0.561 +63 -0.587 +64 -0.612 +65 -0.636 +66 -0.660 +67 -0.684 +68 -0.708 +69 -0.732 +70 -0.756 +71 -0.780 +72 -0.805 +73 -0.829 +74 -0.855 +75 -0.881 +76 -0.908 +77 -0.936 +78 -0.966 +79 -0.997 +80 -1.029 +81 -1.063 +82 -1.099 +83 -1.137 +84 -1.178 +85 -1.221 +86 -1.267 +87 -1.315 +88 -1.367 +89 -1.423 +90 -1.482 +1 0.732 +2 0.763 +3 0.790 +4 0.812 +5 0.830 +6 0.844 +7 0.855 +8 0.862 +9 0.865 +10 0.866 +11 0.864 +12 0.858 +13 0.851 +14 0.840 +15 0.828 +16 0.813 +17 0.796 +18 0.778 +19 0.757 +20 0.736 +21 0.712 +22 0.688 +23 0.662 +24 0.635 +25 0.608 +26 0.579 +27 0.550 +28 0.520 +29 0.490 +30 0.459 +31 0.428 +32 0.397 +33 0.365 +34 0.334 +35 0.302 +36 0.271 +37 0.239 +38 0.208 +39 0.177 +40 0.147 +41 0.117 +42 0.087 +43 0.057 +44 0.028 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.082 +49 -0.108 +50 -0.134 +51 -0.159 +52 -0.183 +53 -0.207 +54 -0.230 +55 -0.253 +56 -0.275 +57 -0.297 +58 -0.318 +59 -0.338 +60 -0.359 +61 -0.378 +62 -0.398 +63 -0.417 +64 -0.436 +65 -0.454 +66 -0.473 +67 -0.491 +68 -0.510 +69 -0.528 +70 -0.547 +71 -0.566 +72 -0.585 +73 -0.605 +74 -0.625 +75 -0.645 +76 -0.667 +77 -0.689 +78 -0.712 +79 -0.736 +80 -0.762 +81 -0.788 +82 -0.816 +83 -0.846 +84 -0.877 +85 -0.910 +86 -0.945 +87 -0.982 +88 -1.022 +89 -1.063 +90 -1.108 +1 0.841 +2 0.887 +3 0.927 +4 0.961 +5 0.989 +6 1.012 +7 1.031 +8 1.044 +9 1.053 +10 1.058 +11 1.059 +12 1.056 +13 1.050 +14 1.040 +15 1.027 +16 1.011 +17 0.993 +18 0.972 +19 0.948 +20 0.923 +21 0.895 +22 0.866 +23 0.835 +24 0.803 +25 0.769 +26 0.734 +27 0.698 +28 0.661 +29 0.623 +30 0.585 +31 0.546 +32 0.507 +33 0.467 +34 0.428 +35 0.388 +36 0.348 +37 0.308 +38 0.268 +39 0.229 +40 0.190 +41 0.151 +42 0.112 +43 0.074 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.107 +49 -0.142 +50 -0.175 +51 -0.208 +52 -0.241 +53 -0.273 +54 -0.304 +55 -0.334 +56 -0.364 +57 -0.394 +58 -0.422 +59 -0.451 +60 -0.478 +61 -0.506 +62 -0.533 +63 -0.560 +64 -0.586 +65 -0.612 +66 -0.639 +67 -0.665 +68 -0.691 +69 -0.718 +70 -0.745 +71 -0.772 +72 -0.800 +73 -0.829 +74 -0.858 +75 -0.888 +76 -0.919 +77 -0.952 +78 -0.985 +79 -1.020 +80 -1.057 +81 -1.096 +82 -1.136 +83 -1.179 +84 -1.224 +85 -1.272 +86 -1.322 +87 -1.375 +88 -1.431 +89 -1.491 +90 -1.554 +1 0.333 +2 0.372 +3 0.406 +4 0.437 +5 0.464 +6 0.487 +7 0.507 +8 0.524 +9 0.538 +10 0.548 +11 0.556 +12 0.562 +13 0.564 +14 0.565 +15 0.563 +16 0.559 +17 0.553 +18 0.546 +19 0.536 +20 0.525 +21 0.513 +22 0.499 +23 0.484 +24 0.468 +25 0.450 +26 0.432 +27 0.413 +28 0.393 +29 0.372 +30 0.351 +31 0.329 +32 0.307 +33 0.284 +34 0.261 +35 0.238 +36 0.214 +37 0.190 +38 0.167 +39 0.143 +40 0.119 +41 0.095 +42 0.071 +43 0.047 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.047 +48 -0.069 +49 -0.092 +50 -0.115 +51 -0.137 +52 -0.159 +53 -0.181 +54 -0.203 +55 -0.224 +56 -0.245 +57 -0.266 +58 -0.287 +59 -0.308 +60 -0.329 +61 -0.350 +62 -0.370 +63 -0.391 +64 -0.412 +65 -0.432 +66 -0.453 +67 -0.475 +68 -0.496 +69 -0.518 +70 -0.540 +71 -0.563 +72 -0.586 +73 -0.610 +74 -0.634 +75 -0.659 +76 -0.685 +77 -0.712 +78 -0.741 +79 -0.770 +80 -0.800 +81 -0.832 +82 -0.866 +83 -0.900 +84 -0.937 +85 -0.975 +86 -1.016 +87 -1.058 +88 -1.103 +89 -1.150 +90 -1.199 +1 0.369 +2 0.421 +3 0.467 +4 0.509 +5 0.546 +6 0.578 +7 0.606 +8 0.630 +9 0.649 +10 0.665 +11 0.677 +12 0.686 +13 0.691 +14 0.694 +15 0.693 +16 0.690 +17 0.684 +18 0.676 +19 0.666 +20 0.653 +21 0.639 +22 0.622 +23 0.604 +24 0.585 +25 0.564 +26 0.542 +27 0.518 +28 0.494 +29 0.468 +30 0.442 +31 0.415 +32 0.387 +33 0.359 +34 0.330 +35 0.301 +36 0.271 +37 0.241 +38 0.211 +39 0.181 +40 0.151 +41 0.121 +42 0.090 +43 0.060 +44 0.030 +45 -0.000 +46 -0.030 +47 -0.060 +48 -0.089 +49 -0.118 +50 -0.147 +51 -0.176 +52 -0.205 +53 -0.233 +54 -0.261 +55 -0.289 +56 -0.317 +57 -0.344 +58 -0.372 +59 -0.399 +60 -0.427 +61 -0.454 +62 -0.481 +63 -0.509 +64 -0.536 +65 -0.564 +66 -0.592 +67 -0.620 +68 -0.649 +69 -0.678 +70 -0.708 +71 -0.738 +72 -0.770 +73 -0.802 +74 -0.835 +75 -0.869 +76 -0.904 +77 -0.940 +78 -0.978 +79 -1.018 +80 -1.059 +81 -1.102 +82 -1.147 +83 -1.194 +84 -1.243 +85 -1.295 +86 -1.349 +87 -1.405 +88 -1.465 +89 -1.528 +90 -1.594 +1 -0.124 +2 -0.076 +3 -0.032 +4 0.009 +5 0.047 +6 0.081 +7 0.113 +8 0.141 +9 0.166 +10 0.189 +11 0.209 +12 0.227 +13 0.242 +14 0.255 +15 0.265 +16 0.274 +17 0.281 +18 0.286 +19 0.289 +20 0.290 +21 0.290 +22 0.289 +23 0.286 +24 0.281 +25 0.276 +26 0.269 +27 0.261 +28 0.252 +29 0.243 +30 0.232 +31 0.220 +32 0.208 +33 0.195 +34 0.182 +35 0.167 +36 0.153 +37 0.137 +38 0.121 +39 0.105 +40 0.088 +41 0.071 +42 0.054 +43 0.036 +44 0.018 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.056 +49 -0.075 +50 -0.095 +51 -0.115 +52 -0.134 +53 -0.154 +54 -0.175 +55 -0.195 +56 -0.216 +57 -0.237 +58 -0.258 +59 -0.280 +60 -0.302 +61 -0.324 +62 -0.346 +63 -0.369 +64 -0.393 +65 -0.416 +66 -0.441 +67 -0.466 +68 -0.491 +69 -0.517 +70 -0.544 +71 -0.572 +72 -0.600 +73 -0.629 +74 -0.659 +75 -0.691 +76 -0.723 +77 -0.756 +78 -0.791 +79 -0.827 +80 -0.864 +81 -0.903 +82 -0.943 +83 -0.985 +84 -1.028 +85 -1.074 +86 -1.121 +87 -1.171 +88 -1.222 +89 -1.276 +90 -1.332 +1 -0.141 +2 -0.086 +3 -0.036 +4 0.010 +5 0.053 +6 0.092 +7 0.127 +8 0.159 +9 0.188 +10 0.213 +11 0.236 +12 0.256 +13 0.273 +14 0.288 +15 0.300 +16 0.310 +17 0.317 +18 0.323 +19 0.326 +20 0.328 +21 0.328 +22 0.326 +23 0.323 +24 0.318 +25 0.312 +26 0.304 +27 0.295 +28 0.285 +29 0.274 +30 0.262 +31 0.249 +32 0.235 +33 0.220 +34 0.205 +35 0.189 +36 0.172 +37 0.155 +38 0.137 +39 0.119 +40 0.100 +41 0.081 +42 0.061 +43 0.041 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.063 +49 -0.085 +50 -0.107 +51 -0.129 +52 -0.152 +53 -0.174 +54 -0.197 +55 -0.220 +56 -0.243 +57 -0.267 +58 -0.291 +59 -0.315 +60 -0.340 +61 -0.365 +62 -0.390 +63 -0.416 +64 -0.442 +65 -0.469 +66 -0.497 +67 -0.525 +68 -0.553 +69 -0.583 +70 -0.613 +71 -0.644 +72 -0.676 +73 -0.709 +74 -0.743 +75 -0.778 +76 -0.815 +77 -0.852 +78 -0.891 +79 -0.932 +80 -0.974 +81 -1.018 +82 -1.063 +83 -1.110 +84 -1.160 +85 -1.211 +86 -1.265 +87 -1.321 +88 -1.379 +89 -1.440 +90 -1.503 +1 -0.564 +2 -0.511 +3 -0.461 +4 -0.414 +5 -0.370 +6 -0.328 +7 -0.289 +8 -0.252 +9 -0.218 +10 -0.185 +11 -0.155 +12 -0.127 +13 -0.101 +14 -0.077 +15 -0.055 +16 -0.035 +17 -0.017 +18 0.000 +19 0.015 +20 0.029 +21 0.041 +22 0.052 +23 0.061 +24 0.069 +25 0.076 +26 0.081 +27 0.085 +28 0.088 +29 0.090 +30 0.091 +31 0.091 +32 0.090 +33 0.088 +34 0.085 +35 0.081 +36 0.076 +37 0.071 +38 0.064 +39 0.057 +40 0.049 +41 0.041 +42 0.032 +43 0.022 +44 0.011 +45 -0.000 +46 -0.012 +47 -0.024 +48 -0.038 +49 -0.051 +50 -0.066 +51 -0.081 +52 -0.096 +53 -0.112 +54 -0.129 +55 -0.147 +56 -0.165 +57 -0.183 +58 -0.203 +59 -0.223 +60 -0.243 +61 -0.265 +62 -0.287 +63 -0.310 +64 -0.333 +65 -0.358 +66 -0.383 +67 -0.409 +68 -0.436 +69 -0.463 +70 -0.492 +71 -0.522 +72 -0.552 +73 -0.584 +74 -0.617 +75 -0.650 +76 -0.685 +77 -0.722 +78 -0.759 +79 -0.798 +80 -0.838 +81 -0.880 +82 -0.923 +83 -0.967 +84 -1.014 +85 -1.062 +86 -1.111 +87 -1.162 +88 -1.216 +89 -1.271 +90 -1.328 +1 -0.507 +2 -0.448 +3 -0.393 +4 -0.341 +5 -0.292 +6 -0.247 +7 -0.204 +8 -0.165 +9 -0.128 +10 -0.094 +11 -0.063 +12 -0.034 +13 -0.008 +14 0.016 +15 0.037 +16 0.057 +17 0.074 +18 0.090 +19 0.103 +20 0.115 +21 0.125 +22 0.133 +23 0.140 +24 0.145 +25 0.149 +26 0.151 +27 0.152 +28 0.152 +29 0.151 +30 0.148 +31 0.144 +32 0.139 +33 0.134 +34 0.127 +35 0.119 +36 0.111 +37 0.101 +38 0.091 +39 0.080 +40 0.069 +41 0.056 +42 0.043 +43 0.029 +44 0.015 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.049 +49 -0.066 +50 -0.084 +51 -0.102 +52 -0.122 +53 -0.141 +54 -0.161 +55 -0.182 +56 -0.204 +57 -0.226 +58 -0.248 +59 -0.272 +60 -0.296 +61 -0.320 +62 -0.345 +63 -0.371 +64 -0.398 +65 -0.426 +66 -0.454 +67 -0.484 +68 -0.514 +69 -0.545 +70 -0.577 +71 -0.610 +72 -0.644 +73 -0.680 +74 -0.716 +75 -0.754 +76 -0.793 +77 -0.834 +78 -0.876 +79 -0.919 +80 -0.964 +81 -1.011 +82 -1.059 +83 -1.109 +84 -1.161 +85 -1.215 +86 -1.272 +87 -1.330 +88 -1.390 +89 -1.453 +90 -1.518 +1 -0.649 +2 -0.604 +3 -0.560 +4 -0.519 +5 -0.479 +6 -0.441 +7 -0.405 +8 -0.371 +9 -0.339 +10 -0.308 +11 -0.279 +12 -0.252 +13 -0.226 +14 -0.202 +15 -0.179 +16 -0.157 +17 -0.137 +18 -0.118 +19 -0.101 +20 -0.084 +21 -0.069 +22 -0.055 +23 -0.043 +24 -0.031 +25 -0.020 +26 -0.011 +27 -0.002 +28 0.005 +29 0.011 +30 0.017 +31 0.022 +32 0.025 +33 0.028 +34 0.030 +35 0.031 +36 0.032 +37 0.031 +38 0.030 +39 0.028 +40 0.025 +41 0.021 +42 0.017 +43 0.012 +44 0.006 +45 -0.000 +46 -0.007 +47 -0.015 +48 -0.023 +49 -0.033 +50 -0.042 +51 -0.053 +52 -0.064 +53 -0.076 +54 -0.088 +55 -0.102 +56 -0.115 +57 -0.130 +58 -0.145 +59 -0.161 +60 -0.178 +61 -0.195 +62 -0.214 +63 -0.233 +64 -0.252 +65 -0.273 +66 -0.294 +67 -0.316 +68 -0.339 +69 -0.362 +70 -0.387 +71 -0.412 +72 -0.439 +73 -0.466 +74 -0.494 +75 -0.524 +76 -0.554 +77 -0.585 +78 -0.617 +79 -0.651 +80 -0.685 +81 -0.721 +82 -0.758 +83 -0.796 +84 -0.836 +85 -0.876 +86 -0.918 +87 -0.962 +88 -1.007 +89 -1.053 +90 -1.101 +1 -0.423 +2 -0.391 +3 -0.360 +4 -0.331 +5 -0.303 +6 -0.277 +7 -0.252 +8 -0.228 +9 -0.205 +10 -0.184 +11 -0.164 +12 -0.146 +13 -0.128 +14 -0.112 +15 -0.096 +16 -0.082 +17 -0.069 +18 -0.056 +19 -0.045 +20 -0.035 +21 -0.025 +22 -0.016 +23 -0.008 +24 -0.001 +25 0.005 +26 0.011 +27 0.016 +28 0.020 +29 0.023 +30 0.026 +31 0.028 +32 0.030 +33 0.031 +34 0.031 +35 0.031 +36 0.030 +37 0.029 +38 0.027 +39 0.024 +40 0.022 +41 0.018 +42 0.014 +43 0.010 +44 0.005 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.018 +49 -0.026 +50 -0.033 +51 -0.041 +52 -0.049 +53 -0.058 +54 -0.067 +55 -0.077 +56 -0.087 +57 -0.098 +58 -0.109 +59 -0.120 +60 -0.132 +61 -0.145 +62 -0.158 +63 -0.171 +64 -0.185 +65 -0.200 +66 -0.215 +67 -0.231 +68 -0.247 +69 -0.264 +70 -0.281 +71 -0.299 +72 -0.318 +73 -0.337 +74 -0.357 +75 -0.378 +76 -0.399 +77 -0.421 +78 -0.444 +79 -0.468 +80 -0.492 +81 -0.518 +82 -0.544 +83 -0.571 +84 -0.599 +85 -0.629 +86 -0.659 +87 -0.690 +88 -0.722 +89 -0.756 +90 -0.790 +1 -0.612 +2 -0.601 +3 -0.590 +4 -0.577 +5 -0.564 +6 -0.550 +7 -0.536 +8 -0.522 +9 -0.507 +10 -0.491 +11 -0.476 +12 -0.460 +13 -0.444 +14 -0.427 +15 -0.411 +16 -0.394 +17 -0.377 +18 -0.361 +19 -0.344 +20 -0.327 +21 -0.311 +22 -0.294 +23 -0.278 +24 -0.262 +25 -0.245 +26 -0.230 +27 -0.214 +28 -0.199 +29 -0.184 +30 -0.169 +31 -0.155 +32 -0.141 +33 -0.127 +34 -0.114 +35 -0.101 +36 -0.089 +37 -0.077 +38 -0.065 +39 -0.055 +40 -0.044 +41 -0.034 +42 -0.025 +43 -0.016 +44 -0.008 +45 0.000 +46 0.007 +47 0.014 +48 0.020 +49 0.025 +50 0.030 +51 0.035 +52 0.038 +53 0.042 +54 0.044 +55 0.046 +56 0.048 +57 0.049 +58 0.049 +59 0.049 +60 0.048 +61 0.047 +62 0.046 +63 0.043 +64 0.041 +65 0.037 +66 0.034 +67 0.030 +68 0.025 +69 0.020 +70 0.015 +71 0.009 +72 0.003 +73 -0.003 +74 -0.010 +75 -0.017 +76 -0.024 +77 -0.031 +78 -0.039 +79 -0.046 +80 -0.054 +81 -0.062 +82 -0.070 +83 -0.078 +84 -0.087 +85 -0.095 +86 -0.103 +87 -0.110 +88 -0.118 +89 -0.126 +90 -0.133 +1 -0.141 +2 -0.129 +3 -0.118 +4 -0.107 +5 -0.097 +6 -0.088 +7 -0.079 +8 -0.070 +9 -0.062 +10 -0.055 +11 -0.048 +12 -0.041 +13 -0.035 +14 -0.030 +15 -0.024 +16 -0.020 +17 -0.015 +18 -0.011 +19 -0.007 +20 -0.004 +21 -0.001 +22 0.002 +23 0.004 +24 0.007 +25 0.008 +26 0.010 +27 0.011 +28 0.013 +29 0.013 +30 0.014 +31 0.014 +32 0.015 +33 0.015 +34 0.014 +35 0.014 +36 0.013 +37 0.012 +38 0.012 +39 0.010 +40 0.009 +41 0.008 +42 0.006 +43 0.004 +44 0.002 +45 -0.000 +46 -0.002 +47 -0.005 +48 -0.007 +49 -0.010 +50 -0.013 +51 -0.016 +52 -0.019 +53 -0.022 +54 -0.026 +55 -0.029 +56 -0.033 +57 -0.037 +58 -0.041 +59 -0.045 +60 -0.050 +61 -0.054 +62 -0.059 +63 -0.064 +64 -0.069 +65 -0.074 +66 -0.080 +67 -0.086 +68 -0.091 +69 -0.098 +70 -0.104 +71 -0.111 +72 -0.117 +73 -0.125 +74 -0.132 +75 -0.140 +76 -0.147 +77 -0.156 +78 -0.164 +79 -0.173 +80 -0.182 +81 -0.192 +82 -0.202 +83 -0.212 +84 -0.222 +85 -0.233 +86 -0.245 +87 -0.257 +88 -0.269 +89 -0.282 +90 -0.295 +1 -0.163 +2 -0.165 +3 -0.166 +4 -0.167 +5 -0.167 +6 -0.167 +7 -0.166 +8 -0.165 +9 -0.163 +10 -0.161 +11 -0.159 +12 -0.156 +13 -0.153 +14 -0.150 +15 -0.147 +16 -0.143 +17 -0.139 +18 -0.135 +19 -0.130 +20 -0.125 +21 -0.121 +22 -0.116 +23 -0.111 +24 -0.106 +25 -0.101 +26 -0.095 +27 -0.090 +28 -0.085 +29 -0.079 +30 -0.074 +31 -0.069 +32 -0.063 +33 -0.058 +34 -0.053 +35 -0.048 +36 -0.042 +37 -0.037 +38 -0.032 +39 -0.027 +40 -0.022 +41 -0.018 +42 -0.013 +43 -0.009 +44 -0.004 +45 0.000 +46 0.004 +47 0.008 +48 0.012 +49 0.016 +50 0.019 +51 0.023 +52 0.026 +53 0.029 +54 0.032 +55 0.035 +56 0.038 +57 0.040 +58 0.043 +59 0.045 +60 0.047 +61 0.050 +62 0.052 +63 0.053 +64 0.055 +65 0.057 +66 0.058 +67 0.060 +68 0.061 +69 0.063 +70 0.064 +71 0.065 +72 0.066 +73 0.068 +74 0.069 +75 0.070 +76 0.071 +77 0.073 +78 0.074 +79 0.075 +80 0.077 +81 0.078 +82 0.080 +83 0.082 +84 0.083 +85 0.086 +86 0.088 +87 0.090 +88 0.093 +89 0.096 +90 0.099 +1 0.307 +2 0.308 +3 0.309 +4 0.308 +5 0.307 +6 0.305 +7 0.302 +8 0.298 +9 0.294 +10 0.289 +11 0.284 +12 0.278 +13 0.272 +14 0.265 +15 0.258 +16 0.250 +17 0.242 +18 0.234 +19 0.225 +20 0.216 +21 0.207 +22 0.198 +23 0.189 +24 0.180 +25 0.170 +26 0.161 +27 0.151 +28 0.142 +29 0.132 +30 0.123 +31 0.114 +32 0.104 +33 0.095 +34 0.086 +35 0.077 +36 0.069 +37 0.060 +38 0.052 +39 0.044 +40 0.036 +41 0.028 +42 0.021 +43 0.014 +44 0.007 +45 -0.000 +46 -0.006 +47 -0.013 +48 -0.018 +49 -0.024 +50 -0.029 +51 -0.034 +52 -0.039 +53 -0.043 +54 -0.048 +55 -0.051 +56 -0.055 +57 -0.058 +58 -0.062 +59 -0.065 +60 -0.067 +61 -0.070 +62 -0.072 +63 -0.074 +64 -0.076 +65 -0.077 +66 -0.079 +67 -0.080 +68 -0.082 +69 -0.083 +70 -0.084 +71 -0.085 +72 -0.086 +73 -0.087 +74 -0.088 +75 -0.089 +76 -0.090 +77 -0.092 +78 -0.093 +79 -0.095 +80 -0.096 +81 -0.098 +82 -0.101 +83 -0.103 +84 -0.106 +85 -0.109 +86 -0.113 +87 -0.117 +88 -0.121 +89 -0.126 +90 -0.132 +1 0.363 +2 0.359 +3 0.355 +4 0.350 +5 0.344 +6 0.338 +7 0.331 +8 0.324 +9 0.317 +10 0.309 +11 0.300 +12 0.292 +13 0.283 +14 0.273 +15 0.264 +16 0.254 +17 0.245 +18 0.235 +19 0.225 +20 0.215 +21 0.205 +22 0.194 +23 0.184 +24 0.174 +25 0.164 +26 0.154 +27 0.144 +28 0.134 +29 0.125 +30 0.115 +31 0.106 +32 0.096 +33 0.087 +34 0.079 +35 0.070 +36 0.062 +37 0.054 +38 0.046 +39 0.039 +40 0.031 +41 0.024 +42 0.018 +43 0.012 +44 0.006 +45 -0.000 +46 -0.005 +47 -0.010 +48 -0.015 +49 -0.019 +50 -0.023 +51 -0.027 +52 -0.030 +53 -0.033 +54 -0.036 +55 -0.038 +56 -0.040 +57 -0.042 +58 -0.043 +59 -0.044 +60 -0.045 +61 -0.045 +62 -0.046 +63 -0.046 +64 -0.045 +65 -0.045 +66 -0.044 +67 -0.043 +68 -0.042 +69 -0.041 +70 -0.039 +71 -0.037 +72 -0.036 +73 -0.034 +74 -0.032 +75 -0.030 +76 -0.028 +77 -0.025 +78 -0.023 +79 -0.021 +80 -0.019 +81 -0.017 +82 -0.016 +83 -0.014 +84 -0.012 +85 -0.011 +86 -0.010 +87 -0.009 +88 -0.009 +89 -0.009 +90 -0.009 +1 0.836 +2 0.838 +3 0.837 +4 0.835 +5 0.830 +6 0.823 +7 0.814 +8 0.804 +9 0.792 +10 0.778 +11 0.763 +12 0.746 +13 0.729 +14 0.710 +15 0.690 +16 0.669 +17 0.647 +18 0.625 +19 0.602 +20 0.578 +21 0.554 +22 0.530 +23 0.505 +24 0.480 +25 0.455 +26 0.429 +27 0.404 +28 0.378 +29 0.353 +30 0.328 +31 0.303 +32 0.278 +33 0.254 +34 0.230 +35 0.206 +36 0.183 +37 0.160 +38 0.138 +39 0.117 +40 0.096 +41 0.075 +42 0.055 +43 0.036 +44 0.018 +45 -0.000 +46 -0.017 +47 -0.033 +48 -0.049 +49 -0.064 +50 -0.078 +51 -0.091 +52 -0.104 +53 -0.116 +54 -0.127 +55 -0.137 +56 -0.147 +57 -0.156 +58 -0.164 +59 -0.172 +60 -0.178 +61 -0.185 +62 -0.191 +63 -0.196 +64 -0.201 +65 -0.205 +66 -0.208 +67 -0.212 +68 -0.215 +69 -0.218 +70 -0.220 +71 -0.222 +72 -0.224 +73 -0.226 +74 -0.228 +75 -0.230 +76 -0.232 +77 -0.235 +78 -0.237 +79 -0.240 +80 -0.243 +81 -0.247 +82 -0.251 +83 -0.256 +84 -0.262 +85 -0.269 +86 -0.276 +87 -0.284 +88 -0.294 +89 -0.305 +90 -0.317 +1 0.812 +2 0.812 +3 0.810 +4 0.805 +5 0.799 +6 0.791 +7 0.781 +8 0.770 +9 0.757 +10 0.742 +11 0.727 +12 0.710 +13 0.692 +14 0.674 +15 0.654 +16 0.633 +17 0.612 +18 0.590 +19 0.568 +20 0.545 +21 0.522 +22 0.498 +23 0.474 +24 0.450 +25 0.426 +26 0.402 +27 0.378 +28 0.354 +29 0.330 +30 0.306 +31 0.282 +32 0.259 +33 0.236 +34 0.214 +35 0.191 +36 0.170 +37 0.149 +38 0.128 +39 0.108 +40 0.088 +41 0.069 +42 0.051 +43 0.033 +44 0.016 +45 -0.000 +46 -0.016 +47 -0.030 +48 -0.045 +49 -0.058 +50 -0.071 +51 -0.083 +52 -0.094 +53 -0.104 +54 -0.114 +55 -0.123 +56 -0.131 +57 -0.139 +58 -0.146 +59 -0.152 +60 -0.158 +61 -0.163 +62 -0.168 +63 -0.172 +64 -0.175 +65 -0.178 +66 -0.181 +67 -0.183 +68 -0.184 +69 -0.186 +70 -0.187 +71 -0.188 +72 -0.189 +73 -0.189 +74 -0.190 +75 -0.190 +76 -0.191 +77 -0.192 +78 -0.193 +79 -0.194 +80 -0.195 +81 -0.197 +82 -0.199 +83 -0.202 +84 -0.206 +85 -0.210 +86 -0.215 +87 -0.222 +88 -0.229 +89 -0.237 +90 -0.246 +1 1.212 +2 1.215 +3 1.215 +4 1.212 +5 1.205 +6 1.195 +7 1.183 +8 1.168 +9 1.150 +10 1.131 +11 1.109 +12 1.085 +13 1.059 +14 1.032 +15 1.003 +16 0.973 +17 0.942 +18 0.909 +19 0.876 +20 0.842 +21 0.807 +22 0.771 +23 0.735 +24 0.699 +25 0.662 +26 0.625 +27 0.588 +28 0.551 +29 0.515 +30 0.478 +31 0.442 +32 0.406 +33 0.370 +34 0.335 +35 0.301 +36 0.267 +37 0.234 +38 0.202 +39 0.170 +40 0.139 +41 0.110 +42 0.081 +43 0.053 +44 0.026 +45 -0.000 +46 -0.025 +47 -0.049 +48 -0.071 +49 -0.093 +50 -0.114 +51 -0.133 +52 -0.152 +53 -0.169 +54 -0.185 +55 -0.200 +56 -0.215 +57 -0.228 +58 -0.240 +59 -0.251 +60 -0.261 +61 -0.271 +62 -0.279 +63 -0.287 +64 -0.294 +65 -0.300 +66 -0.306 +67 -0.311 +68 -0.315 +69 -0.319 +70 -0.323 +71 -0.326 +72 -0.330 +73 -0.333 +74 -0.336 +75 -0.339 +76 -0.342 +77 -0.345 +78 -0.349 +79 -0.353 +80 -0.358 +81 -0.364 +82 -0.370 +83 -0.377 +84 -0.386 +85 -0.395 +86 -0.406 +87 -0.418 +88 -0.432 +89 -0.448 +90 -0.466 +1 1.110 +2 1.115 +3 1.116 +4 1.115 +5 1.110 +6 1.102 +7 1.092 +8 1.079 +9 1.064 +10 1.047 +11 1.028 +12 1.006 +13 0.983 +14 0.959 +15 0.933 +16 0.905 +17 0.877 +18 0.847 +19 0.816 +20 0.785 +21 0.753 +22 0.720 +23 0.687 +24 0.653 +25 0.619 +26 0.585 +27 0.550 +28 0.516 +29 0.482 +30 0.448 +31 0.414 +32 0.381 +33 0.348 +34 0.315 +35 0.283 +36 0.251 +37 0.220 +38 0.190 +39 0.160 +40 0.131 +41 0.103 +42 0.076 +43 0.050 +44 0.024 +45 -0.000 +46 -0.024 +47 -0.046 +48 -0.068 +49 -0.088 +50 -0.108 +51 -0.127 +52 -0.144 +53 -0.161 +54 -0.177 +55 -0.191 +56 -0.205 +57 -0.218 +58 -0.230 +59 -0.241 +60 -0.251 +61 -0.260 +62 -0.269 +63 -0.277 +64 -0.284 +65 -0.291 +66 -0.297 +67 -0.302 +68 -0.307 +69 -0.312 +70 -0.316 +71 -0.320 +72 -0.324 +73 -0.328 +74 -0.332 +75 -0.336 +76 -0.340 +77 -0.344 +78 -0.349 +79 -0.354 +80 -0.360 +81 -0.366 +82 -0.373 +83 -0.382 +84 -0.391 +85 -0.401 +86 -0.413 +87 -0.426 +88 -0.441 +89 -0.458 +90 -0.476 +1 1.425 +2 1.434 +3 1.439 +4 1.439 +5 1.435 +6 1.427 +7 1.416 +8 1.401 +9 1.383 +10 1.362 +11 1.338 +12 1.312 +13 1.283 +14 1.252 +15 1.219 +16 1.184 +17 1.148 +18 1.110 +19 1.070 +20 1.030 +21 0.988 +22 0.946 +23 0.903 +24 0.859 +25 0.815 +26 0.771 +27 0.726 +28 0.681 +29 0.637 +30 0.592 +31 0.548 +32 0.504 +33 0.460 +34 0.417 +35 0.375 +36 0.333 +37 0.292 +38 0.252 +39 0.213 +40 0.175 +41 0.138 +42 0.102 +43 0.067 +44 0.033 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.091 +49 -0.119 +50 -0.145 +51 -0.170 +52 -0.194 +53 -0.217 +54 -0.238 +55 -0.259 +56 -0.277 +57 -0.295 +58 -0.312 +59 -0.327 +60 -0.342 +61 -0.355 +62 -0.368 +63 -0.379 +64 -0.390 +65 -0.400 +66 -0.409 +67 -0.417 +68 -0.425 +69 -0.433 +70 -0.440 +71 -0.447 +72 -0.453 +73 -0.460 +74 -0.467 +75 -0.473 +76 -0.480 +77 -0.488 +78 -0.496 +79 -0.505 +80 -0.514 +81 -0.524 +82 -0.536 +83 -0.549 +84 -0.563 +85 -0.579 +86 -0.597 +87 -0.616 +88 -0.638 +89 -0.662 +90 -0.689 +1 1.267 +2 1.279 +3 1.287 +4 1.290 +5 1.290 +6 1.286 +7 1.278 +8 1.267 +9 1.253 +10 1.236 +11 1.217 +12 1.195 +13 1.170 +14 1.143 +15 1.115 +16 1.084 +17 1.052 +18 1.018 +19 0.983 +20 0.947 +21 0.910 +22 0.872 +23 0.833 +24 0.794 +25 0.754 +26 0.713 +27 0.673 +28 0.632 +29 0.591 +30 0.550 +31 0.509 +32 0.469 +33 0.429 +34 0.389 +35 0.350 +36 0.311 +37 0.274 +38 0.236 +39 0.200 +40 0.164 +41 0.129 +42 0.096 +43 0.063 +44 0.031 +45 -0.000 +46 -0.030 +47 -0.058 +48 -0.086 +49 -0.113 +50 -0.138 +51 -0.162 +52 -0.185 +53 -0.207 +54 -0.228 +55 -0.248 +56 -0.267 +57 -0.285 +58 -0.301 +59 -0.317 +60 -0.332 +61 -0.346 +62 -0.359 +63 -0.371 +64 -0.382 +65 -0.393 +66 -0.404 +67 -0.413 +68 -0.423 +69 -0.431 +70 -0.440 +71 -0.448 +72 -0.457 +73 -0.465 +74 -0.473 +75 -0.482 +76 -0.491 +77 -0.501 +78 -0.511 +79 -0.521 +80 -0.533 +81 -0.545 +82 -0.559 +83 -0.574 +84 -0.590 +85 -0.608 +86 -0.628 +87 -0.650 +88 -0.674 +89 -0.700 +90 -0.728 +1 1.462 +2 1.476 +3 1.485 +4 1.489 +5 1.488 +6 1.483 +7 1.474 +8 1.462 +9 1.445 +10 1.426 +11 1.403 +12 1.377 +13 1.349 +14 1.318 +15 1.285 +16 1.250 +17 1.213 +18 1.174 +19 1.134 +20 1.092 +21 1.049 +22 1.005 +23 0.960 +24 0.915 +25 0.869 +26 0.822 +27 0.775 +28 0.728 +29 0.681 +30 0.634 +31 0.587 +32 0.541 +33 0.494 +34 0.449 +35 0.404 +36 0.359 +37 0.315 +38 0.272 +39 0.230 +40 0.189 +41 0.149 +42 0.110 +43 0.072 +44 0.036 +45 -0.000 +46 -0.034 +47 -0.067 +48 -0.099 +49 -0.130 +50 -0.159 +51 -0.187 +52 -0.214 +53 -0.239 +54 -0.263 +55 -0.286 +56 -0.308 +57 -0.328 +58 -0.347 +59 -0.365 +60 -0.382 +61 -0.398 +62 -0.414 +63 -0.428 +64 -0.441 +65 -0.453 +66 -0.465 +67 -0.476 +68 -0.487 +69 -0.497 +70 -0.507 +71 -0.517 +72 -0.526 +73 -0.536 +74 -0.545 +75 -0.555 +76 -0.565 +77 -0.576 +78 -0.588 +79 -0.600 +80 -0.613 +81 -0.627 +82 -0.643 +83 -0.660 +84 -0.679 +85 -0.699 +86 -0.722 +87 -0.747 +88 -0.774 +89 -0.803 +90 -0.836 +1 1.177 +2 1.192 +3 1.203 +4 1.209 +5 1.212 +6 1.211 +7 1.206 +8 1.198 +9 1.187 +10 1.173 +11 1.156 +12 1.137 +13 1.115 +14 1.091 +15 1.065 +16 1.038 +17 1.008 +18 0.977 +19 0.944 +20 0.911 +21 0.876 +22 0.840 +23 0.803 +24 0.766 +25 0.728 +26 0.690 +27 0.651 +28 0.612 +29 0.573 +30 0.534 +31 0.495 +32 0.456 +33 0.418 +34 0.379 +35 0.341 +36 0.304 +37 0.267 +38 0.231 +39 0.196 +40 0.161 +41 0.127 +42 0.094 +43 0.062 +44 0.030 +45 -0.000 +46 -0.029 +47 -0.058 +48 -0.085 +49 -0.112 +50 -0.137 +51 -0.161 +52 -0.185 +53 -0.207 +54 -0.228 +55 -0.248 +56 -0.268 +57 -0.286 +58 -0.303 +59 -0.320 +60 -0.336 +61 -0.350 +62 -0.365 +63 -0.378 +64 -0.391 +65 -0.403 +66 -0.414 +67 -0.425 +68 -0.436 +69 -0.447 +70 -0.457 +71 -0.467 +72 -0.477 +73 -0.487 +74 -0.498 +75 -0.508 +76 -0.520 +77 -0.531 +78 -0.543 +79 -0.556 +80 -0.570 +81 -0.585 +82 -0.601 +83 -0.619 +84 -0.638 +85 -0.658 +86 -0.680 +87 -0.705 +88 -0.731 +89 -0.760 +90 -0.791 +1 1.155 +2 1.167 +3 1.176 +4 1.180 +5 1.181 +6 1.178 +7 1.172 +8 1.163 +9 1.151 +10 1.136 +11 1.119 +12 1.099 +13 1.077 +14 1.053 +15 1.027 +16 1.000 +17 0.971 +18 0.940 +19 0.908 +20 0.875 +21 0.841 +22 0.806 +23 0.771 +24 0.734 +25 0.698 +26 0.660 +27 0.623 +28 0.585 +29 0.548 +30 0.510 +31 0.472 +32 0.435 +33 0.398 +34 0.361 +35 0.325 +36 0.289 +37 0.254 +38 0.220 +39 0.186 +40 0.153 +41 0.121 +42 0.089 +43 0.058 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.080 +49 -0.105 +50 -0.129 +51 -0.152 +52 -0.173 +53 -0.194 +54 -0.214 +55 -0.233 +56 -0.250 +57 -0.267 +58 -0.283 +59 -0.298 +60 -0.312 +61 -0.326 +62 -0.338 +63 -0.350 +64 -0.361 +65 -0.372 +66 -0.382 +67 -0.391 +68 -0.401 +69 -0.409 +70 -0.418 +71 -0.426 +72 -0.435 +73 -0.443 +74 -0.452 +75 -0.461 +76 -0.470 +77 -0.479 +78 -0.489 +79 -0.500 +80 -0.512 +81 -0.524 +82 -0.538 +83 -0.553 +84 -0.569 +85 -0.587 +86 -0.606 +87 -0.627 +88 -0.650 +89 -0.675 +90 -0.703 +1 0.843 +2 0.859 +3 0.871 +4 0.879 +5 0.885 +6 0.887 +7 0.887 +8 0.884 +9 0.878 +10 0.870 +11 0.860 +12 0.848 +13 0.833 +14 0.817 +15 0.799 +16 0.780 +17 0.759 +18 0.737 +19 0.714 +20 0.689 +21 0.664 +22 0.638 +23 0.611 +24 0.583 +25 0.555 +26 0.527 +27 0.498 +28 0.469 +29 0.439 +30 0.410 +31 0.381 +32 0.351 +33 0.322 +34 0.293 +35 0.264 +36 0.235 +37 0.207 +38 0.180 +39 0.152 +40 0.125 +41 0.099 +42 0.073 +43 0.048 +44 0.024 +45 -0.000 +46 -0.023 +47 -0.046 +48 -0.067 +49 -0.088 +50 -0.109 +51 -0.128 +52 -0.147 +53 -0.165 +54 -0.182 +55 -0.199 +56 -0.215 +57 -0.230 +58 -0.245 +59 -0.259 +60 -0.273 +61 -0.285 +62 -0.298 +63 -0.310 +64 -0.321 +65 -0.332 +66 -0.343 +67 -0.354 +68 -0.364 +69 -0.374 +70 -0.384 +71 -0.394 +72 -0.404 +73 -0.414 +74 -0.425 +75 -0.435 +76 -0.447 +77 -0.458 +78 -0.470 +79 -0.483 +80 -0.497 +81 -0.511 +82 -0.527 +83 -0.544 +84 -0.562 +85 -0.581 +86 -0.602 +87 -0.624 +88 -0.648 +89 -0.674 +90 -0.702 +1 0.632 +2 0.642 +3 0.649 +4 0.654 +5 0.656 +6 0.656 +7 0.655 +8 0.651 +9 0.646 +10 0.639 +11 0.631 +12 0.621 +13 0.609 +14 0.597 +15 0.583 +16 0.568 +17 0.552 +18 0.536 +19 0.518 +20 0.500 +21 0.481 +22 0.462 +23 0.442 +24 0.422 +25 0.401 +26 0.380 +27 0.359 +28 0.338 +29 0.316 +30 0.295 +31 0.274 +32 0.252 +33 0.231 +34 0.210 +35 0.189 +36 0.169 +37 0.148 +38 0.128 +39 0.109 +40 0.089 +41 0.071 +42 0.052 +43 0.034 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.048 +49 -0.062 +50 -0.077 +51 -0.090 +52 -0.104 +53 -0.116 +54 -0.128 +55 -0.140 +56 -0.151 +57 -0.161 +58 -0.171 +59 -0.181 +60 -0.190 +61 -0.198 +62 -0.207 +63 -0.214 +64 -0.222 +65 -0.229 +66 -0.236 +67 -0.243 +68 -0.249 +69 -0.256 +70 -0.262 +71 -0.268 +72 -0.274 +73 -0.281 +74 -0.287 +75 -0.294 +76 -0.301 +77 -0.308 +78 -0.315 +79 -0.323 +80 -0.332 +81 -0.341 +82 -0.350 +83 -0.361 +84 -0.372 +85 -0.385 +86 -0.398 +87 -0.412 +88 -0.428 +89 -0.445 +90 -0.463 +1 0.204 +2 0.213 +3 0.221 +4 0.228 +5 0.234 +6 0.239 +7 0.242 +8 0.244 +9 0.246 +10 0.246 +11 0.246 +12 0.245 +13 0.243 +14 0.240 +15 0.237 +16 0.232 +17 0.228 +18 0.223 +19 0.217 +20 0.211 +21 0.204 +22 0.197 +23 0.190 +24 0.182 +25 0.175 +26 0.166 +27 0.158 +28 0.149 +29 0.141 +30 0.132 +31 0.123 +32 0.114 +33 0.105 +34 0.096 +35 0.087 +36 0.078 +37 0.069 +38 0.060 +39 0.051 +40 0.042 +41 0.034 +42 0.025 +43 0.017 +44 0.008 +45 -0.000 +46 -0.008 +47 -0.016 +48 -0.024 +49 -0.031 +50 -0.039 +51 -0.046 +52 -0.053 +53 -0.060 +54 -0.067 +55 -0.073 +56 -0.080 +57 -0.086 +58 -0.092 +59 -0.098 +60 -0.104 +61 -0.110 +62 -0.116 +63 -0.121 +64 -0.127 +65 -0.132 +66 -0.138 +67 -0.143 +68 -0.149 +69 -0.154 +70 -0.160 +71 -0.166 +72 -0.172 +73 -0.177 +74 -0.184 +75 -0.190 +76 -0.196 +77 -0.203 +78 -0.210 +79 -0.218 +80 -0.226 +81 -0.234 +82 -0.243 +83 -0.252 +84 -0.261 +85 -0.272 +86 -0.282 +87 -0.294 +88 -0.306 +89 -0.319 +90 -0.333 +1 -0.225 +2 -0.230 +3 -0.235 +4 -0.239 +5 -0.242 +6 -0.244 +7 -0.245 +8 -0.245 +9 -0.244 +10 -0.243 +11 -0.241 +12 -0.238 +13 -0.235 +14 -0.231 +15 -0.227 +16 -0.222 +17 -0.216 +18 -0.211 +19 -0.204 +20 -0.198 +21 -0.191 +22 -0.184 +23 -0.176 +24 -0.169 +25 -0.161 +26 -0.153 +27 -0.145 +28 -0.137 +29 -0.128 +30 -0.120 +31 -0.112 +32 -0.103 +33 -0.095 +34 -0.086 +35 -0.078 +36 -0.070 +37 -0.061 +38 -0.053 +39 -0.045 +40 -0.037 +41 -0.030 +42 -0.022 +43 -0.014 +44 -0.007 +45 0.000 +46 0.007 +47 0.014 +48 0.020 +49 0.027 +50 0.033 +51 0.039 +52 0.045 +53 0.051 +54 0.056 +55 0.062 +56 0.067 +57 0.072 +58 0.077 +59 0.081 +60 0.086 +61 0.090 +62 0.094 +63 0.098 +64 0.102 +65 0.106 +66 0.110 +67 0.114 +68 0.118 +69 0.121 +70 0.125 +71 0.129 +72 0.132 +73 0.136 +74 0.140 +75 0.144 +76 0.148 +77 0.153 +78 0.157 +79 0.162 +80 0.167 +81 0.172 +82 0.178 +83 0.184 +84 0.190 +85 0.197 +86 0.204 +87 0.212 +88 0.220 +89 0.229 +90 0.238 +1 -0.755 +2 -0.764 +3 -0.770 +4 -0.773 +5 -0.774 +6 -0.773 +7 -0.769 +8 -0.763 +9 -0.756 +10 -0.746 +11 -0.735 +12 -0.722 +13 -0.708 +14 -0.693 +15 -0.676 +16 -0.658 +17 -0.639 +18 -0.619 +19 -0.598 +20 -0.576 +21 -0.554 +22 -0.531 +23 -0.508 +24 -0.484 +25 -0.460 +26 -0.436 +27 -0.411 +28 -0.387 +29 -0.362 +30 -0.337 +31 -0.312 +32 -0.288 +33 -0.263 +34 -0.239 +35 -0.215 +36 -0.192 +37 -0.168 +38 -0.146 +39 -0.123 +40 -0.101 +41 -0.080 +42 -0.059 +43 -0.039 +44 -0.019 +45 0.000 +46 0.018 +47 0.036 +48 0.054 +49 0.070 +50 0.086 +51 0.101 +52 0.116 +53 0.130 +54 0.143 +55 0.155 +56 0.167 +57 0.179 +58 0.189 +59 0.200 +60 0.209 +61 0.218 +62 0.227 +63 0.235 +64 0.243 +65 0.250 +66 0.257 +67 0.264 +68 0.270 +69 0.276 +70 0.282 +71 0.288 +72 0.294 +73 0.300 +74 0.305 +75 0.311 +76 0.318 +77 0.324 +78 0.331 +79 0.339 +80 0.346 +81 0.355 +82 0.364 +83 0.374 +84 0.385 +85 0.397 +86 0.410 +87 0.424 +88 0.439 +89 0.456 +90 0.474 +1 -1.248 +2 -1.280 +3 -1.306 +4 -1.326 +5 -1.341 +6 -1.351 +7 -1.355 +8 -1.356 +9 -1.352 +10 -1.343 +11 -1.331 +12 -1.316 +13 -1.297 +14 -1.275 +15 -1.250 +16 -1.222 +17 -1.192 +18 -1.160 +19 -1.125 +20 -1.089 +21 -1.050 +22 -1.011 +23 -0.970 +24 -0.928 +25 -0.884 +26 -0.840 +27 -0.795 +28 -0.750 +29 -0.704 +30 -0.658 +31 -0.612 +32 -0.565 +33 -0.519 +34 -0.473 +35 -0.427 +36 -0.381 +37 -0.336 +38 -0.292 +39 -0.248 +40 -0.204 +41 -0.162 +42 -0.120 +43 -0.079 +44 -0.039 +45 0.000 +46 0.038 +47 0.075 +48 0.111 +49 0.146 +50 0.180 +51 0.213 +52 0.245 +53 0.275 +54 0.305 +55 0.334 +56 0.361 +57 0.388 +58 0.414 +59 0.439 +60 0.463 +61 0.486 +62 0.508 +63 0.530 +64 0.551 +65 0.572 +66 0.592 +67 0.612 +68 0.632 +69 0.651 +70 0.671 +71 0.691 +72 0.710 +73 0.731 +74 0.751 +75 0.772 +76 0.794 +77 0.817 +78 0.841 +79 0.866 +80 0.893 +81 0.921 +82 0.950 +83 0.982 +84 1.016 +85 1.052 +86 1.091 +87 1.132 +88 1.177 +89 1.224 +90 1.275 +1 -1.969 +2 -2.017 +3 -2.056 +4 -2.086 +5 -2.108 +6 -2.122 +7 -2.128 +8 -2.128 +9 -2.120 +10 -2.107 +11 -2.087 +12 -2.062 +13 -2.032 +14 -1.996 +15 -1.957 +16 -1.913 +17 -1.865 +18 -1.814 +19 -1.759 +20 -1.702 +21 -1.642 +22 -1.580 +23 -1.515 +24 -1.449 +25 -1.381 +26 -1.312 +27 -1.242 +28 -1.171 +29 -1.099 +30 -1.027 +31 -0.955 +32 -0.882 +33 -0.810 +34 -0.737 +35 -0.666 +36 -0.595 +37 -0.524 +38 -0.455 +39 -0.386 +40 -0.318 +41 -0.252 +42 -0.187 +43 -0.123 +44 -0.061 +45 0.000 +46 0.059 +47 0.117 +48 0.173 +49 0.227 +50 0.280 +51 0.331 +52 0.381 +53 0.428 +54 0.474 +55 0.519 +56 0.562 +57 0.603 +58 0.643 +59 0.681 +60 0.718 +61 0.754 +62 0.789 +63 0.822 +64 0.855 +65 0.887 +66 0.918 +67 0.949 +68 0.979 +69 1.009 +70 1.039 +71 1.069 +72 1.099 +73 1.130 +74 1.162 +75 1.194 +76 1.228 +77 1.263 +78 1.300 +79 1.338 +80 1.379 +81 1.422 +82 1.467 +83 1.516 +84 1.568 +85 1.624 +86 1.683 +87 1.747 +88 1.815 +89 1.889 +90 1.967 +1 -2.294 +2 -2.358 +3 -2.410 +4 -2.451 +5 -2.482 +6 -2.503 +7 -2.515 +8 -2.518 +9 -2.513 +10 -2.500 +11 -2.480 +12 -2.453 +13 -2.419 +14 -2.380 +15 -2.335 +16 -2.284 +17 -2.229 +18 -2.170 +19 -2.106 +20 -2.039 +21 -1.969 +22 -1.895 +23 -1.819 +24 -1.741 +25 -1.660 +26 -1.578 +27 -1.495 +28 -1.410 +29 -1.324 +30 -1.238 +31 -1.151 +32 -1.064 +33 -0.978 +34 -0.891 +35 -0.805 +36 -0.719 +37 -0.634 +38 -0.550 +39 -0.468 +40 -0.386 +41 -0.306 +42 -0.227 +43 -0.150 +44 -0.074 +45 0.000 +46 0.072 +47 0.142 +48 0.211 +49 0.277 +50 0.342 +51 0.405 +52 0.465 +53 0.524 +54 0.581 +55 0.636 +56 0.689 +57 0.740 +58 0.790 +59 0.838 +60 0.884 +61 0.930 +62 0.973 +63 1.016 +64 1.057 +65 1.098 +66 1.138 +67 1.177 +68 1.216 +69 1.255 +70 1.294 +71 1.333 +72 1.373 +73 1.413 +74 1.454 +75 1.496 +76 1.540 +77 1.586 +78 1.634 +79 1.684 +80 1.737 +81 1.793 +82 1.852 +83 1.915 +84 1.982 +85 2.054 +86 2.130 +87 2.212 +88 2.299 +89 2.393 +90 2.493 +1 -2.251 +2 -2.310 +3 -2.358 +4 -2.396 +5 -2.424 +6 -2.443 +7 -2.452 +8 -2.454 +9 -2.447 +10 -2.433 +11 -2.412 +12 -2.384 +13 -2.350 +14 -2.311 +15 -2.266 +16 -2.216 +17 -2.162 +18 -2.104 +19 -2.041 +20 -1.976 +21 -1.907 +22 -1.835 +23 -1.761 +24 -1.684 +25 -1.606 +26 -1.526 +27 -1.445 +28 -1.363 +29 -1.280 +30 -1.196 +31 -1.112 +32 -1.028 +33 -0.944 +34 -0.860 +35 -0.776 +36 -0.694 +37 -0.612 +38 -0.531 +39 -0.451 +40 -0.372 +41 -0.294 +42 -0.218 +43 -0.144 +44 -0.071 +45 0.000 +46 0.069 +47 0.137 +48 0.203 +49 0.266 +50 0.328 +51 0.388 +52 0.446 +53 0.503 +54 0.557 +55 0.609 +56 0.660 +57 0.709 +58 0.756 +59 0.802 +60 0.846 +61 0.889 +62 0.930 +63 0.970 +64 1.009 +65 1.048 +66 1.085 +67 1.122 +68 1.158 +69 1.195 +70 1.231 +71 1.267 +72 1.304 +73 1.342 +74 1.380 +75 1.420 +76 1.460 +77 1.503 +78 1.548 +79 1.594 +80 1.644 +81 1.696 +82 1.751 +83 1.810 +84 1.873 +85 1.940 +86 2.012 +87 2.089 +88 2.171 +89 2.259 +90 2.353 +1 -1.942 +2 -2.002 +3 -2.053 +4 -2.094 +5 -2.125 +6 -2.148 +7 -2.162 +8 -2.169 +9 -2.168 +10 -2.160 +11 -2.145 +12 -2.124 +13 -2.098 +14 -2.066 +15 -2.029 +16 -1.987 +17 -1.941 +18 -1.891 +19 -1.837 +20 -1.780 +21 -1.719 +22 -1.657 +23 -1.591 +24 -1.524 +25 -1.454 +26 -1.383 +27 -1.311 +28 -1.237 +29 -1.163 +30 -1.088 +31 -1.012 +32 -0.937 +33 -0.861 +34 -0.785 +35 -0.709 +36 -0.634 +37 -0.560 +38 -0.486 +39 -0.413 +40 -0.341 +41 -0.271 +42 -0.201 +43 -0.133 +44 -0.066 +45 0.000 +46 0.064 +47 0.127 +48 0.188 +49 0.247 +50 0.305 +51 0.361 +52 0.415 +53 0.468 +54 0.519 +55 0.569 +56 0.617 +57 0.664 +58 0.709 +59 0.753 +60 0.796 +61 0.837 +62 0.878 +63 0.917 +64 0.956 +65 0.994 +66 1.032 +67 1.069 +68 1.105 +69 1.142 +70 1.179 +71 1.216 +72 1.254 +73 1.292 +74 1.332 +75 1.372 +76 1.414 +77 1.458 +78 1.504 +79 1.551 +80 1.602 +81 1.655 +82 1.711 +83 1.771 +84 1.834 +85 1.902 +86 1.974 +87 2.050 +88 2.132 +89 2.220 +90 2.313 +1 -1.816 +2 -1.872 +3 -1.919 +4 -1.956 +5 -1.985 +6 -2.006 +7 -2.019 +8 -2.024 +9 -2.023 +10 -2.015 +11 -2.001 +12 -1.982 +13 -1.957 +14 -1.926 +15 -1.892 +16 -1.852 +17 -1.809 +18 -1.762 +19 -1.712 +20 -1.658 +21 -1.602 +22 -1.543 +23 -1.482 +24 -1.419 +25 -1.355 +26 -1.288 +27 -1.221 +28 -1.152 +29 -1.083 +30 -1.013 +31 -0.943 +32 -0.872 +33 -0.801 +34 -0.731 +35 -0.660 +36 -0.590 +37 -0.521 +38 -0.452 +39 -0.384 +40 -0.318 +41 -0.252 +42 -0.187 +43 -0.123 +44 -0.061 +45 0.000 +46 0.060 +47 0.118 +48 0.174 +49 0.230 +50 0.283 +51 0.335 +52 0.386 +53 0.435 +54 0.482 +55 0.528 +56 0.573 +57 0.616 +58 0.658 +59 0.699 +60 0.738 +61 0.777 +62 0.814 +63 0.851 +64 0.887 +65 0.922 +66 0.956 +67 0.990 +68 1.024 +69 1.058 +70 1.092 +71 1.126 +72 1.161 +73 1.196 +74 1.233 +75 1.270 +76 1.309 +77 1.349 +78 1.391 +79 1.435 +80 1.481 +81 1.530 +82 1.582 +83 1.637 +84 1.696 +85 1.758 +86 1.824 +87 1.895 +88 1.971 +89 2.052 +90 2.138 +1 -1.504 +2 -1.564 +3 -1.615 +4 -1.658 +5 -1.692 +6 -1.719 +7 -1.738 +8 -1.750 +9 -1.756 +10 -1.755 +11 -1.748 +12 -1.736 +13 -1.719 +14 -1.697 +15 -1.670 +16 -1.639 +17 -1.605 +18 -1.566 +19 -1.524 +20 -1.480 +21 -1.432 +22 -1.382 +23 -1.329 +24 -1.275 +25 -1.219 +26 -1.161 +27 -1.102 +28 -1.041 +29 -0.980 +30 -0.918 +31 -0.855 +32 -0.792 +33 -0.729 +34 -0.666 +35 -0.603 +36 -0.540 +37 -0.477 +38 -0.415 +39 -0.353 +40 -0.292 +41 -0.232 +42 -0.172 +43 -0.114 +44 -0.056 +45 0.000 +46 0.055 +47 0.109 +48 0.162 +49 0.214 +50 0.264 +51 0.314 +52 0.362 +53 0.408 +54 0.454 +55 0.498 +56 0.542 +57 0.584 +58 0.625 +59 0.665 +60 0.704 +61 0.742 +62 0.780 +63 0.817 +64 0.853 +65 0.889 +66 0.925 +67 0.960 +68 0.996 +69 1.031 +70 1.067 +71 1.103 +72 1.140 +73 1.178 +74 1.216 +75 1.256 +76 1.298 +77 1.341 +78 1.385 +79 1.432 +80 1.481 +81 1.533 +82 1.588 +83 1.645 +84 1.707 +85 1.772 +86 1.840 +87 1.914 +88 1.991 +89 2.074 +90 2.162 +1 -1.214 +2 -1.262 +3 -1.302 +4 -1.335 +5 -1.362 +6 -1.383 +7 -1.398 +8 -1.407 +9 -1.411 +10 -1.410 +11 -1.404 +12 -1.394 +13 -1.380 +14 -1.362 +15 -1.340 +16 -1.315 +17 -1.287 +18 -1.256 +19 -1.222 +20 -1.186 +21 -1.148 +22 -1.107 +23 -1.065 +24 -1.021 +25 -0.976 +26 -0.930 +27 -0.882 +28 -0.834 +29 -0.785 +30 -0.735 +31 -0.685 +32 -0.634 +33 -0.584 +34 -0.533 +35 -0.482 +36 -0.432 +37 -0.381 +38 -0.332 +39 -0.282 +40 -0.233 +41 -0.185 +42 -0.138 +43 -0.091 +44 -0.045 +45 0.000 +46 0.044 +47 0.087 +48 0.130 +49 0.171 +50 0.211 +51 0.251 +52 0.289 +53 0.326 +54 0.363 +55 0.398 +56 0.433 +57 0.466 +58 0.499 +59 0.531 +60 0.562 +61 0.593 +62 0.622 +63 0.652 +64 0.681 +65 0.709 +66 0.738 +67 0.766 +68 0.794 +69 0.823 +70 0.851 +71 0.880 +72 0.909 +73 0.939 +74 0.970 +75 1.002 +76 1.034 +77 1.069 +78 1.104 +79 1.141 +80 1.181 +81 1.222 +82 1.265 +83 1.311 +84 1.360 +85 1.412 +86 1.467 +87 1.525 +88 1.587 +89 1.653 +90 1.723 +1 -0.971 +2 -1.026 +3 -1.073 +4 -1.114 +5 -1.148 +6 -1.176 +7 -1.198 +8 -1.215 +9 -1.226 +10 -1.232 +11 -1.234 +12 -1.231 +13 -1.224 +14 -1.213 +15 -1.198 +16 -1.180 +17 -1.159 +18 -1.135 +19 -1.108 +20 -1.078 +21 -1.046 +22 -1.012 +23 -0.976 +24 -0.938 +25 -0.899 +26 -0.858 +27 -0.816 +28 -0.773 +29 -0.729 +30 -0.684 +31 -0.639 +32 -0.593 +33 -0.546 +34 -0.500 +35 -0.453 +36 -0.407 +37 -0.360 +38 -0.314 +39 -0.268 +40 -0.222 +41 -0.176 +42 -0.131 +43 -0.087 +44 -0.043 +45 0.000 +46 0.043 +47 0.084 +48 0.125 +49 0.166 +50 0.205 +51 0.244 +52 0.282 +53 0.319 +54 0.356 +55 0.392 +56 0.427 +57 0.461 +58 0.495 +59 0.528 +60 0.561 +61 0.593 +62 0.625 +63 0.657 +64 0.688 +65 0.719 +66 0.751 +67 0.782 +68 0.813 +69 0.845 +70 0.877 +71 0.910 +72 0.943 +73 0.977 +74 1.012 +75 1.048 +76 1.086 +77 1.125 +78 1.165 +79 1.208 +80 1.252 +81 1.298 +82 1.347 +83 1.399 +84 1.453 +85 1.511 +86 1.571 +87 1.636 +88 1.704 +89 1.776 +90 1.852 +1 -0.714 +2 -0.755 +3 -0.791 +4 -0.822 +5 -0.848 +6 -0.869 +7 -0.886 +8 -0.899 +9 -0.908 +10 -0.913 +11 -0.915 +12 -0.913 +13 -0.908 +14 -0.900 +15 -0.889 +16 -0.876 +17 -0.861 +18 -0.843 +19 -0.823 +20 -0.801 +21 -0.777 +22 -0.752 +23 -0.725 +24 -0.697 +25 -0.668 +26 -0.638 +27 -0.607 +28 -0.575 +29 -0.542 +30 -0.509 +31 -0.475 +32 -0.441 +33 -0.407 +34 -0.372 +35 -0.338 +36 -0.303 +37 -0.268 +38 -0.234 +39 -0.199 +40 -0.165 +41 -0.131 +42 -0.098 +43 -0.065 +44 -0.032 +45 0.000 +46 0.032 +47 0.063 +48 0.094 +49 0.124 +50 0.153 +51 0.182 +52 0.211 +53 0.238 +54 0.266 +55 0.292 +56 0.319 +57 0.345 +58 0.370 +59 0.395 +60 0.419 +61 0.444 +62 0.468 +63 0.491 +64 0.515 +65 0.538 +66 0.562 +67 0.585 +68 0.609 +69 0.633 +70 0.657 +71 0.682 +72 0.707 +73 0.733 +74 0.759 +75 0.786 +76 0.815 +77 0.844 +78 0.875 +79 0.907 +80 0.940 +81 0.976 +82 1.013 +83 1.052 +84 1.093 +85 1.136 +86 1.182 +87 1.231 +88 1.282 +89 1.336 +90 1.394 +1 -0.522 +2 -0.571 +3 -0.615 +4 -0.654 +5 -0.687 +6 -0.716 +7 -0.740 +8 -0.760 +9 -0.775 +10 -0.787 +11 -0.795 +12 -0.800 +13 -0.801 +14 -0.799 +15 -0.795 +16 -0.787 +17 -0.777 +18 -0.765 +19 -0.750 +20 -0.733 +21 -0.714 +22 -0.694 +23 -0.672 +24 -0.648 +25 -0.623 +26 -0.597 +27 -0.569 +28 -0.541 +29 -0.512 +30 -0.482 +31 -0.451 +32 -0.420 +33 -0.389 +34 -0.357 +35 -0.324 +36 -0.292 +37 -0.259 +38 -0.226 +39 -0.194 +40 -0.161 +41 -0.128 +42 -0.096 +43 -0.064 +44 -0.032 +45 0.000 +46 0.031 +47 0.062 +48 0.093 +49 0.124 +50 0.154 +51 0.183 +52 0.212 +53 0.241 +54 0.270 +55 0.298 +56 0.326 +57 0.353 +58 0.381 +59 0.408 +60 0.435 +61 0.461 +62 0.488 +63 0.515 +64 0.541 +65 0.568 +66 0.595 +67 0.622 +68 0.650 +69 0.678 +70 0.706 +71 0.735 +72 0.765 +73 0.795 +74 0.827 +75 0.859 +76 0.893 +77 0.927 +78 0.964 +79 1.001 +80 1.041 +81 1.082 +82 1.126 +83 1.171 +84 1.219 +85 1.269 +86 1.322 +87 1.377 +88 1.436 +89 1.498 +90 1.563 +1 -0.436 +2 -0.476 +3 -0.512 +4 -0.544 +5 -0.571 +6 -0.594 +7 -0.614 +8 -0.630 +9 -0.643 +10 -0.652 +11 -0.659 +12 -0.663 +13 -0.663 +14 -0.662 +15 -0.658 +16 -0.651 +17 -0.643 +18 -0.632 +19 -0.620 +20 -0.606 +21 -0.591 +22 -0.573 +23 -0.555 +24 -0.535 +25 -0.515 +26 -0.493 +27 -0.470 +28 -0.447 +29 -0.423 +30 -0.398 +31 -0.373 +32 -0.347 +33 -0.321 +34 -0.294 +35 -0.268 +36 -0.241 +37 -0.214 +38 -0.187 +39 -0.160 +40 -0.133 +41 -0.106 +42 -0.079 +43 -0.053 +44 -0.026 +45 0.000 +46 0.026 +47 0.051 +48 0.077 +49 0.102 +50 0.127 +51 0.151 +52 0.175 +53 0.199 +54 0.222 +55 0.245 +56 0.268 +57 0.291 +58 0.314 +59 0.336 +60 0.358 +61 0.380 +62 0.402 +63 0.424 +64 0.446 +65 0.468 +66 0.490 +67 0.512 +68 0.535 +69 0.558 +70 0.581 +71 0.605 +72 0.629 +73 0.654 +74 0.680 +75 0.707 +76 0.734 +77 0.763 +78 0.793 +79 0.824 +80 0.857 +81 0.891 +82 0.926 +83 0.964 +84 1.003 +85 1.044 +86 1.088 +87 1.134 +88 1.182 +89 1.233 +90 1.287 +1 -0.308 +2 -0.358 +3 -0.404 +4 -0.445 +5 -0.481 +6 -0.513 +7 -0.540 +8 -0.564 +9 -0.584 +10 -0.600 +11 -0.613 +12 -0.622 +13 -0.628 +14 -0.632 +15 -0.632 +16 -0.631 +17 -0.626 +18 -0.619 +19 -0.611 +20 -0.600 +21 -0.587 +22 -0.573 +23 -0.557 +24 -0.539 +25 -0.520 +26 -0.500 +27 -0.479 +28 -0.456 +29 -0.433 +30 -0.409 +31 -0.384 +32 -0.359 +33 -0.333 +34 -0.306 +35 -0.279 +36 -0.252 +37 -0.224 +38 -0.196 +39 -0.168 +40 -0.140 +41 -0.112 +42 -0.084 +43 -0.056 +44 -0.028 +45 0.000 +46 0.028 +47 0.056 +48 0.083 +49 0.111 +50 0.138 +51 0.165 +52 0.192 +53 0.218 +54 0.245 +55 0.271 +56 0.298 +57 0.324 +58 0.350 +59 0.376 +60 0.402 +61 0.428 +62 0.454 +63 0.480 +64 0.507 +65 0.534 +66 0.561 +67 0.588 +68 0.616 +69 0.644 +70 0.673 +71 0.703 +72 0.733 +73 0.764 +74 0.797 +75 0.830 +76 0.864 +77 0.900 +78 0.937 +79 0.976 +80 1.017 +81 1.059 +82 1.103 +83 1.149 +84 1.198 +85 1.248 +86 1.302 +87 1.358 +88 1.416 +89 1.478 +90 1.543 +1 -0.309 +2 -0.350 +3 -0.386 +4 -0.419 +5 -0.447 +6 -0.472 +7 -0.493 +8 -0.511 +9 -0.526 +10 -0.538 +11 -0.547 +12 -0.553 +13 -0.557 +14 -0.558 +15 -0.557 +16 -0.554 +17 -0.549 +18 -0.542 +19 -0.533 +20 -0.522 +21 -0.510 +22 -0.497 +23 -0.482 +24 -0.466 +25 -0.449 +26 -0.431 +27 -0.412 +28 -0.393 +29 -0.372 +30 -0.351 +31 -0.329 +32 -0.307 +33 -0.284 +34 -0.261 +35 -0.238 +36 -0.215 +37 -0.191 +38 -0.167 +39 -0.143 +40 -0.119 +41 -0.095 +42 -0.071 +43 -0.047 +44 -0.024 +45 0.000 +46 0.023 +47 0.047 +48 0.070 +49 0.093 +50 0.116 +51 0.138 +52 0.161 +53 0.183 +54 0.205 +55 0.227 +56 0.248 +57 0.270 +58 0.291 +59 0.313 +60 0.334 +61 0.355 +62 0.376 +63 0.398 +64 0.419 +65 0.441 +66 0.462 +67 0.485 +68 0.507 +69 0.530 +70 0.553 +71 0.577 +72 0.601 +73 0.626 +74 0.652 +75 0.679 +76 0.707 +77 0.735 +78 0.765 +79 0.796 +80 0.829 +81 0.863 +82 0.899 +83 0.936 +84 0.975 +85 1.016 +86 1.059 +87 1.104 +88 1.152 +89 1.202 +90 1.255 +1 -0.408 +2 -0.486 +3 -0.556 +4 -0.618 +5 -0.674 +6 -0.723 +7 -0.766 +8 -0.803 +9 -0.834 +10 -0.860 +11 -0.881 +12 -0.896 +13 -0.908 +14 -0.914 +15 -0.917 +16 -0.915 +17 -0.910 +18 -0.902 +19 -0.890 +20 -0.875 +21 -0.858 +22 -0.837 +23 -0.815 +24 -0.790 +25 -0.763 +26 -0.734 +27 -0.703 +28 -0.671 +29 -0.637 +30 -0.602 +31 -0.566 +32 -0.529 +33 -0.491 +34 -0.452 +35 -0.412 +36 -0.372 +37 -0.332 +38 -0.291 +39 -0.249 +40 -0.208 +41 -0.166 +42 -0.125 +43 -0.083 +44 -0.042 +45 0.000 +46 0.041 +47 0.083 +48 0.124 +49 0.165 +50 0.205 +51 0.246 +52 0.286 +53 0.326 +54 0.366 +55 0.406 +56 0.445 +57 0.485 +58 0.524 +59 0.563 +60 0.603 +61 0.642 +62 0.682 +63 0.722 +64 0.762 +65 0.802 +66 0.844 +67 0.885 +68 0.928 +69 0.971 +70 1.015 +71 1.060 +72 1.107 +73 1.154 +74 1.204 +75 1.254 +76 1.307 +77 1.362 +78 1.418 +79 1.478 +80 1.539 +81 1.603 +82 1.670 +83 1.741 +84 1.814 +85 1.891 +86 1.972 +87 2.057 +88 2.146 +89 2.240 +90 2.338 +1 -0.591 +2 -0.660 +3 -0.721 +4 -0.776 +5 -0.824 +6 -0.866 +7 -0.901 +8 -0.931 +9 -0.955 +10 -0.974 +11 -0.989 +12 -0.998 +13 -1.003 +14 -1.004 +15 -1.000 +16 -0.994 +17 -0.983 +18 -0.969 +19 -0.953 +20 -0.933 +21 -0.911 +22 -0.886 +23 -0.860 +24 -0.831 +25 -0.800 +26 -0.767 +27 -0.733 +28 -0.698 +29 -0.661 +30 -0.623 +31 -0.584 +32 -0.545 +33 -0.504 +34 -0.463 +35 -0.422 +36 -0.380 +37 -0.338 +38 -0.295 +39 -0.253 +40 -0.210 +41 -0.168 +42 -0.126 +43 -0.084 +44 -0.042 +45 0.000 +46 0.041 +47 0.082 +48 0.123 +49 0.163 +50 0.203 +51 0.243 +52 0.282 +53 0.321 +54 0.359 +55 0.397 +56 0.435 +57 0.473 +58 0.510 +59 0.547 +60 0.584 +61 0.620 +62 0.657 +63 0.694 +64 0.731 +65 0.768 +66 0.806 +67 0.844 +68 0.882 +69 0.921 +70 0.961 +71 1.002 +72 1.043 +73 1.086 +74 1.131 +75 1.176 +76 1.224 +77 1.273 +78 1.324 +79 1.377 +80 1.432 +81 1.490 +82 1.551 +83 1.615 +84 1.681 +85 1.751 +86 1.825 +87 1.902 +88 1.984 +89 2.070 +90 2.160 +1 -0.534 +2 -0.615 +3 -0.687 +4 -0.751 +5 -0.808 +6 -0.858 +7 -0.901 +8 -0.938 +9 -0.968 +10 -0.993 +11 -1.012 +12 -1.026 +13 -1.035 +14 -1.040 +15 -1.040 +16 -1.036 +17 -1.027 +18 -1.016 +19 -1.000 +20 -0.982 +21 -0.960 +22 -0.936 +23 -0.909 +24 -0.880 +25 -0.849 +26 -0.816 +27 -0.780 +28 -0.744 +29 -0.706 +30 -0.666 +31 -0.625 +32 -0.584 +33 -0.541 +34 -0.498 +35 -0.454 +36 -0.409 +37 -0.364 +38 -0.319 +39 -0.273 +40 -0.228 +41 -0.182 +42 -0.136 +43 -0.091 +44 -0.045 +45 0.000 +46 0.045 +47 0.090 +48 0.134 +49 0.179 +50 0.223 +51 0.266 +52 0.310 +53 0.352 +54 0.395 +55 0.438 +56 0.480 +57 0.522 +58 0.563 +59 0.605 +60 0.647 +61 0.688 +62 0.730 +63 0.772 +64 0.814 +65 0.857 +66 0.900 +67 0.943 +68 0.987 +69 1.032 +70 1.078 +71 1.125 +72 1.173 +73 1.223 +74 1.274 +75 1.326 +76 1.381 +77 1.438 +78 1.497 +79 1.558 +80 1.622 +81 1.688 +82 1.758 +83 1.831 +84 1.908 +85 1.988 +86 2.073 +87 2.161 +88 2.254 +89 2.352 +90 2.455 +1 -0.780 +2 -0.850 +3 -0.912 +4 -0.967 +5 -1.014 +6 -1.054 +7 -1.088 +8 -1.116 +9 -1.138 +10 -1.154 +11 -1.165 +12 -1.170 +13 -1.171 +14 -1.168 +15 -1.160 +16 -1.149 +17 -1.134 +18 -1.115 +19 -1.093 +20 -1.068 +21 -1.040 +22 -1.010 +23 -0.977 +24 -0.943 +25 -0.906 +26 -0.868 +27 -0.828 +28 -0.786 +29 -0.744 +30 -0.700 +31 -0.655 +32 -0.610 +33 -0.564 +34 -0.517 +35 -0.470 +36 -0.423 +37 -0.376 +38 -0.328 +39 -0.281 +40 -0.233 +41 -0.186 +42 -0.139 +43 -0.092 +44 -0.046 +45 0.000 +46 0.045 +47 0.090 +48 0.135 +49 0.179 +50 0.222 +51 0.265 +52 0.307 +53 0.349 +54 0.390 +55 0.430 +56 0.470 +57 0.510 +58 0.549 +59 0.588 +60 0.627 +61 0.665 +62 0.703 +63 0.741 +64 0.780 +65 0.818 +66 0.856 +67 0.895 +68 0.935 +69 0.974 +70 1.015 +71 1.056 +72 1.099 +73 1.142 +74 1.187 +75 1.233 +76 1.281 +77 1.331 +78 1.383 +79 1.437 +80 1.493 +81 1.552 +82 1.614 +83 1.679 +84 1.747 +85 1.818 +86 1.894 +87 1.974 +88 2.057 +89 2.146 +90 2.239 +1 -0.837 +2 -0.917 +3 -0.988 +4 -1.050 +5 -1.105 +6 -1.152 +7 -1.191 +8 -1.224 +9 -1.250 +10 -1.269 +11 -1.283 +12 -1.290 +13 -1.293 +14 -1.290 +15 -1.283 +16 -1.271 +17 -1.255 +18 -1.235 +19 -1.212 +20 -1.185 +21 -1.154 +22 -1.122 +23 -1.086 +24 -1.048 +25 -1.008 +26 -0.965 +27 -0.921 +28 -0.875 +29 -0.828 +30 -0.780 +31 -0.731 +32 -0.680 +33 -0.629 +34 -0.577 +35 -0.525 +36 -0.472 +37 -0.420 +38 -0.367 +39 -0.314 +40 -0.261 +41 -0.208 +42 -0.155 +43 -0.103 +44 -0.051 +45 0.000 +46 0.051 +47 0.101 +48 0.151 +49 0.200 +50 0.249 +51 0.297 +52 0.345 +53 0.391 +54 0.438 +55 0.484 +56 0.529 +57 0.574 +58 0.618 +59 0.662 +60 0.706 +61 0.749 +62 0.793 +63 0.836 +64 0.879 +65 0.923 +66 0.967 +67 1.011 +68 1.055 +69 1.101 +70 1.147 +71 1.194 +72 1.242 +73 1.292 +74 1.343 +75 1.396 +76 1.450 +77 1.507 +78 1.566 +79 1.627 +80 1.691 +81 1.758 +82 1.829 +83 1.902 +84 1.980 +85 2.061 +86 2.147 +87 2.237 +88 2.332 +89 2.432 +90 2.538 +1 -1.150 +2 -1.222 +3 -1.285 +4 -1.339 +5 -1.385 +6 -1.423 +7 -1.454 +8 -1.477 +9 -1.494 +10 -1.505 +11 -1.509 +12 -1.508 +13 -1.502 +14 -1.490 +15 -1.474 +16 -1.453 +17 -1.429 +18 -1.400 +19 -1.368 +20 -1.333 +21 -1.294 +22 -1.253 +23 -1.209 +24 -1.163 +25 -1.115 +26 -1.066 +27 -1.014 +28 -0.961 +29 -0.907 +30 -0.852 +31 -0.796 +32 -0.739 +33 -0.682 +34 -0.624 +35 -0.567 +36 -0.509 +37 -0.451 +38 -0.393 +39 -0.335 +40 -0.278 +41 -0.221 +42 -0.165 +43 -0.109 +44 -0.054 +45 0.000 +46 0.054 +47 0.106 +48 0.158 +49 0.209 +50 0.259 +51 0.308 +52 0.357 +53 0.404 +54 0.451 +55 0.497 +56 0.542 +57 0.586 +58 0.629 +59 0.672 +60 0.714 +61 0.756 +62 0.798 +63 0.839 +64 0.880 +65 0.920 +66 0.961 +67 1.002 +68 1.043 +69 1.085 +70 1.127 +71 1.170 +72 1.214 +73 1.259 +74 1.305 +75 1.353 +76 1.402 +77 1.454 +78 1.507 +79 1.563 +80 1.621 +81 1.682 +82 1.747 +83 1.814 +84 1.886 +85 1.961 +86 2.040 +87 2.124 +88 2.213 +89 2.307 +90 2.406 +1 -1.373 +2 -1.459 +3 -1.535 +4 -1.600 +5 -1.655 +6 -1.701 +7 -1.738 +8 -1.766 +9 -1.787 +10 -1.800 +11 -1.805 +12 -1.804 +13 -1.797 +14 -1.783 +15 -1.764 +16 -1.739 +17 -1.710 +18 -1.676 +19 -1.637 +20 -1.595 +21 -1.549 +22 -1.500 +23 -1.448 +24 -1.393 +25 -1.335 +26 -1.276 +27 -1.214 +28 -1.151 +29 -1.086 +30 -1.020 +31 -0.953 +32 -0.885 +33 -0.817 +34 -0.748 +35 -0.678 +36 -0.609 +37 -0.540 +38 -0.470 +39 -0.401 +40 -0.333 +41 -0.265 +42 -0.198 +43 -0.131 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.189 +49 0.250 +50 0.310 +51 0.369 +52 0.427 +53 0.484 +54 0.540 +55 0.594 +56 0.648 +57 0.701 +58 0.753 +59 0.804 +60 0.855 +61 0.905 +62 0.954 +63 1.003 +64 1.052 +65 1.101 +66 1.150 +67 1.199 +68 1.248 +69 1.298 +70 1.348 +71 1.399 +72 1.452 +73 1.505 +74 1.561 +75 1.618 +76 1.677 +77 1.738 +78 1.802 +79 1.869 +80 1.938 +81 2.011 +82 2.088 +83 2.169 +84 2.254 +85 2.344 +86 2.439 +87 2.539 +88 2.645 +89 2.757 +90 2.876 +1 -1.710 +2 -1.789 +3 -1.856 +4 -1.913 +5 -1.960 +6 -1.997 +7 -2.025 +8 -2.045 +9 -2.056 +10 -2.060 +11 -2.056 +12 -2.046 +13 -2.029 +14 -2.006 +15 -1.977 +16 -1.943 +17 -1.904 +18 -1.861 +19 -1.813 +20 -1.762 +21 -1.707 +22 -1.649 +23 -1.588 +24 -1.524 +25 -1.458 +26 -1.390 +27 -1.320 +28 -1.249 +29 -1.177 +30 -1.103 +31 -1.029 +32 -0.954 +33 -0.878 +34 -0.803 +35 -0.727 +36 -0.651 +37 -0.576 +38 -0.501 +39 -0.427 +40 -0.353 +41 -0.281 +42 -0.209 +43 -0.138 +44 -0.069 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.261 +50 0.323 +51 0.384 +52 0.443 +53 0.500 +54 0.557 +55 0.612 +56 0.666 +57 0.718 +58 0.770 +59 0.820 +60 0.869 +61 0.918 +62 0.966 +63 1.013 +64 1.059 +65 1.105 +66 1.151 +67 1.197 +68 1.242 +69 1.288 +70 1.335 +71 1.382 +72 1.430 +73 1.479 +74 1.530 +75 1.582 +76 1.636 +77 1.692 +78 1.750 +79 1.811 +80 1.875 +81 1.943 +82 2.014 +83 2.089 +84 2.168 +85 2.252 +86 2.340 +87 2.434 +88 2.534 +89 2.640 +90 2.753 +1 -1.932 +2 -2.022 +3 -2.099 +4 -2.165 +5 -2.219 +6 -2.262 +7 -2.295 +8 -2.318 +9 -2.331 +10 -2.336 +11 -2.333 +12 -2.321 +13 -2.302 +14 -2.277 +15 -2.245 +16 -2.207 +17 -2.163 +18 -2.114 +19 -2.060 +20 -2.002 +21 -1.940 +22 -1.874 +23 -1.805 +24 -1.733 +25 -1.658 +26 -1.581 +27 -1.502 +28 -1.421 +29 -1.339 +30 -1.255 +31 -1.170 +32 -1.085 +33 -1.000 +34 -0.914 +35 -0.827 +36 -0.742 +37 -0.656 +38 -0.571 +39 -0.486 +40 -0.403 +41 -0.320 +42 -0.238 +43 -0.157 +44 -0.078 +45 0.000 +46 0.077 +47 0.152 +48 0.226 +49 0.298 +50 0.369 +51 0.438 +52 0.505 +53 0.571 +54 0.636 +55 0.699 +56 0.760 +57 0.820 +58 0.879 +59 0.937 +60 0.993 +61 1.049 +62 1.104 +63 1.158 +64 1.211 +65 1.264 +66 1.316 +67 1.369 +68 1.422 +69 1.474 +70 1.528 +71 1.582 +72 1.638 +73 1.694 +74 1.752 +75 1.812 +76 1.874 +77 1.939 +78 2.006 +79 2.076 +80 2.150 +81 2.227 +82 2.309 +83 2.395 +84 2.486 +85 2.582 +86 2.684 +87 2.792 +88 2.906 +89 3.028 +90 3.157 +1 -2.288 +2 -2.371 +3 -2.442 +4 -2.500 +5 -2.546 +6 -2.581 +7 -2.605 +8 -2.620 +9 -2.625 +10 -2.620 +11 -2.608 +12 -2.587 +13 -2.559 +14 -2.523 +15 -2.482 +16 -2.434 +17 -2.380 +18 -2.322 +19 -2.258 +20 -2.191 +21 -2.119 +22 -2.043 +23 -1.965 +24 -1.883 +25 -1.799 +26 -1.713 +27 -1.625 +28 -1.535 +29 -1.444 +30 -1.352 +31 -1.259 +32 -1.166 +33 -1.072 +34 -0.979 +35 -0.885 +36 -0.792 +37 -0.700 +38 -0.608 +39 -0.518 +40 -0.428 +41 -0.339 +42 -0.252 +43 -0.167 +44 -0.082 +45 0.000 +46 0.081 +47 0.160 +48 0.237 +49 0.312 +50 0.386 +51 0.457 +52 0.527 +53 0.595 +54 0.661 +55 0.725 +56 0.787 +57 0.848 +58 0.907 +59 0.964 +60 1.020 +61 1.075 +62 1.129 +63 1.181 +64 1.233 +65 1.284 +66 1.335 +67 1.385 +68 1.435 +69 1.485 +70 1.535 +71 1.586 +72 1.638 +73 1.690 +74 1.745 +75 1.800 +76 1.858 +77 1.918 +78 1.981 +79 2.047 +80 2.116 +81 2.188 +82 2.265 +83 2.346 +84 2.432 +85 2.524 +86 2.621 +87 2.724 +88 2.834 +89 2.951 +90 3.076 +1 -2.282 +2 -2.368 +3 -2.442 +4 -2.502 +5 -2.551 +6 -2.588 +7 -2.615 +8 -2.631 +9 -2.637 +10 -2.634 +11 -2.623 +12 -2.603 +13 -2.576 +14 -2.541 +15 -2.500 +16 -2.453 +17 -2.400 +18 -2.341 +19 -2.278 +20 -2.210 +21 -2.138 +22 -2.063 +23 -1.984 +24 -1.902 +25 -1.817 +26 -1.731 +27 -1.642 +28 -1.551 +29 -1.460 +30 -1.367 +31 -1.273 +32 -1.179 +33 -1.085 +34 -0.990 +35 -0.896 +36 -0.802 +37 -0.709 +38 -0.616 +39 -0.524 +40 -0.433 +41 -0.344 +42 -0.256 +43 -0.169 +44 -0.084 +45 0.000 +46 0.082 +47 0.162 +48 0.240 +49 0.317 +50 0.392 +51 0.464 +52 0.535 +53 0.604 +54 0.671 +55 0.736 +56 0.800 +57 0.862 +58 0.922 +59 0.981 +60 1.038 +61 1.094 +62 1.149 +63 1.203 +64 1.256 +65 1.308 +66 1.360 +67 1.411 +68 1.463 +69 1.514 +70 1.566 +71 1.618 +72 1.672 +73 1.726 +74 1.782 +75 1.839 +76 1.899 +77 1.961 +78 2.025 +79 2.093 +80 2.164 +81 2.239 +82 2.318 +83 2.401 +84 2.490 +85 2.583 +86 2.683 +87 2.789 +88 2.902 +89 3.022 +90 3.150 +1 -2.545 +2 -2.626 +3 -2.693 +4 -2.747 +5 -2.789 +6 -2.819 +7 -2.839 +8 -2.848 +9 -2.847 +10 -2.837 +11 -2.819 +12 -2.792 +13 -2.757 +14 -2.715 +15 -2.667 +16 -2.612 +17 -2.552 +18 -2.486 +19 -2.416 +20 -2.341 +21 -2.262 +22 -2.179 +23 -2.093 +24 -2.005 +25 -1.914 +26 -1.820 +27 -1.725 +28 -1.629 +29 -1.531 +30 -1.432 +31 -1.333 +32 -1.233 +33 -1.133 +34 -1.033 +35 -0.934 +36 -0.835 +37 -0.737 +38 -0.640 +39 -0.544 +40 -0.450 +41 -0.356 +42 -0.265 +43 -0.175 +44 -0.086 +45 0.000 +46 0.084 +47 0.167 +48 0.247 +49 0.325 +50 0.402 +51 0.476 +52 0.547 +53 0.617 +54 0.685 +55 0.750 +56 0.814 +57 0.875 +58 0.935 +59 0.993 +60 1.050 +61 1.104 +62 1.158 +63 1.210 +64 1.261 +65 1.311 +66 1.361 +67 1.410 +68 1.459 +69 1.507 +70 1.556 +71 1.605 +72 1.655 +73 1.706 +74 1.758 +75 1.812 +76 1.867 +77 1.925 +78 1.986 +79 2.049 +80 2.115 +81 2.186 +82 2.260 +83 2.339 +84 2.423 +85 2.512 +86 2.608 +87 2.709 +88 2.817 +89 2.933 +90 3.056 +1 -2.469 +2 -2.551 +3 -2.620 +4 -2.677 +5 -2.721 +6 -2.754 +7 -2.775 +8 -2.787 +9 -2.788 +10 -2.780 +11 -2.764 +12 -2.739 +13 -2.707 +14 -2.667 +15 -2.621 +16 -2.568 +17 -2.510 +18 -2.446 +19 -2.378 +20 -2.305 +21 -2.228 +22 -2.148 +23 -2.064 +24 -1.977 +25 -1.888 +26 -1.796 +27 -1.703 +28 -1.608 +29 -1.512 +30 -1.415 +31 -1.317 +32 -1.219 +33 -1.121 +34 -1.022 +35 -0.924 +36 -0.827 +37 -0.730 +38 -0.634 +39 -0.539 +40 -0.446 +41 -0.353 +42 -0.262 +43 -0.173 +44 -0.086 +45 0.000 +46 0.084 +47 0.166 +48 0.246 +49 0.324 +50 0.399 +51 0.473 +52 0.545 +53 0.615 +54 0.682 +55 0.748 +56 0.812 +57 0.873 +58 0.933 +59 0.992 +60 1.049 +61 1.104 +62 1.158 +63 1.211 +64 1.263 +65 1.314 +66 1.364 +67 1.414 +68 1.464 +69 1.513 +70 1.563 +71 1.613 +72 1.664 +73 1.716 +74 1.770 +75 1.825 +76 1.882 +77 1.941 +78 2.003 +79 2.067 +80 2.135 +81 2.207 +82 2.283 +83 2.364 +84 2.449 +85 2.540 +86 2.636 +87 2.739 +88 2.849 +89 2.966 +90 3.091 +1 -2.233 +2 -2.303 +3 -2.362 +4 -2.410 +5 -2.447 +6 -2.474 +7 -2.491 +8 -2.499 +9 -2.498 +10 -2.490 +11 -2.473 +12 -2.450 +13 -2.419 +14 -2.383 +15 -2.340 +16 -2.292 +17 -2.239 +18 -2.182 +19 -2.120 +20 -2.054 +21 -1.985 +22 -1.913 +23 -1.837 +24 -1.760 +25 -1.680 +26 -1.598 +27 -1.514 +28 -1.429 +29 -1.344 +30 -1.257 +31 -1.170 +32 -1.082 +33 -0.995 +34 -0.907 +35 -0.820 +36 -0.733 +37 -0.647 +38 -0.562 +39 -0.478 +40 -0.395 +41 -0.313 +42 -0.232 +43 -0.153 +44 -0.076 +45 0.000 +46 0.074 +47 0.146 +48 0.217 +49 0.286 +50 0.353 +51 0.418 +52 0.481 +53 0.542 +54 0.601 +55 0.659 +56 0.715 +57 0.769 +58 0.821 +59 0.872 +60 0.922 +61 0.970 +62 1.017 +63 1.063 +64 1.108 +65 1.152 +66 1.196 +67 1.239 +68 1.281 +69 1.324 +70 1.367 +71 1.410 +72 1.454 +73 1.499 +74 1.545 +75 1.592 +76 1.641 +77 1.691 +78 1.744 +79 1.800 +80 1.859 +81 1.920 +82 1.986 +83 2.055 +84 2.129 +85 2.207 +86 2.290 +87 2.379 +88 2.474 +89 2.576 +90 2.684 +1 -1.465 +2 -1.518 +3 -1.563 +4 -1.600 +5 -1.629 +6 -1.651 +7 -1.667 +8 -1.676 +9 -1.679 +10 -1.676 +11 -1.667 +12 -1.654 +13 -1.636 +14 -1.613 +15 -1.587 +16 -1.556 +17 -1.522 +18 -1.484 +19 -1.444 +20 -1.400 +21 -1.354 +22 -1.306 +23 -1.256 +24 -1.204 +25 -1.150 +26 -1.095 +27 -1.038 +28 -0.981 +29 -0.923 +30 -0.864 +31 -0.805 +32 -0.745 +33 -0.685 +34 -0.625 +35 -0.566 +36 -0.506 +37 -0.447 +38 -0.389 +39 -0.331 +40 -0.273 +41 -0.217 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.052 +47 0.102 +48 0.151 +49 0.199 +50 0.246 +51 0.292 +52 0.337 +53 0.380 +54 0.422 +55 0.463 +56 0.503 +57 0.541 +58 0.579 +59 0.616 +60 0.651 +61 0.686 +62 0.721 +63 0.754 +64 0.787 +65 0.819 +66 0.852 +67 0.883 +68 0.915 +69 0.947 +70 0.979 +71 1.011 +72 1.044 +73 1.078 +74 1.112 +75 1.148 +76 1.184 +77 1.222 +78 1.262 +79 1.304 +80 1.348 +81 1.394 +82 1.442 +83 1.494 +84 1.549 +85 1.607 +86 1.668 +87 1.734 +88 1.804 +89 1.878 +90 1.957 +1 -1.021 +2 -1.051 +3 -1.075 +4 -1.094 +5 -1.108 +6 -1.118 +7 -1.124 +8 -1.126 +9 -1.124 +10 -1.118 +11 -1.110 +12 -1.098 +13 -1.083 +14 -1.066 +15 -1.046 +16 -1.023 +17 -0.999 +18 -0.973 +19 -0.944 +20 -0.914 +21 -0.883 +22 -0.850 +23 -0.816 +24 -0.781 +25 -0.745 +26 -0.708 +27 -0.671 +28 -0.633 +29 -0.595 +30 -0.556 +31 -0.517 +32 -0.478 +33 -0.439 +34 -0.400 +35 -0.362 +36 -0.323 +37 -0.285 +38 -0.247 +39 -0.210 +40 -0.174 +41 -0.138 +42 -0.102 +43 -0.067 +44 -0.033 +45 0.000 +46 0.032 +47 0.064 +48 0.095 +49 0.125 +50 0.154 +51 0.182 +52 0.210 +53 0.236 +54 0.262 +55 0.287 +56 0.311 +57 0.334 +58 0.357 +59 0.378 +60 0.399 +61 0.420 +62 0.440 +63 0.459 +64 0.478 +65 0.497 +66 0.515 +67 0.533 +68 0.551 +69 0.568 +70 0.586 +71 0.604 +72 0.622 +73 0.640 +74 0.659 +75 0.679 +76 0.699 +77 0.720 +78 0.742 +79 0.765 +80 0.789 +81 0.814 +82 0.842 +83 0.870 +84 0.901 +85 0.934 +86 0.969 +87 1.006 +88 1.046 +89 1.088 +90 1.134 +1 -0.360 +2 -0.384 +3 -0.406 +4 -0.424 +5 -0.440 +6 -0.453 +7 -0.464 +8 -0.473 +9 -0.479 +10 -0.483 +11 -0.485 +12 -0.485 +13 -0.484 +14 -0.481 +15 -0.476 +16 -0.470 +17 -0.462 +18 -0.453 +19 -0.443 +20 -0.432 +21 -0.420 +22 -0.407 +23 -0.393 +24 -0.378 +25 -0.363 +26 -0.347 +27 -0.330 +28 -0.313 +29 -0.296 +30 -0.278 +31 -0.260 +32 -0.241 +33 -0.223 +34 -0.204 +35 -0.185 +36 -0.166 +37 -0.148 +38 -0.129 +39 -0.110 +40 -0.091 +41 -0.073 +42 -0.054 +43 -0.036 +44 -0.018 +45 0.000 +46 0.018 +47 0.035 +48 0.052 +49 0.069 +50 0.085 +51 0.102 +52 0.118 +53 0.133 +54 0.149 +55 0.164 +56 0.179 +57 0.194 +58 0.208 +59 0.223 +60 0.237 +61 0.251 +62 0.264 +63 0.278 +64 0.292 +65 0.306 +66 0.319 +67 0.333 +68 0.347 +69 0.361 +70 0.375 +71 0.389 +72 0.404 +73 0.419 +74 0.435 +75 0.451 +76 0.467 +77 0.485 +78 0.503 +79 0.521 +80 0.541 +81 0.561 +82 0.583 +83 0.605 +84 0.629 +85 0.654 +86 0.681 +87 0.708 +88 0.738 +89 0.769 +90 0.802 +1 0.060 +2 0.053 +3 0.047 +4 0.041 +5 0.036 +6 0.031 +7 0.026 +8 0.022 +9 0.018 +10 0.014 +11 0.011 +12 0.007 +13 0.004 +14 0.002 +15 -0.001 +16 -0.003 +17 -0.005 +18 -0.007 +19 -0.009 +20 -0.010 +21 -0.011 +22 -0.012 +23 -0.013 +24 -0.014 +25 -0.014 +26 -0.015 +27 -0.015 +28 -0.015 +29 -0.015 +30 -0.015 +31 -0.015 +32 -0.014 +33 -0.014 +34 -0.013 +35 -0.012 +36 -0.012 +37 -0.011 +38 -0.010 +39 -0.008 +40 -0.007 +41 -0.006 +42 -0.005 +43 -0.003 +44 -0.002 +45 0.000 +46 0.002 +47 0.003 +48 0.005 +49 0.007 +50 0.009 +51 0.011 +52 0.013 +53 0.015 +54 0.018 +55 0.020 +56 0.022 +57 0.025 +58 0.027 +59 0.030 +60 0.033 +61 0.035 +62 0.038 +63 0.041 +64 0.044 +65 0.047 +66 0.050 +67 0.054 +68 0.057 +69 0.060 +70 0.064 +71 0.068 +72 0.072 +73 0.075 +74 0.079 +75 0.084 +76 0.088 +77 0.092 +78 0.097 +79 0.102 +80 0.107 +81 0.112 +82 0.117 +83 0.123 +84 0.128 +85 0.134 +86 0.140 +87 0.147 +88 0.153 +89 0.160 +90 0.167 +1 0.652 +2 0.648 +3 0.642 +4 0.635 +5 0.627 +6 0.618 +7 0.607 +8 0.596 +9 0.584 +10 0.571 +11 0.557 +12 0.542 +13 0.527 +14 0.511 +15 0.494 +16 0.478 +17 0.460 +18 0.443 +19 0.425 +20 0.407 +21 0.388 +22 0.370 +23 0.351 +24 0.333 +25 0.314 +26 0.296 +27 0.277 +28 0.259 +29 0.241 +30 0.223 +31 0.205 +32 0.188 +33 0.171 +34 0.154 +35 0.138 +36 0.122 +37 0.106 +38 0.091 +39 0.077 +40 0.063 +41 0.049 +42 0.036 +43 0.023 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.031 +49 -0.040 +50 -0.048 +51 -0.056 +52 -0.064 +53 -0.070 +54 -0.077 +55 -0.082 +56 -0.087 +57 -0.092 +58 -0.095 +59 -0.099 +60 -0.102 +61 -0.104 +62 -0.106 +63 -0.107 +64 -0.108 +65 -0.108 +66 -0.108 +67 -0.108 +68 -0.107 +69 -0.106 +70 -0.105 +71 -0.103 +72 -0.102 +73 -0.100 +74 -0.098 +75 -0.095 +76 -0.093 +77 -0.091 +78 -0.089 +79 -0.087 +80 -0.085 +81 -0.083 +82 -0.081 +83 -0.080 +84 -0.079 +85 -0.078 +86 -0.078 +87 -0.078 +88 -0.079 +89 -0.081 +90 -0.083 +1 0.874 +2 0.878 +3 0.881 +4 0.880 +5 0.877 +6 0.872 +7 0.864 +8 0.855 +9 0.843 +10 0.830 +11 0.815 +12 0.799 +13 0.781 +14 0.762 +15 0.742 +16 0.720 +17 0.698 +18 0.675 +19 0.651 +20 0.626 +21 0.600 +22 0.575 +23 0.548 +24 0.522 +25 0.495 +26 0.468 +27 0.440 +28 0.413 +29 0.386 +30 0.359 +31 0.332 +32 0.305 +33 0.279 +34 0.253 +35 0.227 +36 0.202 +37 0.177 +38 0.153 +39 0.129 +40 0.106 +41 0.083 +42 0.061 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.055 +49 -0.072 +50 -0.088 +51 -0.103 +52 -0.117 +53 -0.131 +54 -0.144 +55 -0.156 +56 -0.167 +57 -0.178 +58 -0.188 +59 -0.197 +60 -0.206 +61 -0.214 +62 -0.221 +63 -0.228 +64 -0.234 +65 -0.240 +66 -0.245 +67 -0.250 +68 -0.255 +69 -0.259 +70 -0.263 +71 -0.267 +72 -0.271 +73 -0.274 +74 -0.278 +75 -0.282 +76 -0.285 +77 -0.289 +78 -0.294 +79 -0.299 +80 -0.304 +81 -0.310 +82 -0.316 +83 -0.323 +84 -0.331 +85 -0.340 +86 -0.350 +87 -0.361 +88 -0.374 +89 -0.388 +90 -0.403 +1 1.364 +2 1.368 +3 1.368 +4 1.365 +5 1.358 +6 1.348 +7 1.334 +8 1.318 +9 1.298 +10 1.276 +11 1.252 +12 1.225 +13 1.197 +14 1.166 +15 1.134 +16 1.100 +17 1.065 +18 1.029 +19 0.991 +20 0.952 +21 0.913 +22 0.873 +23 0.832 +24 0.791 +25 0.750 +26 0.708 +27 0.667 +28 0.625 +29 0.583 +30 0.542 +31 0.501 +32 0.460 +33 0.420 +34 0.381 +35 0.342 +36 0.303 +37 0.266 +38 0.229 +39 0.193 +40 0.159 +41 0.125 +42 0.092 +43 0.060 +44 0.029 +45 -0.000 +46 -0.028 +47 -0.055 +48 -0.081 +49 -0.106 +50 -0.130 +51 -0.152 +52 -0.173 +53 -0.193 +54 -0.211 +55 -0.229 +56 -0.245 +57 -0.260 +58 -0.274 +59 -0.287 +60 -0.299 +61 -0.310 +62 -0.320 +63 -0.329 +64 -0.337 +65 -0.344 +66 -0.351 +67 -0.356 +68 -0.362 +69 -0.367 +70 -0.371 +71 -0.375 +72 -0.379 +73 -0.382 +74 -0.386 +75 -0.390 +76 -0.393 +77 -0.397 +78 -0.402 +79 -0.407 +80 -0.412 +81 -0.419 +82 -0.426 +83 -0.434 +84 -0.444 +85 -0.455 +86 -0.467 +87 -0.481 +88 -0.497 +89 -0.515 +90 -0.535 +1 1.385 +2 1.394 +3 1.399 +4 1.400 +5 1.397 +6 1.390 +7 1.379 +8 1.365 +9 1.348 +10 1.328 +11 1.305 +12 1.280 +13 1.252 +14 1.222 +15 1.190 +16 1.157 +17 1.121 +18 1.084 +19 1.046 +20 1.007 +21 0.967 +22 0.925 +23 0.883 +24 0.841 +25 0.798 +26 0.754 +27 0.711 +28 0.667 +29 0.624 +30 0.580 +31 0.537 +32 0.494 +33 0.451 +34 0.409 +35 0.368 +36 0.327 +37 0.287 +38 0.248 +39 0.209 +40 0.172 +41 0.135 +42 0.100 +43 0.065 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.089 +49 -0.117 +50 -0.143 +51 -0.168 +52 -0.191 +53 -0.214 +54 -0.235 +55 -0.255 +56 -0.274 +57 -0.292 +58 -0.308 +59 -0.324 +60 -0.338 +61 -0.352 +62 -0.364 +63 -0.376 +64 -0.387 +65 -0.397 +66 -0.406 +67 -0.415 +68 -0.423 +69 -0.431 +70 -0.438 +71 -0.445 +72 -0.452 +73 -0.459 +74 -0.466 +75 -0.473 +76 -0.480 +77 -0.488 +78 -0.496 +79 -0.505 +80 -0.515 +81 -0.526 +82 -0.538 +83 -0.551 +84 -0.565 +85 -0.582 +86 -0.599 +87 -0.619 +88 -0.641 +89 -0.665 +90 -0.692 +1 1.832 +2 1.842 +3 1.847 +4 1.847 +5 1.841 +6 1.830 +7 1.815 +8 1.796 +9 1.772 +10 1.745 +11 1.714 +12 1.680 +13 1.642 +14 1.602 +15 1.560 +16 1.515 +17 1.468 +18 1.419 +19 1.369 +20 1.317 +21 1.264 +22 1.209 +23 1.154 +24 1.098 +25 1.041 +26 0.985 +27 0.927 +28 0.870 +29 0.813 +30 0.756 +31 0.699 +32 0.643 +33 0.588 +34 0.533 +35 0.479 +36 0.425 +37 0.373 +38 0.322 +39 0.272 +40 0.223 +41 0.176 +42 0.130 +43 0.085 +44 0.042 +45 -0.000 +46 -0.040 +47 -0.079 +48 -0.116 +49 -0.151 +50 -0.185 +51 -0.217 +52 -0.247 +53 -0.276 +54 -0.303 +55 -0.329 +56 -0.353 +57 -0.375 +58 -0.397 +59 -0.416 +60 -0.434 +61 -0.451 +62 -0.467 +63 -0.481 +64 -0.494 +65 -0.507 +66 -0.518 +67 -0.529 +68 -0.538 +69 -0.547 +70 -0.556 +71 -0.564 +72 -0.572 +73 -0.580 +74 -0.588 +75 -0.596 +76 -0.604 +77 -0.613 +78 -0.622 +79 -0.633 +80 -0.644 +81 -0.656 +82 -0.670 +83 -0.686 +84 -0.703 +85 -0.722 +86 -0.744 +87 -0.767 +88 -0.794 +89 -0.823 +90 -0.856 +1 1.606 +2 1.617 +3 1.623 +4 1.624 +5 1.620 +6 1.612 +7 1.599 +8 1.583 +9 1.563 +10 1.540 +11 1.513 +12 1.484 +13 1.452 +14 1.417 +15 1.380 +16 1.341 +17 1.300 +18 1.257 +19 1.213 +20 1.167 +21 1.120 +22 1.072 +23 1.024 +24 0.974 +25 0.924 +26 0.874 +27 0.824 +28 0.773 +29 0.722 +30 0.672 +31 0.622 +32 0.572 +33 0.523 +34 0.474 +35 0.426 +36 0.379 +37 0.332 +38 0.287 +39 0.242 +40 0.199 +41 0.157 +42 0.116 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.070 +48 -0.103 +49 -0.135 +50 -0.165 +51 -0.194 +52 -0.222 +53 -0.247 +54 -0.272 +55 -0.295 +56 -0.317 +57 -0.337 +58 -0.357 +59 -0.374 +60 -0.391 +61 -0.407 +62 -0.421 +63 -0.434 +64 -0.447 +65 -0.458 +66 -0.469 +67 -0.479 +68 -0.489 +69 -0.498 +70 -0.506 +71 -0.514 +72 -0.522 +73 -0.530 +74 -0.538 +75 -0.546 +76 -0.555 +77 -0.563 +78 -0.573 +79 -0.583 +80 -0.595 +81 -0.607 +82 -0.621 +83 -0.636 +84 -0.653 +85 -0.671 +86 -0.692 +87 -0.715 +88 -0.740 +89 -0.768 +90 -0.799 +1 1.894 +2 1.905 +3 1.909 +4 1.908 +5 1.901 +6 1.889 +7 1.873 +8 1.852 +9 1.828 +10 1.799 +11 1.767 +12 1.731 +13 1.692 +14 1.651 +15 1.607 +16 1.560 +17 1.512 +18 1.461 +19 1.409 +20 1.355 +21 1.300 +22 1.244 +23 1.187 +24 1.129 +25 1.071 +26 1.012 +27 0.954 +28 0.895 +29 0.836 +30 0.777 +31 0.719 +32 0.661 +33 0.604 +34 0.547 +35 0.491 +36 0.437 +37 0.383 +38 0.330 +39 0.279 +40 0.229 +41 0.180 +42 0.133 +43 0.087 +44 0.043 +45 -0.000 +46 -0.041 +47 -0.081 +48 -0.119 +49 -0.155 +50 -0.189 +51 -0.222 +52 -0.253 +53 -0.283 +54 -0.310 +55 -0.337 +56 -0.361 +57 -0.384 +58 -0.405 +59 -0.425 +60 -0.444 +61 -0.461 +62 -0.477 +63 -0.491 +64 -0.505 +65 -0.517 +66 -0.528 +67 -0.539 +68 -0.548 +69 -0.558 +70 -0.566 +71 -0.574 +72 -0.582 +73 -0.590 +74 -0.597 +75 -0.605 +76 -0.613 +77 -0.622 +78 -0.631 +79 -0.641 +80 -0.652 +81 -0.665 +82 -0.678 +83 -0.694 +84 -0.711 +85 -0.730 +86 -0.752 +87 -0.776 +88 -0.802 +89 -0.832 +90 -0.865 +1 1.519 +2 1.527 +3 1.530 +4 1.529 +5 1.523 +6 1.513 +7 1.500 +8 1.483 +9 1.463 +10 1.440 +11 1.414 +12 1.386 +13 1.354 +14 1.321 +15 1.286 +16 1.248 +17 1.209 +18 1.169 +19 1.127 +20 1.084 +21 1.040 +22 0.995 +23 0.949 +24 0.903 +25 0.856 +26 0.809 +27 0.762 +28 0.715 +29 0.668 +30 0.621 +31 0.574 +32 0.528 +33 0.482 +34 0.437 +35 0.393 +36 0.349 +37 0.306 +38 0.264 +39 0.223 +40 0.183 +41 0.144 +42 0.106 +43 0.070 +44 0.034 +45 -0.000 +46 -0.033 +47 -0.064 +48 -0.095 +49 -0.124 +50 -0.151 +51 -0.177 +52 -0.202 +53 -0.226 +54 -0.248 +55 -0.269 +56 -0.288 +57 -0.306 +58 -0.323 +59 -0.339 +60 -0.354 +61 -0.368 +62 -0.380 +63 -0.392 +64 -0.402 +65 -0.412 +66 -0.421 +67 -0.429 +68 -0.437 +69 -0.444 +70 -0.451 +71 -0.457 +72 -0.464 +73 -0.470 +74 -0.476 +75 -0.482 +76 -0.489 +77 -0.495 +78 -0.503 +79 -0.511 +80 -0.520 +81 -0.530 +82 -0.541 +83 -0.553 +84 -0.567 +85 -0.582 +86 -0.599 +87 -0.618 +88 -0.640 +89 -0.664 +90 -0.690 +1 1.722 +2 1.731 +3 1.735 +4 1.733 +5 1.727 +6 1.716 +7 1.701 +8 1.682 +9 1.659 +10 1.633 +11 1.604 +12 1.571 +13 1.536 +14 1.498 +15 1.458 +16 1.415 +17 1.371 +18 1.325 +19 1.278 +20 1.229 +21 1.179 +22 1.128 +23 1.076 +24 1.024 +25 0.971 +26 0.918 +27 0.864 +28 0.811 +29 0.757 +30 0.704 +31 0.651 +32 0.599 +33 0.547 +34 0.496 +35 0.445 +36 0.396 +37 0.347 +38 0.299 +39 0.253 +40 0.207 +41 0.163 +42 0.120 +43 0.079 +44 0.039 +45 -0.000 +46 -0.037 +47 -0.073 +48 -0.107 +49 -0.140 +50 -0.171 +51 -0.201 +52 -0.229 +53 -0.256 +54 -0.281 +55 -0.304 +56 -0.326 +57 -0.347 +58 -0.366 +59 -0.384 +60 -0.401 +61 -0.416 +62 -0.430 +63 -0.443 +64 -0.455 +65 -0.466 +66 -0.476 +67 -0.486 +68 -0.494 +69 -0.502 +70 -0.510 +71 -0.517 +72 -0.524 +73 -0.531 +74 -0.538 +75 -0.545 +76 -0.552 +77 -0.560 +78 -0.568 +79 -0.577 +80 -0.587 +81 -0.598 +82 -0.610 +83 -0.624 +84 -0.639 +85 -0.657 +86 -0.676 +87 -0.697 +88 -0.722 +89 -0.748 +90 -0.778 +1 1.236 +2 1.244 +3 1.248 +4 1.248 +5 1.244 +6 1.237 +7 1.227 +8 1.214 +9 1.198 +10 1.180 +11 1.159 +12 1.136 +13 1.111 +14 1.084 +15 1.056 +16 1.025 +17 0.994 +18 0.961 +19 0.926 +20 0.891 +21 0.855 +22 0.819 +23 0.781 +24 0.743 +25 0.705 +26 0.667 +27 0.628 +28 0.589 +29 0.551 +30 0.512 +31 0.474 +32 0.436 +33 0.398 +34 0.361 +35 0.324 +36 0.288 +37 0.253 +38 0.218 +39 0.184 +40 0.151 +41 0.119 +42 0.088 +43 0.058 +44 0.028 +45 -0.000 +46 -0.027 +47 -0.053 +48 -0.078 +49 -0.102 +50 -0.125 +51 -0.147 +52 -0.168 +53 -0.187 +54 -0.206 +55 -0.223 +56 -0.239 +57 -0.255 +58 -0.269 +59 -0.282 +60 -0.295 +61 -0.306 +62 -0.317 +63 -0.327 +64 -0.336 +65 -0.345 +66 -0.352 +67 -0.360 +68 -0.367 +69 -0.373 +70 -0.379 +71 -0.385 +72 -0.390 +73 -0.396 +74 -0.402 +75 -0.407 +76 -0.414 +77 -0.420 +78 -0.427 +79 -0.434 +80 -0.442 +81 -0.451 +82 -0.461 +83 -0.472 +84 -0.485 +85 -0.498 +86 -0.513 +87 -0.530 +88 -0.549 +89 -0.570 +90 -0.593 +1 1.342 +2 1.354 +3 1.362 +4 1.366 +5 1.365 +6 1.360 +7 1.352 +8 1.340 +9 1.325 +10 1.307 +11 1.286 +12 1.262 +13 1.236 +14 1.208 +15 1.178 +16 1.145 +17 1.111 +18 1.075 +19 1.038 +20 1.000 +21 0.961 +22 0.920 +23 0.879 +24 0.837 +25 0.795 +26 0.752 +27 0.709 +28 0.666 +29 0.623 +30 0.580 +31 0.537 +32 0.494 +33 0.452 +34 0.410 +35 0.369 +36 0.328 +37 0.288 +38 0.249 +39 0.211 +40 0.173 +41 0.136 +42 0.101 +43 0.066 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.091 +49 -0.118 +50 -0.145 +51 -0.171 +52 -0.195 +53 -0.218 +54 -0.240 +55 -0.261 +56 -0.280 +57 -0.299 +58 -0.316 +59 -0.333 +60 -0.348 +61 -0.363 +62 -0.376 +63 -0.389 +64 -0.401 +65 -0.413 +66 -0.423 +67 -0.433 +68 -0.443 +69 -0.452 +70 -0.461 +71 -0.470 +72 -0.478 +73 -0.487 +74 -0.496 +75 -0.505 +76 -0.514 +77 -0.524 +78 -0.534 +79 -0.545 +80 -0.557 +81 -0.570 +82 -0.585 +83 -0.600 +84 -0.618 +85 -0.636 +86 -0.657 +87 -0.680 +88 -0.705 +89 -0.732 +90 -0.762 +1 0.775 +2 0.784 +3 0.790 +4 0.793 +5 0.794 +6 0.792 +7 0.789 +8 0.783 +9 0.775 +10 0.765 +11 0.753 +12 0.740 +13 0.726 +14 0.710 +15 0.692 +16 0.674 +17 0.654 +18 0.634 +19 0.612 +20 0.590 +21 0.567 +22 0.544 +23 0.520 +24 0.495 +25 0.470 +26 0.445 +27 0.420 +28 0.395 +29 0.369 +30 0.344 +31 0.319 +32 0.294 +33 0.269 +34 0.244 +35 0.219 +36 0.195 +37 0.172 +38 0.148 +39 0.125 +40 0.103 +41 0.081 +42 0.060 +43 0.039 +44 0.019 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.054 +49 -0.071 +50 -0.087 +51 -0.103 +52 -0.117 +53 -0.131 +54 -0.145 +55 -0.157 +56 -0.169 +57 -0.181 +58 -0.192 +59 -0.202 +60 -0.212 +61 -0.221 +62 -0.229 +63 -0.237 +64 -0.245 +65 -0.253 +66 -0.260 +67 -0.266 +68 -0.273 +69 -0.279 +70 -0.285 +71 -0.291 +72 -0.297 +73 -0.303 +74 -0.309 +75 -0.316 +76 -0.322 +77 -0.329 +78 -0.336 +79 -0.344 +80 -0.353 +81 -0.362 +82 -0.372 +83 -0.382 +84 -0.394 +85 -0.407 +86 -0.421 +87 -0.436 +88 -0.452 +89 -0.470 +90 -0.490 +1 0.799 +2 0.816 +3 0.829 +4 0.838 +5 0.845 +6 0.849 +7 0.849 +8 0.847 +9 0.843 +10 0.836 +11 0.827 +12 0.815 +13 0.802 +14 0.787 +15 0.771 +16 0.752 +17 0.733 +18 0.712 +19 0.690 +20 0.666 +21 0.642 +22 0.617 +23 0.591 +24 0.565 +25 0.538 +26 0.511 +27 0.483 +28 0.455 +29 0.426 +30 0.398 +31 0.370 +32 0.341 +33 0.313 +34 0.285 +35 0.257 +36 0.229 +37 0.202 +38 0.175 +39 0.148 +40 0.122 +41 0.097 +42 0.072 +43 0.047 +44 0.023 +45 -0.000 +46 -0.023 +47 -0.045 +48 -0.066 +49 -0.086 +50 -0.106 +51 -0.125 +52 -0.144 +53 -0.162 +54 -0.179 +55 -0.195 +56 -0.211 +57 -0.226 +58 -0.241 +59 -0.255 +60 -0.268 +61 -0.281 +62 -0.294 +63 -0.306 +64 -0.317 +65 -0.329 +66 -0.340 +67 -0.350 +68 -0.361 +69 -0.372 +70 -0.382 +71 -0.392 +72 -0.403 +73 -0.414 +74 -0.425 +75 -0.436 +76 -0.448 +77 -0.460 +78 -0.473 +79 -0.487 +80 -0.501 +81 -0.516 +82 -0.533 +83 -0.550 +84 -0.569 +85 -0.590 +86 -0.611 +87 -0.635 +88 -0.660 +89 -0.687 +90 -0.716 +1 0.243 +2 0.258 +3 0.272 +4 0.283 +5 0.293 +6 0.301 +7 0.308 +8 0.313 +9 0.316 +10 0.319 +11 0.320 +12 0.319 +13 0.318 +14 0.316 +15 0.312 +16 0.308 +17 0.303 +18 0.296 +19 0.290 +20 0.282 +21 0.274 +22 0.265 +23 0.256 +24 0.246 +25 0.236 +26 0.225 +27 0.214 +28 0.203 +29 0.192 +30 0.180 +31 0.168 +32 0.156 +33 0.144 +34 0.132 +35 0.120 +36 0.107 +37 0.095 +38 0.083 +39 0.071 +40 0.059 +41 0.047 +42 0.035 +43 0.023 +44 0.011 +45 -0.000 +46 -0.011 +47 -0.022 +48 -0.033 +49 -0.044 +50 -0.054 +51 -0.065 +52 -0.075 +53 -0.085 +54 -0.095 +55 -0.104 +56 -0.114 +57 -0.123 +58 -0.132 +59 -0.141 +60 -0.150 +61 -0.159 +62 -0.167 +63 -0.176 +64 -0.185 +65 -0.193 +66 -0.202 +67 -0.210 +68 -0.219 +69 -0.228 +70 -0.237 +71 -0.246 +72 -0.256 +73 -0.265 +74 -0.275 +75 -0.285 +76 -0.296 +77 -0.307 +78 -0.319 +79 -0.331 +80 -0.343 +81 -0.357 +82 -0.371 +83 -0.385 +84 -0.401 +85 -0.417 +86 -0.435 +87 -0.453 +88 -0.473 +89 -0.493 +90 -0.515 +1 0.354 +2 0.386 +3 0.413 +4 0.438 +5 0.459 +6 0.477 +7 0.492 +8 0.505 +9 0.514 +10 0.521 +11 0.526 +12 0.529 +13 0.529 +14 0.527 +15 0.524 +16 0.518 +17 0.511 +18 0.503 +19 0.493 +20 0.481 +21 0.469 +22 0.455 +23 0.440 +24 0.425 +25 0.408 +26 0.391 +27 0.373 +28 0.354 +29 0.335 +30 0.315 +31 0.295 +32 0.274 +33 0.254 +34 0.233 +35 0.211 +36 0.190 +37 0.169 +38 0.147 +39 0.126 +40 0.105 +41 0.083 +42 0.062 +43 0.041 +44 0.021 +45 -0.000 +46 -0.020 +47 -0.041 +48 -0.060 +49 -0.080 +50 -0.100 +51 -0.119 +52 -0.138 +53 -0.156 +54 -0.175 +55 -0.193 +56 -0.211 +57 -0.228 +58 -0.246 +59 -0.263 +60 -0.281 +61 -0.298 +62 -0.315 +63 -0.332 +64 -0.349 +65 -0.366 +66 -0.383 +67 -0.400 +68 -0.418 +69 -0.436 +70 -0.454 +71 -0.473 +72 -0.491 +73 -0.511 +74 -0.531 +75 -0.552 +76 -0.573 +77 -0.596 +78 -0.619 +79 -0.643 +80 -0.668 +81 -0.695 +82 -0.723 +83 -0.752 +84 -0.783 +85 -0.815 +86 -0.849 +87 -0.885 +88 -0.923 +89 -0.963 +90 -1.005 +1 -0.183 +2 -0.151 +3 -0.121 +4 -0.093 +5 -0.067 +6 -0.043 +7 -0.021 +8 -0.001 +9 0.018 +10 0.034 +11 0.050 +12 0.063 +13 0.076 +14 0.086 +15 0.096 +16 0.104 +17 0.111 +18 0.117 +19 0.122 +20 0.126 +21 0.128 +22 0.130 +23 0.131 +24 0.131 +25 0.130 +26 0.129 +27 0.127 +28 0.124 +29 0.120 +30 0.116 +31 0.111 +32 0.106 +33 0.100 +34 0.094 +35 0.087 +36 0.080 +37 0.072 +38 0.064 +39 0.056 +40 0.048 +41 0.039 +42 0.029 +43 0.020 +44 0.010 +45 -0.000 +46 -0.010 +47 -0.021 +48 -0.032 +49 -0.043 +50 -0.054 +51 -0.065 +52 -0.077 +53 -0.089 +54 -0.101 +55 -0.114 +56 -0.126 +57 -0.139 +58 -0.153 +59 -0.166 +60 -0.180 +61 -0.194 +62 -0.208 +63 -0.223 +64 -0.238 +65 -0.254 +66 -0.270 +67 -0.286 +68 -0.303 +69 -0.320 +70 -0.338 +71 -0.356 +72 -0.375 +73 -0.395 +74 -0.415 +75 -0.436 +76 -0.458 +77 -0.481 +78 -0.504 +79 -0.528 +80 -0.553 +81 -0.579 +82 -0.606 +83 -0.635 +84 -0.664 +85 -0.695 +86 -0.726 +87 -0.759 +88 -0.794 +89 -0.830 +90 -0.867 +1 0.109 +2 0.164 +3 0.214 +4 0.259 +5 0.300 +6 0.337 +7 0.369 +8 0.398 +9 0.423 +10 0.444 +11 0.462 +12 0.477 +13 0.489 +14 0.498 +15 0.504 +16 0.507 +17 0.508 +18 0.507 +19 0.504 +20 0.498 +21 0.491 +22 0.482 +23 0.471 +24 0.459 +25 0.445 +26 0.430 +27 0.414 +28 0.396 +29 0.377 +30 0.358 +31 0.338 +32 0.316 +33 0.295 +34 0.272 +35 0.249 +36 0.226 +37 0.202 +38 0.177 +39 0.153 +40 0.128 +41 0.102 +42 0.077 +43 0.051 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.052 +48 -0.078 +49 -0.104 +50 -0.129 +51 -0.155 +52 -0.181 +53 -0.207 +54 -0.233 +55 -0.259 +56 -0.285 +57 -0.312 +58 -0.338 +59 -0.364 +60 -0.391 +61 -0.417 +62 -0.444 +63 -0.472 +64 -0.499 +65 -0.527 +66 -0.556 +67 -0.585 +68 -0.614 +69 -0.644 +70 -0.675 +71 -0.707 +72 -0.739 +73 -0.773 +74 -0.807 +75 -0.843 +76 -0.880 +77 -0.918 +78 -0.958 +79 -0.999 +80 -1.042 +81 -1.087 +82 -1.134 +83 -1.183 +84 -1.234 +85 -1.287 +86 -1.343 +87 -1.401 +88 -1.463 +89 -1.527 +90 -1.594 +1 -0.133 +2 -0.064 +3 -0.001 +4 0.057 +5 0.110 +6 0.158 +7 0.202 +8 0.242 +9 0.277 +10 0.309 +11 0.336 +12 0.361 +13 0.381 +14 0.398 +15 0.413 +16 0.424 +17 0.432 +18 0.438 +19 0.441 +20 0.442 +21 0.441 +22 0.437 +23 0.432 +24 0.424 +25 0.415 +26 0.404 +27 0.392 +28 0.378 +29 0.362 +30 0.346 +31 0.328 +32 0.310 +33 0.290 +34 0.269 +35 0.248 +36 0.226 +37 0.203 +38 0.179 +39 0.155 +40 0.130 +41 0.105 +42 0.079 +43 0.053 +44 0.027 +45 -0.000 +46 -0.027 +47 -0.055 +48 -0.082 +49 -0.110 +50 -0.138 +51 -0.167 +52 -0.196 +53 -0.225 +54 -0.254 +55 -0.284 +56 -0.313 +57 -0.344 +58 -0.374 +59 -0.405 +60 -0.436 +61 -0.468 +62 -0.500 +63 -0.533 +64 -0.567 +65 -0.601 +66 -0.635 +67 -0.671 +68 -0.707 +69 -0.745 +70 -0.783 +71 -0.822 +72 -0.863 +73 -0.905 +74 -0.948 +75 -0.992 +76 -1.038 +77 -1.086 +78 -1.136 +79 -1.187 +80 -1.241 +81 -1.296 +82 -1.354 +83 -1.414 +84 -1.477 +85 -1.542 +86 -1.611 +87 -1.682 +88 -1.756 +89 -1.834 +90 -1.915 +1 0.024 +2 0.103 +3 0.175 +4 0.240 +5 0.300 +6 0.354 +7 0.402 +8 0.445 +9 0.483 +10 0.516 +11 0.544 +12 0.568 +13 0.588 +14 0.604 +15 0.616 +16 0.624 +17 0.630 +18 0.631 +19 0.630 +20 0.626 +21 0.620 +22 0.610 +23 0.599 +24 0.585 +25 0.569 +26 0.551 +27 0.532 +28 0.511 +29 0.488 +30 0.464 +31 0.439 +32 0.412 +33 0.384 +34 0.356 +35 0.326 +36 0.296 +37 0.265 +38 0.234 +39 0.201 +40 0.169 +41 0.136 +42 0.102 +43 0.068 +44 0.034 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.104 +49 -0.139 +50 -0.174 +51 -0.210 +52 -0.245 +53 -0.281 +54 -0.317 +55 -0.353 +56 -0.389 +57 -0.425 +58 -0.462 +59 -0.498 +60 -0.536 +61 -0.573 +62 -0.611 +63 -0.650 +64 -0.689 +65 -0.728 +66 -0.769 +67 -0.810 +68 -0.852 +69 -0.895 +70 -0.939 +71 -0.984 +72 -1.031 +73 -1.079 +74 -1.128 +75 -1.179 +76 -1.232 +77 -1.287 +78 -1.344 +79 -1.403 +80 -1.464 +81 -1.528 +82 -1.594 +83 -1.664 +84 -1.736 +85 -1.812 +86 -1.890 +87 -1.973 +88 -2.059 +89 -2.150 +90 -2.244 +1 -0.069 +2 0.005 +3 0.073 +4 0.136 +5 0.193 +6 0.245 +7 0.292 +8 0.333 +9 0.371 +10 0.404 +11 0.432 +12 0.457 +13 0.478 +14 0.495 +15 0.508 +16 0.519 +17 0.526 +18 0.530 +19 0.531 +20 0.530 +21 0.527 +22 0.521 +23 0.512 +24 0.502 +25 0.490 +26 0.476 +27 0.460 +28 0.443 +29 0.424 +30 0.404 +31 0.383 +32 0.360 +33 0.337 +34 0.312 +35 0.287 +36 0.261 +37 0.234 +38 0.206 +39 0.178 +40 0.150 +41 0.120 +42 0.091 +43 0.061 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.093 +49 -0.125 +50 -0.157 +51 -0.189 +52 -0.221 +53 -0.254 +54 -0.286 +55 -0.319 +56 -0.353 +57 -0.386 +58 -0.420 +59 -0.454 +60 -0.489 +61 -0.524 +62 -0.559 +63 -0.595 +64 -0.631 +65 -0.669 +66 -0.707 +67 -0.745 +68 -0.785 +69 -0.825 +70 -0.867 +71 -0.910 +72 -0.954 +73 -0.999 +74 -1.046 +75 -1.094 +76 -1.144 +77 -1.196 +78 -1.249 +79 -1.305 +80 -1.363 +81 -1.423 +82 -1.486 +83 -1.551 +84 -1.619 +85 -1.690 +86 -1.765 +87 -1.842 +88 -1.923 +89 -2.008 +90 -2.096 +1 0.444 +2 0.524 +3 0.596 +4 0.661 +5 0.719 +6 0.770 +7 0.814 +8 0.852 +9 0.884 +10 0.911 +11 0.932 +12 0.948 +13 0.959 +14 0.965 +15 0.967 +16 0.966 +17 0.960 +18 0.951 +19 0.938 +20 0.922 +21 0.903 +22 0.882 +23 0.858 +24 0.831 +25 0.802 +26 0.772 +27 0.740 +28 0.705 +29 0.670 +30 0.633 +31 0.595 +32 0.556 +33 0.516 +34 0.475 +35 0.433 +36 0.391 +37 0.348 +38 0.305 +39 0.262 +40 0.218 +41 0.175 +42 0.131 +43 0.087 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.087 +48 -0.130 +49 -0.173 +50 -0.215 +51 -0.258 +52 -0.300 +53 -0.342 +54 -0.383 +55 -0.425 +56 -0.466 +57 -0.507 +58 -0.549 +59 -0.590 +60 -0.631 +61 -0.672 +62 -0.713 +63 -0.754 +64 -0.796 +65 -0.838 +66 -0.881 +67 -0.924 +68 -0.968 +69 -1.012 +70 -1.058 +71 -1.105 +72 -1.152 +73 -1.202 +74 -1.252 +75 -1.305 +76 -1.359 +77 -1.415 +78 -1.473 +79 -1.533 +80 -1.597 +81 -1.662 +82 -1.731 +83 -1.803 +84 -1.878 +85 -1.957 +86 -2.040 +87 -2.127 +88 -2.218 +89 -2.314 +90 -2.414 +1 0.406 +2 0.481 +3 0.549 +4 0.611 +5 0.665 +6 0.713 +7 0.755 +8 0.791 +9 0.821 +10 0.847 +11 0.867 +12 0.882 +13 0.893 +14 0.899 +15 0.902 +16 0.900 +17 0.895 +18 0.887 +19 0.875 +20 0.861 +21 0.843 +22 0.823 +23 0.801 +24 0.776 +25 0.750 +26 0.721 +27 0.691 +28 0.660 +29 0.626 +30 0.592 +31 0.556 +32 0.520 +33 0.483 +34 0.444 +35 0.405 +36 0.366 +37 0.326 +38 0.286 +39 0.245 +40 0.205 +41 0.164 +42 0.123 +43 0.082 +44 0.041 +45 -0.000 +46 -0.041 +47 -0.081 +48 -0.122 +49 -0.162 +50 -0.202 +51 -0.242 +52 -0.281 +53 -0.321 +54 -0.360 +55 -0.399 +56 -0.438 +57 -0.477 +58 -0.515 +59 -0.554 +60 -0.593 +61 -0.631 +62 -0.670 +63 -0.709 +64 -0.749 +65 -0.788 +66 -0.829 +67 -0.869 +68 -0.911 +69 -0.953 +70 -0.996 +71 -1.040 +72 -1.085 +73 -1.132 +74 -1.180 +75 -1.229 +76 -1.280 +77 -1.333 +78 -1.388 +79 -1.445 +80 -1.505 +81 -1.567 +82 -1.632 +83 -1.700 +84 -1.771 +85 -1.845 +86 -1.923 +87 -2.005 +88 -2.091 +89 -2.181 +90 -2.276 +1 1.033 +2 1.115 +3 1.188 +4 1.251 +5 1.306 +6 1.353 +7 1.391 +8 1.422 +9 1.446 +10 1.463 +11 1.474 +12 1.478 +13 1.477 +14 1.471 +15 1.459 +16 1.443 +17 1.422 +18 1.397 +19 1.368 +20 1.335 +21 1.300 +22 1.261 +23 1.219 +24 1.175 +25 1.128 +26 1.080 +27 1.029 +28 0.977 +29 0.924 +30 0.869 +31 0.813 +32 0.756 +33 0.699 +34 0.641 +35 0.582 +36 0.523 +37 0.464 +38 0.405 +39 0.346 +40 0.288 +41 0.229 +42 0.171 +43 0.114 +44 0.057 +45 -0.000 +46 -0.056 +47 -0.111 +48 -0.166 +49 -0.219 +50 -0.272 +51 -0.325 +52 -0.376 +53 -0.427 +54 -0.477 +55 -0.526 +56 -0.575 +57 -0.622 +58 -0.670 +59 -0.717 +60 -0.763 +61 -0.809 +62 -0.855 +63 -0.900 +64 -0.946 +65 -0.991 +66 -1.037 +67 -1.083 +68 -1.129 +69 -1.176 +70 -1.224 +71 -1.273 +72 -1.322 +73 -1.373 +74 -1.426 +75 -1.480 +76 -1.536 +77 -1.594 +78 -1.654 +79 -1.717 +80 -1.783 +81 -1.851 +82 -1.923 +83 -1.999 +84 -2.079 +85 -2.162 +86 -2.250 +87 -2.343 +88 -2.441 +89 -2.545 +90 -2.654 +1 0.948 +2 1.017 +3 1.078 +4 1.131 +5 1.176 +6 1.214 +7 1.246 +8 1.270 +9 1.289 +10 1.302 +11 1.310 +12 1.312 +13 1.309 +14 1.302 +15 1.290 +16 1.274 +17 1.254 +18 1.231 +19 1.205 +20 1.175 +21 1.143 +22 1.108 +23 1.071 +24 1.031 +25 0.990 +26 0.947 +27 0.902 +28 0.856 +29 0.808 +30 0.760 +31 0.711 +32 0.661 +33 0.610 +34 0.559 +35 0.508 +36 0.456 +37 0.405 +38 0.353 +39 0.302 +40 0.250 +41 0.199 +42 0.149 +43 0.099 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.096 +48 -0.143 +49 -0.190 +50 -0.236 +51 -0.281 +52 -0.325 +53 -0.369 +54 -0.412 +55 -0.454 +56 -0.495 +57 -0.537 +58 -0.577 +59 -0.617 +60 -0.656 +61 -0.696 +62 -0.734 +63 -0.773 +64 -0.812 +65 -0.850 +66 -0.889 +67 -0.927 +68 -0.966 +69 -1.006 +70 -1.046 +71 -1.087 +72 -1.129 +73 -1.171 +74 -1.215 +75 -1.261 +76 -1.308 +77 -1.356 +78 -1.407 +79 -1.460 +80 -1.515 +81 -1.572 +82 -1.633 +83 -1.697 +84 -1.764 +85 -1.834 +86 -1.908 +87 -1.987 +88 -2.069 +89 -2.157 +90 -2.249 +1 1.591 +2 1.668 +3 1.735 +4 1.791 +5 1.838 +6 1.876 +7 1.904 +8 1.925 +9 1.938 +10 1.943 +11 1.941 +12 1.933 +13 1.918 +14 1.898 +15 1.872 +16 1.841 +17 1.805 +18 1.765 +19 1.721 +20 1.673 +21 1.622 +22 1.567 +23 1.510 +24 1.450 +25 1.388 +26 1.324 +27 1.258 +28 1.190 +29 1.122 +30 1.052 +31 0.981 +32 0.910 +33 0.839 +34 0.767 +35 0.695 +36 0.623 +37 0.551 +38 0.480 +39 0.409 +40 0.339 +41 0.269 +42 0.200 +43 0.132 +44 0.066 +45 -0.000 +46 -0.065 +47 -0.128 +48 -0.190 +49 -0.251 +50 -0.311 +51 -0.369 +52 -0.426 +53 -0.482 +54 -0.537 +55 -0.590 +56 -0.642 +57 -0.693 +58 -0.743 +59 -0.792 +60 -0.840 +61 -0.888 +62 -0.934 +63 -0.980 +64 -1.025 +65 -1.071 +66 -1.115 +67 -1.160 +68 -1.205 +69 -1.250 +70 -1.296 +71 -1.342 +72 -1.389 +73 -1.438 +74 -1.487 +75 -1.538 +76 -1.591 +77 -1.646 +78 -1.703 +79 -1.763 +80 -1.825 +81 -1.891 +82 -1.960 +83 -2.033 +84 -2.109 +85 -2.191 +86 -2.277 +87 -2.368 +88 -2.465 +89 -2.567 +90 -2.676 +1 1.432 +2 1.493 +3 1.546 +4 1.590 +5 1.626 +6 1.654 +7 1.675 +8 1.690 +9 1.697 +10 1.698 +11 1.694 +12 1.684 +13 1.669 +14 1.649 +15 1.624 +16 1.595 +17 1.563 +18 1.526 +19 1.487 +20 1.444 +21 1.398 +22 1.350 +23 1.300 +24 1.247 +25 1.193 +26 1.137 +27 1.080 +28 1.021 +29 0.961 +30 0.901 +31 0.840 +32 0.779 +33 0.717 +34 0.655 +35 0.593 +36 0.531 +37 0.470 +38 0.409 +39 0.348 +40 0.288 +41 0.229 +42 0.170 +43 0.112 +44 0.056 +45 -0.000 +46 -0.055 +47 -0.108 +48 -0.161 +49 -0.212 +50 -0.263 +51 -0.312 +52 -0.359 +53 -0.406 +54 -0.452 +55 -0.496 +56 -0.540 +57 -0.582 +58 -0.624 +59 -0.664 +60 -0.704 +61 -0.742 +62 -0.781 +63 -0.818 +64 -0.855 +65 -0.892 +66 -0.928 +67 -0.965 +68 -1.001 +69 -1.037 +70 -1.074 +71 -1.111 +72 -1.149 +73 -1.188 +74 -1.227 +75 -1.268 +76 -1.311 +77 -1.354 +78 -1.400 +79 -1.448 +80 -1.498 +81 -1.551 +82 -1.606 +83 -1.665 +84 -1.727 +85 -1.793 +86 -1.862 +87 -1.936 +88 -2.014 +89 -2.098 +90 -2.186 +1 2.040 +2 2.110 +3 2.169 +4 2.217 +5 2.255 +6 2.283 +7 2.302 +8 2.313 +9 2.315 +10 2.309 +11 2.296 +12 2.276 +13 2.250 +14 2.218 +15 2.180 +16 2.137 +17 2.089 +18 2.036 +19 1.980 +20 1.920 +21 1.856 +22 1.789 +23 1.720 +24 1.648 +25 1.574 +26 1.498 +27 1.421 +28 1.342 +29 1.262 +30 1.181 +31 1.100 +32 1.018 +33 0.936 +34 0.854 +35 0.772 +36 0.691 +37 0.610 +38 0.530 +39 0.451 +40 0.373 +41 0.296 +42 0.220 +43 0.145 +44 0.072 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.271 +50 -0.335 +51 -0.397 +52 -0.457 +53 -0.516 +54 -0.573 +55 -0.628 +56 -0.682 +57 -0.734 +58 -0.785 +59 -0.834 +60 -0.882 +61 -0.929 +62 -0.975 +63 -1.020 +64 -1.064 +65 -1.107 +66 -1.150 +67 -1.192 +68 -1.234 +69 -1.277 +70 -1.319 +71 -1.362 +72 -1.405 +73 -1.450 +74 -1.495 +75 -1.542 +76 -1.590 +77 -1.640 +78 -1.693 +79 -1.748 +80 -1.805 +81 -1.866 +82 -1.930 +83 -1.998 +84 -2.070 +85 -2.147 +86 -2.229 +87 -2.315 +88 -2.408 +89 -2.506 +90 -2.611 +1 1.819 +2 1.877 +3 1.926 +4 1.966 +5 1.997 +6 2.020 +7 2.034 +8 2.041 +9 2.042 +10 2.035 +11 2.022 +12 2.003 +13 1.979 +14 1.950 +15 1.915 +16 1.877 +17 1.834 +18 1.787 +19 1.737 +20 1.683 +21 1.627 +22 1.568 +23 1.506 +24 1.443 +25 1.377 +26 1.311 +27 1.242 +28 1.173 +29 1.103 +30 1.032 +31 0.961 +32 0.889 +33 0.817 +34 0.745 +35 0.674 +36 0.603 +37 0.532 +38 0.462 +39 0.393 +40 0.325 +41 0.258 +42 0.191 +43 0.126 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.179 +49 -0.236 +50 -0.291 +51 -0.345 +52 -0.397 +53 -0.448 +54 -0.497 +55 -0.545 +56 -0.591 +57 -0.636 +58 -0.680 +59 -0.722 +60 -0.763 +61 -0.803 +62 -0.843 +63 -0.881 +64 -0.918 +65 -0.955 +66 -0.992 +67 -1.028 +68 -1.063 +69 -1.099 +70 -1.135 +71 -1.171 +72 -1.208 +73 -1.245 +74 -1.283 +75 -1.323 +76 -1.363 +77 -1.406 +78 -1.450 +79 -1.496 +80 -1.545 +81 -1.596 +82 -1.650 +83 -1.707 +84 -1.768 +85 -1.833 +86 -1.902 +87 -1.975 +88 -2.054 +89 -2.137 +90 -2.226 +1 2.411 +2 2.481 +3 2.538 +4 2.584 +5 2.619 +6 2.643 +7 2.658 +8 2.663 +9 2.659 +10 2.647 +11 2.627 +12 2.600 +13 2.565 +14 2.525 +15 2.478 +16 2.425 +17 2.368 +18 2.306 +19 2.239 +20 2.168 +21 2.094 +22 2.017 +23 1.936 +24 1.854 +25 1.769 +26 1.682 +27 1.593 +28 1.503 +29 1.413 +30 1.321 +31 1.229 +32 1.137 +33 1.044 +34 0.952 +35 0.860 +36 0.769 +37 0.678 +38 0.589 +39 0.501 +40 0.413 +41 0.327 +42 0.243 +43 0.160 +44 0.079 +45 -0.000 +46 -0.077 +47 -0.153 +48 -0.227 +49 -0.298 +50 -0.368 +51 -0.435 +52 -0.501 +53 -0.564 +54 -0.626 +55 -0.685 +56 -0.743 +57 -0.799 +58 -0.853 +59 -0.905 +60 -0.956 +61 -1.005 +62 -1.053 +63 -1.100 +64 -1.145 +65 -1.190 +66 -1.234 +67 -1.277 +68 -1.320 +69 -1.363 +70 -1.406 +71 -1.449 +72 -1.493 +73 -1.537 +74 -1.583 +75 -1.630 +76 -1.678 +77 -1.728 +78 -1.781 +79 -1.836 +80 -1.894 +81 -1.955 +82 -2.020 +83 -2.089 +84 -2.162 +85 -2.240 +86 -2.324 +87 -2.412 +88 -2.507 +89 -2.609 +90 -2.717 +1 2.023 +2 2.081 +3 2.128 +4 2.166 +5 2.195 +6 2.215 +7 2.227 +8 2.230 +9 2.227 +10 2.216 +11 2.199 +12 2.176 +13 2.147 +14 2.113 +15 2.073 +16 2.029 +17 1.981 +18 1.928 +19 1.873 +20 1.813 +21 1.751 +22 1.686 +23 1.619 +24 1.550 +25 1.479 +26 1.406 +27 1.332 +28 1.257 +29 1.181 +30 1.104 +31 1.027 +32 0.950 +33 0.872 +34 0.795 +35 0.719 +36 0.642 +37 0.567 +38 0.492 +39 0.418 +40 0.345 +41 0.273 +42 0.203 +43 0.134 +44 0.066 +45 -0.000 +46 -0.065 +47 -0.128 +48 -0.189 +49 -0.249 +50 -0.307 +51 -0.363 +52 -0.418 +53 -0.471 +54 -0.522 +55 -0.572 +56 -0.620 +57 -0.666 +58 -0.711 +59 -0.755 +60 -0.797 +61 -0.838 +62 -0.878 +63 -0.917 +64 -0.955 +65 -0.992 +66 -1.028 +67 -1.064 +68 -1.100 +69 -1.135 +70 -1.171 +71 -1.207 +72 -1.243 +73 -1.280 +74 -1.317 +75 -1.356 +76 -1.396 +77 -1.438 +78 -1.481 +79 -1.527 +80 -1.575 +81 -1.626 +82 -1.680 +83 -1.737 +84 -1.797 +85 -1.862 +86 -1.931 +87 -2.005 +88 -2.083 +89 -2.167 +90 -2.257 +1 2.471 +2 2.538 +3 2.593 +4 2.636 +5 2.668 +6 2.690 +7 2.702 +8 2.704 +9 2.698 +10 2.684 +11 2.662 +12 2.632 +13 2.596 +14 2.553 +15 2.504 +16 2.450 +17 2.391 +18 2.327 +19 2.258 +20 2.186 +21 2.111 +22 2.032 +23 1.950 +24 1.866 +25 1.780 +26 1.692 +27 1.602 +28 1.511 +29 1.419 +30 1.327 +31 1.234 +32 1.141 +33 1.048 +34 0.955 +35 0.863 +36 0.771 +37 0.680 +38 0.590 +39 0.501 +40 0.414 +41 0.328 +42 0.243 +43 0.160 +44 0.079 +45 -0.000 +46 -0.077 +47 -0.153 +48 -0.226 +49 -0.297 +50 -0.367 +51 -0.434 +52 -0.499 +53 -0.562 +54 -0.623 +55 -0.682 +56 -0.739 +57 -0.794 +58 -0.847 +59 -0.899 +60 -0.948 +61 -0.997 +62 -1.044 +63 -1.089 +64 -1.134 +65 -1.177 +66 -1.220 +67 -1.262 +68 -1.303 +69 -1.345 +70 -1.386 +71 -1.428 +72 -1.470 +73 -1.512 +74 -1.556 +75 -1.601 +76 -1.647 +77 -1.696 +78 -1.746 +79 -1.799 +80 -1.855 +81 -1.914 +82 -1.977 +83 -2.043 +84 -2.114 +85 -2.189 +86 -2.270 +87 -2.356 +88 -2.448 +89 -2.547 +90 -2.652 +1 2.022 +2 2.080 +3 2.127 +4 2.165 +5 2.194 +6 2.214 +7 2.226 +8 2.230 +9 2.226 +10 2.216 +11 2.199 +12 2.175 +13 2.147 +14 2.112 +15 2.073 +16 2.029 +17 1.981 +18 1.928 +19 1.872 +20 1.813 +21 1.751 +22 1.686 +23 1.619 +24 1.550 +25 1.479 +26 1.406 +27 1.332 +28 1.257 +29 1.181 +30 1.104 +31 1.027 +32 0.950 +33 0.873 +34 0.795 +35 0.719 +36 0.642 +37 0.567 +38 0.492 +39 0.418 +40 0.345 +41 0.274 +42 0.203 +43 0.134 +44 0.066 +45 -0.000 +46 -0.065 +47 -0.128 +48 -0.189 +49 -0.249 +50 -0.307 +51 -0.363 +52 -0.418 +53 -0.471 +54 -0.522 +55 -0.572 +56 -0.620 +57 -0.666 +58 -0.711 +59 -0.755 +60 -0.797 +61 -0.838 +62 -0.878 +63 -0.917 +64 -0.955 +65 -0.992 +66 -1.028 +67 -1.064 +68 -1.100 +69 -1.135 +70 -1.171 +71 -1.207 +72 -1.243 +73 -1.280 +74 -1.317 +75 -1.356 +76 -1.396 +77 -1.438 +78 -1.481 +79 -1.527 +80 -1.575 +81 -1.626 +82 -1.680 +83 -1.737 +84 -1.797 +85 -1.862 +86 -1.931 +87 -2.005 +88 -2.083 +89 -2.167 +90 -2.257 +1 2.409 +2 2.479 +3 2.537 +4 2.583 +5 2.618 +6 2.643 +7 2.657 +8 2.662 +9 2.659 +10 2.647 +11 2.627 +12 2.599 +13 2.565 +14 2.524 +15 2.477 +16 2.425 +17 2.368 +18 2.305 +19 2.239 +20 2.168 +21 2.094 +22 2.017 +23 1.936 +24 1.854 +25 1.769 +26 1.682 +27 1.593 +28 1.503 +29 1.413 +30 1.321 +31 1.229 +32 1.137 +33 1.044 +34 0.952 +35 0.860 +36 0.769 +37 0.678 +38 0.589 +39 0.501 +40 0.413 +41 0.327 +42 0.243 +43 0.160 +44 0.079 +45 -0.000 +46 -0.077 +47 -0.153 +48 -0.227 +49 -0.298 +50 -0.368 +51 -0.435 +52 -0.501 +53 -0.564 +54 -0.626 +55 -0.685 +56 -0.743 +57 -0.799 +58 -0.853 +59 -0.905 +60 -0.956 +61 -1.005 +62 -1.053 +63 -1.100 +64 -1.145 +65 -1.190 +66 -1.234 +67 -1.277 +68 -1.320 +69 -1.363 +70 -1.406 +71 -1.449 +72 -1.493 +73 -1.537 +74 -1.583 +75 -1.630 +76 -1.678 +77 -1.729 +78 -1.781 +79 -1.836 +80 -1.894 +81 -1.956 +82 -2.021 +83 -2.090 +84 -2.163 +85 -2.241 +86 -2.324 +87 -2.413 +88 -2.508 +89 -2.610 +90 -2.718 +1 1.816 +2 1.875 +3 1.924 +4 1.964 +5 1.995 +6 2.018 +7 2.033 +8 2.040 +9 2.040 +10 2.034 +11 2.021 +12 2.002 +13 1.978 +14 1.949 +15 1.915 +16 1.876 +17 1.833 +18 1.786 +19 1.736 +20 1.683 +21 1.626 +22 1.567 +23 1.506 +24 1.443 +25 1.377 +26 1.311 +27 1.242 +28 1.173 +29 1.103 +30 1.032 +31 0.961 +32 0.889 +33 0.817 +34 0.745 +35 0.674 +36 0.603 +37 0.532 +38 0.462 +39 0.393 +40 0.325 +41 0.258 +42 0.191 +43 0.126 +44 0.062 +45 -0.000 +46 -0.061 +47 -0.121 +48 -0.179 +49 -0.236 +50 -0.291 +51 -0.345 +52 -0.397 +53 -0.448 +54 -0.497 +55 -0.545 +56 -0.591 +57 -0.636 +58 -0.680 +59 -0.722 +60 -0.763 +61 -0.803 +62 -0.843 +63 -0.881 +64 -0.918 +65 -0.955 +66 -0.992 +67 -1.028 +68 -1.063 +69 -1.099 +70 -1.135 +71 -1.171 +72 -1.208 +73 -1.245 +74 -1.283 +75 -1.323 +76 -1.364 +77 -1.406 +78 -1.450 +79 -1.496 +80 -1.545 +81 -1.596 +82 -1.650 +83 -1.708 +84 -1.769 +85 -1.834 +86 -1.903 +87 -1.976 +88 -2.054 +89 -2.138 +90 -2.227 +1 2.036 +2 2.107 +3 2.166 +4 2.214 +5 2.252 +6 2.280 +7 2.300 +8 2.310 +9 2.312 +10 2.307 +11 2.294 +12 2.275 +13 2.248 +14 2.216 +15 2.179 +16 2.136 +17 2.088 +18 2.036 +19 1.979 +20 1.919 +21 1.856 +22 1.789 +23 1.720 +24 1.648 +25 1.574 +26 1.498 +27 1.420 +28 1.342 +29 1.262 +30 1.181 +31 1.100 +32 1.018 +33 0.936 +34 0.854 +35 0.772 +36 0.691 +37 0.610 +38 0.530 +39 0.451 +40 0.373 +41 0.296 +42 0.220 +43 0.145 +44 0.072 +45 -0.000 +46 -0.070 +47 -0.139 +48 -0.206 +49 -0.271 +50 -0.335 +51 -0.397 +52 -0.457 +53 -0.516 +54 -0.573 +55 -0.628 +56 -0.682 +57 -0.735 +58 -0.785 +59 -0.835 +60 -0.883 +61 -0.930 +62 -0.976 +63 -1.020 +64 -1.064 +65 -1.108 +66 -1.151 +67 -1.193 +68 -1.235 +69 -1.278 +70 -1.320 +71 -1.363 +72 -1.406 +73 -1.451 +74 -1.496 +75 -1.543 +76 -1.591 +77 -1.641 +78 -1.694 +79 -1.749 +80 -1.806 +81 -1.867 +82 -1.931 +83 -1.999 +84 -2.072 +85 -2.148 +86 -2.230 +87 -2.316 +88 -2.409 +89 -2.507 +90 -2.612 +1 1.429 +2 1.490 +3 1.543 +4 1.587 +5 1.623 +6 1.651 +7 1.672 +8 1.687 +9 1.694 +10 1.696 +11 1.691 +12 1.681 +13 1.666 +14 1.646 +15 1.622 +16 1.593 +17 1.560 +18 1.524 +19 1.485 +20 1.442 +21 1.396 +22 1.348 +23 1.298 +24 1.246 +25 1.191 +26 1.135 +27 1.078 +28 1.020 +29 0.960 +30 0.900 +31 0.839 +32 0.778 +33 0.716 +34 0.654 +35 0.592 +36 0.531 +37 0.469 +38 0.408 +39 0.348 +40 0.288 +41 0.229 +42 0.170 +43 0.112 +44 0.056 +45 -0.000 +46 -0.055 +47 -0.108 +48 -0.161 +49 -0.212 +50 -0.262 +51 -0.312 +52 -0.359 +53 -0.406 +54 -0.452 +55 -0.496 +56 -0.540 +57 -0.582 +58 -0.624 +59 -0.664 +60 -0.704 +61 -0.743 +62 -0.781 +63 -0.819 +64 -0.856 +65 -0.892 +66 -0.929 +67 -0.965 +68 -1.002 +69 -1.038 +70 -1.075 +71 -1.112 +72 -1.150 +73 -1.189 +74 -1.229 +75 -1.270 +76 -1.312 +77 -1.356 +78 -1.402 +79 -1.450 +80 -1.500 +81 -1.553 +82 -1.608 +83 -1.667 +84 -1.729 +85 -1.795 +86 -1.864 +87 -1.938 +88 -2.016 +89 -2.100 +90 -2.188 +1 1.590 +2 1.667 +3 1.733 +4 1.789 +5 1.836 +6 1.873 +7 1.902 +8 1.923 +9 1.935 +10 1.941 +11 1.939 +12 1.930 +13 1.916 +14 1.895 +15 1.870 +16 1.839 +17 1.803 +18 1.763 +19 1.719 +20 1.671 +21 1.620 +22 1.565 +23 1.508 +24 1.448 +25 1.386 +26 1.322 +27 1.256 +28 1.189 +29 1.121 +30 1.051 +31 0.981 +32 0.909 +33 0.838 +34 0.766 +35 0.694 +36 0.622 +37 0.551 +38 0.479 +39 0.408 +40 0.338 +41 0.269 +42 0.200 +43 0.132 +44 0.066 +45 -0.000 +46 -0.065 +47 -0.128 +48 -0.190 +49 -0.251 +50 -0.311 +51 -0.369 +52 -0.426 +53 -0.482 +54 -0.537 +55 -0.590 +56 -0.642 +57 -0.693 +58 -0.743 +59 -0.792 +60 -0.841 +61 -0.888 +62 -0.935 +63 -0.981 +64 -1.026 +65 -1.071 +66 -1.116 +67 -1.161 +68 -1.206 +69 -1.251 +70 -1.297 +71 -1.343 +72 -1.391 +73 -1.439 +74 -1.488 +75 -1.540 +76 -1.592 +77 -1.647 +78 -1.704 +79 -1.764 +80 -1.827 +81 -1.892 +82 -1.961 +83 -2.034 +84 -2.111 +85 -2.192 +86 -2.278 +87 -2.369 +88 -2.466 +89 -2.568 +90 -2.677 +1 0.947 +2 1.016 +3 1.077 +4 1.130 +5 1.175 +6 1.213 +7 1.245 +8 1.270 +9 1.288 +10 1.301 +11 1.309 +12 1.311 +13 1.308 +14 1.301 +15 1.289 +16 1.274 +17 1.254 +18 1.231 +19 1.204 +20 1.175 +21 1.143 +22 1.108 +23 1.070 +24 1.031 +25 0.990 +26 0.946 +27 0.902 +28 0.856 +29 0.808 +30 0.760 +31 0.711 +32 0.661 +33 0.610 +34 0.559 +35 0.508 +36 0.456 +37 0.405 +38 0.353 +39 0.302 +40 0.250 +41 0.199 +42 0.149 +43 0.099 +44 0.049 +45 -0.000 +46 -0.048 +47 -0.096 +48 -0.144 +49 -0.190 +50 -0.236 +51 -0.281 +52 -0.325 +53 -0.369 +54 -0.412 +55 -0.454 +56 -0.496 +57 -0.537 +58 -0.577 +59 -0.617 +60 -0.657 +61 -0.696 +62 -0.735 +63 -0.774 +64 -0.812 +65 -0.851 +66 -0.889 +67 -0.928 +68 -0.967 +69 -1.007 +70 -1.047 +71 -1.088 +72 -1.130 +73 -1.172 +74 -1.216 +75 -1.262 +76 -1.309 +77 -1.358 +78 -1.408 +79 -1.461 +80 -1.516 +81 -1.574 +82 -1.635 +83 -1.698 +84 -1.765 +85 -1.836 +86 -1.910 +87 -1.989 +88 -2.071 +89 -2.159 +90 -2.251 +1 1.033 +2 1.115 +3 1.188 +4 1.251 +5 1.306 +6 1.352 +7 1.391 +8 1.422 +9 1.446 +10 1.463 +11 1.474 +12 1.478 +13 1.477 +14 1.470 +15 1.459 +16 1.442 +17 1.422 +18 1.397 +19 1.368 +20 1.335 +21 1.299 +22 1.261 +23 1.219 +24 1.175 +25 1.128 +26 1.080 +27 1.029 +28 0.977 +29 0.924 +30 0.869 +31 0.813 +32 0.756 +33 0.699 +34 0.641 +35 0.582 +36 0.523 +37 0.464 +38 0.405 +39 0.347 +40 0.288 +41 0.229 +42 0.171 +43 0.114 +44 0.057 +45 -0.000 +46 -0.056 +47 -0.111 +48 -0.166 +49 -0.219 +50 -0.272 +51 -0.325 +52 -0.376 +53 -0.427 +54 -0.477 +55 -0.526 +56 -0.575 +57 -0.623 +58 -0.670 +59 -0.717 +60 -0.764 +61 -0.810 +62 -0.855 +63 -0.901 +64 -0.946 +65 -0.992 +66 -1.038 +67 -1.084 +68 -1.130 +69 -1.177 +70 -1.225 +71 -1.274 +72 -1.323 +73 -1.374 +74 -1.427 +75 -1.481 +76 -1.537 +77 -1.595 +78 -1.655 +79 -1.718 +80 -1.784 +81 -1.853 +82 -1.925 +83 -2.001 +84 -2.080 +85 -2.164 +86 -2.252 +87 -2.345 +88 -2.443 +89 -2.547 +90 -2.656 +1 0.406 +2 0.482 +3 0.550 +4 0.611 +5 0.666 +6 0.714 +7 0.756 +8 0.792 +9 0.823 +10 0.848 +11 0.868 +12 0.883 +13 0.894 +14 0.901 +15 0.903 +16 0.902 +17 0.897 +18 0.888 +19 0.877 +20 0.862 +21 0.845 +22 0.825 +23 0.802 +24 0.778 +25 0.751 +26 0.723 +27 0.692 +28 0.661 +29 0.627 +30 0.593 +31 0.557 +32 0.521 +33 0.483 +34 0.445 +35 0.406 +36 0.367 +37 0.327 +38 0.286 +39 0.246 +40 0.205 +41 0.164 +42 0.123 +43 0.082 +44 0.041 +45 -0.000 +46 -0.041 +47 -0.081 +48 -0.122 +49 -0.162 +50 -0.202 +51 -0.242 +52 -0.282 +53 -0.321 +54 -0.361 +55 -0.400 +56 -0.439 +57 -0.477 +58 -0.516 +59 -0.555 +60 -0.593 +61 -0.632 +62 -0.671 +63 -0.710 +64 -0.750 +65 -0.789 +66 -0.830 +67 -0.870 +68 -0.912 +69 -0.954 +70 -0.997 +71 -1.041 +72 -1.086 +73 -1.133 +74 -1.181 +75 -1.230 +76 -1.281 +77 -1.334 +78 -1.389 +79 -1.446 +80 -1.506 +81 -1.568 +82 -1.633 +83 -1.701 +84 -1.772 +85 -1.847 +86 -1.925 +87 -2.007 +88 -2.093 +89 -2.183 +90 -2.278 +1 0.446 +2 0.526 +3 0.598 +4 0.663 +5 0.721 +6 0.772 +7 0.816 +8 0.854 +9 0.886 +10 0.913 +11 0.934 +12 0.950 +13 0.961 +14 0.967 +15 0.969 +16 0.967 +17 0.962 +18 0.952 +19 0.940 +20 0.924 +21 0.905 +22 0.883 +23 0.859 +24 0.833 +25 0.804 +26 0.773 +27 0.741 +28 0.707 +29 0.671 +30 0.634 +31 0.596 +32 0.557 +33 0.516 +34 0.475 +35 0.434 +36 0.392 +37 0.349 +38 0.306 +39 0.262 +40 0.219 +41 0.175 +42 0.131 +43 0.087 +44 0.044 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.130 +49 -0.173 +50 -0.216 +51 -0.258 +52 -0.300 +53 -0.342 +54 -0.384 +55 -0.425 +56 -0.467 +57 -0.508 +58 -0.549 +59 -0.590 +60 -0.631 +61 -0.672 +62 -0.714 +63 -0.755 +64 -0.797 +65 -0.839 +66 -0.882 +67 -0.925 +68 -0.969 +69 -1.013 +70 -1.059 +71 -1.106 +72 -1.154 +73 -1.203 +74 -1.253 +75 -1.306 +76 -1.360 +77 -1.416 +78 -1.474 +79 -1.535 +80 -1.598 +81 -1.664 +82 -1.733 +83 -1.805 +84 -1.880 +85 -1.959 +86 -2.042 +87 -2.129 +88 -2.221 +89 -2.316 +90 -2.417 +1 -0.067 +2 0.007 +3 0.076 +4 0.139 +5 0.196 +6 0.248 +7 0.295 +8 0.337 +9 0.374 +10 0.407 +11 0.436 +12 0.460 +13 0.481 +14 0.498 +15 0.512 +16 0.522 +17 0.529 +18 0.533 +19 0.535 +20 0.534 +21 0.530 +22 0.524 +23 0.515 +24 0.505 +25 0.493 +26 0.478 +27 0.463 +28 0.445 +29 0.426 +30 0.406 +31 0.385 +32 0.362 +33 0.338 +34 0.314 +35 0.288 +36 0.262 +37 0.235 +38 0.207 +39 0.179 +40 0.150 +41 0.121 +42 0.091 +43 0.061 +44 0.031 +45 -0.000 +46 -0.031 +47 -0.062 +48 -0.094 +49 -0.125 +50 -0.157 +51 -0.190 +52 -0.222 +53 -0.254 +54 -0.287 +55 -0.320 +56 -0.353 +57 -0.387 +58 -0.421 +59 -0.455 +60 -0.489 +61 -0.524 +62 -0.560 +63 -0.596 +64 -0.632 +65 -0.670 +66 -0.708 +67 -0.746 +68 -0.786 +69 -0.826 +70 -0.868 +71 -0.911 +72 -0.955 +73 -1.000 +74 -1.047 +75 -1.095 +76 -1.145 +77 -1.197 +78 -1.250 +79 -1.306 +80 -1.364 +81 -1.424 +82 -1.487 +83 -1.552 +84 -1.621 +85 -1.692 +86 -1.766 +87 -1.844 +88 -1.925 +89 -2.009 +90 -2.098 +1 0.029 +2 0.108 +3 0.180 +4 0.245 +5 0.305 +6 0.359 +7 0.407 +8 0.450 +9 0.488 +10 0.521 +11 0.549 +12 0.573 +13 0.593 +14 0.608 +15 0.620 +16 0.629 +17 0.634 +18 0.635 +19 0.634 +20 0.630 +21 0.623 +22 0.614 +23 0.602 +24 0.588 +25 0.572 +26 0.554 +27 0.534 +28 0.513 +29 0.490 +30 0.466 +31 0.440 +32 0.414 +33 0.386 +34 0.357 +35 0.328 +36 0.297 +37 0.266 +38 0.234 +39 0.202 +40 0.169 +41 0.136 +42 0.103 +43 0.069 +44 0.034 +45 -0.000 +46 -0.035 +47 -0.069 +48 -0.104 +49 -0.140 +50 -0.175 +51 -0.210 +52 -0.246 +53 -0.281 +54 -0.317 +55 -0.353 +56 -0.389 +57 -0.426 +58 -0.462 +59 -0.499 +60 -0.536 +61 -0.574 +62 -0.612 +63 -0.651 +64 -0.690 +65 -0.729 +66 -0.770 +67 -0.811 +68 -0.853 +69 -0.896 +70 -0.940 +71 -0.985 +72 -1.032 +73 -1.080 +74 -1.129 +75 -1.180 +76 -1.233 +77 -1.288 +78 -1.345 +79 -1.404 +80 -1.465 +81 -1.529 +82 -1.596 +83 -1.665 +84 -1.738 +85 -1.814 +86 -1.893 +87 -1.975 +88 -2.062 +89 -2.152 +90 -2.247 +1 -0.127 +2 -0.059 +3 0.005 +4 0.063 +5 0.116 +6 0.165 +7 0.208 +8 0.248 +9 0.284 +10 0.315 +11 0.343 +12 0.367 +13 0.387 +14 0.404 +15 0.418 +16 0.430 +17 0.438 +18 0.443 +19 0.447 +20 0.447 +21 0.446 +22 0.442 +23 0.436 +24 0.428 +25 0.419 +26 0.408 +27 0.395 +28 0.381 +29 0.366 +30 0.349 +31 0.331 +32 0.312 +33 0.292 +34 0.271 +35 0.250 +36 0.227 +37 0.204 +38 0.180 +39 0.156 +40 0.131 +41 0.106 +42 0.080 +43 0.054 +44 0.027 +45 -0.000 +46 -0.027 +47 -0.055 +48 -0.083 +49 -0.111 +50 -0.139 +51 -0.168 +52 -0.197 +53 -0.226 +54 -0.255 +55 -0.285 +56 -0.315 +57 -0.345 +58 -0.376 +59 -0.407 +60 -0.438 +61 -0.470 +62 -0.502 +63 -0.535 +64 -0.569 +65 -0.603 +66 -0.637 +67 -0.673 +68 -0.709 +69 -0.747 +70 -0.785 +71 -0.824 +72 -0.865 +73 -0.907 +74 -0.950 +75 -0.994 +76 -1.041 +77 -1.088 +78 -1.138 +79 -1.189 +80 -1.243 +81 -1.298 +82 -1.356 +83 -1.417 +84 -1.479 +85 -1.545 +86 -1.613 +87 -1.685 +88 -1.759 +89 -1.837 +90 -1.918 +1 0.116 +2 0.171 +3 0.221 +4 0.266 +5 0.307 +6 0.344 +7 0.376 +8 0.405 +9 0.430 +10 0.451 +11 0.469 +12 0.484 +13 0.495 +14 0.504 +15 0.510 +16 0.513 +17 0.514 +18 0.513 +19 0.509 +20 0.504 +21 0.496 +22 0.487 +23 0.476 +24 0.463 +25 0.449 +26 0.434 +27 0.417 +28 0.399 +29 0.381 +30 0.361 +31 0.340 +32 0.319 +33 0.297 +34 0.274 +35 0.251 +36 0.227 +37 0.203 +38 0.178 +39 0.154 +40 0.128 +41 0.103 +42 0.077 +43 0.052 +44 0.026 +45 -0.000 +46 -0.026 +47 -0.052 +48 -0.078 +49 -0.104 +50 -0.130 +51 -0.156 +52 -0.182 +53 -0.208 +54 -0.234 +55 -0.261 +56 -0.287 +57 -0.313 +58 -0.339 +59 -0.366 +60 -0.392 +61 -0.419 +62 -0.446 +63 -0.473 +64 -0.501 +65 -0.529 +66 -0.557 +67 -0.586 +68 -0.616 +69 -0.646 +70 -0.677 +71 -0.709 +72 -0.741 +73 -0.775 +74 -0.809 +75 -0.845 +76 -0.882 +77 -0.920 +78 -0.960 +79 -1.002 +80 -1.045 +81 -1.089 +82 -1.136 +83 -1.185 +84 -1.236 +85 -1.290 +86 -1.346 +87 -1.404 +88 -1.465 +89 -1.530 +90 -1.597 +1 -0.175 +2 -0.142 +3 -0.113 +4 -0.085 +5 -0.059 +6 -0.035 +7 -0.013 +8 0.007 +9 0.025 +10 0.042 +11 0.057 +12 0.070 +13 0.082 +14 0.093 +15 0.102 +16 0.111 +17 0.117 +18 0.123 +19 0.128 +20 0.131 +21 0.134 +22 0.135 +23 0.136 +24 0.136 +25 0.135 +26 0.133 +27 0.130 +28 0.127 +29 0.123 +30 0.119 +31 0.114 +32 0.108 +33 0.102 +34 0.096 +35 0.089 +36 0.082 +37 0.074 +38 0.066 +39 0.057 +40 0.048 +41 0.039 +42 0.030 +43 0.020 +44 0.010 +45 -0.000 +46 -0.010 +47 -0.021 +48 -0.032 +49 -0.043 +50 -0.055 +51 -0.066 +52 -0.078 +53 -0.090 +54 -0.102 +55 -0.115 +56 -0.128 +57 -0.141 +58 -0.154 +59 -0.168 +60 -0.181 +61 -0.196 +62 -0.210 +63 -0.225 +64 -0.240 +65 -0.256 +66 -0.271 +67 -0.288 +68 -0.305 +69 -0.322 +70 -0.340 +71 -0.358 +72 -0.377 +73 -0.397 +74 -0.417 +75 -0.438 +76 -0.460 +77 -0.483 +78 -0.506 +79 -0.531 +80 -0.556 +81 -0.582 +82 -0.609 +83 -0.638 +84 -0.667 +85 -0.698 +86 -0.730 +87 -0.763 +88 -0.797 +89 -0.833 +90 -0.871 +1 0.363 +2 0.394 +3 0.422 +4 0.447 +5 0.468 +6 0.486 +7 0.501 +8 0.513 +9 0.523 +10 0.530 +11 0.535 +12 0.537 +13 0.537 +14 0.535 +15 0.532 +16 0.526 +17 0.519 +18 0.510 +19 0.500 +20 0.488 +21 0.475 +22 0.461 +23 0.446 +24 0.430 +25 0.414 +26 0.396 +27 0.378 +28 0.359 +29 0.339 +30 0.319 +31 0.299 +32 0.278 +33 0.257 +34 0.235 +35 0.214 +36 0.192 +37 0.171 +38 0.149 +39 0.127 +40 0.106 +41 0.084 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.041 +48 -0.061 +49 -0.081 +50 -0.101 +51 -0.120 +52 -0.139 +53 -0.158 +54 -0.176 +55 -0.195 +56 -0.213 +57 -0.230 +58 -0.248 +59 -0.266 +60 -0.283 +61 -0.300 +62 -0.317 +63 -0.334 +64 -0.352 +65 -0.369 +66 -0.386 +67 -0.403 +68 -0.421 +69 -0.439 +70 -0.457 +71 -0.476 +72 -0.495 +73 -0.514 +74 -0.534 +75 -0.555 +76 -0.576 +77 -0.599 +78 -0.622 +79 -0.646 +80 -0.672 +81 -0.698 +82 -0.726 +83 -0.755 +84 -0.786 +85 -0.819 +86 -0.853 +87 -0.889 +88 -0.927 +89 -0.967 +90 -1.009 +1 0.251 +2 0.267 +3 0.280 +4 0.292 +5 0.302 +6 0.310 +7 0.317 +8 0.322 +9 0.325 +10 0.328 +11 0.328 +12 0.328 +13 0.327 +14 0.324 +15 0.320 +16 0.316 +17 0.310 +18 0.304 +19 0.297 +20 0.289 +21 0.281 +22 0.272 +23 0.262 +24 0.252 +25 0.241 +26 0.231 +27 0.219 +28 0.208 +29 0.196 +30 0.184 +31 0.172 +32 0.160 +33 0.147 +34 0.135 +35 0.122 +36 0.110 +37 0.097 +38 0.085 +39 0.072 +40 0.060 +41 0.048 +42 0.035 +43 0.023 +44 0.012 +45 -0.000 +46 -0.011 +47 -0.023 +48 -0.034 +49 -0.045 +50 -0.055 +51 -0.066 +52 -0.076 +53 -0.086 +54 -0.096 +55 -0.106 +56 -0.116 +57 -0.125 +58 -0.134 +59 -0.143 +60 -0.152 +61 -0.161 +62 -0.170 +63 -0.179 +64 -0.187 +65 -0.196 +66 -0.205 +67 -0.213 +68 -0.222 +69 -0.231 +70 -0.240 +71 -0.249 +72 -0.259 +73 -0.268 +74 -0.278 +75 -0.289 +76 -0.299 +77 -0.311 +78 -0.322 +79 -0.334 +80 -0.347 +81 -0.361 +82 -0.375 +83 -0.390 +84 -0.405 +85 -0.422 +86 -0.440 +87 -0.458 +88 -0.478 +89 -0.499 +90 -0.521 +1 0.809 +2 0.826 +3 0.839 +4 0.849 +5 0.855 +6 0.858 +7 0.859 +8 0.857 +9 0.852 +10 0.845 +11 0.836 +12 0.824 +13 0.811 +14 0.796 +15 0.779 +16 0.760 +17 0.740 +18 0.719 +19 0.697 +20 0.673 +21 0.649 +22 0.623 +23 0.597 +24 0.571 +25 0.543 +26 0.516 +27 0.488 +28 0.459 +29 0.431 +30 0.402 +31 0.373 +32 0.345 +33 0.316 +34 0.288 +35 0.259 +36 0.231 +37 0.204 +38 0.177 +39 0.150 +40 0.123 +41 0.098 +42 0.072 +43 0.048 +44 0.023 +45 -0.000 +46 -0.023 +47 -0.045 +48 -0.066 +49 -0.087 +50 -0.107 +51 -0.127 +52 -0.145 +53 -0.163 +54 -0.181 +55 -0.197 +56 -0.213 +57 -0.229 +58 -0.243 +59 -0.258 +60 -0.271 +61 -0.284 +62 -0.297 +63 -0.309 +64 -0.321 +65 -0.332 +66 -0.343 +67 -0.354 +68 -0.365 +69 -0.375 +70 -0.386 +71 -0.397 +72 -0.407 +73 -0.418 +74 -0.429 +75 -0.441 +76 -0.452 +77 -0.465 +78 -0.478 +79 -0.491 +80 -0.506 +81 -0.521 +82 -0.538 +83 -0.556 +84 -0.575 +85 -0.595 +86 -0.617 +87 -0.640 +88 -0.666 +89 -0.693 +90 -0.722 +1 0.785 +2 0.794 +3 0.801 +4 0.804 +5 0.805 +6 0.803 +7 0.800 +8 0.794 +9 0.786 +10 0.776 +11 0.764 +12 0.751 +13 0.736 +14 0.720 +15 0.702 +16 0.683 +17 0.664 +18 0.643 +19 0.621 +20 0.598 +21 0.575 +22 0.551 +23 0.527 +24 0.502 +25 0.477 +26 0.452 +27 0.426 +28 0.401 +29 0.375 +30 0.349 +31 0.323 +32 0.298 +33 0.272 +34 0.247 +35 0.223 +36 0.198 +37 0.174 +38 0.150 +39 0.127 +40 0.105 +41 0.083 +42 0.061 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.055 +49 -0.072 +50 -0.088 +51 -0.104 +52 -0.119 +53 -0.133 +54 -0.147 +55 -0.160 +56 -0.172 +57 -0.183 +58 -0.194 +59 -0.205 +60 -0.215 +61 -0.224 +62 -0.233 +63 -0.241 +64 -0.249 +65 -0.256 +66 -0.263 +67 -0.270 +68 -0.276 +69 -0.283 +70 -0.289 +71 -0.295 +72 -0.301 +73 -0.307 +74 -0.314 +75 -0.320 +76 -0.327 +77 -0.334 +78 -0.341 +79 -0.349 +80 -0.358 +81 -0.367 +82 -0.377 +83 -0.388 +84 -0.400 +85 -0.413 +86 -0.427 +87 -0.443 +88 -0.460 +89 -0.478 +90 -0.498 +1 1.353 +2 1.365 +3 1.373 +4 1.377 +5 1.376 +6 1.371 +7 1.363 +8 1.351 +9 1.336 +10 1.318 +11 1.297 +12 1.273 +13 1.247 +14 1.218 +15 1.187 +16 1.155 +17 1.120 +18 1.084 +19 1.047 +20 1.008 +21 0.969 +22 0.928 +23 0.887 +24 0.845 +25 0.802 +26 0.759 +27 0.715 +28 0.672 +29 0.628 +30 0.585 +31 0.542 +32 0.499 +33 0.456 +34 0.414 +35 0.372 +36 0.331 +37 0.291 +38 0.251 +39 0.212 +40 0.174 +41 0.138 +42 0.102 +43 0.067 +44 0.033 +45 -0.000 +46 -0.032 +47 -0.062 +48 -0.091 +49 -0.120 +50 -0.146 +51 -0.172 +52 -0.197 +53 -0.220 +54 -0.242 +55 -0.263 +56 -0.283 +57 -0.302 +58 -0.320 +59 -0.336 +60 -0.352 +61 -0.366 +62 -0.380 +63 -0.393 +64 -0.405 +65 -0.417 +66 -0.428 +67 -0.438 +68 -0.448 +69 -0.457 +70 -0.466 +71 -0.475 +72 -0.484 +73 -0.492 +74 -0.501 +75 -0.510 +76 -0.520 +77 -0.530 +78 -0.541 +79 -0.552 +80 -0.564 +81 -0.578 +82 -0.592 +83 -0.608 +84 -0.625 +85 -0.645 +86 -0.666 +87 -0.689 +88 -0.714 +89 -0.742 +90 -0.772 +1 1.247 +2 1.255 +3 1.258 +4 1.259 +5 1.255 +6 1.248 +7 1.238 +8 1.225 +9 1.209 +10 1.191 +11 1.170 +12 1.147 +13 1.121 +14 1.094 +15 1.065 +16 1.035 +17 1.003 +18 0.970 +19 0.935 +20 0.900 +21 0.864 +22 0.826 +23 0.789 +24 0.751 +25 0.712 +26 0.673 +27 0.634 +28 0.595 +29 0.556 +30 0.517 +31 0.478 +32 0.440 +33 0.402 +34 0.364 +35 0.327 +36 0.291 +37 0.255 +38 0.220 +39 0.186 +40 0.153 +41 0.120 +42 0.089 +43 0.058 +44 0.029 +45 -0.000 +46 -0.027 +47 -0.054 +48 -0.079 +49 -0.103 +50 -0.127 +51 -0.149 +52 -0.169 +53 -0.189 +54 -0.208 +55 -0.226 +56 -0.242 +57 -0.258 +58 -0.272 +59 -0.286 +60 -0.298 +61 -0.310 +62 -0.321 +63 -0.331 +64 -0.340 +65 -0.349 +66 -0.357 +67 -0.364 +68 -0.371 +69 -0.378 +70 -0.384 +71 -0.390 +72 -0.396 +73 -0.402 +74 -0.407 +75 -0.413 +76 -0.420 +77 -0.426 +78 -0.433 +79 -0.441 +80 -0.449 +81 -0.459 +82 -0.469 +83 -0.480 +84 -0.493 +85 -0.507 +86 -0.523 +87 -0.540 +88 -0.559 +89 -0.580 +90 -0.604 +1 1.732 +2 1.741 +3 1.745 +4 1.744 +5 1.738 +6 1.727 +7 1.713 +8 1.694 +9 1.671 +10 1.645 +11 1.615 +12 1.583 +13 1.547 +14 1.509 +15 1.469 +16 1.426 +17 1.382 +18 1.336 +19 1.288 +20 1.239 +21 1.188 +22 1.137 +23 1.085 +24 1.032 +25 0.979 +26 0.925 +27 0.871 +28 0.817 +29 0.764 +30 0.710 +31 0.657 +32 0.604 +33 0.552 +34 0.500 +35 0.449 +36 0.399 +37 0.350 +38 0.302 +39 0.255 +40 0.209 +41 0.165 +42 0.121 +43 0.080 +44 0.039 +45 -0.000 +46 -0.038 +47 -0.074 +48 -0.108 +49 -0.141 +50 -0.173 +51 -0.203 +52 -0.231 +53 -0.258 +54 -0.283 +55 -0.307 +56 -0.330 +57 -0.350 +58 -0.370 +59 -0.388 +60 -0.405 +61 -0.420 +62 -0.435 +63 -0.448 +64 -0.460 +65 -0.471 +66 -0.482 +67 -0.491 +68 -0.500 +69 -0.508 +70 -0.516 +71 -0.523 +72 -0.530 +73 -0.537 +74 -0.544 +75 -0.552 +76 -0.559 +77 -0.567 +78 -0.575 +79 -0.585 +80 -0.595 +81 -0.606 +82 -0.619 +83 -0.633 +84 -0.649 +85 -0.666 +86 -0.686 +87 -0.708 +88 -0.733 +89 -0.760 +90 -0.790 +1 1.527 +2 1.535 +3 1.539 +4 1.538 +5 1.533 +6 1.524 +7 1.511 +8 1.494 +9 1.474 +10 1.451 +11 1.425 +12 1.397 +13 1.365 +14 1.332 +15 1.296 +16 1.259 +17 1.220 +18 1.179 +19 1.137 +20 1.094 +21 1.049 +22 1.004 +23 0.958 +24 0.911 +25 0.864 +26 0.817 +27 0.769 +28 0.722 +29 0.674 +30 0.627 +31 0.580 +32 0.533 +33 0.487 +34 0.442 +35 0.397 +36 0.352 +37 0.309 +38 0.267 +39 0.225 +40 0.185 +41 0.145 +42 0.107 +43 0.070 +44 0.035 +45 -0.000 +46 -0.033 +47 -0.065 +48 -0.096 +49 -0.125 +50 -0.153 +51 -0.179 +52 -0.204 +53 -0.228 +54 -0.250 +55 -0.272 +56 -0.291 +57 -0.310 +58 -0.327 +59 -0.343 +60 -0.358 +61 -0.372 +62 -0.385 +63 -0.396 +64 -0.407 +65 -0.417 +66 -0.426 +67 -0.435 +68 -0.443 +69 -0.450 +70 -0.457 +71 -0.464 +72 -0.470 +73 -0.476 +74 -0.483 +75 -0.489 +76 -0.496 +77 -0.503 +78 -0.510 +79 -0.519 +80 -0.528 +81 -0.538 +82 -0.549 +83 -0.562 +84 -0.576 +85 -0.592 +86 -0.609 +87 -0.629 +88 -0.651 +89 -0.675 +90 -0.702 +1 1.902 +2 1.913 +3 1.917 +4 1.916 +5 1.910 +6 1.899 +7 1.882 +8 1.862 +9 1.837 +10 1.808 +11 1.776 +12 1.740 +13 1.702 +14 1.660 +15 1.616 +16 1.569 +17 1.520 +18 1.470 +19 1.417 +20 1.363 +21 1.308 +22 1.252 +23 1.194 +24 1.136 +25 1.078 +26 1.019 +27 0.960 +28 0.900 +29 0.841 +30 0.782 +31 0.723 +32 0.665 +33 0.608 +34 0.551 +35 0.495 +36 0.440 +37 0.386 +38 0.333 +39 0.281 +40 0.231 +41 0.182 +42 0.134 +43 0.088 +44 0.043 +45 -0.000 +46 -0.041 +47 -0.081 +48 -0.119 +49 -0.156 +50 -0.191 +51 -0.224 +52 -0.255 +53 -0.285 +54 -0.313 +55 -0.339 +56 -0.364 +57 -0.387 +58 -0.409 +59 -0.429 +60 -0.448 +61 -0.465 +62 -0.481 +63 -0.496 +64 -0.509 +65 -0.522 +66 -0.534 +67 -0.544 +68 -0.554 +69 -0.563 +70 -0.572 +71 -0.580 +72 -0.588 +73 -0.596 +74 -0.604 +75 -0.612 +76 -0.621 +77 -0.629 +78 -0.639 +79 -0.649 +80 -0.661 +81 -0.673 +82 -0.687 +83 -0.703 +84 -0.721 +85 -0.740 +86 -0.762 +87 -0.786 +88 -0.813 +89 -0.844 +90 -0.877 +1 1.612 +2 1.624 +3 1.630 +4 1.631 +5 1.627 +6 1.619 +7 1.607 +8 1.590 +9 1.570 +10 1.547 +11 1.521 +12 1.491 +13 1.459 +14 1.424 +15 1.387 +16 1.348 +17 1.306 +18 1.264 +19 1.219 +20 1.173 +21 1.126 +22 1.078 +23 1.029 +24 0.980 +25 0.930 +26 0.879 +27 0.828 +28 0.778 +29 0.727 +30 0.676 +31 0.626 +32 0.576 +33 0.526 +34 0.477 +35 0.429 +36 0.381 +37 0.334 +38 0.289 +39 0.244 +40 0.200 +41 0.158 +42 0.116 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.071 +48 -0.104 +49 -0.136 +50 -0.167 +51 -0.196 +52 -0.223 +53 -0.250 +54 -0.274 +55 -0.298 +56 -0.320 +57 -0.340 +58 -0.360 +59 -0.378 +60 -0.395 +61 -0.411 +62 -0.425 +63 -0.439 +64 -0.452 +65 -0.463 +66 -0.474 +67 -0.485 +68 -0.494 +69 -0.503 +70 -0.512 +71 -0.520 +72 -0.529 +73 -0.537 +74 -0.545 +75 -0.553 +76 -0.562 +77 -0.571 +78 -0.581 +79 -0.591 +80 -0.603 +81 -0.616 +82 -0.629 +83 -0.645 +84 -0.662 +85 -0.681 +86 -0.702 +87 -0.725 +88 -0.751 +89 -0.779 +90 -0.810 +1 1.836 +2 1.847 +3 1.852 +4 1.852 +5 1.846 +6 1.835 +7 1.820 +8 1.801 +9 1.777 +10 1.750 +11 1.719 +12 1.685 +13 1.647 +14 1.607 +15 1.565 +16 1.520 +17 1.473 +18 1.424 +19 1.373 +20 1.321 +21 1.268 +22 1.213 +23 1.158 +24 1.102 +25 1.045 +26 0.988 +27 0.931 +28 0.874 +29 0.816 +30 0.759 +31 0.702 +32 0.646 +33 0.590 +34 0.535 +35 0.481 +36 0.427 +37 0.375 +38 0.323 +39 0.273 +40 0.224 +41 0.177 +42 0.130 +43 0.085 +44 0.042 +45 -0.000 +46 -0.040 +47 -0.079 +48 -0.116 +49 -0.152 +50 -0.186 +51 -0.218 +52 -0.249 +53 -0.278 +54 -0.305 +55 -0.331 +56 -0.355 +57 -0.378 +58 -0.399 +59 -0.419 +60 -0.437 +61 -0.454 +62 -0.470 +63 -0.485 +64 -0.498 +65 -0.511 +66 -0.522 +67 -0.533 +68 -0.543 +69 -0.552 +70 -0.561 +71 -0.569 +72 -0.578 +73 -0.586 +74 -0.594 +75 -0.602 +76 -0.610 +77 -0.619 +78 -0.629 +79 -0.640 +80 -0.651 +81 -0.664 +82 -0.678 +83 -0.694 +84 -0.711 +85 -0.731 +86 -0.752 +87 -0.776 +88 -0.803 +89 -0.833 +90 -0.866 +1 1.386 +2 1.396 +3 1.402 +4 1.403 +5 1.400 +6 1.393 +7 1.383 +8 1.369 +9 1.352 +10 1.332 +11 1.310 +12 1.284 +13 1.257 +14 1.227 +15 1.195 +16 1.161 +17 1.126 +18 1.089 +19 1.051 +20 1.011 +21 0.971 +22 0.929 +23 0.887 +24 0.845 +25 0.802 +26 0.758 +27 0.714 +28 0.671 +29 0.627 +30 0.583 +31 0.540 +32 0.496 +33 0.454 +34 0.411 +35 0.370 +36 0.329 +37 0.288 +38 0.249 +39 0.210 +40 0.173 +41 0.136 +42 0.100 +43 0.066 +44 0.032 +45 -0.000 +46 -0.031 +47 -0.061 +48 -0.090 +49 -0.117 +50 -0.144 +51 -0.169 +52 -0.193 +53 -0.215 +54 -0.237 +55 -0.257 +56 -0.276 +57 -0.294 +58 -0.311 +59 -0.326 +60 -0.341 +61 -0.354 +62 -0.367 +63 -0.379 +64 -0.390 +65 -0.400 +66 -0.409 +67 -0.418 +68 -0.427 +69 -0.434 +70 -0.442 +71 -0.449 +72 -0.456 +73 -0.463 +74 -0.470 +75 -0.478 +76 -0.485 +77 -0.493 +78 -0.502 +79 -0.511 +80 -0.521 +81 -0.532 +82 -0.544 +83 -0.557 +84 -0.572 +85 -0.588 +86 -0.606 +87 -0.626 +88 -0.649 +89 -0.673 +90 -0.700 +1 1.365 +2 1.370 +3 1.370 +4 1.367 +5 1.360 +6 1.350 +7 1.336 +8 1.320 +9 1.301 +10 1.279 +11 1.255 +12 1.228 +13 1.199 +14 1.169 +15 1.137 +16 1.103 +17 1.068 +18 1.031 +19 0.994 +20 0.955 +21 0.916 +22 0.876 +23 0.835 +24 0.794 +25 0.752 +26 0.711 +27 0.669 +28 0.627 +29 0.585 +30 0.544 +31 0.503 +32 0.462 +33 0.422 +34 0.382 +35 0.343 +36 0.305 +37 0.267 +38 0.230 +39 0.194 +40 0.159 +41 0.125 +42 0.092 +43 0.060 +44 0.030 +45 -0.000 +46 -0.028 +47 -0.056 +48 -0.082 +49 -0.107 +50 -0.130 +51 -0.153 +52 -0.174 +53 -0.194 +54 -0.213 +55 -0.230 +56 -0.247 +57 -0.262 +58 -0.276 +59 -0.289 +60 -0.301 +61 -0.312 +62 -0.322 +63 -0.331 +64 -0.340 +65 -0.347 +66 -0.354 +67 -0.360 +68 -0.365 +69 -0.370 +70 -0.375 +71 -0.379 +72 -0.383 +73 -0.387 +74 -0.391 +75 -0.394 +76 -0.398 +77 -0.403 +78 -0.407 +79 -0.412 +80 -0.418 +81 -0.425 +82 -0.432 +83 -0.440 +84 -0.450 +85 -0.461 +86 -0.474 +87 -0.488 +88 -0.504 +89 -0.522 +90 -0.542 +1 0.874 +2 0.879 +3 0.881 +4 0.881 +5 0.878 +6 0.873 +7 0.865 +8 0.856 +9 0.845 +10 0.832 +11 0.817 +12 0.800 +13 0.783 +14 0.763 +15 0.743 +16 0.722 +17 0.699 +18 0.676 +19 0.652 +20 0.627 +21 0.602 +22 0.576 +23 0.550 +24 0.523 +25 0.496 +26 0.469 +27 0.442 +28 0.414 +29 0.387 +30 0.360 +31 0.333 +32 0.306 +33 0.280 +34 0.254 +35 0.228 +36 0.203 +37 0.178 +38 0.153 +39 0.129 +40 0.106 +41 0.084 +42 0.062 +43 0.040 +44 0.020 +45 -0.000 +46 -0.019 +47 -0.037 +48 -0.055 +49 -0.072 +50 -0.088 +51 -0.103 +52 -0.118 +53 -0.131 +54 -0.144 +55 -0.157 +56 -0.168 +57 -0.179 +58 -0.189 +59 -0.198 +60 -0.207 +61 -0.215 +62 -0.222 +63 -0.229 +64 -0.236 +65 -0.241 +66 -0.247 +67 -0.252 +68 -0.257 +69 -0.261 +70 -0.265 +71 -0.269 +72 -0.273 +73 -0.276 +74 -0.280 +75 -0.284 +76 -0.288 +77 -0.292 +78 -0.297 +79 -0.302 +80 -0.307 +81 -0.313 +82 -0.320 +83 -0.327 +84 -0.335 +85 -0.344 +86 -0.354 +87 -0.366 +88 -0.378 +89 -0.392 +90 -0.408 +1 0.651 +2 0.647 +3 0.642 +4 0.636 +5 0.628 +6 0.619 +7 0.609 +8 0.598 +9 0.586 +10 0.573 +11 0.559 +12 0.545 +13 0.529 +14 0.514 +15 0.497 +16 0.481 +17 0.463 +18 0.446 +19 0.428 +20 0.410 +21 0.391 +22 0.373 +23 0.354 +24 0.335 +25 0.317 +26 0.298 +27 0.280 +28 0.261 +29 0.243 +30 0.225 +31 0.207 +32 0.190 +33 0.173 +34 0.156 +35 0.139 +36 0.123 +37 0.107 +38 0.092 +39 0.078 +40 0.063 +41 0.050 +42 0.036 +43 0.024 +44 0.012 +45 -0.000 +46 -0.011 +47 -0.021 +48 -0.031 +49 -0.040 +50 -0.049 +51 -0.057 +52 -0.064 +53 -0.071 +54 -0.077 +55 -0.083 +56 -0.088 +57 -0.093 +58 -0.097 +59 -0.100 +60 -0.103 +61 -0.105 +62 -0.107 +63 -0.109 +64 -0.109 +65 -0.110 +66 -0.110 +67 -0.110 +68 -0.109 +69 -0.108 +70 -0.107 +71 -0.106 +72 -0.104 +73 -0.102 +74 -0.100 +75 -0.098 +76 -0.096 +77 -0.094 +78 -0.091 +79 -0.089 +80 -0.087 +81 -0.086 +82 -0.084 +83 -0.083 +84 -0.082 +85 -0.082 +86 -0.082 +87 -0.082 +88 -0.084 +89 -0.085 +90 -0.088 +1 0.059 +2 0.053 +3 0.047 +4 0.041 +5 0.036 +6 0.031 +7 0.027 +8 0.022 +9 0.018 +10 0.015 +11 0.011 +12 0.008 +13 0.005 +14 0.003 +15 0.000 +16 -0.002 +17 -0.004 +18 -0.006 +19 -0.007 +20 -0.009 +21 -0.010 +22 -0.011 +23 -0.012 +24 -0.013 +25 -0.013 +26 -0.014 +27 -0.014 +28 -0.014 +29 -0.014 +30 -0.014 +31 -0.014 +32 -0.013 +33 -0.013 +34 -0.012 +35 -0.012 +36 -0.011 +37 -0.010 +38 -0.009 +39 -0.008 +40 -0.007 +41 -0.006 +42 -0.004 +43 -0.003 +44 -0.002 +45 0.000 +46 0.002 +47 0.003 +48 0.005 +49 0.007 +50 0.009 +51 0.011 +52 0.013 +53 0.015 +54 0.017 +55 0.019 +56 0.021 +57 0.024 +58 0.026 +59 0.029 +60 0.031 +61 0.034 +62 0.037 +63 0.040 +64 0.043 +65 0.046 +66 0.049 +67 0.052 +68 0.055 +69 0.058 +70 0.062 +71 0.066 +72 0.069 +73 0.073 +74 0.077 +75 0.081 +76 0.086 +77 0.090 +78 0.094 +79 0.099 +80 0.104 +81 0.109 +82 0.114 +83 0.120 +84 0.125 +85 0.131 +86 0.137 +87 0.143 +88 0.149 +89 0.156 +90 0.163 +1 -0.359 +2 -0.383 +3 -0.405 +4 -0.423 +5 -0.439 +6 -0.452 +7 -0.463 +8 -0.471 +9 -0.478 +10 -0.482 +11 -0.484 +12 -0.484 +13 -0.483 +14 -0.479 +15 -0.475 +16 -0.468 +17 -0.461 +18 -0.452 +19 -0.442 +20 -0.431 +21 -0.419 +22 -0.406 +23 -0.392 +24 -0.377 +25 -0.362 +26 -0.346 +27 -0.329 +28 -0.312 +29 -0.295 +30 -0.277 +31 -0.259 +32 -0.241 +33 -0.222 +34 -0.203 +35 -0.185 +36 -0.166 +37 -0.147 +38 -0.128 +39 -0.109 +40 -0.091 +41 -0.072 +42 -0.054 +43 -0.036 +44 -0.018 +45 0.000 +46 0.018 +47 0.035 +48 0.052 +49 0.069 +50 0.085 +51 0.101 +52 0.117 +53 0.133 +54 0.148 +55 0.163 +56 0.178 +57 0.193 +58 0.207 +59 0.221 +60 0.235 +61 0.249 +62 0.263 +63 0.277 +64 0.290 +65 0.304 +66 0.318 +67 0.331 +68 0.345 +69 0.359 +70 0.373 +71 0.387 +72 0.402 +73 0.417 +74 0.432 +75 0.448 +76 0.465 +77 0.482 +78 0.500 +79 0.518 +80 0.538 +81 0.558 +82 0.580 +83 0.602 +84 0.626 +85 0.651 +86 0.677 +87 0.705 +88 0.734 +89 0.765 +90 0.798 +1 -1.020 +2 -1.049 +3 -1.073 +4 -1.092 +5 -1.106 +6 -1.116 +7 -1.122 +8 -1.124 +9 -1.122 +10 -1.116 +11 -1.108 +12 -1.096 +13 -1.081 +14 -1.064 +15 -1.044 +16 -1.022 +17 -0.997 +18 -0.971 +19 -0.942 +20 -0.913 +21 -0.881 +22 -0.848 +23 -0.815 +24 -0.780 +25 -0.744 +26 -0.707 +27 -0.670 +28 -0.632 +29 -0.594 +30 -0.555 +31 -0.516 +32 -0.477 +33 -0.438 +34 -0.400 +35 -0.361 +36 -0.323 +37 -0.285 +38 -0.247 +39 -0.210 +40 -0.173 +41 -0.137 +42 -0.102 +43 -0.067 +44 -0.033 +45 0.000 +46 0.032 +47 0.064 +48 0.095 +49 0.125 +50 0.154 +51 0.182 +52 0.209 +53 0.236 +54 0.262 +55 0.286 +56 0.310 +57 0.334 +58 0.356 +59 0.378 +60 0.399 +61 0.419 +62 0.439 +63 0.458 +64 0.477 +65 0.496 +66 0.514 +67 0.532 +68 0.550 +69 0.567 +70 0.585 +71 0.603 +72 0.621 +73 0.639 +74 0.658 +75 0.677 +76 0.697 +77 0.718 +78 0.740 +79 0.763 +80 0.787 +81 0.812 +82 0.839 +83 0.868 +84 0.898 +85 0.931 +86 0.966 +87 1.003 +88 1.042 +89 1.085 +90 1.130 +1 -1.462 +2 -1.515 +3 -1.560 +4 -1.597 +5 -1.626 +6 -1.648 +7 -1.663 +8 -1.672 +9 -1.675 +10 -1.672 +11 -1.664 +12 -1.651 +13 -1.633 +14 -1.610 +15 -1.583 +16 -1.553 +17 -1.519 +18 -1.481 +19 -1.441 +20 -1.397 +21 -1.351 +22 -1.303 +23 -1.253 +24 -1.201 +25 -1.147 +26 -1.092 +27 -1.036 +28 -0.979 +29 -0.921 +30 -0.862 +31 -0.803 +32 -0.743 +33 -0.684 +34 -0.624 +35 -0.564 +36 -0.505 +37 -0.446 +38 -0.388 +39 -0.330 +40 -0.273 +41 -0.216 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.051 +47 0.102 +48 0.151 +49 0.199 +50 0.246 +51 0.291 +52 0.336 +53 0.379 +54 0.421 +55 0.462 +56 0.501 +57 0.540 +58 0.577 +59 0.614 +60 0.650 +61 0.684 +62 0.718 +63 0.752 +64 0.785 +65 0.817 +66 0.849 +67 0.881 +68 0.912 +69 0.944 +70 0.976 +71 1.008 +72 1.041 +73 1.074 +74 1.109 +75 1.144 +76 1.181 +77 1.219 +78 1.258 +79 1.300 +80 1.343 +81 1.389 +82 1.438 +83 1.489 +84 1.544 +85 1.602 +86 1.663 +87 1.728 +88 1.798 +89 1.872 +90 1.951 +1 -2.227 +2 -2.298 +3 -2.357 +4 -2.404 +5 -2.441 +6 -2.468 +7 -2.485 +8 -2.493 +9 -2.492 +10 -2.484 +11 -2.467 +12 -2.444 +13 -2.414 +14 -2.377 +15 -2.335 +16 -2.287 +17 -2.234 +18 -2.177 +19 -2.115 +20 -2.049 +21 -1.980 +22 -1.908 +23 -1.833 +24 -1.755 +25 -1.676 +26 -1.594 +27 -1.511 +28 -1.426 +29 -1.340 +30 -1.254 +31 -1.167 +32 -1.080 +33 -0.992 +34 -0.905 +35 -0.818 +36 -0.732 +37 -0.646 +38 -0.561 +39 -0.477 +40 -0.394 +41 -0.312 +42 -0.232 +43 -0.153 +44 -0.076 +45 0.000 +46 0.074 +47 0.146 +48 0.217 +49 0.285 +50 0.352 +51 0.417 +52 0.480 +53 0.541 +54 0.600 +55 0.657 +56 0.713 +57 0.767 +58 0.820 +59 0.870 +60 0.920 +61 0.968 +62 1.015 +63 1.061 +64 1.105 +65 1.150 +66 1.193 +67 1.236 +68 1.279 +69 1.321 +70 1.364 +71 1.407 +72 1.451 +73 1.495 +74 1.541 +75 1.588 +76 1.637 +77 1.688 +78 1.741 +79 1.796 +80 1.854 +81 1.916 +82 1.981 +83 2.050 +84 2.124 +85 2.202 +86 2.285 +87 2.374 +88 2.469 +89 2.570 +90 2.678 +1 -2.463 +2 -2.545 +3 -2.614 +4 -2.670 +5 -2.714 +6 -2.746 +7 -2.768 +8 -2.779 +9 -2.781 +10 -2.773 +11 -2.756 +12 -2.732 +13 -2.699 +14 -2.660 +15 -2.614 +16 -2.561 +17 -2.503 +18 -2.440 +19 -2.371 +20 -2.299 +21 -2.222 +22 -2.142 +23 -2.058 +24 -1.972 +25 -1.883 +26 -1.791 +27 -1.698 +28 -1.604 +29 -1.508 +30 -1.411 +31 -1.314 +32 -1.216 +33 -1.118 +34 -1.019 +35 -0.922 +36 -0.825 +37 -0.728 +38 -0.632 +39 -0.538 +40 -0.444 +41 -0.352 +42 -0.262 +43 -0.173 +44 -0.085 +45 0.000 +46 0.084 +47 0.165 +48 0.245 +49 0.323 +50 0.398 +51 0.472 +52 0.543 +53 0.613 +54 0.680 +55 0.746 +56 0.809 +57 0.871 +58 0.931 +59 0.989 +60 1.046 +61 1.101 +62 1.155 +63 1.208 +64 1.259 +65 1.310 +66 1.360 +67 1.410 +68 1.460 +69 1.509 +70 1.559 +71 1.609 +72 1.660 +73 1.712 +74 1.765 +75 1.820 +76 1.877 +77 1.936 +78 1.998 +79 2.062 +80 2.130 +81 2.202 +82 2.278 +83 2.358 +84 2.443 +85 2.534 +86 2.630 +87 2.733 +88 2.843 +89 2.959 +90 3.084 +1 -2.539 +2 -2.619 +3 -2.685 +4 -2.739 +5 -2.781 +6 -2.811 +7 -2.831 +8 -2.839 +9 -2.839 +10 -2.829 +11 -2.810 +12 -2.783 +13 -2.748 +14 -2.707 +15 -2.658 +16 -2.604 +17 -2.543 +18 -2.478 +19 -2.408 +20 -2.333 +21 -2.254 +22 -2.172 +23 -2.086 +24 -1.998 +25 -1.907 +26 -1.814 +27 -1.719 +28 -1.623 +29 -1.525 +30 -1.427 +31 -1.328 +32 -1.229 +33 -1.129 +34 -1.030 +35 -0.931 +36 -0.832 +37 -0.735 +38 -0.638 +39 -0.542 +40 -0.448 +41 -0.355 +42 -0.264 +43 -0.174 +44 -0.086 +45 0.000 +46 0.084 +47 0.166 +48 0.246 +49 0.324 +50 0.400 +51 0.474 +52 0.545 +53 0.615 +54 0.682 +55 0.748 +56 0.811 +57 0.872 +58 0.932 +59 0.990 +60 1.046 +61 1.101 +62 1.154 +63 1.206 +64 1.257 +65 1.307 +66 1.356 +67 1.405 +68 1.454 +69 1.502 +70 1.551 +71 1.600 +72 1.650 +73 1.701 +74 1.753 +75 1.806 +76 1.862 +77 1.919 +78 1.980 +79 2.043 +80 2.109 +81 2.180 +82 2.254 +83 2.333 +84 2.416 +85 2.506 +86 2.600 +87 2.702 +88 2.810 +89 2.925 +90 3.048 +1 -2.273 +2 -2.359 +3 -2.432 +4 -2.492 +5 -2.541 +6 -2.578 +7 -2.604 +8 -2.620 +9 -2.627 +10 -2.624 +11 -2.613 +12 -2.593 +13 -2.566 +14 -2.532 +15 -2.491 +16 -2.443 +17 -2.391 +18 -2.332 +19 -2.269 +20 -2.202 +21 -2.130 +22 -2.055 +23 -1.976 +24 -1.895 +25 -1.811 +26 -1.724 +27 -1.636 +28 -1.546 +29 -1.454 +30 -1.362 +31 -1.269 +32 -1.175 +33 -1.081 +34 -0.987 +35 -0.893 +36 -0.799 +37 -0.706 +38 -0.614 +39 -0.522 +40 -0.432 +41 -0.343 +42 -0.255 +43 -0.168 +44 -0.083 +45 0.000 +46 0.082 +47 0.162 +48 0.240 +49 0.316 +50 0.390 +51 0.463 +52 0.533 +53 0.602 +54 0.669 +55 0.734 +56 0.797 +57 0.859 +58 0.919 +59 0.978 +60 1.035 +61 1.091 +62 1.145 +63 1.199 +64 1.252 +65 1.304 +66 1.355 +67 1.407 +68 1.458 +69 1.509 +70 1.561 +71 1.613 +72 1.666 +73 1.721 +74 1.776 +75 1.834 +76 1.893 +77 1.955 +78 2.019 +79 2.087 +80 2.157 +81 2.232 +82 2.311 +83 2.394 +84 2.482 +85 2.576 +86 2.675 +87 2.781 +88 2.894 +89 3.014 +90 3.141 +1 -2.277 +2 -2.360 +3 -2.431 +4 -2.489 +5 -2.535 +6 -2.570 +7 -2.595 +8 -2.609 +9 -2.614 +10 -2.610 +11 -2.597 +12 -2.577 +13 -2.549 +14 -2.514 +15 -2.472 +16 -2.425 +17 -2.371 +18 -2.313 +19 -2.250 +20 -2.182 +21 -2.111 +22 -2.036 +23 -1.957 +24 -1.876 +25 -1.793 +26 -1.707 +27 -1.619 +28 -1.529 +29 -1.439 +30 -1.347 +31 -1.255 +32 -1.162 +33 -1.068 +34 -0.975 +35 -0.882 +36 -0.789 +37 -0.697 +38 -0.606 +39 -0.516 +40 -0.426 +41 -0.338 +42 -0.251 +43 -0.166 +44 -0.082 +45 0.000 +46 0.080 +47 0.159 +48 0.236 +49 0.311 +50 0.384 +51 0.456 +52 0.525 +53 0.592 +54 0.658 +55 0.722 +56 0.784 +57 0.844 +58 0.903 +59 0.961 +60 1.016 +61 1.071 +62 1.124 +63 1.177 +64 1.228 +65 1.279 +66 1.329 +67 1.379 +68 1.429 +69 1.479 +70 1.529 +71 1.580 +72 1.631 +73 1.684 +74 1.738 +75 1.794 +76 1.851 +77 1.911 +78 1.974 +79 2.039 +80 2.108 +81 2.180 +82 2.257 +83 2.338 +84 2.424 +85 2.515 +86 2.612 +87 2.715 +88 2.825 +89 2.942 +90 3.066 +1 -1.920 +2 -2.010 +3 -2.087 +4 -2.153 +5 -2.207 +6 -2.250 +7 -2.283 +8 -2.306 +9 -2.320 +10 -2.325 +11 -2.321 +12 -2.310 +13 -2.292 +14 -2.266 +15 -2.235 +16 -2.197 +17 -2.153 +18 -2.105 +19 -2.051 +20 -1.993 +21 -1.932 +22 -1.866 +23 -1.797 +24 -1.726 +25 -1.651 +26 -1.575 +27 -1.496 +28 -1.415 +29 -1.333 +30 -1.250 +31 -1.166 +32 -1.081 +33 -0.996 +34 -0.910 +35 -0.824 +36 -0.739 +37 -0.653 +38 -0.569 +39 -0.485 +40 -0.401 +41 -0.319 +42 -0.237 +43 -0.157 +44 -0.078 +45 0.000 +46 0.076 +47 0.151 +48 0.225 +49 0.297 +50 0.367 +51 0.436 +52 0.503 +53 0.569 +54 0.633 +55 0.696 +56 0.757 +57 0.817 +58 0.876 +59 0.934 +60 0.990 +61 1.045 +62 1.100 +63 1.154 +64 1.207 +65 1.260 +66 1.312 +67 1.364 +68 1.417 +69 1.470 +70 1.523 +71 1.577 +72 1.632 +73 1.689 +74 1.747 +75 1.806 +76 1.868 +77 1.932 +78 1.999 +79 2.069 +80 2.143 +81 2.220 +82 2.301 +83 2.387 +84 2.478 +85 2.574 +86 2.675 +87 2.783 +88 2.897 +89 3.018 +90 3.147 +1 -1.701 +2 -1.779 +3 -1.846 +4 -1.902 +5 -1.949 +6 -1.986 +7 -2.014 +8 -2.033 +9 -2.045 +10 -2.048 +11 -2.045 +12 -2.034 +13 -2.017 +14 -1.995 +15 -1.966 +16 -1.932 +17 -1.894 +18 -1.851 +19 -1.803 +20 -1.752 +21 -1.698 +22 -1.640 +23 -1.579 +24 -1.516 +25 -1.450 +26 -1.383 +27 -1.313 +28 -1.242 +29 -1.170 +30 -1.097 +31 -1.023 +32 -0.948 +33 -0.873 +34 -0.798 +35 -0.723 +36 -0.648 +37 -0.573 +38 -0.499 +39 -0.425 +40 -0.352 +41 -0.279 +42 -0.208 +43 -0.137 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.197 +49 0.260 +50 0.321 +51 0.382 +52 0.440 +53 0.498 +54 0.554 +55 0.609 +56 0.662 +57 0.715 +58 0.766 +59 0.816 +60 0.865 +61 0.913 +62 0.961 +63 1.008 +64 1.054 +65 1.100 +66 1.146 +67 1.191 +68 1.237 +69 1.283 +70 1.329 +71 1.376 +72 1.424 +73 1.473 +74 1.523 +75 1.575 +76 1.629 +77 1.685 +78 1.743 +79 1.804 +80 1.868 +81 1.935 +82 2.006 +83 2.080 +84 2.159 +85 2.243 +86 2.332 +87 2.425 +88 2.525 +89 2.631 +90 2.743 +1 -1.362 +2 -1.448 +3 -1.524 +4 -1.589 +5 -1.644 +6 -1.690 +7 -1.727 +8 -1.756 +9 -1.776 +10 -1.789 +11 -1.795 +12 -1.794 +13 -1.786 +14 -1.773 +15 -1.754 +16 -1.730 +17 -1.700 +18 -1.667 +19 -1.628 +20 -1.587 +21 -1.541 +22 -1.492 +23 -1.440 +24 -1.386 +25 -1.328 +26 -1.269 +27 -1.208 +28 -1.145 +29 -1.081 +30 -1.015 +31 -0.948 +32 -0.881 +33 -0.813 +34 -0.744 +35 -0.675 +36 -0.606 +37 -0.537 +38 -0.468 +39 -0.400 +40 -0.331 +41 -0.264 +42 -0.197 +43 -0.130 +44 -0.065 +45 0.000 +46 0.064 +47 0.127 +48 0.188 +49 0.249 +50 0.309 +51 0.368 +52 0.425 +53 0.482 +54 0.537 +55 0.592 +56 0.645 +57 0.698 +58 0.750 +59 0.801 +60 0.851 +61 0.901 +62 0.951 +63 0.999 +64 1.048 +65 1.097 +66 1.145 +67 1.194 +68 1.243 +69 1.293 +70 1.343 +71 1.394 +72 1.446 +73 1.500 +74 1.555 +75 1.612 +76 1.671 +77 1.732 +78 1.796 +79 1.862 +80 1.932 +81 2.005 +82 2.081 +83 2.162 +84 2.247 +85 2.337 +86 2.431 +87 2.531 +88 2.637 +89 2.749 +90 2.867 +1 -1.141 +2 -1.213 +3 -1.275 +4 -1.329 +5 -1.375 +6 -1.413 +7 -1.444 +8 -1.467 +9 -1.484 +10 -1.495 +11 -1.499 +12 -1.498 +13 -1.492 +14 -1.481 +15 -1.465 +16 -1.444 +17 -1.420 +18 -1.391 +19 -1.359 +20 -1.324 +21 -1.286 +22 -1.245 +23 -1.202 +24 -1.156 +25 -1.109 +26 -1.059 +27 -1.008 +28 -0.956 +29 -0.902 +30 -0.847 +31 -0.791 +32 -0.735 +33 -0.678 +34 -0.621 +35 -0.563 +36 -0.506 +37 -0.448 +38 -0.391 +39 -0.333 +40 -0.276 +41 -0.220 +42 -0.164 +43 -0.109 +44 -0.054 +45 0.000 +46 0.053 +47 0.106 +48 0.157 +49 0.208 +50 0.258 +51 0.307 +52 0.355 +53 0.402 +54 0.449 +55 0.494 +56 0.539 +57 0.583 +58 0.626 +59 0.669 +60 0.711 +61 0.753 +62 0.794 +63 0.835 +64 0.875 +65 0.916 +66 0.957 +67 0.997 +68 1.038 +69 1.080 +70 1.122 +71 1.165 +72 1.209 +73 1.253 +74 1.300 +75 1.347 +76 1.396 +77 1.448 +78 1.501 +79 1.557 +80 1.615 +81 1.676 +82 1.740 +83 1.807 +84 1.878 +85 1.953 +86 2.033 +87 2.116 +88 2.205 +89 2.298 +90 2.397 +1 -0.828 +2 -0.907 +3 -0.978 +4 -1.041 +5 -1.095 +6 -1.142 +7 -1.181 +8 -1.214 +9 -1.239 +10 -1.259 +11 -1.272 +12 -1.280 +13 -1.283 +14 -1.280 +15 -1.273 +16 -1.262 +17 -1.246 +18 -1.226 +19 -1.203 +20 -1.176 +21 -1.146 +22 -1.114 +23 -1.078 +24 -1.041 +25 -1.001 +26 -0.959 +27 -0.915 +28 -0.870 +29 -0.823 +30 -0.775 +31 -0.726 +32 -0.676 +33 -0.625 +34 -0.574 +35 -0.522 +36 -0.470 +37 -0.417 +38 -0.364 +39 -0.312 +40 -0.259 +41 -0.207 +42 -0.155 +43 -0.103 +44 -0.051 +45 0.000 +46 0.051 +47 0.101 +48 0.150 +49 0.199 +50 0.248 +51 0.296 +52 0.343 +53 0.390 +54 0.436 +55 0.481 +56 0.526 +57 0.571 +58 0.615 +59 0.659 +60 0.703 +61 0.746 +62 0.789 +63 0.833 +64 0.876 +65 0.919 +66 0.963 +67 1.007 +68 1.052 +69 1.097 +70 1.143 +71 1.190 +72 1.238 +73 1.288 +74 1.339 +75 1.391 +76 1.446 +77 1.502 +78 1.561 +79 1.622 +80 1.686 +81 1.753 +82 1.823 +83 1.897 +84 1.974 +85 2.055 +86 2.140 +87 2.230 +88 2.325 +89 2.425 +90 2.530 +1 -0.773 +2 -0.843 +3 -0.905 +4 -0.959 +5 -1.006 +6 -1.046 +7 -1.080 +8 -1.108 +9 -1.129 +10 -1.146 +11 -1.156 +12 -1.162 +13 -1.163 +14 -1.160 +15 -1.153 +16 -1.141 +17 -1.126 +18 -1.108 +19 -1.086 +20 -1.061 +21 -1.034 +22 -1.004 +23 -0.971 +24 -0.937 +25 -0.901 +26 -0.863 +27 -0.823 +28 -0.782 +29 -0.739 +30 -0.696 +31 -0.652 +32 -0.607 +33 -0.561 +34 -0.514 +35 -0.468 +36 -0.421 +37 -0.374 +38 -0.326 +39 -0.279 +40 -0.232 +41 -0.185 +42 -0.138 +43 -0.092 +44 -0.046 +45 0.000 +46 0.045 +47 0.090 +48 0.134 +49 0.178 +50 0.221 +51 0.264 +52 0.306 +53 0.347 +54 0.388 +55 0.429 +56 0.468 +57 0.508 +58 0.547 +59 0.586 +60 0.624 +61 0.663 +62 0.701 +63 0.739 +64 0.777 +65 0.815 +66 0.854 +67 0.893 +68 0.932 +69 0.972 +70 1.012 +71 1.053 +72 1.096 +73 1.139 +74 1.184 +75 1.230 +76 1.278 +77 1.327 +78 1.379 +79 1.433 +80 1.489 +81 1.548 +82 1.609 +83 1.674 +84 1.742 +85 1.813 +86 1.888 +87 1.968 +88 2.051 +89 2.139 +90 2.232 +1 -0.528 +2 -0.608 +3 -0.680 +4 -0.744 +5 -0.801 +6 -0.851 +7 -0.894 +8 -0.931 +9 -0.961 +10 -0.986 +11 -1.006 +12 -1.020 +13 -1.029 +14 -1.033 +15 -1.034 +16 -1.029 +17 -1.021 +18 -1.010 +19 -0.995 +20 -0.977 +21 -0.955 +22 -0.931 +23 -0.905 +24 -0.876 +25 -0.845 +26 -0.812 +27 -0.777 +28 -0.740 +29 -0.702 +30 -0.663 +31 -0.623 +32 -0.581 +33 -0.539 +34 -0.496 +35 -0.452 +36 -0.407 +37 -0.363 +38 -0.318 +39 -0.272 +40 -0.227 +41 -0.181 +42 -0.136 +43 -0.090 +44 -0.045 +45 0.000 +46 0.045 +47 0.090 +48 0.134 +49 0.178 +50 0.222 +51 0.265 +52 0.309 +53 0.351 +54 0.394 +55 0.436 +56 0.478 +57 0.520 +58 0.562 +59 0.604 +60 0.645 +61 0.687 +62 0.728 +63 0.770 +64 0.812 +65 0.855 +66 0.898 +67 0.941 +68 0.985 +69 1.030 +70 1.076 +71 1.123 +72 1.171 +73 1.220 +74 1.271 +75 1.324 +76 1.379 +77 1.435 +78 1.494 +79 1.555 +80 1.619 +81 1.686 +82 1.755 +83 1.828 +84 1.905 +85 1.985 +86 2.069 +87 2.157 +88 2.250 +89 2.347 +90 2.450 +1 -0.587 +2 -0.656 +3 -0.718 +4 -0.773 +5 -0.821 +6 -0.863 +7 -0.898 +8 -0.928 +9 -0.953 +10 -0.972 +11 -0.986 +12 -0.996 +13 -1.001 +14 -1.002 +15 -0.998 +16 -0.992 +17 -0.981 +18 -0.968 +19 -0.951 +20 -0.932 +21 -0.909 +22 -0.885 +23 -0.858 +24 -0.829 +25 -0.798 +26 -0.766 +27 -0.732 +28 -0.696 +29 -0.660 +30 -0.622 +31 -0.583 +32 -0.544 +33 -0.503 +34 -0.462 +35 -0.421 +36 -0.379 +37 -0.337 +38 -0.295 +39 -0.253 +40 -0.210 +41 -0.168 +42 -0.126 +43 -0.083 +44 -0.042 +45 0.000 +46 0.041 +47 0.082 +48 0.123 +49 0.163 +50 0.203 +51 0.242 +52 0.282 +53 0.320 +54 0.359 +55 0.397 +56 0.434 +57 0.472 +58 0.509 +59 0.546 +60 0.582 +61 0.619 +62 0.656 +63 0.693 +64 0.729 +65 0.767 +66 0.804 +67 0.842 +68 0.880 +69 0.919 +70 0.959 +71 1.000 +72 1.041 +73 1.084 +74 1.128 +75 1.174 +76 1.221 +77 1.270 +78 1.321 +79 1.374 +80 1.430 +81 1.488 +82 1.548 +83 1.612 +84 1.678 +85 1.748 +86 1.822 +87 1.899 +88 1.981 +89 2.067 +90 2.157 +1 -0.596 +2 -0.709 +3 -0.811 +4 -0.903 +5 -0.984 +6 -1.056 +7 -1.118 +8 -1.172 +9 -1.218 +10 -1.256 +11 -1.286 +12 -1.309 +13 -1.325 +14 -1.335 +15 -1.338 +16 -1.336 +17 -1.329 +18 -1.316 +19 -1.299 +20 -1.278 +21 -1.252 +22 -1.222 +23 -1.189 +24 -1.153 +25 -1.113 +26 -1.071 +27 -1.026 +28 -0.979 +29 -0.930 +30 -0.879 +31 -0.826 +32 -0.772 +33 -0.716 +34 -0.660 +35 -0.602 +36 -0.543 +37 -0.484 +38 -0.424 +39 -0.364 +40 -0.304 +41 -0.243 +42 -0.182 +43 -0.121 +44 -0.061 +45 0.000 +46 0.060 +47 0.121 +48 0.181 +49 0.241 +50 0.300 +51 0.359 +52 0.418 +53 0.476 +54 0.535 +55 0.593 +56 0.650 +57 0.708 +58 0.766 +59 0.823 +60 0.881 +61 0.938 +62 0.996 +63 1.055 +64 1.113 +65 1.173 +66 1.233 +67 1.294 +68 1.355 +69 1.419 +70 1.483 +71 1.549 +72 1.617 +73 1.686 +74 1.758 +75 1.833 +76 1.909 +77 1.989 +78 2.072 +79 2.158 +80 2.248 +81 2.342 +82 2.440 +83 2.542 +84 2.649 +85 2.762 +86 2.880 +87 3.004 +88 3.133 +89 3.270 +90 3.413 +1 -0.873 +2 -0.981 +3 -1.077 +4 -1.163 +5 -1.239 +6 -1.305 +7 -1.361 +8 -1.409 +9 -1.447 +10 -1.478 +11 -1.501 +12 -1.517 +13 -1.526 +14 -1.528 +15 -1.525 +16 -1.515 +17 -1.500 +18 -1.480 +19 -1.456 +20 -1.426 +21 -1.393 +22 -1.356 +23 -1.316 +24 -1.272 +25 -1.225 +26 -1.176 +27 -1.124 +28 -1.070 +29 -1.014 +30 -0.956 +31 -0.897 +32 -0.836 +33 -0.774 +34 -0.712 +35 -0.648 +36 -0.584 +37 -0.519 +38 -0.454 +39 -0.389 +40 -0.324 +41 -0.259 +42 -0.194 +43 -0.129 +44 -0.064 +45 0.000 +46 0.064 +47 0.127 +48 0.190 +49 0.252 +50 0.314 +51 0.375 +52 0.436 +53 0.496 +54 0.555 +55 0.614 +56 0.673 +57 0.731 +58 0.789 +59 0.846 +60 0.904 +61 0.961 +62 1.018 +63 1.075 +64 1.133 +65 1.191 +66 1.250 +67 1.309 +68 1.369 +69 1.430 +70 1.492 +71 1.556 +72 1.621 +73 1.688 +74 1.757 +75 1.828 +76 1.902 +77 1.979 +78 2.058 +79 2.141 +80 2.228 +81 2.318 +82 2.413 +83 2.512 +84 2.616 +85 2.725 +86 2.840 +87 2.960 +88 3.087 +89 3.221 +90 3.361 +1 -0.749 +2 -0.865 +3 -0.969 +4 -1.062 +5 -1.144 +6 -1.216 +7 -1.279 +8 -1.332 +9 -1.376 +10 -1.413 +11 -1.441 +12 -1.462 +13 -1.475 +14 -1.482 +15 -1.482 +16 -1.477 +17 -1.466 +18 -1.449 +19 -1.428 +20 -1.402 +21 -1.372 +22 -1.337 +23 -1.299 +24 -1.258 +25 -1.214 +26 -1.166 +27 -1.116 +28 -1.064 +29 -1.009 +30 -0.953 +31 -0.895 +32 -0.835 +33 -0.775 +34 -0.713 +35 -0.650 +36 -0.586 +37 -0.522 +38 -0.457 +39 -0.392 +40 -0.326 +41 -0.261 +42 -0.196 +43 -0.130 +44 -0.065 +45 0.000 +46 0.065 +47 0.129 +48 0.193 +49 0.257 +50 0.320 +51 0.382 +52 0.444 +53 0.506 +54 0.568 +55 0.629 +56 0.689 +57 0.750 +58 0.810 +59 0.870 +60 0.930 +61 0.990 +62 1.050 +63 1.110 +64 1.171 +65 1.233 +66 1.294 +67 1.357 +68 1.421 +69 1.486 +70 1.552 +71 1.620 +72 1.689 +73 1.761 +74 1.834 +75 1.910 +76 1.989 +77 2.071 +78 2.156 +79 2.244 +80 2.336 +81 2.432 +82 2.533 +83 2.638 +84 2.748 +85 2.864 +86 2.985 +87 3.113 +88 3.246 +89 3.387 +90 3.535 +1 -1.137 +2 -1.247 +3 -1.345 +4 -1.431 +5 -1.506 +6 -1.571 +7 -1.625 +8 -1.670 +9 -1.706 +10 -1.733 +11 -1.751 +12 -1.763 +13 -1.766 +14 -1.763 +15 -1.753 +16 -1.737 +17 -1.716 +18 -1.689 +19 -1.657 +20 -1.620 +21 -1.579 +22 -1.534 +23 -1.486 +24 -1.434 +25 -1.379 +26 -1.321 +27 -1.261 +28 -1.199 +29 -1.134 +30 -1.068 +31 -1.000 +32 -0.932 +33 -0.862 +34 -0.791 +35 -0.719 +36 -0.647 +37 -0.575 +38 -0.502 +39 -0.430 +40 -0.357 +41 -0.285 +42 -0.213 +43 -0.142 +44 -0.070 +45 0.000 +46 0.070 +47 0.139 +48 0.207 +49 0.275 +50 0.342 +51 0.408 +52 0.473 +53 0.537 +54 0.601 +55 0.664 +56 0.726 +57 0.788 +58 0.849 +59 0.910 +60 0.970 +61 1.030 +62 1.089 +63 1.149 +64 1.209 +65 1.269 +66 1.329 +67 1.390 +68 1.452 +69 1.514 +70 1.578 +71 1.643 +72 1.710 +73 1.778 +74 1.848 +75 1.921 +76 1.996 +77 2.074 +78 2.156 +79 2.240 +80 2.328 +81 2.421 +82 2.518 +83 2.619 +84 2.726 +85 2.838 +86 2.956 +87 3.080 +88 3.211 +89 3.349 +90 3.494 +1 -1.143 +2 -1.261 +3 -1.365 +4 -1.457 +5 -1.538 +6 -1.607 +7 -1.666 +8 -1.715 +9 -1.754 +10 -1.784 +11 -1.805 +12 -1.819 +13 -1.824 +14 -1.822 +15 -1.813 +16 -1.798 +17 -1.777 +18 -1.750 +19 -1.718 +20 -1.680 +21 -1.639 +22 -1.593 +23 -1.543 +24 -1.490 +25 -1.433 +26 -1.374 +27 -1.312 +28 -1.247 +29 -1.180 +30 -1.112 +31 -1.042 +32 -0.970 +33 -0.898 +34 -0.824 +35 -0.750 +36 -0.675 +37 -0.600 +38 -0.524 +39 -0.449 +40 -0.373 +41 -0.298 +42 -0.223 +43 -0.148 +44 -0.074 +45 0.000 +46 0.073 +47 0.145 +48 0.217 +49 0.288 +50 0.358 +51 0.427 +52 0.496 +53 0.563 +54 0.630 +55 0.696 +56 0.762 +57 0.827 +58 0.891 +59 0.955 +60 1.019 +61 1.082 +62 1.145 +63 1.208 +64 1.271 +65 1.335 +66 1.399 +67 1.464 +68 1.529 +69 1.595 +70 1.663 +71 1.732 +72 1.803 +73 1.875 +74 1.950 +75 2.027 +76 2.107 +77 2.190 +78 2.277 +79 2.367 +80 2.461 +81 2.559 +82 2.662 +83 2.769 +84 2.883 +85 3.002 +86 3.127 +87 3.258 +88 3.397 +89 3.543 +90 3.697 +1 -1.623 +2 -1.736 +3 -1.836 +4 -1.923 +5 -1.997 +6 -2.059 +7 -2.110 +8 -2.150 +9 -2.180 +10 -2.200 +11 -2.211 +12 -2.213 +13 -2.207 +14 -2.193 +15 -2.172 +16 -2.145 +17 -2.111 +18 -2.071 +19 -2.026 +20 -1.975 +21 -1.920 +22 -1.861 +23 -1.797 +24 -1.731 +25 -1.660 +26 -1.587 +27 -1.512 +28 -1.434 +29 -1.354 +30 -1.273 +31 -1.190 +32 -1.106 +33 -1.021 +34 -0.936 +35 -0.849 +36 -0.763 +37 -0.676 +38 -0.590 +39 -0.504 +40 -0.418 +41 -0.333 +42 -0.248 +43 -0.165 +44 -0.082 +45 0.000 +46 0.081 +47 0.161 +48 0.239 +49 0.316 +50 0.393 +51 0.468 +52 0.541 +53 0.614 +54 0.685 +55 0.755 +56 0.824 +57 0.892 +58 0.959 +59 1.025 +60 1.091 +61 1.155 +62 1.220 +63 1.284 +64 1.347 +65 1.411 +66 1.475 +67 1.539 +68 1.603 +69 1.669 +70 1.735 +71 1.803 +72 1.872 +73 1.942 +74 2.015 +75 2.091 +76 2.168 +77 2.249 +78 2.333 +79 2.421 +80 2.513 +81 2.609 +82 2.710 +83 2.816 +84 2.928 +85 3.045 +86 3.169 +87 3.300 +88 3.438 +89 3.585 +90 3.739 +1 -1.774 +2 -1.898 +3 -2.007 +4 -2.102 +5 -2.183 +6 -2.251 +7 -2.307 +8 -2.350 +9 -2.383 +10 -2.405 +11 -2.417 +12 -2.419 +13 -2.412 +14 -2.397 +15 -2.375 +16 -2.344 +17 -2.307 +18 -2.263 +19 -2.214 +20 -2.159 +21 -2.098 +22 -2.034 +23 -1.964 +24 -1.891 +25 -1.815 +26 -1.735 +27 -1.652 +28 -1.567 +29 -1.480 +30 -1.391 +31 -1.300 +32 -1.209 +33 -1.116 +34 -1.022 +35 -0.928 +36 -0.834 +37 -0.739 +38 -0.645 +39 -0.550 +40 -0.457 +41 -0.364 +42 -0.271 +43 -0.180 +44 -0.089 +45 0.000 +46 0.088 +47 0.175 +48 0.261 +49 0.346 +50 0.429 +51 0.510 +52 0.591 +53 0.670 +54 0.748 +55 0.824 +56 0.899 +57 0.974 +58 1.047 +59 1.119 +60 1.190 +61 1.261 +62 1.331 +63 1.400 +64 1.470 +65 1.539 +66 1.608 +67 1.678 +68 1.749 +69 1.820 +70 1.892 +71 1.966 +72 2.041 +73 2.118 +74 2.197 +75 2.279 +76 2.364 +77 2.452 +78 2.543 +79 2.639 +80 2.739 +81 2.844 +82 2.953 +83 3.069 +84 3.191 +85 3.319 +86 3.454 +87 3.597 +88 3.747 +89 3.907 +90 4.075 +1 -2.257 +2 -2.376 +3 -2.480 +4 -2.568 +5 -2.642 +6 -2.702 +7 -2.749 +8 -2.784 +9 -2.806 +10 -2.818 +11 -2.819 +12 -2.810 +13 -2.792 +14 -2.765 +15 -2.730 +16 -2.687 +17 -2.637 +18 -2.580 +19 -2.517 +20 -2.449 +21 -2.375 +22 -2.297 +23 -2.214 +24 -2.127 +25 -2.037 +26 -1.944 +27 -1.848 +28 -1.750 +29 -1.650 +30 -1.548 +31 -1.445 +32 -1.341 +33 -1.236 +34 -1.130 +35 -1.024 +36 -0.919 +37 -0.813 +38 -0.708 +39 -0.604 +40 -0.500 +41 -0.398 +42 -0.296 +43 -0.196 +44 -0.097 +45 0.000 +46 0.096 +47 0.190 +48 0.282 +49 0.373 +50 0.462 +51 0.549 +52 0.634 +53 0.717 +54 0.799 +55 0.879 +56 0.957 +57 1.034 +58 1.109 +59 1.183 +60 1.256 +61 1.328 +62 1.398 +63 1.468 +64 1.538 +65 1.606 +66 1.675 +67 1.744 +68 1.813 +69 1.883 +70 1.953 +71 2.025 +72 2.098 +73 2.172 +74 2.249 +75 2.328 +76 2.410 +77 2.495 +78 2.584 +79 2.677 +80 2.774 +81 2.876 +82 2.983 +83 3.096 +84 3.215 +85 3.341 +86 3.474 +87 3.615 +88 3.765 +89 3.923 +90 4.091 +1 -2.395 +2 -2.523 +3 -2.633 +4 -2.727 +5 -2.806 +6 -2.870 +7 -2.920 +8 -2.957 +9 -2.982 +10 -2.994 +11 -2.996 +12 -2.986 +13 -2.967 +14 -2.938 +15 -2.901 +16 -2.856 +17 -2.803 +18 -2.742 +19 -2.676 +20 -2.603 +21 -2.525 +22 -2.441 +23 -2.354 +24 -2.262 +25 -2.166 +26 -2.067 +27 -1.965 +28 -1.861 +29 -1.754 +30 -1.646 +31 -1.536 +32 -1.426 +33 -1.314 +34 -1.202 +35 -1.089 +36 -0.977 +37 -0.865 +38 -0.753 +39 -0.642 +40 -0.532 +41 -0.423 +42 -0.315 +43 -0.209 +44 -0.103 +45 0.000 +46 0.102 +47 0.202 +48 0.300 +49 0.396 +50 0.491 +51 0.584 +52 0.674 +53 0.763 +54 0.850 +55 0.935 +56 1.018 +57 1.100 +58 1.180 +59 1.259 +60 1.336 +61 1.412 +62 1.488 +63 1.562 +64 1.636 +65 1.709 +66 1.782 +67 1.855 +68 1.929 +69 2.003 +70 2.078 +71 2.154 +72 2.232 +73 2.311 +74 2.393 +75 2.477 +76 2.564 +77 2.655 +78 2.749 +79 2.848 +80 2.951 +81 3.060 +82 3.174 +83 3.294 +84 3.421 +85 3.555 +86 3.696 +87 3.846 +88 4.005 +89 4.174 +90 4.352 +1 -2.793 +2 -2.913 +3 -3.016 +4 -3.102 +5 -3.173 +6 -3.229 +7 -3.270 +8 -3.297 +9 -3.312 +10 -3.315 +11 -3.306 +12 -3.287 +13 -3.257 +14 -3.218 +15 -3.170 +16 -3.113 +17 -3.049 +18 -2.978 +19 -2.901 +20 -2.817 +21 -2.728 +22 -2.634 +23 -2.536 +24 -2.433 +25 -2.327 +26 -2.218 +27 -2.106 +28 -1.991 +29 -1.875 +30 -1.757 +31 -1.638 +32 -1.518 +33 -1.397 +34 -1.277 +35 -1.156 +36 -1.035 +37 -0.916 +38 -0.796 +39 -0.678 +40 -0.561 +41 -0.446 +42 -0.332 +43 -0.219 +44 -0.109 +45 0.000 +46 0.107 +47 0.211 +48 0.313 +49 0.413 +50 0.511 +51 0.607 +52 0.700 +53 0.791 +54 0.880 +55 0.966 +56 1.051 +57 1.133 +58 1.213 +59 1.292 +60 1.369 +61 1.445 +62 1.519 +63 1.592 +64 1.664 +65 1.736 +66 1.807 +67 1.877 +68 1.948 +69 2.019 +70 2.091 +71 2.164 +72 2.238 +73 2.313 +74 2.391 +75 2.471 +76 2.554 +77 2.640 +78 2.730 +79 2.824 +80 2.922 +81 3.026 +82 3.135 +83 3.250 +84 3.372 +85 3.502 +86 3.639 +87 3.784 +88 3.939 +89 4.103 +90 4.277 +1 -2.719 +2 -2.838 +3 -2.941 +4 -3.027 +5 -3.097 +6 -3.153 +7 -3.194 +8 -3.222 +9 -3.238 +10 -3.242 +11 -3.234 +12 -3.216 +13 -3.187 +14 -3.150 +15 -3.103 +16 -3.049 +17 -2.987 +18 -2.918 +19 -2.842 +20 -2.761 +21 -2.674 +22 -2.582 +23 -2.486 +24 -2.386 +25 -2.282 +26 -2.175 +27 -2.065 +28 -1.953 +29 -1.839 +30 -1.724 +31 -1.607 +32 -1.490 +33 -1.372 +34 -1.253 +35 -1.135 +36 -1.017 +37 -0.899 +38 -0.782 +39 -0.666 +40 -0.551 +41 -0.438 +42 -0.326 +43 -0.215 +44 -0.107 +45 0.000 +46 0.105 +47 0.208 +48 0.308 +49 0.407 +50 0.503 +51 0.597 +52 0.689 +53 0.778 +54 0.866 +55 0.951 +56 1.034 +57 1.116 +58 1.195 +59 1.273 +60 1.349 +61 1.424 +62 1.497 +63 1.570 +64 1.641 +65 1.712 +66 1.782 +67 1.852 +68 1.922 +69 1.993 +70 2.064 +71 2.136 +72 2.210 +73 2.285 +74 2.362 +75 2.441 +76 2.523 +77 2.609 +78 2.698 +79 2.791 +80 2.889 +81 2.992 +82 3.100 +83 3.214 +84 3.335 +85 3.463 +86 3.599 +87 3.743 +88 3.896 +89 4.059 +90 4.231 +1 -2.901 +2 -3.011 +3 -3.104 +4 -3.181 +5 -3.243 +6 -3.290 +7 -3.324 +8 -3.344 +9 -3.352 +10 -3.349 +11 -3.334 +12 -3.309 +13 -3.274 +14 -3.231 +15 -3.178 +16 -3.118 +17 -3.051 +18 -2.976 +19 -2.896 +20 -2.810 +21 -2.718 +22 -2.622 +23 -2.522 +24 -2.418 +25 -2.310 +26 -2.200 +27 -2.087 +28 -1.973 +29 -1.856 +30 -1.738 +31 -1.619 +32 -1.499 +33 -1.379 +34 -1.259 +35 -1.139 +36 -1.020 +37 -0.901 +38 -0.783 +39 -0.667 +40 -0.551 +41 -0.437 +42 -0.325 +43 -0.215 +44 -0.106 +45 0.000 +46 0.104 +47 0.206 +48 0.306 +49 0.403 +50 0.498 +51 0.590 +52 0.681 +53 0.768 +54 0.854 +55 0.937 +56 1.018 +57 1.096 +58 1.173 +59 1.248 +60 1.321 +61 1.392 +62 1.462 +63 1.530 +64 1.598 +65 1.664 +66 1.730 +67 1.796 +68 1.861 +69 1.927 +70 1.993 +71 2.060 +72 2.128 +73 2.197 +74 2.268 +75 2.341 +76 2.417 +77 2.496 +78 2.579 +79 2.665 +80 2.755 +81 2.851 +82 2.951 +83 3.058 +84 3.170 +85 3.290 +86 3.417 +87 3.552 +88 3.696 +89 3.849 +90 4.012 +1 -2.718 +2 -2.825 +3 -2.915 +4 -2.990 +5 -3.051 +6 -3.098 +7 -3.131 +8 -3.152 +9 -3.162 +10 -3.160 +11 -3.147 +12 -3.125 +13 -3.093 +14 -3.053 +15 -3.005 +16 -2.949 +17 -2.886 +18 -2.816 +19 -2.741 +20 -2.660 +21 -2.574 +22 -2.484 +23 -2.389 +24 -2.291 +25 -2.190 +26 -2.086 +27 -1.979 +28 -1.871 +29 -1.761 +30 -1.649 +31 -1.536 +32 -1.423 +33 -1.309 +34 -1.196 +35 -1.082 +36 -0.969 +37 -0.856 +38 -0.744 +39 -0.634 +40 -0.524 +41 -0.416 +42 -0.309 +43 -0.204 +44 -0.101 +45 0.000 +46 0.099 +47 0.196 +48 0.291 +49 0.384 +50 0.474 +51 0.563 +52 0.649 +53 0.733 +54 0.814 +55 0.894 +56 0.971 +57 1.046 +58 1.120 +59 1.192 +60 1.262 +61 1.330 +62 1.397 +63 1.463 +64 1.528 +65 1.593 +66 1.656 +67 1.720 +68 1.783 +69 1.846 +70 1.910 +71 1.975 +72 2.040 +73 2.107 +74 2.176 +75 2.247 +76 2.321 +77 2.397 +78 2.477 +79 2.560 +80 2.648 +81 2.740 +82 2.837 +83 2.940 +84 3.048 +85 3.164 +86 3.286 +87 3.417 +88 3.555 +89 3.702 +90 3.859 +1 -2.484 +2 -2.580 +3 -2.662 +4 -2.729 +5 -2.784 +6 -2.826 +7 -2.856 +8 -2.875 +9 -2.882 +10 -2.880 +11 -2.868 +12 -2.848 +13 -2.819 +14 -2.781 +15 -2.737 +16 -2.686 +17 -2.628 +18 -2.565 +19 -2.496 +20 -2.422 +21 -2.343 +22 -2.261 +23 -2.175 +24 -2.085 +25 -1.993 +26 -1.898 +27 -1.801 +28 -1.702 +29 -1.602 +30 -1.500 +31 -1.397 +32 -1.294 +33 -1.191 +34 -1.087 +35 -0.984 +36 -0.881 +37 -0.778 +38 -0.677 +39 -0.576 +40 -0.476 +41 -0.378 +42 -0.281 +43 -0.186 +44 -0.092 +45 0.000 +46 0.090 +47 0.178 +48 0.264 +49 0.349 +50 0.431 +51 0.511 +52 0.589 +53 0.665 +54 0.739 +55 0.811 +56 0.881 +57 0.949 +58 1.016 +59 1.081 +60 1.144 +61 1.206 +62 1.267 +63 1.326 +64 1.385 +65 1.443 +66 1.500 +67 1.557 +68 1.614 +69 1.671 +70 1.729 +71 1.787 +72 1.846 +73 1.907 +74 1.969 +75 2.033 +76 2.099 +77 2.168 +78 2.239 +79 2.315 +80 2.393 +81 2.476 +82 2.564 +83 2.657 +84 2.755 +85 2.859 +86 2.970 +87 3.087 +88 3.212 +89 3.345 +90 3.487 +1 -1.707 +2 -1.786 +3 -1.854 +4 -1.911 +5 -1.958 +6 -1.996 +7 -2.024 +8 -2.044 +9 -2.055 +10 -2.059 +11 -2.056 +12 -2.045 +13 -2.028 +14 -2.006 +15 -1.977 +16 -1.943 +17 -1.905 +18 -1.861 +19 -1.814 +20 -1.763 +21 -1.708 +22 -1.650 +23 -1.589 +24 -1.525 +25 -1.459 +26 -1.391 +27 -1.321 +28 -1.250 +29 -1.178 +30 -1.104 +31 -1.030 +32 -0.955 +33 -0.879 +34 -0.803 +35 -0.728 +36 -0.652 +37 -0.577 +38 -0.502 +39 -0.428 +40 -0.354 +41 -0.281 +42 -0.209 +43 -0.138 +44 -0.069 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.262 +50 0.324 +51 0.384 +52 0.443 +53 0.501 +54 0.558 +55 0.613 +56 0.667 +57 0.720 +58 0.771 +59 0.822 +60 0.871 +61 0.920 +62 0.967 +63 1.014 +64 1.061 +65 1.107 +66 1.153 +67 1.199 +68 1.244 +69 1.290 +70 1.337 +71 1.384 +72 1.432 +73 1.481 +74 1.532 +75 1.584 +76 1.638 +77 1.694 +78 1.752 +79 1.813 +80 1.877 +81 1.944 +82 2.015 +83 2.089 +84 2.168 +85 2.252 +86 2.341 +87 2.434 +88 2.534 +89 2.640 +90 2.752 +1 -1.270 +2 -1.326 +3 -1.373 +4 -1.413 +5 -1.446 +6 -1.472 +7 -1.491 +8 -1.504 +9 -1.511 +10 -1.513 +11 -1.509 +12 -1.500 +13 -1.487 +14 -1.470 +15 -1.448 +16 -1.422 +17 -1.393 +18 -1.361 +19 -1.326 +20 -1.288 +21 -1.247 +22 -1.204 +23 -1.159 +24 -1.113 +25 -1.064 +26 -1.014 +27 -0.963 +28 -0.911 +29 -0.858 +30 -0.804 +31 -0.750 +32 -0.695 +33 -0.640 +34 -0.584 +35 -0.529 +36 -0.474 +37 -0.419 +38 -0.365 +39 -0.311 +40 -0.257 +41 -0.204 +42 -0.152 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.097 +48 0.144 +49 0.190 +50 0.234 +51 0.278 +52 0.321 +53 0.363 +54 0.403 +55 0.443 +56 0.482 +57 0.520 +58 0.557 +59 0.593 +60 0.629 +61 0.663 +62 0.698 +63 0.731 +64 0.764 +65 0.797 +66 0.830 +67 0.863 +68 0.895 +69 0.928 +70 0.961 +71 0.995 +72 1.029 +73 1.063 +74 1.099 +75 1.136 +76 1.174 +77 1.214 +78 1.255 +79 1.299 +80 1.344 +81 1.392 +82 1.442 +83 1.495 +84 1.551 +85 1.611 +86 1.674 +87 1.741 +88 1.812 +89 1.887 +90 1.967 +1 -0.441 +2 -0.486 +3 -0.526 +4 -0.561 +5 -0.592 +6 -0.619 +7 -0.641 +8 -0.660 +9 -0.675 +10 -0.686 +11 -0.694 +12 -0.699 +13 -0.701 +14 -0.700 +15 -0.697 +16 -0.691 +17 -0.683 +18 -0.672 +19 -0.660 +20 -0.646 +21 -0.630 +22 -0.612 +23 -0.593 +24 -0.572 +25 -0.550 +26 -0.528 +27 -0.504 +28 -0.479 +29 -0.453 +30 -0.427 +31 -0.400 +32 -0.373 +33 -0.345 +34 -0.316 +35 -0.288 +36 -0.259 +37 -0.230 +38 -0.201 +39 -0.172 +40 -0.143 +41 -0.114 +42 -0.085 +43 -0.057 +44 -0.028 +45 0.000 +46 0.028 +47 0.056 +48 0.083 +49 0.110 +50 0.137 +51 0.164 +52 0.190 +53 0.216 +54 0.242 +55 0.267 +56 0.292 +57 0.317 +58 0.342 +59 0.366 +60 0.390 +61 0.414 +62 0.439 +63 0.463 +64 0.487 +65 0.511 +66 0.535 +67 0.560 +68 0.585 +69 0.610 +70 0.636 +71 0.662 +72 0.689 +73 0.717 +74 0.745 +75 0.775 +76 0.805 +77 0.836 +78 0.869 +79 0.903 +80 0.939 +81 0.976 +82 1.015 +83 1.056 +84 1.099 +85 1.144 +86 1.192 +87 1.242 +88 1.294 +89 1.350 +90 1.408 +1 -0.026 +2 -0.053 +3 -0.078 +4 -0.101 +5 -0.122 +6 -0.141 +7 -0.157 +8 -0.172 +9 -0.185 +10 -0.196 +11 -0.206 +12 -0.214 +13 -0.221 +14 -0.226 +15 -0.230 +16 -0.232 +17 -0.234 +18 -0.234 +19 -0.233 +20 -0.231 +21 -0.228 +22 -0.224 +23 -0.220 +24 -0.214 +25 -0.208 +26 -0.202 +27 -0.194 +28 -0.186 +29 -0.178 +30 -0.169 +31 -0.160 +32 -0.150 +33 -0.140 +34 -0.129 +35 -0.118 +36 -0.107 +37 -0.096 +38 -0.085 +39 -0.073 +40 -0.061 +41 -0.049 +42 -0.037 +43 -0.025 +44 -0.012 +45 0.000 +46 0.012 +47 0.025 +48 0.037 +49 0.050 +50 0.063 +51 0.075 +52 0.088 +53 0.100 +54 0.113 +55 0.126 +56 0.139 +57 0.152 +58 0.165 +59 0.178 +60 0.191 +61 0.204 +62 0.217 +63 0.231 +64 0.244 +65 0.258 +66 0.272 +67 0.287 +68 0.302 +69 0.317 +70 0.332 +71 0.348 +72 0.364 +73 0.381 +74 0.398 +75 0.416 +76 0.434 +77 0.453 +78 0.473 +79 0.494 +80 0.515 +81 0.537 +82 0.561 +83 0.585 +84 0.610 +85 0.637 +86 0.664 +87 0.693 +88 0.723 +89 0.755 +90 0.788 +1 0.788 +2 0.770 +3 0.751 +4 0.732 +5 0.712 +6 0.692 +7 0.671 +8 0.650 +9 0.629 +10 0.607 +11 0.586 +12 0.564 +13 0.542 +14 0.520 +15 0.498 +16 0.476 +17 0.454 +18 0.432 +19 0.411 +20 0.389 +21 0.368 +22 0.347 +23 0.327 +24 0.306 +25 0.286 +26 0.267 +27 0.248 +28 0.229 +29 0.211 +30 0.193 +31 0.176 +32 0.159 +33 0.143 +34 0.128 +35 0.113 +36 0.098 +37 0.085 +38 0.072 +39 0.059 +40 0.048 +41 0.037 +42 0.026 +43 0.017 +44 0.008 +45 0.000 +46 -0.007 +47 -0.014 +48 -0.020 +49 -0.025 +50 -0.029 +51 -0.033 +52 -0.036 +53 -0.038 +54 -0.039 +55 -0.040 +56 -0.040 +57 -0.039 +58 -0.037 +59 -0.035 +60 -0.032 +61 -0.028 +62 -0.024 +63 -0.019 +64 -0.014 +65 -0.007 +66 -0.000 +67 0.007 +68 0.015 +69 0.024 +70 0.033 +71 0.043 +72 0.053 +73 0.063 +74 0.074 +75 0.086 +76 0.098 +77 0.110 +78 0.122 +79 0.135 +80 0.148 +81 0.162 +82 0.175 +83 0.188 +84 0.202 +85 0.216 +86 0.230 +87 0.243 +88 0.257 +89 0.271 +90 0.284 +1 1.026 +2 1.017 +3 1.006 +4 0.993 +5 0.979 +6 0.963 +7 0.945 +8 0.926 +9 0.906 +10 0.884 +11 0.861 +12 0.838 +13 0.813 +14 0.788 +15 0.761 +16 0.735 +17 0.707 +18 0.679 +19 0.651 +20 0.623 +21 0.594 +22 0.565 +23 0.536 +24 0.508 +25 0.479 +26 0.450 +27 0.422 +28 0.393 +29 0.366 +30 0.338 +31 0.311 +32 0.284 +33 0.258 +34 0.233 +35 0.208 +36 0.184 +37 0.160 +38 0.137 +39 0.115 +40 0.094 +41 0.073 +42 0.054 +43 0.035 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.031 +48 -0.046 +49 -0.059 +50 -0.071 +51 -0.083 +52 -0.093 +53 -0.103 +54 -0.111 +55 -0.119 +56 -0.126 +57 -0.132 +58 -0.137 +59 -0.141 +60 -0.144 +61 -0.146 +62 -0.148 +63 -0.149 +64 -0.149 +65 -0.149 +66 -0.148 +67 -0.146 +68 -0.143 +69 -0.140 +70 -0.137 +71 -0.133 +72 -0.129 +73 -0.124 +74 -0.120 +75 -0.114 +76 -0.109 +77 -0.104 +78 -0.099 +79 -0.093 +80 -0.088 +81 -0.083 +82 -0.079 +83 -0.074 +84 -0.070 +85 -0.067 +86 -0.064 +87 -0.062 +88 -0.061 +89 -0.060 +90 -0.061 +1 1.732 +2 1.728 +3 1.721 +4 1.709 +5 1.693 +6 1.674 +7 1.651 +8 1.625 +9 1.596 +10 1.565 +11 1.530 +12 1.494 +13 1.455 +14 1.415 +15 1.372 +16 1.328 +17 1.283 +18 1.237 +19 1.189 +20 1.140 +21 1.091 +22 1.041 +23 0.991 +24 0.940 +25 0.889 +26 0.838 +27 0.788 +28 0.737 +29 0.687 +30 0.637 +31 0.588 +32 0.539 +33 0.491 +34 0.444 +35 0.398 +36 0.352 +37 0.308 +38 0.265 +39 0.223 +40 0.183 +41 0.143 +42 0.105 +43 0.069 +44 0.034 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.092 +49 -0.119 +50 -0.145 +51 -0.170 +52 -0.193 +53 -0.214 +54 -0.234 +55 -0.252 +56 -0.269 +57 -0.284 +58 -0.297 +59 -0.310 +60 -0.321 +61 -0.330 +62 -0.339 +63 -0.346 +64 -0.352 +65 -0.357 +66 -0.361 +67 -0.364 +68 -0.366 +69 -0.367 +70 -0.368 +71 -0.368 +72 -0.368 +73 -0.367 +74 -0.366 +75 -0.365 +76 -0.364 +77 -0.363 +78 -0.362 +79 -0.362 +80 -0.362 +81 -0.363 +82 -0.365 +83 -0.368 +84 -0.372 +85 -0.377 +86 -0.384 +87 -0.392 +88 -0.403 +89 -0.415 +90 -0.430 +1 1.770 +2 1.773 +3 1.771 +4 1.764 +5 1.753 +6 1.738 +7 1.718 +8 1.695 +9 1.669 +10 1.639 +11 1.607 +12 1.571 +13 1.534 +14 1.493 +15 1.451 +16 1.407 +17 1.361 +18 1.314 +19 1.265 +20 1.215 +21 1.164 +22 1.113 +23 1.060 +24 1.007 +25 0.954 +26 0.901 +27 0.847 +28 0.794 +29 0.741 +30 0.688 +31 0.636 +32 0.584 +33 0.533 +34 0.482 +35 0.432 +36 0.384 +37 0.336 +38 0.290 +39 0.244 +40 0.200 +41 0.157 +42 0.116 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.070 +48 -0.102 +49 -0.133 +50 -0.163 +51 -0.190 +52 -0.216 +53 -0.241 +54 -0.264 +55 -0.286 +56 -0.305 +57 -0.324 +58 -0.341 +59 -0.356 +60 -0.371 +61 -0.383 +62 -0.395 +63 -0.405 +64 -0.415 +65 -0.423 +66 -0.430 +67 -0.436 +68 -0.442 +69 -0.447 +70 -0.451 +71 -0.455 +72 -0.458 +73 -0.461 +74 -0.464 +75 -0.467 +76 -0.470 +77 -0.474 +78 -0.477 +79 -0.482 +80 -0.487 +81 -0.493 +82 -0.500 +83 -0.508 +84 -0.518 +85 -0.530 +86 -0.543 +87 -0.558 +88 -0.576 +89 -0.595 +90 -0.618 +1 2.361 +2 2.369 +3 2.370 +4 2.364 +5 2.352 +6 2.334 +7 2.311 +8 2.282 +9 2.249 +10 2.211 +11 2.169 +12 2.123 +13 2.074 +14 2.021 +15 1.965 +16 1.907 +17 1.846 +18 1.782 +19 1.717 +20 1.651 +21 1.583 +22 1.513 +23 1.443 +24 1.372 +25 1.300 +26 1.228 +27 1.156 +28 1.084 +29 1.012 +30 0.940 +31 0.869 +32 0.798 +33 0.729 +34 0.660 +35 0.593 +36 0.526 +37 0.461 +38 0.398 +39 0.336 +40 0.275 +41 0.216 +42 0.159 +43 0.104 +44 0.051 +45 -0.000 +46 -0.049 +47 -0.096 +48 -0.141 +49 -0.184 +50 -0.225 +51 -0.264 +52 -0.301 +53 -0.335 +54 -0.368 +55 -0.398 +56 -0.426 +57 -0.453 +58 -0.477 +59 -0.500 +60 -0.521 +61 -0.540 +62 -0.557 +63 -0.573 +64 -0.587 +65 -0.600 +66 -0.612 +67 -0.622 +68 -0.632 +69 -0.640 +70 -0.648 +71 -0.655 +72 -0.662 +73 -0.669 +74 -0.675 +75 -0.682 +76 -0.688 +77 -0.696 +78 -0.704 +79 -0.713 +80 -0.722 +81 -0.734 +82 -0.747 +83 -0.761 +84 -0.778 +85 -0.797 +86 -0.819 +87 -0.843 +88 -0.871 +89 -0.902 +90 -0.937 +1 2.158 +2 2.168 +3 2.171 +4 2.168 +5 2.159 +6 2.145 +7 2.125 +8 2.100 +9 2.071 +10 2.038 +11 2.001 +12 1.959 +13 1.915 +14 1.867 +15 1.817 +16 1.764 +17 1.708 +18 1.651 +19 1.591 +20 1.530 +21 1.468 +22 1.404 +23 1.339 +24 1.274 +25 1.208 +26 1.141 +27 1.075 +28 1.008 +29 0.941 +30 0.875 +31 0.809 +32 0.744 +33 0.679 +34 0.616 +35 0.553 +36 0.491 +37 0.431 +38 0.371 +39 0.314 +40 0.257 +41 0.202 +42 0.149 +43 0.098 +44 0.048 +45 -0.000 +46 -0.046 +47 -0.090 +48 -0.133 +49 -0.173 +50 -0.212 +51 -0.249 +52 -0.283 +53 -0.316 +54 -0.347 +55 -0.376 +56 -0.403 +57 -0.428 +58 -0.452 +59 -0.474 +60 -0.494 +61 -0.513 +62 -0.530 +63 -0.546 +64 -0.560 +65 -0.574 +66 -0.586 +67 -0.597 +68 -0.607 +69 -0.616 +70 -0.625 +71 -0.633 +72 -0.641 +73 -0.649 +74 -0.657 +75 -0.664 +76 -0.673 +77 -0.681 +78 -0.691 +79 -0.701 +80 -0.712 +81 -0.725 +82 -0.739 +83 -0.755 +84 -0.773 +85 -0.794 +86 -0.817 +87 -0.842 +88 -0.871 +89 -0.903 +90 -0.938 +1 2.536 +2 2.548 +3 2.552 +4 2.549 +5 2.539 +6 2.522 +7 2.500 +8 2.471 +9 2.437 +10 2.398 +11 2.354 +12 2.306 +13 2.254 +14 2.198 +15 2.139 +16 2.076 +17 2.011 +18 1.943 +19 1.873 +20 1.802 +21 1.728 +22 1.653 +23 1.577 +24 1.500 +25 1.423 +26 1.344 +27 1.266 +28 1.187 +29 1.109 +30 1.031 +31 0.953 +32 0.877 +33 0.801 +34 0.725 +35 0.652 +36 0.579 +37 0.508 +38 0.438 +39 0.370 +40 0.303 +41 0.239 +42 0.176 +43 0.115 +44 0.057 +45 -0.000 +46 -0.054 +47 -0.107 +48 -0.157 +49 -0.205 +50 -0.250 +51 -0.293 +52 -0.334 +53 -0.373 +54 -0.410 +55 -0.444 +56 -0.476 +57 -0.506 +58 -0.534 +59 -0.560 +60 -0.584 +61 -0.606 +62 -0.627 +63 -0.645 +64 -0.663 +65 -0.678 +66 -0.693 +67 -0.706 +68 -0.718 +69 -0.729 +70 -0.740 +71 -0.750 +72 -0.759 +73 -0.769 +74 -0.778 +75 -0.788 +76 -0.797 +77 -0.808 +78 -0.819 +79 -0.831 +80 -0.845 +81 -0.860 +82 -0.877 +83 -0.896 +84 -0.918 +85 -0.942 +86 -0.969 +87 -0.999 +88 -1.033 +89 -1.071 +90 -1.113 +1 2.161 +2 2.174 +3 2.179 +4 2.179 +5 2.172 +6 2.159 +7 2.142 +8 2.118 +9 2.091 +10 2.058 +11 2.022 +12 1.982 +13 1.938 +14 1.891 +15 1.840 +16 1.787 +17 1.732 +18 1.674 +19 1.615 +20 1.554 +21 1.491 +22 1.427 +23 1.361 +24 1.295 +25 1.229 +26 1.162 +27 1.094 +28 1.027 +29 0.959 +30 0.892 +31 0.825 +32 0.759 +33 0.693 +34 0.628 +35 0.565 +36 0.502 +37 0.440 +38 0.380 +39 0.321 +40 0.263 +41 0.207 +42 0.153 +43 0.100 +44 0.049 +45 -0.000 +46 -0.047 +47 -0.093 +48 -0.137 +49 -0.178 +50 -0.218 +51 -0.256 +52 -0.292 +53 -0.326 +54 -0.358 +55 -0.388 +56 -0.417 +57 -0.443 +58 -0.468 +59 -0.491 +60 -0.513 +61 -0.533 +62 -0.551 +63 -0.568 +64 -0.584 +65 -0.599 +66 -0.612 +67 -0.624 +68 -0.636 +69 -0.647 +70 -0.657 +71 -0.667 +72 -0.676 +73 -0.686 +74 -0.695 +75 -0.704 +76 -0.714 +77 -0.725 +78 -0.736 +79 -0.748 +80 -0.762 +81 -0.777 +82 -0.793 +83 -0.812 +84 -0.832 +85 -0.855 +86 -0.880 +87 -0.909 +88 -0.940 +89 -0.975 +90 -1.014 +1 2.404 +2 2.420 +3 2.427 +4 2.428 +5 2.421 +6 2.408 +7 2.389 +8 2.364 +9 2.333 +10 2.298 +11 2.258 +12 2.214 +13 2.165 +14 2.113 +15 2.057 +16 1.999 +17 1.937 +18 1.873 +19 1.807 +20 1.739 +21 1.669 +22 1.597 +23 1.524 +24 1.451 +25 1.376 +26 1.301 +27 1.226 +28 1.151 +29 1.075 +30 1.000 +31 0.925 +32 0.851 +33 0.778 +34 0.705 +35 0.634 +36 0.563 +37 0.494 +38 0.426 +39 0.360 +40 0.296 +41 0.233 +42 0.172 +43 0.113 +44 0.055 +45 -0.000 +46 -0.053 +47 -0.105 +48 -0.154 +49 -0.201 +50 -0.246 +51 -0.288 +52 -0.329 +53 -0.367 +54 -0.404 +55 -0.438 +56 -0.470 +57 -0.500 +58 -0.529 +59 -0.555 +60 -0.580 +61 -0.602 +62 -0.624 +63 -0.643 +64 -0.661 +65 -0.678 +66 -0.694 +67 -0.708 +68 -0.722 +69 -0.735 +70 -0.747 +71 -0.759 +72 -0.770 +73 -0.781 +74 -0.792 +75 -0.804 +76 -0.816 +77 -0.828 +78 -0.842 +79 -0.857 +80 -0.873 +81 -0.890 +82 -0.910 +83 -0.931 +84 -0.955 +85 -0.982 +86 -1.012 +87 -1.045 +88 -1.081 +89 -1.121 +90 -1.166 +1 1.900 +2 1.917 +3 1.928 +4 1.933 +5 1.932 +6 1.925 +7 1.913 +8 1.897 +9 1.875 +10 1.850 +11 1.820 +12 1.786 +13 1.749 +14 1.709 +15 1.666 +16 1.620 +17 1.572 +18 1.522 +19 1.469 +20 1.415 +21 1.359 +22 1.302 +23 1.244 +24 1.185 +25 1.125 +26 1.065 +27 1.004 +28 0.943 +29 0.882 +30 0.821 +31 0.760 +32 0.700 +33 0.640 +34 0.581 +35 0.522 +36 0.465 +37 0.408 +38 0.353 +39 0.298 +40 0.245 +41 0.193 +42 0.143 +43 0.094 +44 0.046 +45 -0.000 +46 -0.044 +47 -0.087 +48 -0.128 +49 -0.168 +50 -0.206 +51 -0.242 +52 -0.276 +53 -0.309 +54 -0.340 +55 -0.370 +56 -0.398 +57 -0.424 +58 -0.449 +59 -0.472 +60 -0.494 +61 -0.515 +62 -0.534 +63 -0.552 +64 -0.569 +65 -0.585 +66 -0.600 +67 -0.615 +68 -0.628 +69 -0.641 +70 -0.654 +71 -0.666 +72 -0.679 +73 -0.691 +74 -0.703 +75 -0.716 +76 -0.729 +77 -0.743 +78 -0.757 +79 -0.773 +80 -0.790 +81 -0.808 +82 -0.828 +83 -0.850 +84 -0.875 +85 -0.901 +86 -0.930 +87 -0.962 +88 -0.997 +89 -1.035 +90 -1.077 +1 2.019 +2 2.042 +3 2.058 +4 2.067 +5 2.069 +6 2.065 +7 2.055 +8 2.040 +9 2.020 +10 1.994 +11 1.964 +12 1.930 +13 1.892 +14 1.850 +15 1.805 +16 1.757 +17 1.706 +18 1.653 +19 1.597 +20 1.539 +21 1.480 +22 1.419 +23 1.356 +24 1.293 +25 1.228 +26 1.163 +27 1.097 +28 1.031 +29 0.965 +30 0.899 +31 0.833 +32 0.767 +33 0.702 +34 0.638 +35 0.574 +36 0.511 +37 0.449 +38 0.388 +39 0.328 +40 0.270 +41 0.213 +42 0.157 +43 0.103 +44 0.051 +45 -0.000 +46 -0.049 +47 -0.097 +48 -0.142 +49 -0.186 +50 -0.229 +51 -0.269 +52 -0.308 +53 -0.345 +54 -0.380 +55 -0.413 +56 -0.445 +57 -0.475 +58 -0.503 +59 -0.530 +60 -0.556 +61 -0.580 +62 -0.603 +63 -0.624 +64 -0.644 +65 -0.664 +66 -0.682 +67 -0.700 +68 -0.717 +69 -0.733 +70 -0.749 +71 -0.765 +72 -0.780 +73 -0.796 +74 -0.812 +75 -0.828 +76 -0.845 +77 -0.863 +78 -0.882 +79 -0.902 +80 -0.924 +81 -0.947 +82 -0.972 +83 -0.999 +84 -1.029 +85 -1.061 +86 -1.097 +87 -1.135 +88 -1.177 +89 -1.223 +90 -1.273 +1 1.427 +2 1.452 +3 1.471 +4 1.485 +5 1.493 +6 1.496 +7 1.495 +8 1.488 +9 1.478 +10 1.464 +11 1.446 +12 1.424 +13 1.400 +14 1.372 +15 1.341 +16 1.308 +17 1.273 +18 1.235 +19 1.196 +20 1.155 +21 1.112 +22 1.068 +23 1.023 +24 0.976 +25 0.929 +26 0.881 +27 0.832 +28 0.784 +29 0.734 +30 0.685 +31 0.636 +32 0.586 +33 0.537 +34 0.489 +35 0.440 +36 0.393 +37 0.346 +38 0.299 +39 0.254 +40 0.209 +41 0.165 +42 0.122 +43 0.080 +44 0.040 +45 -0.000 +46 -0.038 +47 -0.076 +48 -0.112 +49 -0.147 +50 -0.180 +51 -0.213 +52 -0.244 +53 -0.274 +54 -0.302 +55 -0.330 +56 -0.356 +57 -0.382 +58 -0.406 +59 -0.429 +60 -0.451 +61 -0.472 +62 -0.492 +63 -0.512 +64 -0.530 +65 -0.548 +66 -0.566 +67 -0.583 +68 -0.599 +69 -0.616 +70 -0.632 +71 -0.648 +72 -0.664 +73 -0.681 +74 -0.698 +75 -0.715 +76 -0.733 +77 -0.752 +78 -0.772 +79 -0.793 +80 -0.815 +81 -0.838 +82 -0.864 +83 -0.891 +84 -0.920 +85 -0.952 +86 -0.986 +87 -1.022 +88 -1.062 +89 -1.105 +90 -1.151 +1 1.462 +2 1.496 +3 1.522 +4 1.543 +5 1.557 +6 1.566 +7 1.569 +8 1.567 +9 1.560 +10 1.549 +11 1.533 +12 1.514 +13 1.490 +14 1.464 +15 1.434 +16 1.401 +17 1.365 +18 1.327 +19 1.286 +20 1.244 +21 1.199 +22 1.153 +23 1.106 +24 1.057 +25 1.007 +26 0.956 +27 0.905 +28 0.852 +29 0.800 +30 0.747 +31 0.694 +32 0.641 +33 0.588 +34 0.535 +35 0.483 +36 0.431 +37 0.380 +38 0.329 +39 0.280 +40 0.231 +41 0.182 +42 0.135 +43 0.089 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.084 +48 -0.125 +49 -0.164 +50 -0.202 +51 -0.238 +52 -0.274 +53 -0.308 +54 -0.341 +55 -0.373 +56 -0.403 +57 -0.432 +58 -0.461 +59 -0.488 +60 -0.514 +61 -0.539 +62 -0.564 +63 -0.588 +64 -0.611 +65 -0.633 +66 -0.655 +67 -0.676 +68 -0.697 +69 -0.718 +70 -0.739 +71 -0.760 +72 -0.781 +73 -0.803 +74 -0.825 +75 -0.847 +76 -0.871 +77 -0.895 +78 -0.921 +79 -0.948 +80 -0.977 +81 -1.007 +82 -1.039 +83 -1.074 +84 -1.111 +85 -1.150 +86 -1.193 +87 -1.238 +88 -1.287 +89 -1.340 +90 -1.396 +1 0.889 +2 0.927 +3 0.960 +4 0.988 +5 1.010 +6 1.028 +7 1.041 +8 1.049 +9 1.054 +10 1.055 +11 1.052 +12 1.046 +13 1.036 +14 1.024 +15 1.008 +16 0.990 +17 0.970 +18 0.947 +19 0.922 +20 0.896 +21 0.867 +22 0.837 +23 0.806 +24 0.773 +25 0.739 +26 0.705 +27 0.669 +28 0.633 +29 0.596 +30 0.558 +31 0.520 +32 0.482 +33 0.444 +34 0.405 +35 0.367 +36 0.329 +37 0.290 +38 0.253 +39 0.215 +40 0.178 +41 0.141 +42 0.105 +43 0.069 +44 0.034 +45 -0.000 +46 -0.034 +47 -0.067 +48 -0.099 +49 -0.131 +50 -0.162 +51 -0.192 +52 -0.222 +53 -0.250 +54 -0.278 +55 -0.306 +56 -0.333 +57 -0.359 +58 -0.384 +59 -0.409 +60 -0.433 +61 -0.457 +62 -0.481 +63 -0.504 +64 -0.527 +65 -0.549 +66 -0.572 +67 -0.594 +68 -0.617 +69 -0.639 +70 -0.662 +71 -0.685 +72 -0.709 +73 -0.733 +74 -0.758 +75 -0.783 +76 -0.810 +77 -0.837 +78 -0.866 +79 -0.896 +80 -0.928 +81 -0.961 +82 -0.996 +83 -1.033 +84 -1.072 +85 -1.114 +86 -1.158 +87 -1.205 +88 -1.255 +89 -1.308 +90 -1.364 +1 0.996 +2 1.050 +3 1.096 +4 1.136 +5 1.169 +6 1.196 +7 1.217 +8 1.233 +9 1.243 +10 1.249 +11 1.249 +12 1.246 +13 1.238 +14 1.226 +15 1.210 +16 1.191 +17 1.169 +18 1.144 +19 1.116 +20 1.086 +21 1.054 +22 1.019 +23 0.982 +24 0.944 +25 0.904 +26 0.863 +27 0.820 +28 0.777 +29 0.732 +30 0.687 +31 0.641 +32 0.595 +33 0.548 +34 0.502 +35 0.455 +36 0.408 +37 0.361 +38 0.314 +39 0.268 +40 0.222 +41 0.177 +42 0.132 +43 0.087 +44 0.043 +45 -0.000 +46 -0.043 +47 -0.084 +48 -0.125 +49 -0.166 +50 -0.205 +51 -0.244 +52 -0.282 +53 -0.319 +54 -0.355 +55 -0.391 +56 -0.425 +57 -0.460 +58 -0.493 +59 -0.526 +60 -0.558 +61 -0.590 +62 -0.622 +63 -0.653 +64 -0.684 +65 -0.715 +66 -0.746 +67 -0.776 +68 -0.807 +69 -0.838 +70 -0.870 +71 -0.902 +72 -0.935 +73 -0.968 +74 -1.003 +75 -1.038 +76 -1.075 +77 -1.114 +78 -1.153 +79 -1.195 +80 -1.239 +81 -1.285 +82 -1.333 +83 -1.384 +84 -1.438 +85 -1.494 +86 -1.554 +87 -1.618 +88 -1.685 +89 -1.756 +90 -1.832 +1 0.491 +2 0.551 +3 0.605 +4 0.653 +5 0.695 +6 0.732 +7 0.763 +8 0.789 +9 0.811 +10 0.828 +11 0.840 +12 0.849 +13 0.854 +14 0.855 +15 0.853 +16 0.847 +17 0.839 +18 0.828 +19 0.814 +20 0.797 +21 0.779 +22 0.758 +23 0.735 +24 0.711 +25 0.685 +26 0.657 +27 0.628 +28 0.598 +29 0.566 +30 0.534 +31 0.501 +32 0.467 +33 0.432 +34 0.397 +35 0.362 +36 0.326 +37 0.290 +38 0.254 +39 0.217 +40 0.181 +41 0.144 +42 0.108 +43 0.072 +44 0.036 +45 -0.000 +46 -0.036 +47 -0.071 +48 -0.106 +49 -0.141 +50 -0.175 +51 -0.209 +52 -0.243 +53 -0.276 +54 -0.310 +55 -0.342 +56 -0.375 +57 -0.407 +58 -0.440 +59 -0.472 +60 -0.504 +61 -0.535 +62 -0.567 +63 -0.599 +64 -0.631 +65 -0.664 +66 -0.696 +67 -0.729 +68 -0.762 +69 -0.796 +70 -0.831 +71 -0.866 +72 -0.903 +73 -0.940 +74 -0.978 +75 -1.018 +76 -1.059 +77 -1.102 +78 -1.146 +79 -1.192 +80 -1.240 +81 -1.291 +82 -1.343 +83 -1.398 +84 -1.456 +85 -1.517 +86 -1.581 +87 -1.648 +88 -1.719 +89 -1.793 +90 -1.871 +1 0.761 +2 0.842 +3 0.915 +4 0.979 +5 1.035 +6 1.084 +7 1.125 +8 1.159 +9 1.187 +10 1.208 +11 1.223 +12 1.233 +13 1.238 +14 1.237 +15 1.232 +16 1.222 +17 1.208 +18 1.190 +19 1.169 +20 1.144 +21 1.116 +22 1.085 +23 1.051 +24 1.015 +25 0.977 +26 0.937 +27 0.895 +28 0.851 +29 0.806 +30 0.759 +31 0.711 +32 0.663 +33 0.613 +34 0.563 +35 0.512 +36 0.461 +37 0.410 +38 0.358 +39 0.307 +40 0.255 +41 0.204 +42 0.152 +43 0.101 +44 0.050 +45 -0.000 +46 -0.050 +47 -0.100 +48 -0.149 +49 -0.197 +50 -0.245 +51 -0.293 +52 -0.340 +53 -0.386 +54 -0.432 +55 -0.478 +56 -0.523 +57 -0.567 +58 -0.612 +59 -0.656 +60 -0.699 +61 -0.743 +62 -0.787 +63 -0.830 +64 -0.874 +65 -0.918 +66 -0.962 +67 -1.006 +68 -1.051 +69 -1.097 +70 -1.144 +71 -1.192 +72 -1.241 +73 -1.291 +74 -1.342 +75 -1.396 +76 -1.451 +77 -1.508 +78 -1.568 +79 -1.630 +80 -1.695 +81 -1.762 +82 -1.833 +83 -1.908 +84 -1.986 +85 -2.068 +86 -2.154 +87 -2.245 +88 -2.340 +89 -2.441 +90 -2.547 +1 0.532 +2 0.628 +3 0.714 +4 0.791 +5 0.859 +6 0.919 +7 0.972 +8 1.017 +9 1.055 +10 1.086 +11 1.111 +12 1.130 +13 1.143 +14 1.150 +15 1.153 +16 1.150 +17 1.143 +18 1.132 +19 1.117 +20 1.098 +21 1.075 +22 1.050 +23 1.021 +24 0.989 +25 0.955 +26 0.919 +27 0.880 +28 0.839 +29 0.797 +30 0.753 +31 0.708 +32 0.661 +33 0.613 +34 0.565 +35 0.515 +36 0.465 +37 0.414 +38 0.363 +39 0.311 +40 0.260 +41 0.208 +42 0.156 +43 0.104 +44 0.052 +45 -0.000 +46 -0.052 +47 -0.103 +48 -0.154 +49 -0.205 +50 -0.256 +51 -0.306 +52 -0.356 +53 -0.406 +54 -0.455 +55 -0.505 +56 -0.554 +57 -0.602 +58 -0.651 +59 -0.700 +60 -0.748 +61 -0.797 +62 -0.846 +63 -0.895 +64 -0.945 +65 -0.995 +66 -1.045 +67 -1.097 +68 -1.149 +69 -1.202 +70 -1.256 +71 -1.311 +72 -1.368 +73 -1.427 +74 -1.487 +75 -1.549 +76 -1.614 +77 -1.681 +78 -1.750 +79 -1.822 +80 -1.897 +81 -1.976 +82 -2.058 +83 -2.144 +84 -2.234 +85 -2.328 +86 -2.427 +87 -2.531 +88 -2.639 +89 -2.754 +90 -2.874 +1 0.674 +2 0.778 +3 0.872 +4 0.955 +5 1.029 +6 1.094 +7 1.150 +8 1.198 +9 1.238 +10 1.270 +11 1.296 +12 1.314 +13 1.326 +14 1.333 +15 1.333 +16 1.328 +17 1.318 +18 1.303 +19 1.284 +20 1.261 +21 1.233 +22 1.203 +23 1.169 +24 1.131 +25 1.091 +26 1.049 +27 1.004 +28 0.957 +29 0.908 +30 0.857 +31 0.805 +32 0.751 +33 0.696 +34 0.641 +35 0.584 +36 0.527 +37 0.469 +38 0.411 +39 0.352 +40 0.294 +41 0.235 +42 0.176 +43 0.117 +44 0.058 +45 -0.000 +46 -0.058 +47 -0.116 +48 -0.173 +49 -0.231 +50 -0.287 +51 -0.344 +52 -0.400 +53 -0.455 +54 -0.510 +55 -0.565 +56 -0.619 +57 -0.674 +58 -0.728 +59 -0.781 +60 -0.835 +61 -0.889 +62 -0.943 +63 -0.997 +64 -1.051 +65 -1.106 +66 -1.162 +67 -1.218 +68 -1.275 +69 -1.333 +70 -1.392 +71 -1.453 +72 -1.515 +73 -1.578 +74 -1.644 +75 -1.712 +76 -1.782 +77 -1.855 +78 -1.931 +79 -2.009 +80 -2.091 +81 -2.177 +82 -2.267 +83 -2.360 +84 -2.458 +85 -2.561 +86 -2.669 +87 -2.783 +88 -2.902 +89 -3.027 +90 -3.159 +1 0.659 +2 0.763 +3 0.858 +4 0.942 +5 1.017 +6 1.083 +7 1.140 +8 1.188 +9 1.229 +10 1.262 +11 1.288 +12 1.307 +13 1.320 +14 1.327 +15 1.328 +16 1.323 +17 1.314 +18 1.300 +19 1.281 +20 1.258 +21 1.231 +22 1.201 +23 1.167 +24 1.130 +25 1.090 +26 1.048 +27 1.003 +28 0.956 +29 0.908 +30 0.857 +31 0.805 +32 0.751 +33 0.697 +34 0.641 +35 0.585 +36 0.528 +37 0.470 +38 0.411 +39 0.353 +40 0.294 +41 0.235 +42 0.176 +43 0.117 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.116 +48 -0.174 +49 -0.231 +50 -0.288 +51 -0.345 +52 -0.401 +53 -0.457 +54 -0.512 +55 -0.567 +56 -0.622 +57 -0.677 +58 -0.731 +59 -0.786 +60 -0.840 +61 -0.894 +62 -0.948 +63 -1.003 +64 -1.058 +65 -1.113 +66 -1.169 +67 -1.226 +68 -1.284 +69 -1.342 +70 -1.402 +71 -1.463 +72 -1.526 +73 -1.590 +74 -1.657 +75 -1.725 +76 -1.796 +77 -1.870 +78 -1.946 +79 -2.026 +80 -2.109 +81 -2.195 +82 -2.286 +83 -2.380 +84 -2.479 +85 -2.583 +86 -2.692 +87 -2.807 +88 -2.927 +89 -3.053 +90 -3.186 +1 1.208 +2 1.322 +3 1.423 +4 1.512 +5 1.590 +6 1.656 +7 1.712 +8 1.758 +9 1.795 +10 1.822 +11 1.841 +12 1.852 +13 1.855 +14 1.851 +15 1.840 +16 1.823 +17 1.800 +18 1.771 +19 1.737 +20 1.699 +21 1.655 +22 1.608 +23 1.557 +24 1.502 +25 1.444 +26 1.384 +27 1.320 +28 1.255 +29 1.187 +30 1.118 +31 1.047 +32 0.975 +33 0.902 +34 0.827 +35 0.752 +36 0.677 +37 0.601 +38 0.525 +39 0.449 +40 0.374 +41 0.298 +42 0.223 +43 0.148 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.217 +49 -0.287 +50 -0.357 +51 -0.426 +52 -0.494 +53 -0.561 +54 -0.627 +55 -0.693 +56 -0.757 +57 -0.821 +58 -0.885 +59 -0.948 +60 -1.010 +61 -1.072 +62 -1.134 +63 -1.196 +64 -1.258 +65 -1.320 +66 -1.382 +67 -1.445 +68 -1.509 +69 -1.573 +70 -1.639 +71 -1.706 +72 -1.774 +73 -1.845 +74 -1.917 +75 -1.992 +76 -2.069 +77 -2.149 +78 -2.233 +79 -2.319 +80 -2.410 +81 -2.505 +82 -2.604 +83 -2.708 +84 -2.818 +85 -2.933 +86 -3.054 +87 -3.181 +88 -3.315 +89 -3.457 +90 -3.606 +1 1.219 +2 1.332 +3 1.432 +4 1.520 +5 1.596 +6 1.662 +7 1.717 +8 1.762 +9 1.797 +10 1.824 +11 1.842 +12 1.853 +13 1.855 +14 1.851 +15 1.839 +16 1.822 +17 1.798 +18 1.769 +19 1.735 +20 1.696 +21 1.653 +22 1.605 +23 1.554 +24 1.499 +25 1.441 +26 1.381 +27 1.317 +28 1.252 +29 1.184 +30 1.115 +31 1.044 +32 0.972 +33 0.899 +34 0.825 +35 0.750 +36 0.675 +37 0.599 +38 0.524 +39 0.448 +40 0.372 +41 0.297 +42 0.222 +43 0.147 +44 0.073 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.216 +49 -0.286 +50 -0.355 +51 -0.424 +52 -0.491 +53 -0.558 +54 -0.624 +55 -0.689 +56 -0.754 +57 -0.817 +58 -0.880 +59 -0.943 +60 -1.005 +61 -1.066 +62 -1.128 +63 -1.189 +64 -1.250 +65 -1.312 +66 -1.374 +67 -1.436 +68 -1.499 +69 -1.563 +70 -1.628 +71 -1.694 +72 -1.762 +73 -1.832 +74 -1.903 +75 -1.977 +76 -2.054 +77 -2.133 +78 -2.216 +79 -2.302 +80 -2.391 +81 -2.485 +82 -2.583 +83 -2.686 +84 -2.795 +85 -2.909 +86 -3.028 +87 -3.154 +88 -3.287 +89 -3.427 +90 -3.575 +1 1.910 +2 2.030 +3 2.134 +4 2.224 +5 2.301 +6 2.365 +7 2.416 +8 2.455 +9 2.483 +10 2.501 +11 2.509 +12 2.507 +13 2.497 +14 2.478 +15 2.451 +16 2.417 +17 2.376 +18 2.328 +19 2.275 +20 2.216 +21 2.153 +22 2.084 +23 2.012 +24 1.936 +25 1.856 +26 1.773 +27 1.688 +28 1.600 +29 1.510 +30 1.418 +31 1.325 +32 1.231 +33 1.135 +34 1.039 +35 0.943 +36 0.847 +37 0.750 +38 0.654 +39 0.558 +40 0.463 +41 0.368 +42 0.275 +43 0.182 +44 0.090 +45 -0.000 +46 -0.089 +47 -0.177 +48 -0.263 +49 -0.348 +50 -0.432 +51 -0.514 +52 -0.594 +53 -0.673 +54 -0.751 +55 -0.827 +56 -0.902 +57 -0.976 +58 -1.048 +59 -1.119 +60 -1.190 +61 -1.259 +62 -1.328 +63 -1.396 +64 -1.464 +65 -1.532 +66 -1.599 +67 -1.667 +68 -1.735 +69 -1.804 +70 -1.874 +71 -1.945 +72 -2.018 +73 -2.092 +74 -2.168 +75 -2.247 +76 -2.328 +77 -2.413 +78 -2.501 +79 -2.593 +80 -2.689 +81 -2.789 +82 -2.895 +83 -3.006 +84 -3.124 +85 -3.247 +86 -3.378 +87 -3.515 +88 -3.661 +89 -3.815 +90 -3.978 +1 1.882 +2 1.992 +3 2.088 +4 2.170 +5 2.240 +6 2.297 +7 2.343 +8 2.378 +9 2.402 +10 2.416 +11 2.421 +12 2.417 +13 2.404 +14 2.384 +15 2.357 +16 2.322 +17 2.281 +18 2.234 +19 2.182 +20 2.124 +21 2.062 +22 1.996 +23 1.925 +24 1.852 +25 1.774 +26 1.695 +27 1.612 +28 1.528 +29 1.441 +30 1.353 +31 1.264 +32 1.173 +33 1.082 +34 0.990 +35 0.898 +36 0.806 +37 0.714 +38 0.622 +39 0.531 +40 0.440 +41 0.350 +42 0.261 +43 0.173 +44 0.086 +45 -0.000 +46 -0.085 +47 -0.168 +48 -0.250 +49 -0.330 +50 -0.409 +51 -0.486 +52 -0.562 +53 -0.637 +54 -0.710 +55 -0.781 +56 -0.852 +57 -0.921 +58 -0.989 +59 -1.055 +60 -1.121 +61 -1.186 +62 -1.250 +63 -1.314 +64 -1.377 +65 -1.440 +66 -1.502 +67 -1.565 +68 -1.629 +69 -1.692 +70 -1.757 +71 -1.823 +72 -1.890 +73 -1.958 +74 -2.029 +75 -2.101 +76 -2.177 +77 -2.255 +78 -2.336 +79 -2.421 +80 -2.510 +81 -2.603 +82 -2.701 +83 -2.803 +84 -2.912 +85 -3.026 +86 -3.147 +87 -3.275 +88 -3.410 +89 -3.554 +90 -3.705 +1 2.590 +2 2.705 +3 2.803 +4 2.886 +5 2.954 +6 3.008 +7 3.048 +8 3.076 +9 3.091 +10 3.095 +11 3.088 +12 3.071 +13 3.045 +14 3.009 +15 2.965 +16 2.914 +17 2.855 +18 2.789 +19 2.717 +20 2.639 +21 2.557 +22 2.469 +23 2.377 +24 2.282 +25 2.183 +26 2.081 +27 1.976 +28 1.869 +29 1.760 +30 1.650 +31 1.539 +32 1.426 +33 1.313 +34 1.200 +35 1.087 +36 0.974 +37 0.861 +38 0.749 +39 0.638 +40 0.528 +41 0.419 +42 0.312 +43 0.206 +44 0.102 +45 -0.000 +46 -0.100 +47 -0.199 +48 -0.295 +49 -0.390 +50 -0.482 +51 -0.572 +52 -0.661 +53 -0.747 +54 -0.831 +55 -0.913 +56 -0.993 +57 -1.071 +58 -1.147 +59 -1.222 +60 -1.295 +61 -1.367 +62 -1.438 +63 -1.507 +64 -1.576 +65 -1.644 +66 -1.712 +67 -1.779 +68 -1.847 +69 -1.915 +70 -1.983 +71 -2.052 +72 -2.123 +73 -2.195 +74 -2.269 +75 -2.345 +76 -2.424 +77 -2.506 +78 -2.592 +79 -2.681 +80 -2.775 +81 -2.874 +82 -2.977 +83 -3.087 +84 -3.203 +85 -3.325 +86 -3.455 +87 -3.593 +88 -3.739 +89 -3.894 +90 -4.059 +1 2.485 +2 2.589 +3 2.677 +4 2.751 +5 2.811 +6 2.858 +7 2.892 +8 2.915 +9 2.927 +10 2.928 +11 2.918 +12 2.900 +13 2.873 +14 2.837 +15 2.794 +16 2.744 +17 2.687 +18 2.623 +19 2.554 +20 2.480 +21 2.401 +22 2.318 +23 2.231 +24 2.140 +25 2.046 +26 1.950 +27 1.851 +28 1.750 +29 1.648 +30 1.544 +31 1.439 +32 1.334 +33 1.227 +34 1.121 +35 1.015 +36 0.909 +37 0.804 +38 0.699 +39 0.595 +40 0.492 +41 0.391 +42 0.291 +43 0.192 +44 0.095 +45 -0.000 +46 -0.093 +47 -0.185 +48 -0.275 +49 -0.362 +50 -0.448 +51 -0.531 +52 -0.613 +53 -0.692 +54 -0.770 +55 -0.845 +56 -0.919 +57 -0.991 +58 -1.061 +59 -1.130 +60 -1.197 +61 -1.262 +62 -1.327 +63 -1.390 +64 -1.453 +65 -1.514 +66 -1.576 +67 -1.637 +68 -1.698 +69 -1.759 +70 -1.821 +71 -1.884 +72 -1.947 +73 -2.012 +74 -2.079 +75 -2.148 +76 -2.219 +77 -2.293 +78 -2.370 +79 -2.450 +80 -2.535 +81 -2.624 +82 -2.717 +83 -2.816 +84 -2.921 +85 -3.032 +86 -3.150 +87 -3.274 +88 -3.407 +89 -3.548 +90 -3.698 +1 3.145 +2 3.252 +3 3.342 +4 3.416 +5 3.474 +6 3.517 +7 3.546 +8 3.562 +9 3.565 +10 3.556 +11 3.536 +12 3.506 +13 3.465 +14 3.415 +15 3.357 +16 3.290 +17 3.216 +18 3.136 +19 3.049 +20 2.956 +21 2.858 +22 2.755 +23 2.648 +24 2.537 +25 2.423 +26 2.306 +27 2.187 +28 2.065 +29 1.942 +30 1.818 +31 1.693 +32 1.567 +33 1.441 +34 1.315 +35 1.189 +36 1.064 +37 0.939 +38 0.816 +39 0.694 +40 0.574 +41 0.455 +42 0.338 +43 0.223 +44 0.110 +45 -0.000 +46 -0.108 +47 -0.214 +48 -0.317 +49 -0.417 +50 -0.515 +51 -0.611 +52 -0.704 +53 -0.794 +54 -0.881 +55 -0.966 +56 -1.049 +57 -1.129 +58 -1.207 +59 -1.283 +60 -1.357 +61 -1.429 +62 -1.500 +63 -1.569 +64 -1.636 +65 -1.703 +66 -1.769 +67 -1.834 +68 -1.899 +69 -1.964 +70 -2.029 +71 -2.095 +72 -2.162 +73 -2.230 +74 -2.300 +75 -2.371 +76 -2.446 +77 -2.523 +78 -2.604 +79 -2.688 +80 -2.777 +81 -2.870 +82 -2.969 +83 -3.074 +84 -3.185 +85 -3.303 +86 -3.428 +87 -3.562 +88 -3.704 +89 -3.855 +90 -4.017 +1 2.968 +2 3.067 +3 3.149 +4 3.217 +5 3.270 +6 3.309 +7 3.335 +8 3.349 +9 3.350 +10 3.341 +11 3.321 +12 3.292 +13 3.253 +14 3.205 +15 3.150 +16 3.087 +17 3.017 +18 2.941 +19 2.858 +20 2.771 +21 2.679 +22 2.582 +23 2.481 +24 2.377 +25 2.270 +26 2.160 +27 2.048 +28 1.934 +29 1.819 +30 1.702 +31 1.585 +32 1.467 +33 1.348 +34 1.230 +35 1.112 +36 0.995 +37 0.879 +38 0.763 +39 0.649 +40 0.536 +41 0.425 +42 0.316 +43 0.209 +44 0.103 +45 -0.000 +46 -0.101 +47 -0.200 +48 -0.296 +49 -0.390 +50 -0.481 +51 -0.570 +52 -0.657 +53 -0.741 +54 -0.823 +55 -0.902 +56 -0.979 +57 -1.054 +58 -1.126 +59 -1.197 +60 -1.266 +61 -1.332 +62 -1.398 +63 -1.462 +64 -1.525 +65 -1.586 +66 -1.647 +67 -1.708 +68 -1.768 +69 -1.828 +70 -1.888 +71 -1.949 +72 -2.011 +73 -2.074 +74 -2.138 +75 -2.204 +76 -2.273 +77 -2.344 +78 -2.419 +79 -2.497 +80 -2.579 +81 -2.665 +82 -2.757 +83 -2.854 +84 -2.956 +85 -3.065 +86 -3.182 +87 -3.305 +88 -3.437 +89 -3.577 +90 -3.727 +1 3.569 +2 3.675 +3 3.762 +4 3.832 +5 3.886 +6 3.924 +7 3.947 +8 3.956 +9 3.951 +10 3.934 +11 3.906 +12 3.866 +13 3.815 +14 3.756 +15 3.687 +16 3.609 +17 3.524 +18 3.432 +19 3.333 +20 3.229 +21 3.118 +22 3.004 +23 2.884 +24 2.761 +25 2.635 +26 2.506 +27 2.374 +28 2.240 +29 2.105 +30 1.969 +31 1.832 +32 1.694 +33 1.557 +34 1.419 +35 1.283 +36 1.147 +37 1.012 +38 0.878 +39 0.747 +40 0.617 +41 0.489 +42 0.363 +43 0.239 +44 0.118 +45 -0.000 +46 -0.116 +47 -0.228 +48 -0.338 +49 -0.445 +50 -0.549 +51 -0.650 +52 -0.748 +53 -0.843 +54 -0.935 +55 -1.024 +56 -1.110 +57 -1.194 +58 -1.275 +59 -1.353 +60 -1.429 +61 -1.503 +62 -1.575 +63 -1.645 +64 -1.714 +65 -1.781 +66 -1.847 +67 -1.913 +68 -1.978 +69 -2.042 +70 -2.107 +71 -2.172 +72 -2.238 +73 -2.305 +74 -2.374 +75 -2.445 +76 -2.519 +77 -2.595 +78 -2.674 +79 -2.758 +80 -2.846 +81 -2.939 +82 -3.037 +83 -3.141 +84 -3.252 +85 -3.370 +86 -3.496 +87 -3.631 +88 -3.774 +89 -3.927 +90 -4.091 +1 3.224 +2 3.321 +3 3.402 +4 3.466 +5 3.516 +6 3.551 +7 3.573 +8 3.582 +9 3.579 +10 3.564 +11 3.539 +12 3.503 +13 3.458 +14 3.404 +15 3.342 +16 3.272 +17 3.196 +18 3.113 +19 3.023 +20 2.929 +21 2.829 +22 2.725 +23 2.617 +24 2.506 +25 2.392 +26 2.274 +27 2.155 +28 2.034 +29 1.912 +30 1.788 +31 1.664 +32 1.539 +33 1.414 +34 1.289 +35 1.165 +36 1.042 +37 0.920 +38 0.798 +39 0.679 +40 0.560 +41 0.444 +42 0.330 +43 0.218 +44 0.108 +45 -0.000 +46 -0.105 +47 -0.208 +48 -0.308 +49 -0.405 +50 -0.500 +51 -0.592 +52 -0.681 +53 -0.767 +54 -0.851 +55 -0.933 +56 -1.011 +57 -1.088 +58 -1.162 +59 -1.233 +60 -1.303 +61 -1.370 +62 -1.436 +63 -1.501 +64 -1.563 +65 -1.625 +66 -1.686 +67 -1.746 +68 -1.805 +69 -1.865 +70 -1.924 +71 -1.984 +72 -2.045 +73 -2.106 +74 -2.170 +75 -2.235 +76 -2.302 +77 -2.372 +78 -2.446 +79 -2.522 +80 -2.603 +81 -2.688 +82 -2.778 +83 -2.874 +84 -2.976 +85 -3.084 +86 -3.199 +87 -3.322 +88 -3.454 +89 -3.594 +90 -3.744 +1 3.666 +2 3.769 +3 3.854 +4 3.921 +5 3.972 +6 4.007 +7 4.027 +8 4.033 +9 4.026 +10 4.006 +11 3.975 +12 3.932 +13 3.879 +14 3.816 +15 3.744 +16 3.664 +17 3.576 +18 3.481 +19 3.380 +20 3.273 +21 3.160 +22 3.043 +23 2.921 +24 2.796 +25 2.667 +26 2.535 +27 2.401 +28 2.266 +29 2.128 +30 1.990 +31 1.851 +32 1.712 +33 1.572 +34 1.433 +35 1.295 +36 1.157 +37 1.021 +38 0.886 +39 0.753 +40 0.621 +41 0.492 +42 0.365 +43 0.241 +44 0.119 +45 -0.000 +46 -0.116 +47 -0.230 +48 -0.340 +49 -0.447 +50 -0.552 +51 -0.653 +52 -0.751 +53 -0.846 +54 -0.938 +55 -1.027 +56 -1.113 +57 -1.196 +58 -1.276 +59 -1.354 +60 -1.430 +61 -1.503 +62 -1.574 +63 -1.644 +64 -1.711 +65 -1.778 +66 -1.843 +67 -1.907 +68 -1.970 +69 -2.034 +70 -2.097 +71 -2.161 +72 -2.225 +73 -2.291 +74 -2.358 +75 -2.427 +76 -2.499 +77 -2.573 +78 -2.651 +79 -2.732 +80 -2.818 +81 -2.909 +82 -3.005 +83 -3.108 +84 -3.216 +85 -3.332 +86 -3.456 +87 -3.588 +88 -3.729 +89 -3.880 +90 -4.042 +1 3.223 +2 3.320 +3 3.401 +4 3.465 +5 3.515 +6 3.550 +7 3.572 +8 3.581 +9 3.578 +10 3.563 +11 3.538 +12 3.502 +13 3.458 +14 3.404 +15 3.342 +16 3.272 +17 3.196 +18 3.112 +19 3.023 +20 2.929 +21 2.829 +22 2.725 +23 2.617 +24 2.506 +25 2.391 +26 2.274 +27 2.155 +28 2.034 +29 1.912 +30 1.788 +31 1.664 +32 1.539 +33 1.414 +34 1.289 +35 1.165 +36 1.042 +37 0.920 +38 0.798 +39 0.679 +40 0.560 +41 0.444 +42 0.330 +43 0.218 +44 0.108 +45 -0.000 +46 -0.105 +47 -0.208 +48 -0.308 +49 -0.405 +50 -0.500 +51 -0.592 +52 -0.681 +53 -0.767 +54 -0.851 +55 -0.933 +56 -1.011 +57 -1.088 +58 -1.162 +59 -1.233 +60 -1.303 +61 -1.370 +62 -1.436 +63 -1.501 +64 -1.563 +65 -1.625 +66 -1.686 +67 -1.746 +68 -1.805 +69 -1.865 +70 -1.924 +71 -1.984 +72 -2.045 +73 -2.106 +74 -2.170 +75 -2.235 +76 -2.302 +77 -2.372 +78 -2.445 +79 -2.522 +80 -2.603 +81 -2.688 +82 -2.778 +83 -2.874 +84 -2.976 +85 -3.084 +86 -3.199 +87 -3.322 +88 -3.454 +89 -3.594 +90 -3.744 +1 3.568 +2 3.674 +3 3.761 +4 3.831 +5 3.885 +6 3.923 +7 3.946 +8 3.955 +9 3.950 +10 3.934 +11 3.905 +12 3.865 +13 3.815 +14 3.755 +15 3.686 +16 3.609 +17 3.524 +18 3.432 +19 3.333 +20 3.228 +21 3.118 +22 3.003 +23 2.884 +24 2.761 +25 2.635 +26 2.506 +27 2.374 +28 2.240 +29 2.105 +30 1.969 +31 1.832 +32 1.694 +33 1.557 +34 1.420 +35 1.283 +36 1.147 +37 1.012 +38 0.879 +39 0.747 +40 0.617 +41 0.489 +42 0.363 +43 0.239 +44 0.118 +45 -0.000 +46 -0.116 +47 -0.228 +48 -0.338 +49 -0.445 +50 -0.549 +51 -0.650 +52 -0.748 +53 -0.843 +54 -0.935 +55 -1.024 +56 -1.111 +57 -1.194 +58 -1.275 +59 -1.354 +60 -1.430 +61 -1.504 +62 -1.576 +63 -1.646 +64 -1.715 +65 -1.782 +66 -1.848 +67 -1.914 +68 -1.979 +69 -2.043 +70 -2.108 +71 -2.173 +72 -2.239 +73 -2.307 +74 -2.375 +75 -2.446 +76 -2.520 +77 -2.596 +78 -2.676 +79 -2.759 +80 -2.847 +81 -2.940 +82 -3.038 +83 -3.143 +84 -3.253 +85 -3.371 +86 -3.497 +87 -3.632 +88 -3.775 +89 -3.928 +90 -4.092 +1 2.965 +2 3.064 +3 3.147 +4 3.215 +5 3.268 +6 3.307 +7 3.333 +8 3.347 +9 3.349 +10 3.340 +11 3.320 +12 3.290 +13 3.252 +14 3.204 +15 3.149 +16 3.086 +17 3.016 +18 2.940 +19 2.858 +20 2.771 +21 2.678 +22 2.582 +23 2.481 +24 2.377 +25 2.270 +26 2.160 +27 2.048 +28 1.934 +29 1.819 +30 1.702 +31 1.585 +32 1.467 +33 1.348 +34 1.230 +35 1.112 +36 0.995 +37 0.879 +38 0.763 +39 0.649 +40 0.537 +41 0.425 +42 0.316 +43 0.209 +44 0.103 +45 -0.000 +46 -0.101 +47 -0.200 +48 -0.296 +49 -0.390 +50 -0.482 +51 -0.571 +52 -0.657 +53 -0.741 +54 -0.823 +55 -0.902 +56 -0.979 +57 -1.054 +58 -1.127 +59 -1.197 +60 -1.266 +61 -1.333 +62 -1.398 +63 -1.462 +64 -1.525 +65 -1.587 +66 -1.648 +67 -1.708 +68 -1.769 +69 -1.829 +70 -1.889 +71 -1.950 +72 -2.012 +73 -2.075 +74 -2.139 +75 -2.206 +76 -2.274 +77 -2.346 +78 -2.420 +79 -2.498 +80 -2.581 +81 -2.667 +82 -2.758 +83 -2.855 +84 -2.958 +85 -3.067 +86 -3.183 +87 -3.307 +88 -3.439 +89 -3.579 +90 -3.729 +1 3.143 +2 3.251 +3 3.341 +4 3.415 +5 3.473 +6 3.516 +7 3.545 +8 3.561 +9 3.564 +10 3.556 +11 3.536 +12 3.505 +13 3.464 +14 3.415 +15 3.356 +16 3.290 +17 3.216 +18 3.135 +19 3.048 +20 2.956 +21 2.858 +22 2.755 +23 2.648 +24 2.537 +25 2.423 +26 2.306 +27 2.187 +28 2.065 +29 1.942 +30 1.818 +31 1.693 +32 1.567 +33 1.441 +34 1.315 +35 1.189 +36 1.064 +37 0.939 +38 0.816 +39 0.694 +40 0.574 +41 0.455 +42 0.338 +43 0.223 +44 0.110 +45 -0.000 +46 -0.108 +47 -0.214 +48 -0.317 +49 -0.418 +50 -0.516 +51 -0.611 +52 -0.704 +53 -0.794 +54 -0.882 +55 -0.967 +56 -1.049 +57 -1.130 +58 -1.208 +59 -1.284 +60 -1.358 +61 -1.430 +62 -1.500 +63 -1.569 +64 -1.637 +65 -1.704 +66 -1.770 +67 -1.835 +68 -1.900 +69 -1.965 +70 -2.030 +71 -2.096 +72 -2.163 +73 -2.231 +74 -2.301 +75 -2.373 +76 -2.447 +77 -2.524 +78 -2.605 +79 -2.690 +80 -2.778 +81 -2.872 +82 -2.971 +83 -3.076 +84 -3.187 +85 -3.305 +86 -3.430 +87 -3.564 +88 -3.706 +89 -3.857 +90 -4.019 +1 2.484 +2 2.587 +3 2.675 +4 2.749 +5 2.809 +6 2.856 +7 2.890 +8 2.913 +9 2.924 +10 2.925 +11 2.916 +12 2.898 +13 2.871 +14 2.835 +15 2.792 +16 2.742 +17 2.684 +18 2.621 +19 2.552 +20 2.478 +21 2.399 +22 2.316 +23 2.229 +24 2.139 +25 2.045 +26 1.949 +27 1.850 +28 1.749 +29 1.647 +30 1.543 +31 1.438 +32 1.333 +33 1.227 +34 1.121 +35 1.014 +36 0.909 +37 0.803 +38 0.699 +39 0.595 +40 0.492 +41 0.391 +42 0.291 +43 0.192 +44 0.095 +45 -0.000 +46 -0.093 +47 -0.185 +48 -0.274 +49 -0.362 +50 -0.448 +51 -0.531 +52 -0.613 +53 -0.692 +54 -0.770 +55 -0.845 +56 -0.919 +57 -0.991 +58 -1.061 +59 -1.130 +60 -1.197 +61 -1.263 +62 -1.327 +63 -1.391 +64 -1.453 +65 -1.515 +66 -1.576 +67 -1.638 +68 -1.699 +69 -1.760 +70 -1.822 +71 -1.885 +72 -1.948 +73 -2.013 +74 -2.080 +75 -2.149 +76 -2.220 +77 -2.294 +78 -2.371 +79 -2.452 +80 -2.536 +81 -2.625 +82 -2.719 +83 -2.818 +84 -2.923 +85 -3.034 +86 -3.152 +87 -3.276 +88 -3.409 +89 -3.550 +90 -3.700 +1 2.587 +2 2.702 +3 2.801 +4 2.884 +5 2.952 +6 3.006 +7 3.046 +8 3.074 +9 3.089 +10 3.094 +11 3.087 +12 3.070 +13 3.043 +14 3.008 +15 2.964 +16 2.913 +17 2.854 +18 2.788 +19 2.716 +20 2.639 +21 2.556 +22 2.469 +23 2.377 +24 2.281 +25 2.182 +26 2.080 +27 1.976 +28 1.869 +29 1.760 +30 1.650 +31 1.539 +32 1.426 +33 1.313 +34 1.200 +35 1.087 +36 0.974 +37 0.861 +38 0.749 +39 0.638 +40 0.528 +41 0.420 +42 0.312 +43 0.206 +44 0.102 +45 -0.000 +46 -0.100 +47 -0.199 +48 -0.296 +49 -0.390 +50 -0.482 +51 -0.573 +52 -0.661 +53 -0.747 +54 -0.831 +55 -0.913 +56 -0.993 +57 -1.072 +58 -1.148 +59 -1.223 +60 -1.296 +61 -1.368 +62 -1.439 +63 -1.509 +64 -1.578 +65 -1.646 +66 -1.713 +67 -1.781 +68 -1.849 +69 -1.916 +70 -1.985 +71 -2.054 +72 -2.125 +73 -2.197 +74 -2.271 +75 -2.348 +76 -2.427 +77 -2.509 +78 -2.594 +79 -2.684 +80 -2.778 +81 -2.876 +82 -2.980 +83 -3.089 +84 -3.205 +85 -3.328 +86 -3.457 +87 -3.595 +88 -3.741 +89 -3.896 +90 -4.061 +1 1.882 +2 1.992 +3 2.088 +4 2.170 +5 2.240 +6 2.297 +7 2.343 +8 2.378 +9 2.402 +10 2.416 +11 2.421 +12 2.417 +13 2.404 +14 2.384 +15 2.356 +16 2.322 +17 2.281 +18 2.234 +19 2.182 +20 2.124 +21 2.062 +22 1.996 +23 1.925 +24 1.851 +25 1.774 +26 1.694 +27 1.612 +28 1.528 +29 1.441 +30 1.353 +31 1.264 +32 1.173 +33 1.082 +34 0.990 +35 0.898 +36 0.806 +37 0.714 +38 0.622 +39 0.531 +40 0.440 +41 0.350 +42 0.261 +43 0.173 +44 0.086 +45 -0.000 +46 -0.085 +47 -0.168 +48 -0.250 +49 -0.330 +50 -0.409 +51 -0.486 +52 -0.562 +53 -0.637 +54 -0.710 +55 -0.782 +56 -0.852 +57 -0.921 +58 -0.989 +59 -1.056 +60 -1.121 +61 -1.186 +62 -1.251 +63 -1.314 +64 -1.377 +65 -1.440 +66 -1.503 +67 -1.566 +68 -1.629 +69 -1.693 +70 -1.758 +71 -1.824 +72 -1.891 +73 -1.960 +74 -2.030 +75 -2.103 +76 -2.178 +77 -2.256 +78 -2.338 +79 -2.423 +80 -2.512 +81 -2.605 +82 -2.703 +83 -2.806 +84 -2.914 +85 -3.029 +86 -3.150 +87 -3.278 +88 -3.413 +89 -3.556 +90 -3.708 +1 1.912 +2 2.031 +3 2.135 +4 2.226 +5 2.302 +6 2.365 +7 2.417 +8 2.456 +9 2.484 +10 2.502 +11 2.509 +12 2.508 +13 2.497 +14 2.478 +15 2.451 +16 2.417 +17 2.376 +18 2.329 +19 2.275 +20 2.217 +21 2.153 +22 2.084 +23 2.012 +24 1.936 +25 1.856 +26 1.773 +27 1.688 +28 1.600 +29 1.510 +30 1.418 +31 1.325 +32 1.231 +33 1.135 +34 1.039 +35 0.943 +36 0.847 +37 0.750 +38 0.654 +39 0.558 +40 0.463 +41 0.368 +42 0.275 +43 0.182 +44 0.090 +45 -0.000 +46 -0.089 +47 -0.177 +48 -0.263 +49 -0.348 +50 -0.432 +51 -0.514 +52 -0.594 +53 -0.673 +54 -0.751 +55 -0.827 +56 -0.902 +57 -0.976 +58 -1.048 +59 -1.120 +60 -1.190 +61 -1.259 +62 -1.328 +63 -1.397 +64 -1.464 +65 -1.532 +66 -1.600 +67 -1.668 +68 -1.736 +69 -1.805 +70 -1.875 +71 -1.946 +72 -2.019 +73 -2.093 +74 -2.170 +75 -2.248 +76 -2.330 +77 -2.415 +78 -2.503 +79 -2.595 +80 -2.691 +81 -2.792 +82 -2.898 +83 -3.009 +84 -3.126 +85 -3.250 +86 -3.381 +87 -3.519 +88 -3.665 +89 -3.819 +90 -3.982 +1 1.221 +2 1.333 +3 1.433 +4 1.521 +5 1.598 +6 1.664 +7 1.719 +8 1.764 +9 1.800 +10 1.826 +11 1.844 +12 1.855 +13 1.857 +14 1.853 +15 1.841 +16 1.824 +17 1.800 +18 1.771 +19 1.737 +20 1.698 +21 1.654 +22 1.607 +23 1.555 +24 1.501 +25 1.443 +26 1.382 +27 1.319 +28 1.253 +29 1.185 +30 1.116 +31 1.045 +32 0.973 +33 0.900 +34 0.826 +35 0.751 +36 0.675 +37 0.600 +38 0.524 +39 0.448 +40 0.373 +41 0.297 +42 0.222 +43 0.147 +44 0.073 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.216 +49 -0.286 +50 -0.355 +51 -0.424 +52 -0.492 +53 -0.558 +54 -0.624 +55 -0.690 +56 -0.754 +57 -0.818 +58 -0.881 +59 -0.943 +60 -1.005 +61 -1.067 +62 -1.128 +63 -1.190 +64 -1.251 +65 -1.313 +66 -1.375 +67 -1.437 +68 -1.500 +69 -1.564 +70 -1.629 +71 -1.695 +72 -1.763 +73 -1.833 +74 -1.905 +75 -1.979 +76 -2.055 +77 -2.135 +78 -2.217 +79 -2.303 +80 -2.393 +81 -2.487 +82 -2.585 +83 -2.688 +84 -2.797 +85 -2.911 +86 -3.031 +87 -3.157 +88 -3.290 +89 -3.430 +90 -3.578 +1 1.212 +2 1.326 +3 1.427 +4 1.516 +5 1.594 +6 1.661 +7 1.717 +8 1.762 +9 1.799 +10 1.826 +11 1.845 +12 1.856 +13 1.859 +14 1.855 +15 1.844 +16 1.827 +17 1.804 +18 1.775 +19 1.741 +20 1.702 +21 1.658 +22 1.611 +23 1.560 +24 1.505 +25 1.447 +26 1.386 +27 1.323 +28 1.257 +29 1.190 +30 1.120 +31 1.049 +32 0.977 +33 0.903 +34 0.829 +35 0.754 +36 0.678 +37 0.602 +38 0.526 +39 0.450 +40 0.374 +41 0.298 +42 0.223 +43 0.148 +44 0.074 +45 -0.000 +46 -0.073 +47 -0.145 +48 -0.217 +49 -0.288 +50 -0.357 +51 -0.426 +52 -0.494 +53 -0.562 +54 -0.628 +55 -0.694 +56 -0.758 +57 -0.823 +58 -0.886 +59 -0.949 +60 -1.012 +61 -1.074 +62 -1.136 +63 -1.198 +64 -1.260 +65 -1.322 +66 -1.384 +67 -1.447 +68 -1.511 +69 -1.575 +70 -1.641 +71 -1.708 +72 -1.777 +73 -1.847 +74 -1.919 +75 -1.994 +76 -2.071 +77 -2.152 +78 -2.235 +79 -2.322 +80 -2.413 +81 -2.507 +82 -2.607 +83 -2.711 +84 -2.820 +85 -2.936 +86 -3.057 +87 -3.184 +88 -3.318 +89 -3.460 +90 -3.609 +1 0.662 +2 0.767 +3 0.862 +4 0.946 +5 1.021 +6 1.087 +7 1.144 +8 1.192 +9 1.233 +10 1.266 +11 1.292 +12 1.312 +13 1.324 +14 1.331 +15 1.332 +16 1.327 +17 1.318 +18 1.303 +19 1.284 +20 1.261 +21 1.234 +22 1.204 +23 1.170 +24 1.133 +25 1.093 +26 1.050 +27 1.006 +28 0.959 +29 0.910 +30 0.859 +31 0.807 +32 0.753 +33 0.698 +34 0.643 +35 0.586 +36 0.529 +37 0.471 +38 0.412 +39 0.354 +40 0.295 +41 0.236 +42 0.177 +43 0.118 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.117 +48 -0.174 +49 -0.232 +50 -0.289 +51 -0.345 +52 -0.402 +53 -0.458 +54 -0.513 +55 -0.568 +56 -0.623 +57 -0.678 +58 -0.732 +59 -0.786 +60 -0.841 +61 -0.895 +62 -0.949 +63 -1.004 +64 -1.059 +65 -1.114 +66 -1.170 +67 -1.227 +68 -1.285 +69 -1.343 +70 -1.403 +71 -1.464 +72 -1.527 +73 -1.591 +74 -1.658 +75 -1.726 +76 -1.797 +77 -1.871 +78 -1.947 +79 -2.027 +80 -2.110 +81 -2.196 +82 -2.287 +83 -2.382 +84 -2.481 +85 -2.585 +86 -2.694 +87 -2.808 +88 -2.929 +89 -3.055 +90 -3.188 +1 0.681 +2 0.785 +3 0.879 +4 0.962 +5 1.036 +6 1.101 +7 1.157 +8 1.205 +9 1.245 +10 1.277 +11 1.302 +12 1.321 +13 1.333 +14 1.339 +15 1.339 +16 1.334 +17 1.324 +18 1.309 +19 1.289 +20 1.266 +21 1.238 +22 1.207 +23 1.173 +24 1.136 +25 1.095 +26 1.053 +27 1.007 +28 0.960 +29 0.911 +30 0.860 +31 0.808 +32 0.754 +33 0.699 +34 0.643 +35 0.586 +36 0.529 +37 0.471 +38 0.412 +39 0.353 +40 0.294 +41 0.235 +42 0.176 +43 0.117 +44 0.059 +45 -0.000 +46 -0.058 +47 -0.116 +48 -0.174 +49 -0.231 +50 -0.288 +51 -0.345 +52 -0.401 +53 -0.456 +54 -0.512 +55 -0.566 +56 -0.621 +57 -0.675 +58 -0.729 +59 -0.783 +60 -0.837 +61 -0.891 +62 -0.945 +63 -0.999 +64 -1.054 +65 -1.109 +66 -1.164 +67 -1.221 +68 -1.278 +69 -1.336 +70 -1.395 +71 -1.456 +72 -1.518 +73 -1.582 +74 -1.647 +75 -1.715 +76 -1.786 +77 -1.858 +78 -1.934 +79 -2.013 +80 -2.095 +81 -2.181 +82 -2.271 +83 -2.364 +84 -2.463 +85 -2.566 +86 -2.674 +87 -2.787 +88 -2.907 +89 -3.032 +90 -3.164 +1 0.543 +2 0.638 +3 0.724 +4 0.801 +5 0.870 +6 0.930 +7 0.983 +8 1.028 +9 1.066 +10 1.097 +11 1.122 +12 1.140 +13 1.153 +14 1.161 +15 1.163 +16 1.160 +17 1.153 +18 1.141 +19 1.126 +20 1.106 +21 1.084 +22 1.058 +23 1.028 +24 0.996 +25 0.962 +26 0.925 +27 0.886 +28 0.845 +29 0.802 +30 0.758 +31 0.712 +32 0.665 +33 0.617 +34 0.568 +35 0.518 +36 0.468 +37 0.417 +38 0.365 +39 0.313 +40 0.261 +41 0.209 +42 0.157 +43 0.104 +44 0.052 +45 -0.000 +46 -0.052 +47 -0.104 +48 -0.155 +49 -0.206 +50 -0.257 +51 -0.308 +52 -0.358 +53 -0.408 +54 -0.457 +55 -0.507 +56 -0.556 +57 -0.605 +58 -0.654 +59 -0.703 +60 -0.751 +61 -0.800 +62 -0.849 +63 -0.899 +64 -0.948 +65 -0.998 +66 -1.049 +67 -1.100 +68 -1.153 +69 -1.206 +70 -1.260 +71 -1.316 +72 -1.372 +73 -1.431 +74 -1.491 +75 -1.554 +76 -1.618 +77 -1.685 +78 -1.755 +79 -1.827 +80 -1.902 +81 -1.981 +82 -2.063 +83 -2.149 +84 -2.239 +85 -2.334 +86 -2.433 +87 -2.537 +88 -2.646 +89 -2.761 +90 -2.881 +1 0.772 +2 0.853 +3 0.926 +4 0.990 +5 1.046 +6 1.094 +7 1.136 +8 1.170 +9 1.197 +10 1.219 +11 1.234 +12 1.243 +13 1.248 +14 1.247 +15 1.241 +16 1.231 +17 1.217 +18 1.199 +19 1.177 +20 1.152 +21 1.124 +22 1.093 +23 1.059 +24 1.022 +25 0.984 +26 0.943 +27 0.901 +28 0.856 +29 0.811 +30 0.764 +31 0.716 +32 0.667 +33 0.617 +34 0.567 +35 0.516 +36 0.464 +37 0.413 +38 0.361 +39 0.309 +40 0.257 +41 0.205 +42 0.153 +43 0.102 +44 0.051 +45 -0.000 +46 -0.050 +47 -0.100 +48 -0.150 +49 -0.198 +50 -0.247 +51 -0.294 +52 -0.342 +53 -0.388 +54 -0.435 +55 -0.480 +56 -0.526 +57 -0.570 +58 -0.615 +59 -0.659 +60 -0.703 +61 -0.747 +62 -0.791 +63 -0.834 +64 -0.878 +65 -0.922 +66 -0.966 +67 -1.011 +68 -1.056 +69 -1.102 +70 -1.149 +71 -1.197 +72 -1.246 +73 -1.296 +74 -1.348 +75 -1.401 +76 -1.457 +77 -1.514 +78 -1.574 +79 -1.636 +80 -1.701 +81 -1.768 +82 -1.840 +83 -1.914 +84 -1.992 +85 -2.074 +86 -2.161 +87 -2.251 +88 -2.347 +89 -2.448 +90 -2.554 +1 0.502 +2 0.563 +3 0.617 +4 0.665 +5 0.707 +6 0.744 +7 0.775 +8 0.801 +9 0.823 +10 0.840 +11 0.852 +12 0.861 +13 0.866 +14 0.867 +15 0.864 +16 0.859 +17 0.850 +18 0.838 +19 0.824 +20 0.807 +21 0.788 +22 0.767 +23 0.744 +24 0.719 +25 0.693 +26 0.665 +27 0.635 +28 0.604 +29 0.573 +30 0.540 +31 0.506 +32 0.472 +33 0.437 +34 0.402 +35 0.366 +36 0.330 +37 0.293 +38 0.256 +39 0.220 +40 0.183 +41 0.146 +42 0.109 +43 0.073 +44 0.036 +45 -0.000 +46 -0.036 +47 -0.072 +48 -0.107 +49 -0.142 +50 -0.177 +51 -0.211 +52 -0.245 +53 -0.279 +54 -0.312 +55 -0.345 +56 -0.378 +57 -0.411 +58 -0.443 +59 -0.475 +60 -0.507 +61 -0.539 +62 -0.571 +63 -0.604 +64 -0.636 +65 -0.668 +66 -0.701 +67 -0.734 +68 -0.767 +69 -0.801 +70 -0.836 +71 -0.871 +72 -0.908 +73 -0.945 +74 -0.984 +75 -1.023 +76 -1.064 +77 -1.107 +78 -1.152 +79 -1.198 +80 -1.246 +81 -1.296 +82 -1.349 +83 -1.404 +84 -1.462 +85 -1.523 +86 -1.587 +87 -1.654 +88 -1.725 +89 -1.800 +90 -1.878 +1 1.010 +2 1.064 +3 1.110 +4 1.150 +5 1.183 +6 1.210 +7 1.231 +8 1.247 +9 1.257 +10 1.262 +11 1.262 +12 1.258 +13 1.250 +14 1.238 +15 1.222 +16 1.203 +17 1.181 +18 1.155 +19 1.127 +20 1.096 +21 1.063 +22 1.028 +23 0.991 +24 0.952 +25 0.912 +26 0.870 +27 0.827 +28 0.783 +29 0.739 +30 0.693 +31 0.647 +32 0.600 +33 0.553 +34 0.506 +35 0.459 +36 0.411 +37 0.364 +38 0.317 +39 0.270 +40 0.224 +41 0.178 +42 0.133 +43 0.088 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.085 +48 -0.126 +49 -0.167 +50 -0.207 +51 -0.245 +52 -0.284 +53 -0.321 +54 -0.358 +55 -0.393 +56 -0.428 +57 -0.463 +58 -0.497 +59 -0.530 +60 -0.562 +61 -0.594 +62 -0.626 +63 -0.657 +64 -0.688 +65 -0.719 +66 -0.750 +67 -0.781 +68 -0.812 +69 -0.843 +70 -0.875 +71 -0.907 +72 -0.940 +73 -0.974 +74 -1.008 +75 -1.044 +76 -1.081 +77 -1.119 +78 -1.159 +79 -1.201 +80 -1.245 +81 -1.291 +82 -1.339 +83 -1.390 +84 -1.444 +85 -1.501 +86 -1.561 +87 -1.625 +88 -1.693 +89 -1.764 +90 -1.840 +1 0.903 +2 0.941 +3 0.974 +4 1.002 +5 1.024 +6 1.042 +7 1.054 +8 1.063 +9 1.068 +10 1.068 +11 1.065 +12 1.058 +13 1.049 +14 1.036 +15 1.020 +16 1.002 +17 0.981 +18 0.958 +19 0.933 +20 0.906 +21 0.877 +22 0.847 +23 0.815 +24 0.782 +25 0.748 +26 0.712 +27 0.676 +28 0.639 +29 0.602 +30 0.564 +31 0.526 +32 0.487 +33 0.448 +34 0.410 +35 0.371 +36 0.332 +37 0.294 +38 0.255 +39 0.217 +40 0.180 +41 0.143 +42 0.106 +43 0.070 +44 0.035 +45 -0.000 +46 -0.034 +47 -0.068 +48 -0.100 +49 -0.132 +50 -0.164 +51 -0.194 +52 -0.224 +53 -0.253 +54 -0.281 +55 -0.309 +56 -0.336 +57 -0.362 +58 -0.388 +59 -0.413 +60 -0.438 +61 -0.462 +62 -0.485 +63 -0.509 +64 -0.532 +65 -0.554 +66 -0.577 +67 -0.600 +68 -0.622 +69 -0.645 +70 -0.668 +71 -0.691 +72 -0.715 +73 -0.739 +74 -0.764 +75 -0.790 +76 -0.817 +77 -0.844 +78 -0.873 +79 -0.903 +80 -0.935 +81 -0.969 +82 -1.004 +83 -1.041 +84 -1.081 +85 -1.123 +86 -1.167 +87 -1.214 +88 -1.264 +89 -1.317 +90 -1.374 +1 1.476 +2 1.510 +3 1.537 +4 1.558 +5 1.572 +6 1.581 +7 1.584 +8 1.582 +9 1.575 +10 1.564 +11 1.548 +12 1.528 +13 1.505 +14 1.478 +15 1.447 +16 1.414 +17 1.378 +18 1.339 +19 1.299 +20 1.256 +21 1.211 +22 1.164 +23 1.116 +24 1.067 +25 1.017 +26 0.965 +27 0.913 +28 0.860 +29 0.807 +30 0.754 +31 0.700 +32 0.647 +33 0.594 +34 0.540 +35 0.488 +36 0.435 +37 0.384 +38 0.332 +39 0.282 +40 0.233 +41 0.184 +42 0.136 +43 0.090 +44 0.044 +45 -0.000 +46 -0.043 +47 -0.085 +48 -0.126 +49 -0.165 +50 -0.204 +51 -0.241 +52 -0.276 +53 -0.311 +54 -0.344 +55 -0.376 +56 -0.407 +57 -0.436 +58 -0.465 +59 -0.492 +60 -0.519 +61 -0.544 +62 -0.569 +63 -0.592 +64 -0.616 +65 -0.638 +66 -0.660 +67 -0.682 +68 -0.703 +69 -0.724 +70 -0.745 +71 -0.766 +72 -0.787 +73 -0.809 +74 -0.831 +75 -0.854 +76 -0.878 +77 -0.903 +78 -0.928 +79 -0.956 +80 -0.985 +81 -1.015 +82 -1.048 +83 -1.083 +84 -1.120 +85 -1.160 +86 -1.203 +87 -1.249 +88 -1.298 +89 -1.351 +90 -1.408 +1 1.442 +2 1.467 +3 1.487 +4 1.501 +5 1.509 +6 1.512 +7 1.511 +8 1.505 +9 1.494 +10 1.480 +11 1.462 +12 1.440 +13 1.416 +14 1.388 +15 1.357 +16 1.323 +17 1.288 +18 1.250 +19 1.210 +20 1.168 +21 1.125 +22 1.080 +23 1.034 +24 0.988 +25 0.940 +26 0.891 +27 0.842 +28 0.793 +29 0.743 +30 0.693 +31 0.643 +32 0.593 +33 0.544 +34 0.494 +35 0.446 +36 0.397 +37 0.350 +38 0.303 +39 0.257 +40 0.211 +41 0.167 +42 0.124 +43 0.081 +44 0.040 +45 -0.000 +46 -0.039 +47 -0.077 +48 -0.113 +49 -0.148 +50 -0.182 +51 -0.215 +52 -0.247 +53 -0.277 +54 -0.306 +55 -0.334 +56 -0.360 +57 -0.386 +58 -0.410 +59 -0.434 +60 -0.456 +61 -0.477 +62 -0.498 +63 -0.517 +64 -0.536 +65 -0.554 +66 -0.572 +67 -0.589 +68 -0.606 +69 -0.623 +70 -0.639 +71 -0.655 +72 -0.672 +73 -0.688 +74 -0.706 +75 -0.723 +76 -0.741 +77 -0.760 +78 -0.780 +79 -0.801 +80 -0.824 +81 -0.848 +82 -0.874 +83 -0.901 +84 -0.931 +85 -0.963 +86 -0.997 +87 -1.035 +88 -1.075 +89 -1.118 +90 -1.165 +1 2.034 +2 2.057 +3 2.073 +4 2.082 +5 2.085 +6 2.081 +7 2.072 +8 2.056 +9 2.036 +10 2.010 +11 1.980 +12 1.946 +13 1.908 +14 1.866 +15 1.821 +16 1.772 +17 1.721 +18 1.667 +19 1.611 +20 1.553 +21 1.493 +22 1.431 +23 1.368 +24 1.304 +25 1.239 +26 1.173 +27 1.107 +28 1.040 +29 0.974 +30 0.907 +31 0.840 +32 0.774 +33 0.708 +34 0.643 +35 0.579 +36 0.515 +37 0.453 +38 0.392 +39 0.331 +40 0.272 +41 0.215 +42 0.159 +43 0.104 +44 0.051 +45 -0.000 +46 -0.050 +47 -0.098 +48 -0.144 +49 -0.188 +50 -0.231 +51 -0.272 +52 -0.311 +53 -0.348 +54 -0.383 +55 -0.417 +56 -0.449 +57 -0.480 +58 -0.508 +59 -0.536 +60 -0.561 +61 -0.586 +62 -0.609 +63 -0.630 +64 -0.651 +65 -0.671 +66 -0.689 +67 -0.707 +68 -0.724 +69 -0.741 +70 -0.757 +71 -0.773 +72 -0.789 +73 -0.805 +74 -0.821 +75 -0.837 +76 -0.855 +77 -0.873 +78 -0.892 +79 -0.912 +80 -0.934 +81 -0.958 +82 -0.983 +83 -1.011 +84 -1.041 +85 -1.074 +86 -1.109 +87 -1.148 +88 -1.191 +89 -1.237 +90 -1.288 +1 1.916 +2 1.934 +3 1.945 +4 1.950 +5 1.949 +6 1.942 +7 1.931 +8 1.914 +9 1.892 +10 1.866 +11 1.837 +12 1.803 +13 1.766 +14 1.725 +15 1.682 +16 1.636 +17 1.587 +18 1.536 +19 1.483 +20 1.429 +21 1.372 +22 1.315 +23 1.256 +24 1.197 +25 1.136 +26 1.075 +27 1.014 +28 0.952 +29 0.891 +30 0.829 +31 0.768 +32 0.707 +33 0.646 +34 0.587 +35 0.527 +36 0.469 +37 0.412 +38 0.356 +39 0.301 +40 0.247 +41 0.195 +42 0.144 +43 0.094 +44 0.046 +45 -0.000 +46 -0.045 +47 -0.088 +48 -0.130 +49 -0.170 +50 -0.208 +51 -0.244 +52 -0.279 +53 -0.312 +54 -0.344 +55 -0.374 +56 -0.402 +57 -0.428 +58 -0.454 +59 -0.477 +60 -0.499 +61 -0.520 +62 -0.540 +63 -0.558 +64 -0.576 +65 -0.592 +66 -0.607 +67 -0.622 +68 -0.636 +69 -0.649 +70 -0.662 +71 -0.675 +72 -0.687 +73 -0.700 +74 -0.712 +75 -0.725 +76 -0.739 +77 -0.753 +78 -0.768 +79 -0.784 +80 -0.801 +81 -0.820 +82 -0.840 +83 -0.863 +84 -0.888 +85 -0.914 +86 -0.944 +87 -0.977 +88 -1.012 +89 -1.051 +90 -1.094 +1 2.419 +2 2.435 +3 2.443 +4 2.443 +5 2.437 +6 2.424 +7 2.405 +8 2.380 +9 2.350 +10 2.314 +11 2.274 +12 2.229 +13 2.181 +14 2.128 +15 2.072 +16 2.013 +17 1.951 +18 1.887 +19 1.820 +20 1.752 +21 1.681 +22 1.609 +23 1.536 +24 1.462 +25 1.387 +26 1.312 +27 1.236 +28 1.160 +29 1.084 +30 1.008 +31 0.933 +32 0.858 +33 0.784 +34 0.711 +35 0.639 +36 0.568 +37 0.498 +38 0.430 +39 0.363 +40 0.298 +41 0.235 +42 0.173 +43 0.114 +44 0.056 +45 -0.000 +46 -0.054 +47 -0.105 +48 -0.155 +49 -0.202 +50 -0.248 +51 -0.291 +52 -0.332 +53 -0.371 +54 -0.408 +55 -0.442 +56 -0.475 +57 -0.505 +58 -0.534 +59 -0.561 +60 -0.586 +61 -0.609 +62 -0.630 +63 -0.650 +64 -0.669 +65 -0.686 +66 -0.702 +67 -0.717 +68 -0.730 +69 -0.744 +70 -0.756 +71 -0.768 +72 -0.780 +73 -0.791 +74 -0.803 +75 -0.814 +76 -0.827 +77 -0.840 +78 -0.854 +79 -0.869 +80 -0.885 +81 -0.903 +82 -0.923 +83 -0.945 +84 -0.970 +85 -0.997 +86 -1.027 +87 -1.060 +88 -1.098 +89 -1.139 +90 -1.184 +1 2.173 +2 2.186 +3 2.193 +4 2.192 +5 2.186 +6 2.174 +7 2.156 +8 2.133 +9 2.105 +10 2.073 +11 2.037 +12 1.996 +13 1.952 +14 1.905 +15 1.855 +16 1.802 +17 1.746 +18 1.688 +19 1.628 +20 1.566 +21 1.503 +22 1.439 +23 1.373 +24 1.307 +25 1.239 +26 1.172 +27 1.104 +28 1.036 +29 0.968 +30 0.900 +31 0.833 +32 0.766 +33 0.700 +34 0.634 +35 0.570 +36 0.507 +37 0.444 +38 0.383 +39 0.324 +40 0.266 +41 0.209 +42 0.154 +43 0.101 +44 0.050 +45 -0.000 +46 -0.048 +47 -0.094 +48 -0.138 +49 -0.180 +50 -0.220 +51 -0.259 +52 -0.295 +53 -0.329 +54 -0.362 +55 -0.393 +56 -0.421 +57 -0.448 +58 -0.473 +59 -0.497 +60 -0.519 +61 -0.539 +62 -0.558 +63 -0.575 +64 -0.591 +65 -0.606 +66 -0.620 +67 -0.632 +68 -0.644 +69 -0.655 +70 -0.666 +71 -0.676 +72 -0.686 +73 -0.696 +74 -0.705 +75 -0.715 +76 -0.725 +77 -0.736 +78 -0.748 +79 -0.761 +80 -0.775 +81 -0.790 +82 -0.807 +83 -0.826 +84 -0.847 +85 -0.870 +86 -0.896 +87 -0.925 +88 -0.958 +89 -0.993 +90 -1.033 +1 2.548 +2 2.561 +3 2.565 +4 2.563 +5 2.553 +6 2.537 +7 2.514 +8 2.486 +9 2.452 +10 2.413 +11 2.369 +12 2.321 +13 2.268 +14 2.212 +15 2.153 +16 2.090 +17 2.025 +18 1.957 +19 1.887 +20 1.814 +21 1.741 +22 1.665 +23 1.589 +24 1.511 +25 1.433 +26 1.354 +27 1.276 +28 1.196 +29 1.118 +30 1.039 +31 0.961 +32 0.883 +33 0.807 +34 0.731 +35 0.657 +36 0.584 +37 0.512 +38 0.441 +39 0.373 +40 0.306 +41 0.241 +42 0.178 +43 0.116 +44 0.057 +45 -0.000 +46 -0.055 +47 -0.108 +48 -0.158 +49 -0.206 +50 -0.252 +51 -0.296 +52 -0.337 +53 -0.377 +54 -0.414 +55 -0.448 +56 -0.481 +57 -0.511 +58 -0.539 +59 -0.566 +60 -0.590 +61 -0.613 +62 -0.633 +63 -0.652 +64 -0.670 +65 -0.686 +66 -0.701 +67 -0.714 +68 -0.727 +69 -0.738 +70 -0.749 +71 -0.759 +72 -0.769 +73 -0.779 +74 -0.788 +75 -0.798 +76 -0.808 +77 -0.819 +78 -0.831 +79 -0.843 +80 -0.857 +81 -0.873 +82 -0.891 +83 -0.910 +84 -0.932 +85 -0.957 +86 -0.984 +87 -1.015 +88 -1.050 +89 -1.088 +90 -1.131 +1 2.167 +2 2.177 +3 2.181 +4 2.178 +5 2.170 +6 2.156 +7 2.137 +8 2.112 +9 2.083 +10 2.050 +11 2.013 +12 1.972 +13 1.927 +14 1.879 +15 1.829 +16 1.775 +17 1.720 +18 1.662 +19 1.602 +20 1.541 +21 1.478 +22 1.414 +23 1.349 +24 1.283 +25 1.217 +26 1.150 +27 1.083 +28 1.016 +29 0.949 +30 0.882 +31 0.816 +32 0.750 +33 0.685 +34 0.621 +35 0.557 +36 0.495 +37 0.434 +38 0.375 +39 0.316 +40 0.260 +41 0.204 +42 0.151 +43 0.099 +44 0.048 +45 -0.000 +46 -0.047 +47 -0.091 +48 -0.134 +49 -0.175 +50 -0.214 +51 -0.251 +52 -0.286 +53 -0.319 +54 -0.351 +55 -0.380 +56 -0.408 +57 -0.433 +58 -0.457 +59 -0.480 +60 -0.500 +61 -0.519 +62 -0.537 +63 -0.553 +64 -0.568 +65 -0.581 +66 -0.593 +67 -0.605 +68 -0.615 +69 -0.625 +70 -0.634 +71 -0.643 +72 -0.651 +73 -0.659 +74 -0.667 +75 -0.675 +76 -0.684 +77 -0.693 +78 -0.702 +79 -0.713 +80 -0.725 +81 -0.738 +82 -0.752 +83 -0.769 +84 -0.787 +85 -0.808 +86 -0.831 +87 -0.857 +88 -0.886 +89 -0.919 +90 -0.955 +1 2.370 +2 2.378 +3 2.379 +4 2.374 +5 2.362 +6 2.344 +7 2.321 +8 2.293 +9 2.259 +10 2.222 +11 2.180 +12 2.134 +13 2.084 +14 2.031 +15 1.975 +16 1.917 +17 1.856 +18 1.792 +19 1.727 +20 1.660 +21 1.592 +22 1.522 +23 1.451 +24 1.380 +25 1.308 +26 1.236 +27 1.163 +28 1.090 +29 1.018 +30 0.946 +31 0.874 +32 0.804 +33 0.734 +34 0.665 +35 0.597 +36 0.530 +37 0.464 +38 0.400 +39 0.338 +40 0.277 +41 0.218 +42 0.161 +43 0.105 +44 0.052 +45 -0.000 +46 -0.050 +47 -0.097 +48 -0.143 +49 -0.186 +50 -0.227 +51 -0.266 +52 -0.303 +53 -0.338 +54 -0.371 +55 -0.402 +56 -0.430 +57 -0.457 +58 -0.482 +59 -0.505 +60 -0.526 +61 -0.545 +62 -0.563 +63 -0.579 +64 -0.593 +65 -0.607 +66 -0.618 +67 -0.629 +68 -0.639 +69 -0.648 +70 -0.656 +71 -0.664 +72 -0.671 +73 -0.677 +74 -0.684 +75 -0.691 +76 -0.698 +77 -0.706 +78 -0.714 +79 -0.723 +80 -0.733 +81 -0.745 +82 -0.758 +83 -0.773 +84 -0.790 +85 -0.810 +86 -0.832 +87 -0.857 +88 -0.885 +89 -0.917 +90 -0.952 +1 1.777 +2 1.780 +3 1.778 +4 1.772 +5 1.761 +6 1.746 +7 1.727 +8 1.704 +9 1.678 +10 1.648 +11 1.616 +12 1.580 +13 1.543 +14 1.502 +15 1.460 +16 1.416 +17 1.370 +18 1.322 +19 1.273 +20 1.223 +21 1.172 +22 1.120 +23 1.067 +24 1.014 +25 0.961 +26 0.907 +27 0.853 +28 0.800 +29 0.746 +30 0.693 +31 0.640 +32 0.588 +33 0.537 +34 0.486 +35 0.436 +36 0.387 +37 0.339 +38 0.292 +39 0.246 +40 0.202 +41 0.159 +42 0.117 +43 0.076 +44 0.037 +45 -0.000 +46 -0.036 +47 -0.070 +48 -0.103 +49 -0.134 +50 -0.164 +51 -0.192 +52 -0.218 +53 -0.243 +54 -0.267 +55 -0.288 +56 -0.308 +57 -0.327 +58 -0.344 +59 -0.360 +60 -0.374 +61 -0.388 +62 -0.399 +63 -0.410 +64 -0.419 +65 -0.428 +66 -0.435 +67 -0.442 +68 -0.448 +69 -0.453 +70 -0.457 +71 -0.461 +72 -0.465 +73 -0.468 +74 -0.471 +75 -0.474 +76 -0.478 +77 -0.481 +78 -0.486 +79 -0.490 +80 -0.496 +81 -0.502 +82 -0.510 +83 -0.518 +84 -0.529 +85 -0.541 +86 -0.554 +87 -0.570 +88 -0.588 +89 -0.609 +90 -0.632 +1 1.737 +2 1.734 +3 1.726 +4 1.714 +5 1.699 +6 1.680 +7 1.657 +8 1.631 +9 1.603 +10 1.571 +11 1.537 +12 1.501 +13 1.462 +14 1.421 +15 1.379 +16 1.335 +17 1.290 +18 1.243 +19 1.195 +20 1.146 +21 1.097 +22 1.047 +23 0.996 +24 0.946 +25 0.895 +26 0.843 +27 0.792 +28 0.742 +29 0.691 +30 0.641 +31 0.591 +32 0.543 +33 0.494 +34 0.447 +35 0.400 +36 0.355 +37 0.310 +38 0.267 +39 0.225 +40 0.184 +41 0.144 +42 0.106 +43 0.069 +44 0.034 +45 -0.000 +46 -0.032 +47 -0.063 +48 -0.093 +49 -0.120 +50 -0.147 +51 -0.171 +52 -0.194 +53 -0.216 +54 -0.236 +55 -0.254 +56 -0.271 +57 -0.287 +58 -0.301 +59 -0.313 +60 -0.325 +61 -0.334 +62 -0.343 +63 -0.350 +64 -0.357 +65 -0.362 +66 -0.366 +67 -0.369 +68 -0.371 +69 -0.373 +70 -0.374 +71 -0.374 +72 -0.374 +73 -0.374 +74 -0.373 +75 -0.372 +76 -0.371 +77 -0.371 +78 -0.370 +79 -0.370 +80 -0.371 +81 -0.372 +82 -0.374 +83 -0.377 +84 -0.382 +85 -0.387 +86 -0.394 +87 -0.403 +88 -0.414 +89 -0.427 +90 -0.442 +1 1.029 +2 1.021 +3 1.010 +4 0.998 +5 0.984 +6 0.968 +7 0.951 +8 0.932 +9 0.912 +10 0.890 +11 0.868 +12 0.844 +13 0.819 +14 0.794 +15 0.768 +16 0.741 +17 0.714 +18 0.686 +19 0.657 +20 0.629 +21 0.600 +22 0.571 +23 0.542 +24 0.513 +25 0.484 +26 0.455 +27 0.426 +28 0.398 +29 0.370 +30 0.342 +31 0.315 +32 0.288 +33 0.261 +34 0.236 +35 0.210 +36 0.186 +37 0.162 +38 0.139 +39 0.117 +40 0.095 +41 0.074 +42 0.054 +43 0.035 +44 0.017 +45 -0.000 +46 -0.016 +47 -0.032 +48 -0.046 +49 -0.060 +50 -0.072 +51 -0.084 +52 -0.095 +53 -0.105 +54 -0.113 +55 -0.121 +56 -0.128 +57 -0.134 +58 -0.139 +59 -0.144 +60 -0.147 +61 -0.150 +62 -0.152 +63 -0.153 +64 -0.153 +65 -0.153 +66 -0.152 +67 -0.150 +68 -0.148 +69 -0.145 +70 -0.142 +71 -0.138 +72 -0.134 +73 -0.130 +74 -0.125 +75 -0.120 +76 -0.115 +77 -0.110 +78 -0.105 +79 -0.100 +80 -0.095 +81 -0.091 +82 -0.086 +83 -0.082 +84 -0.079 +85 -0.076 +86 -0.073 +87 -0.072 +88 -0.071 +89 -0.071 +90 -0.072 +1 0.791 +2 0.773 +3 0.755 +4 0.736 +5 0.716 +6 0.696 +7 0.675 +8 0.654 +9 0.633 +10 0.612 +11 0.590 +12 0.568 +13 0.546 +14 0.524 +15 0.502 +16 0.481 +17 0.459 +18 0.437 +19 0.415 +20 0.394 +21 0.372 +22 0.351 +23 0.331 +24 0.310 +25 0.290 +26 0.270 +27 0.251 +28 0.232 +29 0.214 +30 0.196 +31 0.179 +32 0.162 +33 0.145 +34 0.130 +35 0.115 +36 0.100 +37 0.086 +38 0.073 +39 0.061 +40 0.049 +41 0.038 +42 0.027 +43 0.017 +44 0.008 +45 0.000 +46 -0.008 +47 -0.014 +48 -0.020 +49 -0.026 +50 -0.030 +51 -0.034 +52 -0.037 +53 -0.040 +54 -0.041 +55 -0.042 +56 -0.042 +57 -0.041 +58 -0.040 +59 -0.038 +60 -0.035 +61 -0.032 +62 -0.028 +63 -0.023 +64 -0.017 +65 -0.011 +66 -0.005 +67 0.003 +68 0.011 +69 0.019 +70 0.028 +71 0.037 +72 0.047 +73 0.058 +74 0.069 +75 0.080 +76 0.092 +77 0.104 +78 0.116 +79 0.129 +80 0.141 +81 0.154 +82 0.168 +83 0.181 +84 0.194 +85 0.208 +86 0.222 +87 0.235 +88 0.249 +89 0.262 +90 0.275 +1 -0.023 +2 -0.050 +3 -0.075 +4 -0.097 +5 -0.118 +6 -0.136 +7 -0.153 +8 -0.168 +9 -0.181 +10 -0.192 +11 -0.201 +12 -0.209 +13 -0.216 +14 -0.221 +15 -0.225 +16 -0.227 +17 -0.229 +18 -0.229 +19 -0.228 +20 -0.226 +21 -0.224 +22 -0.220 +23 -0.216 +24 -0.210 +25 -0.205 +26 -0.198 +27 -0.191 +28 -0.183 +29 -0.175 +30 -0.166 +31 -0.157 +32 -0.147 +33 -0.137 +34 -0.127 +35 -0.116 +36 -0.106 +37 -0.094 +38 -0.083 +39 -0.072 +40 -0.060 +41 -0.048 +42 -0.036 +43 -0.024 +44 -0.012 +45 0.000 +46 0.012 +47 0.025 +48 0.037 +49 0.049 +50 0.062 +51 0.074 +52 0.087 +53 0.099 +54 0.112 +55 0.124 +56 0.137 +57 0.150 +58 0.162 +59 0.175 +60 0.188 +61 0.201 +62 0.214 +63 0.228 +64 0.241 +65 0.255 +66 0.269 +67 0.283 +68 0.298 +69 0.313 +70 0.328 +71 0.344 +72 0.360 +73 0.376 +74 0.393 +75 0.411 +76 0.429 +77 0.448 +78 0.468 +79 0.488 +80 0.509 +81 0.531 +82 0.554 +83 0.578 +84 0.603 +85 0.629 +86 0.657 +87 0.685 +88 0.715 +89 0.746 +90 0.779 +1 -0.437 +2 -0.482 +3 -0.521 +4 -0.556 +5 -0.587 +6 -0.613 +7 -0.636 +8 -0.654 +9 -0.669 +10 -0.680 +11 -0.689 +12 -0.693 +13 -0.695 +14 -0.695 +15 -0.691 +16 -0.686 +17 -0.677 +18 -0.667 +19 -0.655 +20 -0.641 +21 -0.625 +22 -0.607 +23 -0.588 +24 -0.568 +25 -0.546 +26 -0.524 +27 -0.500 +28 -0.475 +29 -0.450 +30 -0.424 +31 -0.397 +32 -0.370 +33 -0.342 +34 -0.314 +35 -0.286 +36 -0.257 +37 -0.229 +38 -0.200 +39 -0.171 +40 -0.142 +41 -0.114 +42 -0.085 +43 -0.056 +44 -0.028 +45 0.000 +46 0.028 +47 0.055 +48 0.083 +49 0.110 +50 0.136 +51 0.163 +52 0.189 +53 0.215 +54 0.240 +55 0.266 +56 0.291 +57 0.315 +58 0.340 +59 0.364 +60 0.388 +61 0.412 +62 0.436 +63 0.460 +64 0.484 +65 0.509 +66 0.533 +67 0.557 +68 0.582 +69 0.607 +70 0.633 +71 0.659 +72 0.686 +73 0.713 +74 0.742 +75 0.771 +76 0.801 +77 0.832 +78 0.865 +79 0.899 +80 0.934 +81 0.971 +82 1.010 +83 1.051 +84 1.093 +85 1.138 +86 1.185 +87 1.235 +88 1.287 +89 1.342 +90 1.400 +1 -1.264 +2 -1.320 +3 -1.367 +4 -1.407 +5 -1.440 +6 -1.466 +7 -1.485 +8 -1.498 +9 -1.505 +10 -1.507 +11 -1.503 +12 -1.495 +13 -1.481 +14 -1.464 +15 -1.442 +16 -1.417 +17 -1.388 +18 -1.356 +19 -1.321 +20 -1.283 +21 -1.243 +22 -1.200 +23 -1.155 +24 -1.109 +25 -1.060 +26 -1.011 +27 -0.960 +28 -0.908 +29 -0.855 +30 -0.801 +31 -0.747 +32 -0.692 +33 -0.637 +34 -0.582 +35 -0.527 +36 -0.472 +37 -0.418 +38 -0.363 +39 -0.309 +40 -0.256 +41 -0.203 +42 -0.151 +43 -0.100 +44 -0.050 +45 0.000 +46 0.049 +47 0.096 +48 0.143 +49 0.189 +50 0.233 +51 0.277 +52 0.320 +53 0.361 +54 0.402 +55 0.441 +56 0.480 +57 0.518 +58 0.555 +59 0.591 +60 0.626 +61 0.661 +62 0.695 +63 0.728 +64 0.761 +65 0.794 +66 0.827 +67 0.859 +68 0.891 +69 0.924 +70 0.957 +71 0.990 +72 1.024 +73 1.059 +74 1.095 +75 1.131 +76 1.169 +77 1.209 +78 1.250 +79 1.293 +80 1.338 +81 1.386 +82 1.436 +83 1.489 +84 1.545 +85 1.604 +86 1.667 +87 1.733 +88 1.804 +89 1.879 +90 1.959 +1 -1.703 +2 -1.781 +3 -1.848 +4 -1.905 +5 -1.952 +6 -1.989 +7 -2.017 +8 -2.037 +9 -2.048 +10 -2.052 +11 -2.049 +12 -2.038 +13 -2.021 +14 -1.999 +15 -1.970 +16 -1.936 +17 -1.898 +18 -1.855 +19 -1.807 +20 -1.756 +21 -1.702 +22 -1.644 +23 -1.583 +24 -1.520 +25 -1.454 +26 -1.386 +27 -1.317 +28 -1.246 +29 -1.173 +30 -1.100 +31 -1.026 +32 -0.951 +33 -0.876 +34 -0.800 +35 -0.725 +36 -0.650 +37 -0.575 +38 -0.500 +39 -0.426 +40 -0.353 +41 -0.280 +42 -0.209 +43 -0.138 +44 -0.068 +45 0.000 +46 0.067 +47 0.133 +48 0.198 +49 0.261 +50 0.323 +51 0.383 +52 0.442 +53 0.500 +54 0.556 +55 0.611 +56 0.665 +57 0.717 +58 0.769 +59 0.819 +60 0.868 +61 0.917 +62 0.964 +63 1.011 +64 1.058 +65 1.104 +66 1.149 +67 1.195 +68 1.241 +69 1.287 +70 1.333 +71 1.380 +72 1.428 +73 1.477 +74 1.527 +75 1.579 +76 1.633 +77 1.689 +78 1.747 +79 1.807 +80 1.871 +81 1.938 +82 2.009 +83 2.083 +84 2.162 +85 2.245 +86 2.333 +87 2.427 +88 2.526 +89 2.631 +90 2.743 +1 -2.477 +2 -2.573 +3 -2.654 +4 -2.722 +5 -2.776 +6 -2.818 +7 -2.847 +8 -2.866 +9 -2.874 +10 -2.871 +11 -2.859 +12 -2.839 +13 -2.809 +14 -2.772 +15 -2.728 +16 -2.677 +17 -2.619 +18 -2.556 +19 -2.487 +20 -2.414 +21 -2.336 +22 -2.253 +23 -2.167 +24 -2.078 +25 -1.986 +26 -1.892 +27 -1.795 +28 -1.696 +29 -1.596 +30 -1.495 +31 -1.393 +32 -1.290 +33 -1.187 +34 -1.084 +35 -0.981 +36 -0.878 +37 -0.776 +38 -0.674 +39 -0.574 +40 -0.475 +41 -0.377 +42 -0.280 +43 -0.185 +44 -0.092 +45 0.000 +46 0.090 +47 0.178 +48 0.264 +49 0.347 +50 0.429 +51 0.509 +52 0.587 +53 0.663 +54 0.736 +55 0.808 +56 0.878 +57 0.946 +58 1.013 +59 1.077 +60 1.141 +61 1.202 +62 1.263 +63 1.322 +64 1.381 +65 1.439 +66 1.496 +67 1.553 +68 1.610 +69 1.667 +70 1.724 +71 1.782 +72 1.841 +73 1.901 +74 1.963 +75 2.027 +76 2.093 +77 2.161 +78 2.233 +79 2.308 +80 2.386 +81 2.469 +82 2.557 +83 2.649 +84 2.747 +85 2.851 +86 2.961 +87 3.078 +88 3.202 +89 3.335 +90 3.476 +1 -2.708 +2 -2.814 +3 -2.905 +4 -2.980 +5 -3.041 +6 -3.088 +7 -3.122 +8 -3.143 +9 -3.152 +10 -3.150 +11 -3.138 +12 -3.116 +13 -3.085 +14 -3.045 +15 -2.997 +16 -2.941 +17 -2.878 +18 -2.809 +19 -2.734 +20 -2.653 +21 -2.568 +22 -2.477 +23 -2.383 +24 -2.285 +25 -2.184 +26 -2.081 +27 -1.974 +28 -1.866 +29 -1.756 +30 -1.645 +31 -1.533 +32 -1.420 +33 -1.306 +34 -1.193 +35 -1.079 +36 -0.966 +37 -0.854 +38 -0.743 +39 -0.632 +40 -0.523 +41 -0.415 +42 -0.308 +43 -0.204 +44 -0.101 +45 0.000 +46 0.099 +47 0.196 +48 0.290 +49 0.383 +50 0.473 +51 0.561 +52 0.647 +53 0.731 +54 0.812 +55 0.891 +56 0.969 +57 1.044 +58 1.117 +59 1.189 +60 1.259 +61 1.327 +62 1.394 +63 1.460 +64 1.525 +65 1.589 +66 1.652 +67 1.715 +68 1.778 +69 1.841 +70 1.905 +71 1.969 +72 2.035 +73 2.102 +74 2.170 +75 2.241 +76 2.315 +77 2.391 +78 2.470 +79 2.553 +80 2.640 +81 2.732 +82 2.829 +83 2.932 +84 3.040 +85 3.155 +86 3.278 +87 3.408 +88 3.546 +89 3.693 +90 3.849 +1 -2.890 +2 -3.000 +3 -3.093 +4 -3.170 +5 -3.232 +6 -3.279 +7 -3.313 +8 -3.333 +9 -3.341 +10 -3.338 +11 -3.323 +12 -3.299 +13 -3.264 +14 -3.221 +15 -3.168 +16 -3.109 +17 -3.041 +18 -2.967 +19 -2.887 +20 -2.801 +21 -2.710 +22 -2.614 +23 -2.514 +24 -2.411 +25 -2.304 +26 -2.194 +27 -2.081 +28 -1.967 +29 -1.851 +30 -1.733 +31 -1.614 +32 -1.495 +33 -1.375 +34 -1.256 +35 -1.136 +36 -1.017 +37 -0.899 +38 -0.781 +39 -0.665 +40 -0.550 +41 -0.436 +42 -0.324 +43 -0.214 +44 -0.106 +45 0.000 +46 0.104 +47 0.206 +48 0.305 +49 0.402 +50 0.497 +51 0.589 +52 0.679 +53 0.766 +54 0.851 +55 0.934 +56 1.015 +57 1.093 +58 1.170 +59 1.244 +60 1.317 +61 1.388 +62 1.458 +63 1.526 +64 1.594 +65 1.660 +66 1.726 +67 1.791 +68 1.857 +69 1.922 +70 1.988 +71 2.055 +72 2.122 +73 2.192 +74 2.263 +75 2.336 +76 2.411 +77 2.490 +78 2.572 +79 2.658 +80 2.749 +81 2.844 +82 2.944 +83 3.050 +84 3.163 +85 3.282 +86 3.409 +87 3.544 +88 3.688 +89 3.840 +90 4.003 +1 -2.706 +2 -2.825 +3 -2.928 +4 -3.014 +5 -3.084 +6 -3.140 +7 -3.181 +8 -3.209 +9 -3.225 +10 -3.229 +11 -3.221 +12 -3.203 +13 -3.175 +14 -3.138 +15 -3.092 +16 -3.037 +17 -2.976 +18 -2.907 +19 -2.832 +20 -2.751 +21 -2.664 +22 -2.573 +23 -2.477 +24 -2.377 +25 -2.274 +26 -2.167 +27 -2.058 +28 -1.946 +29 -1.833 +30 -1.718 +31 -1.602 +32 -1.485 +33 -1.367 +34 -1.249 +35 -1.131 +36 -1.013 +37 -0.896 +38 -0.779 +39 -0.664 +40 -0.549 +41 -0.436 +42 -0.325 +43 -0.215 +44 -0.106 +45 0.000 +46 0.104 +47 0.207 +48 0.307 +49 0.405 +50 0.501 +51 0.595 +52 0.686 +53 0.776 +54 0.863 +55 0.948 +56 1.031 +57 1.112 +58 1.191 +59 1.269 +60 1.345 +61 1.419 +62 1.493 +63 1.565 +64 1.636 +65 1.707 +66 1.777 +67 1.847 +68 1.917 +69 1.987 +70 2.058 +71 2.130 +72 2.203 +73 2.278 +74 2.355 +75 2.434 +76 2.516 +77 2.602 +78 2.691 +79 2.784 +80 2.881 +81 2.984 +82 3.092 +83 3.206 +84 3.326 +85 3.454 +86 3.590 +87 3.733 +88 3.886 +89 4.048 +90 4.220 +1 -2.780 +2 -2.900 +3 -3.002 +4 -3.089 +5 -3.159 +6 -3.214 +7 -3.255 +8 -3.283 +9 -3.298 +10 -3.301 +11 -3.292 +12 -3.273 +13 -3.243 +14 -3.204 +15 -3.156 +16 -3.100 +17 -3.037 +18 -2.966 +19 -2.889 +20 -2.806 +21 -2.717 +22 -2.623 +23 -2.525 +24 -2.423 +25 -2.317 +26 -2.209 +27 -2.097 +28 -1.983 +29 -1.867 +30 -1.750 +31 -1.631 +32 -1.512 +33 -1.392 +34 -1.272 +35 -1.151 +36 -1.031 +37 -0.912 +38 -0.793 +39 -0.676 +40 -0.559 +41 -0.444 +42 -0.330 +43 -0.218 +44 -0.108 +45 0.000 +46 0.106 +47 0.210 +48 0.312 +49 0.412 +50 0.509 +51 0.604 +52 0.697 +53 0.788 +54 0.876 +55 0.963 +56 1.047 +57 1.129 +58 1.209 +59 1.288 +60 1.364 +61 1.440 +62 1.514 +63 1.587 +64 1.659 +65 1.730 +66 1.801 +67 1.871 +68 1.942 +69 2.012 +70 2.084 +71 2.156 +72 2.230 +73 2.306 +74 2.383 +75 2.463 +76 2.546 +77 2.631 +78 2.721 +79 2.815 +80 2.913 +81 3.016 +82 3.125 +83 3.240 +84 3.362 +85 3.491 +86 3.628 +87 3.773 +88 3.927 +89 4.090 +90 4.264 +1 -2.382 +2 -2.509 +3 -2.619 +4 -2.713 +5 -2.792 +6 -2.856 +7 -2.906 +8 -2.943 +9 -2.968 +10 -2.980 +11 -2.982 +12 -2.972 +13 -2.953 +14 -2.925 +15 -2.888 +16 -2.843 +17 -2.790 +18 -2.730 +19 -2.664 +20 -2.591 +21 -2.514 +22 -2.431 +23 -2.343 +24 -2.252 +25 -2.157 +26 -2.058 +27 -1.957 +28 -1.853 +29 -1.747 +30 -1.639 +31 -1.530 +32 -1.420 +33 -1.308 +34 -1.197 +35 -1.085 +36 -0.973 +37 -0.861 +38 -0.750 +39 -0.640 +40 -0.530 +41 -0.421 +42 -0.314 +43 -0.208 +44 -0.103 +45 0.000 +46 0.101 +47 0.201 +48 0.299 +49 0.395 +50 0.489 +51 0.581 +52 0.672 +53 0.760 +54 0.847 +55 0.931 +56 1.014 +57 1.096 +58 1.176 +59 1.254 +60 1.331 +61 1.407 +62 1.482 +63 1.556 +64 1.630 +65 1.703 +66 1.776 +67 1.849 +68 1.922 +69 1.996 +70 2.071 +71 2.147 +72 2.224 +73 2.304 +74 2.385 +75 2.469 +76 2.556 +77 2.647 +78 2.741 +79 2.839 +80 2.942 +81 3.050 +82 3.164 +83 3.284 +84 3.411 +85 3.544 +86 3.686 +87 3.836 +88 3.994 +89 4.162 +90 4.340 +1 -2.244 +2 -2.363 +3 -2.466 +4 -2.554 +5 -2.628 +6 -2.688 +7 -2.735 +8 -2.769 +9 -2.792 +10 -2.804 +11 -2.805 +12 -2.796 +13 -2.778 +14 -2.752 +15 -2.717 +16 -2.674 +17 -2.624 +18 -2.568 +19 -2.505 +20 -2.437 +21 -2.364 +22 -2.286 +23 -2.204 +24 -2.117 +25 -2.028 +26 -1.935 +27 -1.840 +28 -1.742 +29 -1.642 +30 -1.541 +31 -1.438 +32 -1.335 +33 -1.230 +34 -1.125 +35 -1.020 +36 -0.915 +37 -0.810 +38 -0.705 +39 -0.601 +40 -0.498 +41 -0.396 +42 -0.295 +43 -0.195 +44 -0.097 +45 0.000 +46 0.095 +47 0.189 +48 0.281 +49 0.371 +50 0.460 +51 0.546 +52 0.631 +53 0.714 +54 0.796 +55 0.875 +56 0.953 +57 1.030 +58 1.105 +59 1.179 +60 1.251 +61 1.322 +62 1.393 +63 1.463 +64 1.532 +65 1.600 +66 1.669 +67 1.737 +68 1.806 +69 1.876 +70 1.946 +71 2.017 +72 2.090 +73 2.165 +74 2.241 +75 2.320 +76 2.402 +77 2.487 +78 2.576 +79 2.668 +80 2.765 +81 2.867 +82 2.974 +83 3.086 +84 3.205 +85 3.331 +86 3.464 +87 3.605 +88 3.754 +89 3.912 +90 4.079 +1 -1.761 +2 -1.885 +3 -1.994 +4 -2.088 +5 -2.169 +6 -2.237 +7 -2.292 +8 -2.336 +9 -2.369 +10 -2.391 +11 -2.402 +12 -2.405 +13 -2.399 +14 -2.384 +15 -2.361 +16 -2.331 +17 -2.294 +18 -2.251 +19 -2.202 +20 -2.147 +21 -2.087 +22 -2.023 +23 -1.954 +24 -1.881 +25 -1.805 +26 -1.726 +27 -1.644 +28 -1.559 +29 -1.473 +30 -1.384 +31 -1.294 +32 -1.203 +33 -1.110 +34 -1.017 +35 -0.923 +36 -0.830 +37 -0.736 +38 -0.642 +39 -0.548 +40 -0.455 +41 -0.362 +42 -0.270 +43 -0.179 +44 -0.089 +45 0.000 +46 0.088 +47 0.175 +48 0.260 +49 0.344 +50 0.427 +51 0.508 +52 0.588 +53 0.667 +54 0.745 +55 0.821 +56 0.896 +57 0.970 +58 1.043 +59 1.115 +60 1.186 +61 1.256 +62 1.326 +63 1.395 +64 1.465 +65 1.534 +66 1.603 +67 1.673 +68 1.743 +69 1.814 +70 1.886 +71 1.959 +72 2.035 +73 2.111 +74 2.191 +75 2.272 +76 2.357 +77 2.445 +78 2.536 +79 2.632 +80 2.731 +81 2.836 +82 2.945 +83 3.061 +84 3.182 +85 3.310 +86 3.445 +87 3.587 +88 3.737 +89 3.896 +90 4.064 +1 -1.610 +2 -1.724 +3 -1.823 +4 -1.910 +5 -1.984 +6 -2.046 +7 -2.097 +8 -2.137 +9 -2.167 +10 -2.187 +11 -2.198 +12 -2.201 +13 -2.195 +14 -2.181 +15 -2.161 +16 -2.133 +17 -2.100 +18 -2.060 +19 -2.015 +20 -1.965 +21 -1.910 +22 -1.851 +23 -1.788 +24 -1.722 +25 -1.652 +26 -1.580 +27 -1.505 +28 -1.427 +29 -1.348 +30 -1.267 +31 -1.185 +32 -1.101 +33 -1.016 +34 -0.931 +35 -0.846 +36 -0.760 +37 -0.673 +38 -0.587 +39 -0.502 +40 -0.416 +41 -0.332 +42 -0.247 +43 -0.164 +44 -0.082 +45 0.000 +46 0.080 +47 0.160 +48 0.238 +49 0.315 +50 0.391 +51 0.466 +52 0.539 +53 0.611 +54 0.682 +55 0.752 +56 0.821 +57 0.889 +58 0.955 +59 1.021 +60 1.086 +61 1.151 +62 1.215 +63 1.279 +64 1.342 +65 1.406 +66 1.469 +67 1.533 +68 1.598 +69 1.663 +70 1.729 +71 1.796 +72 1.865 +73 1.936 +74 2.009 +75 2.084 +76 2.161 +77 2.242 +78 2.326 +79 2.413 +80 2.505 +81 2.601 +82 2.701 +83 2.807 +84 2.919 +85 3.036 +86 3.160 +87 3.290 +88 3.428 +89 3.574 +90 3.728 +1 -1.133 +2 -1.249 +3 -1.354 +4 -1.446 +5 -1.526 +6 -1.595 +7 -1.654 +8 -1.703 +9 -1.742 +10 -1.772 +11 -1.793 +12 -1.807 +13 -1.812 +14 -1.810 +15 -1.802 +16 -1.787 +17 -1.766 +18 -1.739 +19 -1.707 +20 -1.670 +21 -1.629 +22 -1.584 +23 -1.534 +24 -1.481 +25 -1.425 +26 -1.366 +27 -1.304 +28 -1.240 +29 -1.174 +30 -1.106 +31 -1.036 +32 -0.965 +33 -0.893 +34 -0.820 +35 -0.746 +36 -0.672 +37 -0.597 +38 -0.522 +39 -0.446 +40 -0.371 +41 -0.296 +42 -0.222 +43 -0.147 +44 -0.073 +45 0.000 +46 0.073 +47 0.145 +48 0.216 +49 0.287 +50 0.356 +51 0.425 +52 0.494 +53 0.561 +54 0.628 +55 0.694 +56 0.759 +57 0.824 +58 0.888 +59 0.952 +60 1.015 +61 1.078 +62 1.141 +63 1.204 +64 1.267 +65 1.331 +66 1.394 +67 1.459 +68 1.524 +69 1.591 +70 1.658 +71 1.727 +72 1.798 +73 1.870 +74 1.945 +75 2.022 +76 2.102 +77 2.184 +78 2.271 +79 2.360 +80 2.454 +81 2.552 +82 2.655 +83 2.762 +84 2.875 +85 2.994 +86 3.118 +87 3.250 +88 3.388 +89 3.534 +90 3.687 +1 -1.128 +2 -1.237 +3 -1.335 +4 -1.421 +5 -1.496 +6 -1.560 +7 -1.615 +8 -1.660 +9 -1.695 +10 -1.722 +11 -1.741 +12 -1.752 +13 -1.756 +14 -1.753 +15 -1.744 +16 -1.728 +17 -1.707 +18 -1.680 +19 -1.648 +20 -1.612 +21 -1.571 +22 -1.527 +23 -1.478 +24 -1.427 +25 -1.372 +26 -1.315 +27 -1.255 +28 -1.193 +29 -1.129 +30 -1.063 +31 -0.996 +32 -0.927 +33 -0.858 +34 -0.787 +35 -0.716 +36 -0.644 +37 -0.572 +38 -0.500 +39 -0.428 +40 -0.356 +41 -0.284 +42 -0.212 +43 -0.141 +44 -0.070 +45 0.000 +46 0.070 +47 0.138 +48 0.207 +49 0.274 +50 0.341 +51 0.406 +52 0.471 +53 0.536 +54 0.599 +55 0.662 +56 0.724 +57 0.785 +58 0.846 +59 0.907 +60 0.967 +61 1.027 +62 1.086 +63 1.146 +64 1.205 +65 1.265 +66 1.326 +67 1.386 +68 1.448 +69 1.510 +70 1.574 +71 1.639 +72 1.705 +73 1.774 +74 1.844 +75 1.917 +76 1.992 +77 2.070 +78 2.151 +79 2.235 +80 2.324 +81 2.416 +82 2.513 +83 2.614 +84 2.720 +85 2.832 +86 2.950 +87 3.074 +88 3.204 +89 3.342 +90 3.487 +1 -0.742 +2 -0.858 +3 -0.962 +4 -1.055 +5 -1.137 +6 -1.209 +7 -1.272 +8 -1.325 +9 -1.370 +10 -1.406 +11 -1.434 +12 -1.455 +13 -1.469 +14 -1.476 +15 -1.476 +16 -1.471 +17 -1.460 +18 -1.444 +19 -1.423 +20 -1.397 +21 -1.367 +22 -1.333 +23 -1.295 +24 -1.254 +25 -1.210 +26 -1.162 +27 -1.113 +28 -1.060 +29 -1.006 +30 -0.950 +31 -0.892 +32 -0.833 +33 -0.772 +34 -0.710 +35 -0.648 +36 -0.584 +37 -0.520 +38 -0.456 +39 -0.391 +40 -0.326 +41 -0.260 +42 -0.195 +43 -0.130 +44 -0.065 +45 0.000 +46 0.065 +47 0.129 +48 0.192 +49 0.256 +50 0.319 +51 0.381 +52 0.443 +53 0.505 +54 0.566 +55 0.627 +56 0.688 +57 0.748 +58 0.808 +59 0.868 +60 0.928 +61 0.988 +62 1.048 +63 1.108 +64 1.169 +65 1.230 +66 1.292 +67 1.354 +68 1.418 +69 1.483 +70 1.549 +71 1.617 +72 1.686 +73 1.757 +74 1.831 +75 1.907 +76 1.986 +77 2.067 +78 2.152 +79 2.240 +80 2.332 +81 2.428 +82 2.529 +83 2.634 +84 2.744 +85 2.860 +86 2.981 +87 3.108 +88 3.242 +89 3.382 +90 3.530 +1 -0.868 +2 -0.976 +3 -1.073 +4 -1.159 +5 -1.235 +6 -1.301 +7 -1.357 +8 -1.405 +9 -1.444 +10 -1.475 +11 -1.498 +12 -1.514 +13 -1.523 +14 -1.526 +15 -1.522 +16 -1.513 +17 -1.498 +18 -1.478 +19 -1.453 +20 -1.424 +21 -1.391 +22 -1.354 +23 -1.314 +24 -1.270 +25 -1.224 +26 -1.174 +27 -1.123 +28 -1.069 +29 -1.013 +30 -0.955 +31 -0.896 +32 -0.835 +33 -0.774 +34 -0.711 +35 -0.647 +36 -0.583 +37 -0.519 +38 -0.454 +39 -0.389 +40 -0.324 +41 -0.259 +42 -0.194 +43 -0.129 +44 -0.064 +45 0.000 +46 0.064 +47 0.127 +48 0.190 +49 0.252 +50 0.314 +51 0.375 +52 0.435 +53 0.495 +54 0.555 +55 0.614 +56 0.672 +57 0.730 +58 0.788 +59 0.846 +60 0.903 +61 0.960 +62 1.017 +63 1.075 +64 1.132 +65 1.190 +66 1.249 +67 1.308 +68 1.368 +69 1.429 +70 1.491 +71 1.555 +72 1.620 +73 1.687 +74 1.756 +75 1.827 +76 1.901 +77 1.977 +78 2.057 +79 2.140 +80 2.226 +81 2.316 +82 2.411 +83 2.510 +84 2.614 +85 2.723 +86 2.837 +87 2.958 +88 3.084 +89 3.218 +90 3.358 +1 -0.282 +2 -0.256 +3 -0.231 +4 -0.208 +5 -0.186 +6 -0.165 +7 -0.146 +8 -0.128 +9 -0.111 +10 -0.095 +11 -0.080 +12 -0.066 +13 -0.053 +14 -0.041 +15 -0.030 +16 -0.020 +17 -0.011 +18 -0.002 +19 0.005 +20 0.012 +21 0.018 +22 0.024 +23 0.028 +24 0.032 +25 0.036 +26 0.039 +27 0.041 +28 0.042 +29 0.043 +30 0.044 +31 0.044 +32 0.044 +33 0.043 +34 0.041 +35 0.039 +36 0.037 +37 0.035 +38 0.032 +39 0.028 +40 0.024 +41 0.020 +42 0.016 +43 0.011 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.019 +49 -0.025 +50 -0.032 +51 -0.040 +52 -0.048 +53 -0.056 +54 -0.064 +55 -0.073 +56 -0.082 +57 -0.091 +58 -0.101 +59 -0.111 +60 -0.121 +61 -0.132 +62 -0.143 +63 -0.154 +64 -0.166 +65 -0.178 +66 -0.190 +67 -0.203 +68 -0.217 +69 -0.231 +70 -0.245 +71 -0.260 +72 -0.275 +73 -0.291 +74 -0.307 +75 -0.324 +76 -0.342 +77 -0.360 +78 -0.378 +79 -0.398 +80 -0.418 +81 -0.439 +82 -0.460 +83 -0.482 +84 -0.505 +85 -0.529 +86 -0.554 +87 -0.580 +88 -0.606 +89 -0.634 +90 -0.662 +1 0.088 +2 0.133 +3 0.174 +4 0.211 +5 0.245 +6 0.275 +7 0.302 +8 0.325 +9 0.346 +10 0.363 +11 0.378 +12 0.391 +13 0.400 +14 0.408 +15 0.413 +16 0.416 +17 0.417 +18 0.416 +19 0.413 +20 0.409 +21 0.403 +22 0.395 +23 0.387 +24 0.376 +25 0.365 +26 0.353 +27 0.339 +28 0.325 +29 0.310 +30 0.294 +31 0.277 +32 0.260 +33 0.242 +34 0.224 +35 0.205 +36 0.185 +37 0.166 +38 0.146 +39 0.125 +40 0.105 +41 0.084 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.043 +48 -0.064 +49 -0.085 +50 -0.107 +51 -0.128 +52 -0.149 +53 -0.171 +54 -0.192 +55 -0.214 +56 -0.235 +57 -0.257 +58 -0.279 +59 -0.300 +60 -0.322 +61 -0.344 +62 -0.367 +63 -0.389 +64 -0.412 +65 -0.435 +66 -0.458 +67 -0.482 +68 -0.507 +69 -0.532 +70 -0.557 +71 -0.583 +72 -0.610 +73 -0.638 +74 -0.666 +75 -0.695 +76 -0.726 +77 -0.757 +78 -0.790 +79 -0.824 +80 -0.860 +81 -0.896 +82 -0.935 +83 -0.975 +84 -1.017 +85 -1.061 +86 -1.106 +87 -1.154 +88 -1.204 +89 -1.257 +90 -1.312 +1 -1.622 +2 -1.667 +3 -1.704 +4 -1.734 +5 -1.756 +6 -1.771 +7 -1.780 +8 -1.782 +9 -1.779 +10 -1.770 +11 -1.756 +12 -1.737 +13 -1.713 +14 -1.685 +15 -1.653 +16 -1.618 +17 -1.579 +18 -1.537 +19 -1.492 +20 -1.445 +21 -1.395 +22 -1.343 +23 -1.289 +24 -1.234 +25 -1.177 +26 -1.119 +27 -1.060 +28 -1.000 +29 -0.939 +30 -0.878 +31 -0.817 +32 -0.755 +33 -0.694 +34 -0.632 +35 -0.571 +36 -0.510 +37 -0.450 +38 -0.391 +39 -0.332 +40 -0.274 +41 -0.217 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.051 +47 0.101 +48 0.150 +49 0.197 +50 0.243 +51 0.288 +52 0.331 +53 0.373 +54 0.413 +55 0.452 +56 0.490 +57 0.527 +58 0.562 +59 0.597 +60 0.630 +61 0.662 +62 0.693 +63 0.724 +64 0.754 +65 0.783 +66 0.811 +67 0.839 +68 0.867 +69 0.895 +70 0.923 +71 0.951 +72 0.979 +73 1.008 +74 1.038 +75 1.068 +76 1.099 +77 1.132 +78 1.166 +79 1.202 +80 1.240 +81 1.279 +82 1.322 +83 1.366 +84 1.414 +85 1.465 +86 1.520 +87 1.578 +88 1.640 +89 1.706 +90 1.777 +1 -1.434 +2 -1.465 +3 -1.490 +4 -1.508 +5 -1.521 +6 -1.528 +7 -1.530 +8 -1.528 +9 -1.520 +10 -1.509 +11 -1.493 +12 -1.473 +13 -1.450 +14 -1.423 +15 -1.394 +16 -1.361 +17 -1.326 +18 -1.289 +19 -1.249 +20 -1.208 +21 -1.164 +22 -1.119 +23 -1.073 +24 -1.025 +25 -0.977 +26 -0.927 +27 -0.877 +28 -0.826 +29 -0.775 +30 -0.724 +31 -0.673 +32 -0.621 +33 -0.570 +34 -0.519 +35 -0.468 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.271 +40 -0.223 +41 -0.176 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.041 +47 0.082 +48 0.121 +49 0.158 +50 0.195 +51 0.230 +52 0.264 +53 0.297 +54 0.329 +55 0.359 +56 0.389 +57 0.417 +58 0.444 +59 0.470 +60 0.495 +61 0.519 +62 0.543 +63 0.565 +64 0.587 +65 0.608 +66 0.629 +67 0.649 +68 0.669 +69 0.688 +70 0.708 +71 0.728 +72 0.747 +73 0.767 +74 0.788 +75 0.809 +76 0.831 +77 0.854 +78 0.878 +79 0.903 +80 0.929 +81 0.957 +82 0.988 +83 1.020 +84 1.054 +85 1.091 +86 1.130 +87 1.173 +88 1.218 +89 1.267 +90 1.320 +1 -1.437 +2 -1.468 +3 -1.493 +4 -1.511 +5 -1.524 +6 -1.531 +7 -1.533 +8 -1.530 +9 -1.523 +10 -1.511 +11 -1.495 +12 -1.475 +13 -1.452 +14 -1.426 +15 -1.396 +16 -1.363 +17 -1.328 +18 -1.291 +19 -1.251 +20 -1.209 +21 -1.166 +22 -1.121 +23 -1.074 +24 -1.027 +25 -0.978 +26 -0.929 +27 -0.878 +28 -0.828 +29 -0.776 +30 -0.725 +31 -0.673 +32 -0.622 +33 -0.571 +34 -0.519 +35 -0.469 +36 -0.418 +37 -0.368 +38 -0.319 +39 -0.271 +40 -0.223 +41 -0.177 +42 -0.131 +43 -0.086 +44 -0.043 +45 0.000 +46 0.041 +47 0.082 +48 0.121 +49 0.159 +50 0.195 +51 0.231 +52 0.265 +53 0.298 +54 0.330 +55 0.360 +56 0.390 +57 0.418 +58 0.445 +59 0.471 +60 0.496 +61 0.521 +62 0.544 +63 0.567 +64 0.588 +65 0.610 +66 0.630 +67 0.651 +68 0.671 +69 0.690 +70 0.710 +71 0.730 +72 0.750 +73 0.770 +74 0.790 +75 0.811 +76 0.833 +77 0.856 +78 0.880 +79 0.905 +80 0.932 +81 0.960 +82 0.990 +83 1.022 +84 1.057 +85 1.094 +86 1.133 +87 1.176 +88 1.221 +89 1.270 +90 1.323 +1 -1.624 +2 -1.670 +3 -1.707 +4 -1.737 +5 -1.759 +6 -1.774 +7 -1.783 +8 -1.786 +9 -1.782 +10 -1.773 +11 -1.759 +12 -1.740 +13 -1.717 +14 -1.689 +15 -1.657 +16 -1.621 +17 -1.583 +18 -1.540 +19 -1.496 +20 -1.448 +21 -1.398 +22 -1.346 +23 -1.292 +24 -1.237 +25 -1.180 +26 -1.121 +27 -1.062 +28 -1.002 +29 -0.941 +30 -0.880 +31 -0.818 +32 -0.757 +33 -0.695 +34 -0.634 +35 -0.572 +36 -0.512 +37 -0.451 +38 -0.392 +39 -0.333 +40 -0.275 +41 -0.218 +42 -0.161 +43 -0.106 +44 -0.053 +45 0.000 +46 0.051 +47 0.101 +48 0.150 +49 0.198 +50 0.244 +51 0.288 +52 0.332 +53 0.374 +54 0.414 +55 0.453 +56 0.491 +57 0.528 +58 0.564 +59 0.598 +60 0.631 +61 0.663 +62 0.695 +63 0.725 +64 0.755 +65 0.784 +66 0.813 +67 0.841 +68 0.869 +69 0.897 +70 0.925 +71 0.953 +72 0.981 +73 1.010 +74 1.040 +75 1.070 +76 1.102 +77 1.135 +78 1.169 +79 1.205 +80 1.243 +81 1.283 +82 1.325 +83 1.370 +84 1.418 +85 1.470 +86 1.524 +87 1.583 +88 1.645 +89 1.712 +90 1.783 +1 0.083 +2 0.128 +3 0.169 +4 0.206 +5 0.240 +6 0.270 +7 0.297 +8 0.321 +9 0.341 +10 0.359 +11 0.374 +12 0.386 +13 0.396 +14 0.404 +15 0.409 +16 0.412 +17 0.413 +18 0.412 +19 0.410 +20 0.405 +21 0.400 +22 0.392 +23 0.384 +24 0.374 +25 0.363 +26 0.350 +27 0.337 +28 0.323 +29 0.308 +30 0.292 +31 0.275 +32 0.258 +33 0.240 +34 0.222 +35 0.203 +36 0.184 +37 0.165 +38 0.145 +39 0.125 +40 0.104 +41 0.084 +42 0.063 +43 0.042 +44 0.021 +45 -0.000 +46 -0.021 +47 -0.042 +48 -0.064 +49 -0.085 +50 -0.106 +51 -0.127 +52 -0.149 +53 -0.170 +54 -0.191 +55 -0.213 +56 -0.234 +57 -0.255 +58 -0.277 +59 -0.299 +60 -0.320 +61 -0.342 +62 -0.364 +63 -0.387 +64 -0.410 +65 -0.433 +66 -0.456 +67 -0.480 +68 -0.504 +69 -0.529 +70 -0.554 +71 -0.580 +72 -0.607 +73 -0.634 +74 -0.663 +75 -0.692 +76 -0.722 +77 -0.754 +78 -0.786 +79 -0.820 +80 -0.855 +81 -0.892 +82 -0.931 +83 -0.971 +84 -1.012 +85 -1.056 +86 -1.102 +87 -1.150 +88 -1.200 +89 -1.252 +90 -1.307 +1 -0.280 +2 -0.254 +3 -0.229 +4 -0.206 +5 -0.184 +6 -0.163 +7 -0.144 +8 -0.126 +9 -0.109 +10 -0.093 +11 -0.078 +12 -0.064 +13 -0.051 +14 -0.039 +15 -0.028 +16 -0.018 +17 -0.009 +18 -0.000 +19 0.007 +20 0.014 +21 0.020 +22 0.025 +23 0.030 +24 0.034 +25 0.037 +26 0.040 +27 0.042 +28 0.044 +29 0.045 +30 0.045 +31 0.045 +32 0.044 +33 0.043 +34 0.042 +35 0.040 +36 0.038 +37 0.035 +38 0.032 +39 0.028 +40 0.025 +41 0.020 +42 0.016 +43 0.011 +44 0.006 +45 -0.000 +46 -0.006 +47 -0.012 +48 -0.019 +49 -0.026 +50 -0.033 +51 -0.040 +52 -0.048 +53 -0.056 +54 -0.064 +55 -0.073 +56 -0.082 +57 -0.092 +58 -0.101 +59 -0.111 +60 -0.122 +61 -0.132 +62 -0.143 +63 -0.155 +64 -0.167 +65 -0.179 +66 -0.191 +67 -0.204 +68 -0.218 +69 -0.232 +70 -0.246 +71 -0.261 +72 -0.276 +73 -0.292 +74 -0.308 +75 -0.325 +76 -0.343 +77 -0.361 +78 -0.380 +79 -0.399 +80 -0.419 +81 -0.440 +82 -0.461 +83 -0.483 +84 -0.507 +85 -0.530 +86 -0.555 +87 -0.581 +88 -0.607 +89 -0.635 +90 -0.663 +1 -2.047 +2 -2.086 +3 -2.115 +4 -2.136 +5 -2.150 +6 -2.156 +7 -2.155 +8 -2.148 +9 -2.135 +10 -2.115 +11 -2.090 +12 -2.060 +13 -2.026 +14 -1.987 +15 -1.943 +16 -1.896 +17 -1.846 +18 -1.792 +19 -1.736 +20 -1.676 +21 -1.615 +22 -1.551 +23 -1.486 +24 -1.419 +25 -1.351 +26 -1.282 +27 -1.212 +28 -1.141 +29 -1.070 +30 -0.998 +31 -0.926 +32 -0.855 +33 -0.784 +34 -0.713 +35 -0.643 +36 -0.573 +37 -0.505 +38 -0.437 +39 -0.371 +40 -0.305 +41 -0.241 +42 -0.179 +43 -0.118 +44 -0.058 +45 0.000 +46 0.056 +47 0.111 +48 0.164 +49 0.215 +50 0.265 +51 0.312 +52 0.358 +53 0.402 +54 0.445 +55 0.485 +56 0.524 +57 0.562 +58 0.597 +59 0.632 +60 0.664 +61 0.696 +62 0.726 +63 0.755 +64 0.783 +65 0.810 +66 0.836 +67 0.861 +68 0.886 +69 0.911 +70 0.935 +71 0.959 +72 0.983 +73 1.008 +74 1.033 +75 1.059 +76 1.086 +77 1.113 +78 1.143 +79 1.173 +80 1.206 +81 1.241 +82 1.278 +83 1.318 +84 1.360 +85 1.406 +86 1.456 +87 1.509 +88 1.567 +89 1.629 +90 1.696 +1 -1.227 +2 -1.195 +3 -1.162 +4 -1.129 +5 -1.095 +6 -1.061 +7 -1.026 +8 -0.991 +9 -0.956 +10 -0.921 +11 -0.886 +12 -0.851 +13 -0.816 +14 -0.781 +15 -0.746 +16 -0.712 +17 -0.677 +18 -0.643 +19 -0.610 +20 -0.577 +21 -0.544 +22 -0.512 +23 -0.480 +24 -0.449 +25 -0.419 +26 -0.390 +27 -0.361 +28 -0.333 +29 -0.305 +30 -0.279 +31 -0.253 +32 -0.229 +33 -0.205 +34 -0.182 +35 -0.160 +36 -0.139 +37 -0.120 +38 -0.101 +39 -0.083 +40 -0.067 +41 -0.051 +42 -0.037 +43 -0.023 +44 -0.011 +45 -0.000 +46 0.010 +47 0.019 +48 0.026 +49 0.033 +50 0.038 +51 0.042 +52 0.045 +53 0.047 +54 0.047 +55 0.047 +56 0.045 +57 0.042 +58 0.038 +59 0.033 +60 0.027 +61 0.019 +62 0.011 +63 0.002 +64 -0.009 +65 -0.020 +66 -0.033 +67 -0.046 +68 -0.061 +69 -0.076 +70 -0.092 +71 -0.109 +72 -0.127 +73 -0.145 +74 -0.165 +75 -0.185 +76 -0.206 +77 -0.227 +78 -0.249 +79 -0.272 +80 -0.295 +81 -0.318 +82 -0.342 +83 -0.367 +84 -0.391 +85 -0.416 +86 -0.441 +87 -0.467 +88 -0.492 +89 -0.518 +90 -0.543 +1 -1.228 +2 -1.196 +3 -1.163 +4 -1.130 +5 -1.096 +6 -1.062 +7 -1.027 +8 -0.993 +9 -0.958 +10 -0.923 +11 -0.887 +12 -0.852 +13 -0.817 +14 -0.782 +15 -0.747 +16 -0.713 +17 -0.679 +18 -0.645 +19 -0.611 +20 -0.578 +21 -0.545 +22 -0.513 +23 -0.482 +24 -0.451 +25 -0.420 +26 -0.391 +27 -0.362 +28 -0.334 +29 -0.306 +30 -0.280 +31 -0.254 +32 -0.230 +33 -0.206 +34 -0.183 +35 -0.161 +36 -0.140 +37 -0.120 +38 -0.101 +39 -0.084 +40 -0.067 +41 -0.051 +42 -0.037 +43 -0.023 +44 -0.011 +45 -0.000 +46 0.010 +47 0.019 +48 0.026 +49 0.033 +50 0.038 +51 0.042 +52 0.045 +53 0.047 +54 0.048 +55 0.047 +56 0.046 +57 0.043 +58 0.039 +59 0.034 +60 0.028 +61 0.021 +62 0.012 +63 0.003 +64 -0.007 +65 -0.019 +66 -0.031 +67 -0.044 +68 -0.059 +69 -0.074 +70 -0.090 +71 -0.107 +72 -0.125 +73 -0.143 +74 -0.163 +75 -0.183 +76 -0.203 +77 -0.225 +78 -0.247 +79 -0.269 +80 -0.292 +81 -0.316 +82 -0.340 +83 -0.364 +84 -0.389 +85 -0.413 +86 -0.439 +87 -0.464 +88 -0.489 +89 -0.515 +90 -0.540 +1 -2.046 +2 -2.084 +3 -2.114 +4 -2.135 +5 -2.149 +6 -2.155 +7 -2.155 +8 -2.147 +9 -2.134 +10 -2.114 +11 -2.090 +12 -2.060 +13 -2.025 +14 -1.986 +15 -1.943 +16 -1.896 +17 -1.845 +18 -1.792 +19 -1.735 +20 -1.676 +21 -1.615 +22 -1.551 +23 -1.486 +24 -1.419 +25 -1.351 +26 -1.282 +27 -1.211 +28 -1.141 +29 -1.069 +30 -0.998 +31 -0.926 +32 -0.855 +33 -0.784 +34 -0.713 +35 -0.643 +36 -0.573 +37 -0.505 +38 -0.437 +39 -0.371 +40 -0.305 +41 -0.241 +42 -0.179 +43 -0.118 +44 -0.058 +45 0.000 +46 0.056 +47 0.111 +48 0.164 +49 0.215 +50 0.265 +51 0.312 +52 0.358 +53 0.402 +54 0.445 +55 0.485 +56 0.524 +57 0.562 +58 0.598 +59 0.632 +60 0.665 +61 0.696 +62 0.726 +63 0.755 +64 0.783 +65 0.810 +66 0.836 +67 0.861 +68 0.886 +69 0.911 +70 0.935 +71 0.959 +72 0.983 +73 1.008 +74 1.033 +75 1.059 +76 1.085 +77 1.113 +78 1.142 +79 1.173 +80 1.205 +81 1.240 +82 1.277 +83 1.317 +84 1.359 +85 1.405 +86 1.455 +87 1.508 +88 1.565 +89 1.627 +90 1.694 diff --git a/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM.txt b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM.txt new file mode 100644 index 000000000..994d4db62 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM.txt @@ -0,0 +1,5580 @@ +5 0.531 0.001 +30 0.422 0.001 +45 0 0.001 +70 -0.668 0.001 +90 -1.502 0.001 +5 0.471 0.001 +30 0.387 0.001 +45 0 0.001 +70 -0.624 0.001 +90 -1.412 0.001 +5 0.34 0.001 +30 0.31 0.001 +45 0 0.001 +70 -0.527 0.001 +90 -1.208 0.001 +5 0.151 0.001 +30 0.197 0.001 +45 0 0.001 +70 -0.383 0.001 +90 -0.907 0.001 +5 -0.069 0.001 +30 0.066 0.001 +45 0 0.001 +70 -0.213 0.001 +90 -0.549 0.001 +5 -0.342 0.001 +30 -0.1 0.001 +45 0 0.001 +70 0.002 0.001 +90 -0.096 0.001 +5 -0.628 0.001 +30 -0.272 0.001 +45 0 0.001 +70 0.225 0.001 +90 0.376 0.001 +5 -0.899 0.001 +30 -0.436 0.001 +45 0 0.001 +70 0.438 0.001 +90 0.826 0.001 +5 -1.123 0.001 +30 -0.572 0.001 +45 0 0.001 +70 0.615 0.001 +90 1.202 0.001 +5 -1.298 0.001 +30 -0.68 0.001 +45 0 0.001 +70 0.758 0.001 +90 1.507 0.001 +5 -1.413 0.001 +30 -0.752 0.001 +45 0 0.001 +70 0.855 0.001 +90 1.715 0.001 +5 -1.466 0.001 +30 -0.786 0.001 +45 0 0.001 +70 0.9 0.001 +90 1.811 0.001 +5 -1.464 0.001 +30 -0.784 0.001 +45 0 0.001 +70 0.898 0.001 +90 1.807 0.001 +5 -1.415 0.001 +30 -0.753 0.001 +45 0 0.001 +70 0.855 0.001 +90 1.715 0.001 +5 -1.3 0.001 +30 -0.681 0.001 +45 0 0.001 +70 0.759 0.001 +90 1.508 0.001 +5 -1.125 0.001 +30 -0.572 0.001 +45 0 0.001 +70 0.615 0.001 +90 1.202 0.001 +5 -0.905 0.001 +30 -0.439 0.001 +45 0 0.001 +70 0.442 0.001 +90 0.834 0.001 +5 -0.629 0.001 +30 -0.273 0.001 +45 0 0.001 +70 0.226 0.001 +90 0.377 0.001 +5 -0.345 0.001 +30 -0.101 0.001 +45 0 0.001 +70 0.002 0.001 +90 -0.095 0.001 +5 -0.075 0.001 +30 0.062 0.001 +45 0 0.001 +70 -0.209 0.001 +90 -0.54 0.001 +5 0.15 0.001 +30 0.197 0.001 +45 0 0.001 +70 -0.383 0.001 +90 -0.907 0.001 +5 0.339 0.001 +30 0.309 0.001 +45 0 0.001 +70 -0.526 0.001 +90 -1.207 0.001 +5 0.474 0.001 +30 0.388 0.001 +45 0 0.001 +70 -0.626 0.001 +90 -1.414 0.001 +5 0.535 0.001 +30 0.424 0.001 +45 0 0.001 +70 -0.671 0.001 +90 -1.508 0.001 +5 1.387 0.001 +30 0.884 0.001 +45 0 0.001 +70 -1.202 0.001 +90 -2.578 0.001 +5 1.362 0.001 +30 0.863 0.001 +45 0 0.001 +70 -1.168 0.001 +90 -2.501 0.001 +5 1.164 0.001 +30 0.755 0.001 +45 0 0.001 +70 -1.041 0.001 +90 -2.244 0.001 +5 0.963 0.001 +30 0.637 0.001 +45 0 0.001 +70 -0.893 0.001 +90 -1.936 0.001 +5 0.657 0.001 +30 0.449 0.001 +45 0 0.001 +70 -0.643 0.001 +90 -1.406 0.001 +5 0.085 0.001 +30 0.107 0.001 +45 0 0.001 +70 -0.204 0.001 +90 -0.484 0.001 +5 -0.531 0.001 +30 -0.266 0.001 +45 0 0.001 +70 0.28 0.001 +90 0.539 0.001 +5 -1.047 0.001 +30 -0.588 0.001 +45 0 0.001 +70 0.709 0.001 +90 1.454 0.001 +5 -1.405 0.001 +30 -0.799 0.001 +45 0 0.001 +70 0.978 0.001 +90 2.019 0.001 +5 -1.569 0.001 +30 -0.914 0.001 +45 0 0.001 +70 1.144 0.001 +90 2.385 0.001 +5 -1.646 0.001 +30 -0.973 0.001 +45 0 0.001 +70 1.236 0.001 +90 2.593 0.001 +5 -1.742 0.001 +30 -1.026 0.001 +45 0 0.001 +70 1.3 0.001 +90 2.724 0.001 +5 -1.753 0.001 +30 -1.03 0.001 +45 0 0.001 +70 1.301 0.001 +90 2.723 0.001 +5 -1.666 0.001 +30 -0.983 0.001 +45 0 0.001 +70 1.246 0.001 +90 2.612 0.001 +5 -1.581 0.001 +30 -0.916 0.001 +45 0 0.001 +70 1.142 0.001 +90 2.377 0.001 +5 -1.405 0.001 +30 -0.804 0.001 +45 0 0.001 +70 0.989 0.001 +90 2.045 0.001 +5 -1.059 0.001 +30 -0.596 0.001 +45 0 0.001 +70 0.721 0.001 +90 1.48 0.001 +5 -0.543 0.001 +30 -0.275 0.001 +45 0 0.001 +70 0.294 0.001 +90 0.569 0.001 +5 0.05 0.001 +30 0.088 0.001 +45 0 0.001 +70 -0.183 0.001 +90 -0.442 0.001 +5 0.632 0.001 +30 0.435 0.001 +45 0 0.001 +70 -0.628 0.001 +90 -1.376 0.001 +5 0.917 0.001 +30 0.614 0.001 +45 0 0.001 +70 -0.869 0.001 +90 -1.891 0.001 +5 1.189 0.001 +30 0.767 0.001 +45 0 0.001 +70 -1.054 0.001 +90 -2.268 0.001 +5 1.361 0.001 +30 0.861 0.001 +45 0 0.001 +70 -1.163 0.001 +90 -2.487 0.001 +5 1.403 0.001 +30 0.891 0.001 +45 0 0.001 +70 -1.209 0.001 +90 -2.589 0.001 +5 1.732 0.001 +30 1.051 0.001 +45 0 0.001 +70 -1.368 0.001 +90 -2.89 0.001 +5 1.882 0.001 +30 1.126 0.001 +45 0 0.001 +70 -1.449 0.001 +90 -3.047 0.001 +5 1.793 0.001 +30 1.072 0.001 +45 0 0.001 +70 -1.377 0.001 +90 -2.894 0.001 +5 2.208 0.001 +30 1.274 0.001 +45 0 0.001 +70 -1.582 0.001 +90 -3.28 0.001 +5 1.587 0.001 +30 0.957 0.001 +45 0 0.001 +70 -1.24 0.001 +90 -2.615 0.001 +5 1.62 0.001 +30 0.979 0.001 +45 0 0.001 +70 -1.271 0.001 +90 -2.684 0.001 +5 1.271 0.001 +30 0.791 0.001 +45 0 0.001 +70 -1.054 0.001 +90 -2.247 0.001 +5 1.415 0.001 +30 0.86 0.001 +45 0 0.001 +70 -1.123 0.001 +90 -2.377 0.001 +5 1.224 0.001 +30 0.743 0.001 +45 0 0.001 +70 -0.968 0.001 +90 -2.048 0.001 +5 1.557 0.001 +30 0.901 0.001 +45 0 0.001 +70 -1.12 0.001 +90 -2.33 0.001 +5 0.805 0.001 +30 0.483 0.001 +45 0 0.001 +70 -0.623 0.001 +90 -1.315 0.001 +5 0.48 0.001 +30 0.29 0.001 +45 0 0.001 +70 -0.377 0.001 +90 -0.8 0.001 +5 -0.014 0.001 +30 0.002 0.001 +45 0 0.001 +70 -0.016 0.001 +90 -0.046 0.001 +5 -0.393 0.001 +30 -0.24 0.001 +45 0 0.001 +70 0.316 0.001 +90 0.665 0.001 +5 -0.7 0.001 +30 -0.429 0.001 +45 0 0.001 +70 0.564 0.001 +90 1.192 0.001 +5 -1.058 0.001 +30 -0.693 0.001 +45 0 0.001 +70 0.962 0.001 +90 2.076 0.001 +5 -1.201 0.001 +30 -0.725 0.001 +45 0 0.001 +70 0.941 0.001 +90 1.985 0.001 +5 -1.405 0.001 +30 -0.85 0.001 +45 0 0.001 +70 1.105 0.001 +90 2.332 0.001 +5 -1.464 0.001 +30 -0.863 0.001 +45 0 0.001 +70 1.095 0.001 +90 2.294 0.001 +5 -1.569 0.001 +30 -0.96 0.001 +45 0 0.001 +70 1.259 0.001 +90 2.67 0.001 +5 -1.54 0.001 +30 -0.941 0.001 +45 0 0.001 +70 1.234 0.001 +90 2.618 0.001 +5 -1.543 0.001 +30 -1.018 0.001 +45 0 0.001 +70 1.422 0.001 +90 3.085 0.001 +5 -1.645 0.001 +30 -1.019 0.001 +45 0 0.001 +70 1.353 0.001 +90 2.886 0.001 +5 -1.729 0.001 +30 -1.073 0.001 +45 0 0.001 +70 1.426 0.001 +90 3.044 0.001 +5 -1.739 0.001 +30 -1.06 0.001 +45 0 0.001 +70 1.388 0.001 +90 2.945 0.001 +5 -1.73 0.001 +30 -1.074 0.001 +45 0 0.001 +70 1.428 0.001 +90 3.048 0.001 +5 -1.645 0.001 +30 -1.02 0.001 +45 0 0.001 +70 1.354 0.001 +90 2.888 0.001 +5 -1.541 0.001 +30 -1.017 0.001 +45 0 0.001 +70 1.422 0.001 +90 3.087 0.001 +5 -1.542 0.001 +30 -0.942 0.001 +45 0 0.001 +70 1.235 0.001 +90 2.62 0.001 +5 -1.576 0.001 +30 -0.962 0.001 +45 0 0.001 +70 1.261 0.001 +90 2.673 0.001 +5 -1.468 0.001 +30 -0.865 0.001 +45 0 0.001 +70 1.097 0.001 +90 2.296 0.001 +5 -1.41 0.001 +30 -0.853 0.001 +45 0 0.001 +70 1.107 0.001 +90 2.337 0.001 +5 -1.205 0.001 +30 -0.727 0.001 +45 0 0.001 +70 0.942 0.001 +90 1.985 0.001 +5 -1.061 0.001 +30 -0.693 0.001 +45 0 0.001 +70 0.96 0.001 +90 2.07 0.001 +5 -0.71 0.001 +30 -0.434 0.001 +45 0 0.001 +70 0.569 0.001 +90 1.203 0.001 +5 -0.411 0.001 +30 -0.251 0.001 +45 0 0.001 +70 0.329 0.001 +90 0.692 0.001 +5 -0.028 0.001 +30 -0.006 0.001 +45 0 0.001 +70 -0.006 0.001 +90 -0.026 0.001 +5 0.462 0.001 +30 0.28 0.001 +45 0 0.001 +70 -0.364 0.001 +90 -0.772 0.001 +5 0.799 0.001 +30 0.48 0.001 +45 0 0.001 +70 -0.619 0.001 +90 -1.306 0.001 +5 1.564 0.001 +30 0.904 0.001 +45 0 0.001 +70 -1.125 0.001 +90 -2.339 0.001 +5 1.224 0.001 +30 0.743 0.001 +45 0 0.001 +70 -0.969 0.001 +90 -2.049 0.001 +5 1.409 0.001 +30 0.858 0.001 +45 0 0.001 +70 -1.12 0.001 +90 -2.372 0.001 +5 1.269 0.001 +30 0.79 0.001 +45 0 0.001 +70 -1.054 0.001 +90 -2.246 0.001 +5 1.621 0.001 +30 0.98 0.001 +45 0 0.001 +70 -1.272 0.001 +90 -2.684 0.001 +5 1.584 0.001 +30 0.956 0.001 +45 0 0.001 +70 -1.239 0.001 +90 -2.612 0.001 +5 2.201 0.001 +30 1.271 0.001 +45 0 0.001 +70 -1.579 0.001 +90 -3.276 0.001 +5 1.79 0.001 +30 1.07 0.001 +45 0 0.001 +70 -1.376 0.001 +90 -2.891 0.001 +5 1.879 0.001 +30 1.125 0.001 +45 0 0.001 +70 -1.447 0.001 +90 -3.043 0.001 +5 2.264 0.001 +30 1.311 0.001 +45 0 0.001 +70 -1.635 0.001 +90 -3.395 0.001 +5 2.283 0.001 +30 1.326 0.001 +45 0 0.001 +70 -1.658 0.001 +90 -3.447 0.001 +5 2.419 0.001 +30 1.388 0.001 +45 0 0.001 +70 -1.713 0.001 +90 -3.545 0.001 +5 2.558 0.001 +30 1.456 0.001 +45 0 0.001 +70 -1.784 0.001 +90 -3.68 0.001 +5 2.396 0.001 +30 1.38 0.001 +45 0 0.001 +70 -1.71 0.001 +90 -3.543 0.001 +5 2.23 0.001 +30 1.309 0.001 +45 0 0.001 +70 -1.653 0.001 +90 -3.453 0.001 +5 2.132 0.001 +30 1.245 0.001 +45 0 0.001 +70 -1.566 0.001 +90 -3.265 0.001 +5 2.014 0.001 +30 1.179 0.001 +45 0 0.001 +70 -1.485 0.001 +90 -3.1 0.001 +5 2.019 0.001 +30 1.161 0.001 +45 0 0.001 +70 -1.437 0.001 +90 -2.981 0.001 +5 1.941 0.001 +30 1.098 0.001 +45 0 0.001 +70 -1.336 0.001 +90 -2.755 0.001 +5 1.403 0.001 +30 0.788 0.001 +45 0 0.001 +70 -0.95 0.001 +90 -1.954 0.001 +5 0.843 0.001 +30 0.469 0.001 +45 0 0.001 +70 -0.56 0.001 +90 -1.148 0.001 +5 0.26 0.001 +30 0.111 0.001 +45 0 0.001 +70 -0.089 0.001 +90 -0.151 0.001 +5 -0.351 0.001 +30 -0.259 0.001 +45 0 0.001 +70 0.391 0.001 +90 0.861 0.001 +5 -0.725 0.001 +30 -0.505 0.001 +45 0 0.001 +70 0.736 0.001 +90 1.608 0.001 +5 -1.119 0.001 +30 -0.761 0.001 +45 0 0.001 +70 1.089 0.001 +90 2.372 0.001 +5 -1.368 0.001 +30 -0.895 0.001 +45 0 0.001 +70 1.244 0.001 +90 2.684 0.001 +5 -1.585 0.001 +30 -1.005 0.001 +45 0 0.001 +70 1.36 0.001 +90 2.913 0.001 +5 -1.66 0.001 +30 -1.059 0.001 +45 0 0.001 +70 1.439 0.001 +90 3.09 0.001 +5 -1.79 0.001 +30 -1.139 0.001 +45 0 0.001 +70 1.546 0.001 +90 3.319 0.001 +5 -1.683 0.001 +30 -1.106 0.001 +45 0 0.001 +70 1.542 0.001 +90 3.342 0.001 +5 -1.637 0.001 +30 -1.105 0.001 +45 0 0.001 +70 1.572 0.001 +90 3.432 0.001 +5 -1.671 0.001 +30 -1.107 0.001 +45 0 0.001 +70 1.552 0.001 +90 3.373 0.001 +5 -1.747 0.001 +30 -1.13 0.001 +45 0 0.001 +70 1.555 0.001 +90 3.359 0.001 +5 -1.706 0.001 +30 -1.107 0.001 +45 0 0.001 +70 1.527 0.001 +90 3.302 0.001 +5 -1.747 0.001 +30 -1.13 0.001 +45 0 0.001 +70 1.555 0.001 +90 3.36 0.001 +5 -1.671 0.001 +30 -1.107 0.001 +45 0 0.001 +70 1.552 0.001 +90 3.373 0.001 +5 -1.637 0.001 +30 -1.105 0.001 +45 0 0.001 +70 1.572 0.001 +90 3.432 0.001 +5 -1.685 0.001 +30 -1.107 0.001 +45 0 0.001 +70 1.543 0.001 +90 3.343 0.001 +5 -1.793 0.001 +30 -1.14 0.001 +45 0 0.001 +70 1.547 0.001 +90 3.32 0.001 +5 -1.665 0.001 +30 -1.06 0.001 +45 0 0.001 +70 1.441 0.001 +90 3.093 0.001 +5 -1.59 0.001 +30 -1.007 0.001 +45 0 0.001 +70 1.362 0.001 +90 2.917 0.001 +5 -1.375 0.001 +30 -0.899 0.001 +45 0 0.001 +70 1.247 0.001 +90 2.69 0.001 +5 -1.127 0.001 +30 -0.765 0.001 +45 0 0.001 +70 1.093 0.001 +90 2.378 0.001 +5 -0.735 0.001 +30 -0.51 0.001 +45 0 0.001 +70 0.741 0.001 +90 1.619 0.001 +5 -0.363 0.001 +30 -0.264 0.001 +45 0 0.001 +70 0.398 0.001 +90 0.874 0.001 +5 0.249 0.001 +30 0.105 0.001 +45 0 0.001 +70 -0.082 0.001 +90 -0.137 0.001 +5 0.834 0.001 +30 0.464 0.001 +45 0 0.001 +70 -0.553 0.001 +90 -1.136 0.001 +5 1.394 0.001 +30 0.783 0.001 +45 0 0.001 +70 -0.945 0.001 +90 -1.944 0.001 +5 1.937 0.001 +30 1.096 0.001 +45 0 0.001 +70 -1.334 0.001 +90 -2.75 0.001 +5 2.013 0.001 +30 1.159 0.001 +45 0 0.001 +70 -1.434 0.001 +90 -2.976 0.001 +5 2.011 0.001 +30 1.178 0.001 +45 0 0.001 +70 -1.483 0.001 +90 -3.098 0.001 +5 2.129 0.001 +30 1.244 0.001 +45 0 0.001 +70 -1.564 0.001 +90 -3.263 0.001 +5 2.227 0.001 +30 1.308 0.001 +45 0 0.001 +70 -1.652 0.001 +90 -3.451 0.001 +5 2.394 0.001 +30 1.379 0.001 +45 0 0.001 +70 -1.709 0.001 +90 -3.543 0.001 +5 2.556 0.001 +30 1.455 0.001 +45 0 0.001 +70 -1.783 0.001 +90 -3.68 0.001 +5 2.418 0.001 +30 1.387 0.001 +45 0 0.001 +70 -1.714 0.001 +90 -3.546 0.001 +5 2.281 0.001 +30 1.325 0.001 +45 0 0.001 +70 -1.657 0.001 +90 -3.445 0.001 +5 2.153 0.001 +30 1.224 0.001 +45 0 0.001 +70 -1.5 0.001 +90 -3.093 0.001 +5 2.242 0.001 +30 1.284 0.001 +45 0 0.001 +70 -1.583 0.001 +90 -3.274 0.001 +5 2.721 0.001 +30 1.495 0.001 +45 0 0.001 +70 -1.763 0.001 +90 -3.579 0.001 +5 2.971 0.001 +30 1.63 0.001 +45 0 0.001 +70 -1.92 0.001 +90 -3.897 0.001 +5 2.748 0.001 +30 1.517 0.001 +45 0 0.001 +70 -1.799 0.001 +90 -3.664 0.001 +5 2.251 0.001 +30 1.323 0.001 +45 0 0.001 +70 -1.672 0.001 +90 -3.494 0.001 +5 2.071 0.001 +30 1.189 0.001 +45 0 0.001 +70 -1.47 0.001 +90 -3.046 0.001 +5 1.992 0.001 +30 1.163 0.001 +45 0 0.001 +70 -1.46 0.001 +90 -3.046 0.001 +5 2.487 0.001 +30 1.364 0.001 +45 0 0.001 +70 -1.604 0.001 +90 -3.26 0.001 +5 2.577 0.001 +30 1.401 0.001 +45 0 0.001 +70 -1.633 0.001 +90 -3.306 0.001 +5 2.045 0.001 +30 1.094 0.001 +45 0 0.001 +70 -1.25 0.001 +90 -2.513 0.001 +5 1.012 0.001 +30 0.547 0.001 +45 0 0.001 +70 -0.633 0.001 +90 -1.283 0.001 +5 0.385 0.001 +30 0.162 0.001 +45 0 0.001 +70 -0.125 0.001 +90 -0.204 0.001 +5 -0.295 0.001 +30 -0.246 0.001 +45 0 0.001 +70 0.4 0.001 +90 0.898 0.001 +5 -0.59 0.001 +30 -0.503 0.001 +45 0 0.001 +70 0.828 0.001 +90 1.874 0.001 +5 -0.998 0.001 +30 -0.764 0.001 +45 0 0.001 +70 1.183 0.001 +90 2.637 0.001 +5 -1.126 0.001 +30 -0.817 0.001 +45 0 0.001 +70 1.223 0.001 +90 2.703 0.001 +5 -1.591 0.001 +30 -0.999 0.001 +45 0 0.001 +70 1.341 0.001 +90 2.863 0.001 +5 -1.494 0.001 +30 -0.962 0.001 +45 0 0.001 +70 1.319 0.001 +90 2.84 0.001 +5 -1.855 0.001 +30 -1.172 0.001 +45 0 0.001 +70 1.582 0.001 +90 3.391 0.001 +5 -1.359 0.001 +30 -0.983 0.001 +45 0 0.001 +70 1.468 0.001 +90 3.254 0.001 +5 -1.355 0.001 +30 -1.012 0.001 +45 0 0.001 +70 1.542 0.001 +90 3.441 0.001 +5 -1.309 0.001 +30 -0.96 0.001 +45 0 0.001 +70 1.446 0.001 +90 3.218 0.001 +5 -1.613 0.001 +30 -1.057 0.001 +45 0 0.001 +70 1.471 0.001 +90 3.191 0.001 +5 -1.504 0.001 +30 -0.991 0.001 +45 0 0.001 +70 1.384 0.001 +90 3.008 0.001 +5 -1.613 0.001 +30 -1.057 0.001 +45 0 0.001 +70 1.471 0.001 +90 3.19 0.001 +5 -1.311 0.001 +30 -0.96 0.001 +45 0 0.001 +70 1.446 0.001 +90 3.218 0.001 +5 -1.358 0.001 +30 -1.013 0.001 +45 0 0.001 +70 1.543 0.001 +90 3.442 0.001 +5 -1.362 0.001 +30 -0.984 0.001 +45 0 0.001 +70 1.469 0.001 +90 3.256 0.001 +5 -1.858 0.001 +30 -1.174 0.001 +45 0 0.001 +70 1.584 0.001 +90 3.393 0.001 +5 -1.499 0.001 +30 -0.964 0.001 +45 0 0.001 +70 1.322 0.001 +90 2.845 0.001 +5 -1.597 0.001 +30 -1.002 0.001 +45 0 0.001 +70 1.344 0.001 +90 2.869 0.001 +5 -1.133 0.001 +30 -0.821 0.001 +45 0 0.001 +70 1.227 0.001 +90 2.71 0.001 +5 -1.006 0.001 +30 -0.768 0.001 +45 0 0.001 +70 1.188 0.001 +90 2.645 0.001 +5 -0.599 0.001 +30 -0.508 0.001 +45 0 0.001 +70 0.833 0.001 +90 1.884 0.001 +5 -0.304 0.001 +30 -0.251 0.001 +45 0 0.001 +70 0.405 0.001 +90 0.909 0.001 +5 0.375 0.001 +30 0.156 0.001 +45 0 0.001 +70 -0.119 0.001 +90 -0.192 0.001 +5 1.002 0.001 +30 0.542 0.001 +45 0 0.001 +70 -0.628 0.001 +90 -1.273 0.001 +5 2.036 0.001 +30 1.089 0.001 +45 0 0.001 +70 -1.245 0.001 +90 -2.503 0.001 +5 2.569 0.001 +30 1.398 0.001 +45 0 0.001 +70 -1.628 0.001 +90 -3.298 0.001 +5 2.48 0.001 +30 1.36 0.001 +45 0 0.001 +70 -1.6 0.001 +90 -3.253 0.001 +5 1.987 0.001 +30 1.16 0.001 +45 0 0.001 +70 -1.457 0.001 +90 -3.041 0.001 +5 2.067 0.001 +30 1.187 0.001 +45 0 0.001 +70 -1.468 0.001 +90 -3.042 0.001 +5 2.249 0.001 +30 1.322 0.001 +45 0 0.001 +70 -1.671 0.001 +90 -3.492 0.001 +5 2.747 0.001 +30 1.517 0.001 +45 0 0.001 +70 -1.799 0.001 +90 -3.664 0.001 +5 2.97 0.001 +30 1.63 0.001 +45 0 0.001 +70 -1.92 0.001 +90 -3.897 0.001 +5 2.721 0.001 +30 1.495 0.001 +45 0 0.001 +70 -1.763 0.001 +90 -3.581 0.001 +5 2.243 0.001 +30 1.284 0.001 +45 0 0.001 +70 -1.584 0.001 +90 -3.276 0.001 +5 1.884 0.001 +30 1.105 0.001 +45 0 0.001 +70 -1.397 0.001 +90 -2.916 0.001 +5 1.975 0.001 +30 1.152 0.001 +45 0 0.001 +70 -1.447 0.001 +90 -3.014 0.001 +5 2.074 0.001 +30 1.202 0.001 +45 0 0.001 +70 -1.501 0.001 +90 -3.12 0.001 +5 2.218 0.001 +30 1.28 0.001 +45 0 0.001 +70 -1.591 0.001 +90 -3.301 0.001 +5 1.951 0.001 +30 1.153 0.001 +45 0 0.001 +70 -1.467 0.001 +90 -3.073 0.001 +5 1.823 0.001 +30 1.108 0.001 +45 0 0.001 +70 -1.447 0.001 +90 -3.061 0.001 +5 1.655 0.001 +30 1.022 0.001 +45 0 0.001 +70 -1.354 0.001 +90 -2.879 0.001 +5 1.76 0.001 +30 1.068 0.001 +45 0 0.001 +70 -1.391 0.001 +90 -2.942 0.001 +5 1.878 0.001 +30 1.11 0.001 +45 0 0.001 +70 -1.41 0.001 +90 -2.956 0.001 +5 1.9 0.001 +30 1.087 0.001 +45 0 0.001 +70 -1.337 0.001 +90 -2.77 0.001 +5 1.377 0.001 +30 0.777 0.001 +45 0 0.001 +70 -0.942 0.001 +90 -1.942 0.001 +5 0.853 0.001 +30 0.468 0.001 +45 0 0.001 +70 -0.55 0.001 +90 -1.124 0.001 +5 0.236 0.001 +30 0.105 0.001 +45 0 0.001 +70 -0.09 0.001 +90 -0.163 0.001 +5 -0.303 0.001 +30 -0.229 0.001 +45 0 0.001 +70 0.351 0.001 +90 0.774 0.001 +5 -0.776 0.001 +30 -0.519 0.001 +45 0 0.001 +70 0.733 0.001 +90 1.584 0.001 +5 -1.249 0.001 +30 -0.812 0.001 +45 0 0.001 +70 1.123 0.001 +90 2.416 0.001 +5 -1.603 0.001 +30 -0.988 0.001 +45 0 0.001 +70 1.306 0.001 +90 2.768 0.001 +5 -1.811 0.001 +30 -1.081 0.001 +45 0 0.001 +70 1.387 0.001 +90 2.912 0.001 +5 -1.905 0.001 +30 -1.12 0.001 +45 0 0.001 +70 1.417 0.001 +90 2.964 0.001 +5 -1.922 0.001 +30 -1.154 0.001 +45 0 0.001 +70 1.489 0.001 +90 3.14 0.001 +5 -1.759 0.001 +30 -1.091 0.001 +45 0 0.001 +70 1.45 0.001 +90 3.093 0.001 +5 -1.683 0.001 +30 -1.089 0.001 +45 0 0.001 +70 1.499 0.001 +90 3.24 0.001 +5 -1.656 0.001 +30 -1.061 0.001 +45 0 0.001 +70 1.449 0.001 +90 3.125 0.001 +5 -1.667 0.001 +30 -1.056 0.001 +45 0 0.001 +70 1.43 0.001 +90 3.074 0.001 +5 -1.669 0.001 +30 -1.047 0.001 +45 0 0.001 +70 1.405 0.001 +90 3.012 0.001 +5 -1.668 0.001 +30 -1.057 0.001 +45 0 0.001 +70 1.429 0.001 +90 3.074 0.001 +5 -1.658 0.001 +30 -1.061 0.001 +45 0 0.001 +70 1.449 0.001 +90 3.125 0.001 +5 -1.686 0.001 +30 -1.09 0.001 +45 0 0.001 +70 1.5 0.001 +90 3.241 0.001 +5 -1.763 0.001 +30 -1.092 0.001 +45 0 0.001 +70 1.451 0.001 +90 3.095 0.001 +5 -1.926 0.001 +30 -1.156 0.001 +45 0 0.001 +70 1.491 0.001 +90 3.144 0.001 +5 -1.91 0.001 +30 -1.122 0.001 +45 0 0.001 +70 1.42 0.001 +90 2.969 0.001 +5 -1.817 0.001 +30 -1.084 0.001 +45 0 0.001 +70 1.39 0.001 +90 2.919 0.001 +5 -1.61 0.001 +30 -0.992 0.001 +45 0 0.001 +70 1.31 0.001 +90 2.777 0.001 +5 -1.256 0.001 +30 -0.816 0.001 +45 0 0.001 +70 1.128 0.001 +90 2.425 0.001 +5 -0.785 0.001 +30 -0.523 0.001 +45 0 0.001 +70 0.738 0.001 +90 1.594 0.001 +5 -0.312 0.001 +30 -0.233 0.001 +45 0 0.001 +70 0.356 0.001 +90 0.785 0.001 +5 0.227 0.001 +30 0.1 0.001 +45 0 0.001 +70 -0.085 0.001 +90 -0.153 0.001 +5 0.843 0.001 +30 0.463 0.001 +45 0 0.001 +70 -0.545 0.001 +90 -1.113 0.001 +5 1.367 0.001 +30 0.772 0.001 +45 0 0.001 +70 -0.936 0.001 +90 -1.932 0.001 +5 1.891 0.001 +30 1.082 0.001 +45 0 0.001 +70 -1.332 0.001 +90 -2.76 0.001 +5 1.871 0.001 +30 1.106 0.001 +45 0 0.001 +70 -1.405 0.001 +90 -2.947 0.001 +5 1.753 0.001 +30 1.064 0.001 +45 0 0.001 +70 -1.388 0.001 +90 -2.936 0.001 +5 1.651 0.001 +30 1.02 0.001 +45 0 0.001 +70 -1.352 0.001 +90 -2.875 0.001 +5 1.821 0.001 +30 1.108 0.001 +45 0 0.001 +70 -1.446 0.001 +90 -3.06 0.001 +5 1.95 0.001 +30 1.153 0.001 +45 0 0.001 +70 -1.467 0.001 +90 -3.072 0.001 +5 2.218 0.001 +30 1.28 0.001 +45 0 0.001 +70 -1.591 0.001 +90 -3.302 0.001 +5 2.075 0.001 +30 1.203 0.001 +45 0 0.001 +70 -1.502 0.001 +90 -3.121 0.001 +5 1.976 0.001 +30 1.153 0.001 +45 0 0.001 +70 -1.448 0.001 +90 -3.016 0.001 +5 1.514 0.001 +30 0.893 0.001 +45 0 0.001 +70 -1.133 0.001 +90 -2.369 0.001 +5 1.729 0.001 +30 0.989 0.001 +45 0 0.001 +70 -1.217 0.001 +90 -2.514 0.001 +5 1.602 0.001 +30 0.934 0.001 +45 0 0.001 +70 -1.172 0.001 +90 -2.441 0.001 +5 1.921 0.001 +30 1.083 0.001 +45 0 0.001 +70 -1.314 0.001 +90 -2.699 0.001 +5 1.711 0.001 +30 0.993 0.001 +45 0 0.001 +70 -1.242 0.001 +90 -2.582 0.001 +5 2.139 0.001 +30 1.194 0.001 +45 0 0.001 +70 -1.433 0.001 +90 -2.932 0.001 +5 1.711 0.001 +30 0.999 0.001 +45 0 0.001 +70 -1.257 0.001 +90 -2.621 0.001 +5 2.031 0.001 +30 1.146 0.001 +45 0 0.001 +70 -1.393 0.001 +90 -2.865 0.001 +5 1.421 0.001 +30 0.865 0.001 +45 0 0.001 +70 -1.131 0.001 +90 -2.393 0.001 +5 1.634 0.001 +30 0.968 0.001 +45 0 0.001 +70 -1.235 0.001 +90 -2.59 0.001 +5 1.283 0.001 +30 0.818 0.001 +45 0 0.001 +70 -1.114 0.001 +90 -2.391 0.001 +5 1.318 0.001 +30 0.828 0.001 +45 0 0.001 +70 -1.112 0.001 +90 -2.377 0.001 +5 1.064 0.001 +30 0.713 0.001 +45 0 0.001 +70 -1.01 0.001 +90 -2.198 0.001 +5 1.374 0.001 +30 0.86 0.001 +45 0 0.001 +70 -1.151 0.001 +90 -2.459 0.001 +5 1.329 0.001 +30 0.838 0.001 +45 0 0.001 +70 -1.13 0.001 +90 -2.42 0.001 +5 1.746 0.001 +30 1.027 0.001 +45 0 0.001 +70 -1.3 0.001 +90 -2.721 0.001 +5 1.563 0.001 +30 0.944 0.001 +45 0 0.001 +70 -1.225 0.001 +90 -2.59 0.001 +5 2.067 0.001 +30 1.154 0.001 +45 0 0.001 +70 -1.385 0.001 +90 -2.84 0.001 +5 1.634 0.001 +30 0.94 0.001 +45 0 0.001 +70 -1.164 0.001 +90 -2.419 0.001 +5 1.885 0.001 +30 1.02 0.001 +45 0 0.001 +70 -1.183 0.001 +90 -2.394 0.001 +5 1.319 0.001 +30 0.738 0.001 +45 0 0.001 +70 -0.888 0.001 +90 -1.828 0.001 +5 1.334 0.001 +30 0.708 0.001 +45 0 0.001 +70 -0.802 0.001 +90 -1.61 0.001 +5 0.841 0.001 +30 0.456 0.001 +45 0 0.001 +70 -0.528 0.001 +90 -1.073 0.001 +5 0.694 0.001 +30 0.345 0.001 +45 0 0.001 +70 -0.358 0.001 +90 -0.696 0.001 +5 0.248 0.001 +30 0.111 0.001 +45 0 0.001 +70 -0.098 0.001 +90 -0.179 0.001 +5 0.127 0.001 +30 0.005 0.001 +45 0 0.001 +70 0.08 0.001 +90 0.226 0.001 +5 -0.243 0.001 +30 -0.194 0.001 +45 0 0.001 +70 0.308 0.001 +90 0.684 0.001 +5 -0.329 0.001 +30 -0.288 0.001 +45 0 0.001 +70 0.48 0.001 +90 1.086 0.001 +5 -0.707 0.001 +30 -0.473 0.001 +45 0 0.001 +70 0.67 0.001 +90 1.449 0.001 +5 -0.722 0.001 +30 -0.541 0.001 +45 0 0.001 +70 0.828 0.001 +90 1.836 0.001 +5 -1.158 0.001 +30 -0.733 0.001 +45 0 0.001 +70 0.99 0.001 +90 2.112 0.001 +5 -1.156 0.001 +30 -0.779 0.001 +45 0 0.001 +70 1.107 0.001 +90 2.404 0.001 +5 -1.573 0.001 +30 -0.934 0.001 +45 0 0.001 +70 1.192 0.001 +90 2.496 0.001 +5 -1.518 0.001 +30 -0.927 0.001 +45 0 0.001 +70 1.215 0.001 +90 2.569 0.001 +5 -1.734 0.001 +30 -0.99 0.001 +45 0 0.001 +70 1.216 0.001 +90 2.51 0.001 +5 -1.735 0.001 +30 -0.998 0.001 +45 0 0.001 +70 1.235 0.001 +90 2.56 0.001 +5 -1.847 0.001 +30 -1.021 0.001 +45 0 0.001 +70 1.212 0.001 +90 2.472 0.001 +5 -1.725 0.001 +30 -0.992 0.001 +45 0 0.001 +70 1.227 0.001 +90 2.547 0.001 +5 -1.797 0.001 +30 -1.028 0.001 +45 0 0.001 +70 1.266 0.001 +90 2.624 0.001 +5 -1.558 0.001 +30 -0.951 0.001 +45 0 0.001 +70 1.245 0.001 +90 2.644 0.001 +5 -1.609 0.001 +30 -0.954 0.001 +45 0 0.001 +70 1.217 0.001 +90 2.56 0.001 +5 -1.352 0.001 +30 -0.9 0.001 +45 0 0.001 +70 1.267 0.001 +90 2.759 0.001 +5 -1.495 0.001 +30 -0.937 0.001 +45 0 0.001 +70 1.255 0.001 +90 2.69 0.001 +5 -1.289 0.001 +30 -0.886 0.001 +45 0 0.001 +70 1.278 0.001 +90 2.806 0.001 +5 -1.448 0.001 +30 -0.917 0.001 +45 0 0.001 +70 1.24 0.001 +90 2.667 0.001 +5 -1.303 0.001 +30 -0.869 0.001 +45 0 0.001 +70 1.227 0.001 +90 2.677 0.001 +5 -1.422 0.001 +30 -0.893 0.001 +45 0 0.001 +70 1.199 0.001 +90 2.574 0.001 +5 -1.338 0.001 +30 -0.865 0.001 +45 0 0.001 +70 1.192 0.001 +90 2.581 0.001 +5 -1.456 0.001 +30 -0.9 0.001 +45 0 0.001 +70 1.192 0.001 +90 2.548 0.001 +5 -1.339 0.001 +30 -0.866 0.001 +45 0 0.001 +70 1.192 0.001 +90 2.58 0.001 +5 -1.423 0.001 +30 -0.893 0.001 +45 0 0.001 +70 1.199 0.001 +90 2.574 0.001 +5 -1.305 0.001 +30 -0.87 0.001 +45 0 0.001 +70 1.227 0.001 +90 2.677 0.001 +5 -1.451 0.001 +30 -0.918 0.001 +45 0 0.001 +70 1.24 0.001 +90 2.668 0.001 +5 -1.293 0.001 +30 -0.887 0.001 +45 0 0.001 +70 1.278 0.001 +90 2.807 0.001 +5 -1.499 0.001 +30 -0.938 0.001 +45 0 0.001 +70 1.257 0.001 +90 2.692 0.001 +5 -1.356 0.001 +30 -0.901 0.001 +45 0 0.001 +70 1.268 0.001 +90 2.761 0.001 +5 -1.612 0.001 +30 -0.955 0.001 +45 0 0.001 +70 1.218 0.001 +90 2.562 0.001 +5 -1.562 0.001 +30 -0.952 0.001 +45 0 0.001 +70 1.247 0.001 +90 2.647 0.001 +5 -1.801 0.001 +30 -1.03 0.001 +45 0 0.001 +70 1.268 0.001 +90 2.627 0.001 +5 -1.73 0.001 +30 -0.994 0.001 +45 0 0.001 +70 1.23 0.001 +90 2.551 0.001 +5 -1.852 0.001 +30 -1.023 0.001 +45 0 0.001 +70 1.215 0.001 +90 2.477 0.001 +5 -1.74 0.001 +30 -1 0.001 +45 0 0.001 +70 1.238 0.001 +90 2.566 0.001 +5 -1.739 0.001 +30 -0.992 0.001 +45 0 0.001 +70 1.219 0.001 +90 2.517 0.001 +5 -1.524 0.001 +30 -0.93 0.001 +45 0 0.001 +70 1.219 0.001 +90 2.576 0.001 +5 -1.579 0.001 +30 -0.937 0.001 +45 0 0.001 +70 1.196 0.001 +90 2.504 0.001 +5 -1.163 0.001 +30 -0.783 0.001 +45 0 0.001 +70 1.112 0.001 +90 2.413 0.001 +5 -1.166 0.001 +30 -0.736 0.001 +45 0 0.001 +70 0.994 0.001 +90 2.121 0.001 +5 -0.729 0.001 +30 -0.545 0.001 +45 0 0.001 +70 0.833 0.001 +90 1.845 0.001 +5 -0.714 0.001 +30 -0.477 0.001 +45 0 0.001 +70 0.675 0.001 +90 1.458 0.001 +5 -0.336 0.001 +30 -0.292 0.001 +45 0 0.001 +70 0.485 0.001 +90 1.095 0.001 +5 -0.251 0.001 +30 -0.198 0.001 +45 0 0.001 +70 0.312 0.001 +90 0.693 0.001 +5 0.119 0.001 +30 0.001 0.001 +45 0 0.001 +70 0.084 0.001 +90 0.234 0.001 +5 0.239 0.001 +30 0.107 0.001 +45 0 0.001 +70 -0.093 0.001 +90 -0.17 0.001 +5 0.685 0.001 +30 0.34 0.001 +45 0 0.001 +70 -0.354 0.001 +90 -0.687 0.001 +5 0.832 0.001 +30 0.451 0.001 +45 0 0.001 +70 -0.523 0.001 +90 -1.064 0.001 +5 1.324 0.001 +30 0.703 0.001 +45 0 0.001 +70 -0.797 0.001 +90 -1.6 0.001 +5 1.309 0.001 +30 0.734 0.001 +45 0 0.001 +70 -0.883 0.001 +90 -1.818 0.001 +5 1.875 0.001 +30 1.015 0.001 +45 0 0.001 +70 -1.178 0.001 +90 -2.384 0.001 +5 1.624 0.001 +30 0.935 0.001 +45 0 0.001 +70 -1.159 0.001 +90 -2.409 0.001 +5 2.058 0.001 +30 1.15 0.001 +45 0 0.001 +70 -1.38 0.001 +90 -2.83 0.001 +5 1.555 0.001 +30 0.94 0.001 +45 0 0.001 +70 -1.221 0.001 +90 -2.581 0.001 +5 1.738 0.001 +30 1.023 0.001 +45 0 0.001 +70 -1.296 0.001 +90 -2.713 0.001 +5 1.323 0.001 +30 0.835 0.001 +45 0 0.001 +70 -1.126 0.001 +90 -2.413 0.001 +5 1.369 0.001 +30 0.857 0.001 +45 0 0.001 +70 -1.148 0.001 +90 -2.453 0.001 +5 1.06 0.001 +30 0.711 0.001 +45 0 0.001 +70 -1.008 0.001 +90 -2.194 0.001 +5 1.316 0.001 +30 0.826 0.001 +45 0 0.001 +70 -1.111 0.001 +90 -2.375 0.001 +5 1.282 0.001 +30 0.818 0.001 +45 0 0.001 +70 -1.113 0.001 +90 -2.39 0.001 +5 1.633 0.001 +30 0.968 0.001 +45 0 0.001 +70 -1.235 0.001 +90 -2.59 0.001 +5 1.421 0.001 +30 0.865 0.001 +45 0 0.001 +70 -1.131 0.001 +90 -2.393 0.001 +5 2.031 0.001 +30 1.147 0.001 +45 0 0.001 +70 -1.394 0.001 +90 -2.866 0.001 +5 1.712 0.001 +30 1 0.001 +45 0 0.001 +70 -1.258 0.001 +90 -2.622 0.001 +5 2.141 0.001 +30 1.195 0.001 +45 0 0.001 +70 -1.434 0.001 +90 -2.934 0.001 +5 1.712 0.001 +30 0.994 0.001 +45 0 0.001 +70 -1.243 0.001 +90 -2.583 0.001 +5 1.922 0.001 +30 1.084 0.001 +45 0 0.001 +70 -1.315 0.001 +90 -2.701 0.001 +5 1.604 0.001 +30 0.935 0.001 +45 0 0.001 +70 -1.173 0.001 +90 -2.443 0.001 +5 1.73 0.001 +30 0.989 0.001 +45 0 0.001 +70 -1.217 0.001 +90 -2.515 0.001 +5 1.142 0.001 +30 0.688 0.001 +45 0 0.001 +70 -0.893 0.001 +90 -1.88 0.001 +5 1.155 0.001 +30 0.701 0.001 +45 0 0.001 +70 -0.914 0.001 +90 -1.929 0.001 +5 1.179 0.001 +30 0.704 0.001 +45 0 0.001 +70 -0.905 0.001 +90 -1.901 0.001 +5 1.207 0.001 +30 0.731 0.001 +45 0 0.001 +70 -0.951 0.001 +90 -2.007 0.001 +5 1.228 0.001 +30 0.74 0.001 +45 0 0.001 +70 -0.958 0.001 +90 -2.018 0.001 +5 1.218 0.001 +30 0.746 0.001 +45 0 0.001 +70 -0.98 0.001 +90 -2.076 0.001 +5 1.147 0.001 +30 0.707 0.001 +45 0 0.001 +70 -0.936 0.001 +90 -1.986 0.001 +5 0.992 0.001 +30 0.644 0.001 +45 0 0.001 +70 -0.889 0.001 +90 -1.917 0.001 +5 0.791 0.001 +30 0.545 0.001 +45 0 0.001 +70 -0.79 0.001 +90 -1.728 0.001 +5 0.576 0.001 +30 0.451 0.001 +45 0 0.001 +70 -0.71 0.001 +90 -1.594 0.001 +5 0.462 0.001 +30 0.404 0.001 +45 0 0.001 +70 -0.673 0.001 +90 -1.535 0.001 +5 0.388 0.001 +30 0.377 0.001 +45 0 0.001 +70 -0.66 0.001 +90 -1.525 0.001 +5 0.326 0.001 +30 0.346 0.001 +45 0 0.001 +70 -0.627 0.001 +90 -1.463 0.001 +5 0.512 0.001 +30 0.447 0.001 +45 0 0.001 +70 -0.746 0.001 +90 -1.705 0.001 +5 0.673 0.001 +30 0.522 0.001 +45 0 0.001 +70 -0.814 0.001 +90 -1.827 0.001 +5 0.925 0.001 +30 0.651 0.001 +45 0 0.001 +70 -0.955 0.001 +90 -2.105 0.001 +5 1.098 0.001 +30 0.713 0.001 +45 0 0.001 +70 -0.984 0.001 +90 -2.127 0.001 +5 1.257 0.001 +30 0.781 0.001 +45 0 0.001 +70 -1.039 0.001 +90 -2.218 0.001 +5 1.324 0.001 +30 0.787 0.001 +45 0 0.001 +70 -1.006 0.001 +90 -2.117 0.001 +5 1.234 0.001 +30 0.723 0.001 +45 0 0.001 +70 -0.911 0.001 +90 -1.907 0.001 +5 1.103 0.001 +30 0.629 0.001 +45 0 0.001 +70 -0.772 0.001 +90 -1.602 0.001 +5 0.915 0.001 +30 0.518 0.001 +45 0 0.001 +70 -0.631 0.001 +90 -1.308 0.001 +5 0.754 0.001 +30 0.412 0.001 +45 0 0.001 +70 -0.483 0.001 +90 -0.987 0.001 +5 0.471 0.001 +30 0.253 0.001 +45 0 0.001 +70 -0.289 0.001 +90 -0.59 0.001 +5 0.237 0.001 +30 0.109 0.001 +45 0 0.001 +70 -0.1 0.001 +90 -0.189 0.001 +5 -0.041 0.001 +30 -0.053 0.001 +45 0 0.001 +70 0.102 0.001 +90 0.23 0.001 +5 -0.238 0.001 +30 -0.179 0.001 +45 0 0.001 +70 0.274 0.001 +90 0.601 0.001 +5 -0.512 0.001 +30 -0.331 0.001 +45 0 0.001 +70 0.455 0.001 +90 0.971 0.001 +5 -0.703 0.001 +30 -0.444 0.001 +45 0 0.001 +70 0.6 0.001 +90 1.276 0.001 +5 -0.989 0.001 +30 -0.601 0.001 +45 0 0.001 +70 0.785 0.001 +90 1.651 0.001 +5 -1.192 0.001 +30 -0.712 0.001 +45 0 0.001 +70 0.915 0.001 +90 1.915 0.001 +5 -1.472 0.001 +30 -0.846 0.001 +45 0 0.001 +70 1.046 0.001 +90 2.161 0.001 +5 -1.613 0.001 +30 -0.899 0.001 +45 0 0.001 +70 1.077 0.001 +90 2.198 0.001 +5 -1.861 0.001 +30 -1.006 0.001 +45 0 0.001 +70 1.166 0.001 +90 2.349 0.001 +5 -1.869 0.001 +30 -0.983 0.001 +45 0 0.001 +70 1.102 0.001 +90 2.188 0.001 +5 -1.956 0.001 +30 -1.01 0.001 +45 0 0.001 +70 1.108 0.001 +90 2.181 0.001 +5 -1.909 0.001 +30 -0.968 0.001 +45 0 0.001 +70 1.036 0.001 +90 2.017 0.001 +5 -1.907 0.001 +30 -0.978 0.001 +45 0 0.001 +70 1.062 0.001 +90 2.085 0.001 +5 -1.811 0.001 +30 -0.942 0.001 +45 0 0.001 +70 1.042 0.001 +90 2.064 0.001 +5 -1.73 0.001 +30 -0.918 0.001 +45 0 0.001 +70 1.04 0.001 +90 2.084 0.001 +5 -1.598 0.001 +30 -0.88 0.001 +45 0 0.001 +70 1.041 0.001 +90 2.125 0.001 +5 -1.559 0.001 +30 -0.888 0.001 +45 0 0.001 +70 1.089 0.001 +90 2.258 0.001 +5 -1.423 0.001 +30 -0.841 0.001 +45 0 0.001 +70 1.068 0.001 +90 2.248 0.001 +5 -1.441 0.001 +30 -0.861 0.001 +45 0 0.001 +70 1.107 0.001 +90 2.34 0.001 +5 -1.347 0.001 +30 -0.817 0.001 +45 0 0.001 +70 1.065 0.001 +90 2.262 0.001 +5 -1.364 0.001 +30 -0.825 0.001 +45 0 0.001 +70 1.073 0.001 +90 2.278 0.001 +5 -1.261 0.001 +30 -0.771 0.001 +45 0 0.001 +70 1.011 0.001 +90 2.155 0.001 +5 -1.336 0.001 +30 -0.807 0.001 +45 0 0.001 +70 1.047 0.001 +90 2.222 0.001 +5 -1.289 0.001 +30 -0.781 0.001 +45 0 0.001 +70 1.017 0.001 +90 2.161 0.001 +5 -1.337 0.001 +30 -0.807 0.001 +45 0 0.001 +70 1.047 0.001 +90 2.222 0.001 +5 -1.263 0.001 +30 -0.771 0.001 +45 0 0.001 +70 1.011 0.001 +90 2.154 0.001 +5 -1.366 0.001 +30 -0.826 0.001 +45 0 0.001 +70 1.073 0.001 +90 2.278 0.001 +5 -1.35 0.001 +30 -0.818 0.001 +45 0 0.001 +70 1.065 0.001 +90 2.263 0.001 +5 -1.444 0.001 +30 -0.863 0.001 +45 0 0.001 +70 1.108 0.001 +90 2.341 0.001 +5 -1.427 0.001 +30 -0.842 0.001 +45 0 0.001 +70 1.07 0.001 +90 2.25 0.001 +5 -1.563 0.001 +30 -0.89 0.001 +45 0 0.001 +70 1.09 0.001 +90 2.26 0.001 +5 -1.602 0.001 +30 -0.881 0.001 +45 0 0.001 +70 1.042 0.001 +90 2.128 0.001 +5 -1.734 0.001 +30 -0.919 0.001 +45 0 0.001 +70 1.041 0.001 +90 2.087 0.001 +5 -1.815 0.001 +30 -0.944 0.001 +45 0 0.001 +70 1.043 0.001 +90 2.067 0.001 +5 -1.911 0.001 +30 -0.98 0.001 +45 0 0.001 +70 1.064 0.001 +90 2.089 0.001 +5 -1.913 0.001 +30 -0.97 0.001 +45 0 0.001 +70 1.038 0.001 +90 2.022 0.001 +5 -1.96 0.001 +30 -1.013 0.001 +45 0 0.001 +70 1.111 0.001 +90 2.187 0.001 +5 -1.874 0.001 +30 -0.985 0.001 +45 0 0.001 +70 1.105 0.001 +90 2.195 0.001 +5 -1.866 0.001 +30 -1.009 0.001 +45 0 0.001 +70 1.169 0.001 +90 2.356 0.001 +5 -1.618 0.001 +30 -0.902 0.001 +45 0 0.001 +70 1.081 0.001 +90 2.206 0.001 +5 -1.478 0.001 +30 -0.849 0.001 +45 0 0.001 +70 1.05 0.001 +90 2.169 0.001 +5 -1.198 0.001 +30 -0.715 0.001 +45 0 0.001 +70 0.919 0.001 +90 1.924 0.001 +5 -0.995 0.001 +30 -0.605 0.001 +45 0 0.001 +70 0.789 0.001 +90 1.659 0.001 +5 -0.709 0.001 +30 -0.448 0.001 +45 0 0.001 +70 0.604 0.001 +90 1.284 0.001 +5 -0.518 0.001 +30 -0.334 0.001 +45 0 0.001 +70 0.459 0.001 +90 0.978 0.001 +5 -0.245 0.001 +30 -0.182 0.001 +45 0 0.001 +70 0.278 0.001 +90 0.609 0.001 +5 -0.048 0.001 +30 -0.056 0.001 +45 0 0.001 +70 0.105 0.001 +90 0.237 0.001 +5 0.23 0.001 +30 0.105 0.001 +45 0 0.001 +70 -0.096 0.001 +90 -0.182 0.001 +5 0.463 0.001 +30 0.249 0.001 +45 0 0.001 +70 -0.285 0.001 +90 -0.583 0.001 +5 0.746 0.001 +30 0.408 0.001 +45 0 0.001 +70 -0.479 0.001 +90 -0.979 0.001 +5 0.906 0.001 +30 0.514 0.001 +45 0 0.001 +70 -0.627 0.001 +90 -1.3 0.001 +5 1.093 0.001 +30 0.624 0.001 +45 0 0.001 +70 -0.767 0.001 +90 -1.593 0.001 +5 1.224 0.001 +30 0.718 0.001 +45 0 0.001 +70 -0.906 0.001 +90 -1.898 0.001 +5 1.315 0.001 +30 0.783 0.001 +45 0 0.001 +70 -1.001 0.001 +90 -2.108 0.001 +5 1.248 0.001 +30 0.777 0.001 +45 0 0.001 +70 -1.034 0.001 +90 -2.208 0.001 +5 1.089 0.001 +30 0.709 0.001 +45 0 0.001 +70 -0.98 0.001 +90 -2.118 0.001 +5 0.918 0.001 +30 0.648 0.001 +45 0 0.001 +70 -0.952 0.001 +90 -2.098 0.001 +5 0.668 0.001 +30 0.519 0.001 +45 0 0.001 +70 -0.811 0.001 +90 -1.821 0.001 +5 0.507 0.001 +30 0.445 0.001 +45 0 0.001 +70 -0.744 0.001 +90 -1.7 0.001 +5 0.323 0.001 +30 0.345 0.001 +45 0 0.001 +70 -0.626 0.001 +90 -1.46 0.001 +5 0.386 0.001 +30 0.376 0.001 +45 0 0.001 +70 -0.659 0.001 +90 -1.524 0.001 +5 0.462 0.001 +30 0.404 0.001 +45 0 0.001 +70 -0.673 0.001 +90 -1.535 0.001 +5 0.576 0.001 +30 0.452 0.001 +45 0 0.001 +70 -0.711 0.001 +90 -1.595 0.001 +5 0.792 0.001 +30 0.546 0.001 +45 0 0.001 +70 -0.79 0.001 +90 -1.73 0.001 +5 0.993 0.001 +30 0.645 0.001 +45 0 0.001 +70 -0.89 0.001 +90 -1.918 0.001 +5 1.149 0.001 +30 0.708 0.001 +45 0 0.001 +70 -0.937 0.001 +90 -1.987 0.001 +5 1.22 0.001 +30 0.747 0.001 +45 0 0.001 +70 -0.981 0.001 +90 -2.078 0.001 +5 1.231 0.001 +30 0.741 0.001 +45 0 0.001 +70 -0.959 0.001 +90 -2.02 0.001 +5 1.209 0.001 +30 0.732 0.001 +45 0 0.001 +70 -0.953 0.001 +90 -2.009 0.001 +5 1.181 0.001 +30 0.705 0.001 +45 0 0.001 +70 -0.906 0.001 +90 -1.903 0.001 +5 1.156 0.001 +30 0.701 0.001 +45 0 0.001 +70 -0.914 0.001 +90 -1.93 0.001 +5 0.857 0.001 +30 0.492 0.001 +45 0 0.001 +70 -0.609 0.001 +90 -1.257 0.001 +5 0.986 0.001 +30 0.561 0.001 +45 0 0.001 +70 -0.688 0.001 +90 -1.416 0.001 +5 0.864 0.001 +30 0.494 0.001 +45 0 0.001 +70 -0.608 0.001 +90 -1.253 0.001 +5 1.05 0.001 +30 0.598 0.001 +45 0 0.001 +70 -0.735 0.001 +90 -1.514 0.001 +5 0.906 0.001 +30 0.529 0.001 +45 0 0.001 +70 -0.665 0.001 +90 -1.383 0.001 +5 1.083 0.001 +30 0.626 0.001 +45 0 0.001 +70 -0.779 0.001 +90 -1.616 0.001 +5 0.752 0.001 +30 0.464 0.001 +45 0 0.001 +70 -0.614 0.001 +90 -1.301 0.001 +5 0.818 0.001 +30 0.507 0.001 +45 0 0.001 +70 -0.674 0.001 +90 -1.433 0.001 +5 0.349 0.001 +30 0.281 0.001 +45 0 0.001 +70 -0.449 0.001 +90 -1.011 0.001 +5 0.236 0.001 +30 0.233 0.001 +45 0 0.001 +70 -0.412 0.001 +90 -0.953 0.001 +5 -0.186 0.001 +30 0.044 0.001 +45 0 0.001 +70 -0.245 0.001 +90 -0.662 0.001 +5 -0.087 0.001 +30 0.091 0.001 +45 0 0.001 +70 -0.291 0.001 +90 -0.748 0.001 +5 -0.387 0.001 +30 -0.051 0.001 +45 0 0.001 +70 -0.152 0.001 +90 -0.49 0.001 +5 0.187 0.001 +30 0.255 0.001 +45 0 0.001 +70 -0.502 0.001 +90 -1.192 0.001 +5 0.245 0.001 +30 0.294 0.001 +45 0 0.001 +70 -0.557 0.001 +90 -1.312 0.001 +5 0.819 0.001 +30 0.569 0.001 +45 0 0.001 +70 -0.826 0.001 +90 -1.814 0.001 +5 0.885 0.001 +30 0.575 0.001 +45 0 0.001 +70 -0.795 0.001 +90 -1.72 0.001 +5 1.337 0.001 +30 0.781 0.001 +45 0 0.001 +70 -0.983 0.001 +90 -2.054 0.001 +5 1.232 0.001 +30 0.71 0.001 +45 0 0.001 +70 -0.88 0.001 +90 -1.832 0.001 +5 1.394 0.001 +30 0.762 0.001 +45 0 0.001 +70 -0.893 0.001 +90 -1.817 0.001 +5 1.132 0.001 +30 0.611 0.001 +45 0 0.001 +70 -0.707 0.001 +90 -1.434 0.001 +5 1.109 0.001 +30 0.578 0.001 +45 0 0.001 +70 -0.641 0.001 +90 -1.276 0.001 +5 0.876 0.001 +30 0.447 0.001 +45 0 0.001 +70 -0.481 0.001 +90 -0.948 0.001 +5 0.718 0.001 +30 0.346 0.001 +45 0 0.001 +70 -0.343 0.001 +90 -0.652 0.001 +5 0.446 0.001 +30 0.193 0.001 +45 0 0.001 +70 -0.159 0.001 +90 -0.276 0.001 +5 0.258 0.001 +30 0.073 0.001 +45 0 0.001 +70 0.004 0.001 +90 0.074 0.001 +5 0.015 0.001 +30 -0.062 0.001 +45 0 0.001 +70 0.165 0.001 +90 0.404 0.001 +5 -0.165 0.001 +30 -0.175 0.001 +45 0 0.001 +70 0.316 0.001 +90 0.725 0.001 +5 -0.41 0.001 +30 -0.297 0.001 +45 0 0.001 +70 0.444 0.001 +90 0.973 0.001 +5 -0.617 0.001 +30 -0.429 0.001 +45 0 0.001 +70 0.623 0.001 +90 1.357 0.001 +5 -0.918 0.001 +30 -0.561 0.001 +45 0 0.001 +70 0.736 0.001 +90 1.55 0.001 +5 -1.115 0.001 +30 -0.673 0.001 +45 0 0.001 +70 0.873 0.001 +90 1.834 0.001 +5 -1.345 0.001 +30 -0.738 0.001 +45 0 0.001 +70 0.87 0.001 +90 1.762 0.001 +5 -1.592 0.001 +30 -0.859 0.001 +45 0 0.001 +70 0.993 0.001 +90 1.996 0.001 +5 -1.756 0.001 +30 -0.878 0.001 +45 0 0.001 +70 0.923 0.001 +90 1.777 0.001 +5 -1.697 0.001 +30 -0.844 0.001 +45 0 0.001 +70 0.881 0.001 +90 1.693 0.001 +5 -1.595 0.001 +30 -0.728 0.001 +45 0 0.001 +70 0.665 0.001 +90 1.189 0.001 +5 -1.506 0.001 +30 -0.722 0.001 +45 0 0.001 +70 0.715 0.001 +90 1.339 0.001 +5 -1.521 0.001 +30 -0.724 0.001 +45 0 0.001 +70 0.708 0.001 +90 1.32 0.001 +5 -1.303 0.001 +30 -0.667 0.001 +45 0 0.001 +70 0.724 0.001 +90 1.423 0.001 +5 -1.213 0.001 +30 -0.64 0.001 +45 0 0.001 +70 0.72 0.001 +90 1.443 0.001 +5 -1.09 0.001 +30 -0.639 0.001 +45 0 0.001 +70 0.806 0.001 +90 1.691 0.001 +5 -1.002 0.001 +30 -0.59 0.001 +45 0 0.001 +70 0.748 0.001 +90 1.574 0.001 +5 -0.941 0.001 +30 -0.602 0.001 +45 0 0.001 +70 0.823 0.001 +90 1.78 0.001 +5 -0.88 0.001 +30 -0.553 0.001 +45 0 0.001 +70 0.744 0.001 +90 1.602 0.001 +5 -0.846 0.001 +30 -0.556 0.001 +45 0 0.001 +70 0.775 0.001 +90 1.689 0.001 +5 -0.762 0.001 +30 -0.492 0.001 +45 0 0.001 +70 0.677 0.001 +90 1.471 0.001 +5 -0.807 0.001 +30 -0.53 0.001 +45 0 0.001 +70 0.74 0.001 +90 1.615 0.001 +5 -0.778 0.001 +30 -0.501 0.001 +45 0 0.001 +70 0.686 0.001 +90 1.49 0.001 +5 -0.808 0.001 +30 -0.531 0.001 +45 0 0.001 +70 0.74 0.001 +90 1.615 0.001 +5 -0.764 0.001 +30 -0.493 0.001 +45 0 0.001 +70 0.677 0.001 +90 1.471 0.001 +5 -0.849 0.001 +30 -0.557 0.001 +45 0 0.001 +70 0.775 0.001 +90 1.689 0.001 +5 -0.883 0.001 +30 -0.554 0.001 +45 0 0.001 +70 0.745 0.001 +90 1.603 0.001 +5 -0.944 0.001 +30 -0.604 0.001 +45 0 0.001 +70 0.824 0.001 +90 1.781 0.001 +5 -1.006 0.001 +30 -0.591 0.001 +45 0 0.001 +70 0.749 0.001 +90 1.576 0.001 +5 -1.094 0.001 +30 -0.64 0.001 +45 0 0.001 +70 0.807 0.001 +90 1.693 0.001 +5 -1.216 0.001 +30 -0.641 0.001 +45 0 0.001 +70 0.722 0.001 +90 1.445 0.001 +5 -1.306 0.001 +30 -0.669 0.001 +45 0 0.001 +70 0.725 0.001 +90 1.426 0.001 +5 -1.524 0.001 +30 -0.725 0.001 +45 0 0.001 +70 0.71 0.001 +90 1.323 0.001 +5 -1.509 0.001 +30 -0.724 0.001 +45 0 0.001 +70 0.716 0.001 +90 1.343 0.001 +5 -1.599 0.001 +30 -0.73 0.001 +45 0 0.001 +70 0.667 0.001 +90 1.194 0.001 +5 -1.7 0.001 +30 -0.846 0.001 +45 0 0.001 +70 0.884 0.001 +90 1.698 0.001 +5 -1.759 0.001 +30 -0.88 0.001 +45 0 0.001 +70 0.925 0.001 +90 1.783 0.001 +5 -1.596 0.001 +30 -0.861 0.001 +45 0 0.001 +70 0.996 0.001 +90 2.003 0.001 +5 -1.349 0.001 +30 -0.741 0.001 +45 0 0.001 +70 0.873 0.001 +90 1.769 0.001 +5 -1.12 0.001 +30 -0.676 0.001 +45 0 0.001 +70 0.876 0.001 +90 1.841 0.001 +5 -0.922 0.001 +30 -0.563 0.001 +45 0 0.001 +70 0.739 0.001 +90 1.557 0.001 +5 -0.621 0.001 +30 -0.431 0.001 +45 0 0.001 +70 0.627 0.001 +90 1.364 0.001 +5 -0.414 0.001 +30 -0.299 0.001 +45 0 0.001 +70 0.447 0.001 +90 0.979 0.001 +5 -0.169 0.001 +30 -0.177 0.001 +45 0 0.001 +70 0.319 0.001 +90 0.731 0.001 +5 0.011 0.001 +30 -0.064 0.001 +45 0 0.001 +70 0.168 0.001 +90 0.409 0.001 +5 0.253 0.001 +30 0.071 0.001 +45 0 0.001 +70 0.006 0.001 +90 0.079 0.001 +5 0.44 0.001 +30 0.191 0.001 +45 0 0.001 +70 -0.157 0.001 +90 -0.272 0.001 +5 0.712 0.001 +30 0.343 0.001 +45 0 0.001 +70 -0.34 0.001 +90 -0.647 0.001 +5 0.869 0.001 +30 0.443 0.001 +45 0 0.001 +70 -0.478 0.001 +90 -0.942 0.001 +5 1.101 0.001 +30 0.574 0.001 +45 0 0.001 +70 -0.637 0.001 +90 -1.269 0.001 +5 1.123 0.001 +30 0.607 0.001 +45 0 0.001 +70 -0.703 0.001 +90 -1.426 0.001 +5 1.385 0.001 +30 0.758 0.001 +45 0 0.001 +70 -0.889 0.001 +90 -1.809 0.001 +5 1.223 0.001 +30 0.706 0.001 +45 0 0.001 +70 -0.876 0.001 +90 -1.824 0.001 +5 1.328 0.001 +30 0.777 0.001 +45 0 0.001 +70 -0.978 0.001 +90 -2.045 0.001 +5 0.877 0.001 +30 0.571 0.001 +45 0 0.001 +70 -0.791 0.001 +90 -1.712 0.001 +5 0.812 0.001 +30 0.565 0.001 +45 0 0.001 +70 -0.822 0.001 +90 -1.807 0.001 +5 0.24 0.001 +30 0.292 0.001 +45 0 0.001 +70 -0.554 0.001 +90 -1.307 0.001 +5 0.183 0.001 +30 0.254 0.001 +45 0 0.001 +70 -0.5 0.001 +90 -1.189 0.001 +5 -0.389 0.001 +30 -0.052 0.001 +45 0 0.001 +70 -0.151 0.001 +90 -0.488 0.001 +5 -0.087 0.001 +30 0.091 0.001 +45 0 0.001 +70 -0.291 0.001 +90 -0.748 0.001 +5 -0.184 0.001 +30 0.045 0.001 +45 0 0.001 +70 -0.246 0.001 +90 -0.663 0.001 +5 0.238 0.001 +30 0.234 0.001 +45 0 0.001 +70 -0.413 0.001 +90 -0.954 0.001 +5 0.352 0.001 +30 0.282 0.001 +45 0 0.001 +70 -0.45 0.001 +90 -1.014 0.001 +5 0.822 0.001 +30 0.509 0.001 +45 0 0.001 +70 -0.676 0.001 +90 -1.436 0.001 +5 0.756 0.001 +30 0.465 0.001 +45 0 0.001 +70 -0.615 0.001 +90 -1.304 0.001 +5 1.086 0.001 +30 0.628 0.001 +45 0 0.001 +70 -0.781 0.001 +90 -1.619 0.001 +5 0.909 0.001 +30 0.53 0.001 +45 0 0.001 +70 -0.666 0.001 +90 -1.386 0.001 +5 1.053 0.001 +30 0.6 0.001 +45 0 0.001 +70 -0.736 0.001 +90 -1.516 0.001 +5 0.867 0.001 +30 0.495 0.001 +45 0 0.001 +70 -0.609 0.001 +90 -1.256 0.001 +5 0.987 0.001 +30 0.562 0.001 +45 0 0.001 +70 -0.689 0.001 +90 -1.417 0.001 +5 0.494 0.001 +30 0.28 0.001 +45 0 0.001 +70 -0.341 0.001 +90 -0.696 0.001 +5 0.439 0.001 +30 0.27 0.001 +45 0 0.001 +70 -0.357 0.001 +90 -0.751 0.001 +5 0.472 0.001 +30 0.267 0.001 +45 0 0.001 +70 -0.324 0.001 +90 -0.662 0.001 +5 0.445 0.001 +30 0.281 0.001 +45 0 0.001 +70 -0.379 0.001 +90 -0.806 0.001 +5 0.463 0.001 +30 0.281 0.001 +45 0 0.001 +70 -0.366 0.001 +90 -0.769 0.001 +5 0.366 0.001 +30 0.257 0.001 +45 0 0.001 +70 -0.377 0.001 +90 -0.824 0.001 +5 0.224 0.001 +30 0.176 0.001 +45 0 0.001 +70 -0.276 0.001 +90 -0.617 0.001 +5 0.012 0.001 +30 0.097 0.001 +45 0 0.001 +70 -0.234 0.001 +90 -0.573 0.001 +5 -0.232 0.001 +30 -0.029 0.001 +45 0 0.001 +70 -0.095 0.001 +90 -0.301 0.001 +5 -0.594 0.001 +30 -0.185 0.001 +45 0 0.001 +70 0.031 0.001 +90 -0.093 0.001 +5 -0.785 0.001 +30 -0.276 0.001 +45 0 0.001 +70 0.12 0.001 +90 0.07 0.001 +5 -1.164 0.001 +30 -0.449 0.001 +45 0 0.001 +70 0.28 0.001 +90 0.356 0.001 +5 -1.347 0.001 +30 -0.546 0.001 +45 0 0.001 +70 0.389 0.001 +90 0.572 0.001 +5 -0.867 0.001 +30 -0.277 0.001 +45 0 0.001 +70 0.065 0.001 +90 -0.092 0.001 +5 -0.316 0.001 +30 -0.011 0.001 +45 0 0.001 +70 -0.2 0.001 +90 -0.591 0.001 +5 0.129 0.001 +30 0.227 0.001 +45 0 0.001 +70 -0.472 0.001 +90 -1.135 0.001 +5 0.498 0.001 +30 0.372 0.001 +45 0 0.001 +70 -0.567 0.001 +90 -1.265 0.001 +5 0.786 0.001 +30 0.515 0.001 +45 0 0.001 +70 -0.716 0.001 +90 -1.553 0.001 +5 0.976 0.001 +30 0.571 0.001 +45 0 0.001 +70 -0.719 0.001 +90 -1.507 0.001 +5 0.997 0.001 +30 0.571 0.001 +45 0 0.001 +70 -0.703 0.001 +90 -1.462 0.001 +5 1.011 0.001 +30 0.539 0.001 +45 0 0.001 +70 -0.615 0.001 +90 -1.239 0.001 +5 0.883 0.001 +30 0.471 0.001 +45 0 0.001 +70 -0.536 0.001 +90 -1.082 0.001 +5 0.874 0.001 +30 0.435 0.001 +45 0 0.001 +70 -0.453 0.001 +90 -0.881 0.001 +5 0.604 0.001 +30 0.296 0.001 +45 0 0.001 +70 -0.302 0.001 +90 -0.584 0.001 +5 0.518 0.001 +30 0.224 0.001 +45 0 0.001 +70 -0.183 0.001 +90 -0.315 0.001 +5 0.203 0.001 +30 0.06 0.001 +45 0 0.001 +70 -0.004 0.001 +90 0.039 0.001 +5 0.127 0.001 +30 -0.003 0.001 +45 0 0.001 +70 0.099 0.001 +90 0.272 0.001 +5 -0.207 0.001 +30 -0.169 0.001 +45 0 0.001 +70 0.271 0.001 +90 0.601 0.001 +5 -0.295 0.001 +30 -0.223 0.001 +45 0 0.001 +70 0.344 0.001 +90 0.758 0.001 +5 -0.681 0.001 +30 -0.416 0.001 +45 0 0.001 +70 0.545 0.001 +90 1.143 0.001 +5 -0.818 0.001 +30 -0.481 0.001 +45 0 0.001 +70 0.608 0.001 +90 1.262 0.001 +5 -1.201 0.001 +30 -0.654 0.001 +45 0 0.001 +70 0.764 0.001 +90 1.539 0.001 +5 -1.255 0.001 +30 -0.65 0.001 +45 0 0.001 +70 0.714 0.001 +90 1.4 0.001 +5 -1.638 0.001 +30 -0.804 0.001 +45 0 0.001 +70 0.824 0.001 +90 1.565 0.001 +5 -1.561 0.001 +30 -0.716 0.001 +45 0 0.001 +70 0.66 0.001 +90 1.181 0.001 +5 -1.702 0.001 +30 -0.728 0.001 +45 0 0.001 +70 0.587 0.001 +90 0.962 0.001 +5 -1.507 0.001 +30 -0.576 0.001 +45 0 0.001 +70 0.351 0.001 +90 0.435 0.001 +5 -1.525 0.001 +30 -0.613 0.001 +45 0 0.001 +70 0.429 0.001 +90 0.625 0.001 +5 -1.345 0.001 +30 -0.572 0.001 +45 0 0.001 +70 0.457 0.001 +90 0.747 0.001 +5 -1.281 0.001 +30 -0.568 0.001 +45 0 0.001 +70 0.492 0.001 +90 0.855 0.001 +5 -1.024 0.001 +30 -0.485 0.001 +45 0 0.001 +70 0.472 0.001 +90 0.881 0.001 +5 -1.025 0.001 +30 -0.521 0.001 +45 0 0.001 +70 0.56 0.001 +90 1.101 0.001 +5 -0.761 0.001 +30 -0.417 0.001 +45 0 0.001 +70 0.491 0.001 +90 1.006 0.001 +5 -0.827 0.001 +30 -0.473 0.001 +45 0 0.001 +70 0.582 0.001 +90 1.215 0.001 +5 -0.6 0.001 +30 -0.372 0.001 +45 0 0.001 +70 0.495 0.001 +90 1.066 0.001 +5 -0.675 0.001 +30 -0.412 0.001 +45 0 0.001 +70 0.539 0.001 +90 1.153 0.001 +5 -0.433 0.001 +30 -0.293 0.001 +45 0 0.001 +70 0.418 0.001 +90 0.925 0.001 +5 -0.604 0.001 +30 -0.378 0.001 +45 0 0.001 +70 0.506 0.001 +90 1.093 0.001 +5 -0.446 0.001 +30 -0.304 0.001 +45 0 0.001 +70 0.435 0.001 +90 0.964 0.001 +5 -0.605 0.001 +30 -0.378 0.001 +45 0 0.001 +70 0.506 0.001 +90 1.093 0.001 +5 -0.434 0.001 +30 -0.294 0.001 +45 0 0.001 +70 0.418 0.001 +90 0.925 0.001 +5 -0.677 0.001 +30 -0.412 0.001 +45 0 0.001 +70 0.539 0.001 +90 1.153 0.001 +5 -0.604 0.001 +30 -0.374 0.001 +45 0 0.001 +70 0.496 0.001 +90 1.066 0.001 +5 -0.83 0.001 +30 -0.474 0.001 +45 0 0.001 +70 0.583 0.001 +90 1.215 0.001 +5 -0.764 0.001 +30 -0.418 0.001 +45 0 0.001 +70 0.492 0.001 +90 1.008 0.001 +5 -1.028 0.001 +30 -0.523 0.001 +45 0 0.001 +70 0.561 0.001 +90 1.102 0.001 +5 -1.027 0.001 +30 -0.486 0.001 +45 0 0.001 +70 0.473 0.001 +90 0.882 0.001 +5 -1.284 0.001 +30 -0.569 0.001 +45 0 0.001 +70 0.493 0.001 +90 0.857 0.001 +5 -1.348 0.001 +30 -0.573 0.001 +45 0 0.001 +70 0.458 0.001 +90 0.749 0.001 +5 -1.528 0.001 +30 -0.614 0.001 +45 0 0.001 +70 0.431 0.001 +90 0.628 0.001 +5 -1.51 0.001 +30 -0.578 0.001 +45 0 0.001 +70 0.353 0.001 +90 0.439 0.001 +5 -1.704 0.001 +30 -0.729 0.001 +45 0 0.001 +70 0.589 0.001 +90 0.966 0.001 +5 -1.563 0.001 +30 -0.717 0.001 +45 0 0.001 +70 0.662 0.001 +90 1.186 0.001 +5 -1.64 0.001 +30 -0.806 0.001 +45 0 0.001 +70 0.827 0.001 +90 1.571 0.001 +5 -1.257 0.001 +30 -0.651 0.001 +45 0 0.001 +70 0.716 0.001 +90 1.406 0.001 +5 -1.203 0.001 +30 -0.656 0.001 +45 0 0.001 +70 0.767 0.001 +90 1.545 0.001 +5 -0.82 0.001 +30 -0.482 0.001 +45 0 0.001 +70 0.61 0.001 +90 1.267 0.001 +5 -0.683 0.001 +30 -0.417 0.001 +45 0 0.001 +70 0.547 0.001 +90 1.147 0.001 +5 -0.296 0.001 +30 -0.225 0.001 +45 0 0.001 +70 0.346 0.001 +90 0.762 0.001 +5 -0.209 0.001 +30 -0.17 0.001 +45 0 0.001 +70 0.273 0.001 +90 0.605 0.001 +5 0.125 0.001 +30 -0.004 0.001 +45 0 0.001 +70 0.101 0.001 +90 0.274 0.001 +5 0.2 0.001 +30 0.059 0.001 +45 0 0.001 +70 -0.002 0.001 +90 0.041 0.001 +5 0.515 0.001 +30 0.222 0.001 +45 0 0.001 +70 -0.182 0.001 +90 -0.313 0.001 +5 0.599 0.001 +30 0.294 0.001 +45 0 0.001 +70 -0.3 0.001 +90 -0.581 0.001 +5 0.868 0.001 +30 0.432 0.001 +45 0 0.001 +70 -0.451 0.001 +90 -0.877 0.001 +5 0.876 0.001 +30 0.468 0.001 +45 0 0.001 +70 -0.533 0.001 +90 -1.077 0.001 +5 1.004 0.001 +30 0.536 0.001 +45 0 0.001 +70 -0.612 0.001 +90 -1.234 0.001 +5 0.989 0.001 +30 0.567 0.001 +45 0 0.001 +70 -0.7 0.001 +90 -1.455 0.001 +5 0.968 0.001 +30 0.568 0.001 +45 0 0.001 +70 -0.716 0.001 +90 -1.5 0.001 +5 0.778 0.001 +30 0.511 0.001 +45 0 0.001 +70 -0.712 0.001 +90 -1.546 0.001 +5 0.491 0.001 +30 0.368 0.001 +45 0 0.001 +70 -0.564 0.001 +90 -1.259 0.001 +5 0.124 0.001 +30 0.224 0.001 +45 0 0.001 +70 -0.469 0.001 +90 -1.129 0.001 +5 -0.32 0.001 +30 -0.013 0.001 +45 0 0.001 +70 -0.198 0.001 +90 -0.587 0.001 +5 -0.869 0.001 +30 -0.278 0.001 +45 0 0.001 +70 0.066 0.001 +90 -0.09 0.001 +5 -1.348 0.001 +30 -0.547 0.001 +45 0 0.001 +70 0.389 0.001 +90 0.573 0.001 +5 -1.163 0.001 +30 -0.449 0.001 +45 0 0.001 +70 0.279 0.001 +90 0.355 0.001 +5 -0.782 0.001 +30 -0.274 0.001 +45 0 0.001 +70 0.119 0.001 +90 0.068 0.001 +5 -0.59 0.001 +30 -0.183 0.001 +45 0 0.001 +70 0.03 0.001 +90 -0.096 0.001 +5 -0.228 0.001 +30 -0.027 0.001 +45 0 0.001 +70 -0.097 0.001 +90 -0.304 0.001 +5 0.016 0.001 +30 0.099 0.001 +45 0 0.001 +70 -0.236 0.001 +90 -0.577 0.001 +5 0.229 0.001 +30 0.178 0.001 +45 0 0.001 +70 -0.279 0.001 +90 -0.62 0.001 +5 0.371 0.001 +30 0.259 0.001 +45 0 0.001 +70 -0.379 0.001 +90 -0.828 0.001 +5 0.468 0.001 +30 0.283 0.001 +45 0 0.001 +70 -0.368 0.001 +90 -0.773 0.001 +5 0.449 0.001 +30 0.283 0.001 +45 0 0.001 +70 -0.381 0.001 +90 -0.809 0.001 +5 0.476 0.001 +30 0.268 0.001 +45 0 0.001 +70 -0.326 0.001 +90 -0.665 0.001 +5 0.441 0.001 +30 0.271 0.001 +45 0 0.001 +70 -0.357 0.001 +90 -0.753 0.001 +5 0.256 0.001 +30 0.094 0.001 +45 0 0.001 +70 -0.049 0.001 +90 -0.04 0.001 +5 0.307 0.001 +30 0.142 0.001 +45 0 0.001 +70 -0.132 0.001 +90 -0.231 0.001 +5 0.209 0.001 +30 0.069 0.001 +45 0 0.001 +70 -0.022 0.001 +90 0.014 0.001 +5 0.291 0.001 +30 0.144 0.001 +45 0 0.001 +70 -0.148 0.001 +90 -0.276 0.001 +5 0.157 0.001 +30 0.065 0.001 +45 0 0.001 +70 -0.05 0.001 +90 -0.071 0.001 +5 0.189 0.001 +30 0.111 0.001 +45 0 0.001 +70 -0.141 0.001 +90 -0.288 0.001 +5 -0.136 0.001 +30 -0.063 0.001 +45 0 0.001 +70 0.059 0.001 +90 0.112 0.001 +5 -0.206 0.001 +30 -0.066 0.001 +45 0 0.001 +70 0.015 0.001 +90 -0.018 0.001 +5 -0.628 0.001 +30 -0.282 0.001 +45 0 0.001 +70 0.248 0.001 +90 0.437 0.001 +5 -0.87 0.001 +30 -0.374 0.001 +45 0 0.001 +70 0.305 0.001 +90 0.506 0.001 +5 -1.184 0.001 +30 -0.527 0.001 +45 0 0.001 +70 0.458 0.001 +90 0.794 0.001 +5 -1.46 0.001 +30 -0.65 0.001 +45 0 0.001 +70 0.565 0.001 +90 0.978 0.001 +5 -2.15 0.001 +30 -0.998 0.001 +45 0 0.001 +70 0.935 0.001 +90 1.696 0.001 +5 -1.077 0.001 +30 -0.425 0.001 +45 0 0.001 +70 0.281 0.001 +90 0.384 0.001 +5 -0.577 0.001 +30 -0.183 0.001 +45 0 0.001 +70 0.041 0.001 +90 -0.067 0.001 +5 0.048 0.001 +30 0.147 0.001 +45 0 0.001 +70 -0.331 0.001 +90 -0.809 0.001 +5 0.33 0.001 +30 0.244 0.001 +45 0 0.001 +70 -0.372 0.001 +90 -0.829 0.001 +5 0.812 0.001 +30 0.482 0.001 +45 0 0.001 +70 -0.616 0.001 +90 -1.298 0.001 +5 0.939 0.001 +30 0.511 0.001 +45 0 0.001 +70 -0.596 0.001 +90 -1.211 0.001 +5 1.136 0.001 +30 0.595 0.001 +45 0 0.001 +70 -0.663 0.001 +90 -1.322 0.001 +5 1.106 0.001 +30 0.546 0.001 +45 0 0.001 +70 -0.563 0.001 +90 -1.084 0.001 +5 1.112 0.001 +30 0.542 0.001 +45 0 0.001 +70 -0.549 0.001 +90 -1.049 0.001 +5 1.091 0.001 +30 0.506 0.001 +45 0 0.001 +70 -0.475 0.001 +90 -0.871 0.001 +5 0.92 0.001 +30 0.416 0.001 +45 0 0.001 +70 -0.372 0.001 +90 -0.667 0.001 +5 0.828 0.001 +30 0.348 0.001 +45 0 0.001 +70 -0.269 0.001 +90 -0.438 0.001 +5 0.579 0.001 +30 0.217 0.001 +45 0 0.001 +70 -0.123 0.001 +90 -0.148 0.001 +5 0.488 0.001 +30 0.157 0.001 +45 0 0.001 +70 -0.039 0.001 +90 0.032 0.001 +5 0.204 0.001 +30 0.015 0.001 +45 0 0.001 +70 0.11 0.001 +90 0.319 0.001 +5 0.091 0.001 +30 -0.038 0.001 +45 0 0.001 +70 0.16 0.001 +90 0.41 0.001 +5 -0.253 0.001 +30 -0.214 0.001 +45 0 0.001 +70 0.351 0.001 +90 0.785 0.001 +5 -0.426 0.001 +30 -0.278 0.001 +45 0 0.001 +70 0.386 0.001 +90 0.822 0.001 +5 -0.775 0.001 +30 -0.442 0.001 +45 0 0.001 +70 0.543 0.001 +90 1.113 0.001 +5 -0.859 0.001 +30 -0.431 0.001 +45 0 0.001 +70 0.455 0.001 +90 0.872 0.001 +5 -1.26 0.001 +30 -0.607 0.001 +45 0 0.001 +70 0.604 0.001 +90 1.128 0.001 +5 -1.171 0.001 +30 -0.492 0.001 +45 0 0.001 +70 0.383 0.001 +90 0.607 0.001 +5 -1.297 0.001 +30 -0.503 0.001 +45 0 0.001 +70 0.321 0.001 +90 0.418 0.001 +5 -1.095 0.001 +30 -0.279 0.001 +45 0 0.001 +70 -0.092 0.001 +90 -0.543 0.001 +5 -1.041 0.001 +30 -0.34 0.001 +45 0 0.001 +70 0.097 0.001 +90 -0.059 0.001 +5 -0.865 0.001 +30 -0.29 0.001 +45 0 0.001 +70 0.1 0.001 +90 0.001 0.001 +5 -0.781 0.001 +30 -0.292 0.001 +45 0 0.001 +70 0.165 0.001 +90 0.188 0.001 +5 -0.503 0.001 +30 -0.186 0.001 +45 0 0.001 +70 0.101 0.001 +90 0.111 0.001 +5 -0.485 0.001 +30 -0.234 0.001 +45 0 0.001 +70 0.235 0.001 +90 0.45 0.001 +5 -0.186 0.001 +30 -0.096 0.001 +45 0 0.001 +70 0.106 0.001 +90 0.219 0.001 +5 -0.241 0.001 +30 -0.17 0.001 +45 0 0.001 +70 0.249 0.001 +90 0.558 0.001 +5 0.021 0.001 +30 -0.036 0.001 +45 0 0.001 +70 0.105 0.001 +90 0.279 0.001 +5 -0.055 0.001 +30 -0.095 0.001 +45 0 0.001 +70 0.197 0.001 +90 0.485 0.001 +5 0.228 0.001 +30 0.057 0.001 +45 0 0.001 +70 0.022 0.001 +90 0.135 0.001 +5 0.038 0.001 +30 -0.053 0.001 +45 0 0.001 +70 0.16 0.001 +90 0.421 0.001 +5 0.227 0.001 +30 0.049 0.001 +45 0 0.001 +70 0.041 0.001 +90 0.181 0.001 +5 0.037 0.001 +30 -0.054 0.001 +45 0 0.001 +70 0.16 0.001 +90 0.421 0.001 +5 0.226 0.001 +30 0.056 0.001 +45 0 0.001 +70 0.022 0.001 +90 0.134 0.001 +5 -0.058 0.001 +30 -0.096 0.001 +45 0 0.001 +70 0.197 0.001 +90 0.485 0.001 +5 0.018 0.001 +30 -0.037 0.001 +45 0 0.001 +70 0.106 0.001 +90 0.279 0.001 +5 -0.245 0.001 +30 -0.171 0.001 +45 0 0.001 +70 0.249 0.001 +90 0.558 0.001 +5 -0.189 0.001 +30 -0.098 0.001 +45 0 0.001 +70 0.107 0.001 +90 0.22 0.001 +5 -0.488 0.001 +30 -0.236 0.001 +45 0 0.001 +70 0.236 0.001 +90 0.451 0.001 +5 -0.506 0.001 +30 -0.187 0.001 +45 0 0.001 +70 0.102 0.001 +90 0.112 0.001 +5 -0.784 0.001 +30 -0.293 0.001 +45 0 0.001 +70 0.166 0.001 +90 0.189 0.001 +5 -0.866 0.001 +30 -0.29 0.001 +45 0 0.001 +70 0.101 0.001 +90 0.003 0.001 +5 -1.042 0.001 +30 -0.34 0.001 +45 0 0.001 +70 0.098 0.001 +90 -0.057 0.001 +5 -1.096 0.001 +30 -0.28 0.001 +45 0 0.001 +70 -0.09 0.001 +90 -0.54 0.001 +5 -1.298 0.001 +30 -0.504 0.001 +45 0 0.001 +70 0.322 0.001 +90 0.421 0.001 +5 -1.171 0.001 +30 -0.493 0.001 +45 0 0.001 +70 0.384 0.001 +90 0.61 0.001 +5 -1.26 0.001 +30 -0.608 0.001 +45 0 0.001 +70 0.606 0.001 +90 1.132 0.001 +5 -0.859 0.001 +30 -0.431 0.001 +45 0 0.001 +70 0.456 0.001 +90 0.875 0.001 +5 -0.775 0.001 +30 -0.443 0.001 +45 0 0.001 +70 0.545 0.001 +90 1.117 0.001 +5 -0.426 0.001 +30 -0.278 0.001 +45 0 0.001 +70 0.387 0.001 +90 0.825 0.001 +5 -0.253 0.001 +30 -0.214 0.001 +45 0 0.001 +70 0.352 0.001 +90 0.787 0.001 +5 0.092 0.001 +30 -0.038 0.001 +45 0 0.001 +70 0.16 0.001 +90 0.412 0.001 +5 0.205 0.001 +30 0.015 0.001 +45 0 0.001 +70 0.11 0.001 +90 0.32 0.001 +5 0.488 0.001 +30 0.157 0.001 +45 0 0.001 +70 -0.039 0.001 +90 0.032 0.001 +5 0.579 0.001 +30 0.217 0.001 +45 0 0.001 +70 -0.123 0.001 +90 -0.149 0.001 +5 0.828 0.001 +30 0.348 0.001 +45 0 0.001 +70 -0.269 0.001 +90 -0.439 0.001 +5 0.918 0.001 +30 0.415 0.001 +45 0 0.001 +70 -0.372 0.001 +90 -0.667 0.001 +5 1.087 0.001 +30 0.505 0.001 +45 0 0.001 +70 -0.474 0.001 +90 -0.87 0.001 +5 1.107 0.001 +30 0.54 0.001 +45 0 0.001 +70 -0.548 0.001 +90 -1.046 0.001 +5 1.1 0.001 +30 0.543 0.001 +45 0 0.001 +70 -0.561 0.001 +90 -1.081 0.001 +5 1.129 0.001 +30 0.592 0.001 +45 0 0.001 +70 -0.66 0.001 +90 -1.317 0.001 +5 0.933 0.001 +30 0.508 0.001 +45 0 0.001 +70 -0.593 0.001 +90 -1.206 0.001 +5 0.805 0.001 +30 0.479 0.001 +45 0 0.001 +70 -0.614 0.001 +90 -1.292 0.001 +5 0.324 0.001 +30 0.242 0.001 +45 0 0.001 +70 -0.369 0.001 +90 -0.825 0.001 +5 0.044 0.001 +30 0.145 0.001 +45 0 0.001 +70 -0.329 0.001 +90 -0.805 0.001 +5 -0.579 0.001 +30 -0.185 0.001 +45 0 0.001 +70 0.042 0.001 +90 -0.065 0.001 +5 -1.078 0.001 +30 -0.425 0.001 +45 0 0.001 +70 0.282 0.001 +90 0.385 0.001 +5 -2.149 0.001 +30 -0.998 0.001 +45 0 0.001 +70 0.935 0.001 +90 1.694 0.001 +5 -1.458 0.001 +30 -0.648 0.001 +45 0 0.001 +70 0.563 0.001 +90 0.975 0.001 +5 -1.18 0.001 +30 -0.525 0.001 +45 0 0.001 +70 0.456 0.001 +90 0.79 0.001 +5 -0.865 0.001 +30 -0.372 0.001 +45 0 0.001 +70 0.302 0.001 +90 0.501 0.001 +5 -0.623 0.001 +30 -0.279 0.001 +45 0 0.001 +70 0.246 0.001 +90 0.432 0.001 +5 -0.2 0.001 +30 -0.063 0.001 +45 0 0.001 +70 0.012 0.001 +90 -0.023 0.001 +5 -0.13 0.001 +30 -0.06 0.001 +45 0 0.001 +70 0.056 0.001 +90 0.107 0.001 +5 0.195 0.001 +30 0.114 0.001 +45 0 0.001 +70 -0.144 0.001 +90 -0.293 0.001 +5 0.163 0.001 +30 0.068 0.001 +45 0 0.001 +70 -0.052 0.001 +90 -0.076 0.001 +5 0.296 0.001 +30 0.146 0.001 +45 0 0.001 +70 -0.15 0.001 +90 -0.28 0.001 +5 0.213 0.001 +30 0.071 0.001 +45 0 0.001 +70 -0.024 0.001 +90 0.01 0.001 +5 0.309 0.001 +30 0.143 0.001 +45 0 0.001 +70 -0.133 0.001 +90 -0.233 0.001 +5 -0.195 0.001 +30 -0.177 0.001 +45 0 0.001 +70 0.301 0.001 +90 0.7 0.001 +5 -0.346 0.001 +30 -0.212 0.001 +45 0 0.001 +70 0.279 0.001 +90 0.602 0.001 +5 -0.27 0.001 +30 -0.214 0.001 +45 0 0.001 +70 0.34 0.001 +90 0.775 0.001 +5 -0.429 0.001 +30 -0.241 0.001 +45 0 0.001 +70 0.291 0.001 +90 0.607 0.001 +5 -0.417 0.001 +30 -0.261 0.001 +45 0 0.001 +70 0.351 0.001 +90 0.758 0.001 +5 -0.646 0.001 +30 -0.325 0.001 +45 0 0.001 +70 0.346 0.001 +90 0.678 0.001 +5 -0.813 0.001 +30 -0.436 0.001 +45 0 0.001 +70 0.501 0.001 +90 1.014 0.001 +5 -1.116 0.001 +30 -0.535 0.001 +45 0 0.001 +70 0.529 0.001 +90 0.995 0.001 +5 -1.337 0.001 +30 -0.666 0.001 +45 0 0.001 +70 0.696 0.001 +90 1.344 0.001 +5 -1.755 0.001 +30 -0.825 0.001 +45 0 0.001 +70 0.791 0.001 +90 1.457 0.001 +5 -1.831 0.001 +30 -0.875 0.001 +45 0 0.001 +70 0.859 0.001 +90 1.602 0.001 +5 -2.278 0.001 +30 -1.057 0.001 +45 0 0.001 +70 0.991 0.001 +90 1.801 0.001 +5 -2.259 0.001 +30 -1.068 0.001 +45 0 0.001 +70 1.031 0.001 +90 1.902 0.001 +5 -2.002 0.001 +30 -0.91 0.001 +45 0 0.001 +70 0.824 0.001 +90 1.464 0.001 +5 -1.188 0.001 +30 -0.522 0.001 +45 0 0.001 +70 0.445 0.001 +90 0.758 0.001 +5 -0.733 0.001 +30 -0.255 0.001 +45 0 0.001 +70 0.106 0.001 +90 0.049 0.001 +5 -0.156 0.001 +30 -0.018 0.001 +45 0 0.001 +70 -0.067 0.001 +90 -0.215 0.001 +5 0.183 0.001 +30 0.169 0.001 +45 0 0.001 +70 -0.29 0.001 +90 -0.669 0.001 +5 0.598 0.001 +30 0.323 0.001 +45 0 0.001 +70 -0.375 0.001 +90 -0.762 0.001 +5 0.685 0.001 +30 0.372 0.001 +45 0 0.001 +70 -0.433 0.001 +90 -0.882 0.001 +5 0.957 0.001 +30 0.454 0.001 +45 0 0.001 +70 -0.442 0.001 +90 -0.826 0.001 +5 0.861 0.001 +30 0.419 0.001 +45 0 0.001 +70 -0.422 0.001 +90 -0.807 0.001 +5 1.113 0.001 +30 0.5 0.001 +45 0 0.001 +70 -0.444 0.001 +90 -0.789 0.001 +5 0.813 0.001 +30 0.367 0.001 +45 0 0.001 +70 -0.328 0.001 +90 -0.59 0.001 +5 0.952 0.001 +30 0.399 0.001 +45 0 0.001 +70 -0.307 0.001 +90 -0.497 0.001 +5 0.553 0.001 +30 0.218 0.001 +45 0 0.001 +70 -0.144 0.001 +90 -0.208 0.001 +5 0.667 0.001 +30 0.247 0.001 +45 0 0.001 +70 -0.133 0.001 +90 -0.15 0.001 +5 0.206 0.001 +30 0.045 0.001 +45 0 0.001 +70 0.036 0.001 +90 0.137 0.001 +5 0.271 0.001 +30 0.071 0.001 +45 0 0.001 +70 0.019 0.001 +90 0.114 0.001 +5 -0.261 0.001 +30 -0.167 0.001 +45 0 0.001 +70 0.229 0.001 +90 0.48 0.001 +5 -0.255 0.001 +30 -0.154 0.001 +45 0 0.001 +70 0.199 0.001 +90 0.41 0.001 +5 -0.777 0.001 +30 -0.374 0.001 +45 0 0.001 +70 0.371 0.001 +90 0.686 0.001 +5 -0.667 0.001 +30 -0.281 0.001 +45 0 0.001 +70 0.22 0.001 +90 0.343 0.001 +5 -1.172 0.001 +30 -0.476 0.001 +45 0 0.001 +70 0.342 0.001 +90 0.502 0.001 +5 -0.876 0.001 +30 -0.276 0.001 +45 0 0.001 +70 0.057 0.001 +90 -0.116 0.001 +5 -1.112 0.001 +30 -0.308 0.001 +45 0 0.001 +70 -0.033 0.001 +90 -0.407 0.001 +5 -0.88 0.001 +30 -0.166 0.001 +45 0 0.001 +70 -0.218 0.001 +90 -0.795 0.001 +5 -1.025 0.001 +30 -0.247 0.001 +45 0 0.001 +70 -0.121 0.001 +90 -0.595 0.001 +5 -0.609 0.001 +30 -0.097 0.001 +45 0 0.001 +70 -0.197 0.001 +90 -0.661 0.001 +5 -0.676 0.001 +30 -0.148 0.001 +45 0 0.001 +70 -0.117 0.001 +90 -0.481 0.001 +5 -0.187 0.001 +30 0.043 0.001 +45 0 0.001 +70 -0.242 0.001 +90 -0.648 0.001 +5 -0.315 0.001 +30 -0.057 0.001 +45 0 0.001 +70 -0.084 0.001 +90 -0.293 0.001 +5 0.184 0.001 +30 0.154 0.001 +45 0 0.001 +70 -0.252 0.001 +90 -0.562 0.001 +5 -0.011 0.001 +30 0.027 0.001 +45 0 0.001 +70 -0.077 0.001 +90 -0.184 0.001 +5 0.455 0.001 +30 0.233 0.001 +45 0 0.001 +70 -0.252 0.001 +90 -0.483 0.001 +5 0.24 0.001 +30 0.12 0.001 +45 0 0.001 +70 -0.126 0.001 +90 -0.231 0.001 +5 0.716 0.001 +30 0.341 0.001 +45 0 0.001 +70 -0.334 0.001 +90 -0.608 0.001 +5 0.369 0.001 +30 0.171 0.001 +45 0 0.001 +70 -0.161 0.001 +90 -0.279 0.001 +5 0.73 0.001 +30 0.337 0.001 +45 0 0.001 +70 -0.314 0.001 +90 -0.555 0.001 +5 0.368 0.001 +30 0.171 0.001 +45 0 0.001 +70 -0.161 0.001 +90 -0.279 0.001 +5 0.715 0.001 +30 0.341 0.001 +45 0 0.001 +70 -0.334 0.001 +90 -0.609 0.001 +5 0.238 0.001 +30 0.119 0.001 +45 0 0.001 +70 -0.126 0.001 +90 -0.232 0.001 +5 0.452 0.001 +30 0.232 0.001 +45 0 0.001 +70 -0.252 0.001 +90 -0.484 0.001 +5 -0.014 0.001 +30 0.026 0.001 +45 0 0.001 +70 -0.076 0.001 +90 -0.184 0.001 +5 0.181 0.001 +30 0.153 0.001 +45 0 0.001 +70 -0.251 0.001 +90 -0.562 0.001 +5 -0.318 0.001 +30 -0.058 0.001 +45 0 0.001 +70 -0.084 0.001 +90 -0.293 0.001 +5 -0.189 0.001 +30 0.042 0.001 +45 0 0.001 +70 -0.242 0.001 +90 -0.648 0.001 +5 -0.677 0.001 +30 -0.149 0.001 +45 0 0.001 +70 -0.117 0.001 +90 -0.481 0.001 +5 -0.609 0.001 +30 -0.097 0.001 +45 0 0.001 +70 -0.197 0.001 +90 -0.661 0.001 +5 -1.025 0.001 +30 -0.248 0.001 +45 0 0.001 +70 -0.12 0.001 +90 -0.594 0.001 +5 -0.879 0.001 +30 -0.166 0.001 +45 0 0.001 +70 -0.217 0.001 +90 -0.793 0.001 +5 -1.111 0.001 +30 -0.308 0.001 +45 0 0.001 +70 -0.033 0.001 +90 -0.406 0.001 +5 -0.874 0.001 +30 -0.276 0.001 +45 0 0.001 +70 0.058 0.001 +90 -0.115 0.001 +5 -1.17 0.001 +30 -0.476 0.001 +45 0 0.001 +70 0.343 0.001 +90 0.504 0.001 +5 -0.665 0.001 +30 -0.28 0.001 +45 0 0.001 +70 0.22 0.001 +90 0.345 0.001 +5 -0.775 0.001 +30 -0.373 0.001 +45 0 0.001 +70 0.371 0.001 +90 0.687 0.001 +5 -0.252 0.001 +30 -0.153 0.001 +45 0 0.001 +70 0.199 0.001 +90 0.41 0.001 +5 -0.258 0.001 +30 -0.166 0.001 +45 0 0.001 +70 0.228 0.001 +90 0.48 0.001 +5 0.275 0.001 +30 0.072 0.001 +45 0 0.001 +70 0.018 0.001 +90 0.113 0.001 +5 0.209 0.001 +30 0.047 0.001 +45 0 0.001 +70 0.035 0.001 +90 0.134 0.001 +5 0.67 0.001 +30 0.248 0.001 +45 0 0.001 +70 -0.135 0.001 +90 -0.154 0.001 +5 0.556 0.001 +30 0.219 0.001 +45 0 0.001 +70 -0.145 0.001 +90 -0.212 0.001 +5 0.954 0.001 +30 0.4 0.001 +45 0 0.001 +70 -0.309 0.001 +90 -0.501 0.001 +5 0.813 0.001 +30 0.368 0.001 +45 0 0.001 +70 -0.33 0.001 +90 -0.593 0.001 +5 1.112 0.001 +30 0.5 0.001 +45 0 0.001 +70 -0.445 0.001 +90 -0.791 0.001 +5 0.859 0.001 +30 0.418 0.001 +45 0 0.001 +70 -0.422 0.001 +90 -0.807 0.001 +5 0.953 0.001 +30 0.453 0.001 +45 0 0.001 +70 -0.441 0.001 +90 -0.826 0.001 +5 0.681 0.001 +30 0.37 0.001 +45 0 0.001 +70 -0.432 0.001 +90 -0.88 0.001 +5 0.593 0.001 +30 0.322 0.001 +45 0 0.001 +70 -0.374 0.001 +90 -0.76 0.001 +5 0.178 0.001 +30 0.167 0.001 +45 0 0.001 +70 -0.288 0.001 +90 -0.666 0.001 +5 -0.159 0.001 +30 -0.02 0.001 +45 0 0.001 +70 -0.066 0.001 +90 -0.212 0.001 +5 -0.736 0.001 +30 -0.256 0.001 +45 0 0.001 +70 0.107 0.001 +90 0.05 0.001 +5 -1.189 0.001 +30 -0.523 0.001 +45 0 0.001 +70 0.445 0.001 +90 0.758 0.001 +5 -2 0.001 +30 -0.91 0.001 +45 0 0.001 +70 0.823 0.001 +90 1.462 0.001 +5 -2.257 0.001 +30 -1.066 0.001 +45 0 0.001 +70 1.029 0.001 +90 1.899 0.001 +5 -2.273 0.001 +30 -1.055 0.001 +45 0 0.001 +70 0.989 0.001 +90 1.796 0.001 +5 -1.825 0.001 +30 -0.872 0.001 +45 0 0.001 +70 0.856 0.001 +90 1.597 0.001 +5 -1.748 0.001 +30 -0.822 0.001 +45 0 0.001 +70 0.788 0.001 +90 1.451 0.001 +5 -1.329 0.001 +30 -0.663 0.001 +45 0 0.001 +70 0.693 0.001 +90 1.337 0.001 +5 -1.109 0.001 +30 -0.532 0.001 +45 0 0.001 +70 0.526 0.001 +90 0.988 0.001 +5 -0.805 0.001 +30 -0.433 0.001 +45 0 0.001 +70 0.498 0.001 +90 1.008 0.001 +5 -0.638 0.001 +30 -0.322 0.001 +45 0 0.001 +70 0.342 0.001 +90 0.672 0.001 +5 -0.41 0.001 +30 -0.258 0.001 +45 0 0.001 +70 0.348 0.001 +90 0.752 0.001 +5 -0.423 0.001 +30 -0.238 0.001 +45 0 0.001 +70 0.289 0.001 +90 0.602 0.001 +5 -0.265 0.001 +30 -0.212 0.001 +45 0 0.001 +70 0.338 0.001 +90 0.771 0.001 +5 -0.344 0.001 +30 -0.211 0.001 +45 0 0.001 +70 0.278 0.001 +90 0.6 0.001 +5 -0.384 0.001 +30 -0.361 0.001 +45 0 0.001 +70 0.625 0.001 +90 1.451 0.001 +5 -0.449 0.001 +30 -0.352 0.001 +45 0 0.001 +70 0.554 0.001 +90 1.257 0.001 +5 -0.486 0.001 +30 -0.412 0.001 +45 0 0.001 +70 0.676 0.001 +90 1.547 0.001 +5 -0.578 0.001 +30 -0.401 0.001 +45 0 0.001 +70 0.584 0.001 +90 1.293 0.001 +5 -0.696 0.001 +30 -0.486 0.001 +45 0 0.001 +70 0.71 0.001 +90 1.569 0.001 +5 -0.857 0.001 +30 -0.513 0.001 +45 0 0.001 +70 0.661 0.001 +90 1.401 0.001 +5 -1.158 0.001 +30 -0.689 0.001 +45 0 0.001 +70 0.882 0.001 +90 1.86 0.001 +5 -1.372 0.001 +30 -0.74 0.001 +45 0 0.001 +70 0.855 0.001 +90 1.732 0.001 +5 -1.702 0.001 +30 -0.922 0.001 +45 0 0.001 +70 1.071 0.001 +90 2.17 0.001 +5 -1.994 0.001 +30 -1.017 0.001 +45 0 0.001 +70 1.096 0.001 +90 2.146 0.001 +5 -2.133 0.001 +30 -1.092 0.001 +45 0 0.001 +70 1.183 0.001 +90 2.321 0.001 +5 -2.431 0.001 +30 -1.199 0.001 +45 0 0.001 +70 1.234 0.001 +90 2.36 0.001 +5 -2.486 0.001 +30 -1.24 0.001 +45 0 0.001 +70 1.297 0.001 +90 2.498 0.001 +5 -2.111 0.001 +30 -1.029 0.001 +45 0 0.001 +70 1.041 0.001 +90 1.971 0.001 +5 -1.342 0.001 +30 -0.658 0.001 +45 0 0.001 +70 0.672 0.001 +90 1.278 0.001 +5 -0.774 0.001 +30 -0.337 0.001 +45 0 0.001 +70 0.282 0.001 +90 0.475 0.001 +5 -0.24 0.001 +30 -0.12 0.001 +45 0 0.001 +70 0.125 0.001 +90 0.238 0.001 +5 0.236 0.001 +30 0.133 0.001 +45 0 0.001 +70 -0.161 0.001 +90 -0.333 0.001 +5 0.658 0.001 +30 0.295 0.001 +45 0 0.001 +70 -0.261 0.001 +90 -0.462 0.001 +5 0.886 0.001 +30 0.41 0.001 +45 0 0.001 +70 -0.384 0.001 +90 -0.701 0.001 +5 1.182 0.001 +30 0.509 0.001 +45 0 0.001 +70 -0.417 0.001 +90 -0.7 0.001 +5 1.211 0.001 +30 0.533 0.001 +45 0 0.001 +70 -0.455 0.001 +90 -0.787 0.001 +5 1.486 0.001 +30 0.632 0.001 +45 0 0.001 +70 -0.504 0.001 +90 -0.83 0.001 +5 1.287 0.001 +30 0.547 0.001 +45 0 0.001 +70 -0.436 0.001 +90 -0.72 0.001 +5 1.43 0.001 +30 0.589 0.001 +45 0 0.001 +70 -0.436 0.001 +90 -0.681 0.001 +5 1.104 0.001 +30 0.445 0.001 +45 0 0.001 +70 -0.312 0.001 +90 -0.468 0.001 +5 1.198 0.001 +30 0.475 0.001 +45 0 0.001 +70 -0.319 0.001 +90 -0.458 0.001 +5 0.792 0.001 +30 0.303 0.001 +45 0 0.001 +70 -0.184 0.001 +90 -0.24 0.001 +5 0.823 0.001 +30 0.325 0.001 +45 0 0.001 +70 -0.217 0.001 +90 -0.312 0.001 +5 0.337 0.001 +30 0.112 0.001 +45 0 0.001 +70 -0.036 0.001 +90 -0.005 0.001 +5 0.301 0.001 +30 0.12 0.001 +45 0 0.001 +70 -0.082 0.001 +90 -0.129 0.001 +5 -0.173 0.001 +30 -0.076 0.001 +45 0 0.001 +70 0.065 0.001 +90 0.101 0.001 +5 -0.102 0.001 +30 0.012 0.001 +45 0 0.001 +70 -0.103 0.001 +90 -0.294 0.001 +5 -0.568 0.001 +30 -0.171 0.001 +45 0 0.001 +70 0.016 0.001 +90 -0.133 0.001 +5 -0.307 0.001 +30 0.024 0.001 +45 0 0.001 +70 -0.28 0.001 +90 -0.79 0.001 +5 -0.482 0.001 +30 0.016 0.001 +45 0 0.001 +70 -0.386 0.001 +90 -1.1 0.001 +5 -0.294 0.001 +30 0.147 0.001 +45 0 0.001 +70 -0.577 0.001 +90 -1.517 0.001 +5 -0.372 0.001 +30 0.09 0.001 +45 0 0.001 +70 -0.492 0.001 +90 -1.327 0.001 +5 0.053 0.001 +30 0.262 0.001 +45 0 0.001 +70 -0.612 0.001 +90 -1.502 0.001 +5 0.047 0.001 +30 0.232 0.001 +45 0 0.001 +70 -0.543 0.001 +90 -1.331 0.001 +5 0.547 0.001 +30 0.443 0.001 +45 0 0.001 +70 -0.708 0.001 +90 -1.593 0.001 +5 0.466 0.001 +30 0.351 0.001 +45 0 0.001 +70 -0.54 0.001 +90 -1.199 0.001 +5 0.992 0.001 +30 0.586 0.001 +45 0 0.001 +70 -0.745 0.001 +90 -1.554 0.001 +5 0.832 0.001 +30 0.46 0.001 +45 0 0.001 +70 -0.547 0.001 +90 -1.108 0.001 +5 1.327 0.001 +30 0.687 0.001 +45 0 0.001 +70 -0.756 0.001 +90 -1.481 0.001 +5 1.135 0.001 +30 0.569 0.001 +45 0 0.001 +70 -0.602 0.001 +90 -1.154 0.001 +5 1.635 0.001 +30 0.81 0.001 +45 0 0.001 +70 -0.842 0.001 +90 -1.602 0.001 +5 1.295 0.001 +30 0.63 0.001 +45 0 0.001 +70 -0.638 0.001 +90 -1.195 0.001 +5 1.664 0.001 +30 0.811 0.001 +45 0 0.001 +70 -0.821 0.001 +90 -1.542 0.001 +5 1.294 0.001 +30 0.63 0.001 +45 0 0.001 +70 -0.638 0.001 +90 -1.196 0.001 +5 1.634 0.001 +30 0.81 0.001 +45 0 0.001 +70 -0.842 0.001 +90 -1.603 0.001 +5 1.133 0.001 +30 0.569 0.001 +45 0 0.001 +70 -0.602 0.001 +90 -1.155 0.001 +5 1.324 0.001 +30 0.686 0.001 +45 0 0.001 +70 -0.756 0.001 +90 -1.482 0.001 +5 0.83 0.001 +30 0.459 0.001 +45 0 0.001 +70 -0.547 0.001 +90 -1.108 0.001 +5 0.989 0.001 +30 0.585 0.001 +45 0 0.001 +70 -0.745 0.001 +90 -1.554 0.001 +5 0.464 0.001 +30 0.351 0.001 +45 0 0.001 +70 -0.54 0.001 +90 -1.199 0.001 +5 0.546 0.001 +30 0.442 0.001 +45 0 0.001 +70 -0.708 0.001 +90 -1.594 0.001 +5 0.047 0.001 +30 0.232 0.001 +45 0 0.001 +70 -0.544 0.001 +90 -1.332 0.001 +5 0.053 0.001 +30 0.262 0.001 +45 0 0.001 +70 -0.613 0.001 +90 -1.503 0.001 +5 -0.37 0.001 +30 0.091 0.001 +45 0 0.001 +70 -0.492 0.001 +90 -1.328 0.001 +5 -0.292 0.001 +30 0.148 0.001 +45 0 0.001 +70 -0.577 0.001 +90 -1.518 0.001 +5 -0.479 0.001 +30 0.017 0.001 +45 0 0.001 +70 -0.387 0.001 +90 -1.101 0.001 +5 -0.303 0.001 +30 0.026 0.001 +45 0 0.001 +70 -0.281 0.001 +90 -0.79 0.001 +5 -0.564 0.001 +30 -0.169 0.001 +45 0 0.001 +70 0.015 0.001 +90 -0.133 0.001 +5 -0.097 0.001 +30 0.014 0.001 +45 0 0.001 +70 -0.104 0.001 +90 -0.295 0.001 +5 -0.167 0.001 +30 -0.074 0.001 +45 0 0.001 +70 0.064 0.001 +90 0.099 0.001 +5 0.307 0.001 +30 0.123 0.001 +45 0 0.001 +70 -0.084 0.001 +90 -0.132 0.001 +5 0.344 0.001 +30 0.115 0.001 +45 0 0.001 +70 -0.039 0.001 +90 -0.009 0.001 +5 0.83 0.001 +30 0.328 0.001 +45 0 0.001 +70 -0.22 0.001 +90 -0.317 0.001 +5 0.799 0.001 +30 0.306 0.001 +45 0 0.001 +70 -0.187 0.001 +90 -0.246 0.001 +5 1.205 0.001 +30 0.478 0.001 +45 0 0.001 +70 -0.323 0.001 +90 -0.466 0.001 +5 1.11 0.001 +30 0.448 0.001 +45 0 0.001 +70 -0.316 0.001 +90 -0.476 0.001 +5 1.435 0.001 +30 0.592 0.001 +45 0 0.001 +70 -0.44 0.001 +90 -0.689 0.001 +5 1.29 0.001 +30 0.55 0.001 +45 0 0.001 +70 -0.44 0.001 +90 -0.728 0.001 +5 1.488 0.001 +30 0.634 0.001 +45 0 0.001 +70 -0.507 0.001 +90 -0.836 0.001 +5 1.212 0.001 +30 0.534 0.001 +45 0 0.001 +70 -0.457 0.001 +90 -0.791 0.001 +5 1.181 0.001 +30 0.51 0.001 +45 0 0.001 +70 -0.418 0.001 +90 -0.703 0.001 +5 0.885 0.001 +30 0.41 0.001 +45 0 0.001 +70 -0.384 0.001 +90 -0.702 0.001 +5 0.656 0.001 +30 0.295 0.001 +45 0 0.001 +70 -0.262 0.001 +90 -0.463 0.001 +5 0.234 0.001 +30 0.132 0.001 +45 0 0.001 +70 -0.16 0.001 +90 -0.333 0.001 +5 -0.242 0.001 +30 -0.12 0.001 +45 0 0.001 +70 0.125 0.001 +90 0.238 0.001 +5 -0.774 0.001 +30 -0.337 0.001 +45 0 0.001 +70 0.282 0.001 +90 0.474 0.001 +5 -1.341 0.001 +30 -0.658 0.001 +45 0 0.001 +70 0.671 0.001 +90 1.275 0.001 +5 -2.108 0.001 +30 -1.027 0.001 +45 0 0.001 +70 1.039 0.001 +90 1.967 0.001 +5 -2.482 0.001 +30 -1.238 0.001 +45 0 0.001 +70 1.294 0.001 +90 2.493 0.001 +5 -2.424 0.001 +30 -1.196 0.001 +45 0 0.001 +70 1.231 0.001 +90 2.353 0.001 +5 -2.125 0.001 +30 -1.088 0.001 +45 0 0.001 +70 1.179 0.001 +90 2.313 0.001 +5 -1.985 0.001 +30 -1.013 0.001 +45 0 0.001 +70 1.092 0.001 +90 2.138 0.001 +5 -1.692 0.001 +30 -0.918 0.001 +45 0 0.001 +70 1.067 0.001 +90 2.162 0.001 +5 -1.362 0.001 +30 -0.735 0.001 +45 0 0.001 +70 0.851 0.001 +90 1.723 0.001 +5 -1.148 0.001 +30 -0.684 0.001 +45 0 0.001 +70 0.877 0.001 +90 1.852 0.001 +5 -0.848 0.001 +30 -0.509 0.001 +45 0 0.001 +70 0.657 0.001 +90 1.394 0.001 +5 -0.687 0.001 +30 -0.482 0.001 +45 0 0.001 +70 0.706 0.001 +90 1.563 0.001 +5 -0.571 0.001 +30 -0.398 0.001 +45 0 0.001 +70 0.581 0.001 +90 1.287 0.001 +5 -0.481 0.001 +30 -0.409 0.001 +45 0 0.001 +70 0.673 0.001 +90 1.543 0.001 +5 -0.447 0.001 +30 -0.351 0.001 +45 0 0.001 +70 0.553 0.001 +90 1.255 0.001 +5 -0.674 0.001 +30 -0.602 0.001 +45 0 0.001 +70 1.015 0.001 +90 2.338 0.001 +5 -0.824 0.001 +30 -0.623 0.001 +45 0 0.001 +70 0.961 0.001 +90 2.16 0.001 +5 -0.808 0.001 +30 -0.666 0.001 +45 0 0.001 +70 1.078 0.001 +90 2.455 0.001 +5 -1.014 0.001 +30 -0.7 0.001 +45 0 0.001 +70 1.015 0.001 +90 2.239 0.001 +5 -1.105 0.001 +30 -0.78 0.001 +45 0 0.001 +70 1.147 0.001 +90 2.538 0.001 +5 -1.385 0.001 +30 -0.852 0.001 +45 0 0.001 +70 1.127 0.001 +90 2.406 0.001 +5 -1.655 0.001 +30 -1.02 0.001 +45 0 0.001 +70 1.348 0.001 +90 2.876 0.001 +5 -1.96 0.001 +30 -1.103 0.001 +45 0 0.001 +70 1.335 0.001 +90 2.753 0.001 +5 -2.219 0.001 +30 -1.255 0.001 +45 0 0.001 +70 1.528 0.001 +90 3.157 0.001 +5 -2.546 0.001 +30 -1.352 0.001 +45 0 0.001 +70 1.535 0.001 +90 3.076 0.001 +5 -2.551 0.001 +30 -1.367 0.001 +45 0 0.001 +70 1.566 0.001 +90 3.15 0.001 +5 -2.789 0.001 +30 -1.432 0.001 +45 0 0.001 +70 1.556 0.001 +90 3.056 0.001 +5 -2.721 0.001 +30 -1.415 0.001 +45 0 0.001 +70 1.563 0.001 +90 3.091 0.001 +5 -2.447 0.001 +30 -1.257 0.001 +45 0 0.001 +70 1.367 0.001 +90 2.684 0.001 +5 -1.629 0.001 +30 -0.864 0.001 +45 0 0.001 +70 0.979 0.001 +90 1.957 0.001 +5 -1.108 0.001 +30 -0.556 0.001 +45 0 0.001 +70 0.586 0.001 +90 1.134 0.001 +5 -0.44 0.001 +30 -0.278 0.001 +45 0 0.001 +70 0.375 0.001 +90 0.802 0.001 +5 0.036 0.001 +30 -0.015 0.001 +45 0 0.001 +70 0.064 0.001 +90 0.167 0.001 +5 0.627 0.001 +30 0.223 0.001 +45 0 0.001 +70 -0.105 0.001 +90 -0.083 0.001 +5 0.877 0.001 +30 0.359 0.001 +45 0 0.001 +70 -0.263 0.001 +90 -0.403 0.001 +5 1.358 0.001 +30 0.542 0.001 +45 0 0.001 +70 -0.371 0.001 +90 -0.535 0.001 +5 1.397 0.001 +30 0.58 0.001 +45 0 0.001 +70 -0.438 0.001 +90 -0.692 0.001 +5 1.841 0.001 +30 0.756 0.001 +45 0 0.001 +70 -0.556 0.001 +90 -0.856 0.001 +5 1.62 0.001 +30 0.672 0.001 +45 0 0.001 +70 -0.506 0.001 +90 -0.799 0.001 +5 1.901 0.001 +30 0.777 0.001 +45 0 0.001 +70 -0.566 0.001 +90 -0.865 0.001 +5 1.523 0.001 +30 0.621 0.001 +45 0 0.001 +70 -0.451 0.001 +90 -0.69 0.001 +5 1.727 0.001 +30 0.704 0.001 +45 0 0.001 +70 -0.51 0.001 +90 -0.778 0.001 +5 1.244 0.001 +30 0.512 0.001 +45 0 0.001 +70 -0.379 0.001 +90 -0.593 0.001 +5 1.365 0.001 +30 0.58 0.001 +45 0 0.001 +70 -0.461 0.001 +90 -0.762 0.001 +5 0.794 0.001 +30 0.344 0.001 +45 0 0.001 +70 -0.285 0.001 +90 -0.49 0.001 +5 0.845 0.001 +30 0.398 0.001 +45 0 0.001 +70 -0.382 0.001 +90 -0.716 0.001 +5 0.293 0.001 +30 0.18 0.001 +45 0 0.001 +70 -0.237 0.001 +90 -0.515 0.001 +5 0.459 0.001 +30 0.315 0.001 +45 0 0.001 +70 -0.454 0.001 +90 -1.005 0.001 +5 -0.067 0.001 +30 0.116 0.001 +45 0 0.001 +70 -0.338 0.001 +90 -0.867 0.001 +5 0.3 0.001 +30 0.358 0.001 +45 0 0.001 +70 -0.675 0.001 +90 -1.594 0.001 +5 0.11 0.001 +30 0.346 0.001 +45 0 0.001 +70 -0.783 0.001 +90 -1.915 0.001 +5 0.3 0.001 +30 0.464 0.001 +45 0 0.001 +70 -0.939 0.001 +90 -2.244 0.001 +5 0.193 0.001 +30 0.404 0.001 +45 0 0.001 +70 -0.867 0.001 +90 -2.096 0.001 +5 0.719 0.001 +30 0.633 0.001 +45 0 0.001 +70 -1.058 0.001 +90 -2.414 0.001 +5 0.665 0.001 +30 0.592 0.001 +45 0 0.001 +70 -0.996 0.001 +90 -2.276 0.001 +5 1.306 0.001 +30 0.869 0.001 +45 0 0.001 +70 -1.224 0.001 +90 -2.654 0.001 +5 1.176 0.001 +30 0.76 0.001 +45 0 0.001 +70 -1.046 0.001 +90 -2.249 0.001 +5 1.838 0.001 +30 1.052 0.001 +45 0 0.001 +70 -1.296 0.001 +90 -2.676 0.001 +5 1.626 0.001 +30 0.901 0.001 +45 0 0.001 +70 -1.074 0.001 +90 -2.186 0.001 +5 2.255 0.001 +30 1.181 0.001 +45 0 0.001 +70 -1.319 0.001 +90 -2.611 0.001 +5 1.997 0.001 +30 1.032 0.001 +45 0 0.001 +70 -1.135 0.001 +90 -2.226 0.001 +5 2.619 0.001 +30 1.321 0.001 +45 0 0.001 +70 -1.406 0.001 +90 -2.717 0.001 +5 2.195 0.001 +30 1.104 0.001 +45 0 0.001 +70 -1.171 0.001 +90 -2.257 0.001 +5 2.668 0.001 +30 1.327 0.001 +45 0 0.001 +70 -1.386 0.001 +90 -2.652 0.001 +5 2.194 0.001 +30 1.104 0.001 +45 0 0.001 +70 -1.171 0.001 +90 -2.257 0.001 +5 2.618 0.001 +30 1.321 0.001 +45 0 0.001 +70 -1.406 0.001 +90 -2.718 0.001 +5 1.995 0.001 +30 1.032 0.001 +45 0 0.001 +70 -1.135 0.001 +90 -2.227 0.001 +5 2.252 0.001 +30 1.181 0.001 +45 0 0.001 +70 -1.32 0.001 +90 -2.612 0.001 +5 1.623 0.001 +30 0.9 0.001 +45 0 0.001 +70 -1.075 0.001 +90 -2.188 0.001 +5 1.836 0.001 +30 1.051 0.001 +45 0 0.001 +70 -1.297 0.001 +90 -2.677 0.001 +5 1.175 0.001 +30 0.76 0.001 +45 0 0.001 +70 -1.047 0.001 +90 -2.251 0.001 +5 1.306 0.001 +30 0.869 0.001 +45 0 0.001 +70 -1.225 0.001 +90 -2.656 0.001 +5 0.666 0.001 +30 0.593 0.001 +45 0 0.001 +70 -0.997 0.001 +90 -2.278 0.001 +5 0.721 0.001 +30 0.634 0.001 +45 0 0.001 +70 -1.059 0.001 +90 -2.417 0.001 +5 0.196 0.001 +30 0.406 0.001 +45 0 0.001 +70 -0.868 0.001 +90 -2.098 0.001 +5 0.305 0.001 +30 0.466 0.001 +45 0 0.001 +70 -0.94 0.001 +90 -2.247 0.001 +5 0.116 0.001 +30 0.349 0.001 +45 0 0.001 +70 -0.785 0.001 +90 -1.918 0.001 +5 0.307 0.001 +30 0.361 0.001 +45 0 0.001 +70 -0.677 0.001 +90 -1.597 0.001 +5 -0.059 0.001 +30 0.119 0.001 +45 0 0.001 +70 -0.34 0.001 +90 -0.871 0.001 +5 0.468 0.001 +30 0.319 0.001 +45 0 0.001 +70 -0.457 0.001 +90 -1.009 0.001 +5 0.302 0.001 +30 0.184 0.001 +45 0 0.001 +70 -0.24 0.001 +90 -0.521 0.001 +5 0.855 0.001 +30 0.402 0.001 +45 0 0.001 +70 -0.386 0.001 +90 -0.722 0.001 +5 0.805 0.001 +30 0.349 0.001 +45 0 0.001 +70 -0.289 0.001 +90 -0.498 0.001 +5 1.376 0.001 +30 0.585 0.001 +45 0 0.001 +70 -0.466 0.001 +90 -0.772 0.001 +5 1.255 0.001 +30 0.517 0.001 +45 0 0.001 +70 -0.384 0.001 +90 -0.604 0.001 +5 1.738 0.001 +30 0.71 0.001 +45 0 0.001 +70 -0.516 0.001 +90 -0.79 0.001 +5 1.533 0.001 +30 0.627 0.001 +45 0 0.001 +70 -0.457 0.001 +90 -0.702 0.001 +5 1.91 0.001 +30 0.782 0.001 +45 0 0.001 +70 -0.572 0.001 +90 -0.877 0.001 +5 1.627 0.001 +30 0.676 0.001 +45 0 0.001 +70 -0.512 0.001 +90 -0.81 0.001 +5 1.846 0.001 +30 0.759 0.001 +45 0 0.001 +70 -0.561 0.001 +90 -0.866 0.001 +5 1.4 0.001 +30 0.583 0.001 +45 0 0.001 +70 -0.442 0.001 +90 -0.7 0.001 +5 1.36 0.001 +30 0.544 0.001 +45 0 0.001 +70 -0.375 0.001 +90 -0.542 0.001 +5 0.878 0.001 +30 0.36 0.001 +45 0 0.001 +70 -0.265 0.001 +90 -0.408 0.001 +5 0.628 0.001 +30 0.225 0.001 +45 0 0.001 +70 -0.107 0.001 +90 -0.088 0.001 +5 0.036 0.001 +30 -0.014 0.001 +45 0 0.001 +70 0.062 0.001 +90 0.163 0.001 +5 -0.439 0.001 +30 -0.277 0.001 +45 0 0.001 +70 0.373 0.001 +90 0.798 0.001 +5 -1.106 0.001 +30 -0.555 0.001 +45 0 0.001 +70 0.585 0.001 +90 1.13 0.001 +5 -1.626 0.001 +30 -0.862 0.001 +45 0 0.001 +70 0.976 0.001 +90 1.951 0.001 +5 -2.441 0.001 +30 -1.254 0.001 +45 0 0.001 +70 1.364 0.001 +90 2.678 0.001 +5 -2.714 0.001 +30 -1.411 0.001 +45 0 0.001 +70 1.559 0.001 +90 3.084 0.001 +5 -2.781 0.001 +30 -1.427 0.001 +45 0 0.001 +70 1.551 0.001 +90 3.048 0.001 +5 -2.541 0.001 +30 -1.362 0.001 +45 0 0.001 +70 1.561 0.001 +90 3.141 0.001 +5 -2.535 0.001 +30 -1.347 0.001 +45 0 0.001 +70 1.529 0.001 +90 3.066 0.001 +5 -2.207 0.001 +30 -1.25 0.001 +45 0 0.001 +70 1.523 0.001 +90 3.147 0.001 +5 -1.949 0.001 +30 -1.097 0.001 +45 0 0.001 +70 1.329 0.001 +90 2.743 0.001 +5 -1.644 0.001 +30 -1.015 0.001 +45 0 0.001 +70 1.343 0.001 +90 2.867 0.001 +5 -1.375 0.001 +30 -0.847 0.001 +45 0 0.001 +70 1.122 0.001 +90 2.397 0.001 +5 -1.095 0.001 +30 -0.775 0.001 +45 0 0.001 +70 1.143 0.001 +90 2.53 0.001 +5 -1.006 0.001 +30 -0.696 0.001 +45 0 0.001 +70 1.012 0.001 +90 2.232 0.001 +5 -0.801 0.001 +30 -0.663 0.001 +45 0 0.001 +70 1.076 0.001 +90 2.45 0.001 +5 -0.821 0.001 +30 -0.622 0.001 +45 0 0.001 +70 0.959 0.001 +90 2.157 0.001 +5 -0.984 0.001 +30 -0.879 0.001 +45 0 0.001 +70 1.483 0.001 +90 3.413 0.001 +5 -1.239 0.001 +30 -0.956 0.001 +45 0 0.001 +70 1.492 0.001 +90 3.361 0.001 +5 -1.144 0.001 +30 -0.953 0.001 +45 0 0.001 +70 1.552 0.001 +90 3.535 0.001 +5 -1.506 0.001 +30 -1.068 0.001 +45 0 0.001 +70 1.578 0.001 +90 3.494 0.001 +5 -1.538 0.001 +30 -1.112 0.001 +45 0 0.001 +70 1.663 0.001 +90 3.697 0.001 +5 -1.997 0.001 +30 -1.273 0.001 +45 0 0.001 +70 1.735 0.001 +90 3.739 0.001 +5 -2.183 0.001 +30 -1.391 0.001 +45 0 0.001 +70 1.892 0.001 +90 4.075 0.001 +5 -2.642 0.001 +30 -1.548 0.001 +45 0 0.001 +70 1.953 0.001 +90 4.091 0.001 +5 -2.806 0.001 +30 -1.646 0.001 +45 0 0.001 +70 2.078 0.001 +90 4.352 0.001 +5 -3.173 0.001 +30 -1.757 0.001 +45 0 0.001 +70 2.091 0.001 +90 4.277 0.001 +5 -3.097 0.001 +30 -1.724 0.001 +45 0 0.001 +70 2.064 0.001 +90 4.231 0.001 +5 -3.243 0.001 +30 -1.738 0.001 +45 0 0.001 +70 1.993 0.001 +90 4.012 0.001 +5 -3.051 0.001 +30 -1.649 0.001 +45 0 0.001 +70 1.91 0.001 +90 3.859 0.001 +5 -2.784 0.001 +30 -1.5 0.001 +45 0 0.001 +70 1.729 0.001 +90 3.487 0.001 +5 -1.958 0.001 +30 -1.104 0.001 +45 0 0.001 +70 1.337 0.001 +90 2.752 0.001 +5 -1.446 0.001 +30 -0.804 0.001 +45 0 0.001 +70 0.961 0.001 +90 1.967 0.001 +5 -0.592 0.001 +30 -0.427 0.001 +45 0 0.001 +70 0.636 0.001 +90 1.408 0.001 +5 -0.122 0.001 +30 -0.169 0.001 +45 0 0.001 +70 0.332 0.001 +90 0.788 0.001 +5 0.712 0.001 +30 0.193 0.001 +45 0 0.001 +70 0.033 0.001 +90 0.284 0.001 +5 0.979 0.001 +30 0.338 0.001 +45 0 0.001 +70 -0.137 0.001 +90 -0.061 0.001 +5 1.693 0.001 +30 0.637 0.001 +45 0 0.001 +70 -0.368 0.001 +90 -0.43 0.001 +5 1.753 0.001 +30 0.688 0.001 +45 0 0.001 +70 -0.451 0.001 +90 -0.618 0.001 +5 2.352 0.001 +30 0.94 0.001 +45 0 0.001 +70 -0.648 0.001 +90 -0.937 0.001 +5 2.159 0.001 +30 0.875 0.001 +45 0 0.001 +70 -0.625 0.001 +90 -0.938 0.001 +5 2.539 0.001 +30 1.031 0.001 +45 0 0.001 +70 -0.74 0.001 +90 -1.113 0.001 +5 2.172 0.001 +30 0.892 0.001 +45 0 0.001 +70 -0.657 0.001 +90 -1.014 0.001 +5 2.421 0.001 +30 1 0.001 +45 0 0.001 +70 -0.747 0.001 +90 -1.166 0.001 +5 1.932 0.001 +30 0.821 0.001 +45 0 0.001 +70 -0.654 0.001 +90 -1.077 0.001 +5 2.069 0.001 +30 0.899 0.001 +45 0 0.001 +70 -0.749 0.001 +90 -1.273 0.001 +5 1.493 0.001 +30 0.685 0.001 +45 0 0.001 +70 -0.632 0.001 +90 -1.151 0.001 +5 1.557 0.001 +30 0.747 0.001 +45 0 0.001 +70 -0.739 0.001 +90 -1.396 0.001 +5 1.01 0.001 +30 0.558 0.001 +45 0 0.001 +70 -0.662 0.001 +90 -1.364 0.001 +5 1.169 0.001 +30 0.687 0.001 +45 0 0.001 +70 -0.87 0.001 +90 -1.832 0.001 +5 0.695 0.001 +30 0.534 0.001 +45 0 0.001 +70 -0.831 0.001 +90 -1.871 0.001 +5 1.035 0.001 +30 0.759 0.001 +45 0 0.001 +70 -1.144 0.001 +90 -2.547 0.001 +5 0.859 0.001 +30 0.753 0.001 +45 0 0.001 +70 -1.256 0.001 +90 -2.874 0.001 +5 1.029 0.001 +30 0.857 0.001 +45 0 0.001 +70 -1.392 0.001 +90 -3.159 0.001 +5 1.017 0.001 +30 0.857 0.001 +45 0 0.001 +70 -1.402 0.001 +90 -3.186 0.001 +5 1.59 0.001 +30 1.118 0.001 +45 0 0.001 +70 -1.639 0.001 +90 -3.606 0.001 +5 1.596 0.001 +30 1.115 0.001 +45 0 0.001 +70 -1.628 0.001 +90 -3.575 0.001 +5 2.301 0.001 +30 1.418 0.001 +45 0 0.001 +70 -1.874 0.001 +90 -3.978 0.001 +5 2.24 0.001 +30 1.353 0.001 +45 0 0.001 +70 -1.757 0.001 +90 -3.705 0.001 +5 2.954 0.001 +30 1.65 0.001 +45 0 0.001 +70 -1.983 0.001 +90 -4.059 0.001 +5 2.811 0.001 +30 1.544 0.001 +45 0 0.001 +70 -1.821 0.001 +90 -3.698 0.001 +5 3.474 0.001 +30 1.818 0.001 +45 0 0.001 +70 -2.029 0.001 +90 -4.017 0.001 +5 3.27 0.001 +30 1.702 0.001 +45 0 0.001 +70 -1.888 0.001 +90 -3.727 0.001 +5 3.886 0.001 +30 1.969 0.001 +45 0 0.001 +70 -2.107 0.001 +90 -4.091 0.001 +5 3.516 0.001 +30 1.788 0.001 +45 0 0.001 +70 -1.924 0.001 +90 -3.744 0.001 +5 3.972 0.001 +30 1.99 0.001 +45 0 0.001 +70 -2.097 0.001 +90 -4.042 0.001 +5 3.515 0.001 +30 1.788 0.001 +45 0 0.001 +70 -1.924 0.001 +90 -3.744 0.001 +5 3.885 0.001 +30 1.969 0.001 +45 0 0.001 +70 -2.108 0.001 +90 -4.092 0.001 +5 3.268 0.001 +30 1.702 0.001 +45 0 0.001 +70 -1.889 0.001 +90 -3.729 0.001 +5 3.473 0.001 +30 1.818 0.001 +45 0 0.001 +70 -2.03 0.001 +90 -4.019 0.001 +5 2.809 0.001 +30 1.543 0.001 +45 0 0.001 +70 -1.822 0.001 +90 -3.7 0.001 +5 2.952 0.001 +30 1.65 0.001 +45 0 0.001 +70 -1.985 0.001 +90 -4.061 0.001 +5 2.24 0.001 +30 1.353 0.001 +45 0 0.001 +70 -1.758 0.001 +90 -3.708 0.001 +5 2.302 0.001 +30 1.418 0.001 +45 0 0.001 +70 -1.875 0.001 +90 -3.982 0.001 +5 1.598 0.001 +30 1.116 0.001 +45 0 0.001 +70 -1.629 0.001 +90 -3.578 0.001 +5 1.594 0.001 +30 1.12 0.001 +45 0 0.001 +70 -1.641 0.001 +90 -3.609 0.001 +5 1.021 0.001 +30 0.859 0.001 +45 0 0.001 +70 -1.403 0.001 +90 -3.188 0.001 +5 1.036 0.001 +30 0.86 0.001 +45 0 0.001 +70 -1.395 0.001 +90 -3.164 0.001 +5 0.87 0.001 +30 0.758 0.001 +45 0 0.001 +70 -1.26 0.001 +90 -2.881 0.001 +5 1.046 0.001 +30 0.764 0.001 +45 0 0.001 +70 -1.149 0.001 +90 -2.554 0.001 +5 0.707 0.001 +30 0.54 0.001 +45 0 0.001 +70 -0.836 0.001 +90 -1.878 0.001 +5 1.183 0.001 +30 0.693 0.001 +45 0 0.001 +70 -0.875 0.001 +90 -1.84 0.001 +5 1.024 0.001 +30 0.564 0.001 +45 0 0.001 +70 -0.668 0.001 +90 -1.374 0.001 +5 1.572 0.001 +30 0.754 0.001 +45 0 0.001 +70 -0.745 0.001 +90 -1.408 0.001 +5 1.509 0.001 +30 0.693 0.001 +45 0 0.001 +70 -0.639 0.001 +90 -1.165 0.001 +5 2.085 0.001 +30 0.907 0.001 +45 0 0.001 +70 -0.757 0.001 +90 -1.288 0.001 +5 1.949 0.001 +30 0.829 0.001 +45 0 0.001 +70 -0.662 0.001 +90 -1.094 0.001 +5 2.437 0.001 +30 1.008 0.001 +45 0 0.001 +70 -0.756 0.001 +90 -1.184 0.001 +5 2.186 0.001 +30 0.9 0.001 +45 0 0.001 +70 -0.666 0.001 +90 -1.033 0.001 +5 2.553 0.001 +30 1.039 0.001 +45 0 0.001 +70 -0.749 0.001 +90 -1.131 0.001 +5 2.17 0.001 +30 0.882 0.001 +45 0 0.001 +70 -0.634 0.001 +90 -0.955 0.001 +5 2.362 0.001 +30 0.946 0.001 +45 0 0.001 +70 -0.656 0.001 +90 -0.952 0.001 +5 1.761 0.001 +30 0.693 0.001 +45 0 0.001 +70 -0.457 0.001 +90 -0.632 0.001 +5 1.699 0.001 +30 0.641 0.001 +45 0 0.001 +70 -0.374 0.001 +90 -0.442 0.001 +5 0.984 0.001 +30 0.342 0.001 +45 0 0.001 +70 -0.142 0.001 +90 -0.072 0.001 +5 0.716 0.001 +30 0.196 0.001 +45 0 0.001 +70 0.028 0.001 +90 0.275 0.001 +5 -0.118 0.001 +30 -0.166 0.001 +45 0 0.001 +70 0.328 0.001 +90 0.779 0.001 +5 -0.587 0.001 +30 -0.424 0.001 +45 0 0.001 +70 0.633 0.001 +90 1.4 0.001 +5 -1.44 0.001 +30 -0.801 0.001 +45 0 0.001 +70 0.957 0.001 +90 1.959 0.001 +5 -1.952 0.001 +30 -1.1 0.001 +45 0 0.001 +70 1.333 0.001 +90 2.743 0.001 +5 -2.776 0.001 +30 -1.495 0.001 +45 0 0.001 +70 1.724 0.001 +90 3.476 0.001 +5 -3.041 0.001 +30 -1.645 0.001 +45 0 0.001 +70 1.905 0.001 +90 3.849 0.001 +5 -3.232 0.001 +30 -1.733 0.001 +45 0 0.001 +70 1.988 0.001 +90 4.003 0.001 +5 -3.084 0.001 +30 -1.718 0.001 +45 0 0.001 +70 2.058 0.001 +90 4.22 0.001 +5 -3.159 0.001 +30 -1.75 0.001 +45 0 0.001 +70 2.084 0.001 +90 4.264 0.001 +5 -2.792 0.001 +30 -1.639 0.001 +45 0 0.001 +70 2.071 0.001 +90 4.34 0.001 +5 -2.628 0.001 +30 -1.541 0.001 +45 0 0.001 +70 1.946 0.001 +90 4.079 0.001 +5 -2.169 0.001 +30 -1.384 0.001 +45 0 0.001 +70 1.886 0.001 +90 4.064 0.001 +5 -1.984 0.001 +30 -1.267 0.001 +45 0 0.001 +70 1.729 0.001 +90 3.728 0.001 +5 -1.526 0.001 +30 -1.106 0.001 +45 0 0.001 +70 1.658 0.001 +90 3.687 0.001 +5 -1.496 0.001 +30 -1.063 0.001 +45 0 0.001 +70 1.574 0.001 +90 3.487 0.001 +5 -1.137 0.001 +30 -0.95 0.001 +45 0 0.001 +70 1.549 0.001 +90 3.53 0.001 +5 -1.235 0.001 +30 -0.955 0.001 +45 0 0.001 +70 1.491 0.001 +90 3.358 0.001 +5 -0.186 0.001 +30 0.044 0.001 +45 0 0.001 +70 -0.245 0.001 +90 -0.662 0.001 +5 0.245 0.001 +30 0.294 0.001 +45 0 0.001 +70 -0.557 0.001 +90 -1.312 0.001 +5 -1.756 0.001 +30 -0.878 0.001 +45 0 0.001 +70 0.923 0.001 +90 1.777 0.001 +5 -1.521 0.001 +30 -0.724 0.001 +45 0 0.001 +70 0.708 0.001 +90 1.32 0.001 +5 -1.524 0.001 +30 -0.725 0.001 +45 0 0.001 +70 0.71 0.001 +90 1.323 0.001 +5 -1.759 0.001 +30 -0.88 0.001 +45 0 0.001 +70 0.925 0.001 +90 1.783 0.001 +5 0.24 0.001 +30 0.292 0.001 +45 0 0.001 +70 -0.554 0.001 +90 -1.307 0.001 +5 -0.184 0.001 +30 0.045 0.001 +45 0 0.001 +70 -0.246 0.001 +90 -0.663 0.001 +5 -2.15 0.001 +30 -0.998 0.001 +45 0 0.001 +70 0.935 0.001 +90 1.696 0.001 +5 -1.095 0.001 +30 -0.279 0.001 +45 0 0.001 +70 -0.092 0.001 +90 -0.543 0.001 +5 -1.096 0.001 +30 -0.28 0.001 +45 0 0.001 +70 -0.09 0.001 +90 -0.54 0.001 +5 -2.149 0.001 +30 -0.998 0.001 +45 0 0.001 +70 0.935 0.001 +90 1.694 0.001 diff --git a/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM_Initial.txt b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM_Initial.txt new file mode 100644 index 000000000..c8deaf7f1 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/actuatorsCorrections_FEM_Initial.txt @@ -0,0 +1,1116 @@ +-1.502 -0.668 0.000 0.422 0.531 +-1.412 -0.624 0.000 0.387 0.471 +-1.208 -0.527 0.000 0.310 0.340 +-0.907 -0.383 0.000 0.197 0.151 +-0.549 -0.213 0.000 0.066 -0.069 +-0.096 0.002 0.000 -0.100 -0.342 +0.376 0.225 0.000 -0.272 -0.628 +0.826 0.438 0.000 -0.436 -0.899 +1.202 0.615 0.000 -0.572 -1.123 +1.507 0.758 0.000 -0.680 -1.298 +1.715 0.855 0.000 -0.752 -1.413 +1.811 0.900 0.000 -0.786 -1.466 +1.807 0.898 0.000 -0.784 -1.464 +1.715 0.855 0.000 -0.753 -1.415 +1.508 0.759 0.000 -0.681 -1.300 +1.202 0.615 0.000 -0.572 -1.125 +0.834 0.442 0.000 -0.439 -0.905 +0.377 0.226 0.000 -0.273 -0.629 +-0.095 0.002 0.000 -0.101 -0.345 +-0.540 -0.209 0.000 0.062 -0.075 +-0.907 -0.383 0.000 0.197 0.150 +-1.207 -0.526 0.000 0.309 0.339 +-1.414 -0.626 0.000 0.388 0.474 +-1.508 -0.671 0.000 0.424 0.535 +-2.578 -1.202 0.000 0.884 1.387 +-2.501 -1.168 0.000 0.863 1.362 +-2.244 -1.041 0.000 0.755 1.164 +-1.936 -0.893 0.000 0.637 0.963 +-1.406 -0.643 0.000 0.449 0.657 +-0.484 -0.204 0.000 0.107 0.085 +0.539 0.280 0.000 -0.266 -0.531 +1.454 0.709 0.000 -0.588 -1.047 +2.019 0.978 0.000 -0.799 -1.405 +2.385 1.144 0.000 -0.914 -1.569 +2.593 1.236 0.000 -0.973 -1.646 +2.724 1.300 0.000 -1.026 -1.742 +2.723 1.301 0.000 -1.030 -1.753 +2.612 1.246 0.000 -0.983 -1.666 +2.377 1.142 0.000 -0.916 -1.581 +2.045 0.989 0.000 -0.804 -1.405 +1.480 0.721 0.000 -0.596 -1.059 +0.569 0.294 0.000 -0.275 -0.543 +-0.442 -0.183 0.000 0.088 0.050 +-1.376 -0.628 0.000 0.435 0.632 +-1.891 -0.869 0.000 0.614 0.917 +-2.268 -1.054 0.000 0.767 1.189 +-2.487 -1.163 0.000 0.861 1.361 +-2.589 -1.209 0.000 0.891 1.403 +-2.890 -1.368 0.000 1.051 1.732 +-3.047 -1.449 0.000 1.126 1.882 +-2.894 -1.377 0.000 1.072 1.793 +-3.280 -1.582 0.000 1.274 2.208 +-2.615 -1.240 0.000 0.957 1.587 +-2.684 -1.271 0.000 0.979 1.620 +-2.247 -1.054 0.000 0.791 1.271 +-2.377 -1.123 0.000 0.860 1.415 +-2.048 -0.968 0.000 0.743 1.224 +-2.330 -1.120 0.000 0.901 1.557 +-1.315 -0.623 0.000 0.483 0.805 +-0.800 -0.377 0.000 0.290 0.480 +-0.046 -0.016 0.000 0.002 -0.014 +0.665 0.316 0.000 -0.240 -0.393 +1.192 0.564 0.000 -0.429 -0.700 +2.076 0.962 0.000 -0.693 -1.058 +1.985 0.941 0.000 -0.725 -1.201 +2.332 1.105 0.000 -0.850 -1.405 +2.294 1.095 0.000 -0.863 -1.464 +2.670 1.259 0.000 -0.960 -1.569 +2.618 1.234 0.000 -0.941 -1.540 +3.085 1.422 0.000 -1.018 -1.543 +2.886 1.353 0.000 -1.019 -1.645 +3.044 1.426 0.000 -1.073 -1.729 +2.945 1.388 0.000 -1.060 -1.739 +3.048 1.428 0.000 -1.074 -1.730 +2.888 1.354 0.000 -1.020 -1.645 +3.087 1.422 0.000 -1.017 -1.541 +2.620 1.235 0.000 -0.942 -1.542 +2.673 1.261 0.000 -0.962 -1.576 +2.296 1.097 0.000 -0.865 -1.468 +2.337 1.107 0.000 -0.853 -1.410 +1.985 0.942 0.000 -0.727 -1.205 +2.070 0.960 0.000 -0.693 -1.061 +1.203 0.569 0.000 -0.434 -0.710 +0.692 0.329 0.000 -0.251 -0.411 +-0.026 -0.006 0.000 -0.006 -0.028 +-0.772 -0.364 0.000 0.280 0.462 +-1.306 -0.619 0.000 0.480 0.799 +-2.339 -1.125 0.000 0.904 1.564 +-2.049 -0.969 0.000 0.743 1.224 +-2.372 -1.120 0.000 0.858 1.409 +-2.246 -1.054 0.000 0.790 1.269 +-2.684 -1.272 0.000 0.980 1.621 +-2.612 -1.239 0.000 0.956 1.584 +-3.276 -1.579 0.000 1.271 2.201 +-2.891 -1.376 0.000 1.070 1.790 +-3.043 -1.447 0.000 1.125 1.879 +-3.395 -1.635 0.000 1.311 2.264 +-3.447 -1.658 0.000 1.326 2.283 +-3.545 -1.713 0.000 1.388 2.419 +-3.680 -1.784 0.000 1.456 2.558 +-3.543 -1.710 0.000 1.380 2.396 +-3.453 -1.653 0.000 1.309 2.230 +-3.265 -1.566 0.000 1.245 2.132 +-3.100 -1.485 0.000 1.179 2.014 +-2.981 -1.437 0.000 1.161 2.019 +-2.755 -1.336 0.000 1.098 1.941 +-1.954 -0.950 0.000 0.788 1.403 +-1.148 -0.560 0.000 0.469 0.843 +-0.151 -0.089 0.000 0.111 0.260 +0.861 0.391 0.000 -0.259 -0.351 +1.608 0.736 0.000 -0.505 -0.725 +2.372 1.089 0.000 -0.761 -1.119 +2.684 1.244 0.000 -0.895 -1.368 +2.913 1.360 0.000 -1.005 -1.585 +3.090 1.439 0.000 -1.059 -1.660 +3.319 1.546 0.000 -1.139 -1.790 +3.342 1.542 0.000 -1.106 -1.683 +3.432 1.572 0.000 -1.105 -1.637 +3.373 1.552 0.000 -1.107 -1.671 +3.359 1.555 0.000 -1.130 -1.747 +3.302 1.527 0.000 -1.107 -1.706 +3.360 1.555 0.000 -1.130 -1.747 +3.373 1.552 0.000 -1.107 -1.671 +3.432 1.572 0.000 -1.105 -1.637 +3.343 1.543 0.000 -1.107 -1.685 +3.320 1.547 0.000 -1.140 -1.793 +3.093 1.441 0.000 -1.060 -1.665 +2.917 1.362 0.000 -1.007 -1.590 +2.690 1.247 0.000 -0.899 -1.375 +2.378 1.093 0.000 -0.765 -1.127 +1.619 0.741 0.000 -0.510 -0.735 +0.874 0.398 0.000 -0.264 -0.363 +-0.137 -0.082 0.000 0.105 0.249 +-1.136 -0.553 0.000 0.464 0.834 +-1.944 -0.945 0.000 0.783 1.394 +-2.750 -1.334 0.000 1.096 1.937 +-2.976 -1.434 0.000 1.159 2.013 +-3.098 -1.483 0.000 1.178 2.011 +-3.263 -1.564 0.000 1.244 2.129 +-3.451 -1.652 0.000 1.308 2.227 +-3.543 -1.709 0.000 1.379 2.394 +-3.680 -1.783 0.000 1.455 2.556 +-3.546 -1.714 0.000 1.387 2.418 +-3.445 -1.657 0.000 1.325 2.281 +-3.093 -1.500 0.000 1.224 2.153 +-3.274 -1.583 0.000 1.284 2.242 +-3.579 -1.763 0.000 1.495 2.721 +-3.897 -1.920 0.000 1.630 2.971 +-3.664 -1.799 0.000 1.517 2.748 +-3.494 -1.672 0.000 1.323 2.251 +-3.046 -1.470 0.000 1.189 2.071 +-3.046 -1.460 0.000 1.163 1.992 +-3.260 -1.604 0.000 1.364 2.487 +-3.306 -1.633 0.000 1.401 2.577 +-2.513 -1.250 0.000 1.094 2.045 +-1.283 -0.633 0.000 0.547 1.012 +-0.204 -0.125 0.000 0.162 0.385 +0.898 0.400 0.000 -0.246 -0.295 +1.874 0.828 0.000 -0.503 -0.590 +2.637 1.183 0.000 -0.764 -0.998 +2.703 1.223 0.000 -0.817 -1.126 +2.863 1.341 0.000 -0.999 -1.591 +2.840 1.319 0.000 -0.962 -1.494 +3.391 1.582 0.000 -1.172 -1.855 +3.254 1.468 0.000 -0.983 -1.359 +3.441 1.542 0.000 -1.012 -1.355 +3.218 1.446 0.000 -0.960 -1.309 +3.191 1.471 0.000 -1.057 -1.613 +3.008 1.384 0.000 -0.991 -1.504 +3.190 1.471 0.000 -1.057 -1.613 +3.218 1.446 0.000 -0.960 -1.311 +3.442 1.543 0.000 -1.013 -1.358 +3.256 1.469 0.000 -0.984 -1.362 +3.393 1.584 0.000 -1.174 -1.858 +2.845 1.322 0.000 -0.964 -1.499 +2.869 1.344 0.000 -1.002 -1.597 +2.710 1.227 0.000 -0.821 -1.133 +2.645 1.188 0.000 -0.768 -1.006 +1.884 0.833 0.000 -0.508 -0.599 +0.909 0.405 0.000 -0.251 -0.304 +-0.192 -0.119 0.000 0.156 0.375 +-1.273 -0.628 0.000 0.542 1.002 +-2.503 -1.245 0.000 1.089 2.036 +-3.298 -1.628 0.000 1.398 2.569 +-3.253 -1.600 0.000 1.360 2.480 +-3.041 -1.457 0.000 1.160 1.987 +-3.042 -1.468 0.000 1.187 2.067 +-3.492 -1.671 0.000 1.322 2.249 +-3.664 -1.799 0.000 1.517 2.747 +-3.897 -1.920 0.000 1.630 2.970 +-3.581 -1.763 0.000 1.495 2.721 +-3.276 -1.584 0.000 1.284 2.243 +-2.916 -1.397 0.000 1.105 1.884 +-3.014 -1.447 0.000 1.152 1.975 +-3.120 -1.501 0.000 1.202 2.074 +-3.301 -1.591 0.000 1.280 2.218 +-3.073 -1.467 0.000 1.153 1.951 +-3.061 -1.447 0.000 1.108 1.823 +-2.879 -1.354 0.000 1.022 1.655 +-2.942 -1.391 0.000 1.068 1.760 +-2.956 -1.410 0.000 1.110 1.878 +-2.770 -1.337 0.000 1.087 1.900 +-1.942 -0.942 0.000 0.777 1.377 +-1.124 -0.550 0.000 0.468 0.853 +-0.163 -0.090 0.000 0.105 0.236 +0.774 0.351 0.000 -0.229 -0.303 +1.584 0.733 0.000 -0.519 -0.776 +2.416 1.123 0.000 -0.812 -1.249 +2.768 1.306 0.000 -0.988 -1.603 +2.912 1.387 0.000 -1.081 -1.811 +2.964 1.417 0.000 -1.120 -1.905 +3.140 1.489 0.000 -1.154 -1.922 +3.093 1.450 0.000 -1.091 -1.759 +3.240 1.499 0.000 -1.089 -1.683 +3.125 1.449 0.000 -1.061 -1.656 +3.074 1.430 0.000 -1.056 -1.667 +3.012 1.405 0.000 -1.047 -1.669 +3.074 1.429 0.000 -1.057 -1.668 +3.125 1.449 0.000 -1.061 -1.658 +3.241 1.500 0.000 -1.090 -1.686 +3.095 1.451 0.000 -1.092 -1.763 +3.144 1.491 0.000 -1.156 -1.926 +2.969 1.420 0.000 -1.122 -1.910 +2.919 1.390 0.000 -1.084 -1.817 +2.777 1.310 0.000 -0.992 -1.610 +2.425 1.128 0.000 -0.816 -1.256 +1.594 0.738 0.000 -0.523 -0.785 +0.785 0.356 0.000 -0.233 -0.312 +-0.153 -0.085 0.000 0.100 0.227 +-1.113 -0.545 0.000 0.463 0.843 +-1.932 -0.936 0.000 0.772 1.367 +-2.760 -1.332 0.000 1.082 1.891 +-2.947 -1.405 0.000 1.106 1.871 +-2.936 -1.388 0.000 1.064 1.753 +-2.875 -1.352 0.000 1.020 1.651 +-3.060 -1.446 0.000 1.108 1.821 +-3.072 -1.467 0.000 1.153 1.950 +-3.302 -1.591 0.000 1.280 2.218 +-3.121 -1.502 0.000 1.203 2.075 +-3.016 -1.448 0.000 1.153 1.976 +-2.369 -1.133 0.000 0.893 1.514 +-2.514 -1.217 0.000 0.989 1.729 +-2.441 -1.172 0.000 0.934 1.602 +-2.699 -1.314 0.000 1.083 1.921 +-2.582 -1.242 0.000 0.993 1.711 +-2.932 -1.433 0.000 1.194 2.139 +-2.621 -1.257 0.000 0.999 1.711 +-2.865 -1.393 0.000 1.146 2.031 +-2.393 -1.131 0.000 0.865 1.421 +-2.590 -1.235 0.000 0.968 1.634 +-2.391 -1.114 0.000 0.818 1.283 +-2.377 -1.112 0.000 0.828 1.318 +-2.198 -1.010 0.000 0.713 1.064 +-2.459 -1.151 0.000 0.860 1.374 +-2.420 -1.130 0.000 0.838 1.329 +-2.721 -1.300 0.000 1.027 1.746 +-2.590 -1.225 0.000 0.944 1.563 +-2.840 -1.385 0.000 1.154 2.067 +-2.419 -1.164 0.000 0.940 1.634 +-2.394 -1.183 0.000 1.020 1.885 +-1.828 -0.888 0.000 0.738 1.319 +-1.610 -0.802 0.000 0.708 1.334 +-1.073 -0.528 0.000 0.456 0.841 +-0.696 -0.358 0.000 0.345 0.694 +-0.179 -0.098 0.000 0.111 0.248 +0.226 0.080 0.000 0.005 0.127 +0.684 0.308 0.000 -0.194 -0.243 +1.086 0.480 0.000 -0.288 -0.329 +1.449 0.670 0.000 -0.473 -0.707 +1.836 0.828 0.000 -0.541 -0.722 +2.112 0.990 0.000 -0.733 -1.158 +2.404 1.107 0.000 -0.779 -1.156 +2.496 1.192 0.000 -0.934 -1.573 +2.569 1.215 0.000 -0.927 -1.518 +2.510 1.216 0.000 -0.990 -1.734 +2.560 1.235 0.000 -0.998 -1.735 +2.472 1.212 0.000 -1.021 -1.847 +2.547 1.227 0.000 -0.992 -1.725 +2.624 1.266 0.000 -1.028 -1.797 +2.644 1.245 0.000 -0.951 -1.558 +2.560 1.217 0.000 -0.954 -1.609 +2.759 1.267 0.000 -0.900 -1.352 +2.690 1.255 0.000 -0.937 -1.495 +2.806 1.278 0.000 -0.886 -1.289 +2.667 1.240 0.000 -0.917 -1.448 +2.677 1.227 0.000 -0.869 -1.303 +2.574 1.199 0.000 -0.893 -1.422 +2.581 1.192 0.000 -0.865 -1.338 +2.548 1.192 0.000 -0.900 -1.456 +2.580 1.192 0.000 -0.866 -1.339 +2.574 1.199 0.000 -0.893 -1.423 +2.677 1.227 0.000 -0.870 -1.305 +2.668 1.240 0.000 -0.918 -1.451 +2.807 1.278 0.000 -0.887 -1.293 +2.692 1.257 0.000 -0.938 -1.499 +2.761 1.268 0.000 -0.901 -1.356 +2.562 1.218 0.000 -0.955 -1.612 +2.647 1.247 0.000 -0.952 -1.562 +2.627 1.268 0.000 -1.030 -1.801 +2.551 1.230 0.000 -0.994 -1.730 +2.477 1.215 0.000 -1.023 -1.852 +2.566 1.238 0.000 -1.000 -1.740 +2.517 1.219 0.000 -0.992 -1.739 +2.576 1.219 0.000 -0.930 -1.524 +2.504 1.196 0.000 -0.937 -1.579 +2.413 1.112 0.000 -0.783 -1.163 +2.121 0.994 0.000 -0.736 -1.166 +1.845 0.833 0.000 -0.545 -0.729 +1.458 0.675 0.000 -0.477 -0.714 +1.095 0.485 0.000 -0.292 -0.336 +0.693 0.312 0.000 -0.198 -0.251 +0.234 0.084 0.000 0.001 0.119 +-0.170 -0.093 0.000 0.107 0.239 +-0.687 -0.354 0.000 0.340 0.685 +-1.064 -0.523 0.000 0.451 0.832 +-1.600 -0.797 0.000 0.703 1.324 +-1.818 -0.883 0.000 0.734 1.309 +-2.384 -1.178 0.000 1.015 1.875 +-2.409 -1.159 0.000 0.935 1.624 +-2.830 -1.380 0.000 1.150 2.058 +-2.581 -1.221 0.000 0.940 1.555 +-2.713 -1.296 0.000 1.023 1.738 +-2.413 -1.126 0.000 0.835 1.323 +-2.453 -1.148 0.000 0.857 1.369 +-2.194 -1.008 0.000 0.711 1.060 +-2.375 -1.111 0.000 0.826 1.316 +-2.390 -1.113 0.000 0.818 1.282 +-2.590 -1.235 0.000 0.968 1.633 +-2.393 -1.131 0.000 0.865 1.421 +-2.866 -1.394 0.000 1.147 2.031 +-2.622 -1.258 0.000 1.000 1.712 +-2.934 -1.434 0.000 1.195 2.141 +-2.583 -1.243 0.000 0.994 1.712 +-2.701 -1.315 0.000 1.084 1.922 +-2.443 -1.173 0.000 0.935 1.604 +-2.515 -1.217 0.000 0.989 1.730 +-1.880 -0.893 0.000 0.688 1.142 +-1.929 -0.914 0.000 0.701 1.155 +-1.901 -0.905 0.000 0.704 1.179 +-2.007 -0.951 0.000 0.731 1.207 +-2.018 -0.958 0.000 0.740 1.228 +-2.076 -0.980 0.000 0.746 1.218 +-1.986 -0.936 0.000 0.707 1.147 +-1.917 -0.889 0.000 0.644 0.992 +-1.728 -0.790 0.000 0.545 0.791 +-1.594 -0.710 0.000 0.451 0.576 +-1.535 -0.673 0.000 0.404 0.462 +-1.525 -0.660 0.000 0.377 0.388 +-1.463 -0.627 0.000 0.346 0.326 +-1.705 -0.746 0.000 0.447 0.512 +-1.827 -0.814 0.000 0.522 0.673 +-2.105 -0.955 0.000 0.651 0.925 +-2.127 -0.984 0.000 0.713 1.098 +-2.218 -1.039 0.000 0.781 1.257 +-2.117 -1.006 0.000 0.787 1.324 +-1.907 -0.911 0.000 0.723 1.234 +-1.602 -0.772 0.000 0.629 1.103 +-1.308 -0.631 0.000 0.518 0.915 +-0.987 -0.483 0.000 0.412 0.754 +-0.590 -0.289 0.000 0.253 0.471 +-0.189 -0.100 0.000 0.109 0.237 +0.230 0.102 0.000 -0.053 -0.041 +0.601 0.274 0.000 -0.179 -0.238 +0.971 0.455 0.000 -0.331 -0.512 +1.276 0.600 0.000 -0.444 -0.703 +1.651 0.785 0.000 -0.601 -0.989 +1.915 0.915 0.000 -0.712 -1.192 +2.161 1.046 0.000 -0.846 -1.472 +2.198 1.077 0.000 -0.899 -1.613 +2.349 1.166 0.000 -1.006 -1.861 +2.188 1.102 0.000 -0.983 -1.869 +2.181 1.108 0.000 -1.010 -1.956 +2.017 1.036 0.000 -0.968 -1.909 +2.085 1.062 0.000 -0.978 -1.907 +2.064 1.042 0.000 -0.942 -1.811 +2.084 1.040 0.000 -0.918 -1.730 +2.125 1.041 0.000 -0.880 -1.598 +2.258 1.089 0.000 -0.888 -1.559 +2.248 1.068 0.000 -0.841 -1.423 +2.340 1.107 0.000 -0.861 -1.441 +2.262 1.065 0.000 -0.817 -1.347 +2.278 1.073 0.000 -0.825 -1.364 +2.155 1.011 0.000 -0.771 -1.261 +2.222 1.047 0.000 -0.807 -1.336 +2.161 1.017 0.000 -0.781 -1.289 +2.222 1.047 0.000 -0.807 -1.337 +2.154 1.011 0.000 -0.771 -1.263 +2.278 1.073 0.000 -0.826 -1.366 +2.263 1.065 0.000 -0.818 -1.350 +2.341 1.108 0.000 -0.863 -1.444 +2.250 1.070 0.000 -0.842 -1.427 +2.260 1.090 0.000 -0.890 -1.563 +2.128 1.042 0.000 -0.881 -1.602 +2.087 1.041 0.000 -0.919 -1.734 +2.067 1.043 0.000 -0.944 -1.815 +2.089 1.064 0.000 -0.980 -1.911 +2.022 1.038 0.000 -0.970 -1.913 +2.187 1.111 0.000 -1.013 -1.960 +2.195 1.105 0.000 -0.985 -1.874 +2.356 1.169 0.000 -1.009 -1.866 +2.206 1.081 0.000 -0.902 -1.618 +2.169 1.050 0.000 -0.849 -1.478 +1.924 0.919 0.000 -0.715 -1.198 +1.659 0.789 0.000 -0.605 -0.995 +1.284 0.604 0.000 -0.448 -0.709 +0.978 0.459 0.000 -0.334 -0.518 +0.609 0.278 0.000 -0.182 -0.245 +0.237 0.105 0.000 -0.056 -0.048 +-0.182 -0.096 0.000 0.105 0.230 +-0.583 -0.285 0.000 0.249 0.463 +-0.979 -0.479 0.000 0.408 0.746 +-1.300 -0.627 0.000 0.514 0.906 +-1.593 -0.767 0.000 0.624 1.093 +-1.898 -0.906 0.000 0.718 1.224 +-2.108 -1.001 0.000 0.783 1.315 +-2.208 -1.034 0.000 0.777 1.248 +-2.118 -0.980 0.000 0.709 1.089 +-2.098 -0.952 0.000 0.648 0.918 +-1.821 -0.811 0.000 0.519 0.668 +-1.700 -0.744 0.000 0.445 0.507 +-1.460 -0.626 0.000 0.345 0.323 +-1.524 -0.659 0.000 0.376 0.386 +-1.535 -0.673 0.000 0.404 0.462 +-1.595 -0.711 0.000 0.452 0.576 +-1.730 -0.790 0.000 0.546 0.792 +-1.918 -0.890 0.000 0.645 0.993 +-1.987 -0.937 0.000 0.708 1.149 +-2.078 -0.981 0.000 0.747 1.220 +-2.020 -0.959 0.000 0.741 1.231 +-2.009 -0.953 0.000 0.732 1.209 +-1.903 -0.906 0.000 0.705 1.181 +-1.930 -0.914 0.000 0.701 1.156 +-1.257 -0.609 0.000 0.492 0.857 +-1.416 -0.688 0.000 0.561 0.986 +-1.253 -0.608 0.000 0.494 0.864 +-1.514 -0.735 0.000 0.598 1.050 +-1.383 -0.665 0.000 0.529 0.906 +-1.616 -0.779 0.000 0.626 1.083 +-1.301 -0.614 0.000 0.464 0.752 +-1.433 -0.674 0.000 0.507 0.818 +-1.011 -0.449 0.000 0.281 0.349 +-0.953 -0.412 0.000 0.233 0.236 +-0.662 -0.245 0.000 0.044 -0.186 +-0.748 -0.291 0.000 0.091 -0.087 +-0.490 -0.152 0.000 -0.051 -0.387 +-1.192 -0.502 0.000 0.255 0.187 +-1.312 -0.557 0.000 0.294 0.245 +-1.814 -0.826 0.000 0.569 0.819 +-1.720 -0.795 0.000 0.575 0.885 +-2.054 -0.983 0.000 0.781 1.337 +-1.832 -0.880 0.000 0.710 1.232 +-1.817 -0.893 0.000 0.762 1.394 +-1.434 -0.707 0.000 0.611 1.132 +-1.276 -0.641 0.000 0.578 1.109 +-0.948 -0.481 0.000 0.447 0.876 +-0.652 -0.343 0.000 0.346 0.718 +-0.276 -0.159 0.000 0.193 0.446 +0.074 0.004 0.000 0.073 0.258 +0.404 0.165 0.000 -0.062 0.015 +0.725 0.316 0.000 -0.175 -0.165 +0.973 0.444 0.000 -0.297 -0.410 +1.357 0.623 0.000 -0.429 -0.617 +1.550 0.736 0.000 -0.561 -0.918 +1.834 0.873 0.000 -0.673 -1.115 +1.762 0.870 0.000 -0.738 -1.345 +1.996 0.993 0.000 -0.859 -1.592 +1.777 0.923 0.000 -0.878 -1.756 +1.693 0.881 0.000 -0.844 -1.697 +1.189 0.665 0.000 -0.728 -1.595 +1.339 0.715 0.000 -0.722 -1.506 +1.320 0.708 0.000 -0.724 -1.521 +1.423 0.724 0.000 -0.667 -1.303 +1.443 0.720 0.000 -0.640 -1.213 +1.691 0.806 0.000 -0.639 -1.090 +1.574 0.748 0.000 -0.590 -1.002 +1.780 0.823 0.000 -0.602 -0.941 +1.602 0.744 0.000 -0.553 -0.880 +1.689 0.775 0.000 -0.556 -0.846 +1.471 0.677 0.000 -0.492 -0.762 +1.615 0.740 0.000 -0.530 -0.807 +1.490 0.686 0.000 -0.501 -0.778 +1.615 0.740 0.000 -0.531 -0.808 +1.471 0.677 0.000 -0.493 -0.764 +1.689 0.775 0.000 -0.557 -0.849 +1.603 0.745 0.000 -0.554 -0.883 +1.781 0.824 0.000 -0.604 -0.944 +1.576 0.749 0.000 -0.591 -1.006 +1.693 0.807 0.000 -0.640 -1.094 +1.445 0.722 0.000 -0.641 -1.216 +1.426 0.725 0.000 -0.669 -1.306 +1.323 0.710 0.000 -0.725 -1.524 +1.343 0.716 0.000 -0.724 -1.509 +1.194 0.667 0.000 -0.730 -1.599 +1.698 0.884 0.000 -0.846 -1.700 +1.783 0.925 0.000 -0.880 -1.759 +2.003 0.996 0.000 -0.861 -1.596 +1.769 0.873 0.000 -0.741 -1.349 +1.841 0.876 0.000 -0.676 -1.120 +1.557 0.739 0.000 -0.563 -0.922 +1.364 0.627 0.000 -0.431 -0.621 +0.979 0.447 0.000 -0.299 -0.414 +0.731 0.319 0.000 -0.177 -0.169 +0.409 0.168 0.000 -0.064 0.011 +0.079 0.006 0.000 0.071 0.253 +-0.272 -0.157 0.000 0.191 0.440 +-0.647 -0.340 0.000 0.343 0.712 +-0.942 -0.478 0.000 0.443 0.869 +-1.269 -0.637 0.000 0.574 1.101 +-1.426 -0.703 0.000 0.607 1.123 +-1.809 -0.889 0.000 0.758 1.385 +-1.824 -0.876 0.000 0.706 1.223 +-2.045 -0.978 0.000 0.777 1.328 +-1.712 -0.791 0.000 0.571 0.877 +-1.807 -0.822 0.000 0.565 0.812 +-1.307 -0.554 0.000 0.292 0.240 +-1.189 -0.500 0.000 0.254 0.183 +-0.488 -0.151 0.000 -0.052 -0.389 +-0.748 -0.291 0.000 0.091 -0.087 +-0.663 -0.246 0.000 0.045 -0.184 +-0.954 -0.413 0.000 0.234 0.238 +-1.014 -0.450 0.000 0.282 0.352 +-1.436 -0.676 0.000 0.509 0.822 +-1.304 -0.615 0.000 0.465 0.756 +-1.619 -0.781 0.000 0.628 1.086 +-1.386 -0.666 0.000 0.530 0.909 +-1.516 -0.736 0.000 0.600 1.053 +-1.256 -0.609 0.000 0.495 0.867 +-1.417 -0.689 0.000 0.562 0.987 +-0.696 -0.341 0.000 0.280 0.494 +-0.751 -0.357 0.000 0.270 0.439 +-0.662 -0.324 0.000 0.267 0.472 +-0.806 -0.379 0.000 0.281 0.445 +-0.769 -0.366 0.000 0.281 0.463 +-0.824 -0.377 0.000 0.257 0.366 +-0.617 -0.276 0.000 0.176 0.224 +-0.573 -0.234 0.000 0.097 0.012 +-0.301 -0.095 0.000 -0.029 -0.232 +-0.093 0.031 0.000 -0.185 -0.594 +0.070 0.120 0.000 -0.276 -0.785 +0.356 0.280 0.000 -0.449 -1.164 +0.572 0.389 0.000 -0.546 -1.347 +-0.092 0.065 0.000 -0.277 -0.867 +-0.591 -0.200 0.000 -0.011 -0.316 +-1.135 -0.472 0.000 0.227 0.129 +-1.265 -0.567 0.000 0.372 0.498 +-1.553 -0.716 0.000 0.515 0.786 +-1.507 -0.719 0.000 0.571 0.976 +-1.462 -0.703 0.000 0.571 0.997 +-1.239 -0.615 0.000 0.539 1.011 +-1.082 -0.536 0.000 0.471 0.883 +-0.881 -0.453 0.000 0.435 0.874 +-0.584 -0.302 0.000 0.296 0.604 +-0.315 -0.183 0.000 0.224 0.518 +0.039 -0.004 0.000 0.060 0.203 +0.272 0.099 0.000 -0.003 0.127 +0.601 0.271 0.000 -0.169 -0.207 +0.758 0.344 0.000 -0.223 -0.295 +1.143 0.545 0.000 -0.416 -0.681 +1.262 0.608 0.000 -0.481 -0.818 +1.539 0.764 0.000 -0.654 -1.201 +1.400 0.714 0.000 -0.650 -1.255 +1.565 0.824 0.000 -0.804 -1.638 +1.181 0.660 0.000 -0.716 -1.561 +0.962 0.587 0.000 -0.728 -1.702 +0.435 0.351 0.000 -0.576 -1.507 +0.625 0.429 0.000 -0.613 -1.525 +0.747 0.457 0.000 -0.572 -1.345 +0.855 0.492 0.000 -0.568 -1.281 +0.881 0.472 0.000 -0.485 -1.024 +1.101 0.560 0.000 -0.521 -1.025 +1.006 0.491 0.000 -0.417 -0.761 +1.215 0.582 0.000 -0.473 -0.827 +1.066 0.495 0.000 -0.372 -0.600 +1.153 0.539 0.000 -0.412 -0.675 +0.925 0.418 0.000 -0.293 -0.433 +1.093 0.506 0.000 -0.378 -0.604 +0.964 0.435 0.000 -0.304 -0.446 +1.093 0.506 0.000 -0.378 -0.605 +0.925 0.418 0.000 -0.294 -0.434 +1.153 0.539 0.000 -0.412 -0.677 +1.066 0.496 0.000 -0.374 -0.604 +1.215 0.583 0.000 -0.474 -0.830 +1.008 0.492 0.000 -0.418 -0.764 +1.102 0.561 0.000 -0.523 -1.028 +0.882 0.473 0.000 -0.486 -1.027 +0.857 0.493 0.000 -0.569 -1.284 +0.749 0.458 0.000 -0.573 -1.348 +0.628 0.431 0.000 -0.614 -1.528 +0.439 0.353 0.000 -0.578 -1.510 +0.966 0.589 0.000 -0.729 -1.704 +1.186 0.662 0.000 -0.717 -1.563 +1.571 0.827 0.000 -0.806 -1.640 +1.406 0.716 0.000 -0.651 -1.257 +1.545 0.767 0.000 -0.656 -1.203 +1.267 0.610 0.000 -0.482 -0.820 +1.147 0.547 0.000 -0.417 -0.683 +0.762 0.346 0.000 -0.225 -0.296 +0.605 0.273 0.000 -0.170 -0.209 +0.274 0.101 0.000 -0.004 0.125 +0.041 -0.002 0.000 0.059 0.200 +-0.313 -0.182 0.000 0.222 0.515 +-0.581 -0.300 0.000 0.294 0.599 +-0.877 -0.451 0.000 0.432 0.868 +-1.077 -0.533 0.000 0.468 0.876 +-1.234 -0.612 0.000 0.536 1.004 +-1.455 -0.700 0.000 0.567 0.989 +-1.500 -0.716 0.000 0.568 0.968 +-1.546 -0.712 0.000 0.511 0.778 +-1.259 -0.564 0.000 0.368 0.491 +-1.129 -0.469 0.000 0.224 0.124 +-0.587 -0.198 0.000 -0.013 -0.320 +-0.090 0.066 0.000 -0.278 -0.869 +0.573 0.389 0.000 -0.547 -1.348 +0.355 0.279 0.000 -0.449 -1.163 +0.068 0.119 0.000 -0.274 -0.782 +-0.096 0.030 0.000 -0.183 -0.590 +-0.304 -0.097 0.000 -0.027 -0.228 +-0.577 -0.236 0.000 0.099 0.016 +-0.620 -0.279 0.000 0.178 0.229 +-0.828 -0.379 0.000 0.259 0.371 +-0.773 -0.368 0.000 0.283 0.468 +-0.809 -0.381 0.000 0.283 0.449 +-0.665 -0.326 0.000 0.268 0.476 +-0.753 -0.357 0.000 0.271 0.441 +-0.040 -0.049 0.000 0.094 0.256 +-0.231 -0.132 0.000 0.142 0.307 +0.014 -0.022 0.000 0.069 0.209 +-0.276 -0.148 0.000 0.144 0.291 +-0.071 -0.050 0.000 0.065 0.157 +-0.288 -0.141 0.000 0.111 0.189 +0.112 0.059 0.000 -0.063 -0.136 +-0.018 0.015 0.000 -0.066 -0.206 +0.437 0.248 0.000 -0.282 -0.628 +0.506 0.305 0.000 -0.374 -0.870 +0.794 0.458 0.000 -0.527 -1.184 +0.978 0.565 0.000 -0.650 -1.460 +1.696 0.935 0.000 -0.998 -2.150 +0.384 0.281 0.000 -0.425 -1.077 +-0.067 0.041 0.000 -0.183 -0.577 +-0.809 -0.331 0.000 0.147 0.048 +-0.829 -0.372 0.000 0.244 0.330 +-1.298 -0.616 0.000 0.482 0.812 +-1.211 -0.596 0.000 0.511 0.939 +-1.322 -0.663 0.000 0.595 1.136 +-1.084 -0.563 0.000 0.546 1.106 +-1.049 -0.549 0.000 0.542 1.112 +-0.871 -0.475 0.000 0.506 1.091 +-0.667 -0.372 0.000 0.416 0.920 +-0.438 -0.269 0.000 0.348 0.828 +-0.148 -0.123 0.000 0.217 0.579 +0.032 -0.039 0.000 0.157 0.488 +0.319 0.110 0.000 0.015 0.204 +0.410 0.160 0.000 -0.038 0.091 +0.785 0.351 0.000 -0.214 -0.253 +0.822 0.386 0.000 -0.278 -0.426 +1.113 0.543 0.000 -0.442 -0.775 +0.872 0.455 0.000 -0.431 -0.859 +1.128 0.604 0.000 -0.607 -1.260 +0.607 0.383 0.000 -0.492 -1.171 +0.418 0.321 0.000 -0.503 -1.297 +-0.543 -0.092 0.000 -0.279 -1.095 +-0.059 0.097 0.000 -0.340 -1.041 +0.001 0.100 0.000 -0.290 -0.865 +0.188 0.165 0.000 -0.292 -0.781 +0.111 0.101 0.000 -0.186 -0.503 +0.450 0.235 0.000 -0.234 -0.485 +0.219 0.106 0.000 -0.096 -0.186 +0.558 0.249 0.000 -0.170 -0.241 +0.279 0.105 0.000 -0.036 0.021 +0.485 0.197 0.000 -0.095 -0.055 +0.135 0.022 0.000 0.057 0.228 +0.421 0.160 0.000 -0.053 0.038 +0.181 0.041 0.000 0.049 0.227 +0.421 0.160 0.000 -0.054 0.037 +0.134 0.022 0.000 0.056 0.226 +0.485 0.197 0.000 -0.096 -0.058 +0.279 0.106 0.000 -0.037 0.018 +0.558 0.249 0.000 -0.171 -0.245 +0.220 0.107 0.000 -0.098 -0.189 +0.451 0.236 0.000 -0.236 -0.488 +0.112 0.102 0.000 -0.187 -0.506 +0.189 0.166 0.000 -0.293 -0.784 +0.003 0.101 0.000 -0.290 -0.866 +-0.057 0.098 0.000 -0.340 -1.042 +-0.540 -0.090 0.000 -0.280 -1.096 +0.421 0.322 0.000 -0.504 -1.298 +0.610 0.384 0.000 -0.493 -1.171 +1.132 0.606 0.000 -0.608 -1.260 +0.875 0.456 0.000 -0.431 -0.859 +1.117 0.545 0.000 -0.443 -0.775 +0.825 0.387 0.000 -0.278 -0.426 +0.787 0.352 0.000 -0.214 -0.253 +0.412 0.160 0.000 -0.038 0.092 +0.320 0.110 0.000 0.015 0.205 +0.032 -0.039 0.000 0.157 0.488 +-0.149 -0.123 0.000 0.217 0.579 +-0.439 -0.269 0.000 0.348 0.828 +-0.667 -0.372 0.000 0.415 0.918 +-0.870 -0.474 0.000 0.505 1.087 +-1.046 -0.548 0.000 0.540 1.107 +-1.081 -0.561 0.000 0.543 1.100 +-1.317 -0.660 0.000 0.592 1.129 +-1.206 -0.593 0.000 0.508 0.933 +-1.292 -0.614 0.000 0.479 0.805 +-0.825 -0.369 0.000 0.242 0.324 +-0.805 -0.329 0.000 0.145 0.044 +-0.065 0.042 0.000 -0.185 -0.579 +0.385 0.282 0.000 -0.425 -1.078 +1.694 0.935 0.000 -0.998 -2.149 +0.975 0.563 0.000 -0.648 -1.458 +0.790 0.456 0.000 -0.525 -1.180 +0.501 0.302 0.000 -0.372 -0.865 +0.432 0.246 0.000 -0.279 -0.623 +-0.023 0.012 0.000 -0.063 -0.200 +0.107 0.056 0.000 -0.060 -0.130 +-0.293 -0.144 0.000 0.114 0.195 +-0.076 -0.052 0.000 0.068 0.163 +-0.280 -0.150 0.000 0.146 0.296 +0.010 -0.024 0.000 0.071 0.213 +-0.233 -0.133 0.000 0.143 0.309 +0.700 0.301 0.000 -0.177 -0.195 +0.602 0.279 0.000 -0.212 -0.346 +0.775 0.340 0.000 -0.214 -0.270 +0.607 0.291 0.000 -0.241 -0.429 +0.758 0.351 0.000 -0.261 -0.417 +0.678 0.346 0.000 -0.325 -0.646 +1.014 0.501 0.000 -0.436 -0.813 +0.995 0.529 0.000 -0.535 -1.116 +1.344 0.696 0.000 -0.666 -1.337 +1.457 0.791 0.000 -0.825 -1.755 +1.602 0.859 0.000 -0.875 -1.831 +1.801 0.991 0.000 -1.057 -2.278 +1.902 1.031 0.000 -1.068 -2.259 +1.464 0.824 0.000 -0.910 -2.002 +0.758 0.445 0.000 -0.522 -1.188 +0.049 0.106 0.000 -0.255 -0.733 +-0.215 -0.067 0.000 -0.018 -0.156 +-0.669 -0.290 0.000 0.169 0.183 +-0.762 -0.375 0.000 0.323 0.598 +-0.882 -0.433 0.000 0.372 0.685 +-0.826 -0.442 0.000 0.454 0.957 +-0.807 -0.422 0.000 0.419 0.861 +-0.789 -0.444 0.000 0.500 1.113 +-0.590 -0.328 0.000 0.367 0.813 +-0.497 -0.307 0.000 0.399 0.952 +-0.208 -0.144 0.000 0.218 0.553 +-0.150 -0.133 0.000 0.247 0.667 +0.137 0.036 0.000 0.045 0.206 +0.114 0.019 0.000 0.071 0.271 +0.480 0.229 0.000 -0.167 -0.261 +0.410 0.199 0.000 -0.154 -0.255 +0.686 0.371 0.000 -0.374 -0.777 +0.343 0.220 0.000 -0.281 -0.667 +0.502 0.342 0.000 -0.476 -1.172 +-0.116 0.057 0.000 -0.276 -0.876 +-0.407 -0.033 0.000 -0.308 -1.112 +-0.795 -0.218 0.000 -0.166 -0.880 +-0.595 -0.121 0.000 -0.247 -1.025 +-0.661 -0.197 0.000 -0.097 -0.609 +-0.481 -0.117 0.000 -0.148 -0.676 +-0.648 -0.242 0.000 0.043 -0.187 +-0.293 -0.084 0.000 -0.057 -0.315 +-0.562 -0.252 0.000 0.154 0.184 +-0.184 -0.077 0.000 0.027 -0.011 +-0.483 -0.252 0.000 0.233 0.455 +-0.231 -0.126 0.000 0.120 0.240 +-0.608 -0.334 0.000 0.341 0.716 +-0.279 -0.161 0.000 0.171 0.369 +-0.555 -0.314 0.000 0.337 0.730 +-0.279 -0.161 0.000 0.171 0.368 +-0.609 -0.334 0.000 0.341 0.715 +-0.232 -0.126 0.000 0.119 0.238 +-0.484 -0.252 0.000 0.232 0.452 +-0.184 -0.076 0.000 0.026 -0.014 +-0.562 -0.251 0.000 0.153 0.181 +-0.293 -0.084 0.000 -0.058 -0.318 +-0.648 -0.242 0.000 0.042 -0.189 +-0.481 -0.117 0.000 -0.149 -0.677 +-0.661 -0.197 0.000 -0.097 -0.609 +-0.594 -0.120 0.000 -0.248 -1.025 +-0.793 -0.217 0.000 -0.166 -0.879 +-0.406 -0.033 0.000 -0.308 -1.111 +-0.115 0.058 0.000 -0.276 -0.874 +0.504 0.343 0.000 -0.476 -1.170 +0.345 0.220 0.000 -0.280 -0.665 +0.687 0.371 0.000 -0.373 -0.775 +0.410 0.199 0.000 -0.153 -0.252 +0.480 0.228 0.000 -0.166 -0.258 +0.113 0.018 0.000 0.072 0.275 +0.134 0.035 0.000 0.047 0.209 +-0.154 -0.135 0.000 0.248 0.670 +-0.212 -0.145 0.000 0.219 0.556 +-0.501 -0.309 0.000 0.400 0.954 +-0.593 -0.330 0.000 0.368 0.813 +-0.791 -0.445 0.000 0.500 1.112 +-0.807 -0.422 0.000 0.418 0.859 +-0.826 -0.441 0.000 0.453 0.953 +-0.880 -0.432 0.000 0.370 0.681 +-0.760 -0.374 0.000 0.322 0.593 +-0.666 -0.288 0.000 0.167 0.178 +-0.212 -0.066 0.000 -0.020 -0.159 +0.050 0.107 0.000 -0.256 -0.736 +0.758 0.445 0.000 -0.523 -1.189 +1.462 0.823 0.000 -0.910 -2.000 +1.899 1.029 0.000 -1.066 -2.257 +1.796 0.989 0.000 -1.055 -2.273 +1.597 0.856 0.000 -0.872 -1.825 +1.451 0.788 0.000 -0.822 -1.748 +1.337 0.693 0.000 -0.663 -1.329 +0.988 0.526 0.000 -0.532 -1.109 +1.008 0.498 0.000 -0.433 -0.805 +0.672 0.342 0.000 -0.322 -0.638 +0.752 0.348 0.000 -0.258 -0.410 +0.602 0.289 0.000 -0.238 -0.423 +0.771 0.338 0.000 -0.212 -0.265 +0.600 0.278 0.000 -0.211 -0.344 +1.451 0.625 0.000 -0.361 -0.384 +1.257 0.554 0.000 -0.352 -0.449 +1.547 0.676 0.000 -0.412 -0.486 +1.293 0.584 0.000 -0.401 -0.578 +1.569 0.710 0.000 -0.486 -0.696 +1.401 0.661 0.000 -0.513 -0.857 +1.860 0.882 0.000 -0.689 -1.158 +1.732 0.855 0.000 -0.740 -1.372 +2.170 1.071 0.000 -0.922 -1.702 +2.146 1.096 0.000 -1.017 -1.994 +2.321 1.183 0.000 -1.092 -2.133 +2.360 1.234 0.000 -1.199 -2.431 +2.498 1.297 0.000 -1.240 -2.486 +1.971 1.041 0.000 -1.029 -2.111 +1.278 0.672 0.000 -0.658 -1.342 +0.475 0.282 0.000 -0.337 -0.774 +0.238 0.125 0.000 -0.120 -0.240 +-0.333 -0.161 0.000 0.133 0.236 +-0.462 -0.261 0.000 0.295 0.658 +-0.701 -0.384 0.000 0.410 0.886 +-0.700 -0.417 0.000 0.509 1.182 +-0.787 -0.455 0.000 0.533 1.211 +-0.830 -0.504 0.000 0.632 1.486 +-0.720 -0.436 0.000 0.547 1.287 +-0.681 -0.436 0.000 0.589 1.430 +-0.468 -0.312 0.000 0.445 1.104 +-0.458 -0.319 0.000 0.475 1.198 +-0.240 -0.184 0.000 0.303 0.792 +-0.312 -0.217 0.000 0.325 0.823 +-0.005 -0.036 0.000 0.112 0.337 +-0.129 -0.082 0.000 0.120 0.301 +0.101 0.065 0.000 -0.076 -0.173 +-0.294 -0.103 0.000 0.012 -0.102 +-0.133 0.016 0.000 -0.171 -0.568 +-0.790 -0.280 0.000 0.024 -0.307 +-1.100 -0.386 0.000 0.016 -0.482 +-1.517 -0.577 0.000 0.147 -0.294 +-1.327 -0.492 0.000 0.090 -0.372 +-1.502 -0.612 0.000 0.262 0.053 +-1.331 -0.543 0.000 0.232 0.047 +-1.593 -0.708 0.000 0.443 0.547 +-1.199 -0.540 0.000 0.351 0.466 +-1.554 -0.745 0.000 0.586 0.992 +-1.108 -0.547 0.000 0.460 0.832 +-1.481 -0.756 0.000 0.687 1.327 +-1.154 -0.602 0.000 0.569 1.135 +-1.602 -0.842 0.000 0.810 1.635 +-1.195 -0.638 0.000 0.630 1.295 +-1.542 -0.821 0.000 0.811 1.664 +-1.196 -0.638 0.000 0.630 1.294 +-1.603 -0.842 0.000 0.810 1.634 +-1.155 -0.602 0.000 0.569 1.133 +-1.482 -0.756 0.000 0.686 1.324 +-1.108 -0.547 0.000 0.459 0.830 +-1.554 -0.745 0.000 0.585 0.989 +-1.199 -0.540 0.000 0.351 0.464 +-1.594 -0.708 0.000 0.442 0.546 +-1.332 -0.544 0.000 0.232 0.047 +-1.503 -0.613 0.000 0.262 0.053 +-1.328 -0.492 0.000 0.091 -0.370 +-1.518 -0.577 0.000 0.148 -0.292 +-1.101 -0.387 0.000 0.017 -0.479 +-0.790 -0.281 0.000 0.026 -0.303 +-0.133 0.015 0.000 -0.169 -0.564 +-0.295 -0.104 0.000 0.014 -0.097 +0.099 0.064 0.000 -0.074 -0.167 +-0.132 -0.084 0.000 0.123 0.307 +-0.009 -0.039 0.000 0.115 0.344 +-0.317 -0.220 0.000 0.328 0.830 +-0.246 -0.187 0.000 0.306 0.799 +-0.466 -0.323 0.000 0.478 1.205 +-0.476 -0.316 0.000 0.448 1.110 +-0.689 -0.440 0.000 0.592 1.435 +-0.728 -0.440 0.000 0.550 1.290 +-0.836 -0.507 0.000 0.634 1.488 +-0.791 -0.457 0.000 0.534 1.212 +-0.703 -0.418 0.000 0.510 1.181 +-0.702 -0.384 0.000 0.410 0.885 +-0.463 -0.262 0.000 0.295 0.656 +-0.333 -0.160 0.000 0.132 0.234 +0.238 0.125 0.000 -0.120 -0.242 +0.474 0.282 0.000 -0.337 -0.774 +1.275 0.671 0.000 -0.658 -1.341 +1.967 1.039 0.000 -1.027 -2.108 +2.493 1.294 0.000 -1.238 -2.482 +2.353 1.231 0.000 -1.196 -2.424 +2.313 1.179 0.000 -1.088 -2.125 +2.138 1.092 0.000 -1.013 -1.985 +2.162 1.067 0.000 -0.918 -1.692 +1.723 0.851 0.000 -0.735 -1.362 +1.852 0.877 0.000 -0.684 -1.148 +1.394 0.657 0.000 -0.509 -0.848 +1.563 0.706 0.000 -0.482 -0.687 +1.287 0.581 0.000 -0.398 -0.571 +1.543 0.673 0.000 -0.409 -0.481 +1.255 0.553 0.000 -0.351 -0.447 +2.338 1.015 0.000 -0.602 -0.674 +2.160 0.961 0.000 -0.623 -0.824 +2.455 1.078 0.000 -0.666 -0.808 +2.239 1.015 0.000 -0.700 -1.014 +2.538 1.147 0.000 -0.780 -1.105 +2.406 1.127 0.000 -0.852 -1.385 +2.876 1.348 0.000 -1.020 -1.655 +2.753 1.335 0.000 -1.103 -1.960 +3.157 1.528 0.000 -1.255 -2.219 +3.076 1.535 0.000 -1.352 -2.546 +3.150 1.566 0.000 -1.367 -2.551 +3.056 1.556 0.000 -1.432 -2.789 +3.091 1.563 0.000 -1.415 -2.721 +2.684 1.367 0.000 -1.257 -2.447 +1.957 0.979 0.000 -0.864 -1.629 +1.134 0.586 0.000 -0.556 -1.108 +0.802 0.375 0.000 -0.278 -0.440 +0.167 0.064 0.000 -0.015 0.036 +-0.083 -0.105 0.000 0.223 0.627 +-0.403 -0.263 0.000 0.359 0.877 +-0.535 -0.371 0.000 0.542 1.358 +-0.692 -0.438 0.000 0.580 1.397 +-0.856 -0.556 0.000 0.756 1.841 +-0.799 -0.506 0.000 0.672 1.620 +-0.865 -0.566 0.000 0.777 1.901 +-0.690 -0.451 0.000 0.621 1.523 +-0.778 -0.510 0.000 0.704 1.727 +-0.593 -0.379 0.000 0.512 1.244 +-0.762 -0.461 0.000 0.580 1.365 +-0.490 -0.285 0.000 0.344 0.794 +-0.716 -0.382 0.000 0.398 0.845 +-0.515 -0.237 0.000 0.180 0.293 +-1.005 -0.454 0.000 0.315 0.459 +-0.867 -0.338 0.000 0.116 -0.067 +-1.594 -0.675 0.000 0.358 0.300 +-1.915 -0.783 0.000 0.346 0.110 +-2.244 -0.939 0.000 0.464 0.300 +-2.096 -0.867 0.000 0.404 0.193 +-2.414 -1.058 0.000 0.633 0.719 +-2.276 -0.996 0.000 0.592 0.665 +-2.654 -1.224 0.000 0.869 1.306 +-2.249 -1.046 0.000 0.760 1.176 +-2.676 -1.296 0.000 1.052 1.838 +-2.186 -1.074 0.000 0.901 1.626 +-2.611 -1.319 0.000 1.181 2.255 +-2.226 -1.135 0.000 1.032 1.997 +-2.717 -1.406 0.000 1.321 2.619 +-2.257 -1.171 0.000 1.104 2.195 +-2.652 -1.386 0.000 1.327 2.668 +-2.257 -1.171 0.000 1.104 2.194 +-2.718 -1.406 0.000 1.321 2.618 +-2.227 -1.135 0.000 1.032 1.995 +-2.612 -1.320 0.000 1.181 2.252 +-2.188 -1.075 0.000 0.900 1.623 +-2.677 -1.297 0.000 1.051 1.836 +-2.251 -1.047 0.000 0.760 1.175 +-2.656 -1.225 0.000 0.869 1.306 +-2.278 -0.997 0.000 0.593 0.666 +-2.417 -1.059 0.000 0.634 0.721 +-2.098 -0.868 0.000 0.406 0.196 +-2.247 -0.940 0.000 0.466 0.305 +-1.918 -0.785 0.000 0.349 0.116 +-1.597 -0.677 0.000 0.361 0.307 +-0.871 -0.340 0.000 0.119 -0.059 +-1.009 -0.457 0.000 0.319 0.468 +-0.521 -0.240 0.000 0.184 0.302 +-0.722 -0.386 0.000 0.402 0.855 +-0.498 -0.289 0.000 0.349 0.805 +-0.772 -0.466 0.000 0.585 1.376 +-0.604 -0.384 0.000 0.517 1.255 +-0.790 -0.516 0.000 0.710 1.738 +-0.702 -0.457 0.000 0.627 1.533 +-0.877 -0.572 0.000 0.782 1.910 +-0.810 -0.512 0.000 0.676 1.627 +-0.866 -0.561 0.000 0.759 1.846 +-0.700 -0.442 0.000 0.583 1.400 +-0.542 -0.375 0.000 0.544 1.360 +-0.408 -0.265 0.000 0.360 0.878 +-0.088 -0.107 0.000 0.225 0.628 +0.163 0.062 0.000 -0.014 0.036 +0.798 0.373 0.000 -0.277 -0.439 +1.130 0.585 0.000 -0.555 -1.106 +1.951 0.976 0.000 -0.862 -1.626 +2.678 1.364 0.000 -1.254 -2.441 +3.084 1.559 0.000 -1.411 -2.714 +3.048 1.551 0.000 -1.427 -2.781 +3.141 1.561 0.000 -1.362 -2.541 +3.066 1.529 0.000 -1.347 -2.535 +3.147 1.523 0.000 -1.250 -2.207 +2.743 1.329 0.000 -1.097 -1.949 +2.867 1.343 0.000 -1.015 -1.644 +2.397 1.122 0.000 -0.847 -1.375 +2.530 1.143 0.000 -0.775 -1.095 +2.232 1.012 0.000 -0.696 -1.006 +2.450 1.076 0.000 -0.663 -0.801 +2.157 0.959 0.000 -0.622 -0.821 +3.413 1.483 0.000 -0.879 -0.984 +3.361 1.492 0.000 -0.956 -1.239 +3.535 1.552 0.000 -0.953 -1.144 +3.494 1.578 0.000 -1.068 -1.506 +3.697 1.663 0.000 -1.112 -1.538 +3.739 1.735 0.000 -1.273 -1.997 +4.075 1.892 0.000 -1.391 -2.183 +4.091 1.953 0.000 -1.548 -2.642 +4.352 2.078 0.000 -1.646 -2.806 +4.277 2.091 0.000 -1.757 -3.173 +4.231 2.064 0.000 -1.724 -3.097 +4.012 1.993 0.000 -1.738 -3.243 +3.859 1.910 0.000 -1.649 -3.051 +3.487 1.729 0.000 -1.500 -2.784 +2.752 1.337 0.000 -1.104 -1.958 +1.967 0.961 0.000 -0.804 -1.446 +1.408 0.636 0.000 -0.427 -0.592 +0.788 0.332 0.000 -0.169 -0.122 +0.284 0.033 0.000 0.193 0.712 +-0.061 -0.137 0.000 0.338 0.979 +-0.430 -0.368 0.000 0.637 1.693 +-0.618 -0.451 0.000 0.688 1.753 +-0.937 -0.648 0.000 0.940 2.352 +-0.938 -0.625 0.000 0.875 2.159 +-1.113 -0.740 0.000 1.031 2.539 +-1.014 -0.657 0.000 0.892 2.172 +-1.166 -0.747 0.000 1.000 2.421 +-1.077 -0.654 0.000 0.821 1.932 +-1.273 -0.749 0.000 0.899 2.069 +-1.151 -0.632 0.000 0.685 1.493 +-1.396 -0.739 0.000 0.747 1.557 +-1.364 -0.662 0.000 0.558 1.010 +-1.832 -0.870 0.000 0.687 1.169 +-1.871 -0.831 0.000 0.534 0.695 +-2.547 -1.144 0.000 0.759 1.035 +-2.874 -1.256 0.000 0.753 0.859 +-3.159 -1.392 0.000 0.857 1.029 +-3.186 -1.402 0.000 0.857 1.017 +-3.606 -1.639 0.000 1.118 1.590 +-3.575 -1.628 0.000 1.115 1.596 +-3.978 -1.874 0.000 1.418 2.301 +-3.705 -1.757 0.000 1.353 2.240 +-4.059 -1.983 0.000 1.650 2.954 +-3.698 -1.821 0.000 1.544 2.811 +-4.017 -2.029 0.000 1.818 3.474 +-3.727 -1.888 0.000 1.702 3.270 +-4.091 -2.107 0.000 1.969 3.886 +-3.744 -1.924 0.000 1.788 3.516 +-4.042 -2.097 0.000 1.990 3.972 +-3.744 -1.924 0.000 1.788 3.515 +-4.092 -2.108 0.000 1.969 3.885 +-3.729 -1.889 0.000 1.702 3.268 +-4.019 -2.030 0.000 1.818 3.473 +-3.700 -1.822 0.000 1.543 2.809 +-4.061 -1.985 0.000 1.650 2.952 +-3.708 -1.758 0.000 1.353 2.240 +-3.982 -1.875 0.000 1.418 2.302 +-3.578 -1.629 0.000 1.116 1.598 +-3.609 -1.641 0.000 1.120 1.594 +-3.188 -1.403 0.000 0.859 1.021 +-3.164 -1.395 0.000 0.860 1.036 +-2.881 -1.260 0.000 0.758 0.870 +-2.554 -1.149 0.000 0.764 1.046 +-1.878 -0.836 0.000 0.540 0.707 +-1.840 -0.875 0.000 0.693 1.183 +-1.374 -0.668 0.000 0.564 1.024 +-1.408 -0.745 0.000 0.754 1.572 +-1.165 -0.639 0.000 0.693 1.509 +-1.288 -0.757 0.000 0.907 2.085 +-1.094 -0.662 0.000 0.829 1.949 +-1.184 -0.756 0.000 1.008 2.437 +-1.033 -0.666 0.000 0.900 2.186 +-1.131 -0.749 0.000 1.039 2.553 +-0.955 -0.634 0.000 0.882 2.170 +-0.952 -0.656 0.000 0.946 2.362 +-0.632 -0.457 0.000 0.693 1.761 +-0.442 -0.374 0.000 0.641 1.699 +-0.072 -0.142 0.000 0.342 0.984 +0.275 0.028 0.000 0.196 0.716 +0.779 0.328 0.000 -0.166 -0.118 +1.400 0.633 0.000 -0.424 -0.587 +1.959 0.957 0.000 -0.801 -1.440 +2.743 1.333 0.000 -1.100 -1.952 +3.476 1.724 0.000 -1.495 -2.776 +3.849 1.905 0.000 -1.645 -3.041 +4.003 1.988 0.000 -1.733 -3.232 +4.220 2.058 0.000 -1.718 -3.084 +4.264 2.084 0.000 -1.750 -3.159 +4.340 2.071 0.000 -1.639 -2.792 +4.079 1.946 0.000 -1.541 -2.628 +4.064 1.886 0.000 -1.384 -2.169 +3.728 1.729 0.000 -1.267 -1.984 +3.687 1.658 0.000 -1.106 -1.526 +3.487 1.574 0.000 -1.063 -1.496 +3.530 1.549 0.000 -0.950 -1.137 +3.358 1.491 0.000 -0.955 -1.235 +-0.662 -0.245 0.000 0.044 -0.186 +-1.312 -0.557 0.000 0.294 0.245 +1.777 0.923 0.000 -0.878 -1.756 +1.320 0.708 0.000 -0.724 -1.521 +1.323 0.710 0.000 -0.725 -1.524 +1.783 0.925 0.000 -0.880 -1.759 +-1.307 -0.554 0.000 0.292 0.240 +-0.663 -0.246 0.000 0.045 -0.184 +1.696 0.935 0.000 -0.998 -2.150 +-0.543 -0.092 0.000 -0.279 -1.095 +-0.540 -0.090 0.000 -0.280 -1.096 +1.694 0.935 0.000 -0.998 -2.149 diff --git a/Noto/Configuration/CDB/alma/AS/default_lut.txt b/Noto/Configuration/CDB/alma/AS/default_lut.txt new file mode 100644 index 000000000..3df016039 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/default_lut.txt @@ -0,0 +1,1116 @@ +1.971 0.294 0.212 -1.003 -2.088 -3.085 -13.865 +2.121 0.179 -0.060 -0.795 -2.200 -2.735 -13.865 +1.619 -0.289 -0.211 -1.140 -2.451 -2.821 -13.865 +2.685 0.686 1.160 0.087 -0.785 -1.066 -13.865 +2.308 0.421 0.447 -0.184 -0.877 -1.203 -13.865 +2.283 0.301 0.100 -0.180 -0.605 -0.464 -13.865 +1.107 -0.640 -0.336 -0.057 -0.361 -0.298 -13.865 +0.605 -0.902 -0.179 -0.120 -0.363 0.045 -13.865 +1.075 -0.504 0.406 0.258 0.320 0.932 -13.865 +1.134 -0.251 0.523 0.554 0.565 0.817 -13.865 +0.460 -0.863 0.659 -0.006 0.191 0.924 -13.865 +0.658 -1.088 0.131 -0.211 0.275 1.156 -13.865 +0.570 -0.784 -0.276 -0.188 0.616 1.219 -13.865 +1.211 -0.428 0.035 0.183 0.922 1.246 -13.865 +0.991 -0.381 0.037 0.096 0.511 0.803 -13.865 +1.413 0.130 0.574 0.233 0.600 0.599 -13.865 +0.982 0.071 0.224 -0.383 -0.217 -0.310 -13.865 +1.218 1.205 0.267 0.023 -0.358 -0.574 -13.865 +1.042 0.226 -0.182 -0.604 -1.108 -1.353 -13.865 +1.368 0.213 0.034 -0.694 -1.079 -1.966 -13.865 +1.551 0.426 0.001 -1.014 -1.463 -2.233 -13.865 +1.933 0.697 0.044 -0.804 -1.601 -2.171 -13.865 +1.009 -0.107 -0.629 -1.721 -2.853 -3.642 -13.865 +1.820 0.467 -0.312 -1.488 -2.235 -3.113 -13.865 +1.894 0.261 -0.208 -1.674 -3.082 -4.320 -5.247 +2.426 0.857 0.405 -1.009 -2.520 -3.488 -5.247 +2.171 0.265 -0.042 -1.334 -2.703 -3.640 -5.247 +2.200 0.506 -0.011 -1.088 -2.045 -2.862 -5.247 +1.792 0.170 -0.145 -1.009 -1.852 -2.382 -5.247 +1.623 -0.044 -0.351 -0.796 -1.362 -1.610 -5.247 +0.924 -0.342 -0.357 -0.407 -0.534 -0.686 -5.247 +0.423 -0.666 -0.251 -0.059 -0.022 0.178 -5.247 +0.617 -0.644 0.075 0.344 0.509 1.113 -5.247 +0.346 -0.985 0.270 0.232 0.724 1.466 -5.247 +0.663 -0.893 0.299 0.197 0.964 1.978 -5.247 +0.601 -0.954 -0.091 0.205 0.794 2.108 -5.247 +0.568 -0.702 -0.031 0.413 1.176 2.143 -5.247 +0.705 -0.578 0.071 0.071 0.935 2.028 -5.247 +0.524 -0.576 -0.110 -0.019 0.769 1.477 -5.247 +0.608 -0.601 -0.069 -0.188 0.451 0.788 -5.247 +0.946 -0.040 0.215 -0.253 0.277 0.428 -5.247 +0.832 -0.268 -0.266 -0.591 -0.548 -0.694 -5.247 +1.179 0.002 -0.324 -0.633 -1.127 -1.544 -5.247 +1.596 0.386 -0.121 -0.995 -1.335 -2.078 -5.247 +1.626 0.458 0.146 -1.150 -1.682 -2.839 -5.247 +1.937 0.686 0.090 -1.259 -2.181 -3.496 -5.247 +1.959 0.327 -0.207 -1.627 -2.898 -4.090 -5.247 +2.439 0.838 0.237 -1.300 -2.579 -3.834 -5.247 +2.793 1.559 0.459 -1.270 -2.885 -4.406 0.619 +2.823 1.463 0.447 -1.308 -2.881 -4.496 0.619 +2.914 1.487 0.740 -1.222 -2.716 -4.277 0.619 +3.030 1.535 0.578 -1.302 -2.929 -4.366 0.619 +2.793 1.276 0.510 -1.168 -2.653 -3.734 0.619 +2.814 1.359 0.441 -1.071 -2.450 -3.589 0.619 +2.717 1.217 0.506 -0.744 -1.887 -2.920 0.619 +2.213 0.700 0.058 -1.113 -2.193 -3.281 0.619 +2.452 0.904 0.323 -0.801 -1.690 -2.599 0.619 +2.293 0.572 0.000 -1.002 -2.103 -3.062 0.619 +2.007 0.205 -0.153 -0.794 -1.426 -2.349 0.619 +1.934 0.324 0.025 -0.537 -1.183 -1.557 0.619 +1.639 0.377 0.252 -0.232 -0.748 -0.743 0.619 +1.143 0.029 0.134 -0.048 -0.261 -0.368 0.619 +1.206 0.008 0.447 0.319 0.262 0.397 0.619 +0.505 -0.537 0.034 0.268 0.279 0.592 0.619 +1.132 -0.028 0.633 0.727 1.011 1.347 0.619 +0.773 -0.454 0.424 0.562 0.941 1.525 0.619 +0.503 -0.721 0.283 0.398 0.913 1.529 0.619 +0.049 -1.042 0.141 0.368 0.929 1.845 0.619 +0.340 -0.740 0.355 0.463 1.121 2.212 0.619 +0.339 -0.905 0.083 0.410 1.371 2.760 0.619 +0.811 -0.720 0.379 0.710 1.529 2.973 0.619 +0.413 -0.857 0.129 0.512 1.264 2.884 0.619 +0.414 -0.739 0.024 0.510 1.156 2.765 0.619 +0.310 -0.856 -0.155 0.339 1.068 2.692 0.619 +0.590 -0.654 0.264 0.546 1.249 2.777 0.619 +0.776 -0.452 0.133 0.642 1.633 3.011 0.619 +0.514 -0.385 0.198 0.424 1.388 2.316 0.619 +0.241 -0.820 -0.333 0.004 0.932 1.746 0.619 +1.072 -0.095 0.600 0.490 1.401 1.878 0.619 +0.384 -0.680 0.211 -0.144 0.643 1.130 0.619 +0.267 -0.523 -0.022 -0.012 0.492 0.810 0.619 +0.695 -0.309 0.188 -0.011 0.796 0.856 0.619 +1.217 0.385 0.600 0.497 0.894 0.758 0.619 +0.980 0.053 0.104 0.048 0.095 -0.194 0.619 +1.029 -0.239 -0.303 -0.523 -0.696 -1.052 0.619 +1.244 -0.157 -0.319 -0.901 -1.184 -1.869 0.619 +1.659 0.181 -0.124 -0.806 -1.017 -2.090 0.619 +2.314 0.597 0.117 -0.893 -1.461 -2.829 0.619 +2.433 0.823 0.503 -0.458 -1.112 -2.516 0.619 +1.899 0.587 0.160 -1.101 -1.961 -3.203 0.619 +2.287 1.306 0.633 -0.618 -1.600 -2.802 0.619 +2.294 1.039 0.436 -0.968 -2.161 -3.585 0.619 +2.860 1.367 0.694 -0.863 -2.003 -3.452 0.619 +2.496 0.741 -0.346 -1.955 -3.492 -5.104 0.619 +2.155 0.646 -0.162 -2.000 -3.360 -4.947 0.619 +2.363 0.796 -0.122 -1.819 -3.479 -4.944 0.619 +3.000 1.315 0.080 -1.845 -3.671 -5.487 5.121 +2.628 1.264 0.127 -1.829 -3.785 -5.403 5.121 +2.829 1.442 0.409 -1.723 -3.626 -5.412 5.121 +3.079 1.627 0.399 -1.533 -3.256 -5.070 5.121 +2.735 1.224 0.138 -1.707 -3.448 -4.947 5.121 +2.585 1.284 0.153 -1.501 -3.167 -4.529 5.121 +2.574 1.088 0.241 -1.229 -2.776 -4.010 5.121 +2.580 1.106 0.425 -0.920 -2.355 -3.643 5.121 +1.922 0.527 -0.059 -1.209 -2.564 -3.871 5.121 +2.017 0.458 -0.182 -1.171 -2.398 -3.546 5.121 +2.352 0.876 0.380 -0.503 -1.230 -2.254 5.121 +1.950 0.722 0.209 -0.452 -1.073 -1.614 5.121 +1.220 0.330 0.103 -0.486 -0.680 -0.885 5.121 +0.471 -0.407 -0.285 -0.623 -0.599 -0.446 5.121 +0.511 -0.492 -0.130 -0.337 -0.136 0.190 5.121 +0.307 -0.752 0.217 0.012 0.365 0.826 5.121 +0.406 -0.590 0.283 0.358 0.804 1.445 5.121 +0.220 -0.699 0.242 0.488 1.004 1.767 5.121 +0.387 -0.540 0.361 0.683 1.125 2.210 5.121 +0.055 -0.807 0.235 0.609 1.276 2.463 5.121 +0.169 -0.957 0.255 0.653 1.396 2.721 5.121 +0.278 -1.114 -0.003 0.456 1.502 2.964 5.121 +0.407 -0.968 -0.007 0.584 1.684 3.203 5.121 +0.393 -0.851 0.116 0.821 1.757 3.412 5.121 +0.393 -0.696 -0.024 0.678 1.562 3.334 5.121 +0.417 -0.630 0.074 0.642 1.618 3.447 5.121 +0.395 -0.602 0.085 0.704 1.564 3.378 5.121 +0.415 -0.713 -0.125 0.458 1.602 3.323 5.121 +0.292 -0.668 -0.194 0.434 1.582 2.861 5.121 +0.294 -0.487 -0.198 0.347 1.451 2.530 5.121 +0.322 -0.337 0.081 0.481 1.367 2.256 5.121 +0.147 -0.715 -0.199 0.061 0.911 1.652 5.121 +0.272 -0.533 -0.059 0.098 0.828 1.390 5.121 +-0.004 -0.820 -0.325 -0.344 0.421 0.747 5.121 +0.099 -0.665 -0.420 -0.320 0.118 0.242 5.121 +0.627 -0.187 -0.178 -0.062 0.135 -0.050 5.121 +0.618 -0.400 -0.568 -0.589 -0.741 -1.112 5.121 +1.219 0.194 -0.228 -0.755 -1.080 -1.747 5.121 +1.561 0.158 -0.167 -0.769 -1.368 -2.495 5.121 +1.625 0.152 -0.305 -1.177 -2.029 -3.458 5.121 +2.094 0.575 0.059 -1.071 -2.018 -3.478 5.121 +2.041 0.704 0.019 -1.078 -2.087 -3.680 5.121 +2.334 1.079 0.208 -1.052 -2.344 -3.925 5.121 +2.569 1.199 0.313 -1.291 -2.579 -4.363 5.121 +2.994 1.307 0.468 -1.386 -2.780 -4.614 5.121 +2.816 0.922 0.000 -2.075 -3.615 -5.626 5.121 +2.879 1.282 0.095 -1.900 -3.778 -5.640 5.121 +2.870 1.011 -0.121 -1.948 -3.808 -5.833 5.121 +3.508 1.526 0.434 -1.337 -3.301 -5.129 7.938 +3.286 1.550 0.395 -1.246 -3.425 -5.330 7.938 +3.293 1.603 0.381 -1.602 -3.801 -5.711 7.938 +3.493 1.966 0.520 -1.402 -3.534 -5.340 7.938 +3.285 1.832 0.423 -1.456 -2.993 -4.653 7.938 +3.274 1.847 0.649 -1.007 -2.525 -3.944 7.938 +2.429 1.015 0.002 -1.159 -2.697 -3.854 7.938 +2.466 1.241 0.327 -0.636 -1.784 -3.059 7.938 +2.152 0.985 -0.071 -0.751 -1.865 -3.074 7.938 +1.834 0.445 -0.462 -1.228 -2.342 -3.328 7.938 +2.069 0.600 -0.124 -0.728 -1.645 -2.435 7.938 +1.353 0.173 -0.150 -0.734 -1.143 -1.741 7.938 +1.077 0.203 -0.010 -0.266 -0.415 -0.643 7.938 +0.514 -0.110 -0.167 -0.237 -0.185 0.055 7.938 +0.906 0.072 0.396 0.323 0.582 0.970 7.938 +0.329 -0.438 0.155 0.214 0.511 1.006 7.938 +0.359 -0.417 0.393 0.305 0.785 1.364 7.938 +0.153 -0.628 0.287 0.529 0.949 1.757 7.938 +0.046 -0.538 0.139 0.440 1.118 1.862 7.938 +-0.348 -0.887 -0.003 0.593 1.373 2.740 7.938 +0.014 -0.621 0.101 0.607 1.439 2.969 7.938 +0.260 -0.811 0.104 0.731 1.625 3.425 7.938 +0.326 -0.710 0.204 0.704 1.777 3.418 7.938 +0.329 -0.551 0.199 0.897 1.815 3.395 7.938 +0.362 -0.358 0.099 0.808 1.830 3.284 7.938 +0.225 -0.613 0.133 0.710 1.809 3.444 7.938 +0.349 -0.431 0.006 0.594 1.638 3.379 7.938 +0.510 -0.193 0.074 0.715 1.669 3.680 7.938 +0.315 -0.353 -0.312 0.457 1.515 3.008 7.938 +0.062 -0.385 -0.315 0.362 1.482 2.693 7.938 +0.044 -0.471 -0.358 0.243 1.044 1.745 7.938 +0.005 -0.736 -0.149 0.074 0.804 1.425 7.938 +0.272 -0.515 -0.333 0.007 0.677 1.101 7.938 +0.180 -0.535 -0.308 -0.218 0.667 0.957 7.938 +0.282 -0.307 -0.275 -0.194 0.399 0.599 7.938 +0.196 -0.582 -0.483 -0.361 0.050 -0.133 7.938 +0.701 -0.209 -0.318 -0.512 -0.636 -0.897 7.938 +0.823 -0.365 -0.418 -0.682 -1.143 -1.908 7.938 +1.639 0.246 0.008 -0.682 -1.415 -2.480 7.938 +1.741 0.399 0.021 -0.748 -1.974 -3.090 7.938 +1.823 0.547 0.075 -0.854 -2.111 -3.196 7.938 +1.772 0.667 0.084 -0.920 -2.070 -3.315 7.938 +1.988 0.800 0.099 -1.077 -2.157 -3.674 7.938 +2.613 1.291 0.418 -1.084 -2.558 -4.220 7.938 +3.132 1.531 0.397 -1.589 -3.051 -5.102 7.938 +3.378 1.279 0.217 -2.022 -3.624 -5.928 7.938 +3.511 1.401 0.450 -1.950 -3.662 -5.910 7.938 +3.220 1.348 0.249 -1.803 -3.531 -5.593 7.938 +3.220 1.552 0.515 -1.378 -3.600 -5.330 9.587 +3.255 1.597 0.454 -1.316 -3.574 -5.309 9.587 +3.387 1.715 0.530 -1.366 -3.260 -5.199 9.587 +3.113 1.820 0.589 -1.365 -3.069 -4.995 9.587 +3.032 1.678 0.586 -1.101 -2.607 -4.005 9.587 +2.141 1.123 0.031 -1.123 -2.491 -3.632 9.587 +2.425 1.294 0.468 -0.514 -1.737 -2.600 9.587 +1.821 0.862 -0.115 -0.843 -1.619 -2.659 9.587 +1.670 0.839 -0.087 -0.507 -1.336 -2.185 9.587 +1.258 0.486 -0.322 -0.662 -1.663 -2.421 9.587 +1.080 0.219 -0.284 -0.576 -1.143 -1.717 9.587 +0.811 0.020 -0.277 -0.419 -0.843 -1.216 9.587 +0.673 -0.069 -0.231 -0.240 -0.220 -0.546 9.587 +0.464 -0.092 -0.012 -0.012 0.215 0.176 9.587 +0.209 -0.269 -0.025 0.098 0.443 0.744 9.587 +-0.027 -0.329 0.075 0.341 0.679 1.073 9.587 +-0.049 -0.240 0.273 0.518 0.983 1.657 9.587 +-0.185 -0.163 0.400 0.557 0.988 1.782 9.587 +-0.491 -0.655 0.030 0.278 0.841 1.747 9.587 +-0.561 -0.323 0.118 0.644 1.249 2.360 9.587 +-0.257 -0.436 0.233 0.705 1.383 2.652 9.587 +-0.068 -0.514 0.325 0.911 1.687 3.175 9.587 +-0.047 -0.713 0.085 0.918 1.634 3.241 9.587 +-0.089 -0.444 -0.011 0.928 2.002 3.309 9.587 +-0.091 -0.471 -0.005 0.834 1.929 3.070 9.587 +-0.108 -0.371 0.105 0.690 1.976 3.141 9.587 +0.020 -0.402 0.108 0.734 1.885 3.316 9.587 +-0.217 -0.573 -0.182 0.495 1.501 3.089 9.587 +-0.164 -0.428 -0.042 0.609 1.579 2.699 9.587 +-0.072 -0.266 -0.155 0.556 1.510 2.378 9.587 +0.000 -0.355 -0.171 0.535 1.138 1.971 9.587 +-0.297 -0.867 -0.335 0.096 0.826 1.400 9.587 +-0.042 -0.825 -0.375 0.142 0.725 1.126 9.587 +-0.018 -0.845 -0.528 -0.114 0.599 0.647 9.587 +-0.071 -0.803 -0.306 -0.147 0.280 0.153 9.587 +0.260 -0.468 0.045 -0.131 -0.010 -0.007 9.587 +0.484 -0.356 -0.063 -0.113 -0.100 -0.465 9.587 +0.576 -0.338 -0.237 -0.411 -0.788 -1.248 9.587 +1.032 -0.023 0.262 -0.421 -0.940 -1.632 9.587 +0.781 -0.152 -0.276 -1.049 -1.807 -2.554 9.587 +1.043 -0.080 -0.229 -0.939 -1.888 -2.879 9.587 +1.312 0.188 -0.006 -0.867 -1.818 -2.704 9.587 +1.537 0.571 0.159 -0.850 -1.980 -3.057 9.587 +2.160 1.048 0.435 -0.836 -2.054 -3.650 9.587 +2.588 1.269 0.528 -1.208 -2.469 -4.560 9.587 +3.004 1.237 0.315 -1.826 -3.258 -5.481 9.587 +3.149 1.245 0.212 -1.838 -3.344 -5.546 9.587 +3.284 1.539 0.395 -1.580 -3.429 -5.454 9.587 +2.958 1.596 0.356 -1.201 -3.405 -5.062 10.270 +3.283 1.632 0.225 -1.447 -3.315 -5.031 10.270 +3.102 1.644 0.089 -1.419 -3.472 -5.105 10.270 +3.238 1.686 0.250 -1.438 -3.292 -5.074 10.270 +3.014 1.506 0.315 -1.660 -3.227 -5.099 10.270 +3.196 2.031 0.827 -1.309 -2.888 -4.927 10.270 +2.825 1.724 0.432 -1.246 -2.803 -4.563 10.270 +2.401 1.303 -0.037 -1.470 -3.060 -4.673 10.270 +2.170 1.266 0.213 -0.967 -2.271 -3.368 10.270 +1.823 0.993 -0.123 -1.062 -2.321 -3.204 10.270 +1.746 1.111 0.061 -0.734 -1.719 -2.483 10.270 +1.588 1.065 -0.008 -0.277 -1.232 -1.935 10.270 +1.145 0.648 -0.144 -0.478 -1.062 -1.669 10.270 +1.431 1.069 0.269 -0.226 -0.833 -1.220 10.270 +0.846 0.403 -0.136 -0.587 -1.379 -1.726 10.270 +1.114 0.466 -0.059 -0.428 -1.333 -1.706 10.270 +0.589 0.260 -0.103 -0.587 -1.214 -1.802 10.270 +0.980 0.517 -0.113 -0.418 -1.045 -1.571 10.270 +0.689 0.181 -0.368 -0.486 -1.224 -1.517 10.270 +0.700 0.227 -0.171 -0.483 -1.076 -1.361 10.270 +0.444 0.048 -0.176 -0.361 -0.777 -1.166 10.270 +0.701 0.238 0.162 -0.048 -0.558 -0.740 10.270 +0.231 -0.046 -0.179 -0.118 -0.578 -0.626 10.270 +0.158 -0.120 -0.180 -0.002 -0.418 -0.412 10.270 +-0.076 -0.211 0.020 0.073 -0.093 -0.097 10.270 +0.307 0.223 0.406 0.459 0.425 0.563 10.270 +-0.220 -0.206 0.025 0.056 0.106 0.338 10.270 +-0.015 -0.128 0.086 0.117 0.153 0.577 10.270 +-0.225 -0.501 -0.004 0.137 0.236 0.473 10.270 +-0.145 -0.348 -0.013 0.437 0.455 0.833 10.270 +-0.265 -0.375 0.144 0.364 0.739 1.105 10.270 +-0.369 -0.340 0.161 0.326 0.755 1.115 10.270 +-0.561 -0.217 0.190 0.380 0.983 1.229 10.270 +-0.689 -0.424 0.216 0.229 0.757 1.130 10.270 +-0.790 -0.575 0.092 0.133 0.671 1.148 10.270 +-0.776 -0.538 0.102 0.182 0.609 1.181 10.270 +-0.402 -0.166 0.517 0.510 0.864 1.585 10.270 +-0.547 -0.273 0.429 0.496 0.955 1.722 10.270 +-0.902 -0.499 0.179 0.449 1.045 1.829 10.270 +-0.628 -0.475 0.230 0.595 1.107 2.203 10.270 +-0.510 -0.472 0.328 0.756 1.273 2.333 10.270 +-0.294 -0.535 0.505 0.796 1.480 2.626 10.270 +-0.348 -0.641 0.466 0.769 1.534 2.856 10.270 +-0.178 -0.616 0.392 0.690 1.685 3.120 10.270 +-0.172 -0.403 0.312 0.825 2.080 3.230 10.270 +-0.319 -0.403 0.336 0.969 2.163 3.207 10.270 +-0.202 -0.342 0.227 0.867 2.097 3.224 10.270 +-0.318 -0.439 0.024 0.640 1.902 2.976 10.270 +-0.328 -0.404 -0.058 0.736 1.927 3.009 10.270 +-0.222 -0.385 0.010 0.551 2.012 2.891 10.270 +-0.353 -0.441 -0.258 0.379 1.745 2.665 10.270 +-0.495 -0.449 -0.292 0.436 1.607 2.700 10.270 +-0.368 -0.655 -0.297 0.486 1.665 2.675 10.270 +-0.122 -0.544 -0.240 0.546 1.539 2.691 10.270 +-0.030 -0.385 -0.111 0.571 1.500 2.620 10.270 +-0.290 -0.644 -0.214 0.228 1.222 2.322 10.270 +-0.163 -0.333 -0.054 0.408 1.334 2.143 10.270 +-0.334 -0.500 -0.198 0.260 1.065 1.867 10.270 +-0.296 -0.370 -0.132 0.320 1.053 1.762 10.270 +0.055 -0.209 0.141 0.459 1.125 1.725 10.270 +-0.112 -0.534 0.015 0.397 0.922 1.310 10.270 +-0.595 -1.161 -0.566 -0.195 0.295 0.838 10.270 +-0.201 -0.802 -0.045 0.275 0.723 1.204 10.270 +-0.221 -0.985 -0.262 0.249 0.665 0.985 10.270 +-0.375 -1.086 -0.483 0.040 0.608 0.830 10.270 +-0.146 -0.732 -0.155 0.067 0.830 0.718 10.270 +-0.341 -1.119 -0.256 -0.111 0.464 0.341 10.270 +-0.163 -1.110 -0.124 -0.004 0.369 0.196 10.270 +-0.321 -1.107 -0.312 -0.224 0.167 -0.027 10.270 +0.261 -0.419 0.156 0.273 0.660 0.457 10.270 +-0.189 -0.659 -0.262 -0.188 0.141 0.023 10.270 +0.112 -0.331 0.112 -0.022 0.441 0.140 10.270 +-0.368 -0.542 -0.427 -0.581 -0.218 -0.505 10.270 +-0.205 -0.492 -0.307 -0.507 -0.418 -0.637 10.270 +0.225 -0.234 -0.066 -0.300 -0.369 -0.761 10.270 +0.515 -0.211 0.013 -0.342 -0.546 -0.915 10.270 +0.407 -0.260 0.003 -0.463 -0.638 -1.248 10.270 +0.894 0.109 0.290 -0.346 -0.471 -1.232 10.270 +0.609 -0.173 -0.127 -0.606 -0.911 -1.806 10.270 +0.682 -0.310 -0.298 -0.757 -1.101 -2.035 10.270 +0.834 0.151 -0.094 -0.344 -0.857 -1.754 10.270 +0.457 -0.053 -0.501 -0.724 -1.438 -2.172 10.270 +0.547 -0.220 -0.249 -0.716 -1.245 -1.991 10.270 +0.820 -0.182 -0.245 -0.621 -1.472 -2.086 10.270 +0.859 0.090 -0.127 -0.405 -1.418 -2.069 10.270 +0.952 0.008 -0.171 -0.852 -1.737 -2.503 10.270 +1.659 0.605 0.525 -0.617 -1.423 -2.683 10.270 +1.953 0.838 0.760 -0.807 -1.507 -3.173 10.270 +1.937 0.733 0.696 -1.105 -1.827 -3.706 10.270 +2.221 0.609 0.381 -1.716 -2.622 -4.776 10.270 +2.471 0.962 0.413 -1.453 -2.704 -4.747 10.270 +2.804 1.142 0.627 -1.500 -3.025 -5.097 10.270 +2.654 1.186 0.609 -1.487 -3.091 -5.070 10.270 +2.830 1.339 0.546 -1.457 -3.261 -5.362 10.270 +2.976 1.451 0.527 -1.304 -3.287 -5.149 10.270 +2.943 1.762 0.442 -1.101 -3.331 -5.091 10.270 +2.914 1.668 0.588 -0.924 -3.098 -4.688 10.174 +2.657 1.530 0.362 -1.092 -3.065 -4.803 10.174 +2.765 1.592 0.319 -1.155 -3.176 -4.797 10.174 +2.519 1.305 0.099 -1.553 -3.145 -5.075 10.174 +3.073 1.647 0.265 -1.226 -2.885 -4.541 10.174 +2.156 1.332 -0.128 -1.536 -3.025 -4.640 10.174 +2.326 1.565 0.175 -0.935 -2.327 -3.880 10.174 +1.885 1.431 0.061 -0.765 -1.827 -3.516 10.174 +1.447 1.031 -0.080 -0.857 -1.532 -2.960 10.174 +0.975 0.575 -0.372 -0.745 -1.393 -2.396 10.174 +1.076 0.827 0.015 -0.311 -0.791 -1.522 10.174 +0.619 0.457 -0.160 -0.216 -0.612 -1.011 10.174 +0.126 0.222 -0.255 -0.147 -0.472 -0.417 10.174 +0.456 0.444 0.175 0.299 -0.145 -0.036 10.174 +-0.172 -0.081 -0.168 -0.156 -0.541 -0.415 10.174 +0.108 0.140 -0.167 -0.060 -0.542 -0.388 10.174 +0.085 0.343 -0.050 -0.004 -0.400 -0.188 10.174 +0.066 0.289 -0.082 -0.054 -0.463 -0.457 10.174 +-0.259 -0.017 -0.217 -0.275 -0.591 -0.823 10.174 +-0.055 -0.075 -0.181 -0.128 -0.497 -0.581 10.174 +-0.149 -0.140 -0.285 -0.174 -0.372 -0.474 10.174 +-0.419 -0.100 -0.212 0.004 -0.344 -0.247 10.174 +-0.608 -0.142 -0.068 0.106 -0.381 -0.291 10.174 +-0.813 -0.165 0.062 0.112 -0.177 0.018 10.174 +-0.792 -0.403 0.091 0.113 -0.046 0.255 10.174 +-0.861 -0.419 0.050 0.050 -0.050 0.311 10.174 +-0.821 -0.597 -0.056 -0.028 0.057 0.367 10.174 +-0.595 -0.504 0.176 0.187 0.027 0.551 10.174 +-0.680 -0.683 -0.114 0.102 -0.027 0.459 10.174 +-0.613 -0.497 0.094 0.330 0.378 0.853 10.174 +-0.567 -0.487 0.233 0.443 0.774 0.932 10.174 +-0.743 -0.508 0.233 0.500 0.786 0.947 10.174 +-1.001 -0.390 0.292 0.410 0.820 0.852 10.174 +-1.173 -0.533 0.314 0.352 0.847 0.970 10.174 +-1.075 -0.595 0.243 0.255 0.762 0.834 10.174 +-0.934 -0.427 0.345 0.421 0.864 1.031 10.174 +-0.681 -0.148 0.575 0.520 0.877 1.139 10.174 +-0.509 0.015 0.657 0.811 1.239 1.655 10.174 +-0.953 -0.492 0.233 0.563 0.923 1.530 10.174 +-0.754 -0.415 0.470 0.725 1.012 1.837 10.174 +-0.757 -0.620 0.338 0.579 1.220 1.940 10.174 +-0.668 -0.667 0.352 0.740 1.365 2.350 10.174 +-0.380 -0.617 0.370 0.662 1.448 2.536 10.174 +-0.423 -0.658 0.298 0.673 1.698 2.782 10.174 +-0.309 -0.359 0.313 0.739 2.141 2.912 10.174 +0.069 0.114 0.585 1.208 2.671 3.505 10.174 +-0.332 -0.339 0.184 0.748 2.203 2.962 10.174 +-0.319 -0.179 0.240 0.848 2.181 3.115 10.174 +-0.214 -0.059 0.329 0.875 2.253 3.111 10.174 +-0.153 0.125 0.189 0.950 2.346 3.068 10.174 +0.016 0.113 0.106 0.955 2.218 2.842 10.174 +-0.132 0.045 0.133 0.862 2.156 2.770 10.174 +0.055 0.137 0.020 0.809 1.932 2.664 10.174 +-0.189 -0.149 -0.176 0.567 1.557 2.481 10.174 +0.027 0.029 -0.007 0.698 1.553 2.471 10.174 +-0.112 -0.095 -0.037 0.617 1.451 2.111 10.174 +-0.135 -0.056 -0.082 0.566 1.094 1.707 10.174 +-0.278 -0.411 -0.158 0.366 0.855 1.227 10.174 +-0.337 -0.457 0.083 0.188 0.793 1.210 10.174 +-0.225 -0.328 0.016 0.107 0.714 1.132 10.174 +-0.256 -0.544 -0.086 -0.011 0.453 0.736 10.174 +-0.401 -0.586 0.069 0.215 1.013 1.030 10.174 +-0.691 -0.927 -0.225 0.055 0.644 0.744 10.174 +-0.844 -0.916 -0.188 0.286 0.784 1.024 10.174 +-0.581 -0.668 -0.152 0.135 0.970 0.763 10.174 +-0.943 -1.121 -0.263 -0.089 0.701 0.513 10.174 +-0.630 -1.075 0.098 0.116 0.732 0.638 10.174 +-0.547 -1.163 -0.198 -0.041 0.778 0.531 10.174 +-0.488 -0.970 -0.146 0.043 0.400 0.242 10.174 +-0.328 -0.649 -0.045 0.146 0.579 0.308 10.174 +-0.486 -0.532 -0.154 -0.085 0.436 0.135 10.174 +-0.931 -0.853 -0.501 -0.581 0.025 -0.192 10.174 +-0.730 -0.434 -0.121 -0.198 0.258 -0.080 10.174 +-0.446 -0.189 0.121 -0.003 0.306 -0.029 10.174 +-0.730 -0.385 -0.084 -0.245 -0.164 -0.495 10.174 +-0.599 -0.521 -0.447 -0.404 -0.488 -0.694 10.174 +-0.434 -0.622 -0.347 -0.540 -0.594 -0.780 10.174 +-0.060 -0.298 -0.056 -0.388 -0.504 -0.739 10.174 +0.454 0.058 0.159 -0.051 -0.098 -0.494 10.174 +0.361 -0.058 0.042 -0.106 -0.293 -0.732 10.174 +0.024 -0.193 -0.181 -0.222 -0.336 -0.795 10.174 +0.233 0.182 0.058 -0.101 -0.315 -0.890 10.174 +0.291 0.200 0.067 0.117 0.016 -0.337 10.174 +-0.027 -0.392 -0.355 -0.254 -0.502 -0.899 10.174 +0.503 -0.013 0.123 0.227 0.020 -0.491 10.174 +0.290 -0.105 -0.034 -0.194 -0.461 -1.189 10.174 +0.477 -0.182 0.151 -0.314 -0.528 -1.689 10.174 +0.655 0.206 0.201 -0.971 -0.839 -2.225 10.174 +1.001 0.306 0.304 -1.172 -1.389 -3.036 10.174 +1.461 0.719 0.459 -1.107 -1.879 -3.692 10.174 +1.749 0.751 0.301 -1.246 -2.344 -3.988 10.174 +1.923 1.001 0.394 -1.409 -2.630 -4.314 10.174 +2.120 1.230 0.315 -1.258 -3.039 -4.603 10.174 +2.381 1.487 0.553 -1.041 -2.813 -4.655 10.174 +2.377 1.517 0.405 -1.099 -3.192 -4.782 10.174 +2.772 1.580 0.713 -0.766 -3.021 -4.774 10.174 +2.394 1.222 0.521 -0.806 -3.204 -4.414 9.410 +2.565 1.670 0.663 -0.865 -2.884 -4.350 9.410 +2.331 1.450 0.237 -1.128 -2.972 -4.419 9.410 +2.243 1.333 -0.143 -1.562 -3.094 -4.666 9.410 +2.241 1.766 0.361 -1.184 -2.358 -3.850 9.410 +2.449 1.722 0.581 -1.292 -2.293 -3.762 9.410 +2.002 1.397 0.250 -1.041 -1.804 -3.068 9.410 +1.579 1.174 -0.059 -0.898 -1.842 -2.850 9.410 +1.070 0.935 0.036 -0.260 -1.036 -1.704 9.410 +0.767 0.616 -0.167 0.109 -0.097 -1.035 9.410 +0.312 0.222 -0.183 -0.190 -0.353 -0.447 9.410 +-0.346 0.014 -0.485 -0.020 0.010 0.117 9.410 +-0.696 -0.284 -0.527 0.018 0.514 0.852 9.410 +-0.600 -0.231 -0.647 -0.127 0.060 0.279 9.410 +-0.952 -0.616 -0.668 -0.229 -0.224 0.154 9.410 +-0.605 -0.495 -0.399 -0.023 -0.216 0.136 9.410 +-0.362 0.012 -0.084 0.382 0.251 0.888 9.410 +-0.646 -0.320 -0.581 0.062 -0.468 -0.088 9.410 +-0.775 -0.291 -0.526 0.108 -0.052 0.150 9.410 +-0.468 -0.238 -0.407 0.168 -0.025 -0.010 9.410 +-0.558 -0.274 -0.413 0.265 -0.087 0.207 9.410 +-0.547 -0.364 -0.164 0.143 -0.071 0.152 9.410 +-0.914 -0.432 -0.235 0.077 -0.082 0.206 9.410 +-0.972 -0.388 -0.031 0.168 -0.015 0.233 9.410 +-0.852 -0.117 0.272 0.323 0.236 0.680 9.410 +-1.014 -0.404 -0.017 -0.012 -0.108 0.312 9.410 +-0.934 -0.370 -0.032 0.094 -0.080 0.391 9.410 +-0.954 -0.555 -0.180 0.000 -0.036 0.343 9.410 +-0.677 -0.658 -0.058 0.155 -0.121 0.351 9.410 +-0.787 -0.716 -0.172 -0.005 -0.229 0.202 9.410 +-0.676 -0.657 0.119 0.154 0.313 0.400 9.410 +-1.056 -0.627 0.227 0.084 0.491 0.430 9.410 +-1.365 -0.715 0.055 -0.041 0.350 0.112 9.410 +-1.422 -0.739 0.168 0.189 0.480 0.407 9.410 +-1.320 -0.791 0.034 0.059 0.376 0.139 9.410 +-1.036 -0.641 0.189 0.140 0.361 0.181 9.410 +-0.641 -0.277 0.200 0.026 0.216 -0.189 9.410 +-0.636 -0.329 0.210 0.212 0.503 0.547 9.410 +-0.942 -0.707 0.142 0.263 0.750 0.799 9.410 +-0.760 -0.571 0.254 0.450 1.048 1.155 9.410 +-0.494 -0.433 0.244 0.695 0.808 1.507 9.410 +-0.609 -0.517 0.097 0.507 1.097 1.933 9.410 +-0.524 -0.584 0.216 0.530 1.150 1.835 9.410 +-0.293 -0.714 0.235 0.601 1.566 2.349 9.410 +-0.130 -0.643 0.103 0.507 1.679 2.455 9.410 +0.032 -0.433 0.015 0.489 1.741 2.524 9.410 +-0.013 -0.294 0.124 0.535 1.484 2.559 9.410 +0.034 -0.019 0.364 0.668 1.724 2.855 9.410 +-0.207 0.027 0.496 0.691 1.605 2.652 9.410 +-0.117 0.136 0.375 0.839 1.597 2.739 9.410 +0.331 0.324 0.402 0.905 1.727 2.631 9.410 +0.522 0.234 0.222 0.900 1.786 2.536 9.410 +0.409 0.232 0.054 0.845 1.568 2.246 9.410 +0.133 -0.156 -0.214 0.692 1.290 1.885 9.410 +0.356 0.113 0.014 0.779 1.389 1.847 9.410 +-0.209 -0.240 -0.289 0.299 0.928 1.345 9.410 +-0.390 -0.525 -0.350 0.008 0.302 0.562 9.410 +0.011 -0.019 -0.056 0.320 0.514 0.780 9.410 +-0.048 -0.323 0.183 0.216 0.551 0.607 9.410 +-0.407 -0.682 -0.339 -0.469 -0.241 -0.286 9.410 +-0.149 -0.268 0.073 -0.222 -0.207 -0.420 9.410 +-0.707 -0.623 0.031 -0.137 0.333 0.233 9.410 +-1.432 -1.220 -0.888 -0.429 0.021 0.004 9.410 +-1.273 -1.111 -0.432 -0.063 0.389 0.164 9.410 +-0.904 -0.796 -0.186 0.098 0.444 0.055 9.410 +-0.731 -0.976 -0.264 0.127 0.650 0.399 9.410 +-0.921 -1.067 -0.310 0.008 0.459 0.175 9.410 +-0.997 -1.248 -0.348 -0.261 0.203 -0.098 9.410 +-0.834 -0.965 -0.455 -0.102 0.182 -0.088 9.410 +-0.803 -0.672 -0.128 -0.068 0.296 0.041 9.410 +-1.107 -0.986 -0.537 -0.467 0.157 -0.231 9.410 +-1.075 -0.743 -0.405 -0.382 0.284 -0.178 9.410 +-0.904 -0.642 -0.301 -0.271 0.310 0.027 9.410 +-0.784 -0.321 0.070 0.113 0.539 0.287 9.410 +-0.799 -0.329 -0.051 0.109 0.274 0.264 9.410 +-0.958 -0.547 -0.242 -0.288 0.004 -0.139 9.410 +-0.727 -0.286 -0.107 -0.159 0.058 0.082 9.410 +-0.488 -0.179 -0.152 -0.354 -0.266 -0.212 9.410 +-0.488 -0.272 -0.167 -0.146 -0.252 -0.327 9.410 +-0.170 -0.165 -0.150 -0.031 0.010 -0.101 9.410 +-0.632 -0.525 -0.321 -0.176 0.297 0.137 9.410 +-0.532 -0.466 -0.280 -0.249 0.165 -0.053 9.410 +-0.547 -0.428 -0.352 -0.215 0.276 0.076 9.410 +-0.444 -0.523 -0.112 0.217 0.223 0.304 9.410 +-0.720 -0.988 -0.222 0.310 0.708 0.772 9.410 +-0.475 -0.669 -0.019 0.218 0.593 -0.157 9.410 +-0.304 -0.248 -0.011 0.051 0.609 -0.693 9.410 +0.130 0.034 0.065 -0.431 -0.367 -1.329 9.410 +0.817 0.291 0.311 -0.535 -0.710 -1.761 9.410 +1.138 0.477 0.308 -1.126 -1.424 -2.907 9.410 +1.140 0.581 0.114 -1.148 -1.986 -3.129 9.410 +1.616 0.934 0.234 -1.239 -2.399 -3.718 9.410 +2.003 1.248 0.331 -1.060 -2.378 -3.622 9.410 +2.344 1.334 0.364 -1.195 -2.642 -4.126 9.410 +2.589 1.584 0.603 -0.957 -2.714 -4.046 9.410 +2.804 1.560 0.870 -0.795 -2.834 -4.311 9.410 +2.529 1.453 0.661 -0.712 -2.764 -3.580 8.262 +1.939 1.301 0.361 -1.153 -3.049 -3.766 8.262 +1.758 1.367 0.016 -1.355 -2.817 -3.880 8.262 +1.628 1.162 0.251 -1.406 -2.748 -3.927 8.262 +2.027 1.645 0.079 -0.989 -2.152 -3.328 8.262 +1.525 1.322 -0.089 -1.269 -2.024 -3.166 8.262 +0.995 0.781 -0.106 -0.995 -1.664 -2.783 8.262 +1.059 1.020 0.358 -0.481 -0.964 -1.541 8.262 +0.435 0.590 -0.006 -0.195 -0.283 -0.835 8.262 +-0.642 -0.138 -0.527 -0.113 -0.017 -0.010 8.262 +-0.909 -0.273 -0.416 0.378 0.727 0.958 8.262 +-1.177 -0.723 -0.699 0.622 1.374 1.847 8.262 +-1.311 -0.547 -0.439 1.002 1.810 2.765 8.262 +-1.506 -0.428 -0.800 0.671 1.554 2.153 8.262 +-1.404 -0.684 -0.735 0.608 0.901 1.631 8.262 +-1.096 -0.596 -0.474 0.753 0.977 1.445 8.262 +-1.526 -0.921 -0.694 0.466 0.350 1.244 8.262 +-1.553 -1.000 -0.911 0.155 -0.073 0.701 8.262 +-1.231 -0.710 -0.690 0.385 0.493 0.909 8.262 +-1.375 -0.891 -0.773 0.236 -0.034 0.645 8.262 +-1.037 -0.677 -0.591 0.477 0.238 0.846 8.262 +-1.037 -0.779 -0.555 0.111 0.018 0.680 8.262 +-1.080 -0.656 -0.311 -0.003 0.221 0.458 8.262 +-1.197 -0.450 -0.348 -0.045 0.190 0.576 8.262 +-1.197 -0.590 -0.267 -0.011 -0.134 0.377 8.262 +-1.474 -0.752 -0.518 -0.216 -0.400 -0.125 8.262 +-1.330 -0.676 -0.597 -0.241 -0.445 -0.038 8.262 +-1.163 -0.559 -0.424 -0.106 -0.169 0.072 8.262 +-1.050 -0.776 -0.426 -0.035 -0.256 -0.106 8.262 +-1.008 -0.607 -0.090 0.138 -0.039 0.122 8.262 +-1.102 -0.924 -0.297 -0.028 0.022 -0.111 8.262 +-1.315 -0.608 -0.036 0.100 0.260 0.174 8.262 +-1.358 -0.459 0.109 -0.093 0.086 -0.169 8.262 +-1.631 -0.643 0.014 -0.114 0.172 -0.215 8.262 +-0.864 -0.489 0.269 0.145 0.060 -0.271 8.262 +-0.819 -0.254 0.388 0.154 -0.014 -0.474 8.262 +-0.351 -0.224 0.105 -0.311 -0.342 -0.867 8.262 +-0.418 -0.406 0.222 -0.113 -0.011 -0.303 8.262 +-0.488 -0.425 0.112 0.196 0.154 0.171 8.262 +-0.821 -0.859 -0.365 -0.214 -0.114 0.022 8.262 +-0.467 -0.404 0.074 0.339 0.259 0.751 8.262 +-0.489 -0.545 0.026 0.556 0.552 1.324 8.262 +-0.189 -0.286 0.326 0.704 0.904 1.717 8.262 +-0.210 -0.442 0.214 0.477 1.119 1.843 8.262 +0.012 -0.202 0.087 0.508 1.286 2.009 8.262 +0.074 0.068 0.159 0.573 1.340 2.173 8.262 +0.139 0.063 0.250 0.308 1.284 1.978 8.262 +0.108 0.249 0.419 0.643 1.655 2.348 8.262 +0.184 0.299 0.452 0.554 1.460 2.254 8.262 +-0.224 0.122 0.135 0.426 1.181 2.054 8.262 +0.080 0.126 -0.162 0.580 0.982 1.853 8.262 +0.556 0.366 0.114 0.949 1.376 2.085 8.262 +0.654 0.184 -0.248 0.491 0.904 1.745 8.262 +0.373 -0.039 -0.187 0.523 1.002 1.607 8.262 +0.321 -0.083 -0.145 0.433 0.735 1.232 8.262 +0.389 0.177 0.108 0.592 0.752 1.299 8.262 +0.439 0.086 0.215 0.386 0.200 0.652 8.262 +0.367 0.124 0.152 0.270 -0.190 0.103 8.262 +0.245 0.474 0.112 0.292 0.052 -0.156 8.262 +-0.038 0.136 0.044 -0.120 0.114 -0.941 8.262 +-0.040 0.072 0.241 -0.337 -0.717 -1.370 8.262 +-0.723 -0.387 -0.100 -0.321 -0.162 -0.786 8.262 +-0.769 -0.511 -0.025 -0.044 0.024 -0.405 8.262 +-1.202 -0.770 -0.315 0.184 0.269 -0.219 8.262 +-1.029 -0.629 -0.254 0.169 0.183 -0.164 8.262 +-1.273 -0.773 -0.311 0.033 0.082 -0.036 8.262 +-1.119 -0.827 -0.235 0.147 -0.318 -0.154 8.262 +-1.250 -0.731 0.068 0.019 0.260 0.090 8.262 +-1.097 -0.641 -0.330 0.213 0.147 -0.042 8.262 +-1.241 -0.914 -0.587 -0.240 0.022 -0.174 8.262 +-1.177 -0.835 -0.468 -0.030 0.257 -0.045 8.262 +-1.402 -0.889 -0.563 -0.030 0.243 0.097 8.262 +-1.393 -0.910 -0.495 -0.071 0.167 0.114 8.262 +-1.395 -0.759 -0.234 0.110 0.326 0.387 8.262 +-1.147 -0.538 -0.110 0.111 0.341 0.596 8.262 +-1.372 -0.611 -0.210 -0.092 0.221 0.734 8.262 +-1.386 -0.644 -0.184 -0.086 0.280 0.768 8.262 +-1.134 -0.474 -0.007 -0.064 0.259 0.889 8.262 +-0.957 -0.267 -0.045 0.032 0.456 0.966 8.262 +-0.918 -0.568 -0.377 -0.243 0.469 0.749 8.262 +-1.076 -0.390 -0.137 0.172 1.072 1.198 8.262 +-1.374 -0.737 -0.308 0.064 1.008 1.050 8.262 +-1.542 -0.811 -0.212 0.438 1.237 1.693 8.262 +-1.805 -1.129 -0.385 0.570 1.026 1.874 8.262 +-1.687 -1.048 0.085 0.994 1.887 2.100 8.262 +-1.482 -1.030 0.102 0.817 1.877 1.478 8.262 +-1.162 -0.866 -0.031 0.341 1.154 0.730 8.262 +-0.770 -0.747 0.086 0.032 0.296 0.594 8.262 +0.074 0.309 0.301 -0.113 -0.275 -0.828 8.262 +0.639 0.474 0.391 -0.303 -0.513 -1.425 8.262 +1.151 0.475 0.347 -0.636 -0.795 -1.856 8.262 +1.030 0.547 0.123 -0.943 -1.510 -2.614 8.262 +1.453 0.796 0.228 -1.028 -1.957 -2.813 8.262 +2.208 1.264 0.585 -0.988 -2.441 -3.135 8.262 +2.147 1.334 0.602 -0.903 -2.704 -3.326 8.262 +2.178 1.344 0.746 -1.052 -2.816 -3.729 8.262 +2.391 1.670 0.607 -0.950 -2.181 -2.995 6.741 +2.002 1.425 0.259 -1.073 -2.357 -3.309 6.741 +1.763 1.056 -0.096 -1.393 -2.454 -3.641 6.741 +1.613 1.284 -0.083 -1.108 -1.990 -3.311 6.741 +1.374 1.014 -0.294 -1.163 -1.901 -2.934 6.741 +1.763 1.266 0.404 -0.523 -1.205 -2.285 6.741 +0.789 0.505 -0.022 -0.766 -1.066 -1.894 6.741 +0.804 0.881 0.494 -0.079 -0.144 -0.747 6.741 +-0.791 -0.376 -0.469 -0.534 -0.258 -0.404 6.741 +-0.688 0.096 -0.102 0.513 1.103 1.363 6.741 +-1.779 -0.853 -0.652 0.589 1.170 2.064 6.741 +-2.042 -1.276 -0.460 1.245 1.791 3.231 6.741 +-2.017 -0.869 -0.358 1.759 2.498 4.398 6.741 +-2.094 -1.001 -0.673 1.134 2.234 3.634 6.741 +-2.085 -0.647 -0.392 1.140 1.835 3.273 6.741 +-1.379 -0.484 -0.185 1.148 1.814 2.828 6.741 +-2.187 -1.257 -0.954 0.535 0.972 2.166 6.741 +-1.567 -0.603 -0.714 0.868 1.144 2.123 6.741 +-1.587 -0.770 -0.593 0.594 0.795 2.003 6.741 +-1.427 -0.869 -0.597 0.458 0.652 1.506 6.741 +-1.157 -0.722 -0.499 0.488 0.704 1.430 6.741 +-1.412 -0.716 -0.487 0.191 0.552 1.048 6.741 +-1.271 -0.599 -0.335 -0.072 0.407 0.932 6.741 +-1.011 -0.574 -0.242 -0.062 0.191 0.406 6.741 +-0.935 -0.499 -0.337 0.066 0.047 0.348 6.741 +-0.996 -0.419 -0.177 0.187 0.092 0.145 6.741 +-1.275 -0.596 -0.592 -0.095 -0.224 -0.556 6.741 +-1.166 -0.566 -0.541 -0.053 -0.125 -0.695 6.741 +-1.336 -0.756 -0.482 -0.332 -0.385 -0.868 6.741 +-1.285 -0.750 -0.361 -0.267 0.007 -0.658 6.741 +-1.139 -0.637 -0.116 -0.144 0.061 -0.818 6.741 +-1.302 -0.723 -0.015 -0.279 0.059 -0.398 6.741 +-1.282 -0.608 -0.010 -0.363 -0.575 -0.798 6.741 +-1.512 -0.849 -0.090 -0.333 -0.450 -0.810 6.741 +-1.300 -0.689 -0.130 -0.311 -0.693 -1.194 6.741 +-0.779 -0.268 0.300 -0.159 -0.471 -1.087 6.741 +-0.541 -0.158 0.033 -0.690 -0.985 -1.456 6.741 +0.049 -0.167 0.335 -0.104 -0.410 -0.919 6.741 +0.007 0.015 0.217 0.066 -0.258 -0.491 6.741 +-0.120 -0.133 0.012 0.025 -0.261 -0.252 6.741 +0.179 -0.009 0.124 0.177 -0.027 0.175 6.741 +0.036 -0.192 0.290 0.346 -0.120 0.744 6.741 +0.277 -0.028 0.309 0.411 0.215 0.905 6.741 +0.156 -0.142 0.251 0.356 0.865 1.404 6.741 +0.357 0.105 0.161 0.148 0.909 1.279 6.741 +0.613 0.386 0.277 0.432 1.309 1.713 6.741 +0.538 0.651 0.253 0.307 1.249 1.374 6.741 +0.500 0.675 0.253 0.462 1.056 1.733 6.741 +0.467 0.749 0.198 0.490 0.578 1.625 6.741 +0.697 0.879 0.399 0.799 0.753 1.965 6.741 +0.778 0.412 -0.161 0.385 0.386 1.192 6.741 +1.203 0.763 0.032 0.975 0.681 1.781 6.741 +1.131 0.558 0.113 0.877 0.813 1.292 6.741 +0.997 0.408 0.289 0.644 0.717 1.395 6.741 +0.987 0.437 0.366 0.533 0.586 0.802 6.741 +0.193 -0.018 -0.049 0.094 0.139 0.295 6.741 +0.600 0.427 0.508 0.345 -0.116 0.006 6.741 +-0.079 0.026 -0.161 -0.174 -0.844 -0.614 6.741 +0.386 0.496 0.431 -0.067 -0.676 -0.756 6.741 +0.263 0.622 0.516 -0.217 -0.833 -1.458 6.741 +-0.214 0.003 -0.059 -1.261 -1.774 -2.336 6.741 +-0.797 -0.651 -0.419 -0.859 -1.330 -1.912 6.741 +-0.487 -0.384 -0.111 -0.400 -0.323 -1.257 6.741 +-0.765 -0.488 -0.473 0.255 0.071 -0.426 6.741 +-0.865 -0.236 -0.433 0.224 -0.239 -0.766 6.741 +-1.290 -0.572 -0.268 0.131 -0.515 -0.589 6.741 +-1.031 -0.184 -0.088 0.213 -0.337 -0.436 6.741 +-1.279 -0.233 -0.162 0.092 -0.211 -0.297 6.741 +-1.050 -0.261 -0.142 -0.007 0.037 -0.442 6.741 +-1.619 -0.907 -0.836 -0.322 -0.465 -0.475 6.741 +-1.498 -0.614 -0.610 -0.070 -0.293 -0.102 6.741 +-1.527 -0.856 -0.692 -0.107 -0.192 0.046 6.741 +-1.549 -1.079 -0.684 -0.053 -0.367 0.177 6.741 +-1.521 -0.731 -0.240 0.233 0.235 0.736 6.741 +-1.609 -0.794 -0.187 0.149 0.358 0.996 6.741 +-1.819 -0.906 0.113 0.117 0.450 1.349 6.741 +-1.495 -0.800 0.043 0.344 0.927 1.681 6.741 +-1.443 -0.926 -0.370 0.057 0.555 1.675 6.741 +-1.446 -0.892 -0.488 0.185 0.901 2.167 6.741 +-1.340 -0.799 -0.482 0.160 1.147 2.001 6.741 +-1.673 -0.799 -0.350 0.333 1.683 2.360 6.741 +-1.774 -0.862 -0.095 0.507 1.604 2.344 6.741 +-2.350 -1.274 -0.361 0.600 1.684 2.629 6.741 +-2.622 -1.193 -0.297 1.248 1.975 3.207 6.741 +-2.316 -1.191 0.009 1.280 2.696 3.169 6.741 +-2.234 -1.136 -0.114 1.408 2.226 2.756 6.741 +-1.586 -0.983 -0.030 0.728 1.652 2.007 6.741 +-0.784 -0.482 0.360 0.156 1.003 1.183 6.741 +-0.202 0.096 0.494 0.712 0.586 0.415 6.741 +0.528 0.179 0.531 0.208 0.124 -0.420 6.741 +0.784 0.457 0.599 -0.122 -0.175 -0.750 6.741 +1.399 0.740 0.487 -0.462 -1.007 -1.729 6.741 +1.533 0.776 0.431 -0.788 -1.468 -2.283 6.741 +2.039 0.992 0.510 -0.978 -2.306 -2.779 6.741 +1.871 1.180 0.488 -0.962 -2.355 -3.207 6.741 +2.357 1.415 0.542 -0.968 -2.376 -3.236 6.741 +2.056 1.444 0.473 -0.771 -1.630 -2.417 4.839 +2.235 1.687 0.855 -0.429 -1.221 -1.983 4.839 +1.545 0.885 0.021 -1.087 -1.870 -2.533 4.839 +1.449 1.032 0.249 -0.707 -1.091 -2.128 4.839 +1.014 0.583 0.044 -0.897 -1.056 -1.691 4.839 +1.438 1.158 0.833 0.094 0.028 -0.725 4.839 +1.274 0.885 0.974 0.224 0.375 0.081 4.839 +-0.113 0.362 0.132 0.005 0.125 0.231 4.839 +-0.751 -0.256 -0.054 0.733 0.775 1.158 4.839 +-1.694 -0.821 -0.218 0.898 1.367 2.234 4.839 +-2.304 -1.304 -0.422 0.945 1.924 3.199 4.839 +-2.832 -1.207 -0.505 1.663 2.884 4.611 4.839 +-3.148 -1.397 -0.571 1.834 3.330 5.152 4.839 +-3.437 -1.366 -0.947 1.416 3.093 5.028 4.839 +-2.870 -1.035 -0.633 1.470 2.936 4.843 4.839 +-2.397 -0.756 -0.162 1.597 2.743 4.343 4.839 +-2.584 -1.051 -0.749 0.977 2.345 3.801 4.839 +-2.335 -0.882 -0.872 0.985 1.990 3.158 4.839 +-1.931 -0.746 -0.728 1.123 1.896 3.134 4.839 +-1.878 -0.878 -0.684 1.003 1.585 2.651 4.839 +-1.344 -0.769 -0.445 0.843 1.659 2.329 4.839 +-1.657 -0.930 -0.553 0.334 1.348 1.927 4.839 +-1.622 -0.747 -0.446 0.091 1.099 1.431 4.839 +-1.563 -0.770 -0.400 0.106 0.700 1.166 4.839 +-1.169 -0.586 -0.308 0.125 0.377 0.429 4.839 +-0.770 -0.320 -0.017 0.458 0.724 0.359 4.839 +-1.187 -0.682 -0.563 0.069 -0.044 -0.649 4.839 +-1.438 -0.483 -0.493 0.018 -0.019 -0.785 4.839 +-1.616 -0.424 -0.392 -0.236 -0.231 -1.036 4.839 +-1.472 -0.306 0.143 -0.145 0.219 -0.621 4.839 +-1.289 -0.431 0.149 -0.365 -0.187 -1.136 4.839 +-1.432 -0.547 0.221 -0.354 -0.178 -0.822 4.839 +-1.160 -0.147 0.388 -0.302 -0.700 -1.261 4.839 +-1.479 -0.450 0.147 -0.280 -1.054 -1.537 4.839 +-0.958 -0.400 0.130 -0.255 -1.072 -2.041 4.839 +-0.645 -0.179 0.354 -0.449 -1.198 -2.398 4.839 +-0.121 0.150 0.435 -0.404 -1.222 -2.427 4.839 +0.076 0.281 0.443 -0.080 -0.715 -1.764 4.839 +0.025 0.223 0.199 -0.238 -0.906 -1.542 4.839 +-0.114 0.252 0.097 -0.179 -0.934 -1.131 4.839 +0.261 0.394 0.123 -0.067 -0.762 -0.710 4.839 +-0.087 0.021 0.059 -0.165 -0.660 -0.240 4.839 +0.245 0.166 0.049 -0.017 -0.398 -0.081 4.839 +0.531 0.453 0.435 0.296 0.727 0.744 4.839 +0.824 0.845 0.413 0.207 0.743 0.731 4.839 +0.667 0.784 0.344 0.248 1.222 1.026 4.839 +1.156 1.255 0.508 0.538 1.534 1.031 4.839 +0.776 1.179 0.431 0.710 1.177 1.235 4.839 +1.005 1.349 0.416 0.760 0.678 1.221 4.839 +1.394 1.323 0.333 0.949 0.712 1.483 4.839 +1.130 0.677 -0.289 0.378 -0.089 0.519 4.839 +1.041 0.485 -0.113 0.488 0.352 0.748 4.839 +1.115 0.690 0.274 0.373 0.244 0.448 4.839 +0.789 0.365 0.389 0.180 -0.069 0.350 4.839 +0.745 0.511 0.275 0.084 -0.283 -0.126 4.839 +0.609 0.626 0.438 0.390 0.150 0.027 4.839 +0.630 0.838 0.672 0.120 -0.540 -0.768 4.839 +-0.076 0.474 0.207 -0.295 -1.489 -1.273 4.839 +-0.426 0.001 -0.156 -0.973 -1.510 -1.990 4.839 +-0.104 0.246 0.015 -0.546 -1.719 -2.157 4.839 +0.129 0.501 -0.024 -0.442 -1.721 -2.707 4.839 +-0.079 -0.022 -0.143 -0.424 -1.463 -2.422 4.839 +-0.079 0.074 0.214 0.068 -0.704 -1.813 4.839 +-1.133 -0.394 -0.383 -0.286 -0.445 -1.333 4.839 +-1.085 0.053 -0.157 0.128 -0.544 -1.366 4.839 +-1.523 -0.007 0.014 0.387 -0.345 -0.701 4.839 +-1.212 -0.165 0.067 -0.070 -0.496 -0.763 4.839 +-1.412 -0.317 -0.070 0.011 0.057 -0.382 4.839 +-1.694 -0.532 -0.583 -0.335 -0.505 -0.558 4.839 +-1.734 -0.521 -0.671 -0.165 -0.219 -0.042 4.839 +-1.553 -0.585 -0.796 -0.132 -0.245 0.340 4.839 +-1.568 -0.834 -0.718 0.066 0.007 0.671 4.839 +-1.622 -0.630 -0.245 0.211 0.440 1.071 4.839 +-1.981 -0.694 -0.210 0.433 0.742 1.481 4.839 +-1.987 -0.785 -0.332 0.253 0.918 1.615 4.839 +-2.442 -1.020 -0.468 0.072 0.828 1.771 4.839 +-2.026 -0.831 -0.151 0.255 1.206 2.308 4.839 +-1.990 -0.985 -0.285 0.406 1.405 2.683 4.839 +-2.170 -0.829 -0.332 0.778 1.955 3.025 4.839 +-2.216 -0.631 -0.542 0.876 2.122 2.997 4.839 +-2.372 -0.948 -0.298 1.027 2.639 3.816 4.839 +-2.380 -1.346 -0.083 1.189 2.695 4.036 4.839 +-2.936 -0.949 -0.087 1.573 3.147 4.600 4.839 +-3.585 -1.502 -0.124 1.924 3.303 4.989 4.839 +-3.138 -1.267 -0.027 2.121 3.670 5.174 4.839 +-2.674 -1.245 0.031 1.827 3.085 4.222 4.839 +-1.857 -0.995 -0.007 1.336 2.513 3.277 4.839 +-1.371 -0.523 0.465 1.256 2.135 2.706 4.839 +-1.127 -0.259 0.419 0.455 1.401 1.857 4.839 +-0.353 0.187 0.445 0.550 0.868 1.066 4.839 +0.270 0.436 0.721 0.461 0.519 0.441 4.839 +0.852 0.515 0.662 0.124 -0.123 -0.522 4.839 +1.295 0.698 0.527 -0.209 -0.665 -1.030 4.839 +1.446 0.848 0.381 -0.628 -1.275 -2.028 4.839 +2.024 1.160 0.538 -0.528 -1.452 -1.937 4.839 +2.089 1.374 0.729 -0.659 -1.383 -2.105 4.839 +1.712 0.857 0.469 -0.797 -1.210 -1.699 2.659 +1.729 1.069 0.698 -0.442 -0.823 -1.509 2.659 +2.037 1.548 1.026 0.115 -0.288 -0.671 2.659 +2.048 1.451 0.998 0.143 -0.431 -0.817 2.659 +1.869 1.205 1.088 0.432 -0.074 0.147 2.659 +0.879 0.506 0.386 -0.055 0.058 -0.313 2.659 +0.116 0.460 0.246 -0.121 0.121 0.817 2.659 +-0.008 0.390 0.672 0.847 1.117 2.160 2.659 +-0.709 0.080 0.525 1.342 2.145 3.138 2.659 +-1.597 -0.622 0.337 1.437 2.471 4.188 2.659 +-2.666 -1.359 -0.252 1.158 2.611 4.665 2.659 +-3.386 -1.145 -0.267 1.792 3.423 5.590 2.659 +-3.820 -1.582 -0.382 2.076 3.896 6.142 2.659 +-3.325 -1.532 -0.355 2.149 4.130 6.395 2.659 +-3.392 -1.347 -0.944 1.687 3.667 5.735 2.659 +-2.922 -1.228 -0.900 1.554 3.316 4.796 2.659 +-3.496 -1.637 -1.376 1.178 2.594 4.376 2.659 +-2.914 -0.989 -0.865 1.345 2.682 4.310 2.659 +-2.933 -1.501 -1.298 0.984 2.053 3.672 2.659 +-2.704 -1.530 -1.138 0.802 1.684 3.362 2.659 +-2.311 -1.210 -0.658 0.916 1.889 2.998 2.659 +-2.276 -1.112 -0.739 0.531 1.581 2.354 2.659 +-2.056 -1.207 -1.118 0.011 0.836 1.220 2.659 +-1.754 -0.922 -0.840 0.159 0.896 1.363 2.659 +-1.306 -0.524 -0.469 0.271 0.721 0.883 2.659 +-1.196 -0.353 -0.433 0.369 0.638 0.103 2.659 +-1.017 0.062 -0.292 0.518 0.654 -0.340 2.659 +-1.505 -0.065 -0.374 0.055 0.030 -0.739 2.659 +-1.649 -0.186 -0.289 -0.466 -0.396 -1.205 2.659 +-1.854 -0.275 -0.208 -0.575 -0.659 -1.141 2.659 +-1.344 -0.054 0.043 -0.629 -0.871 -1.328 2.659 +-1.267 -0.207 0.185 -0.562 -1.002 -1.476 2.659 +-0.794 -0.013 0.326 -0.683 -1.429 -2.301 2.659 +-1.188 -0.401 0.055 -0.722 -1.484 -2.027 2.659 +-0.934 -0.032 0.341 -0.634 -1.740 -2.783 2.659 +-0.327 0.322 0.609 -0.456 -1.453 -2.919 2.659 +-0.176 0.449 0.288 -0.779 -2.066 -3.617 2.659 +-0.238 0.414 0.176 -0.729 -1.711 -3.342 2.659 +0.073 0.501 0.464 -0.462 -1.502 -2.780 2.659 +0.211 0.678 0.531 -0.335 -1.244 -1.968 2.659 +0.602 1.060 0.601 -0.149 -1.040 -1.516 2.659 +0.249 0.479 0.211 -0.251 -0.809 -1.023 2.659 +0.927 0.853 0.374 -0.129 -0.420 -0.722 2.659 +1.059 1.099 0.792 0.397 0.578 0.211 2.659 +1.399 1.284 0.533 -0.032 0.588 0.019 2.659 +1.439 1.469 0.594 0.503 1.084 0.518 2.659 +1.480 1.592 0.481 0.401 0.831 0.070 2.659 +1.408 1.438 0.202 0.348 0.429 0.356 2.659 +1.540 1.408 0.012 0.342 0.068 0.182 2.659 +2.102 1.839 0.478 1.018 1.001 0.964 2.659 +1.744 1.301 -0.159 0.190 0.216 -0.138 2.659 +1.764 1.255 0.388 0.639 0.201 0.343 2.659 +1.432 0.964 0.119 0.152 -0.926 -0.552 2.659 +1.496 1.221 0.648 0.554 -0.101 -0.071 2.659 +1.546 1.501 0.796 0.473 -0.203 -0.658 2.659 +0.948 1.219 0.513 0.134 -0.620 -0.927 2.659 +0.258 0.955 0.067 -0.559 -1.881 -1.833 2.659 +0.262 1.085 0.331 -0.408 -1.724 -1.850 2.659 +0.264 0.691 -0.013 -0.590 -1.952 -2.469 2.659 +0.133 0.460 -0.188 -0.539 -2.228 -2.992 2.659 +0.318 0.646 -0.205 -0.501 -2.410 -3.289 2.659 +0.040 0.547 -0.141 -0.267 -1.761 -2.825 2.659 +-1.033 -0.363 -0.811 -0.902 -2.044 -3.034 2.659 +-0.994 0.168 -0.322 -0.300 -0.895 -1.840 2.659 +-0.981 0.261 -0.339 -0.320 -0.981 -1.913 2.659 +-1.015 0.123 -0.440 -0.119 -0.581 -1.136 2.659 +-1.206 0.075 -0.060 -0.176 -0.778 -1.080 2.659 +-1.534 -0.076 -0.243 0.041 -0.561 -0.548 2.659 +-1.773 -0.142 -0.556 -0.254 -0.554 -0.600 2.659 +-1.958 -0.440 -0.647 -0.361 -0.238 -0.229 2.659 +-2.394 -1.100 -1.271 -0.728 -0.490 -0.365 2.659 +-2.599 -1.378 -1.120 -0.579 -0.448 0.098 2.659 +-2.406 -0.910 -0.834 -0.267 0.462 0.907 2.659 +-2.251 -0.712 -0.581 0.077 0.784 1.653 2.659 +-2.225 -0.744 -0.533 0.379 0.914 2.035 2.659 +-2.355 -1.046 -0.497 0.367 1.265 2.686 2.659 +-2.163 -0.939 -0.178 0.569 1.678 3.393 2.659 +-2.283 -0.941 -0.192 0.502 1.918 3.434 2.659 +-2.645 -1.265 -0.438 0.724 2.160 3.701 2.659 +-2.403 -1.043 -0.382 1.221 2.645 4.082 2.659 +-2.947 -1.265 -0.359 1.589 2.984 4.881 2.659 +-3.283 -1.527 -0.328 2.455 2.985 4.846 2.659 +-3.534 -1.073 -0.288 2.277 3.480 5.280 2.659 +-3.330 -0.821 -0.224 2.245 4.143 5.935 2.659 +-3.828 -1.206 -0.190 2.070 4.091 6.052 2.659 +-3.284 -0.601 0.067 2.073 3.672 5.062 2.659 +-2.406 -0.967 0.125 2.123 3.465 4.550 2.659 +-2.006 -0.897 0.523 1.567 2.919 3.956 2.659 +-1.717 -0.371 0.703 1.251 2.440 3.527 2.659 +-1.058 -0.282 0.499 0.349 1.649 2.207 2.659 +-0.282 0.027 0.515 0.314 1.117 1.612 2.659 +0.364 0.517 0.468 0.359 0.580 0.585 2.659 +0.808 0.809 0.540 0.295 0.201 0.091 2.659 +1.140 0.702 0.274 -0.368 -0.544 -0.773 2.659 +1.665 0.816 0.378 -0.631 -0.508 -0.872 2.659 +2.398 1.410 0.977 -0.073 -0.575 -0.709 2.659 +2.196 1.035 1.152 -0.008 0.269 0.334 0.121 +2.006 1.348 1.088 0.140 0.422 0.165 0.121 +2.082 1.085 1.048 0.110 0.149 0.421 0.121 +1.341 0.555 0.540 0.179 -0.462 0.153 0.121 +1.348 1.049 1.059 0.766 0.569 1.297 0.121 +0.985 0.922 1.016 1.001 1.007 1.999 0.121 +-0.444 -0.250 0.276 0.536 1.087 2.140 0.121 +-0.346 0.230 0.912 1.381 2.086 3.716 0.121 +-1.397 -0.503 0.775 1.426 2.760 5.034 0.121 +-2.350 -0.338 0.440 1.741 3.116 5.936 0.121 +-2.912 -0.931 0.057 1.740 3.648 6.379 0.121 +-3.911 -1.775 -0.722 1.829 4.087 6.247 0.121 +-3.922 -1.678 -0.372 2.863 4.914 7.276 0.121 +-4.088 -1.828 -0.408 2.645 5.380 7.582 0.121 +-4.196 -1.804 -0.963 2.020 4.563 7.082 0.121 +-4.068 -1.607 -1.098 1.812 4.176 6.228 0.121 +-4.499 -2.238 -1.825 0.645 3.398 5.527 0.121 +-4.081 -1.796 -1.661 0.718 3.397 5.368 0.121 +-3.281 -1.054 -1.176 1.068 3.333 5.218 0.121 +-3.236 -1.081 -1.026 1.130 2.893 4.549 0.121 +-2.671 -0.751 -0.761 1.141 2.935 4.237 0.121 +-2.568 -0.613 -0.804 1.132 2.497 3.534 0.121 +-2.545 -0.982 -1.315 0.282 1.350 2.072 0.121 +-2.225 -0.995 -1.150 0.347 1.005 1.534 0.121 +-2.030 -0.680 -0.855 0.368 0.615 0.874 0.121 +-2.181 -0.682 -0.921 0.202 0.289 0.088 0.121 +-2.046 -0.617 -0.962 -0.231 -0.519 -0.747 0.121 +-1.682 -0.160 -0.260 -0.255 -0.451 -0.604 0.121 +-1.716 -0.003 -0.113 -0.581 -0.752 -1.529 0.121 +-1.897 0.024 -0.171 -0.915 -1.010 -1.774 0.121 +-1.375 0.270 -0.031 -1.111 -0.922 -2.085 0.121 +-1.443 -0.056 -0.162 -1.355 -1.424 -2.618 0.121 +-0.724 0.114 0.213 -1.240 -1.866 -3.269 0.121 +-1.433 -0.137 0.143 -1.033 -2.081 -3.506 0.121 +-0.760 0.278 0.529 -0.722 -2.266 -3.877 0.121 +-0.345 0.178 0.402 -1.100 -2.774 -4.230 0.121 +0.309 0.805 0.597 -0.869 -2.784 -4.329 0.121 +-0.324 0.499 0.044 -0.953 -2.468 -4.276 0.121 +0.303 1.047 0.668 -0.690 -1.842 -3.570 0.121 +0.058 1.049 0.485 -0.622 -2.000 -3.169 0.121 +0.930 1.377 0.885 -0.412 -1.544 -2.644 0.121 +0.797 1.378 0.718 -0.363 -0.896 -1.821 0.121 +1.111 1.367 0.715 -0.504 -0.719 -1.800 0.121 +0.672 1.087 0.227 -0.355 -0.232 -1.205 0.121 +1.636 1.652 0.317 -0.017 0.228 -1.209 0.121 +1.663 1.598 0.300 0.186 0.142 -0.568 0.121 +2.302 1.858 0.190 -0.060 -0.454 -0.840 0.121 +1.875 1.729 0.208 -0.018 -0.222 -0.445 0.121 +1.806 1.473 -0.186 -0.140 -0.299 -0.930 0.121 +1.276 1.206 -0.568 -0.399 -0.655 -1.292 0.121 +2.212 1.793 -0.034 -0.144 -0.863 -1.218 0.121 +2.422 1.962 0.353 0.461 -0.451 -0.667 0.121 +2.401 2.002 0.577 0.426 -0.885 -1.112 0.121 +1.971 1.977 0.759 0.364 -0.704 -0.928 0.121 +1.972 1.837 0.815 0.090 -1.099 -1.707 0.121 +0.735 1.250 0.364 -0.609 -2.049 -2.170 0.121 +0.700 1.224 0.231 -1.100 -2.211 -3.024 0.121 +0.241 0.918 -0.417 -1.055 -2.277 -3.124 0.121 +0.535 0.690 -0.992 -1.164 -2.846 -3.852 0.121 +0.613 1.153 -0.375 -1.077 -2.664 -3.735 0.121 +0.952 1.350 -0.392 -0.732 -2.786 -4.274 0.121 +-0.695 0.422 -0.876 -1.390 -3.044 -4.577 0.121 +-0.414 0.610 -0.358 -1.179 -2.468 -3.744 0.121 +-0.963 0.877 -0.755 -1.064 -1.952 -2.864 0.121 +-0.325 1.308 -0.102 -0.350 -1.310 -2.241 0.121 +-1.090 0.267 -0.315 -0.823 -1.058 -1.880 0.121 +-0.741 0.353 0.077 -0.184 -1.030 -1.651 0.121 +-1.204 0.791 -0.106 0.342 -0.581 -0.664 0.121 +-1.597 0.501 -0.530 -0.061 -0.981 -0.874 0.121 +-1.748 0.220 -0.564 0.183 -0.504 -0.117 0.121 +-2.219 -0.325 -0.643 -0.525 -0.269 -0.111 0.121 +-2.412 -0.412 -0.707 -0.322 0.290 0.730 0.121 +-2.118 -0.185 -0.084 0.092 0.844 1.636 0.121 +-2.327 -0.110 -0.213 0.400 1.319 2.407 0.121 +-2.009 -0.164 -0.069 0.913 1.561 3.113 0.121 +-2.598 -0.771 -0.442 0.883 1.695 3.689 0.121 +-2.621 -0.880 -0.421 1.079 1.864 4.174 0.121 +-2.870 -0.862 -0.259 1.058 2.389 4.874 0.121 +-2.616 -0.965 -0.126 1.959 3.079 5.446 0.121 +-3.152 -1.273 -0.170 2.282 3.229 5.475 0.121 +-3.435 -1.198 -0.235 2.996 3.794 6.417 0.121 +-3.492 -1.191 -0.031 2.652 3.874 6.478 0.121 +-3.848 -1.143 -0.311 2.652 4.368 6.782 0.121 +-4.158 -1.357 -0.086 3.036 4.923 7.652 0.121 +-4.412 -0.627 -0.406 2.664 5.123 7.175 0.121 +-3.858 -1.065 0.122 2.676 4.911 6.783 0.121 +-3.341 -0.835 0.314 2.373 4.770 6.258 0.121 +-2.651 -0.118 0.571 2.383 4.208 5.938 0.121 +-2.054 -0.567 0.728 1.914 3.473 5.332 0.121 +-1.650 -0.438 0.670 1.335 2.793 3.927 0.121 +-0.838 0.235 0.564 0.841 2.165 3.147 0.121 +-0.118 0.184 0.775 0.507 1.389 2.688 0.121 +0.637 0.549 0.709 0.340 0.938 1.693 0.121 +1.299 0.798 0.592 0.428 0.615 0.645 0.121 +1.842 0.977 0.660 0.395 0.614 0.444 0.121 +1.672 0.705 0.585 -0.027 -0.149 -0.233 0.121 +2.737 0.941 0.982 0.153 0.774 0.936 -1.082 +1.771 1.097 1.064 0.678 0.914 1.041 -1.082 +2.042 0.790 0.690 0.766 1.059 1.731 -1.082 +1.242 0.899 0.674 1.104 1.009 2.275 -1.082 +1.633 1.469 1.638 1.970 1.530 3.540 -1.082 +-0.866 -0.603 0.368 0.609 0.816 2.885 -1.082 +-0.841 -0.527 0.341 1.168 2.121 4.371 -1.082 +-1.634 -0.661 0.066 2.095 2.634 4.946 -1.082 +-2.620 -1.755 -0.861 1.102 3.023 6.476 -1.082 +-3.819 -1.592 -0.543 1.353 3.923 6.403 -1.082 +-3.561 -1.178 -0.231 2.442 5.340 7.839 -1.082 +-4.249 -2.067 -0.390 2.583 5.065 8.278 -1.082 +-3.675 -1.564 0.107 3.229 6.842 9.308 -1.082 +-4.963 -2.486 -1.095 2.378 5.764 8.470 -1.082 +-4.639 -1.759 -0.868 2.303 5.640 8.796 -1.082 +-4.612 -1.441 -1.115 2.438 4.990 8.450 -1.082 +-4.989 -1.776 -1.505 2.030 4.961 7.647 -1.082 +-5.410 -3.001 -2.209 0.665 3.915 6.282 -1.082 +-4.232 -1.840 -1.771 1.532 4.029 6.226 -1.082 +-3.993 -1.437 -1.913 0.964 3.987 5.424 -1.082 +-2.884 -1.213 -1.500 0.976 3.313 4.932 -1.082 +-2.772 -1.151 -1.456 0.586 2.671 3.839 -1.082 +-2.830 -1.094 -1.548 0.015 2.014 2.452 -1.082 +-1.832 -0.048 -0.717 0.785 1.906 2.497 -1.082 +-1.308 -0.026 -0.587 0.708 1.665 1.482 -1.082 +-2.481 -0.618 -1.251 -0.669 0.355 -0.061 -1.082 +-2.307 -0.627 -0.846 -1.224 -0.303 -0.774 -1.082 +-1.234 0.127 0.443 -0.325 -0.378 -0.811 -1.082 +-0.783 0.691 0.280 -0.540 -0.276 -1.277 -1.082 +-0.550 0.884 0.433 -0.485 -0.179 -1.794 -1.082 +-0.388 1.021 0.767 -0.915 -0.811 -2.627 -1.082 +-1.322 0.074 -0.158 -1.604 -2.029 -3.750 -1.082 +-0.709 0.510 0.583 -1.420 -2.455 -4.338 -1.082 +-0.784 0.346 0.438 -1.364 -1.970 -4.816 -1.082 +0.561 1.408 1.141 -0.671 -2.118 -4.470 -1.082 +0.487 1.175 0.866 -1.035 -2.540 -5.212 -1.082 +1.538 1.358 1.419 -0.292 -2.488 -4.417 -1.082 +1.293 1.106 0.715 -0.960 -2.662 -4.683 -1.082 +1.158 1.635 0.694 -0.855 -2.381 -4.344 -1.082 +1.330 1.728 0.874 -0.547 -1.913 -3.749 -1.082 +0.926 1.925 0.410 -1.084 -1.946 -4.076 -1.082 +1.243 2.350 0.368 -0.912 -1.504 -3.370 -1.082 +1.863 2.856 0.534 -0.601 -1.023 -3.174 -1.082 +1.991 2.441 0.646 -0.329 0.072 -2.262 -1.082 +2.593 2.256 0.555 -0.383 -0.685 -2.107 -1.082 +2.386 2.064 0.127 -0.385 -0.674 -1.782 -1.082 +2.982 3.035 0.712 0.120 -0.713 -1.490 -1.082 +3.301 3.076 0.453 0.457 -0.555 -0.939 -1.082 +3.489 3.191 0.697 0.526 0.218 -1.314 -1.082 +2.379 2.046 0.028 -0.107 -1.634 -1.923 -1.082 +2.860 2.839 0.394 0.219 -1.659 -1.765 -1.082 +2.462 2.425 0.206 0.278 -1.983 -1.252 -1.082 +3.149 2.918 0.920 0.088 -1.512 -2.298 -1.082 +1.994 2.194 0.264 -0.606 -1.895 -2.726 -1.082 +2.402 2.479 0.801 -0.369 -1.388 -2.619 -1.082 +0.104 0.060 -1.286 -2.628 -3.779 -4.994 -1.082 +1.348 2.085 0.190 -0.832 -1.842 -3.847 -1.082 +0.899 0.895 0.292 -1.855 -1.893 -4.884 -1.082 +1.315 1.777 -0.167 -1.407 -3.228 -4.404 -1.082 +1.362 1.814 0.358 -0.253 -2.542 -4.143 -1.082 +1.236 2.534 -0.525 -1.284 -3.158 -4.804 -1.082 +0.089 1.451 -0.159 -1.929 -3.539 -5.335 -1.082 +-0.616 1.394 -0.172 -1.926 -3.890 -5.062 -1.082 +-0.642 0.969 -0.338 -1.302 -2.956 -3.993 -1.082 +-0.346 0.623 -0.717 -1.384 -2.792 -3.781 -1.082 +-1.079 0.319 -0.649 -1.312 -1.987 -3.265 -1.082 +-1.872 0.605 -1.531 -1.196 -2.591 -3.218 -1.082 +-2.107 0.985 -2.140 -0.765 -1.552 -1.956 -1.082 +-2.101 0.650 -1.891 -0.371 -1.157 -1.697 -1.082 +-2.367 -0.419 -1.191 -0.366 -1.261 -0.553 -1.082 +-1.808 -0.048 -0.358 -0.162 -0.533 0.093 -1.082 +-2.749 -0.467 -1.002 -0.041 -0.271 0.223 -1.082 +-2.397 -0.196 -0.190 0.563 0.568 1.292 -1.082 +-2.622 -0.735 -0.555 0.429 1.046 2.273 -1.082 +-1.537 -0.132 0.169 1.381 1.653 2.877 -1.082 +-2.326 0.217 0.112 1.733 2.433 4.882 -1.082 +-1.715 -0.187 -0.055 2.139 3.253 5.786 -1.082 +-2.227 -0.452 -0.016 2.493 3.685 6.824 -1.082 +-3.177 -1.225 -0.326 1.898 3.268 6.818 -1.082 +-3.451 -1.129 -0.229 2.501 3.627 7.253 -1.082 +-3.698 -1.598 0.083 3.312 5.098 7.135 -1.082 +-3.579 -1.309 -0.088 3.129 5.237 7.728 -1.082 +-4.192 -1.264 -0.075 3.170 5.555 8.893 -1.082 +-5.403 -1.829 0.275 3.035 6.118 9.039 -1.082 +-4.286 -0.796 0.410 3.925 6.859 9.316 -1.082 +-4.004 -1.216 0.038 3.450 7.123 8.662 -1.082 +-4.665 -0.698 -0.359 2.336 4.614 7.733 -1.082 +-3.532 -0.388 0.707 2.612 5.288 7.383 -1.082 +-2.011 0.879 1.362 2.647 5.841 7.104 -1.082 +-2.139 0.657 0.576 1.753 2.927 5.422 -1.082 +-1.070 1.332 1.167 2.221 2.954 4.444 -1.082 +-0.932 -0.580 -0.107 0.504 1.466 3.585 -1.082 +0.963 1.293 1.220 1.124 2.229 3.413 -1.082 +0.631 0.437 0.472 0.147 1.314 1.802 -1.082 +0.758 0.164 -0.040 -0.176 0.557 0.020 -1.082 +1.078 -0.159 0.242 -0.477 0.517 -0.011 -1.082 +-0.374 -0.030 -0.742 -0.116 -0.323 -0.164 9.410 +-0.934 -0.491 -0.305 0.323 0.152 0.641 9.410 +-1.192 -0.513 0.324 0.295 0.465 0.284 9.410 +-0.799 -0.539 0.135 0.330 0.684 0.846 9.410 +-0.418 -0.326 -0.062 0.155 0.205 0.152 9.410 +-1.161 -0.923 -0.369 -0.259 0.173 -0.118 9.410 +-1.444 -1.099 -0.755 -0.450 0.225 0.085 9.410 +-0.784 -0.856 -0.104 -0.160 0.800 -0.341 9.410 +-2.836 -1.356 -0.563 1.833 3.066 5.231 6.741 +-0.290 -0.163 0.272 -0.667 -1.325 -2.682 6.741 +0.018 0.161 -0.085 -1.013 -2.335 -3.111 6.741 +-2.885 -1.460 -0.143 1.826 3.528 4.531 6.741 diff --git a/Noto/Configuration/CDB/alma/AS/make_lan.py b/Noto/Configuration/CDB/alma/AS/make_lan.py new file mode 100755 index 000000000..42b27df15 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/make_lan.py @@ -0,0 +1,16 @@ +content = """ + + + + +""" + +port_offset = 0 +for sector in range(1, 9): + for lan in range(1, 13): + ip = '127.0.0.1' + port = 11000 + port_offset + port_offset += 1 + lan_file = 'SECTOR%02d/LAN%02d/LAN%02d.xml' % (sector, lan, lan) + with open(lan_file, 'w') as f: + f.write(content % (ip, port)) diff --git a/Noto/Configuration/CDB/alma/AS/new_lut.txt b/Noto/Configuration/CDB/alma/AS/new_lut.txt new file mode 100644 index 000000000..3df016039 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/new_lut.txt @@ -0,0 +1,1116 @@ +1.971 0.294 0.212 -1.003 -2.088 -3.085 -13.865 +2.121 0.179 -0.060 -0.795 -2.200 -2.735 -13.865 +1.619 -0.289 -0.211 -1.140 -2.451 -2.821 -13.865 +2.685 0.686 1.160 0.087 -0.785 -1.066 -13.865 +2.308 0.421 0.447 -0.184 -0.877 -1.203 -13.865 +2.283 0.301 0.100 -0.180 -0.605 -0.464 -13.865 +1.107 -0.640 -0.336 -0.057 -0.361 -0.298 -13.865 +0.605 -0.902 -0.179 -0.120 -0.363 0.045 -13.865 +1.075 -0.504 0.406 0.258 0.320 0.932 -13.865 +1.134 -0.251 0.523 0.554 0.565 0.817 -13.865 +0.460 -0.863 0.659 -0.006 0.191 0.924 -13.865 +0.658 -1.088 0.131 -0.211 0.275 1.156 -13.865 +0.570 -0.784 -0.276 -0.188 0.616 1.219 -13.865 +1.211 -0.428 0.035 0.183 0.922 1.246 -13.865 +0.991 -0.381 0.037 0.096 0.511 0.803 -13.865 +1.413 0.130 0.574 0.233 0.600 0.599 -13.865 +0.982 0.071 0.224 -0.383 -0.217 -0.310 -13.865 +1.218 1.205 0.267 0.023 -0.358 -0.574 -13.865 +1.042 0.226 -0.182 -0.604 -1.108 -1.353 -13.865 +1.368 0.213 0.034 -0.694 -1.079 -1.966 -13.865 +1.551 0.426 0.001 -1.014 -1.463 -2.233 -13.865 +1.933 0.697 0.044 -0.804 -1.601 -2.171 -13.865 +1.009 -0.107 -0.629 -1.721 -2.853 -3.642 -13.865 +1.820 0.467 -0.312 -1.488 -2.235 -3.113 -13.865 +1.894 0.261 -0.208 -1.674 -3.082 -4.320 -5.247 +2.426 0.857 0.405 -1.009 -2.520 -3.488 -5.247 +2.171 0.265 -0.042 -1.334 -2.703 -3.640 -5.247 +2.200 0.506 -0.011 -1.088 -2.045 -2.862 -5.247 +1.792 0.170 -0.145 -1.009 -1.852 -2.382 -5.247 +1.623 -0.044 -0.351 -0.796 -1.362 -1.610 -5.247 +0.924 -0.342 -0.357 -0.407 -0.534 -0.686 -5.247 +0.423 -0.666 -0.251 -0.059 -0.022 0.178 -5.247 +0.617 -0.644 0.075 0.344 0.509 1.113 -5.247 +0.346 -0.985 0.270 0.232 0.724 1.466 -5.247 +0.663 -0.893 0.299 0.197 0.964 1.978 -5.247 +0.601 -0.954 -0.091 0.205 0.794 2.108 -5.247 +0.568 -0.702 -0.031 0.413 1.176 2.143 -5.247 +0.705 -0.578 0.071 0.071 0.935 2.028 -5.247 +0.524 -0.576 -0.110 -0.019 0.769 1.477 -5.247 +0.608 -0.601 -0.069 -0.188 0.451 0.788 -5.247 +0.946 -0.040 0.215 -0.253 0.277 0.428 -5.247 +0.832 -0.268 -0.266 -0.591 -0.548 -0.694 -5.247 +1.179 0.002 -0.324 -0.633 -1.127 -1.544 -5.247 +1.596 0.386 -0.121 -0.995 -1.335 -2.078 -5.247 +1.626 0.458 0.146 -1.150 -1.682 -2.839 -5.247 +1.937 0.686 0.090 -1.259 -2.181 -3.496 -5.247 +1.959 0.327 -0.207 -1.627 -2.898 -4.090 -5.247 +2.439 0.838 0.237 -1.300 -2.579 -3.834 -5.247 +2.793 1.559 0.459 -1.270 -2.885 -4.406 0.619 +2.823 1.463 0.447 -1.308 -2.881 -4.496 0.619 +2.914 1.487 0.740 -1.222 -2.716 -4.277 0.619 +3.030 1.535 0.578 -1.302 -2.929 -4.366 0.619 +2.793 1.276 0.510 -1.168 -2.653 -3.734 0.619 +2.814 1.359 0.441 -1.071 -2.450 -3.589 0.619 +2.717 1.217 0.506 -0.744 -1.887 -2.920 0.619 +2.213 0.700 0.058 -1.113 -2.193 -3.281 0.619 +2.452 0.904 0.323 -0.801 -1.690 -2.599 0.619 +2.293 0.572 0.000 -1.002 -2.103 -3.062 0.619 +2.007 0.205 -0.153 -0.794 -1.426 -2.349 0.619 +1.934 0.324 0.025 -0.537 -1.183 -1.557 0.619 +1.639 0.377 0.252 -0.232 -0.748 -0.743 0.619 +1.143 0.029 0.134 -0.048 -0.261 -0.368 0.619 +1.206 0.008 0.447 0.319 0.262 0.397 0.619 +0.505 -0.537 0.034 0.268 0.279 0.592 0.619 +1.132 -0.028 0.633 0.727 1.011 1.347 0.619 +0.773 -0.454 0.424 0.562 0.941 1.525 0.619 +0.503 -0.721 0.283 0.398 0.913 1.529 0.619 +0.049 -1.042 0.141 0.368 0.929 1.845 0.619 +0.340 -0.740 0.355 0.463 1.121 2.212 0.619 +0.339 -0.905 0.083 0.410 1.371 2.760 0.619 +0.811 -0.720 0.379 0.710 1.529 2.973 0.619 +0.413 -0.857 0.129 0.512 1.264 2.884 0.619 +0.414 -0.739 0.024 0.510 1.156 2.765 0.619 +0.310 -0.856 -0.155 0.339 1.068 2.692 0.619 +0.590 -0.654 0.264 0.546 1.249 2.777 0.619 +0.776 -0.452 0.133 0.642 1.633 3.011 0.619 +0.514 -0.385 0.198 0.424 1.388 2.316 0.619 +0.241 -0.820 -0.333 0.004 0.932 1.746 0.619 +1.072 -0.095 0.600 0.490 1.401 1.878 0.619 +0.384 -0.680 0.211 -0.144 0.643 1.130 0.619 +0.267 -0.523 -0.022 -0.012 0.492 0.810 0.619 +0.695 -0.309 0.188 -0.011 0.796 0.856 0.619 +1.217 0.385 0.600 0.497 0.894 0.758 0.619 +0.980 0.053 0.104 0.048 0.095 -0.194 0.619 +1.029 -0.239 -0.303 -0.523 -0.696 -1.052 0.619 +1.244 -0.157 -0.319 -0.901 -1.184 -1.869 0.619 +1.659 0.181 -0.124 -0.806 -1.017 -2.090 0.619 +2.314 0.597 0.117 -0.893 -1.461 -2.829 0.619 +2.433 0.823 0.503 -0.458 -1.112 -2.516 0.619 +1.899 0.587 0.160 -1.101 -1.961 -3.203 0.619 +2.287 1.306 0.633 -0.618 -1.600 -2.802 0.619 +2.294 1.039 0.436 -0.968 -2.161 -3.585 0.619 +2.860 1.367 0.694 -0.863 -2.003 -3.452 0.619 +2.496 0.741 -0.346 -1.955 -3.492 -5.104 0.619 +2.155 0.646 -0.162 -2.000 -3.360 -4.947 0.619 +2.363 0.796 -0.122 -1.819 -3.479 -4.944 0.619 +3.000 1.315 0.080 -1.845 -3.671 -5.487 5.121 +2.628 1.264 0.127 -1.829 -3.785 -5.403 5.121 +2.829 1.442 0.409 -1.723 -3.626 -5.412 5.121 +3.079 1.627 0.399 -1.533 -3.256 -5.070 5.121 +2.735 1.224 0.138 -1.707 -3.448 -4.947 5.121 +2.585 1.284 0.153 -1.501 -3.167 -4.529 5.121 +2.574 1.088 0.241 -1.229 -2.776 -4.010 5.121 +2.580 1.106 0.425 -0.920 -2.355 -3.643 5.121 +1.922 0.527 -0.059 -1.209 -2.564 -3.871 5.121 +2.017 0.458 -0.182 -1.171 -2.398 -3.546 5.121 +2.352 0.876 0.380 -0.503 -1.230 -2.254 5.121 +1.950 0.722 0.209 -0.452 -1.073 -1.614 5.121 +1.220 0.330 0.103 -0.486 -0.680 -0.885 5.121 +0.471 -0.407 -0.285 -0.623 -0.599 -0.446 5.121 +0.511 -0.492 -0.130 -0.337 -0.136 0.190 5.121 +0.307 -0.752 0.217 0.012 0.365 0.826 5.121 +0.406 -0.590 0.283 0.358 0.804 1.445 5.121 +0.220 -0.699 0.242 0.488 1.004 1.767 5.121 +0.387 -0.540 0.361 0.683 1.125 2.210 5.121 +0.055 -0.807 0.235 0.609 1.276 2.463 5.121 +0.169 -0.957 0.255 0.653 1.396 2.721 5.121 +0.278 -1.114 -0.003 0.456 1.502 2.964 5.121 +0.407 -0.968 -0.007 0.584 1.684 3.203 5.121 +0.393 -0.851 0.116 0.821 1.757 3.412 5.121 +0.393 -0.696 -0.024 0.678 1.562 3.334 5.121 +0.417 -0.630 0.074 0.642 1.618 3.447 5.121 +0.395 -0.602 0.085 0.704 1.564 3.378 5.121 +0.415 -0.713 -0.125 0.458 1.602 3.323 5.121 +0.292 -0.668 -0.194 0.434 1.582 2.861 5.121 +0.294 -0.487 -0.198 0.347 1.451 2.530 5.121 +0.322 -0.337 0.081 0.481 1.367 2.256 5.121 +0.147 -0.715 -0.199 0.061 0.911 1.652 5.121 +0.272 -0.533 -0.059 0.098 0.828 1.390 5.121 +-0.004 -0.820 -0.325 -0.344 0.421 0.747 5.121 +0.099 -0.665 -0.420 -0.320 0.118 0.242 5.121 +0.627 -0.187 -0.178 -0.062 0.135 -0.050 5.121 +0.618 -0.400 -0.568 -0.589 -0.741 -1.112 5.121 +1.219 0.194 -0.228 -0.755 -1.080 -1.747 5.121 +1.561 0.158 -0.167 -0.769 -1.368 -2.495 5.121 +1.625 0.152 -0.305 -1.177 -2.029 -3.458 5.121 +2.094 0.575 0.059 -1.071 -2.018 -3.478 5.121 +2.041 0.704 0.019 -1.078 -2.087 -3.680 5.121 +2.334 1.079 0.208 -1.052 -2.344 -3.925 5.121 +2.569 1.199 0.313 -1.291 -2.579 -4.363 5.121 +2.994 1.307 0.468 -1.386 -2.780 -4.614 5.121 +2.816 0.922 0.000 -2.075 -3.615 -5.626 5.121 +2.879 1.282 0.095 -1.900 -3.778 -5.640 5.121 +2.870 1.011 -0.121 -1.948 -3.808 -5.833 5.121 +3.508 1.526 0.434 -1.337 -3.301 -5.129 7.938 +3.286 1.550 0.395 -1.246 -3.425 -5.330 7.938 +3.293 1.603 0.381 -1.602 -3.801 -5.711 7.938 +3.493 1.966 0.520 -1.402 -3.534 -5.340 7.938 +3.285 1.832 0.423 -1.456 -2.993 -4.653 7.938 +3.274 1.847 0.649 -1.007 -2.525 -3.944 7.938 +2.429 1.015 0.002 -1.159 -2.697 -3.854 7.938 +2.466 1.241 0.327 -0.636 -1.784 -3.059 7.938 +2.152 0.985 -0.071 -0.751 -1.865 -3.074 7.938 +1.834 0.445 -0.462 -1.228 -2.342 -3.328 7.938 +2.069 0.600 -0.124 -0.728 -1.645 -2.435 7.938 +1.353 0.173 -0.150 -0.734 -1.143 -1.741 7.938 +1.077 0.203 -0.010 -0.266 -0.415 -0.643 7.938 +0.514 -0.110 -0.167 -0.237 -0.185 0.055 7.938 +0.906 0.072 0.396 0.323 0.582 0.970 7.938 +0.329 -0.438 0.155 0.214 0.511 1.006 7.938 +0.359 -0.417 0.393 0.305 0.785 1.364 7.938 +0.153 -0.628 0.287 0.529 0.949 1.757 7.938 +0.046 -0.538 0.139 0.440 1.118 1.862 7.938 +-0.348 -0.887 -0.003 0.593 1.373 2.740 7.938 +0.014 -0.621 0.101 0.607 1.439 2.969 7.938 +0.260 -0.811 0.104 0.731 1.625 3.425 7.938 +0.326 -0.710 0.204 0.704 1.777 3.418 7.938 +0.329 -0.551 0.199 0.897 1.815 3.395 7.938 +0.362 -0.358 0.099 0.808 1.830 3.284 7.938 +0.225 -0.613 0.133 0.710 1.809 3.444 7.938 +0.349 -0.431 0.006 0.594 1.638 3.379 7.938 +0.510 -0.193 0.074 0.715 1.669 3.680 7.938 +0.315 -0.353 -0.312 0.457 1.515 3.008 7.938 +0.062 -0.385 -0.315 0.362 1.482 2.693 7.938 +0.044 -0.471 -0.358 0.243 1.044 1.745 7.938 +0.005 -0.736 -0.149 0.074 0.804 1.425 7.938 +0.272 -0.515 -0.333 0.007 0.677 1.101 7.938 +0.180 -0.535 -0.308 -0.218 0.667 0.957 7.938 +0.282 -0.307 -0.275 -0.194 0.399 0.599 7.938 +0.196 -0.582 -0.483 -0.361 0.050 -0.133 7.938 +0.701 -0.209 -0.318 -0.512 -0.636 -0.897 7.938 +0.823 -0.365 -0.418 -0.682 -1.143 -1.908 7.938 +1.639 0.246 0.008 -0.682 -1.415 -2.480 7.938 +1.741 0.399 0.021 -0.748 -1.974 -3.090 7.938 +1.823 0.547 0.075 -0.854 -2.111 -3.196 7.938 +1.772 0.667 0.084 -0.920 -2.070 -3.315 7.938 +1.988 0.800 0.099 -1.077 -2.157 -3.674 7.938 +2.613 1.291 0.418 -1.084 -2.558 -4.220 7.938 +3.132 1.531 0.397 -1.589 -3.051 -5.102 7.938 +3.378 1.279 0.217 -2.022 -3.624 -5.928 7.938 +3.511 1.401 0.450 -1.950 -3.662 -5.910 7.938 +3.220 1.348 0.249 -1.803 -3.531 -5.593 7.938 +3.220 1.552 0.515 -1.378 -3.600 -5.330 9.587 +3.255 1.597 0.454 -1.316 -3.574 -5.309 9.587 +3.387 1.715 0.530 -1.366 -3.260 -5.199 9.587 +3.113 1.820 0.589 -1.365 -3.069 -4.995 9.587 +3.032 1.678 0.586 -1.101 -2.607 -4.005 9.587 +2.141 1.123 0.031 -1.123 -2.491 -3.632 9.587 +2.425 1.294 0.468 -0.514 -1.737 -2.600 9.587 +1.821 0.862 -0.115 -0.843 -1.619 -2.659 9.587 +1.670 0.839 -0.087 -0.507 -1.336 -2.185 9.587 +1.258 0.486 -0.322 -0.662 -1.663 -2.421 9.587 +1.080 0.219 -0.284 -0.576 -1.143 -1.717 9.587 +0.811 0.020 -0.277 -0.419 -0.843 -1.216 9.587 +0.673 -0.069 -0.231 -0.240 -0.220 -0.546 9.587 +0.464 -0.092 -0.012 -0.012 0.215 0.176 9.587 +0.209 -0.269 -0.025 0.098 0.443 0.744 9.587 +-0.027 -0.329 0.075 0.341 0.679 1.073 9.587 +-0.049 -0.240 0.273 0.518 0.983 1.657 9.587 +-0.185 -0.163 0.400 0.557 0.988 1.782 9.587 +-0.491 -0.655 0.030 0.278 0.841 1.747 9.587 +-0.561 -0.323 0.118 0.644 1.249 2.360 9.587 +-0.257 -0.436 0.233 0.705 1.383 2.652 9.587 +-0.068 -0.514 0.325 0.911 1.687 3.175 9.587 +-0.047 -0.713 0.085 0.918 1.634 3.241 9.587 +-0.089 -0.444 -0.011 0.928 2.002 3.309 9.587 +-0.091 -0.471 -0.005 0.834 1.929 3.070 9.587 +-0.108 -0.371 0.105 0.690 1.976 3.141 9.587 +0.020 -0.402 0.108 0.734 1.885 3.316 9.587 +-0.217 -0.573 -0.182 0.495 1.501 3.089 9.587 +-0.164 -0.428 -0.042 0.609 1.579 2.699 9.587 +-0.072 -0.266 -0.155 0.556 1.510 2.378 9.587 +0.000 -0.355 -0.171 0.535 1.138 1.971 9.587 +-0.297 -0.867 -0.335 0.096 0.826 1.400 9.587 +-0.042 -0.825 -0.375 0.142 0.725 1.126 9.587 +-0.018 -0.845 -0.528 -0.114 0.599 0.647 9.587 +-0.071 -0.803 -0.306 -0.147 0.280 0.153 9.587 +0.260 -0.468 0.045 -0.131 -0.010 -0.007 9.587 +0.484 -0.356 -0.063 -0.113 -0.100 -0.465 9.587 +0.576 -0.338 -0.237 -0.411 -0.788 -1.248 9.587 +1.032 -0.023 0.262 -0.421 -0.940 -1.632 9.587 +0.781 -0.152 -0.276 -1.049 -1.807 -2.554 9.587 +1.043 -0.080 -0.229 -0.939 -1.888 -2.879 9.587 +1.312 0.188 -0.006 -0.867 -1.818 -2.704 9.587 +1.537 0.571 0.159 -0.850 -1.980 -3.057 9.587 +2.160 1.048 0.435 -0.836 -2.054 -3.650 9.587 +2.588 1.269 0.528 -1.208 -2.469 -4.560 9.587 +3.004 1.237 0.315 -1.826 -3.258 -5.481 9.587 +3.149 1.245 0.212 -1.838 -3.344 -5.546 9.587 +3.284 1.539 0.395 -1.580 -3.429 -5.454 9.587 +2.958 1.596 0.356 -1.201 -3.405 -5.062 10.270 +3.283 1.632 0.225 -1.447 -3.315 -5.031 10.270 +3.102 1.644 0.089 -1.419 -3.472 -5.105 10.270 +3.238 1.686 0.250 -1.438 -3.292 -5.074 10.270 +3.014 1.506 0.315 -1.660 -3.227 -5.099 10.270 +3.196 2.031 0.827 -1.309 -2.888 -4.927 10.270 +2.825 1.724 0.432 -1.246 -2.803 -4.563 10.270 +2.401 1.303 -0.037 -1.470 -3.060 -4.673 10.270 +2.170 1.266 0.213 -0.967 -2.271 -3.368 10.270 +1.823 0.993 -0.123 -1.062 -2.321 -3.204 10.270 +1.746 1.111 0.061 -0.734 -1.719 -2.483 10.270 +1.588 1.065 -0.008 -0.277 -1.232 -1.935 10.270 +1.145 0.648 -0.144 -0.478 -1.062 -1.669 10.270 +1.431 1.069 0.269 -0.226 -0.833 -1.220 10.270 +0.846 0.403 -0.136 -0.587 -1.379 -1.726 10.270 +1.114 0.466 -0.059 -0.428 -1.333 -1.706 10.270 +0.589 0.260 -0.103 -0.587 -1.214 -1.802 10.270 +0.980 0.517 -0.113 -0.418 -1.045 -1.571 10.270 +0.689 0.181 -0.368 -0.486 -1.224 -1.517 10.270 +0.700 0.227 -0.171 -0.483 -1.076 -1.361 10.270 +0.444 0.048 -0.176 -0.361 -0.777 -1.166 10.270 +0.701 0.238 0.162 -0.048 -0.558 -0.740 10.270 +0.231 -0.046 -0.179 -0.118 -0.578 -0.626 10.270 +0.158 -0.120 -0.180 -0.002 -0.418 -0.412 10.270 +-0.076 -0.211 0.020 0.073 -0.093 -0.097 10.270 +0.307 0.223 0.406 0.459 0.425 0.563 10.270 +-0.220 -0.206 0.025 0.056 0.106 0.338 10.270 +-0.015 -0.128 0.086 0.117 0.153 0.577 10.270 +-0.225 -0.501 -0.004 0.137 0.236 0.473 10.270 +-0.145 -0.348 -0.013 0.437 0.455 0.833 10.270 +-0.265 -0.375 0.144 0.364 0.739 1.105 10.270 +-0.369 -0.340 0.161 0.326 0.755 1.115 10.270 +-0.561 -0.217 0.190 0.380 0.983 1.229 10.270 +-0.689 -0.424 0.216 0.229 0.757 1.130 10.270 +-0.790 -0.575 0.092 0.133 0.671 1.148 10.270 +-0.776 -0.538 0.102 0.182 0.609 1.181 10.270 +-0.402 -0.166 0.517 0.510 0.864 1.585 10.270 +-0.547 -0.273 0.429 0.496 0.955 1.722 10.270 +-0.902 -0.499 0.179 0.449 1.045 1.829 10.270 +-0.628 -0.475 0.230 0.595 1.107 2.203 10.270 +-0.510 -0.472 0.328 0.756 1.273 2.333 10.270 +-0.294 -0.535 0.505 0.796 1.480 2.626 10.270 +-0.348 -0.641 0.466 0.769 1.534 2.856 10.270 +-0.178 -0.616 0.392 0.690 1.685 3.120 10.270 +-0.172 -0.403 0.312 0.825 2.080 3.230 10.270 +-0.319 -0.403 0.336 0.969 2.163 3.207 10.270 +-0.202 -0.342 0.227 0.867 2.097 3.224 10.270 +-0.318 -0.439 0.024 0.640 1.902 2.976 10.270 +-0.328 -0.404 -0.058 0.736 1.927 3.009 10.270 +-0.222 -0.385 0.010 0.551 2.012 2.891 10.270 +-0.353 -0.441 -0.258 0.379 1.745 2.665 10.270 +-0.495 -0.449 -0.292 0.436 1.607 2.700 10.270 +-0.368 -0.655 -0.297 0.486 1.665 2.675 10.270 +-0.122 -0.544 -0.240 0.546 1.539 2.691 10.270 +-0.030 -0.385 -0.111 0.571 1.500 2.620 10.270 +-0.290 -0.644 -0.214 0.228 1.222 2.322 10.270 +-0.163 -0.333 -0.054 0.408 1.334 2.143 10.270 +-0.334 -0.500 -0.198 0.260 1.065 1.867 10.270 +-0.296 -0.370 -0.132 0.320 1.053 1.762 10.270 +0.055 -0.209 0.141 0.459 1.125 1.725 10.270 +-0.112 -0.534 0.015 0.397 0.922 1.310 10.270 +-0.595 -1.161 -0.566 -0.195 0.295 0.838 10.270 +-0.201 -0.802 -0.045 0.275 0.723 1.204 10.270 +-0.221 -0.985 -0.262 0.249 0.665 0.985 10.270 +-0.375 -1.086 -0.483 0.040 0.608 0.830 10.270 +-0.146 -0.732 -0.155 0.067 0.830 0.718 10.270 +-0.341 -1.119 -0.256 -0.111 0.464 0.341 10.270 +-0.163 -1.110 -0.124 -0.004 0.369 0.196 10.270 +-0.321 -1.107 -0.312 -0.224 0.167 -0.027 10.270 +0.261 -0.419 0.156 0.273 0.660 0.457 10.270 +-0.189 -0.659 -0.262 -0.188 0.141 0.023 10.270 +0.112 -0.331 0.112 -0.022 0.441 0.140 10.270 +-0.368 -0.542 -0.427 -0.581 -0.218 -0.505 10.270 +-0.205 -0.492 -0.307 -0.507 -0.418 -0.637 10.270 +0.225 -0.234 -0.066 -0.300 -0.369 -0.761 10.270 +0.515 -0.211 0.013 -0.342 -0.546 -0.915 10.270 +0.407 -0.260 0.003 -0.463 -0.638 -1.248 10.270 +0.894 0.109 0.290 -0.346 -0.471 -1.232 10.270 +0.609 -0.173 -0.127 -0.606 -0.911 -1.806 10.270 +0.682 -0.310 -0.298 -0.757 -1.101 -2.035 10.270 +0.834 0.151 -0.094 -0.344 -0.857 -1.754 10.270 +0.457 -0.053 -0.501 -0.724 -1.438 -2.172 10.270 +0.547 -0.220 -0.249 -0.716 -1.245 -1.991 10.270 +0.820 -0.182 -0.245 -0.621 -1.472 -2.086 10.270 +0.859 0.090 -0.127 -0.405 -1.418 -2.069 10.270 +0.952 0.008 -0.171 -0.852 -1.737 -2.503 10.270 +1.659 0.605 0.525 -0.617 -1.423 -2.683 10.270 +1.953 0.838 0.760 -0.807 -1.507 -3.173 10.270 +1.937 0.733 0.696 -1.105 -1.827 -3.706 10.270 +2.221 0.609 0.381 -1.716 -2.622 -4.776 10.270 +2.471 0.962 0.413 -1.453 -2.704 -4.747 10.270 +2.804 1.142 0.627 -1.500 -3.025 -5.097 10.270 +2.654 1.186 0.609 -1.487 -3.091 -5.070 10.270 +2.830 1.339 0.546 -1.457 -3.261 -5.362 10.270 +2.976 1.451 0.527 -1.304 -3.287 -5.149 10.270 +2.943 1.762 0.442 -1.101 -3.331 -5.091 10.270 +2.914 1.668 0.588 -0.924 -3.098 -4.688 10.174 +2.657 1.530 0.362 -1.092 -3.065 -4.803 10.174 +2.765 1.592 0.319 -1.155 -3.176 -4.797 10.174 +2.519 1.305 0.099 -1.553 -3.145 -5.075 10.174 +3.073 1.647 0.265 -1.226 -2.885 -4.541 10.174 +2.156 1.332 -0.128 -1.536 -3.025 -4.640 10.174 +2.326 1.565 0.175 -0.935 -2.327 -3.880 10.174 +1.885 1.431 0.061 -0.765 -1.827 -3.516 10.174 +1.447 1.031 -0.080 -0.857 -1.532 -2.960 10.174 +0.975 0.575 -0.372 -0.745 -1.393 -2.396 10.174 +1.076 0.827 0.015 -0.311 -0.791 -1.522 10.174 +0.619 0.457 -0.160 -0.216 -0.612 -1.011 10.174 +0.126 0.222 -0.255 -0.147 -0.472 -0.417 10.174 +0.456 0.444 0.175 0.299 -0.145 -0.036 10.174 +-0.172 -0.081 -0.168 -0.156 -0.541 -0.415 10.174 +0.108 0.140 -0.167 -0.060 -0.542 -0.388 10.174 +0.085 0.343 -0.050 -0.004 -0.400 -0.188 10.174 +0.066 0.289 -0.082 -0.054 -0.463 -0.457 10.174 +-0.259 -0.017 -0.217 -0.275 -0.591 -0.823 10.174 +-0.055 -0.075 -0.181 -0.128 -0.497 -0.581 10.174 +-0.149 -0.140 -0.285 -0.174 -0.372 -0.474 10.174 +-0.419 -0.100 -0.212 0.004 -0.344 -0.247 10.174 +-0.608 -0.142 -0.068 0.106 -0.381 -0.291 10.174 +-0.813 -0.165 0.062 0.112 -0.177 0.018 10.174 +-0.792 -0.403 0.091 0.113 -0.046 0.255 10.174 +-0.861 -0.419 0.050 0.050 -0.050 0.311 10.174 +-0.821 -0.597 -0.056 -0.028 0.057 0.367 10.174 +-0.595 -0.504 0.176 0.187 0.027 0.551 10.174 +-0.680 -0.683 -0.114 0.102 -0.027 0.459 10.174 +-0.613 -0.497 0.094 0.330 0.378 0.853 10.174 +-0.567 -0.487 0.233 0.443 0.774 0.932 10.174 +-0.743 -0.508 0.233 0.500 0.786 0.947 10.174 +-1.001 -0.390 0.292 0.410 0.820 0.852 10.174 +-1.173 -0.533 0.314 0.352 0.847 0.970 10.174 +-1.075 -0.595 0.243 0.255 0.762 0.834 10.174 +-0.934 -0.427 0.345 0.421 0.864 1.031 10.174 +-0.681 -0.148 0.575 0.520 0.877 1.139 10.174 +-0.509 0.015 0.657 0.811 1.239 1.655 10.174 +-0.953 -0.492 0.233 0.563 0.923 1.530 10.174 +-0.754 -0.415 0.470 0.725 1.012 1.837 10.174 +-0.757 -0.620 0.338 0.579 1.220 1.940 10.174 +-0.668 -0.667 0.352 0.740 1.365 2.350 10.174 +-0.380 -0.617 0.370 0.662 1.448 2.536 10.174 +-0.423 -0.658 0.298 0.673 1.698 2.782 10.174 +-0.309 -0.359 0.313 0.739 2.141 2.912 10.174 +0.069 0.114 0.585 1.208 2.671 3.505 10.174 +-0.332 -0.339 0.184 0.748 2.203 2.962 10.174 +-0.319 -0.179 0.240 0.848 2.181 3.115 10.174 +-0.214 -0.059 0.329 0.875 2.253 3.111 10.174 +-0.153 0.125 0.189 0.950 2.346 3.068 10.174 +0.016 0.113 0.106 0.955 2.218 2.842 10.174 +-0.132 0.045 0.133 0.862 2.156 2.770 10.174 +0.055 0.137 0.020 0.809 1.932 2.664 10.174 +-0.189 -0.149 -0.176 0.567 1.557 2.481 10.174 +0.027 0.029 -0.007 0.698 1.553 2.471 10.174 +-0.112 -0.095 -0.037 0.617 1.451 2.111 10.174 +-0.135 -0.056 -0.082 0.566 1.094 1.707 10.174 +-0.278 -0.411 -0.158 0.366 0.855 1.227 10.174 +-0.337 -0.457 0.083 0.188 0.793 1.210 10.174 +-0.225 -0.328 0.016 0.107 0.714 1.132 10.174 +-0.256 -0.544 -0.086 -0.011 0.453 0.736 10.174 +-0.401 -0.586 0.069 0.215 1.013 1.030 10.174 +-0.691 -0.927 -0.225 0.055 0.644 0.744 10.174 +-0.844 -0.916 -0.188 0.286 0.784 1.024 10.174 +-0.581 -0.668 -0.152 0.135 0.970 0.763 10.174 +-0.943 -1.121 -0.263 -0.089 0.701 0.513 10.174 +-0.630 -1.075 0.098 0.116 0.732 0.638 10.174 +-0.547 -1.163 -0.198 -0.041 0.778 0.531 10.174 +-0.488 -0.970 -0.146 0.043 0.400 0.242 10.174 +-0.328 -0.649 -0.045 0.146 0.579 0.308 10.174 +-0.486 -0.532 -0.154 -0.085 0.436 0.135 10.174 +-0.931 -0.853 -0.501 -0.581 0.025 -0.192 10.174 +-0.730 -0.434 -0.121 -0.198 0.258 -0.080 10.174 +-0.446 -0.189 0.121 -0.003 0.306 -0.029 10.174 +-0.730 -0.385 -0.084 -0.245 -0.164 -0.495 10.174 +-0.599 -0.521 -0.447 -0.404 -0.488 -0.694 10.174 +-0.434 -0.622 -0.347 -0.540 -0.594 -0.780 10.174 +-0.060 -0.298 -0.056 -0.388 -0.504 -0.739 10.174 +0.454 0.058 0.159 -0.051 -0.098 -0.494 10.174 +0.361 -0.058 0.042 -0.106 -0.293 -0.732 10.174 +0.024 -0.193 -0.181 -0.222 -0.336 -0.795 10.174 +0.233 0.182 0.058 -0.101 -0.315 -0.890 10.174 +0.291 0.200 0.067 0.117 0.016 -0.337 10.174 +-0.027 -0.392 -0.355 -0.254 -0.502 -0.899 10.174 +0.503 -0.013 0.123 0.227 0.020 -0.491 10.174 +0.290 -0.105 -0.034 -0.194 -0.461 -1.189 10.174 +0.477 -0.182 0.151 -0.314 -0.528 -1.689 10.174 +0.655 0.206 0.201 -0.971 -0.839 -2.225 10.174 +1.001 0.306 0.304 -1.172 -1.389 -3.036 10.174 +1.461 0.719 0.459 -1.107 -1.879 -3.692 10.174 +1.749 0.751 0.301 -1.246 -2.344 -3.988 10.174 +1.923 1.001 0.394 -1.409 -2.630 -4.314 10.174 +2.120 1.230 0.315 -1.258 -3.039 -4.603 10.174 +2.381 1.487 0.553 -1.041 -2.813 -4.655 10.174 +2.377 1.517 0.405 -1.099 -3.192 -4.782 10.174 +2.772 1.580 0.713 -0.766 -3.021 -4.774 10.174 +2.394 1.222 0.521 -0.806 -3.204 -4.414 9.410 +2.565 1.670 0.663 -0.865 -2.884 -4.350 9.410 +2.331 1.450 0.237 -1.128 -2.972 -4.419 9.410 +2.243 1.333 -0.143 -1.562 -3.094 -4.666 9.410 +2.241 1.766 0.361 -1.184 -2.358 -3.850 9.410 +2.449 1.722 0.581 -1.292 -2.293 -3.762 9.410 +2.002 1.397 0.250 -1.041 -1.804 -3.068 9.410 +1.579 1.174 -0.059 -0.898 -1.842 -2.850 9.410 +1.070 0.935 0.036 -0.260 -1.036 -1.704 9.410 +0.767 0.616 -0.167 0.109 -0.097 -1.035 9.410 +0.312 0.222 -0.183 -0.190 -0.353 -0.447 9.410 +-0.346 0.014 -0.485 -0.020 0.010 0.117 9.410 +-0.696 -0.284 -0.527 0.018 0.514 0.852 9.410 +-0.600 -0.231 -0.647 -0.127 0.060 0.279 9.410 +-0.952 -0.616 -0.668 -0.229 -0.224 0.154 9.410 +-0.605 -0.495 -0.399 -0.023 -0.216 0.136 9.410 +-0.362 0.012 -0.084 0.382 0.251 0.888 9.410 +-0.646 -0.320 -0.581 0.062 -0.468 -0.088 9.410 +-0.775 -0.291 -0.526 0.108 -0.052 0.150 9.410 +-0.468 -0.238 -0.407 0.168 -0.025 -0.010 9.410 +-0.558 -0.274 -0.413 0.265 -0.087 0.207 9.410 +-0.547 -0.364 -0.164 0.143 -0.071 0.152 9.410 +-0.914 -0.432 -0.235 0.077 -0.082 0.206 9.410 +-0.972 -0.388 -0.031 0.168 -0.015 0.233 9.410 +-0.852 -0.117 0.272 0.323 0.236 0.680 9.410 +-1.014 -0.404 -0.017 -0.012 -0.108 0.312 9.410 +-0.934 -0.370 -0.032 0.094 -0.080 0.391 9.410 +-0.954 -0.555 -0.180 0.000 -0.036 0.343 9.410 +-0.677 -0.658 -0.058 0.155 -0.121 0.351 9.410 +-0.787 -0.716 -0.172 -0.005 -0.229 0.202 9.410 +-0.676 -0.657 0.119 0.154 0.313 0.400 9.410 +-1.056 -0.627 0.227 0.084 0.491 0.430 9.410 +-1.365 -0.715 0.055 -0.041 0.350 0.112 9.410 +-1.422 -0.739 0.168 0.189 0.480 0.407 9.410 +-1.320 -0.791 0.034 0.059 0.376 0.139 9.410 +-1.036 -0.641 0.189 0.140 0.361 0.181 9.410 +-0.641 -0.277 0.200 0.026 0.216 -0.189 9.410 +-0.636 -0.329 0.210 0.212 0.503 0.547 9.410 +-0.942 -0.707 0.142 0.263 0.750 0.799 9.410 +-0.760 -0.571 0.254 0.450 1.048 1.155 9.410 +-0.494 -0.433 0.244 0.695 0.808 1.507 9.410 +-0.609 -0.517 0.097 0.507 1.097 1.933 9.410 +-0.524 -0.584 0.216 0.530 1.150 1.835 9.410 +-0.293 -0.714 0.235 0.601 1.566 2.349 9.410 +-0.130 -0.643 0.103 0.507 1.679 2.455 9.410 +0.032 -0.433 0.015 0.489 1.741 2.524 9.410 +-0.013 -0.294 0.124 0.535 1.484 2.559 9.410 +0.034 -0.019 0.364 0.668 1.724 2.855 9.410 +-0.207 0.027 0.496 0.691 1.605 2.652 9.410 +-0.117 0.136 0.375 0.839 1.597 2.739 9.410 +0.331 0.324 0.402 0.905 1.727 2.631 9.410 +0.522 0.234 0.222 0.900 1.786 2.536 9.410 +0.409 0.232 0.054 0.845 1.568 2.246 9.410 +0.133 -0.156 -0.214 0.692 1.290 1.885 9.410 +0.356 0.113 0.014 0.779 1.389 1.847 9.410 +-0.209 -0.240 -0.289 0.299 0.928 1.345 9.410 +-0.390 -0.525 -0.350 0.008 0.302 0.562 9.410 +0.011 -0.019 -0.056 0.320 0.514 0.780 9.410 +-0.048 -0.323 0.183 0.216 0.551 0.607 9.410 +-0.407 -0.682 -0.339 -0.469 -0.241 -0.286 9.410 +-0.149 -0.268 0.073 -0.222 -0.207 -0.420 9.410 +-0.707 -0.623 0.031 -0.137 0.333 0.233 9.410 +-1.432 -1.220 -0.888 -0.429 0.021 0.004 9.410 +-1.273 -1.111 -0.432 -0.063 0.389 0.164 9.410 +-0.904 -0.796 -0.186 0.098 0.444 0.055 9.410 +-0.731 -0.976 -0.264 0.127 0.650 0.399 9.410 +-0.921 -1.067 -0.310 0.008 0.459 0.175 9.410 +-0.997 -1.248 -0.348 -0.261 0.203 -0.098 9.410 +-0.834 -0.965 -0.455 -0.102 0.182 -0.088 9.410 +-0.803 -0.672 -0.128 -0.068 0.296 0.041 9.410 +-1.107 -0.986 -0.537 -0.467 0.157 -0.231 9.410 +-1.075 -0.743 -0.405 -0.382 0.284 -0.178 9.410 +-0.904 -0.642 -0.301 -0.271 0.310 0.027 9.410 +-0.784 -0.321 0.070 0.113 0.539 0.287 9.410 +-0.799 -0.329 -0.051 0.109 0.274 0.264 9.410 +-0.958 -0.547 -0.242 -0.288 0.004 -0.139 9.410 +-0.727 -0.286 -0.107 -0.159 0.058 0.082 9.410 +-0.488 -0.179 -0.152 -0.354 -0.266 -0.212 9.410 +-0.488 -0.272 -0.167 -0.146 -0.252 -0.327 9.410 +-0.170 -0.165 -0.150 -0.031 0.010 -0.101 9.410 +-0.632 -0.525 -0.321 -0.176 0.297 0.137 9.410 +-0.532 -0.466 -0.280 -0.249 0.165 -0.053 9.410 +-0.547 -0.428 -0.352 -0.215 0.276 0.076 9.410 +-0.444 -0.523 -0.112 0.217 0.223 0.304 9.410 +-0.720 -0.988 -0.222 0.310 0.708 0.772 9.410 +-0.475 -0.669 -0.019 0.218 0.593 -0.157 9.410 +-0.304 -0.248 -0.011 0.051 0.609 -0.693 9.410 +0.130 0.034 0.065 -0.431 -0.367 -1.329 9.410 +0.817 0.291 0.311 -0.535 -0.710 -1.761 9.410 +1.138 0.477 0.308 -1.126 -1.424 -2.907 9.410 +1.140 0.581 0.114 -1.148 -1.986 -3.129 9.410 +1.616 0.934 0.234 -1.239 -2.399 -3.718 9.410 +2.003 1.248 0.331 -1.060 -2.378 -3.622 9.410 +2.344 1.334 0.364 -1.195 -2.642 -4.126 9.410 +2.589 1.584 0.603 -0.957 -2.714 -4.046 9.410 +2.804 1.560 0.870 -0.795 -2.834 -4.311 9.410 +2.529 1.453 0.661 -0.712 -2.764 -3.580 8.262 +1.939 1.301 0.361 -1.153 -3.049 -3.766 8.262 +1.758 1.367 0.016 -1.355 -2.817 -3.880 8.262 +1.628 1.162 0.251 -1.406 -2.748 -3.927 8.262 +2.027 1.645 0.079 -0.989 -2.152 -3.328 8.262 +1.525 1.322 -0.089 -1.269 -2.024 -3.166 8.262 +0.995 0.781 -0.106 -0.995 -1.664 -2.783 8.262 +1.059 1.020 0.358 -0.481 -0.964 -1.541 8.262 +0.435 0.590 -0.006 -0.195 -0.283 -0.835 8.262 +-0.642 -0.138 -0.527 -0.113 -0.017 -0.010 8.262 +-0.909 -0.273 -0.416 0.378 0.727 0.958 8.262 +-1.177 -0.723 -0.699 0.622 1.374 1.847 8.262 +-1.311 -0.547 -0.439 1.002 1.810 2.765 8.262 +-1.506 -0.428 -0.800 0.671 1.554 2.153 8.262 +-1.404 -0.684 -0.735 0.608 0.901 1.631 8.262 +-1.096 -0.596 -0.474 0.753 0.977 1.445 8.262 +-1.526 -0.921 -0.694 0.466 0.350 1.244 8.262 +-1.553 -1.000 -0.911 0.155 -0.073 0.701 8.262 +-1.231 -0.710 -0.690 0.385 0.493 0.909 8.262 +-1.375 -0.891 -0.773 0.236 -0.034 0.645 8.262 +-1.037 -0.677 -0.591 0.477 0.238 0.846 8.262 +-1.037 -0.779 -0.555 0.111 0.018 0.680 8.262 +-1.080 -0.656 -0.311 -0.003 0.221 0.458 8.262 +-1.197 -0.450 -0.348 -0.045 0.190 0.576 8.262 +-1.197 -0.590 -0.267 -0.011 -0.134 0.377 8.262 +-1.474 -0.752 -0.518 -0.216 -0.400 -0.125 8.262 +-1.330 -0.676 -0.597 -0.241 -0.445 -0.038 8.262 +-1.163 -0.559 -0.424 -0.106 -0.169 0.072 8.262 +-1.050 -0.776 -0.426 -0.035 -0.256 -0.106 8.262 +-1.008 -0.607 -0.090 0.138 -0.039 0.122 8.262 +-1.102 -0.924 -0.297 -0.028 0.022 -0.111 8.262 +-1.315 -0.608 -0.036 0.100 0.260 0.174 8.262 +-1.358 -0.459 0.109 -0.093 0.086 -0.169 8.262 +-1.631 -0.643 0.014 -0.114 0.172 -0.215 8.262 +-0.864 -0.489 0.269 0.145 0.060 -0.271 8.262 +-0.819 -0.254 0.388 0.154 -0.014 -0.474 8.262 +-0.351 -0.224 0.105 -0.311 -0.342 -0.867 8.262 +-0.418 -0.406 0.222 -0.113 -0.011 -0.303 8.262 +-0.488 -0.425 0.112 0.196 0.154 0.171 8.262 +-0.821 -0.859 -0.365 -0.214 -0.114 0.022 8.262 +-0.467 -0.404 0.074 0.339 0.259 0.751 8.262 +-0.489 -0.545 0.026 0.556 0.552 1.324 8.262 +-0.189 -0.286 0.326 0.704 0.904 1.717 8.262 +-0.210 -0.442 0.214 0.477 1.119 1.843 8.262 +0.012 -0.202 0.087 0.508 1.286 2.009 8.262 +0.074 0.068 0.159 0.573 1.340 2.173 8.262 +0.139 0.063 0.250 0.308 1.284 1.978 8.262 +0.108 0.249 0.419 0.643 1.655 2.348 8.262 +0.184 0.299 0.452 0.554 1.460 2.254 8.262 +-0.224 0.122 0.135 0.426 1.181 2.054 8.262 +0.080 0.126 -0.162 0.580 0.982 1.853 8.262 +0.556 0.366 0.114 0.949 1.376 2.085 8.262 +0.654 0.184 -0.248 0.491 0.904 1.745 8.262 +0.373 -0.039 -0.187 0.523 1.002 1.607 8.262 +0.321 -0.083 -0.145 0.433 0.735 1.232 8.262 +0.389 0.177 0.108 0.592 0.752 1.299 8.262 +0.439 0.086 0.215 0.386 0.200 0.652 8.262 +0.367 0.124 0.152 0.270 -0.190 0.103 8.262 +0.245 0.474 0.112 0.292 0.052 -0.156 8.262 +-0.038 0.136 0.044 -0.120 0.114 -0.941 8.262 +-0.040 0.072 0.241 -0.337 -0.717 -1.370 8.262 +-0.723 -0.387 -0.100 -0.321 -0.162 -0.786 8.262 +-0.769 -0.511 -0.025 -0.044 0.024 -0.405 8.262 +-1.202 -0.770 -0.315 0.184 0.269 -0.219 8.262 +-1.029 -0.629 -0.254 0.169 0.183 -0.164 8.262 +-1.273 -0.773 -0.311 0.033 0.082 -0.036 8.262 +-1.119 -0.827 -0.235 0.147 -0.318 -0.154 8.262 +-1.250 -0.731 0.068 0.019 0.260 0.090 8.262 +-1.097 -0.641 -0.330 0.213 0.147 -0.042 8.262 +-1.241 -0.914 -0.587 -0.240 0.022 -0.174 8.262 +-1.177 -0.835 -0.468 -0.030 0.257 -0.045 8.262 +-1.402 -0.889 -0.563 -0.030 0.243 0.097 8.262 +-1.393 -0.910 -0.495 -0.071 0.167 0.114 8.262 +-1.395 -0.759 -0.234 0.110 0.326 0.387 8.262 +-1.147 -0.538 -0.110 0.111 0.341 0.596 8.262 +-1.372 -0.611 -0.210 -0.092 0.221 0.734 8.262 +-1.386 -0.644 -0.184 -0.086 0.280 0.768 8.262 +-1.134 -0.474 -0.007 -0.064 0.259 0.889 8.262 +-0.957 -0.267 -0.045 0.032 0.456 0.966 8.262 +-0.918 -0.568 -0.377 -0.243 0.469 0.749 8.262 +-1.076 -0.390 -0.137 0.172 1.072 1.198 8.262 +-1.374 -0.737 -0.308 0.064 1.008 1.050 8.262 +-1.542 -0.811 -0.212 0.438 1.237 1.693 8.262 +-1.805 -1.129 -0.385 0.570 1.026 1.874 8.262 +-1.687 -1.048 0.085 0.994 1.887 2.100 8.262 +-1.482 -1.030 0.102 0.817 1.877 1.478 8.262 +-1.162 -0.866 -0.031 0.341 1.154 0.730 8.262 +-0.770 -0.747 0.086 0.032 0.296 0.594 8.262 +0.074 0.309 0.301 -0.113 -0.275 -0.828 8.262 +0.639 0.474 0.391 -0.303 -0.513 -1.425 8.262 +1.151 0.475 0.347 -0.636 -0.795 -1.856 8.262 +1.030 0.547 0.123 -0.943 -1.510 -2.614 8.262 +1.453 0.796 0.228 -1.028 -1.957 -2.813 8.262 +2.208 1.264 0.585 -0.988 -2.441 -3.135 8.262 +2.147 1.334 0.602 -0.903 -2.704 -3.326 8.262 +2.178 1.344 0.746 -1.052 -2.816 -3.729 8.262 +2.391 1.670 0.607 -0.950 -2.181 -2.995 6.741 +2.002 1.425 0.259 -1.073 -2.357 -3.309 6.741 +1.763 1.056 -0.096 -1.393 -2.454 -3.641 6.741 +1.613 1.284 -0.083 -1.108 -1.990 -3.311 6.741 +1.374 1.014 -0.294 -1.163 -1.901 -2.934 6.741 +1.763 1.266 0.404 -0.523 -1.205 -2.285 6.741 +0.789 0.505 -0.022 -0.766 -1.066 -1.894 6.741 +0.804 0.881 0.494 -0.079 -0.144 -0.747 6.741 +-0.791 -0.376 -0.469 -0.534 -0.258 -0.404 6.741 +-0.688 0.096 -0.102 0.513 1.103 1.363 6.741 +-1.779 -0.853 -0.652 0.589 1.170 2.064 6.741 +-2.042 -1.276 -0.460 1.245 1.791 3.231 6.741 +-2.017 -0.869 -0.358 1.759 2.498 4.398 6.741 +-2.094 -1.001 -0.673 1.134 2.234 3.634 6.741 +-2.085 -0.647 -0.392 1.140 1.835 3.273 6.741 +-1.379 -0.484 -0.185 1.148 1.814 2.828 6.741 +-2.187 -1.257 -0.954 0.535 0.972 2.166 6.741 +-1.567 -0.603 -0.714 0.868 1.144 2.123 6.741 +-1.587 -0.770 -0.593 0.594 0.795 2.003 6.741 +-1.427 -0.869 -0.597 0.458 0.652 1.506 6.741 +-1.157 -0.722 -0.499 0.488 0.704 1.430 6.741 +-1.412 -0.716 -0.487 0.191 0.552 1.048 6.741 +-1.271 -0.599 -0.335 -0.072 0.407 0.932 6.741 +-1.011 -0.574 -0.242 -0.062 0.191 0.406 6.741 +-0.935 -0.499 -0.337 0.066 0.047 0.348 6.741 +-0.996 -0.419 -0.177 0.187 0.092 0.145 6.741 +-1.275 -0.596 -0.592 -0.095 -0.224 -0.556 6.741 +-1.166 -0.566 -0.541 -0.053 -0.125 -0.695 6.741 +-1.336 -0.756 -0.482 -0.332 -0.385 -0.868 6.741 +-1.285 -0.750 -0.361 -0.267 0.007 -0.658 6.741 +-1.139 -0.637 -0.116 -0.144 0.061 -0.818 6.741 +-1.302 -0.723 -0.015 -0.279 0.059 -0.398 6.741 +-1.282 -0.608 -0.010 -0.363 -0.575 -0.798 6.741 +-1.512 -0.849 -0.090 -0.333 -0.450 -0.810 6.741 +-1.300 -0.689 -0.130 -0.311 -0.693 -1.194 6.741 +-0.779 -0.268 0.300 -0.159 -0.471 -1.087 6.741 +-0.541 -0.158 0.033 -0.690 -0.985 -1.456 6.741 +0.049 -0.167 0.335 -0.104 -0.410 -0.919 6.741 +0.007 0.015 0.217 0.066 -0.258 -0.491 6.741 +-0.120 -0.133 0.012 0.025 -0.261 -0.252 6.741 +0.179 -0.009 0.124 0.177 -0.027 0.175 6.741 +0.036 -0.192 0.290 0.346 -0.120 0.744 6.741 +0.277 -0.028 0.309 0.411 0.215 0.905 6.741 +0.156 -0.142 0.251 0.356 0.865 1.404 6.741 +0.357 0.105 0.161 0.148 0.909 1.279 6.741 +0.613 0.386 0.277 0.432 1.309 1.713 6.741 +0.538 0.651 0.253 0.307 1.249 1.374 6.741 +0.500 0.675 0.253 0.462 1.056 1.733 6.741 +0.467 0.749 0.198 0.490 0.578 1.625 6.741 +0.697 0.879 0.399 0.799 0.753 1.965 6.741 +0.778 0.412 -0.161 0.385 0.386 1.192 6.741 +1.203 0.763 0.032 0.975 0.681 1.781 6.741 +1.131 0.558 0.113 0.877 0.813 1.292 6.741 +0.997 0.408 0.289 0.644 0.717 1.395 6.741 +0.987 0.437 0.366 0.533 0.586 0.802 6.741 +0.193 -0.018 -0.049 0.094 0.139 0.295 6.741 +0.600 0.427 0.508 0.345 -0.116 0.006 6.741 +-0.079 0.026 -0.161 -0.174 -0.844 -0.614 6.741 +0.386 0.496 0.431 -0.067 -0.676 -0.756 6.741 +0.263 0.622 0.516 -0.217 -0.833 -1.458 6.741 +-0.214 0.003 -0.059 -1.261 -1.774 -2.336 6.741 +-0.797 -0.651 -0.419 -0.859 -1.330 -1.912 6.741 +-0.487 -0.384 -0.111 -0.400 -0.323 -1.257 6.741 +-0.765 -0.488 -0.473 0.255 0.071 -0.426 6.741 +-0.865 -0.236 -0.433 0.224 -0.239 -0.766 6.741 +-1.290 -0.572 -0.268 0.131 -0.515 -0.589 6.741 +-1.031 -0.184 -0.088 0.213 -0.337 -0.436 6.741 +-1.279 -0.233 -0.162 0.092 -0.211 -0.297 6.741 +-1.050 -0.261 -0.142 -0.007 0.037 -0.442 6.741 +-1.619 -0.907 -0.836 -0.322 -0.465 -0.475 6.741 +-1.498 -0.614 -0.610 -0.070 -0.293 -0.102 6.741 +-1.527 -0.856 -0.692 -0.107 -0.192 0.046 6.741 +-1.549 -1.079 -0.684 -0.053 -0.367 0.177 6.741 +-1.521 -0.731 -0.240 0.233 0.235 0.736 6.741 +-1.609 -0.794 -0.187 0.149 0.358 0.996 6.741 +-1.819 -0.906 0.113 0.117 0.450 1.349 6.741 +-1.495 -0.800 0.043 0.344 0.927 1.681 6.741 +-1.443 -0.926 -0.370 0.057 0.555 1.675 6.741 +-1.446 -0.892 -0.488 0.185 0.901 2.167 6.741 +-1.340 -0.799 -0.482 0.160 1.147 2.001 6.741 +-1.673 -0.799 -0.350 0.333 1.683 2.360 6.741 +-1.774 -0.862 -0.095 0.507 1.604 2.344 6.741 +-2.350 -1.274 -0.361 0.600 1.684 2.629 6.741 +-2.622 -1.193 -0.297 1.248 1.975 3.207 6.741 +-2.316 -1.191 0.009 1.280 2.696 3.169 6.741 +-2.234 -1.136 -0.114 1.408 2.226 2.756 6.741 +-1.586 -0.983 -0.030 0.728 1.652 2.007 6.741 +-0.784 -0.482 0.360 0.156 1.003 1.183 6.741 +-0.202 0.096 0.494 0.712 0.586 0.415 6.741 +0.528 0.179 0.531 0.208 0.124 -0.420 6.741 +0.784 0.457 0.599 -0.122 -0.175 -0.750 6.741 +1.399 0.740 0.487 -0.462 -1.007 -1.729 6.741 +1.533 0.776 0.431 -0.788 -1.468 -2.283 6.741 +2.039 0.992 0.510 -0.978 -2.306 -2.779 6.741 +1.871 1.180 0.488 -0.962 -2.355 -3.207 6.741 +2.357 1.415 0.542 -0.968 -2.376 -3.236 6.741 +2.056 1.444 0.473 -0.771 -1.630 -2.417 4.839 +2.235 1.687 0.855 -0.429 -1.221 -1.983 4.839 +1.545 0.885 0.021 -1.087 -1.870 -2.533 4.839 +1.449 1.032 0.249 -0.707 -1.091 -2.128 4.839 +1.014 0.583 0.044 -0.897 -1.056 -1.691 4.839 +1.438 1.158 0.833 0.094 0.028 -0.725 4.839 +1.274 0.885 0.974 0.224 0.375 0.081 4.839 +-0.113 0.362 0.132 0.005 0.125 0.231 4.839 +-0.751 -0.256 -0.054 0.733 0.775 1.158 4.839 +-1.694 -0.821 -0.218 0.898 1.367 2.234 4.839 +-2.304 -1.304 -0.422 0.945 1.924 3.199 4.839 +-2.832 -1.207 -0.505 1.663 2.884 4.611 4.839 +-3.148 -1.397 -0.571 1.834 3.330 5.152 4.839 +-3.437 -1.366 -0.947 1.416 3.093 5.028 4.839 +-2.870 -1.035 -0.633 1.470 2.936 4.843 4.839 +-2.397 -0.756 -0.162 1.597 2.743 4.343 4.839 +-2.584 -1.051 -0.749 0.977 2.345 3.801 4.839 +-2.335 -0.882 -0.872 0.985 1.990 3.158 4.839 +-1.931 -0.746 -0.728 1.123 1.896 3.134 4.839 +-1.878 -0.878 -0.684 1.003 1.585 2.651 4.839 +-1.344 -0.769 -0.445 0.843 1.659 2.329 4.839 +-1.657 -0.930 -0.553 0.334 1.348 1.927 4.839 +-1.622 -0.747 -0.446 0.091 1.099 1.431 4.839 +-1.563 -0.770 -0.400 0.106 0.700 1.166 4.839 +-1.169 -0.586 -0.308 0.125 0.377 0.429 4.839 +-0.770 -0.320 -0.017 0.458 0.724 0.359 4.839 +-1.187 -0.682 -0.563 0.069 -0.044 -0.649 4.839 +-1.438 -0.483 -0.493 0.018 -0.019 -0.785 4.839 +-1.616 -0.424 -0.392 -0.236 -0.231 -1.036 4.839 +-1.472 -0.306 0.143 -0.145 0.219 -0.621 4.839 +-1.289 -0.431 0.149 -0.365 -0.187 -1.136 4.839 +-1.432 -0.547 0.221 -0.354 -0.178 -0.822 4.839 +-1.160 -0.147 0.388 -0.302 -0.700 -1.261 4.839 +-1.479 -0.450 0.147 -0.280 -1.054 -1.537 4.839 +-0.958 -0.400 0.130 -0.255 -1.072 -2.041 4.839 +-0.645 -0.179 0.354 -0.449 -1.198 -2.398 4.839 +-0.121 0.150 0.435 -0.404 -1.222 -2.427 4.839 +0.076 0.281 0.443 -0.080 -0.715 -1.764 4.839 +0.025 0.223 0.199 -0.238 -0.906 -1.542 4.839 +-0.114 0.252 0.097 -0.179 -0.934 -1.131 4.839 +0.261 0.394 0.123 -0.067 -0.762 -0.710 4.839 +-0.087 0.021 0.059 -0.165 -0.660 -0.240 4.839 +0.245 0.166 0.049 -0.017 -0.398 -0.081 4.839 +0.531 0.453 0.435 0.296 0.727 0.744 4.839 +0.824 0.845 0.413 0.207 0.743 0.731 4.839 +0.667 0.784 0.344 0.248 1.222 1.026 4.839 +1.156 1.255 0.508 0.538 1.534 1.031 4.839 +0.776 1.179 0.431 0.710 1.177 1.235 4.839 +1.005 1.349 0.416 0.760 0.678 1.221 4.839 +1.394 1.323 0.333 0.949 0.712 1.483 4.839 +1.130 0.677 -0.289 0.378 -0.089 0.519 4.839 +1.041 0.485 -0.113 0.488 0.352 0.748 4.839 +1.115 0.690 0.274 0.373 0.244 0.448 4.839 +0.789 0.365 0.389 0.180 -0.069 0.350 4.839 +0.745 0.511 0.275 0.084 -0.283 -0.126 4.839 +0.609 0.626 0.438 0.390 0.150 0.027 4.839 +0.630 0.838 0.672 0.120 -0.540 -0.768 4.839 +-0.076 0.474 0.207 -0.295 -1.489 -1.273 4.839 +-0.426 0.001 -0.156 -0.973 -1.510 -1.990 4.839 +-0.104 0.246 0.015 -0.546 -1.719 -2.157 4.839 +0.129 0.501 -0.024 -0.442 -1.721 -2.707 4.839 +-0.079 -0.022 -0.143 -0.424 -1.463 -2.422 4.839 +-0.079 0.074 0.214 0.068 -0.704 -1.813 4.839 +-1.133 -0.394 -0.383 -0.286 -0.445 -1.333 4.839 +-1.085 0.053 -0.157 0.128 -0.544 -1.366 4.839 +-1.523 -0.007 0.014 0.387 -0.345 -0.701 4.839 +-1.212 -0.165 0.067 -0.070 -0.496 -0.763 4.839 +-1.412 -0.317 -0.070 0.011 0.057 -0.382 4.839 +-1.694 -0.532 -0.583 -0.335 -0.505 -0.558 4.839 +-1.734 -0.521 -0.671 -0.165 -0.219 -0.042 4.839 +-1.553 -0.585 -0.796 -0.132 -0.245 0.340 4.839 +-1.568 -0.834 -0.718 0.066 0.007 0.671 4.839 +-1.622 -0.630 -0.245 0.211 0.440 1.071 4.839 +-1.981 -0.694 -0.210 0.433 0.742 1.481 4.839 +-1.987 -0.785 -0.332 0.253 0.918 1.615 4.839 +-2.442 -1.020 -0.468 0.072 0.828 1.771 4.839 +-2.026 -0.831 -0.151 0.255 1.206 2.308 4.839 +-1.990 -0.985 -0.285 0.406 1.405 2.683 4.839 +-2.170 -0.829 -0.332 0.778 1.955 3.025 4.839 +-2.216 -0.631 -0.542 0.876 2.122 2.997 4.839 +-2.372 -0.948 -0.298 1.027 2.639 3.816 4.839 +-2.380 -1.346 -0.083 1.189 2.695 4.036 4.839 +-2.936 -0.949 -0.087 1.573 3.147 4.600 4.839 +-3.585 -1.502 -0.124 1.924 3.303 4.989 4.839 +-3.138 -1.267 -0.027 2.121 3.670 5.174 4.839 +-2.674 -1.245 0.031 1.827 3.085 4.222 4.839 +-1.857 -0.995 -0.007 1.336 2.513 3.277 4.839 +-1.371 -0.523 0.465 1.256 2.135 2.706 4.839 +-1.127 -0.259 0.419 0.455 1.401 1.857 4.839 +-0.353 0.187 0.445 0.550 0.868 1.066 4.839 +0.270 0.436 0.721 0.461 0.519 0.441 4.839 +0.852 0.515 0.662 0.124 -0.123 -0.522 4.839 +1.295 0.698 0.527 -0.209 -0.665 -1.030 4.839 +1.446 0.848 0.381 -0.628 -1.275 -2.028 4.839 +2.024 1.160 0.538 -0.528 -1.452 -1.937 4.839 +2.089 1.374 0.729 -0.659 -1.383 -2.105 4.839 +1.712 0.857 0.469 -0.797 -1.210 -1.699 2.659 +1.729 1.069 0.698 -0.442 -0.823 -1.509 2.659 +2.037 1.548 1.026 0.115 -0.288 -0.671 2.659 +2.048 1.451 0.998 0.143 -0.431 -0.817 2.659 +1.869 1.205 1.088 0.432 -0.074 0.147 2.659 +0.879 0.506 0.386 -0.055 0.058 -0.313 2.659 +0.116 0.460 0.246 -0.121 0.121 0.817 2.659 +-0.008 0.390 0.672 0.847 1.117 2.160 2.659 +-0.709 0.080 0.525 1.342 2.145 3.138 2.659 +-1.597 -0.622 0.337 1.437 2.471 4.188 2.659 +-2.666 -1.359 -0.252 1.158 2.611 4.665 2.659 +-3.386 -1.145 -0.267 1.792 3.423 5.590 2.659 +-3.820 -1.582 -0.382 2.076 3.896 6.142 2.659 +-3.325 -1.532 -0.355 2.149 4.130 6.395 2.659 +-3.392 -1.347 -0.944 1.687 3.667 5.735 2.659 +-2.922 -1.228 -0.900 1.554 3.316 4.796 2.659 +-3.496 -1.637 -1.376 1.178 2.594 4.376 2.659 +-2.914 -0.989 -0.865 1.345 2.682 4.310 2.659 +-2.933 -1.501 -1.298 0.984 2.053 3.672 2.659 +-2.704 -1.530 -1.138 0.802 1.684 3.362 2.659 +-2.311 -1.210 -0.658 0.916 1.889 2.998 2.659 +-2.276 -1.112 -0.739 0.531 1.581 2.354 2.659 +-2.056 -1.207 -1.118 0.011 0.836 1.220 2.659 +-1.754 -0.922 -0.840 0.159 0.896 1.363 2.659 +-1.306 -0.524 -0.469 0.271 0.721 0.883 2.659 +-1.196 -0.353 -0.433 0.369 0.638 0.103 2.659 +-1.017 0.062 -0.292 0.518 0.654 -0.340 2.659 +-1.505 -0.065 -0.374 0.055 0.030 -0.739 2.659 +-1.649 -0.186 -0.289 -0.466 -0.396 -1.205 2.659 +-1.854 -0.275 -0.208 -0.575 -0.659 -1.141 2.659 +-1.344 -0.054 0.043 -0.629 -0.871 -1.328 2.659 +-1.267 -0.207 0.185 -0.562 -1.002 -1.476 2.659 +-0.794 -0.013 0.326 -0.683 -1.429 -2.301 2.659 +-1.188 -0.401 0.055 -0.722 -1.484 -2.027 2.659 +-0.934 -0.032 0.341 -0.634 -1.740 -2.783 2.659 +-0.327 0.322 0.609 -0.456 -1.453 -2.919 2.659 +-0.176 0.449 0.288 -0.779 -2.066 -3.617 2.659 +-0.238 0.414 0.176 -0.729 -1.711 -3.342 2.659 +0.073 0.501 0.464 -0.462 -1.502 -2.780 2.659 +0.211 0.678 0.531 -0.335 -1.244 -1.968 2.659 +0.602 1.060 0.601 -0.149 -1.040 -1.516 2.659 +0.249 0.479 0.211 -0.251 -0.809 -1.023 2.659 +0.927 0.853 0.374 -0.129 -0.420 -0.722 2.659 +1.059 1.099 0.792 0.397 0.578 0.211 2.659 +1.399 1.284 0.533 -0.032 0.588 0.019 2.659 +1.439 1.469 0.594 0.503 1.084 0.518 2.659 +1.480 1.592 0.481 0.401 0.831 0.070 2.659 +1.408 1.438 0.202 0.348 0.429 0.356 2.659 +1.540 1.408 0.012 0.342 0.068 0.182 2.659 +2.102 1.839 0.478 1.018 1.001 0.964 2.659 +1.744 1.301 -0.159 0.190 0.216 -0.138 2.659 +1.764 1.255 0.388 0.639 0.201 0.343 2.659 +1.432 0.964 0.119 0.152 -0.926 -0.552 2.659 +1.496 1.221 0.648 0.554 -0.101 -0.071 2.659 +1.546 1.501 0.796 0.473 -0.203 -0.658 2.659 +0.948 1.219 0.513 0.134 -0.620 -0.927 2.659 +0.258 0.955 0.067 -0.559 -1.881 -1.833 2.659 +0.262 1.085 0.331 -0.408 -1.724 -1.850 2.659 +0.264 0.691 -0.013 -0.590 -1.952 -2.469 2.659 +0.133 0.460 -0.188 -0.539 -2.228 -2.992 2.659 +0.318 0.646 -0.205 -0.501 -2.410 -3.289 2.659 +0.040 0.547 -0.141 -0.267 -1.761 -2.825 2.659 +-1.033 -0.363 -0.811 -0.902 -2.044 -3.034 2.659 +-0.994 0.168 -0.322 -0.300 -0.895 -1.840 2.659 +-0.981 0.261 -0.339 -0.320 -0.981 -1.913 2.659 +-1.015 0.123 -0.440 -0.119 -0.581 -1.136 2.659 +-1.206 0.075 -0.060 -0.176 -0.778 -1.080 2.659 +-1.534 -0.076 -0.243 0.041 -0.561 -0.548 2.659 +-1.773 -0.142 -0.556 -0.254 -0.554 -0.600 2.659 +-1.958 -0.440 -0.647 -0.361 -0.238 -0.229 2.659 +-2.394 -1.100 -1.271 -0.728 -0.490 -0.365 2.659 +-2.599 -1.378 -1.120 -0.579 -0.448 0.098 2.659 +-2.406 -0.910 -0.834 -0.267 0.462 0.907 2.659 +-2.251 -0.712 -0.581 0.077 0.784 1.653 2.659 +-2.225 -0.744 -0.533 0.379 0.914 2.035 2.659 +-2.355 -1.046 -0.497 0.367 1.265 2.686 2.659 +-2.163 -0.939 -0.178 0.569 1.678 3.393 2.659 +-2.283 -0.941 -0.192 0.502 1.918 3.434 2.659 +-2.645 -1.265 -0.438 0.724 2.160 3.701 2.659 +-2.403 -1.043 -0.382 1.221 2.645 4.082 2.659 +-2.947 -1.265 -0.359 1.589 2.984 4.881 2.659 +-3.283 -1.527 -0.328 2.455 2.985 4.846 2.659 +-3.534 -1.073 -0.288 2.277 3.480 5.280 2.659 +-3.330 -0.821 -0.224 2.245 4.143 5.935 2.659 +-3.828 -1.206 -0.190 2.070 4.091 6.052 2.659 +-3.284 -0.601 0.067 2.073 3.672 5.062 2.659 +-2.406 -0.967 0.125 2.123 3.465 4.550 2.659 +-2.006 -0.897 0.523 1.567 2.919 3.956 2.659 +-1.717 -0.371 0.703 1.251 2.440 3.527 2.659 +-1.058 -0.282 0.499 0.349 1.649 2.207 2.659 +-0.282 0.027 0.515 0.314 1.117 1.612 2.659 +0.364 0.517 0.468 0.359 0.580 0.585 2.659 +0.808 0.809 0.540 0.295 0.201 0.091 2.659 +1.140 0.702 0.274 -0.368 -0.544 -0.773 2.659 +1.665 0.816 0.378 -0.631 -0.508 -0.872 2.659 +2.398 1.410 0.977 -0.073 -0.575 -0.709 2.659 +2.196 1.035 1.152 -0.008 0.269 0.334 0.121 +2.006 1.348 1.088 0.140 0.422 0.165 0.121 +2.082 1.085 1.048 0.110 0.149 0.421 0.121 +1.341 0.555 0.540 0.179 -0.462 0.153 0.121 +1.348 1.049 1.059 0.766 0.569 1.297 0.121 +0.985 0.922 1.016 1.001 1.007 1.999 0.121 +-0.444 -0.250 0.276 0.536 1.087 2.140 0.121 +-0.346 0.230 0.912 1.381 2.086 3.716 0.121 +-1.397 -0.503 0.775 1.426 2.760 5.034 0.121 +-2.350 -0.338 0.440 1.741 3.116 5.936 0.121 +-2.912 -0.931 0.057 1.740 3.648 6.379 0.121 +-3.911 -1.775 -0.722 1.829 4.087 6.247 0.121 +-3.922 -1.678 -0.372 2.863 4.914 7.276 0.121 +-4.088 -1.828 -0.408 2.645 5.380 7.582 0.121 +-4.196 -1.804 -0.963 2.020 4.563 7.082 0.121 +-4.068 -1.607 -1.098 1.812 4.176 6.228 0.121 +-4.499 -2.238 -1.825 0.645 3.398 5.527 0.121 +-4.081 -1.796 -1.661 0.718 3.397 5.368 0.121 +-3.281 -1.054 -1.176 1.068 3.333 5.218 0.121 +-3.236 -1.081 -1.026 1.130 2.893 4.549 0.121 +-2.671 -0.751 -0.761 1.141 2.935 4.237 0.121 +-2.568 -0.613 -0.804 1.132 2.497 3.534 0.121 +-2.545 -0.982 -1.315 0.282 1.350 2.072 0.121 +-2.225 -0.995 -1.150 0.347 1.005 1.534 0.121 +-2.030 -0.680 -0.855 0.368 0.615 0.874 0.121 +-2.181 -0.682 -0.921 0.202 0.289 0.088 0.121 +-2.046 -0.617 -0.962 -0.231 -0.519 -0.747 0.121 +-1.682 -0.160 -0.260 -0.255 -0.451 -0.604 0.121 +-1.716 -0.003 -0.113 -0.581 -0.752 -1.529 0.121 +-1.897 0.024 -0.171 -0.915 -1.010 -1.774 0.121 +-1.375 0.270 -0.031 -1.111 -0.922 -2.085 0.121 +-1.443 -0.056 -0.162 -1.355 -1.424 -2.618 0.121 +-0.724 0.114 0.213 -1.240 -1.866 -3.269 0.121 +-1.433 -0.137 0.143 -1.033 -2.081 -3.506 0.121 +-0.760 0.278 0.529 -0.722 -2.266 -3.877 0.121 +-0.345 0.178 0.402 -1.100 -2.774 -4.230 0.121 +0.309 0.805 0.597 -0.869 -2.784 -4.329 0.121 +-0.324 0.499 0.044 -0.953 -2.468 -4.276 0.121 +0.303 1.047 0.668 -0.690 -1.842 -3.570 0.121 +0.058 1.049 0.485 -0.622 -2.000 -3.169 0.121 +0.930 1.377 0.885 -0.412 -1.544 -2.644 0.121 +0.797 1.378 0.718 -0.363 -0.896 -1.821 0.121 +1.111 1.367 0.715 -0.504 -0.719 -1.800 0.121 +0.672 1.087 0.227 -0.355 -0.232 -1.205 0.121 +1.636 1.652 0.317 -0.017 0.228 -1.209 0.121 +1.663 1.598 0.300 0.186 0.142 -0.568 0.121 +2.302 1.858 0.190 -0.060 -0.454 -0.840 0.121 +1.875 1.729 0.208 -0.018 -0.222 -0.445 0.121 +1.806 1.473 -0.186 -0.140 -0.299 -0.930 0.121 +1.276 1.206 -0.568 -0.399 -0.655 -1.292 0.121 +2.212 1.793 -0.034 -0.144 -0.863 -1.218 0.121 +2.422 1.962 0.353 0.461 -0.451 -0.667 0.121 +2.401 2.002 0.577 0.426 -0.885 -1.112 0.121 +1.971 1.977 0.759 0.364 -0.704 -0.928 0.121 +1.972 1.837 0.815 0.090 -1.099 -1.707 0.121 +0.735 1.250 0.364 -0.609 -2.049 -2.170 0.121 +0.700 1.224 0.231 -1.100 -2.211 -3.024 0.121 +0.241 0.918 -0.417 -1.055 -2.277 -3.124 0.121 +0.535 0.690 -0.992 -1.164 -2.846 -3.852 0.121 +0.613 1.153 -0.375 -1.077 -2.664 -3.735 0.121 +0.952 1.350 -0.392 -0.732 -2.786 -4.274 0.121 +-0.695 0.422 -0.876 -1.390 -3.044 -4.577 0.121 +-0.414 0.610 -0.358 -1.179 -2.468 -3.744 0.121 +-0.963 0.877 -0.755 -1.064 -1.952 -2.864 0.121 +-0.325 1.308 -0.102 -0.350 -1.310 -2.241 0.121 +-1.090 0.267 -0.315 -0.823 -1.058 -1.880 0.121 +-0.741 0.353 0.077 -0.184 -1.030 -1.651 0.121 +-1.204 0.791 -0.106 0.342 -0.581 -0.664 0.121 +-1.597 0.501 -0.530 -0.061 -0.981 -0.874 0.121 +-1.748 0.220 -0.564 0.183 -0.504 -0.117 0.121 +-2.219 -0.325 -0.643 -0.525 -0.269 -0.111 0.121 +-2.412 -0.412 -0.707 -0.322 0.290 0.730 0.121 +-2.118 -0.185 -0.084 0.092 0.844 1.636 0.121 +-2.327 -0.110 -0.213 0.400 1.319 2.407 0.121 +-2.009 -0.164 -0.069 0.913 1.561 3.113 0.121 +-2.598 -0.771 -0.442 0.883 1.695 3.689 0.121 +-2.621 -0.880 -0.421 1.079 1.864 4.174 0.121 +-2.870 -0.862 -0.259 1.058 2.389 4.874 0.121 +-2.616 -0.965 -0.126 1.959 3.079 5.446 0.121 +-3.152 -1.273 -0.170 2.282 3.229 5.475 0.121 +-3.435 -1.198 -0.235 2.996 3.794 6.417 0.121 +-3.492 -1.191 -0.031 2.652 3.874 6.478 0.121 +-3.848 -1.143 -0.311 2.652 4.368 6.782 0.121 +-4.158 -1.357 -0.086 3.036 4.923 7.652 0.121 +-4.412 -0.627 -0.406 2.664 5.123 7.175 0.121 +-3.858 -1.065 0.122 2.676 4.911 6.783 0.121 +-3.341 -0.835 0.314 2.373 4.770 6.258 0.121 +-2.651 -0.118 0.571 2.383 4.208 5.938 0.121 +-2.054 -0.567 0.728 1.914 3.473 5.332 0.121 +-1.650 -0.438 0.670 1.335 2.793 3.927 0.121 +-0.838 0.235 0.564 0.841 2.165 3.147 0.121 +-0.118 0.184 0.775 0.507 1.389 2.688 0.121 +0.637 0.549 0.709 0.340 0.938 1.693 0.121 +1.299 0.798 0.592 0.428 0.615 0.645 0.121 +1.842 0.977 0.660 0.395 0.614 0.444 0.121 +1.672 0.705 0.585 -0.027 -0.149 -0.233 0.121 +2.737 0.941 0.982 0.153 0.774 0.936 -1.082 +1.771 1.097 1.064 0.678 0.914 1.041 -1.082 +2.042 0.790 0.690 0.766 1.059 1.731 -1.082 +1.242 0.899 0.674 1.104 1.009 2.275 -1.082 +1.633 1.469 1.638 1.970 1.530 3.540 -1.082 +-0.866 -0.603 0.368 0.609 0.816 2.885 -1.082 +-0.841 -0.527 0.341 1.168 2.121 4.371 -1.082 +-1.634 -0.661 0.066 2.095 2.634 4.946 -1.082 +-2.620 -1.755 -0.861 1.102 3.023 6.476 -1.082 +-3.819 -1.592 -0.543 1.353 3.923 6.403 -1.082 +-3.561 -1.178 -0.231 2.442 5.340 7.839 -1.082 +-4.249 -2.067 -0.390 2.583 5.065 8.278 -1.082 +-3.675 -1.564 0.107 3.229 6.842 9.308 -1.082 +-4.963 -2.486 -1.095 2.378 5.764 8.470 -1.082 +-4.639 -1.759 -0.868 2.303 5.640 8.796 -1.082 +-4.612 -1.441 -1.115 2.438 4.990 8.450 -1.082 +-4.989 -1.776 -1.505 2.030 4.961 7.647 -1.082 +-5.410 -3.001 -2.209 0.665 3.915 6.282 -1.082 +-4.232 -1.840 -1.771 1.532 4.029 6.226 -1.082 +-3.993 -1.437 -1.913 0.964 3.987 5.424 -1.082 +-2.884 -1.213 -1.500 0.976 3.313 4.932 -1.082 +-2.772 -1.151 -1.456 0.586 2.671 3.839 -1.082 +-2.830 -1.094 -1.548 0.015 2.014 2.452 -1.082 +-1.832 -0.048 -0.717 0.785 1.906 2.497 -1.082 +-1.308 -0.026 -0.587 0.708 1.665 1.482 -1.082 +-2.481 -0.618 -1.251 -0.669 0.355 -0.061 -1.082 +-2.307 -0.627 -0.846 -1.224 -0.303 -0.774 -1.082 +-1.234 0.127 0.443 -0.325 -0.378 -0.811 -1.082 +-0.783 0.691 0.280 -0.540 -0.276 -1.277 -1.082 +-0.550 0.884 0.433 -0.485 -0.179 -1.794 -1.082 +-0.388 1.021 0.767 -0.915 -0.811 -2.627 -1.082 +-1.322 0.074 -0.158 -1.604 -2.029 -3.750 -1.082 +-0.709 0.510 0.583 -1.420 -2.455 -4.338 -1.082 +-0.784 0.346 0.438 -1.364 -1.970 -4.816 -1.082 +0.561 1.408 1.141 -0.671 -2.118 -4.470 -1.082 +0.487 1.175 0.866 -1.035 -2.540 -5.212 -1.082 +1.538 1.358 1.419 -0.292 -2.488 -4.417 -1.082 +1.293 1.106 0.715 -0.960 -2.662 -4.683 -1.082 +1.158 1.635 0.694 -0.855 -2.381 -4.344 -1.082 +1.330 1.728 0.874 -0.547 -1.913 -3.749 -1.082 +0.926 1.925 0.410 -1.084 -1.946 -4.076 -1.082 +1.243 2.350 0.368 -0.912 -1.504 -3.370 -1.082 +1.863 2.856 0.534 -0.601 -1.023 -3.174 -1.082 +1.991 2.441 0.646 -0.329 0.072 -2.262 -1.082 +2.593 2.256 0.555 -0.383 -0.685 -2.107 -1.082 +2.386 2.064 0.127 -0.385 -0.674 -1.782 -1.082 +2.982 3.035 0.712 0.120 -0.713 -1.490 -1.082 +3.301 3.076 0.453 0.457 -0.555 -0.939 -1.082 +3.489 3.191 0.697 0.526 0.218 -1.314 -1.082 +2.379 2.046 0.028 -0.107 -1.634 -1.923 -1.082 +2.860 2.839 0.394 0.219 -1.659 -1.765 -1.082 +2.462 2.425 0.206 0.278 -1.983 -1.252 -1.082 +3.149 2.918 0.920 0.088 -1.512 -2.298 -1.082 +1.994 2.194 0.264 -0.606 -1.895 -2.726 -1.082 +2.402 2.479 0.801 -0.369 -1.388 -2.619 -1.082 +0.104 0.060 -1.286 -2.628 -3.779 -4.994 -1.082 +1.348 2.085 0.190 -0.832 -1.842 -3.847 -1.082 +0.899 0.895 0.292 -1.855 -1.893 -4.884 -1.082 +1.315 1.777 -0.167 -1.407 -3.228 -4.404 -1.082 +1.362 1.814 0.358 -0.253 -2.542 -4.143 -1.082 +1.236 2.534 -0.525 -1.284 -3.158 -4.804 -1.082 +0.089 1.451 -0.159 -1.929 -3.539 -5.335 -1.082 +-0.616 1.394 -0.172 -1.926 -3.890 -5.062 -1.082 +-0.642 0.969 -0.338 -1.302 -2.956 -3.993 -1.082 +-0.346 0.623 -0.717 -1.384 -2.792 -3.781 -1.082 +-1.079 0.319 -0.649 -1.312 -1.987 -3.265 -1.082 +-1.872 0.605 -1.531 -1.196 -2.591 -3.218 -1.082 +-2.107 0.985 -2.140 -0.765 -1.552 -1.956 -1.082 +-2.101 0.650 -1.891 -0.371 -1.157 -1.697 -1.082 +-2.367 -0.419 -1.191 -0.366 -1.261 -0.553 -1.082 +-1.808 -0.048 -0.358 -0.162 -0.533 0.093 -1.082 +-2.749 -0.467 -1.002 -0.041 -0.271 0.223 -1.082 +-2.397 -0.196 -0.190 0.563 0.568 1.292 -1.082 +-2.622 -0.735 -0.555 0.429 1.046 2.273 -1.082 +-1.537 -0.132 0.169 1.381 1.653 2.877 -1.082 +-2.326 0.217 0.112 1.733 2.433 4.882 -1.082 +-1.715 -0.187 -0.055 2.139 3.253 5.786 -1.082 +-2.227 -0.452 -0.016 2.493 3.685 6.824 -1.082 +-3.177 -1.225 -0.326 1.898 3.268 6.818 -1.082 +-3.451 -1.129 -0.229 2.501 3.627 7.253 -1.082 +-3.698 -1.598 0.083 3.312 5.098 7.135 -1.082 +-3.579 -1.309 -0.088 3.129 5.237 7.728 -1.082 +-4.192 -1.264 -0.075 3.170 5.555 8.893 -1.082 +-5.403 -1.829 0.275 3.035 6.118 9.039 -1.082 +-4.286 -0.796 0.410 3.925 6.859 9.316 -1.082 +-4.004 -1.216 0.038 3.450 7.123 8.662 -1.082 +-4.665 -0.698 -0.359 2.336 4.614 7.733 -1.082 +-3.532 -0.388 0.707 2.612 5.288 7.383 -1.082 +-2.011 0.879 1.362 2.647 5.841 7.104 -1.082 +-2.139 0.657 0.576 1.753 2.927 5.422 -1.082 +-1.070 1.332 1.167 2.221 2.954 4.444 -1.082 +-0.932 -0.580 -0.107 0.504 1.466 3.585 -1.082 +0.963 1.293 1.220 1.124 2.229 3.413 -1.082 +0.631 0.437 0.472 0.147 1.314 1.802 -1.082 +0.758 0.164 -0.040 -0.176 0.557 0.020 -1.082 +1.078 -0.159 0.242 -0.477 0.517 -0.011 -1.082 +-0.374 -0.030 -0.742 -0.116 -0.323 -0.164 9.410 +-0.934 -0.491 -0.305 0.323 0.152 0.641 9.410 +-1.192 -0.513 0.324 0.295 0.465 0.284 9.410 +-0.799 -0.539 0.135 0.330 0.684 0.846 9.410 +-0.418 -0.326 -0.062 0.155 0.205 0.152 9.410 +-1.161 -0.923 -0.369 -0.259 0.173 -0.118 9.410 +-1.444 -1.099 -0.755 -0.450 0.225 0.085 9.410 +-0.784 -0.856 -0.104 -0.160 0.800 -0.341 9.410 +-2.836 -1.356 -0.563 1.833 3.066 5.231 6.741 +-0.290 -0.163 0.272 -0.667 -1.325 -2.682 6.741 +0.018 0.161 -0.085 -1.013 -2.335 -3.111 6.741 +-2.885 -1.460 -0.143 1.826 3.528 4.531 6.741 diff --git a/Noto/Configuration/CDB/alma/AS/set_calibrate.py b/Noto/Configuration/CDB/alma/AS/set_calibrate.py new file mode 100755 index 000000000..1bcddca13 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/set_calibrate.py @@ -0,0 +1,24 @@ +import os, fnmatch + +path = os.path.dirname(os.path.abspath(__file__)) + +result = [] +for root, dirs, files in os.walk(path): + for name in files: + if fnmatch.fnmatch(name, 'USD*.xml'): + result.append(os.path.join(root, name)) + +counter = 0 + +for filename in result: + counter += 1 + os.rename(filename, filename + '.bak') + original = open(filename + '.bak', 'r') + new = open(filename, 'w') + for fileline in original: + new.write(fileline.replace('calibrate="0"', 'calibrate="1"')) + original.close() + os.remove(filename + '.bak') + new.close() + +print(str(counter) + " files edited.") diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt new file mode 100644 index 000000000..e6a99e17c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt @@ -0,0 +1,244 @@ +1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +2 2 2 AS/SECTOR01/LAN02/USD02 "2,2" 0202 +2 3 2 AS/SECTOR01/LAN02/USD03 "3,2" 0302 +2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 +2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 +2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 +3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 +3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 +3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 +3 5 3 AS/SECTOR01/LAN03/USD05 "5,3" 0503 +3 6 3 AS/SECTOR01/LAN03/USD06 "6,3" 0603 +4 2 4 AS/SECTOR01/LAN04/USD02 "2,4" 0204 +4 3 4 AS/SECTOR01/LAN04/USD03 "3,4" 0304 +4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 +4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 +4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 +5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 +5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 +5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 +5 5 5 AS/SECTOR01/LAN05/USD05 "5,5" 0505 +5 6 5 AS/SECTOR01/LAN05/USD06 "6,5" 0605 +6 2 6 AS/SECTOR01/LAN06/USD02 "2,6" 0206 +6 3 6 AS/SECTOR01/LAN06/USD03 "3,6" 0306 +6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 +6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 +6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 +7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 +7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 +7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 +7 5 7 AS/SECTOR01/LAN07/USD05 "5,7" 0507 +7 6 7 AS/SECTOR01/LAN07/USD06 "6,7" 0607 +7 7 7 AS/SECTOR01/LAN07/USD07 "7,1" 0701 +8 2 8 AS/SECTOR01/LAN08/USD02 "2,8" 0208 +8 3 8 AS/SECTOR01/LAN08/USD03 "3,8" 0308 +8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 +8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 +8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 +9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 +9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 +9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 +9 5 9 AS/SECTOR01/LAN09/USD05 "5,9" 0509 +9 6 9 AS/SECTOR01/LAN09/USD06 "6,9" 0609 +10 2 10 AS/SECTOR01/LAN10/USD02 "2,10" 0210 +10 3 10 AS/SECTOR01/LAN10/USD03 "3,10" 0310 +10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 +10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 +10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 +11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 +11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 +11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 +11 5 11 AS/SECTOR01/LAN11/USD05 "5,11" 0511 +11 6 11 AS/SECTOR01/LAN11/USD06 "6,11" 0611 +12 2 12 AS/SECTOR01/LAN12/USD02 "2,12" 0212 +12 3 12 AS/SECTOR01/LAN12/USD03 "3,12" 0312 +12 4 12 AS/SECTOR01/LAN12/USD04 "4,12" 0412 +12 5 12 AS/SECTOR01/LAN12/USD05 "5,12" 0512 +12 6 12 AS/SECTOR01/LAN12/USD06 "6,12" 0612 +13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 +13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 +13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 +13 5 13 AS/SECTOR02/LAN01/USD05 "5,13" 0513 +13 6 13 AS/SECTOR02/LAN01/USD06 "6,13" 0613 +14 2 14 AS/SECTOR02/LAN02/USD02 "2,14" 0214 +14 3 14 AS/SECTOR02/LAN02/USD03 "3,14" 0314 +14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 +14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 +14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 +15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 +15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 +15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 +15 5 15 AS/SECTOR02/LAN03/USD05 "5,15" 0515 +15 6 15 AS/SECTOR02/LAN03/USD06 "6,15" 0615 +16 2 16 AS/SECTOR02/LAN04/USD02 "2,16" 0216 +16 3 16 AS/SECTOR02/LAN04/USD03 "3,16" 0316 +16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 +16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 +16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 +17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 +17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 +17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 +17 5 17 AS/SECTOR02/LAN05/USD05 "5,17" 0517 +17 6 17 AS/SECTOR02/LAN05/USD06 "6,17" 0617 +18 2 18 AS/SECTOR02/LAN06/USD02 "2,18" 0218 +18 3 18 AS/SECTOR02/LAN06/USD03 "3,18" 0318 +18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 +18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 +18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 +19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 +19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 +19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 +19 5 19 AS/SECTOR02/LAN07/USD05 "5,19" 0519 +19 6 19 AS/SECTOR02/LAN07/USD06 "6,19" 0619 +19 7 19 AS/SECTOR02/LAN07/USD07 "7,2" 0702 +20 2 20 AS/SECTOR02/LAN08/USD02 "2,20" 0220 +20 3 20 AS/SECTOR02/LAN08/USD03 "3,20" 0320 +20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 +20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 +20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 +21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 +21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 +21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 +21 5 21 AS/SECTOR02/LAN09/USD05 "5,21" 0521 +21 6 21 AS/SECTOR02/LAN09/USD06 "6,21" 0621 +22 2 22 AS/SECTOR02/LAN10/USD02 "2,22" 0222 +22 3 22 AS/SECTOR02/LAN10/USD03 "3,22" 0322 +22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 +22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 +22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 +23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 +23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 +23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 +23 5 23 AS/SECTOR02/LAN11/USD05 "5,23" 0523 +23 6 23 AS/SECTOR02/LAN11/USD06 "6,23" 0623 +24 2 24 AS/SECTOR02/LAN12/USD02 "2,24" 0224 +24 3 24 AS/SECTOR02/LAN12/USD03 "3,24" 0324 +24 4 24 AS/SECTOR02/LAN12/USD04 "4,24" 0424 +24 5 24 AS/SECTOR02/LAN12/USD05 "5,24" 0524 +24 6 24 AS/SECTOR02/LAN12/USD06 "6,24" 0624 +25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 +25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 +25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 +25 5 25 AS/SECTOR03/LAN01/USD05 "5,25" 0525 +25 6 25 AS/SECTOR03/LAN01/USD06 "6,25" 0625 +26 2 26 AS/SECTOR03/LAN02/USD02 "2,26" 0226 +26 3 26 AS/SECTOR03/LAN02/USD03 "3,26" 0326 +26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 +26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 +26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 +27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 +27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 +27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 +27 5 27 AS/SECTOR03/LAN03/USD05 "5,27" 0527 +27 6 27 AS/SECTOR03/LAN03/USD06 "6,27" 0627 +28 2 28 AS/SECTOR03/LAN04/USD02 "2,28" 0228 +28 3 28 AS/SECTOR03/LAN04/USD03 "3,28" 0328 +28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 +28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 +28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 +29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 +29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 +29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 +29 5 29 AS/SECTOR03/LAN05/USD05 "5,29" 0529 +29 6 29 AS/SECTOR03/LAN05/USD06 "6,29" 0629 +30 2 30 AS/SECTOR03/LAN06/USD02 "2,30" 0230 +30 3 30 AS/SECTOR03/LAN06/USD03 "3,30" 0330 +30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 +30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 +30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 +31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 +31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 +31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 +31 5 31 AS/SECTOR03/LAN07/USD05 "5,31" 0531 +31 6 31 AS/SECTOR03/LAN07/USD06 "6,31" 0631 +31 7 31 AS/SECTOR03/LAN07/USD07 "7,3" 0703 +32 2 32 AS/SECTOR03/LAN08/USD02 "2,32" 0232 +32 3 32 AS/SECTOR03/LAN08/USD03 "3,32" 0332 +32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 +32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 +32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 +33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 +33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 +33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 +33 5 33 AS/SECTOR03/LAN09/USD05 "5,33" 0533 +33 6 33 AS/SECTOR03/LAN09/USD06 "6,33" 0633 +34 2 34 AS/SECTOR03/LAN10/USD02 "2,34" 0234 +34 3 34 AS/SECTOR03/LAN10/USD03 "3,34" 0334 +34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 +34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 +34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 +35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 +35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 +35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 +35 5 35 AS/SECTOR03/LAN11/USD05 "5,35" 0535 +35 6 35 AS/SECTOR03/LAN11/USD06 "6,35" 0635 +36 2 36 AS/SECTOR03/LAN12/USD02 "2,36" 0236 +36 3 36 AS/SECTOR03/LAN12/USD03 "3,36" 0336 +36 4 36 AS/SECTOR03/LAN12/USD04 "4,36" 0436 +36 5 36 AS/SECTOR03/LAN12/USD05 "5,36" 0536 +36 6 36 AS/SECTOR03/LAN12/USD06 "6,36" 0636 +37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 +37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 +37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 +37 5 37 AS/SECTOR04/LAN01/USD05 "5,37" 0537 +37 6 37 AS/SECTOR04/LAN01/USD06 "6,37" 0637 +38 2 38 AS/SECTOR04/LAN02/USD02 "2,38" 0238 +38 3 38 AS/SECTOR04/LAN02/USD03 "3,38" 0338 +38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 +38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 +38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 +39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 +39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 +39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 +39 5 39 AS/SECTOR04/LAN03/USD05 "5,39" 0539 +39 6 39 AS/SECTOR04/LAN03/USD06 "6,39" 0639 +40 2 40 AS/SECTOR04/LAN04/USD02 "2,40" 0240 +40 3 40 AS/SECTOR04/LAN04/USD03 "3,40" 0340 +40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 +40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 +40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 +41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 +41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 +41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 +41 5 41 AS/SECTOR04/LAN05/USD05 "5,41" 0541 +41 6 41 AS/SECTOR04/LAN05/USD06 "6,41" 0641 +42 2 42 AS/SECTOR04/LAN06/USD02 "2,42" 0242 +42 3 42 AS/SECTOR04/LAN06/USD03 "3,42" 0342 +42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 +42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 +42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 +43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 +43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 +43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 +43 5 43 AS/SECTOR04/LAN07/USD05 "5,43" 0543 +43 6 43 AS/SECTOR04/LAN07/USD06 "6,43" 0643 +43 7 43 AS/SECTOR04/LAN07/USD07 "7,4" 0704 +44 2 44 AS/SECTOR04/LAN08/USD02 "2,44" 0244 +44 3 44 AS/SECTOR04/LAN08/USD03 "3,44" 0344 +44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 +44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 +44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 +45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 +45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 +45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 +45 5 45 AS/SECTOR04/LAN09/USD05 "5,45" 0545 +45 6 45 AS/SECTOR04/LAN09/USD06 "6,45" 0645 +46 2 46 AS/SECTOR04/LAN10/USD02 "2,46" 0246 +46 3 46 AS/SECTOR04/LAN10/USD03 "3,46" 0346 +46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 +46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 +46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 +47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 +47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 +47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 +47 5 47 AS/SECTOR04/LAN11/USD05 "5,47" 0547 +47 6 47 AS/SECTOR04/LAN11/USD06 "6,47" 0647 +48 2 48 AS/SECTOR04/LAN12/USD02 "2,48" 0248 +48 3 48 AS/SECTOR04/LAN12/USD03 "3,48" 0348 +48 4 48 AS/SECTOR04/LAN12/USD04 "4,48" 0448 +48 5 48 AS/SECTOR04/LAN12/USD05 "5,48" 0548 +48 6 48 AS/SECTOR04/LAN12/USD06 "6,48" 0648 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Circles b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Circles new file mode 100644 index 000000000..b8d2999fc --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Circles @@ -0,0 +1,1116 @@ +3 1 1 AS/SECTOR01/LAN03/USD01 "1,1" 0101 +7 1 2 AS/SECTOR01/LAN07/USD01 "1,2" 0102 +11 1 3 AS/SECTOR01/LAN11/USD01 "1,3" 0103 +15 1 4 AS/SECTOR02/LAN03/USD01 "1,4" 0104 +19 1 5 AS/SECTOR02/LAN07/USD01 "1,5" 0105 +23 1 6 AS/SECTOR02/LAN11/USD01 "1,6" 0106 +27 1 7 AS/SECTOR03/LAN03/USD01 "1,7" 0107 +31 1 8 AS/SECTOR03/LAN07/USD01 "1,8" 0108 +35 1 9 AS/SECTOR03/LAN11/USD01 "1,9" 0109 +39 1 10 AS/SECTOR04/LAN03/USD01 "1,10" 0110 +43 1 11 AS/SECTOR04/LAN07/USD01 "1,11" 0111 +47 1 12 AS/SECTOR04/LAN11/USD01 "1,12" 0112 +51 1 13 AS/SECTOR05/LAN03/USD01 "1,13" 0113 +55 1 14 AS/SECTOR05/LAN07/USD01 "1,14" 0114 +59 1 15 AS/SECTOR05/LAN11/USD01 "1,15" 0115 +63 1 16 AS/SECTOR06/LAN03/USD01 "1,16" 0116 +67 1 17 AS/SECTOR06/LAN07/USD01 "1,17" 0117 +71 1 18 AS/SECTOR06/LAN11/USD01 "1,18" 0118 +75 1 19 AS/SECTOR07/LAN03/USD01 "1,19" 0119 +79 1 20 AS/SECTOR07/LAN07/USD01 "1,20" 0120 +83 1 21 AS/SECTOR07/LAN11/USD01 "1,21" 0121 +87 1 22 AS/SECTOR08/LAN03/USD01 "1,22" 0122 +91 1 23 AS/SECTOR08/LAN07/USD01 "1,23" 0123 +95 1 24 AS/SECTOR08/LAN11/USD01 "1,24" 0124 +3 2 1 AS/SECTOR01/LAN03/USD02 "2,1" 0201 +7 2 2 AS/SECTOR01/LAN07/USD02 "2,2" 0202 +11 2 3 AS/SECTOR01/LAN11/USD02 "2,3" 0203 +15 2 4 AS/SECTOR02/LAN03/USD02 "2,4" 0204 +19 2 5 AS/SECTOR02/LAN07/USD02 "2,5" 0205 +23 2 6 AS/SECTOR02/LAN11/USD02 "2,6" 0206 +27 2 7 AS/SECTOR03/LAN03/USD02 "2,7" 0207 +31 2 8 AS/SECTOR03/LAN07/USD02 "2,8" 0208 +35 2 9 AS/SECTOR03/LAN11/USD02 "2,9" 0209 +39 2 10 AS/SECTOR04/LAN03/USD02 "2,10" 0210 +43 2 11 AS/SECTOR04/LAN07/USD02 "2,11" 0211 +47 2 12 AS/SECTOR04/LAN11/USD02 "2,12" 0212 +51 2 13 AS/SECTOR05/LAN03/USD02 "2,13" 0213 +55 2 14 AS/SECTOR05/LAN07/USD02 "2,14" 0214 +59 2 15 AS/SECTOR05/LAN11/USD02 "2,15" 0215 +63 2 16 AS/SECTOR06/LAN03/USD02 "2,16" 0216 +67 2 17 AS/SECTOR06/LAN07/USD02 "2,17" 0217 +71 2 18 AS/SECTOR06/LAN11/USD02 "2,18" 0218 +75 2 19 AS/SECTOR07/LAN03/USD02 "2,19" 0219 +79 2 20 AS/SECTOR07/LAN07/USD02 "2,20" 0220 +83 2 21 AS/SECTOR07/LAN11/USD02 "2,21" 0221 +87 2 22 AS/SECTOR08/LAN03/USD02 "2,22" 0222 +91 2 23 AS/SECTOR08/LAN07/USD02 "2,23" 0223 +95 2 24 AS/SECTOR08/LAN11/USD02 "2,24" 0224 +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +3 3 2 AS/SECTOR01/LAN03/USD03 "3,2" 0302 +5 3 3 AS/SECTOR01/LAN05/USD03 "3,3" 0303 +7 3 4 AS/SECTOR01/LAN07/USD03 "3,4" 0304 +9 3 5 AS/SECTOR01/LAN09/USD03 "3,5" 0305 +11 3 6 AS/SECTOR01/LAN11/USD03 "3,6" 0306 +13 3 7 AS/SECTOR02/LAN01/USD03 "3,7" 0307 +15 3 8 AS/SECTOR02/LAN03/USD03 "3,8" 0308 +17 3 9 AS/SECTOR02/LAN05/USD03 "3,9" 0309 +19 3 10 AS/SECTOR02/LAN07/USD03 "3,10" 0310 +21 3 11 AS/SECTOR02/LAN09/USD03 "3,11" 0311 +23 3 12 AS/SECTOR02/LAN11/USD03 "3,12" 0312 +25 3 13 AS/SECTOR03/LAN01/USD03 "3,13" 0313 +27 3 14 AS/SECTOR03/LAN03/USD03 "3,14" 0314 +29 3 15 AS/SECTOR03/LAN05/USD03 "3,15" 0315 +31 3 16 AS/SECTOR03/LAN07/USD03 "3,16" 0316 +33 3 17 AS/SECTOR03/LAN09/USD03 "3,17" 0317 +35 3 18 AS/SECTOR03/LAN11/USD03 "3,18" 0318 +37 3 19 AS/SECTOR04/LAN01/USD03 "3,19" 0319 +39 3 20 AS/SECTOR04/LAN03/USD03 "3,20" 0320 +41 3 21 AS/SECTOR04/LAN05/USD03 "3,21" 0321 +43 3 22 AS/SECTOR04/LAN07/USD03 "3,22" 0322 +45 3 23 AS/SECTOR04/LAN09/USD03 "3,23" 0323 +47 3 24 AS/SECTOR04/LAN11/USD03 "3,24" 0324 +49 3 25 AS/SECTOR05/LAN01/USD03 "3,25" 0325 +51 3 26 AS/SECTOR05/LAN03/USD03 "3,26" 0326 +53 3 27 AS/SECTOR05/LAN05/USD03 "3,27" 0327 +55 3 28 AS/SECTOR05/LAN07/USD03 "3,28" 0328 +57 3 29 AS/SECTOR05/LAN09/USD03 "3,29" 0329 +59 3 30 AS/SECTOR05/LAN11/USD03 "3,30" 0330 +61 3 31 AS/SECTOR06/LAN01/USD03 "3,31" 0331 +63 3 32 AS/SECTOR06/LAN03/USD03 "3,32" 0332 +65 3 33 AS/SECTOR06/LAN05/USD03 "3,33" 0333 +67 3 34 AS/SECTOR06/LAN07/USD03 "3,34" 0334 +69 3 35 AS/SECTOR06/LAN09/USD03 "3,35" 0335 +71 3 36 AS/SECTOR06/LAN11/USD03 "3,36" 0336 +73 3 37 AS/SECTOR07/LAN01/USD03 "3,37" 0337 +75 3 38 AS/SECTOR07/LAN03/USD03 "3,38" 0338 +77 3 39 AS/SECTOR07/LAN05/USD03 "3,39" 0339 +79 3 40 AS/SECTOR07/LAN07/USD03 "3,40" 0340 +81 3 41 AS/SECTOR07/LAN09/USD03 "3,41" 0341 +83 3 42 AS/SECTOR07/LAN11/USD03 "3,42" 0342 +85 3 43 AS/SECTOR08/LAN01/USD03 "3,43" 0343 +87 3 44 AS/SECTOR08/LAN03/USD03 "3,44" 0344 +89 3 45 AS/SECTOR08/LAN05/USD03 "3,45" 0345 +91 3 46 AS/SECTOR08/LAN07/USD03 "3,46" 0346 +93 3 47 AS/SECTOR08/LAN09/USD03 "3,47" 0347 +95 3 48 AS/SECTOR08/LAN11/USD03 "3,48" 0348 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +3 4 2 AS/SECTOR01/LAN03/USD04 "4,2" 0402 +5 4 3 AS/SECTOR01/LAN05/USD04 "4,3" 0403 +7 4 4 AS/SECTOR01/LAN07/USD04 "4,4" 0404 +9 4 5 AS/SECTOR01/LAN09/USD04 "4,5" 0405 +11 4 6 AS/SECTOR01/LAN11/USD04 "4,6" 0406 +13 4 7 AS/SECTOR02/LAN01/USD04 "4,7" 0407 +15 4 8 AS/SECTOR02/LAN03/USD04 "4,8" 0408 +17 4 9 AS/SECTOR02/LAN05/USD04 "4,9" 0409 +19 4 10 AS/SECTOR02/LAN07/USD04 "4,10" 0410 +21 4 11 AS/SECTOR02/LAN09/USD04 "4,11" 0411 +23 4 12 AS/SECTOR02/LAN11/USD04 "4,12" 0412 +25 4 13 AS/SECTOR03/LAN01/USD04 "4,13" 0413 +27 4 14 AS/SECTOR03/LAN03/USD04 "4,14" 0414 +29 4 15 AS/SECTOR03/LAN05/USD04 "4,15" 0415 +31 4 16 AS/SECTOR03/LAN07/USD04 "4,16" 0416 +33 4 17 AS/SECTOR03/LAN09/USD04 "4,17" 0417 +35 4 18 AS/SECTOR03/LAN11/USD04 "4,18" 0418 +37 4 19 AS/SECTOR04/LAN01/USD04 "4,19" 0419 +39 4 20 AS/SECTOR04/LAN03/USD04 "4,20" 0420 +41 4 21 AS/SECTOR04/LAN05/USD04 "4,21" 0421 +43 4 22 AS/SECTOR04/LAN07/USD04 "4,22" 0422 +45 4 23 AS/SECTOR04/LAN09/USD04 "4,23" 0423 +47 4 24 AS/SECTOR04/LAN11/USD04 "4,24" 0424 +49 4 25 AS/SECTOR05/LAN01/USD04 "4,25" 0425 +51 4 26 AS/SECTOR05/LAN03/USD04 "4,26" 0426 +53 4 27 AS/SECTOR05/LAN05/USD04 "4,27" 0427 +55 4 28 AS/SECTOR05/LAN07/USD04 "4,28" 0428 +57 4 29 AS/SECTOR05/LAN09/USD04 "4,29" 0429 +59 4 30 AS/SECTOR05/LAN11/USD04 "4,30" 0430 +61 4 31 AS/SECTOR06/LAN01/USD04 "4,31" 0431 +63 4 32 AS/SECTOR06/LAN03/USD04 "4,32" 0432 +65 4 33 AS/SECTOR06/LAN05/USD04 "4,33" 0433 +67 4 34 AS/SECTOR06/LAN07/USD04 "4,34" 0434 +69 4 35 AS/SECTOR06/LAN09/USD04 "4,35" 0435 +71 4 36 AS/SECTOR06/LAN11/USD04 "4,36" 0436 +73 4 37 AS/SECTOR07/LAN01/USD04 "4,37" 0437 +75 4 38 AS/SECTOR07/LAN03/USD04 "4,38" 0438 +77 4 39 AS/SECTOR07/LAN05/USD04 "4,39" 0439 +79 4 40 AS/SECTOR07/LAN07/USD04 "4,40" 0440 +81 4 41 AS/SECTOR07/LAN09/USD04 "4,41" 0441 +83 4 42 AS/SECTOR07/LAN11/USD04 "4,42" 0442 +85 4 43 AS/SECTOR08/LAN01/USD04 "4,43" 0443 +87 4 44 AS/SECTOR08/LAN03/USD04 "4,44" 0444 +89 4 45 AS/SECTOR08/LAN05/USD04 "4,45" 0445 +91 4 46 AS/SECTOR08/LAN07/USD04 "4,46" 0446 +93 4 47 AS/SECTOR08/LAN09/USD04 "4,47" 0447 +95 4 48 AS/SECTOR08/LAN11/USD04 "4,48" 0448 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +3 5 2 AS/SECTOR01/LAN03/USD05 "5,2" 0502 +5 5 3 AS/SECTOR01/LAN05/USD05 "5,3" 0503 +7 5 4 AS/SECTOR01/LAN07/USD05 "5,4" 0504 +9 5 5 AS/SECTOR01/LAN09/USD05 "5,5" 0505 +11 5 6 AS/SECTOR01/LAN11/USD05 "5,6" 0506 +13 5 7 AS/SECTOR02/LAN01/USD05 "5,7" 0507 +15 5 8 AS/SECTOR02/LAN03/USD05 "5,8" 0508 +17 5 9 AS/SECTOR02/LAN05/USD05 "5,9" 0509 +19 5 10 AS/SECTOR02/LAN07/USD05 "5,10" 0510 +21 5 11 AS/SECTOR02/LAN09/USD05 "5,11" 0511 +23 5 12 AS/SECTOR02/LAN11/USD05 "5,12" 0512 +25 5 13 AS/SECTOR03/LAN01/USD05 "5,13" 0513 +27 5 14 AS/SECTOR03/LAN03/USD05 "5,14" 0514 +29 5 15 AS/SECTOR03/LAN05/USD05 "5,15" 0515 +31 5 16 AS/SECTOR03/LAN07/USD05 "5,16" 0516 +33 5 17 AS/SECTOR03/LAN09/USD05 "5,17" 0517 +35 5 18 AS/SECTOR03/LAN11/USD05 "5,18" 0518 +37 5 19 AS/SECTOR04/LAN01/USD05 "5,19" 0519 +39 5 20 AS/SECTOR04/LAN03/USD05 "5,20" 0520 +41 5 21 AS/SECTOR04/LAN05/USD05 "5,21" 0521 +43 5 22 AS/SECTOR04/LAN07/USD05 "5,22" 0522 +45 5 23 AS/SECTOR04/LAN09/USD05 "5,23" 0523 +47 5 24 AS/SECTOR04/LAN11/USD05 "5,24" 0524 +49 5 25 AS/SECTOR05/LAN01/USD05 "5,25" 0525 +51 5 26 AS/SECTOR05/LAN03/USD05 "5,26" 0526 +53 5 27 AS/SECTOR05/LAN05/USD05 "5,27" 0527 +55 5 28 AS/SECTOR05/LAN07/USD05 "5,28" 0528 +57 5 29 AS/SECTOR05/LAN09/USD05 "5,29" 0529 +59 5 30 AS/SECTOR05/LAN11/USD05 "5,30" 0530 +61 5 31 AS/SECTOR06/LAN01/USD05 "5,31" 0531 +63 5 32 AS/SECTOR06/LAN03/USD05 "5,32" 0532 +65 5 33 AS/SECTOR06/LAN05/USD05 "5,33" 0533 +67 5 34 AS/SECTOR06/LAN07/USD05 "5,34" 0534 +69 5 35 AS/SECTOR06/LAN09/USD05 "5,35" 0535 +71 5 36 AS/SECTOR06/LAN11/USD05 "5,36" 0536 +73 5 37 AS/SECTOR07/LAN01/USD05 "5,37" 0537 +75 5 38 AS/SECTOR07/LAN03/USD05 "5,38" 0538 +77 5 39 AS/SECTOR07/LAN05/USD05 "5,39" 0539 +79 5 40 AS/SECTOR07/LAN07/USD05 "5,40" 0540 +81 5 41 AS/SECTOR07/LAN09/USD05 "5,41" 0541 +83 5 42 AS/SECTOR07/LAN11/USD05 "5,42" 0542 +85 5 43 AS/SECTOR08/LAN01/USD05 "5,43" 0543 +87 5 44 AS/SECTOR08/LAN03/USD05 "5,44" 0544 +89 5 45 AS/SECTOR08/LAN05/USD05 "5,45" 0545 +91 5 46 AS/SECTOR08/LAN07/USD05 "5,46" 0546 +93 5 47 AS/SECTOR08/LAN09/USD05 "5,47" 0547 +95 5 48 AS/SECTOR08/LAN11/USD05 "5,48" 0548 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +3 6 2 AS/SECTOR01/LAN03/USD06 "6,2" 0602 +5 6 3 AS/SECTOR01/LAN05/USD06 "6,3" 0603 +7 6 4 AS/SECTOR01/LAN07/USD06 "6,4" 0604 +9 6 5 AS/SECTOR01/LAN09/USD06 "6,5" 0605 +11 6 6 AS/SECTOR01/LAN11/USD06 "6,6" 0606 +13 6 7 AS/SECTOR02/LAN01/USD06 "6,7" 0607 +15 6 8 AS/SECTOR02/LAN03/USD06 "6,8" 0608 +17 6 9 AS/SECTOR02/LAN05/USD06 "6,9" 0609 +19 6 10 AS/SECTOR02/LAN07/USD06 "6,10" 0610 +21 6 11 AS/SECTOR02/LAN09/USD06 "6,11" 0611 +23 6 12 AS/SECTOR02/LAN11/USD06 "6,12" 0612 +25 6 13 AS/SECTOR03/LAN01/USD06 "6,13" 0613 +27 6 14 AS/SECTOR03/LAN03/USD06 "6,14" 0614 +29 6 15 AS/SECTOR03/LAN05/USD06 "6,15" 0615 +31 6 16 AS/SECTOR03/LAN07/USD06 "6,16" 0616 +33 6 17 AS/SECTOR03/LAN09/USD06 "6,17" 0617 +35 6 18 AS/SECTOR03/LAN11/USD06 "6,18" 0618 +37 6 19 AS/SECTOR04/LAN01/USD06 "6,19" 0619 +39 6 20 AS/SECTOR04/LAN03/USD06 "6,20" 0620 +41 6 21 AS/SECTOR04/LAN05/USD06 "6,21" 0621 +43 6 22 AS/SECTOR04/LAN07/USD06 "6,22" 0622 +45 6 23 AS/SECTOR04/LAN09/USD06 "6,23" 0623 +47 6 24 AS/SECTOR04/LAN11/USD06 "6,24" 0624 +49 6 25 AS/SECTOR05/LAN01/USD06 "6,25" 0625 +51 6 26 AS/SECTOR05/LAN03/USD06 "6,26" 0626 +53 6 27 AS/SECTOR05/LAN05/USD06 "6,27" 0627 +55 6 28 AS/SECTOR05/LAN07/USD06 "6,28" 0628 +57 6 29 AS/SECTOR05/LAN09/USD06 "6,29" 0629 +59 6 30 AS/SECTOR05/LAN11/USD06 "6,30" 0630 +61 6 31 AS/SECTOR06/LAN01/USD06 "6,31" 0631 +63 6 32 AS/SECTOR06/LAN03/USD06 "6,32" 0632 +65 6 33 AS/SECTOR06/LAN05/USD06 "6,33" 0633 +67 6 34 AS/SECTOR06/LAN07/USD06 "6,34" 0634 +69 6 35 AS/SECTOR06/LAN09/USD06 "6,35" 0635 +71 6 36 AS/SECTOR06/LAN11/USD06 "6,36" 0636 +73 6 37 AS/SECTOR07/LAN01/USD06 "6,37" 0637 +75 6 38 AS/SECTOR07/LAN03/USD06 "6,38" 0638 +77 6 39 AS/SECTOR07/LAN05/USD06 "6,39" 0639 +79 6 40 AS/SECTOR07/LAN07/USD06 "6,40" 0640 +81 6 41 AS/SECTOR07/LAN09/USD06 "6,41" 0641 +83 6 42 AS/SECTOR07/LAN11/USD06 "6,42" 0642 +85 6 43 AS/SECTOR08/LAN01/USD06 "6,43" 0643 +87 6 44 AS/SECTOR08/LAN03/USD06 "6,44" 0644 +89 6 45 AS/SECTOR08/LAN05/USD06 "6,45" 0645 +91 6 46 AS/SECTOR08/LAN07/USD06 "6,46" 0646 +93 6 47 AS/SECTOR08/LAN09/USD06 "6,47" 0647 +95 6 48 AS/SECTOR08/LAN11/USD06 "6,48" 0648 +1 7 1 AS/SECTOR01/LAN01/USD07 "7,1" 0701 +2 7 2 AS/SECTOR01/LAN02/USD07 "7,2" 0702 +3 7 3 AS/SECTOR01/LAN03/USD07 "7,3" 0703 +4 7 4 AS/SECTOR01/LAN04/USD07 "7,4" 0704 +5 7 5 AS/SECTOR01/LAN05/USD07 "7,5" 0705 +6 7 6 AS/SECTOR01/LAN06/USD07 "7,6" 0706 +7 7 7 AS/SECTOR01/LAN07/USD07 "7,7" 0707 +8 7 8 AS/SECTOR01/LAN08/USD07 "7,8" 0708 +9 7 9 AS/SECTOR01/LAN09/USD07 "7,9" 0709 +10 7 10 AS/SECTOR01/LAN10/USD07 "7,10" 0710 +11 7 11 AS/SECTOR01/LAN11/USD07 "7,11" 0711 +12 7 12 AS/SECTOR01/LAN12/USD07 "7,12" 0712 +13 7 13 AS/SECTOR02/LAN01/USD07 "7,13" 0713 +14 7 14 AS/SECTOR02/LAN02/USD07 "7,14" 0714 +15 7 15 AS/SECTOR02/LAN03/USD07 "7,15" 0715 +16 7 16 AS/SECTOR02/LAN04/USD07 "7,16" 0716 +17 7 17 AS/SECTOR02/LAN05/USD07 "7,17" 0717 +18 7 18 AS/SECTOR02/LAN06/USD07 "7,18" 0718 +19 7 19 AS/SECTOR02/LAN07/USD07 "7,19" 0719 +20 7 20 AS/SECTOR02/LAN08/USD07 "7,20" 0720 +21 7 21 AS/SECTOR02/LAN09/USD07 "7,21" 0721 +22 7 22 AS/SECTOR02/LAN10/USD07 "7,22" 0722 +23 7 23 AS/SECTOR02/LAN11/USD07 "7,23" 0723 +24 7 24 AS/SECTOR02/LAN12/USD07 "7,24" 0724 +25 7 25 AS/SECTOR03/LAN01/USD07 "7,25" 0725 +26 7 26 AS/SECTOR03/LAN02/USD07 "7,26" 0726 +27 7 27 AS/SECTOR03/LAN03/USD07 "7,27" 0727 +28 7 28 AS/SECTOR03/LAN04/USD07 "7,28" 0728 +29 7 29 AS/SECTOR03/LAN05/USD07 "7,29" 0729 +30 7 30 AS/SECTOR03/LAN06/USD07 "7,30" 0730 +31 7 31 AS/SECTOR03/LAN07/USD07 "7,31" 0731 +32 7 32 AS/SECTOR03/LAN08/USD07 "7,32" 0732 +33 7 33 AS/SECTOR03/LAN09/USD07 "7,33" 0733 +34 7 34 AS/SECTOR03/LAN10/USD07 "7,34" 0734 +35 7 35 AS/SECTOR03/LAN11/USD07 "7,35" 0735 +36 7 36 AS/SECTOR03/LAN12/USD07 "7,36" 0736 +37 7 37 AS/SECTOR04/LAN01/USD07 "7,37" 0737 +38 7 38 AS/SECTOR04/LAN02/USD07 "7,38" 0738 +39 7 39 AS/SECTOR04/LAN03/USD07 "7,39" 0739 +40 7 40 AS/SECTOR04/LAN04/USD07 "7,40" 0740 +41 7 41 AS/SECTOR04/LAN05/USD07 "7,41" 0741 +42 7 42 AS/SECTOR04/LAN06/USD07 "7,42" 0742 +43 7 43 AS/SECTOR04/LAN07/USD07 "7,43" 0743 +44 7 44 AS/SECTOR04/LAN08/USD07 "7,44" 0744 +45 7 45 AS/SECTOR04/LAN09/USD07 "7,45" 0745 +46 7 46 AS/SECTOR04/LAN10/USD07 "7,46" 0746 +47 7 47 AS/SECTOR04/LAN11/USD07 "7,47" 0747 +48 7 48 AS/SECTOR04/LAN12/USD07 "7,48" 0748 +49 7 49 AS/SECTOR05/LAN01/USD07 "7,49" 0749 +50 7 50 AS/SECTOR05/LAN02/USD07 "7,50" 0750 +51 7 51 AS/SECTOR05/LAN03/USD07 "7,51" 0751 +52 7 52 AS/SECTOR05/LAN04/USD07 "7,52" 0752 +53 7 53 AS/SECTOR05/LAN05/USD07 "7,53" 0753 +54 7 54 AS/SECTOR05/LAN06/USD07 "7,54" 0754 +55 7 55 AS/SECTOR05/LAN07/USD07 "7,55" 0755 +56 7 56 AS/SECTOR05/LAN08/USD07 "7,56" 0756 +57 7 57 AS/SECTOR05/LAN09/USD07 "7,57" 0757 +58 7 58 AS/SECTOR05/LAN10/USD07 "7,58" 0758 +59 7 59 AS/SECTOR05/LAN11/USD07 "7,59" 0759 +60 7 60 AS/SECTOR05/LAN12/USD07 "7,60" 0760 +61 7 61 AS/SECTOR06/LAN01/USD07 "7,61" 0761 +62 7 62 AS/SECTOR06/LAN02/USD07 "7,62" 0762 +63 7 63 AS/SECTOR06/LAN03/USD07 "7,63" 0763 +64 7 64 AS/SECTOR06/LAN04/USD07 "7,64" 0764 +65 7 65 AS/SECTOR06/LAN05/USD07 "7,65" 0765 +66 7 66 AS/SECTOR06/LAN06/USD07 "7,66" 0766 +67 7 67 AS/SECTOR06/LAN07/USD07 "7,67" 0767 +68 7 68 AS/SECTOR06/LAN08/USD07 "7,68" 0768 +69 7 69 AS/SECTOR06/LAN09/USD07 "7,69" 0769 +70 7 70 AS/SECTOR06/LAN10/USD07 "7,70" 0770 +71 7 71 AS/SECTOR06/LAN11/USD07 "7,71" 0771 +72 7 72 AS/SECTOR06/LAN12/USD07 "7,72" 0772 +73 7 73 AS/SECTOR07/LAN01/USD07 "7,73" 0773 +74 7 74 AS/SECTOR07/LAN02/USD07 "7,74" 0774 +75 7 75 AS/SECTOR07/LAN03/USD07 "7,75" 0775 +76 7 76 AS/SECTOR07/LAN04/USD07 "7,76" 0776 +77 7 77 AS/SECTOR07/LAN05/USD07 "7,77" 0777 +78 7 78 AS/SECTOR07/LAN06/USD07 "7,78" 0778 +79 7 79 AS/SECTOR07/LAN07/USD07 "7,79" 0779 +80 7 80 AS/SECTOR07/LAN08/USD07 "7,80" 0780 +81 7 81 AS/SECTOR07/LAN09/USD07 "7,81" 0781 +82 7 82 AS/SECTOR07/LAN10/USD07 "7,82" 0782 +83 7 83 AS/SECTOR07/LAN11/USD07 "7,83" 0783 +84 7 84 AS/SECTOR07/LAN12/USD07 "7,84" 0784 +85 7 85 AS/SECTOR08/LAN01/USD07 "7,85" 0785 +86 7 86 AS/SECTOR08/LAN02/USD07 "7,86" 0786 +87 7 87 AS/SECTOR08/LAN03/USD07 "7,87" 0787 +88 7 88 AS/SECTOR08/LAN04/USD07 "7,88" 0788 +89 7 89 AS/SECTOR08/LAN05/USD07 "7,89" 0789 +90 7 90 AS/SECTOR08/LAN06/USD07 "7,90" 0790 +91 7 91 AS/SECTOR08/LAN07/USD07 "7,91" 0791 +92 7 92 AS/SECTOR08/LAN08/USD07 "7,92" 0792 +93 7 93 AS/SECTOR08/LAN09/USD07 "7,93" 0793 +94 7 94 AS/SECTOR08/LAN10/USD07 "7,94" 0794 +95 7 95 AS/SECTOR08/LAN11/USD07 "7,95" 0795 +96 7 96 AS/SECTOR08/LAN12/USD07 "7,96" 0796 +1 8 1 AS/SECTOR01/LAN01/USD08 "8,1" 0801 +2 8 2 AS/SECTOR01/LAN02/USD08 "8,2" 0802 +3 8 3 AS/SECTOR01/LAN03/USD08 "8,3" 0803 +4 8 4 AS/SECTOR01/LAN04/USD08 "8,4" 0804 +5 8 5 AS/SECTOR01/LAN05/USD08 "8,5" 0805 +6 8 6 AS/SECTOR01/LAN06/USD08 "8,6" 0806 +7 8 7 AS/SECTOR01/LAN07/USD08 "8,7" 0807 +8 8 8 AS/SECTOR01/LAN08/USD08 "8,8" 0808 +9 8 9 AS/SECTOR01/LAN09/USD08 "8,9" 0809 +10 8 10 AS/SECTOR01/LAN10/USD08 "8,10" 0810 +11 8 11 AS/SECTOR01/LAN11/USD08 "8,11" 0811 +12 8 12 AS/SECTOR01/LAN12/USD08 "8,12" 0812 +13 8 13 AS/SECTOR02/LAN01/USD08 "8,13" 0813 +14 8 14 AS/SECTOR02/LAN02/USD08 "8,14" 0814 +15 8 15 AS/SECTOR02/LAN03/USD08 "8,15" 0815 +16 8 16 AS/SECTOR02/LAN04/USD08 "8,16" 0816 +17 8 17 AS/SECTOR02/LAN05/USD08 "8,17" 0817 +18 8 18 AS/SECTOR02/LAN06/USD08 "8,18" 0818 +19 8 19 AS/SECTOR02/LAN07/USD08 "8,19" 0819 +20 8 20 AS/SECTOR02/LAN08/USD08 "8,20" 0820 +21 8 21 AS/SECTOR02/LAN09/USD08 "8,21" 0821 +22 8 22 AS/SECTOR02/LAN10/USD08 "8,22" 0822 +23 8 23 AS/SECTOR02/LAN11/USD08 "8,23" 0823 +24 8 24 AS/SECTOR02/LAN12/USD08 "8,24" 0824 +25 8 25 AS/SECTOR03/LAN01/USD08 "8,25" 0825 +26 8 26 AS/SECTOR03/LAN02/USD08 "8,26" 0826 +27 8 27 AS/SECTOR03/LAN03/USD08 "8,27" 0827 +28 8 28 AS/SECTOR03/LAN04/USD08 "8,28" 0828 +29 8 29 AS/SECTOR03/LAN05/USD08 "8,29" 0829 +30 8 30 AS/SECTOR03/LAN06/USD08 "8,30" 0830 +31 8 31 AS/SECTOR03/LAN07/USD08 "8,31" 0831 +32 8 32 AS/SECTOR03/LAN08/USD08 "8,32" 0832 +33 8 33 AS/SECTOR03/LAN09/USD08 "8,33" 0833 +34 8 34 AS/SECTOR03/LAN10/USD08 "8,34" 0834 +35 8 35 AS/SECTOR03/LAN11/USD08 "8,35" 0835 +36 8 36 AS/SECTOR03/LAN12/USD08 "8,36" 0836 +37 8 37 AS/SECTOR04/LAN01/USD08 "8,37" 0837 +38 8 38 AS/SECTOR04/LAN02/USD08 "8,38" 0838 +39 8 39 AS/SECTOR04/LAN03/USD08 "8,39" 0839 +40 8 40 AS/SECTOR04/LAN04/USD08 "8,40" 0840 +41 8 41 AS/SECTOR04/LAN05/USD08 "8,41" 0841 +42 8 42 AS/SECTOR04/LAN06/USD08 "8,42" 0842 +43 8 43 AS/SECTOR04/LAN07/USD08 "8,43" 0843 +44 8 44 AS/SECTOR04/LAN08/USD08 "8,44" 0844 +45 8 45 AS/SECTOR04/LAN09/USD08 "8,45" 0845 +46 8 46 AS/SECTOR04/LAN10/USD08 "8,46" 0846 +47 8 47 AS/SECTOR04/LAN11/USD08 "8,47" 0847 +48 8 48 AS/SECTOR04/LAN12/USD08 "8,48" 0848 +49 8 49 AS/SECTOR05/LAN01/USD08 "8,49" 0849 +50 8 50 AS/SECTOR05/LAN02/USD08 "8,50" 0850 +51 8 51 AS/SECTOR05/LAN03/USD08 "8,51" 0851 +52 8 52 AS/SECTOR05/LAN04/USD08 "8,52" 0852 +53 8 53 AS/SECTOR05/LAN05/USD08 "8,53" 0853 +54 8 54 AS/SECTOR05/LAN06/USD08 "8,54" 0854 +55 8 55 AS/SECTOR05/LAN07/USD08 "8,55" 0855 +56 8 56 AS/SECTOR05/LAN08/USD08 "8,56" 0856 +57 8 57 AS/SECTOR05/LAN09/USD08 "8,57" 0857 +58 8 58 AS/SECTOR05/LAN10/USD08 "8,58" 0858 +59 8 59 AS/SECTOR05/LAN11/USD08 "8,59" 0859 +60 8 60 AS/SECTOR05/LAN12/USD08 "8,60" 0860 +61 8 61 AS/SECTOR06/LAN01/USD08 "8,61" 0861 +62 8 62 AS/SECTOR06/LAN02/USD08 "8,62" 0862 +63 8 63 AS/SECTOR06/LAN03/USD08 "8,63" 0863 +64 8 64 AS/SECTOR06/LAN04/USD08 "8,64" 0864 +65 8 65 AS/SECTOR06/LAN05/USD08 "8,65" 0865 +66 8 66 AS/SECTOR06/LAN06/USD08 "8,66" 0866 +67 8 67 AS/SECTOR06/LAN07/USD08 "8,67" 0867 +68 8 68 AS/SECTOR06/LAN08/USD08 "8,68" 0868 +69 8 69 AS/SECTOR06/LAN09/USD08 "8,69" 0869 +70 8 70 AS/SECTOR06/LAN10/USD08 "8,70" 0870 +71 8 71 AS/SECTOR06/LAN11/USD08 "8,71" 0871 +72 8 72 AS/SECTOR06/LAN12/USD08 "8,72" 0872 +73 8 73 AS/SECTOR07/LAN01/USD08 "8,73" 0873 +74 8 74 AS/SECTOR07/LAN02/USD08 "8,74" 0874 +75 8 75 AS/SECTOR07/LAN03/USD08 "8,75" 0875 +76 8 76 AS/SECTOR07/LAN04/USD08 "8,76" 0876 +77 8 77 AS/SECTOR07/LAN05/USD08 "8,77" 0877 +78 8 78 AS/SECTOR07/LAN06/USD08 "8,78" 0878 +79 8 79 AS/SECTOR07/LAN07/USD08 "8,79" 0879 +80 8 80 AS/SECTOR07/LAN08/USD08 "8,80" 0880 +81 8 81 AS/SECTOR07/LAN09/USD08 "8,81" 0881 +82 8 82 AS/SECTOR07/LAN10/USD08 "8,82" 0882 +83 8 83 AS/SECTOR07/LAN11/USD08 "8,83" 0883 +84 8 84 AS/SECTOR07/LAN12/USD08 "8,84" 0884 +85 8 85 AS/SECTOR08/LAN01/USD08 "8,85" 0885 +86 8 86 AS/SECTOR08/LAN02/USD08 "8,86" 0886 +88 8 88 AS/SECTOR08/LAN03/USD08 "8,88" 0888 +88 8 88 AS/SECTOR08/LAN04/USD08 "8,88" 0888 +89 8 89 AS/SECTOR08/LAN05/USD08 "8,89" 0889 +90 8 90 AS/SECTOR08/LAN06/USD08 "8,90" 0890 +91 8 91 AS/SECTOR08/LAN07/USD08 "8,91" 0891 +92 8 92 AS/SECTOR08/LAN08/USD08 "8,92" 0892 +93 8 93 AS/SECTOR08/LAN09/USD08 "8,93" 0893 +94 8 94 AS/SECTOR08/LAN10/USD08 "8,94" 0894 +95 8 95 AS/SECTOR08/LAN11/USD08 "8,95" 0895 +96 8 96 AS/SECTOR08/LAN12/USD08 "8,96" 0896 +1 9 1 AS/SECTOR01/LAN01/USD09 "9,1" 0901 +2 9 2 AS/SECTOR01/LAN02/USD09 "9,2" 0902 +3 9 3 AS/SECTOR01/LAN03/USD09 "9,3" 0903 +4 9 4 AS/SECTOR01/LAN04/USD09 "9,4" 0904 +5 9 5 AS/SECTOR01/LAN05/USD09 "9,5" 0905 +6 9 6 AS/SECTOR01/LAN06/USD09 "9,6" 0906 +7 9 7 AS/SECTOR01/LAN07/USD09 "9,7" 0907 +8 9 8 AS/SECTOR01/LAN08/USD09 "9,8" 0908 +9 9 9 AS/SECTOR01/LAN09/USD09 "9,9" 0909 +10 9 10 AS/SECTOR01/LAN10/USD09 "9,10" 0910 +11 9 11 AS/SECTOR01/LAN11/USD09 "9,11" 0911 +12 9 12 AS/SECTOR01/LAN12/USD09 "9,12" 0912 +13 9 13 AS/SECTOR02/LAN01/USD09 "9,13" 0913 +14 9 14 AS/SECTOR02/LAN02/USD09 "9,14" 0914 +15 9 15 AS/SECTOR02/LAN03/USD09 "9,15" 0915 +16 9 16 AS/SECTOR02/LAN04/USD09 "9,16" 0916 +17 9 17 AS/SECTOR02/LAN05/USD09 "9,17" 0917 +18 9 18 AS/SECTOR02/LAN06/USD09 "9,18" 0918 +19 9 19 AS/SECTOR02/LAN07/USD09 "9,19" 0919 +20 9 20 AS/SECTOR02/LAN08/USD09 "9,20" 0920 +21 9 21 AS/SECTOR02/LAN09/USD09 "9,21" 0921 +22 9 22 AS/SECTOR02/LAN10/USD09 "9,22" 0922 +23 9 23 AS/SECTOR02/LAN11/USD09 "9,23" 0923 +24 9 24 AS/SECTOR02/LAN12/USD09 "9,24" 0924 +25 9 25 AS/SECTOR03/LAN01/USD09 "9,25" 0925 +26 9 26 AS/SECTOR03/LAN02/USD09 "9,26" 0926 +27 9 27 AS/SECTOR03/LAN03/USD09 "9,27" 0927 +28 9 28 AS/SECTOR03/LAN04/USD09 "9,28" 0928 +29 9 29 AS/SECTOR03/LAN05/USD09 "9,29" 0929 +30 9 30 AS/SECTOR03/LAN06/USD09 "9,30" 0930 +31 9 31 AS/SECTOR03/LAN07/USD09 "9,31" 0931 +32 9 32 AS/SECTOR03/LAN08/USD09 "9,32" 0932 +33 9 33 AS/SECTOR03/LAN09/USD09 "9,33" 0933 +34 9 34 AS/SECTOR03/LAN10/USD09 "9,34" 0934 +35 9 35 AS/SECTOR03/LAN11/USD09 "9,35" 0935 +36 9 36 AS/SECTOR03/LAN12/USD09 "9,36" 0936 +37 9 37 AS/SECTOR04/LAN01/USD09 "9,37" 0937 +38 9 38 AS/SECTOR04/LAN02/USD09 "9,38" 0938 +39 9 39 AS/SECTOR04/LAN03/USD09 "9,39" 0939 +40 9 40 AS/SECTOR04/LAN04/USD09 "9,40" 0940 +41 9 41 AS/SECTOR04/LAN05/USD09 "9,41" 0941 +42 9 42 AS/SECTOR04/LAN06/USD09 "9,42" 0942 +43 9 43 AS/SECTOR04/LAN07/USD09 "9,43" 0943 +44 9 44 AS/SECTOR04/LAN08/USD09 "9,44" 0944 +45 9 45 AS/SECTOR04/LAN09/USD09 "9,45" 0945 +46 9 46 AS/SECTOR04/LAN10/USD09 "9,46" 0946 +47 9 47 AS/SECTOR04/LAN11/USD09 "9,47" 0947 +48 9 48 AS/SECTOR04/LAN12/USD09 "9,48" 0948 +49 9 49 AS/SECTOR05/LAN01/USD09 "9,49" 0949 +50 9 50 AS/SECTOR05/LAN02/USD09 "9,50" 0950 +51 9 51 AS/SECTOR05/LAN03/USD09 "9,51" 0951 +52 9 52 AS/SECTOR05/LAN04/USD09 "9,52" 0952 +53 9 53 AS/SECTOR05/LAN05/USD09 "9,53" 0953 +54 9 54 AS/SECTOR05/LAN06/USD09 "9,54" 0954 +55 9 55 AS/SECTOR05/LAN07/USD09 "9,55" 0955 +56 9 56 AS/SECTOR05/LAN08/USD09 "9,56" 0956 +57 9 57 AS/SECTOR05/LAN09/USD09 "9,57" 0957 +58 9 58 AS/SECTOR05/LAN10/USD09 "9,58" 0958 +59 9 59 AS/SECTOR05/LAN11/USD09 "9,59" 0959 +60 9 60 AS/SECTOR05/LAN12/USD09 "9,60" 0960 +61 9 61 AS/SECTOR06/LAN01/USD09 "9,61" 0961 +62 9 62 AS/SECTOR06/LAN02/USD09 "9,62" 0962 +63 9 63 AS/SECTOR06/LAN03/USD09 "9,63" 0963 +64 9 64 AS/SECTOR06/LAN04/USD09 "9,64" 0964 +65 9 65 AS/SECTOR06/LAN05/USD09 "9,65" 0965 +66 9 66 AS/SECTOR06/LAN06/USD09 "9,66" 0966 +67 9 67 AS/SECTOR06/LAN07/USD09 "9,67" 0967 +68 9 68 AS/SECTOR06/LAN08/USD09 "9,68" 0968 +69 9 69 AS/SECTOR06/LAN09/USD09 "9,69" 0969 +70 9 70 AS/SECTOR06/LAN10/USD09 "9,70" 0970 +71 9 71 AS/SECTOR06/LAN11/USD09 "9,71" 0971 +72 9 72 AS/SECTOR06/LAN12/USD09 "9,72" 0972 +73 9 73 AS/SECTOR07/LAN01/USD09 "9,73" 0973 +74 9 74 AS/SECTOR07/LAN02/USD09 "9,74" 0974 +75 9 75 AS/SECTOR07/LAN03/USD09 "9,75" 0975 +76 9 76 AS/SECTOR07/LAN04/USD09 "9,76" 0976 +77 9 77 AS/SECTOR07/LAN05/USD09 "9,77" 0977 +78 9 78 AS/SECTOR07/LAN06/USD09 "9,78" 0978 +79 9 79 AS/SECTOR07/LAN07/USD09 "9,79" 0979 +80 9 80 AS/SECTOR07/LAN08/USD09 "9,80" 0980 +81 9 81 AS/SECTOR07/LAN09/USD09 "9,81" 0981 +82 9 82 AS/SECTOR07/LAN10/USD09 "9,82" 0982 +83 9 83 AS/SECTOR07/LAN11/USD09 "9,83" 0983 +84 9 84 AS/SECTOR07/LAN12/USD09 "9,84" 0984 +85 9 85 AS/SECTOR08/LAN01/USD09 "9,85" 0985 +86 9 86 AS/SECTOR08/LAN02/USD09 "9,86" 0986 +87 9 87 AS/SECTOR08/LAN03/USD09 "9,87" 0987 +88 9 88 AS/SECTOR08/LAN04/USD09 "9,88" 0988 +89 9 89 AS/SECTOR08/LAN05/USD09 "9,89" 0989 +90 9 90 AS/SECTOR08/LAN06/USD09 "9,90" 0990 +91 9 91 AS/SECTOR08/LAN07/USD09 "9,91" 0991 +92 9 92 AS/SECTOR08/LAN08/USD09 "9,92" 0992 +93 9 93 AS/SECTOR08/LAN09/USD09 "9,93" 0993 +94 9 94 AS/SECTOR08/LAN10/USD09 "9,94" 0994 +95 9 95 AS/SECTOR08/LAN11/USD09 "9,95" 0995 +96 9 96 AS/SECTOR08/LAN12/USD09 "9,96" 0996 +1 10 1 AS/SECTOR01/LAN01/USD10 "10,1" 1001 +2 10 2 AS/SECTOR01/LAN02/USD10 "10,2" 1002 +3 10 3 AS/SECTOR01/LAN03/USD10 "10,3" 1003 +4 10 4 AS/SECTOR01/LAN04/USD10 "10,4" 1004 +5 10 5 AS/SECTOR01/LAN05/USD10 "10,5" 1005 +6 10 6 AS/SECTOR01/LAN06/USD10 "10,6" 1006 +7 10 7 AS/SECTOR01/LAN07/USD10 "10,7" 1007 +8 10 8 AS/SECTOR01/LAN08/USD10 "10,8" 1008 +9 10 9 AS/SECTOR01/LAN09/USD10 "10,9" 1009 +10 10 10 AS/SECTOR01/LAN10/USD10 "10,10" 1010 +11 10 11 AS/SECTOR01/LAN11/USD10 "10,11" 1011 +12 10 12 AS/SECTOR01/LAN12/USD10 "10,12" 1012 +13 10 13 AS/SECTOR02/LAN01/USD10 "10,13" 1013 +14 10 14 AS/SECTOR02/LAN02/USD10 "10,14" 1014 +15 10 15 AS/SECTOR02/LAN03/USD10 "10,15" 1015 +16 10 16 AS/SECTOR02/LAN04/USD10 "10,16" 1016 +17 10 17 AS/SECTOR02/LAN05/USD10 "10,17" 1017 +18 10 18 AS/SECTOR02/LAN06/USD10 "10,18" 1018 +19 10 19 AS/SECTOR02/LAN07/USD10 "10,19" 1019 +20 10 20 AS/SECTOR02/LAN08/USD10 "10,20" 1020 +21 10 21 AS/SECTOR02/LAN09/USD10 "10,21" 1021 +22 10 22 AS/SECTOR02/LAN10/USD10 "10,22" 1022 +23 10 23 AS/SECTOR02/LAN11/USD10 "10,23" 1023 +24 10 24 AS/SECTOR02/LAN12/USD10 "10,24" 1024 +25 10 25 AS/SECTOR03/LAN01/USD10 "10,25" 1025 +26 10 26 AS/SECTOR03/LAN02/USD10 "10,26" 1026 +27 10 27 AS/SECTOR03/LAN03/USD10 "10,27" 1027 +28 10 28 AS/SECTOR03/LAN04/USD10 "10,28" 1028 +29 10 29 AS/SECTOR03/LAN05/USD10 "10,29" 1029 +30 10 30 AS/SECTOR03/LAN06/USD10 "10,30" 1030 +31 10 31 AS/SECTOR03/LAN07/USD10 "10,31" 1031 +32 10 32 AS/SECTOR03/LAN08/USD10 "10,32" 1032 +33 10 33 AS/SECTOR03/LAN09/USD10 "10,33" 1033 +34 10 34 AS/SECTOR03/LAN10/USD10 "10,34" 1034 +35 10 35 AS/SECTOR03/LAN11/USD10 "10,35" 1035 +36 10 36 AS/SECTOR03/LAN12/USD10 "10,36" 1036 +37 10 37 AS/SECTOR04/LAN01/USD10 "10,37" 1037 +38 10 38 AS/SECTOR04/LAN02/USD10 "10,38" 1038 +39 10 39 AS/SECTOR04/LAN03/USD10 "10,39" 1039 +40 10 40 AS/SECTOR04/LAN04/USD10 "10,40" 1040 +41 10 41 AS/SECTOR04/LAN05/USD10 "10,41" 1041 +42 10 42 AS/SECTOR04/LAN06/USD10 "10,42" 1042 +43 10 43 AS/SECTOR04/LAN07/USD10 "10,43" 1043 +44 10 44 AS/SECTOR04/LAN08/USD10 "10,44" 1044 +45 10 45 AS/SECTOR04/LAN09/USD10 "10,45" 1045 +46 10 46 AS/SECTOR04/LAN10/USD10 "10,46" 1046 +47 10 47 AS/SECTOR04/LAN11/USD10 "10,47" 1047 +48 10 48 AS/SECTOR04/LAN12/USD10 "10,48" 1048 +49 10 49 AS/SECTOR05/LAN01/USD10 "10,49" 1049 +50 10 50 AS/SECTOR05/LAN02/USD10 "10,50" 1050 +51 10 51 AS/SECTOR05/LAN03/USD10 "10,51" 1051 +52 10 52 AS/SECTOR05/LAN04/USD10 "10,52" 1052 +53 10 53 AS/SECTOR05/LAN05/USD10 "10,53" 1053 +54 10 54 AS/SECTOR05/LAN06/USD10 "10,54" 1054 +55 10 55 AS/SECTOR05/LAN07/USD10 "10,55" 1055 +56 10 56 AS/SECTOR05/LAN08/USD10 "10,56" 1056 +57 10 57 AS/SECTOR05/LAN09/USD10 "10,57" 1057 +58 10 58 AS/SECTOR05/LAN10/USD10 "10,58" 1058 +59 10 59 AS/SECTOR05/LAN11/USD10 "10,59" 1059 +60 10 60 AS/SECTOR05/LAN12/USD10 "10,60" 1060 +61 10 61 AS/SECTOR06/LAN01/USD10 "10,61" 1061 +62 10 62 AS/SECTOR06/LAN02/USD10 "10,62" 1062 +63 10 63 AS/SECTOR06/LAN03/USD10 "10,63" 1063 +64 10 64 AS/SECTOR06/LAN04/USD10 "10,64" 1064 +65 10 65 AS/SECTOR06/LAN05/USD10 "10,65" 1065 +66 10 66 AS/SECTOR06/LAN06/USD10 "10,66" 1066 +67 10 67 AS/SECTOR06/LAN07/USD10 "10,67" 1067 +68 10 68 AS/SECTOR06/LAN08/USD10 "10,68" 1068 +69 10 69 AS/SECTOR06/LAN09/USD10 "10,69" 1069 +70 10 70 AS/SECTOR06/LAN10/USD10 "10,70" 1070 +71 10 71 AS/SECTOR06/LAN11/USD10 "10,71" 1071 +72 10 72 AS/SECTOR06/LAN12/USD10 "10,72" 1072 +73 10 73 AS/SECTOR07/LAN01/USD10 "10,73" 1073 +74 10 74 AS/SECTOR07/LAN02/USD10 "10,74" 1074 +75 10 75 AS/SECTOR07/LAN03/USD10 "10,75" 1075 +76 10 76 AS/SECTOR07/LAN04/USD10 "10,76" 1076 +77 10 77 AS/SECTOR07/LAN05/USD10 "10,77" 1077 +78 10 78 AS/SECTOR07/LAN06/USD10 "10,78" 1078 +79 10 79 AS/SECTOR07/LAN07/USD10 "10,79" 1079 +80 10 80 AS/SECTOR07/LAN08/USD10 "10,80" 1080 +81 10 81 AS/SECTOR07/LAN09/USD10 "10,81" 1081 +82 10 82 AS/SECTOR07/LAN10/USD10 "10,82" 1082 +83 10 83 AS/SECTOR07/LAN11/USD10 "10,83" 1083 +84 10 84 AS/SECTOR07/LAN12/USD10 "10,84" 1084 +85 10 85 AS/SECTOR08/LAN01/USD10 "10,85" 1085 +86 10 86 AS/SECTOR08/LAN02/USD10 "10,86" 1086 +87 10 87 AS/SECTOR08/LAN03/USD10 "10,87" 1087 +88 10 88 AS/SECTOR08/LAN04/USD10 "10,88" 1088 +89 10 89 AS/SECTOR08/LAN05/USD10 "10,89" 1089 +90 10 90 AS/SECTOR08/LAN06/USD10 "10,90" 1090 +91 10 91 AS/SECTOR08/LAN07/USD10 "10,91" 1091 +92 10 92 AS/SECTOR08/LAN08/USD10 "10,92" 1092 +93 10 93 AS/SECTOR08/LAN09/USD10 "10,93" 1093 +94 10 94 AS/SECTOR08/LAN10/USD10 "10,94" 1094 +95 10 95 AS/SECTOR08/LAN11/USD10 "10,95" 1095 +96 10 96 AS/SECTOR08/LAN12/USD10 "10,96" 1096 +1 11 1 AS/SECTOR01/LAN01/USD11 "11,1" 1101 +2 11 2 AS/SECTOR01/LAN02/USD11 "11,2" 1102 +3 11 3 AS/SECTOR01/LAN03/USD11 "11,3" 1103 +4 11 4 AS/SECTOR01/LAN04/USD11 "11,4" 1104 +5 11 5 AS/SECTOR01/LAN05/USD11 "11,5" 1105 +6 11 6 AS/SECTOR01/LAN06/USD11 "11,6" 1106 +7 11 7 AS/SECTOR01/LAN07/USD11 "11,7" 1107 +8 11 8 AS/SECTOR01/LAN08/USD11 "11,8" 1108 +9 11 9 AS/SECTOR01/LAN09/USD11 "11,9" 1109 +10 11 10 AS/SECTOR01/LAN10/USD11 "11,10" 1110 +11 11 11 AS/SECTOR01/LAN11/USD11 "11,11" 1111 +12 11 12 AS/SECTOR01/LAN12/USD11 "11,12" 1112 +13 11 13 AS/SECTOR02/LAN01/USD11 "11,13" 1113 +14 11 14 AS/SECTOR02/LAN02/USD11 "11,14" 1114 +15 11 15 AS/SECTOR02/LAN03/USD11 "11,15" 1115 +16 11 16 AS/SECTOR02/LAN04/USD11 "11,16" 1116 +17 11 17 AS/SECTOR02/LAN05/USD11 "11,17" 1117 +18 11 18 AS/SECTOR02/LAN06/USD11 "11,18" 1118 +19 11 19 AS/SECTOR02/LAN07/USD11 "11,19" 1119 +20 11 20 AS/SECTOR02/LAN08/USD11 "11,20" 1120 +21 11 21 AS/SECTOR02/LAN09/USD11 "11,21" 1121 +22 11 22 AS/SECTOR02/LAN10/USD11 "11,22" 1122 +23 11 23 AS/SECTOR02/LAN11/USD11 "11,23" 1123 +24 11 24 AS/SECTOR02/LAN12/USD11 "11,24" 1124 +25 11 25 AS/SECTOR03/LAN01/USD11 "11,25" 1125 +26 11 26 AS/SECTOR03/LAN02/USD11 "11,26" 1126 +27 11 27 AS/SECTOR03/LAN03/USD11 "11,27" 1127 +28 11 28 AS/SECTOR03/LAN04/USD11 "11,28" 1128 +29 11 29 AS/SECTOR03/LAN05/USD11 "11,29" 1129 +30 11 30 AS/SECTOR03/LAN06/USD11 "11,30" 1130 +31 11 31 AS/SECTOR03/LAN07/USD11 "11,31" 1131 +32 11 32 AS/SECTOR03/LAN08/USD11 "11,32" 1132 +33 11 33 AS/SECTOR03/LAN09/USD11 "11,33" 1133 +34 11 34 AS/SECTOR03/LAN10/USD11 "11,34" 1134 +35 11 35 AS/SECTOR03/LAN11/USD11 "11,35" 1135 +36 11 36 AS/SECTOR03/LAN12/USD11 "11,36" 1136 +37 11 37 AS/SECTOR04/LAN01/USD11 "11,37" 1137 +38 11 38 AS/SECTOR04/LAN02/USD11 "11,38" 1138 +39 11 39 AS/SECTOR04/LAN03/USD11 "11,39" 1139 +40 11 40 AS/SECTOR04/LAN04/USD11 "11,40" 1140 +41 11 41 AS/SECTOR04/LAN05/USD11 "11,41" 1141 +42 11 42 AS/SECTOR04/LAN06/USD11 "11,42" 1142 +43 11 43 AS/SECTOR04/LAN07/USD11 "11,43" 1143 +44 11 44 AS/SECTOR04/LAN08/USD11 "11,44" 1144 +45 11 45 AS/SECTOR04/LAN09/USD11 "11,45" 1145 +46 11 46 AS/SECTOR04/LAN10/USD11 "11,46" 1146 +47 11 47 AS/SECTOR04/LAN11/USD11 "11,47" 1147 +48 11 48 AS/SECTOR04/LAN12/USD11 "11,48" 1148 +49 11 49 AS/SECTOR05/LAN01/USD11 "11,49" 1149 +50 11 50 AS/SECTOR05/LAN02/USD11 "11,50" 1150 +51 11 51 AS/SECTOR05/LAN03/USD11 "11,51" 1151 +52 11 52 AS/SECTOR05/LAN04/USD11 "11,52" 1152 +53 11 53 AS/SECTOR05/LAN05/USD11 "11,53" 1153 +54 11 54 AS/SECTOR05/LAN06/USD11 "11,54" 1154 +55 11 55 AS/SECTOR05/LAN07/USD11 "11,55" 1155 +56 11 56 AS/SECTOR05/LAN08/USD11 "11,56" 1156 +57 11 57 AS/SECTOR05/LAN09/USD11 "11,57" 1157 +58 11 58 AS/SECTOR05/LAN10/USD11 "11,58" 1158 +59 11 59 AS/SECTOR05/LAN11/USD11 "11,59" 1159 +60 11 60 AS/SECTOR05/LAN12/USD11 "11,60" 1160 +61 11 61 AS/SECTOR06/LAN01/USD11 "11,61" 1161 +62 11 62 AS/SECTOR06/LAN02/USD11 "11,62" 1162 +63 11 63 AS/SECTOR06/LAN03/USD11 "11,63" 1163 +64 11 64 AS/SECTOR06/LAN04/USD11 "11,64" 1164 +65 11 65 AS/SECTOR06/LAN05/USD11 "11,65" 1165 +66 11 66 AS/SECTOR06/LAN06/USD11 "11,66" 1166 +67 11 67 AS/SECTOR06/LAN07/USD11 "11,67" 1167 +68 11 68 AS/SECTOR06/LAN08/USD11 "11,68" 1168 +69 11 69 AS/SECTOR06/LAN09/USD11 "11,69" 1169 +70 11 70 AS/SECTOR06/LAN10/USD11 "11,70" 1170 +71 11 71 AS/SECTOR06/LAN11/USD11 "11,71" 1171 +72 11 72 AS/SECTOR06/LAN12/USD11 "11,72" 1172 +73 11 73 AS/SECTOR07/LAN01/USD11 "11,73" 1173 +74 11 74 AS/SECTOR07/LAN02/USD11 "11,74" 1174 +75 11 75 AS/SECTOR07/LAN03/USD11 "11,75" 1175 +76 11 76 AS/SECTOR07/LAN04/USD11 "11,76" 1176 +77 11 77 AS/SECTOR07/LAN05/USD11 "11,77" 1177 +78 11 78 AS/SECTOR07/LAN06/USD11 "11,78" 1178 +79 11 79 AS/SECTOR07/LAN07/USD11 "11,79" 1179 +80 11 80 AS/SECTOR07/LAN08/USD11 "11,80" 1180 +81 11 81 AS/SECTOR07/LAN09/USD11 "11,81" 1181 +82 11 82 AS/SECTOR07/LAN10/USD11 "11,82" 1182 +83 11 83 AS/SECTOR07/LAN11/USD11 "11,83" 1183 +84 11 84 AS/SECTOR07/LAN12/USD11 "11,84" 1184 +85 11 85 AS/SECTOR08/LAN01/USD11 "11,85" 1185 +86 11 86 AS/SECTOR08/LAN02/USD11 "11,86" 1186 +87 11 87 AS/SECTOR08/LAN03/USD11 "11,87" 1187 +88 11 88 AS/SECTOR08/LAN04/USD11 "11,88" 1188 +89 11 89 AS/SECTOR08/LAN05/USD11 "11,89" 1189 +90 11 90 AS/SECTOR08/LAN06/USD11 "11,90" 1190 +91 11 91 AS/SECTOR08/LAN07/USD11 "11,91" 1191 +92 11 92 AS/SECTOR08/LAN08/USD11 "11,92" 1192 +93 11 93 AS/SECTOR08/LAN09/USD11 "11,93" 1193 +94 11 94 AS/SECTOR08/LAN10/USD11 "11,94" 1194 +95 11 95 AS/SECTOR08/LAN11/USD11 "11,95" 1195 +96 11 96 AS/SECTOR08/LAN12/USD11 "11,96" 1196 +1 12 1 AS/SECTOR01/LAN01/USD12 "12,1" 1201 +2 12 2 AS/SECTOR01/LAN02/USD12 "12,2" 1202 +3 12 3 AS/SECTOR01/LAN03/USD12 "12,3" 1203 +4 12 4 AS/SECTOR01/LAN04/USD12 "12,4" 1204 +5 12 5 AS/SECTOR01/LAN05/USD12 "12,5" 1205 +6 12 6 AS/SECTOR01/LAN06/USD12 "12,6" 1206 +7 12 7 AS/SECTOR01/LAN07/USD12 "12,7" 1207 +8 12 8 AS/SECTOR01/LAN08/USD12 "12,8" 1208 +9 12 9 AS/SECTOR01/LAN09/USD12 "12,9" 1209 +10 12 10 AS/SECTOR01/LAN10/USD12 "12,10" 1210 +11 12 11 AS/SECTOR01/LAN11/USD12 "12,11" 1211 +12 12 12 AS/SECTOR01/LAN12/USD12 "12,12" 1212 +13 12 13 AS/SECTOR02/LAN01/USD12 "12,13" 1213 +14 12 14 AS/SECTOR02/LAN02/USD12 "12,14" 1214 +15 12 15 AS/SECTOR02/LAN03/USD12 "12,15" 1215 +16 12 16 AS/SECTOR02/LAN04/USD12 "12,16" 1216 +17 12 17 AS/SECTOR02/LAN05/USD12 "12,17" 1217 +18 12 18 AS/SECTOR02/LAN06/USD12 "12,18" 1218 +19 12 19 AS/SECTOR02/LAN07/USD12 "12,19" 1219 +20 12 20 AS/SECTOR02/LAN08/USD12 "12,20" 1220 +21 12 21 AS/SECTOR02/LAN09/USD12 "12,21" 1221 +22 12 22 AS/SECTOR02/LAN10/USD12 "12,22" 1222 +23 12 23 AS/SECTOR02/LAN11/USD12 "12,23" 1223 +24 12 24 AS/SECTOR02/LAN12/USD12 "12,24" 1224 +25 12 25 AS/SECTOR03/LAN01/USD12 "12,25" 1225 +26 12 26 AS/SECTOR03/LAN02/USD12 "12,26" 1226 +27 12 27 AS/SECTOR03/LAN03/USD12 "12,27" 1227 +28 12 28 AS/SECTOR03/LAN04/USD12 "12,28" 1228 +29 12 29 AS/SECTOR03/LAN05/USD12 "12,29" 1229 +30 12 30 AS/SECTOR03/LAN06/USD12 "12,30" 1230 +31 12 31 AS/SECTOR03/LAN07/USD12 "12,31" 1231 +32 12 32 AS/SECTOR03/LAN08/USD12 "12,32" 1232 +33 12 33 AS/SECTOR03/LAN09/USD12 "12,33" 1233 +34 12 34 AS/SECTOR03/LAN10/USD12 "12,34" 1234 +35 12 35 AS/SECTOR03/LAN11/USD12 "12,35" 1235 +36 12 36 AS/SECTOR03/LAN12/USD12 "12,36" 1236 +37 12 37 AS/SECTOR04/LAN01/USD12 "12,37" 1237 +38 12 38 AS/SECTOR04/LAN02/USD12 "12,38" 1238 +39 12 39 AS/SECTOR04/LAN03/USD12 "12,39" 1239 +40 12 40 AS/SECTOR04/LAN04/USD12 "12,40" 1240 +41 12 41 AS/SECTOR04/LAN05/USD12 "12,41" 1241 +42 12 42 AS/SECTOR04/LAN06/USD12 "12,42" 1242 +43 12 43 AS/SECTOR04/LAN07/USD12 "12,43" 1243 +44 12 44 AS/SECTOR04/LAN08/USD12 "12,44" 1244 +45 12 45 AS/SECTOR04/LAN09/USD12 "12,45" 1245 +46 12 46 AS/SECTOR04/LAN10/USD12 "12,46" 1246 +47 12 47 AS/SECTOR04/LAN11/USD12 "12,47" 1247 +48 12 48 AS/SECTOR04/LAN12/USD12 "12,48" 1248 +49 12 49 AS/SECTOR05/LAN01/USD12 "12,49" 1249 +50 12 50 AS/SECTOR05/LAN02/USD12 "12,50" 1250 +51 12 51 AS/SECTOR05/LAN03/USD12 "12,51" 1251 +52 12 52 AS/SECTOR05/LAN04/USD12 "12,52" 1252 +53 12 53 AS/SECTOR05/LAN05/USD12 "12,53" 1253 +54 12 54 AS/SECTOR05/LAN06/USD12 "12,54" 1254 +55 12 55 AS/SECTOR05/LAN07/USD12 "12,55" 1255 +56 12 56 AS/SECTOR05/LAN08/USD12 "12,56" 1256 +57 12 57 AS/SECTOR05/LAN09/USD12 "12,57" 1257 +58 12 58 AS/SECTOR05/LAN10/USD12 "12,58" 1258 +59 12 59 AS/SECTOR05/LAN11/USD12 "12,59" 1259 +60 12 60 AS/SECTOR05/LAN12/USD12 "12,60" 1260 +61 12 61 AS/SECTOR06/LAN01/USD12 "12,61" 1261 +62 12 62 AS/SECTOR06/LAN02/USD12 "12,62" 1262 +63 12 63 AS/SECTOR06/LAN03/USD12 "12,63" 1263 +64 12 64 AS/SECTOR06/LAN04/USD12 "12,64" 1264 +65 12 65 AS/SECTOR06/LAN05/USD12 "12,65" 1265 +66 12 66 AS/SECTOR06/LAN06/USD12 "12,66" 1266 +67 12 67 AS/SECTOR06/LAN07/USD12 "12,67" 1267 +68 12 68 AS/SECTOR06/LAN08/USD12 "12,68" 1268 +69 12 69 AS/SECTOR06/LAN09/USD12 "12,69" 1269 +70 12 70 AS/SECTOR06/LAN10/USD12 "12,70" 1270 +71 12 71 AS/SECTOR06/LAN11/USD12 "12,71" 1271 +72 12 72 AS/SECTOR06/LAN12/USD12 "12,72" 1272 +73 12 73 AS/SECTOR07/LAN01/USD12 "12,73" 1273 +74 12 74 AS/SECTOR07/LAN02/USD12 "12,74" 1274 +75 12 75 AS/SECTOR07/LAN03/USD12 "12,75" 1275 +76 12 76 AS/SECTOR07/LAN04/USD12 "12,76" 1276 +77 12 77 AS/SECTOR07/LAN05/USD12 "12,77" 1277 +78 12 78 AS/SECTOR07/LAN06/USD12 "12,78" 1278 +79 12 79 AS/SECTOR07/LAN07/USD12 "12,79" 1279 +80 12 80 AS/SECTOR07/LAN08/USD12 "12,80" 1280 +81 12 81 AS/SECTOR07/LAN09/USD12 "12,81" 1281 +82 12 82 AS/SECTOR07/LAN10/USD12 "12,82" 1282 +83 12 83 AS/SECTOR07/LAN11/USD12 "12,83" 1283 +84 12 84 AS/SECTOR07/LAN12/USD12 "12,84" 1284 +85 12 85 AS/SECTOR08/LAN01/USD12 "12,85" 1285 +86 12 86 AS/SECTOR08/LAN02/USD12 "12,86" 1286 +87 12 87 AS/SECTOR08/LAN03/USD12 "12,87" 1287 +88 12 88 AS/SECTOR08/LAN04/USD12 "12,88" 1288 +89 12 89 AS/SECTOR08/LAN05/USD12 "12,89" 1289 +90 12 90 AS/SECTOR08/LAN06/USD12 "12,90" 1290 +91 12 91 AS/SECTOR08/LAN07/USD12 "12,91" 1291 +92 12 92 AS/SECTOR08/LAN08/USD12 "12,92" 1292 +93 12 93 AS/SECTOR08/LAN09/USD12 "12,93" 1293 +94 12 94 AS/SECTOR08/LAN10/USD12 "12,94" 1294 +95 12 95 AS/SECTOR08/LAN11/USD12 "12,95" 1295 +96 12 96 AS/SECTOR08/LAN12/USD12 "12,96" 1296 +1 13 1 AS/SECTOR01/LAN01/USD13 "13,1" 1301 +2 13 2 AS/SECTOR01/LAN02/USD13 "13,2" 1302 +3 13 3 AS/SECTOR01/LAN03/USD13 "13,3" 1303 +4 13 4 AS/SECTOR01/LAN04/USD13 "13,4" 1304 +5 13 5 AS/SECTOR01/LAN05/USD13 "13,5" 1305 +6 13 6 AS/SECTOR01/LAN06/USD13 "13,6" 1306 +7 13 7 AS/SECTOR01/LAN07/USD13 "13,7" 1307 +8 13 8 AS/SECTOR01/LAN08/USD13 "13,8" 1308 +9 13 9 AS/SECTOR01/LAN09/USD13 "13,9" 1309 +10 13 10 AS/SECTOR01/LAN10/USD13 "13,10" 1310 +11 13 11 AS/SECTOR01/LAN11/USD13 "13,11" 1311 +12 13 12 AS/SECTOR01/LAN12/USD13 "13,12" 1312 +13 13 13 AS/SECTOR02/LAN01/USD13 "13,13" 1313 +14 13 14 AS/SECTOR02/LAN02/USD13 "13,14" 1314 +15 13 15 AS/SECTOR02/LAN03/USD13 "13,15" 1315 +16 13 16 AS/SECTOR02/LAN04/USD13 "13,16" 1316 +17 13 17 AS/SECTOR02/LAN05/USD13 "13,17" 1317 +18 13 18 AS/SECTOR02/LAN06/USD13 "13,18" 1318 +19 13 19 AS/SECTOR02/LAN07/USD13 "13,19" 1319 +20 13 20 AS/SECTOR02/LAN08/USD13 "13,20" 1320 +21 13 21 AS/SECTOR02/LAN09/USD13 "13,21" 1321 +22 13 22 AS/SECTOR02/LAN10/USD13 "13,22" 1322 +23 13 23 AS/SECTOR02/LAN11/USD13 "13,23" 1323 +24 13 24 AS/SECTOR02/LAN12/USD13 "13,24" 1324 +25 13 25 AS/SECTOR03/LAN01/USD13 "13,25" 1325 +26 13 26 AS/SECTOR03/LAN02/USD13 "13,26" 1326 +27 13 27 AS/SECTOR03/LAN03/USD13 "13,27" 1327 +28 13 28 AS/SECTOR03/LAN04/USD13 "13,28" 1328 +29 13 29 AS/SECTOR03/LAN05/USD13 "13,29" 1329 +30 13 30 AS/SECTOR03/LAN06/USD13 "13,30" 1330 +31 13 31 AS/SECTOR03/LAN07/USD13 "13,31" 1331 +32 13 32 AS/SECTOR03/LAN08/USD13 "13,32" 1332 +33 13 33 AS/SECTOR03/LAN09/USD13 "13,33" 1333 +34 13 34 AS/SECTOR03/LAN10/USD13 "13,34" 1334 +35 13 35 AS/SECTOR03/LAN11/USD13 "13,35" 1335 +36 13 36 AS/SECTOR03/LAN12/USD13 "13,36" 1336 +37 13 37 AS/SECTOR04/LAN01/USD13 "13,37" 1337 +38 13 38 AS/SECTOR04/LAN02/USD13 "13,38" 1338 +39 13 39 AS/SECTOR04/LAN03/USD13 "13,39" 1339 +40 13 40 AS/SECTOR04/LAN04/USD13 "13,40" 1340 +41 13 41 AS/SECTOR04/LAN05/USD13 "13,41" 1341 +42 13 42 AS/SECTOR04/LAN06/USD13 "13,42" 1342 +43 13 43 AS/SECTOR04/LAN07/USD13 "13,43" 1343 +44 13 44 AS/SECTOR04/LAN08/USD13 "13,44" 1344 +45 13 45 AS/SECTOR04/LAN09/USD13 "13,45" 1345 +46 13 46 AS/SECTOR04/LAN10/USD13 "13,46" 1346 +47 13 47 AS/SECTOR04/LAN11/USD13 "13,47" 1347 +48 13 48 AS/SECTOR04/LAN12/USD13 "13,48" 1348 +49 13 49 AS/SECTOR05/LAN01/USD13 "13,49" 1349 +50 13 50 AS/SECTOR05/LAN02/USD13 "13,50" 1350 +51 13 51 AS/SECTOR05/LAN03/USD13 "13,51" 1351 +52 13 52 AS/SECTOR05/LAN04/USD13 "13,52" 1352 +53 13 53 AS/SECTOR05/LAN05/USD13 "13,53" 1353 +54 13 54 AS/SECTOR05/LAN06/USD13 "13,54" 1354 +55 13 55 AS/SECTOR05/LAN07/USD13 "13,55" 1355 +56 13 56 AS/SECTOR05/LAN08/USD13 "13,56" 1356 +57 13 57 AS/SECTOR05/LAN09/USD13 "13,57" 1357 +58 13 58 AS/SECTOR05/LAN10/USD13 "13,58" 1358 +59 13 59 AS/SECTOR05/LAN11/USD13 "13,59" 1359 +60 13 60 AS/SECTOR05/LAN12/USD13 "13,60" 1360 +61 13 61 AS/SECTOR06/LAN01/USD13 "13,61" 1361 +62 13 62 AS/SECTOR06/LAN02/USD13 "13,62" 1362 +63 13 63 AS/SECTOR06/LAN03/USD13 "13,63" 1363 +64 13 64 AS/SECTOR06/LAN04/USD13 "13,64" 1364 +65 13 65 AS/SECTOR06/LAN05/USD13 "13,65" 1365 +66 13 66 AS/SECTOR06/LAN06/USD13 "13,66" 1366 +67 13 67 AS/SECTOR06/LAN07/USD13 "13,67" 1367 +68 13 68 AS/SECTOR06/LAN08/USD13 "13,68" 1368 +69 13 69 AS/SECTOR06/LAN09/USD13 "13,69" 1369 +70 13 70 AS/SECTOR06/LAN10/USD13 "13,70" 1370 +71 13 71 AS/SECTOR06/LAN11/USD13 "13,71" 1371 +72 13 72 AS/SECTOR06/LAN12/USD13 "13,72" 1372 +73 13 73 AS/SECTOR07/LAN01/USD13 "13,73" 1373 +74 13 74 AS/SECTOR07/LAN02/USD13 "13,74" 1374 +75 13 75 AS/SECTOR07/LAN03/USD13 "13,75" 1375 +76 13 76 AS/SECTOR07/LAN04/USD13 "13,76" 1376 +77 13 77 AS/SECTOR07/LAN05/USD13 "13,77" 1377 +78 13 78 AS/SECTOR07/LAN06/USD13 "13,78" 1378 +79 13 79 AS/SECTOR07/LAN07/USD13 "13,79" 1379 +80 13 80 AS/SECTOR07/LAN08/USD13 "13,80" 1380 +81 13 81 AS/SECTOR07/LAN09/USD13 "13,81" 1381 +82 13 82 AS/SECTOR07/LAN10/USD13 "13,82" 1382 +83 13 83 AS/SECTOR07/LAN11/USD13 "13,83" 1383 +84 13 84 AS/SECTOR07/LAN12/USD13 "13,84" 1384 +85 13 85 AS/SECTOR08/LAN01/USD13 "13,85" 1385 +86 13 86 AS/SECTOR08/LAN02/USD13 "13,86" 1386 +87 13 87 AS/SECTOR08/LAN03/USD13 "13,87" 1387 +88 13 88 AS/SECTOR08/LAN04/USD13 "13,88" 1388 +89 13 89 AS/SECTOR08/LAN05/USD13 "13,89" 1389 +90 13 90 AS/SECTOR08/LAN06/USD13 "13,90" 1390 +91 13 91 AS/SECTOR08/LAN07/USD13 "13,91" 1391 +92 13 92 AS/SECTOR08/LAN08/USD13 "13,92" 1392 +93 13 93 AS/SECTOR08/LAN09/USD13 "13,93" 1393 +94 13 94 AS/SECTOR08/LAN10/USD13 "13,94" 1394 +95 13 95 AS/SECTOR08/LAN11/USD13 "13,95" 1395 +96 13 96 AS/SECTOR08/LAN12/USD13 "13,96" 1396 +1 14 1 AS/SECTOR01/LAN01/USD14 "14,1" 1401 +2 14 2 AS/SECTOR01/LAN02/USD14 "14,2" 1402 +3 14 3 AS/SECTOR01/LAN03/USD14 "14,3" 1403 +4 14 4 AS/SECTOR01/LAN04/USD14 "14,4" 1404 +5 14 5 AS/SECTOR01/LAN05/USD14 "14,5" 1405 +6 14 6 AS/SECTOR01/LAN06/USD14 "14,6" 1406 +7 14 7 AS/SECTOR01/LAN07/USD14 "14,7" 1407 +8 14 8 AS/SECTOR01/LAN08/USD14 "14,8" 1408 +9 14 9 AS/SECTOR01/LAN09/USD14 "14,9" 1409 +10 14 10 AS/SECTOR01/LAN10/USD14 "14,10" 1410 +11 14 11 AS/SECTOR01/LAN11/USD14 "14,11" 1411 +12 14 12 AS/SECTOR01/LAN12/USD14 "14,12" 1412 +13 14 13 AS/SECTOR02/LAN01/USD14 "14,13" 1413 +14 14 14 AS/SECTOR02/LAN02/USD14 "14,14" 1414 +15 14 15 AS/SECTOR02/LAN03/USD14 "14,15" 1415 +16 14 16 AS/SECTOR02/LAN04/USD14 "14,16" 1416 +17 14 17 AS/SECTOR02/LAN05/USD14 "14,17" 1417 +18 14 18 AS/SECTOR02/LAN06/USD14 "14,18" 1418 +19 14 19 AS/SECTOR02/LAN07/USD14 "14,19" 1419 +20 14 20 AS/SECTOR02/LAN08/USD14 "14,20" 1420 +21 14 21 AS/SECTOR02/LAN09/USD14 "14,21" 1421 +22 14 22 AS/SECTOR02/LAN10/USD14 "14,22" 1422 +23 14 23 AS/SECTOR02/LAN11/USD14 "14,23" 1423 +24 14 24 AS/SECTOR02/LAN12/USD14 "14,24" 1424 +25 14 25 AS/SECTOR03/LAN01/USD14 "14,25" 1425 +26 14 26 AS/SECTOR03/LAN02/USD14 "14,26" 1426 +27 14 27 AS/SECTOR03/LAN03/USD14 "14,27" 1427 +28 14 28 AS/SECTOR03/LAN04/USD14 "14,28" 1428 +29 14 29 AS/SECTOR03/LAN05/USD14 "14,29" 1429 +30 14 30 AS/SECTOR03/LAN06/USD14 "14,30" 1430 +31 14 31 AS/SECTOR03/LAN07/USD14 "14,31" 1431 +32 14 32 AS/SECTOR03/LAN08/USD14 "14,32" 1432 +33 14 33 AS/SECTOR03/LAN09/USD14 "14,33" 1433 +34 14 34 AS/SECTOR03/LAN10/USD14 "14,34" 1434 +35 14 35 AS/SECTOR03/LAN11/USD14 "14,35" 1435 +36 14 36 AS/SECTOR03/LAN12/USD14 "14,36" 1436 +37 14 37 AS/SECTOR04/LAN01/USD14 "14,37" 1437 +38 14 38 AS/SECTOR04/LAN02/USD14 "14,38" 1438 +39 14 39 AS/SECTOR04/LAN03/USD14 "14,39" 1439 +40 14 40 AS/SECTOR04/LAN04/USD14 "14,40" 1440 +41 14 41 AS/SECTOR04/LAN05/USD14 "14,41" 1441 +42 14 42 AS/SECTOR04/LAN06/USD14 "14,42" 1442 +43 14 43 AS/SECTOR04/LAN07/USD14 "14,43" 1443 +44 14 44 AS/SECTOR04/LAN08/USD14 "14,44" 1444 +45 14 45 AS/SECTOR04/LAN09/USD14 "14,45" 1445 +46 14 46 AS/SECTOR04/LAN10/USD14 "14,46" 1446 +47 14 47 AS/SECTOR04/LAN11/USD14 "14,47" 1447 +48 14 48 AS/SECTOR04/LAN12/USD14 "14,48" 1448 +49 14 49 AS/SECTOR05/LAN01/USD14 "14,49" 1449 +50 14 50 AS/SECTOR05/LAN02/USD14 "14,50" 1450 +51 14 51 AS/SECTOR05/LAN03/USD14 "14,51" 1451 +52 14 52 AS/SECTOR05/LAN04/USD14 "14,52" 1452 +53 14 53 AS/SECTOR05/LAN05/USD14 "14,53" 1453 +54 14 54 AS/SECTOR05/LAN06/USD14 "14,54" 1454 +55 14 55 AS/SECTOR05/LAN07/USD14 "14,55" 1455 +56 14 56 AS/SECTOR05/LAN08/USD14 "14,56" 1456 +57 14 57 AS/SECTOR05/LAN09/USD14 "14,57" 1457 +58 14 58 AS/SECTOR05/LAN10/USD14 "14,58" 1458 +59 14 59 AS/SECTOR05/LAN11/USD14 "14,59" 1459 +60 14 60 AS/SECTOR05/LAN12/USD14 "14,60" 1460 +61 14 61 AS/SECTOR06/LAN01/USD14 "14,61" 1461 +62 14 62 AS/SECTOR06/LAN02/USD14 "14,62" 1462 +63 14 63 AS/SECTOR06/LAN03/USD14 "14,63" 1463 +64 14 64 AS/SECTOR06/LAN04/USD14 "14,64" 1464 +65 14 65 AS/SECTOR06/LAN05/USD14 "14,65" 1465 +66 14 66 AS/SECTOR06/LAN06/USD14 "14,66" 1466 +67 14 67 AS/SECTOR06/LAN07/USD14 "14,67" 1467 +68 14 68 AS/SECTOR06/LAN08/USD14 "14,68" 1468 +69 14 69 AS/SECTOR06/LAN09/USD14 "14,69" 1469 +70 14 70 AS/SECTOR06/LAN10/USD14 "14,70" 1470 +71 14 71 AS/SECTOR06/LAN11/USD14 "14,71" 1471 +72 14 72 AS/SECTOR06/LAN12/USD14 "14,72" 1472 +73 14 73 AS/SECTOR07/LAN01/USD14 "14,73" 1473 +74 14 74 AS/SECTOR07/LAN02/USD14 "14,74" 1474 +75 14 75 AS/SECTOR07/LAN03/USD14 "14,75" 1475 +76 14 76 AS/SECTOR07/LAN04/USD14 "14,76" 1476 +77 14 77 AS/SECTOR07/LAN05/USD14 "14,77" 1477 +78 14 78 AS/SECTOR07/LAN06/USD14 "14,78" 1478 +79 14 79 AS/SECTOR07/LAN07/USD14 "14,79" 1479 +80 14 80 AS/SECTOR07/LAN08/USD14 "14,80" 1480 +81 14 81 AS/SECTOR07/LAN09/USD14 "14,81" 1481 +82 14 82 AS/SECTOR07/LAN10/USD14 "14,82" 1482 +83 14 83 AS/SECTOR07/LAN11/USD14 "14,83" 1483 +84 14 84 AS/SECTOR07/LAN12/USD14 "14,84" 1484 +85 14 85 AS/SECTOR08/LAN01/USD14 "14,85" 1485 +86 14 86 AS/SECTOR08/LAN02/USD14 "14,86" 1486 +87 14 87 AS/SECTOR08/LAN03/USD14 "14,87" 1487 +88 14 88 AS/SECTOR08/LAN04/USD14 "14,88" 1488 +89 14 89 AS/SECTOR08/LAN05/USD14 "14,89" 1489 +90 14 90 AS/SECTOR08/LAN06/USD14 "14,90" 1490 +91 14 91 AS/SECTOR08/LAN07/USD14 "14,91" 1491 +92 14 92 AS/SECTOR08/LAN08/USD14 "14,92" 1492 +93 14 93 AS/SECTOR08/LAN09/USD14 "14,93" 1493 +94 14 94 AS/SECTOR08/LAN10/USD14 "14,94" 1494 +95 14 95 AS/SECTOR08/LAN11/USD14 "14,95" 1495 +96 14 96 AS/SECTOR08/LAN12/USD14 "14,96" 1496 +1 15 1 AS/SECTOR01/LAN01/USD15 "15,1" 1501 +2 15 2 AS/SECTOR01/LAN02/USD15 "15,2" 1502 +3 15 3 AS/SECTOR01/LAN03/USD15 "15,3" 1503 +4 15 4 AS/SECTOR01/LAN04/USD15 "15,4" 1504 +5 15 5 AS/SECTOR01/LAN05/USD15 "15,5" 1505 +6 15 6 AS/SECTOR01/LAN06/USD15 "15,6" 1506 +7 15 7 AS/SECTOR01/LAN07/USD15 "15,7" 1507 +8 15 8 AS/SECTOR01/LAN08/USD15 "15,8" 1508 +9 15 9 AS/SECTOR01/LAN09/USD15 "15,9" 1509 +10 15 10 AS/SECTOR01/LAN10/USD15 "15,10" 1510 +11 15 11 AS/SECTOR01/LAN11/USD15 "15,11" 1511 +12 15 12 AS/SECTOR01/LAN12/USD15 "15,12" 1512 +13 15 13 AS/SECTOR02/LAN01/USD15 "15,13" 1513 +14 15 14 AS/SECTOR02/LAN02/USD15 "15,14" 1514 +15 15 15 AS/SECTOR02/LAN03/USD15 "15,15" 1515 +16 15 16 AS/SECTOR02/LAN04/USD15 "15,16" 1516 +17 15 17 AS/SECTOR02/LAN05/USD15 "15,17" 1517 +18 15 18 AS/SECTOR02/LAN06/USD15 "15,18" 1518 +19 15 19 AS/SECTOR02/LAN07/USD15 "15,19" 1519 +20 15 20 AS/SECTOR02/LAN08/USD15 "15,20" 1520 +21 15 21 AS/SECTOR02/LAN09/USD15 "15,21" 1521 +22 15 22 AS/SECTOR02/LAN10/USD15 "15,22" 1522 +23 15 23 AS/SECTOR02/LAN11/USD15 "15,23" 1523 +24 15 24 AS/SECTOR02/LAN12/USD15 "15,24" 1524 +25 15 25 AS/SECTOR03/LAN01/USD15 "15,25" 1525 +26 15 26 AS/SECTOR03/LAN02/USD15 "15,26" 1526 +27 15 27 AS/SECTOR03/LAN03/USD15 "15,27" 1527 +28 15 28 AS/SECTOR03/LAN04/USD15 "15,28" 1528 +29 15 29 AS/SECTOR03/LAN05/USD15 "15,29" 1529 +30 15 30 AS/SECTOR03/LAN06/USD15 "15,30" 1530 +31 15 31 AS/SECTOR03/LAN07/USD15 "15,31" 1531 +32 15 32 AS/SECTOR03/LAN08/USD15 "15,32" 1532 +33 15 33 AS/SECTOR03/LAN09/USD15 "15,33" 1533 +34 15 34 AS/SECTOR03/LAN10/USD15 "15,34" 1534 +35 15 35 AS/SECTOR03/LAN11/USD15 "15,35" 1535 +36 15 36 AS/SECTOR03/LAN12/USD15 "15,36" 1536 +37 15 37 AS/SECTOR04/LAN01/USD15 "15,37" 1537 +38 15 38 AS/SECTOR04/LAN02/USD15 "15,38" 1538 +39 15 39 AS/SECTOR04/LAN03/USD15 "15,39" 1539 +40 15 40 AS/SECTOR04/LAN04/USD15 "15,40" 1540 +41 15 41 AS/SECTOR04/LAN05/USD15 "15,41" 1541 +42 15 42 AS/SECTOR04/LAN06/USD15 "15,42" 1542 +43 15 43 AS/SECTOR04/LAN07/USD15 "15,43" 1543 +44 15 44 AS/SECTOR04/LAN08/USD15 "15,44" 1544 +45 15 45 AS/SECTOR04/LAN09/USD15 "15,45" 1545 +46 15 46 AS/SECTOR04/LAN10/USD15 "15,46" 1546 +47 15 47 AS/SECTOR04/LAN11/USD15 "15,47" 1547 +48 15 48 AS/SECTOR04/LAN12/USD15 "15,48" 1548 +49 15 49 AS/SECTOR05/LAN01/USD15 "15,49" 1549 +50 15 50 AS/SECTOR05/LAN02/USD15 "15,50" 1550 +51 15 51 AS/SECTOR05/LAN03/USD15 "15,51" 1551 +52 15 52 AS/SECTOR05/LAN04/USD15 "15,52" 1552 +53 15 53 AS/SECTOR05/LAN05/USD15 "15,53" 1553 +54 15 54 AS/SECTOR05/LAN06/USD15 "15,54" 1554 +55 15 55 AS/SECTOR05/LAN07/USD15 "15,55" 1555 +56 15 56 AS/SECTOR05/LAN08/USD15 "15,56" 1556 +57 15 57 AS/SECTOR05/LAN09/USD15 "15,57" 1557 +58 15 58 AS/SECTOR05/LAN10/USD15 "15,58" 1558 +59 15 59 AS/SECTOR05/LAN11/USD15 "15,59" 1559 +60 15 60 AS/SECTOR05/LAN12/USD15 "15,60" 1560 +61 15 61 AS/SECTOR06/LAN01/USD15 "15,61" 1561 +62 15 62 AS/SECTOR06/LAN02/USD15 "15,62" 1562 +63 15 63 AS/SECTOR06/LAN03/USD15 "15,63" 1563 +64 15 64 AS/SECTOR06/LAN04/USD15 "15,64" 1564 +65 15 65 AS/SECTOR06/LAN05/USD15 "15,65" 1565 +66 15 66 AS/SECTOR06/LAN06/USD15 "15,66" 1566 +67 15 67 AS/SECTOR06/LAN07/USD15 "15,67" 1567 +68 15 68 AS/SECTOR06/LAN08/USD15 "15,68" 1568 +69 15 69 AS/SECTOR06/LAN09/USD15 "15,69" 1569 +70 15 70 AS/SECTOR06/LAN10/USD15 "15,70" 1570 +71 15 71 AS/SECTOR06/LAN11/USD15 "15,71" 1571 +72 15 72 AS/SECTOR06/LAN12/USD15 "15,72" 1572 +73 15 73 AS/SECTOR07/LAN01/USD15 "15,73" 1573 +74 15 74 AS/SECTOR07/LAN02/USD15 "15,74" 1574 +75 15 75 AS/SECTOR07/LAN03/USD15 "15,75" 1575 +76 15 76 AS/SECTOR07/LAN04/USD15 "15,76" 1576 +77 15 77 AS/SECTOR07/LAN05/USD15 "15,77" 1577 +78 15 78 AS/SECTOR07/LAN06/USD15 "15,78" 1578 +79 15 79 AS/SECTOR07/LAN07/USD15 "15,79" 1579 +80 15 80 AS/SECTOR07/LAN08/USD15 "15,80" 1580 +81 15 81 AS/SECTOR07/LAN09/USD15 "15,81" 1581 +82 15 82 AS/SECTOR07/LAN10/USD15 "15,82" 1582 +83 15 83 AS/SECTOR07/LAN11/USD15 "15,83" 1583 +84 15 84 AS/SECTOR07/LAN12/USD15 "15,84" 1584 +85 15 85 AS/SECTOR08/LAN01/USD15 "15,85" 1585 +86 15 86 AS/SECTOR08/LAN02/USD15 "15,86" 1586 +87 15 87 AS/SECTOR08/LAN03/USD15 "15,87" 1587 +88 15 88 AS/SECTOR08/LAN04/USD15 "15,88" 1588 +89 15 89 AS/SECTOR08/LAN05/USD15 "15,89" 1589 +90 15 90 AS/SECTOR08/LAN06/USD15 "15,90" 1590 +91 15 91 AS/SECTOR08/LAN07/USD15 "15,91" 1591 +92 15 92 AS/SECTOR08/LAN08/USD15 "15,92" 1592 +93 15 93 AS/SECTOR08/LAN09/USD15 "15,93" 1593 +94 15 94 AS/SECTOR08/LAN10/USD15 "15,94" 1594 +95 15 95 AS/SECTOR08/LAN11/USD15 "15,95" 1595 +96 15 96 AS/SECTOR08/LAN12/USD15 "15,96" 1596 +11 16 1 AS/SECTOR01/LAN11/USD16 "16,1" 1601 +15 16 2 AS/SECTOR02/LAN03/USD16 "16,2" 1602 +35 16 3 AS/SECTOR03/LAN11/USD16 "16,3" 1603 +39 16 4 AS/SECTOR04/LAN03/USD16 "16,4" 1604 +59 16 5 AS/SECTOR05/LAN11/USD16 "16,5" 1605 +63 16 6 AS/SECTOR06/LAN03/USD16 "16,6" 1606 +83 16 7 AS/SECTOR07/LAN11/USD16 "16,7" 1607 +87 16 8 AS/SECTOR08/LAN03/USD16 "16,8" 1608 +13 17 1 AS/SECTOR02/LAN01/USD17 "17,1" 1701 +37 17 2 AS/SECTOR04/LAN01/USD17 "17,2" 1702 +61 17 3 AS/SECTOR06/LAN01/USD17 "17,3" 1703 +85 17 4 AS/SECTOR08/LAN01/USD17 "17,4" 1704 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Sectors b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Sectors new file mode 100644 index 000000000..cd3b42629 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.Sectors @@ -0,0 +1,1116 @@ +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +1 7 1 AS/SECTOR01/LAN01/USD07 "7,1" 0701 +1 8 1 AS/SECTOR01/LAN01/USD08 "8,1" 0801 +1 9 1 AS/SECTOR01/LAN01/USD09 "9,1" 0901 +1 10 1 AS/SECTOR01/LAN01/USD10 "10,1" 1001 +1 11 1 AS/SECTOR01/LAN01/USD11 "11,1" 1101 +1 12 1 AS/SECTOR01/LAN01/USD12 "12,1" 1201 +1 13 1 AS/SECTOR01/LAN01/USD13 "13,1" 1301 +1 14 1 AS/SECTOR01/LAN01/USD14 "14,1" 1401 +1 15 1 AS/SECTOR01/LAN01/USD15 "15,1" 1501 +2 7 2 AS/SECTOR01/LAN02/USD07 "7,2" 0702 +2 8 2 AS/SECTOR01/LAN02/USD08 "8,2" 0802 +2 9 2 AS/SECTOR01/LAN02/USD09 "9,2" 0902 +2 10 2 AS/SECTOR01/LAN02/USD10 "10,2" 1002 +2 11 2 AS/SECTOR01/LAN02/USD11 "11,2" 1102 +2 12 2 AS/SECTOR01/LAN02/USD12 "12,2" 1202 +2 13 2 AS/SECTOR01/LAN02/USD13 "13,2" 1302 +2 14 2 AS/SECTOR01/LAN02/USD14 "14,2" 1402 +2 15 2 AS/SECTOR01/LAN02/USD15 "15,2" 1502 +3 1 1 AS/SECTOR01/LAN03/USD01 "1,1" 0101 +3 2 1 AS/SECTOR01/LAN03/USD02 "2,1" 0201 +3 3 2 AS/SECTOR01/LAN03/USD03 "3,2" 0302 +3 4 2 AS/SECTOR01/LAN03/USD04 "4,2" 0402 +3 5 2 AS/SECTOR01/LAN03/USD05 "5,2" 0502 +3 6 2 AS/SECTOR01/LAN03/USD06 "6,2" 0602 +3 7 3 AS/SECTOR01/LAN03/USD07 "7,3" 0703 +3 8 3 AS/SECTOR01/LAN03/USD08 "8,3" 0803 +3 9 3 AS/SECTOR01/LAN03/USD09 "9,3" 0903 +3 10 3 AS/SECTOR01/LAN03/USD10 "10,3" 1003 +3 11 3 AS/SECTOR01/LAN03/USD11 "11,3" 1103 +3 12 3 AS/SECTOR01/LAN03/USD12 "12,3" 1203 +3 13 3 AS/SECTOR01/LAN03/USD13 "13,3" 1303 +3 14 3 AS/SECTOR01/LAN03/USD14 "14,3" 1403 +3 15 3 AS/SECTOR01/LAN03/USD15 "15,3" 1503 +4 7 4 AS/SECTOR01/LAN04/USD07 "7,4" 0704 +4 8 4 AS/SECTOR01/LAN04/USD08 "8,4" 0804 +4 9 4 AS/SECTOR01/LAN04/USD09 "9,4" 0904 +4 10 4 AS/SECTOR01/LAN04/USD10 "10,4" 1004 +4 11 4 AS/SECTOR01/LAN04/USD11 "11,4" 1104 +4 12 4 AS/SECTOR01/LAN04/USD12 "12,4" 1204 +4 13 4 AS/SECTOR01/LAN04/USD13 "13,4" 1304 +4 14 4 AS/SECTOR01/LAN04/USD14 "14,4" 1404 +4 15 4 AS/SECTOR01/LAN04/USD15 "15,4" 1504 +5 3 3 AS/SECTOR01/LAN05/USD03 "3,3" 0303 +5 4 3 AS/SECTOR01/LAN05/USD04 "4,3" 0403 +5 5 3 AS/SECTOR01/LAN05/USD05 "5,3" 0503 +5 6 3 AS/SECTOR01/LAN05/USD06 "6,3" 0603 +5 7 5 AS/SECTOR01/LAN05/USD07 "7,5" 0705 +5 8 5 AS/SECTOR01/LAN05/USD08 "8,5" 0805 +5 9 5 AS/SECTOR01/LAN05/USD09 "9,5" 0905 +5 10 5 AS/SECTOR01/LAN05/USD10 "10,5" 1005 +5 11 5 AS/SECTOR01/LAN05/USD11 "11,5" 1105 +5 12 5 AS/SECTOR01/LAN05/USD12 "12,5" 1205 +5 13 5 AS/SECTOR01/LAN05/USD13 "13,5" 1305 +5 14 5 AS/SECTOR01/LAN05/USD14 "14,5" 1405 +5 15 5 AS/SECTOR01/LAN05/USD15 "15,5" 1505 +6 7 6 AS/SECTOR01/LAN06/USD07 "7,6" 0706 +6 8 6 AS/SECTOR01/LAN06/USD08 "8,6" 0806 +6 9 6 AS/SECTOR01/LAN06/USD09 "9,6" 0906 +6 10 6 AS/SECTOR01/LAN06/USD10 "10,6" 1006 +6 11 6 AS/SECTOR01/LAN06/USD11 "11,6" 1106 +6 12 6 AS/SECTOR01/LAN06/USD12 "12,6" 1206 +6 13 6 AS/SECTOR01/LAN06/USD13 "13,6" 1306 +6 14 6 AS/SECTOR01/LAN06/USD14 "14,6" 1406 +6 15 6 AS/SECTOR01/LAN06/USD15 "15,6" 1506 +7 1 2 AS/SECTOR01/LAN07/USD01 "1,2" 0102 +7 2 2 AS/SECTOR01/LAN07/USD02 "2,2" 0202 +7 3 4 AS/SECTOR01/LAN07/USD03 "3,4" 0304 +7 4 4 AS/SECTOR01/LAN07/USD04 "4,4" 0404 +7 5 4 AS/SECTOR01/LAN07/USD05 "5,4" 0504 +7 6 4 AS/SECTOR01/LAN07/USD06 "6,4" 0604 +7 7 7 AS/SECTOR01/LAN07/USD07 "7,7" 0707 +7 8 7 AS/SECTOR01/LAN07/USD08 "8,7" 0807 +7 9 7 AS/SECTOR01/LAN07/USD09 "9,7" 0907 +7 10 7 AS/SECTOR01/LAN07/USD10 "10,7" 1007 +7 11 7 AS/SECTOR01/LAN07/USD11 "11,7" 1107 +7 12 7 AS/SECTOR01/LAN07/USD12 "12,7" 1207 +7 13 7 AS/SECTOR01/LAN07/USD13 "13,7" 1307 +7 14 7 AS/SECTOR01/LAN07/USD14 "14,7" 1407 +7 15 7 AS/SECTOR01/LAN07/USD15 "15,7" 1507 +8 7 8 AS/SECTOR01/LAN08/USD07 "7,8" 0708 +8 8 8 AS/SECTOR01/LAN08/USD08 "8,8" 0808 +8 9 8 AS/SECTOR01/LAN08/USD09 "9,8" 0908 +8 10 8 AS/SECTOR01/LAN08/USD10 "10,8" 1008 +8 11 8 AS/SECTOR01/LAN08/USD11 "11,8" 1108 +8 12 8 AS/SECTOR01/LAN08/USD12 "12,8" 1208 +8 13 8 AS/SECTOR01/LAN08/USD13 "13,8" 1308 +8 14 8 AS/SECTOR01/LAN08/USD14 "14,8" 1408 +8 15 8 AS/SECTOR01/LAN08/USD15 "15,8" 1508 +9 3 5 AS/SECTOR01/LAN09/USD03 "3,5" 0305 +9 4 5 AS/SECTOR01/LAN09/USD04 "4,5" 0405 +9 5 5 AS/SECTOR01/LAN09/USD05 "5,5" 0505 +9 6 5 AS/SECTOR01/LAN09/USD06 "6,5" 0605 +9 7 9 AS/SECTOR01/LAN09/USD07 "7,9" 0709 +9 8 9 AS/SECTOR01/LAN09/USD08 "8,9" 0809 +9 9 9 AS/SECTOR01/LAN09/USD09 "9,9" 0909 +9 10 9 AS/SECTOR01/LAN09/USD10 "10,9" 1009 +9 11 9 AS/SECTOR01/LAN09/USD11 "11,9" 1109 +9 12 9 AS/SECTOR01/LAN09/USD12 "12,9" 1209 +9 13 9 AS/SECTOR01/LAN09/USD13 "13,9" 1309 +9 14 9 AS/SECTOR01/LAN09/USD14 "14,9" 1409 +9 15 9 AS/SECTOR01/LAN09/USD15 "15,9" 1509 +10 7 10 AS/SECTOR01/LAN10/USD07 "7,10" 0710 +10 8 10 AS/SECTOR01/LAN10/USD08 "8,10" 0810 +10 9 10 AS/SECTOR01/LAN10/USD09 "9,10" 0910 +10 10 10 AS/SECTOR01/LAN10/USD10 "10,10" 1010 +10 11 10 AS/SECTOR01/LAN10/USD11 "11,10" 1110 +10 12 10 AS/SECTOR01/LAN10/USD12 "12,10" 1210 +10 13 10 AS/SECTOR01/LAN10/USD13 "13,10" 1310 +10 14 10 AS/SECTOR01/LAN10/USD14 "14,10" 1410 +10 15 10 AS/SECTOR01/LAN10/USD15 "15,10" 1510 +11 1 3 AS/SECTOR01/LAN11/USD01 "1,3" 0103 +11 2 3 AS/SECTOR01/LAN11/USD02 "2,3" 0203 +11 3 6 AS/SECTOR01/LAN11/USD03 "3,6" 0306 +11 4 6 AS/SECTOR01/LAN11/USD04 "4,6" 0406 +11 5 6 AS/SECTOR01/LAN11/USD05 "5,6" 0506 +11 6 6 AS/SECTOR01/LAN11/USD06 "6,6" 0606 +11 7 11 AS/SECTOR01/LAN11/USD07 "7,11" 0711 +11 8 11 AS/SECTOR01/LAN11/USD08 "8,11" 0811 +11 9 11 AS/SECTOR01/LAN11/USD09 "9,11" 0911 +11 16 1 AS/SECTOR01/LAN11/USD16 "16,1" 1601 +11 10 11 AS/SECTOR01/LAN11/USD10 "10,11" 1011 +11 11 11 AS/SECTOR01/LAN11/USD11 "11,11" 1111 +11 12 11 AS/SECTOR01/LAN11/USD12 "12,11" 1211 +11 13 11 AS/SECTOR01/LAN11/USD13 "13,11" 1311 +11 14 11 AS/SECTOR01/LAN11/USD14 "14,11" 1411 +11 15 11 AS/SECTOR01/LAN11/USD15 "15,11" 1511 +12 7 12 AS/SECTOR01/LAN12/USD07 "7,12" 0712 +12 8 12 AS/SECTOR01/LAN12/USD08 "8,12" 0812 +12 9 12 AS/SECTOR01/LAN12/USD09 "9,12" 0912 +12 10 12 AS/SECTOR01/LAN12/USD10 "10,12" 1012 +12 11 12 AS/SECTOR01/LAN12/USD11 "11,12" 1112 +12 12 12 AS/SECTOR01/LAN12/USD12 "12,12" 1212 +12 13 12 AS/SECTOR01/LAN12/USD13 "13,12" 1312 +12 14 12 AS/SECTOR01/LAN12/USD14 "14,12" 1412 +12 15 12 AS/SECTOR01/LAN12/USD15 "15,12" 1512 +13 3 7 AS/SECTOR02/LAN01/USD03 "3,7" 0307 +13 4 7 AS/SECTOR02/LAN01/USD04 "4,7" 0407 +13 5 7 AS/SECTOR02/LAN01/USD05 "5,7" 0507 +13 6 7 AS/SECTOR02/LAN01/USD06 "6,7" 0607 +13 7 13 AS/SECTOR02/LAN01/USD07 "7,13" 0713 +13 8 13 AS/SECTOR02/LAN01/USD08 "8,13" 0813 +13 9 13 AS/SECTOR02/LAN01/USD09 "9,13" 0913 +13 10 13 AS/SECTOR02/LAN01/USD10 "10,13" 1013 +13 11 13 AS/SECTOR02/LAN01/USD11 "11,13" 1113 +13 17 1 AS/SECTOR02/LAN01/USD17 "17,1" 1701 +13 12 13 AS/SECTOR02/LAN01/USD12 "12,13" 1213 +13 13 13 AS/SECTOR02/LAN01/USD13 "13,13" 1313 +13 14 13 AS/SECTOR02/LAN01/USD14 "14,13" 1413 +13 15 13 AS/SECTOR02/LAN01/USD15 "15,13" 1513 +14 7 14 AS/SECTOR02/LAN02/USD07 "7,14" 0714 +14 8 14 AS/SECTOR02/LAN02/USD08 "8,14" 0814 +14 9 14 AS/SECTOR02/LAN02/USD09 "9,14" 0914 +14 10 14 AS/SECTOR02/LAN02/USD10 "10,14" 1014 +14 11 14 AS/SECTOR02/LAN02/USD11 "11,14" 1114 +14 12 14 AS/SECTOR02/LAN02/USD12 "12,14" 1214 +14 13 14 AS/SECTOR02/LAN02/USD13 "13,14" 1314 +14 14 14 AS/SECTOR02/LAN02/USD14 "14,14" 1414 +14 15 14 AS/SECTOR02/LAN02/USD15 "15,14" 1514 +15 1 4 AS/SECTOR02/LAN03/USD01 "1,4" 0104 +15 2 4 AS/SECTOR02/LAN03/USD02 "2,4" 0204 +15 3 8 AS/SECTOR02/LAN03/USD03 "3,8" 0308 +15 4 8 AS/SECTOR02/LAN03/USD04 "4,8" 0408 +15 5 8 AS/SECTOR02/LAN03/USD05 "5,8" 0508 +15 6 8 AS/SECTOR02/LAN03/USD06 "6,8" 0608 +15 7 15 AS/SECTOR02/LAN03/USD07 "7,15" 0715 +15 8 15 AS/SECTOR02/LAN03/USD08 "8,15" 0815 +15 9 15 AS/SECTOR02/LAN03/USD09 "9,15" 0915 +15 16 2 AS/SECTOR02/LAN03/USD16 "16,2" 1602 +15 10 15 AS/SECTOR02/LAN03/USD10 "10,15" 1015 +15 11 15 AS/SECTOR02/LAN03/USD11 "11,15" 1115 +15 12 15 AS/SECTOR02/LAN03/USD12 "12,15" 1215 +15 13 15 AS/SECTOR02/LAN03/USD13 "13,15" 1315 +15 14 15 AS/SECTOR02/LAN03/USD14 "14,15" 1415 +15 15 15 AS/SECTOR02/LAN03/USD15 "15,15" 1515 +16 7 16 AS/SECTOR02/LAN04/USD07 "7,16" 0716 +16 8 16 AS/SECTOR02/LAN04/USD08 "8,16" 0816 +16 9 16 AS/SECTOR02/LAN04/USD09 "9,16" 0916 +16 10 16 AS/SECTOR02/LAN04/USD10 "10,16" 1016 +16 11 16 AS/SECTOR02/LAN04/USD11 "11,16" 1116 +16 12 16 AS/SECTOR02/LAN04/USD12 "12,16" 1216 +16 13 16 AS/SECTOR02/LAN04/USD13 "13,16" 1316 +16 14 16 AS/SECTOR02/LAN04/USD14 "14,16" 1416 +16 15 16 AS/SECTOR02/LAN04/USD15 "15,16" 1516 +17 3 9 AS/SECTOR02/LAN05/USD03 "3,9" 0309 +17 4 9 AS/SECTOR02/LAN05/USD04 "4,9" 0409 +17 5 9 AS/SECTOR02/LAN05/USD05 "5,9" 0509 +17 6 9 AS/SECTOR02/LAN05/USD06 "6,9" 0609 +17 7 17 AS/SECTOR02/LAN05/USD07 "7,17" 0717 +17 8 17 AS/SECTOR02/LAN05/USD08 "8,17" 0817 +17 9 17 AS/SECTOR02/LAN05/USD09 "9,17" 0917 +17 10 17 AS/SECTOR02/LAN05/USD10 "10,17" 1017 +17 11 17 AS/SECTOR02/LAN05/USD11 "11,17" 1117 +17 12 17 AS/SECTOR02/LAN05/USD12 "12,17" 1217 +17 13 17 AS/SECTOR02/LAN05/USD13 "13,17" 1317 +17 14 17 AS/SECTOR02/LAN05/USD14 "14,17" 1417 +17 15 17 AS/SECTOR02/LAN05/USD15 "15,17" 1517 +18 7 18 AS/SECTOR02/LAN06/USD07 "7,18" 0718 +18 8 18 AS/SECTOR02/LAN06/USD08 "8,18" 0818 +18 9 18 AS/SECTOR02/LAN06/USD09 "9,18" 0918 +18 10 18 AS/SECTOR02/LAN06/USD10 "10,18" 1018 +18 11 18 AS/SECTOR02/LAN06/USD11 "11,18" 1118 +18 12 18 AS/SECTOR02/LAN06/USD12 "12,18" 1218 +18 13 18 AS/SECTOR02/LAN06/USD13 "13,18" 1318 +18 14 18 AS/SECTOR02/LAN06/USD14 "14,18" 1418 +18 15 18 AS/SECTOR02/LAN06/USD15 "15,18" 1518 +19 1 5 AS/SECTOR02/LAN07/USD01 "1,5" 0105 +19 2 5 AS/SECTOR02/LAN07/USD02 "2,5" 0205 +19 3 10 AS/SECTOR02/LAN07/USD03 "3,10" 0310 +19 4 10 AS/SECTOR02/LAN07/USD04 "4,10" 0410 +19 5 10 AS/SECTOR02/LAN07/USD05 "5,10" 0510 +19 6 10 AS/SECTOR02/LAN07/USD06 "6,10" 0610 +19 7 19 AS/SECTOR02/LAN07/USD07 "7,19" 0719 +19 8 19 AS/SECTOR02/LAN07/USD08 "8,19" 0819 +19 9 19 AS/SECTOR02/LAN07/USD09 "9,19" 0919 +19 10 19 AS/SECTOR02/LAN07/USD10 "10,19" 1019 +19 11 19 AS/SECTOR02/LAN07/USD11 "11,19" 1119 +19 12 19 AS/SECTOR02/LAN07/USD12 "12,19" 1219 +19 13 19 AS/SECTOR02/LAN07/USD13 "13,19" 1319 +19 14 19 AS/SECTOR02/LAN07/USD14 "14,19" 1419 +19 15 19 AS/SECTOR02/LAN07/USD15 "15,19" 1519 +20 7 20 AS/SECTOR02/LAN08/USD07 "7,20" 0720 +20 8 20 AS/SECTOR02/LAN08/USD08 "8,20" 0820 +20 9 20 AS/SECTOR02/LAN08/USD09 "9,20" 0920 +20 10 20 AS/SECTOR02/LAN08/USD10 "10,20" 1020 +20 11 20 AS/SECTOR02/LAN08/USD11 "11,20" 1120 +20 12 20 AS/SECTOR02/LAN08/USD12 "12,20" 1220 +20 13 20 AS/SECTOR02/LAN08/USD13 "13,20" 1320 +20 14 20 AS/SECTOR02/LAN08/USD14 "14,20" 1420 +20 15 20 AS/SECTOR02/LAN08/USD15 "15,20" 1520 +21 3 11 AS/SECTOR02/LAN09/USD03 "3,11" 0311 +21 4 11 AS/SECTOR02/LAN09/USD04 "4,11" 0411 +21 5 11 AS/SECTOR02/LAN09/USD05 "5,11" 0511 +21 6 11 AS/SECTOR02/LAN09/USD06 "6,11" 0611 +21 7 21 AS/SECTOR02/LAN09/USD07 "7,21" 0721 +21 8 21 AS/SECTOR02/LAN09/USD08 "8,21" 0821 +21 9 21 AS/SECTOR02/LAN09/USD09 "9,21" 0921 +21 10 21 AS/SECTOR02/LAN09/USD10 "10,21" 1021 +21 11 21 AS/SECTOR02/LAN09/USD11 "11,21" 1121 +21 12 21 AS/SECTOR02/LAN09/USD12 "12,21" 1221 +21 13 21 AS/SECTOR02/LAN09/USD13 "13,21" 1321 +21 14 21 AS/SECTOR02/LAN09/USD14 "14,21" 1421 +21 15 21 AS/SECTOR02/LAN09/USD15 "15,21" 1521 +22 7 22 AS/SECTOR02/LAN10/USD07 "7,22" 0722 +22 8 22 AS/SECTOR02/LAN10/USD08 "8,22" 0822 +22 9 22 AS/SECTOR02/LAN10/USD09 "9,22" 0922 +22 10 22 AS/SECTOR02/LAN10/USD10 "10,22" 1022 +22 11 22 AS/SECTOR02/LAN10/USD11 "11,22" 1122 +22 12 22 AS/SECTOR02/LAN10/USD12 "12,22" 1222 +22 13 22 AS/SECTOR02/LAN10/USD13 "13,22" 1322 +22 14 22 AS/SECTOR02/LAN10/USD14 "14,22" 1422 +22 15 22 AS/SECTOR02/LAN10/USD15 "15,22" 1522 +23 1 6 AS/SECTOR02/LAN11/USD01 "1,6" 0106 +23 2 6 AS/SECTOR02/LAN11/USD02 "2,6" 0206 +23 3 12 AS/SECTOR02/LAN11/USD03 "3,12" 0312 +23 4 12 AS/SECTOR02/LAN11/USD04 "4,12" 0412 +23 5 12 AS/SECTOR02/LAN11/USD05 "5,12" 0512 +23 6 12 AS/SECTOR02/LAN11/USD06 "6,12" 0612 +23 7 23 AS/SECTOR02/LAN11/USD07 "7,23" 0723 +23 8 23 AS/SECTOR02/LAN11/USD08 "8,23" 0823 +23 9 23 AS/SECTOR02/LAN11/USD09 "9,23" 0923 +23 10 23 AS/SECTOR02/LAN11/USD10 "10,23" 1023 +23 11 23 AS/SECTOR02/LAN11/USD11 "11,23" 1123 +23 12 23 AS/SECTOR02/LAN11/USD12 "12,23" 1223 +23 13 23 AS/SECTOR02/LAN11/USD13 "13,23" 1323 +23 14 23 AS/SECTOR02/LAN11/USD14 "14,23" 1423 +23 15 23 AS/SECTOR02/LAN11/USD15 "15,23" 1523 +24 7 24 AS/SECTOR02/LAN12/USD07 "7,24" 0724 +24 8 24 AS/SECTOR02/LAN12/USD08 "8,24" 0824 +24 9 24 AS/SECTOR02/LAN12/USD09 "9,24" 0924 +24 10 24 AS/SECTOR02/LAN12/USD10 "10,24" 1024 +24 11 24 AS/SECTOR02/LAN12/USD11 "11,24" 1124 +24 12 24 AS/SECTOR02/LAN12/USD12 "12,24" 1224 +24 13 24 AS/SECTOR02/LAN12/USD13 "13,24" 1324 +24 14 24 AS/SECTOR02/LAN12/USD14 "14,24" 1424 +24 15 24 AS/SECTOR02/LAN12/USD15 "15,24" 1524 +25 3 13 AS/SECTOR03/LAN01/USD03 "3,13" 0313 +25 4 13 AS/SECTOR03/LAN01/USD04 "4,13" 0413 +25 5 13 AS/SECTOR03/LAN01/USD05 "5,13" 0513 +25 6 13 AS/SECTOR03/LAN01/USD06 "6,13" 0613 +25 7 25 AS/SECTOR03/LAN01/USD07 "7,25" 0725 +25 8 25 AS/SECTOR03/LAN01/USD08 "8,25" 0825 +25 9 25 AS/SECTOR03/LAN01/USD09 "9,25" 0925 +25 10 25 AS/SECTOR03/LAN01/USD10 "10,25" 1025 +25 11 25 AS/SECTOR03/LAN01/USD11 "11,25" 1125 +25 12 25 AS/SECTOR03/LAN01/USD12 "12,25" 1225 +25 13 25 AS/SECTOR03/LAN01/USD13 "13,25" 1325 +25 14 25 AS/SECTOR03/LAN01/USD14 "14,25" 1425 +25 15 25 AS/SECTOR03/LAN01/USD15 "15,25" 1525 +26 7 26 AS/SECTOR03/LAN02/USD07 "7,26" 0726 +26 8 26 AS/SECTOR03/LAN02/USD08 "8,26" 0826 +26 9 26 AS/SECTOR03/LAN02/USD09 "9,26" 0926 +26 10 26 AS/SECTOR03/LAN02/USD10 "10,26" 1026 +26 11 26 AS/SECTOR03/LAN02/USD11 "11,26" 1126 +26 12 26 AS/SECTOR03/LAN02/USD12 "12,26" 1226 +26 13 26 AS/SECTOR03/LAN02/USD13 "13,26" 1326 +26 14 26 AS/SECTOR03/LAN02/USD14 "14,26" 1426 +26 15 26 AS/SECTOR03/LAN02/USD15 "15,26" 1526 +27 1 7 AS/SECTOR03/LAN03/USD01 "1,7" 0107 +27 2 7 AS/SECTOR03/LAN03/USD02 "2,7" 0207 +27 3 14 AS/SECTOR03/LAN03/USD03 "3,14" 0314 +27 4 14 AS/SECTOR03/LAN03/USD04 "4,14" 0414 +27 5 14 AS/SECTOR03/LAN03/USD05 "5,14" 0514 +27 6 14 AS/SECTOR03/LAN03/USD06 "6,14" 0614 +27 7 27 AS/SECTOR03/LAN03/USD07 "7,27" 0727 +27 8 27 AS/SECTOR03/LAN03/USD08 "8,27" 0827 +27 9 27 AS/SECTOR03/LAN03/USD09 "9,27" 0927 +27 10 27 AS/SECTOR03/LAN03/USD10 "10,27" 1027 +27 11 27 AS/SECTOR03/LAN03/USD11 "11,27" 1127 +27 12 27 AS/SECTOR03/LAN03/USD12 "12,27" 1227 +27 13 27 AS/SECTOR03/LAN03/USD13 "13,27" 1327 +27 14 27 AS/SECTOR03/LAN03/USD14 "14,27" 1427 +27 15 27 AS/SECTOR03/LAN03/USD15 "15,27" 1527 +28 7 28 AS/SECTOR03/LAN04/USD07 "7,28" 0728 +28 8 28 AS/SECTOR03/LAN04/USD08 "8,28" 0828 +28 9 28 AS/SECTOR03/LAN04/USD09 "9,28" 0928 +28 10 28 AS/SECTOR03/LAN04/USD10 "10,28" 1028 +28 11 28 AS/SECTOR03/LAN04/USD11 "11,28" 1128 +28 12 28 AS/SECTOR03/LAN04/USD12 "12,28" 1228 +28 13 28 AS/SECTOR03/LAN04/USD13 "13,28" 1328 +28 14 28 AS/SECTOR03/LAN04/USD14 "14,28" 1428 +28 15 28 AS/SECTOR03/LAN04/USD15 "15,28" 1528 +29 3 15 AS/SECTOR03/LAN05/USD03 "3,15" 0315 +29 4 15 AS/SECTOR03/LAN05/USD04 "4,15" 0415 +29 5 15 AS/SECTOR03/LAN05/USD05 "5,15" 0515 +29 6 15 AS/SECTOR03/LAN05/USD06 "6,15" 0615 +29 7 29 AS/SECTOR03/LAN05/USD07 "7,29" 0729 +29 8 29 AS/SECTOR03/LAN05/USD08 "8,29" 0829 +29 9 29 AS/SECTOR03/LAN05/USD09 "9,29" 0929 +29 10 29 AS/SECTOR03/LAN05/USD10 "10,29" 1029 +29 11 29 AS/SECTOR03/LAN05/USD11 "11,29" 1129 +29 12 29 AS/SECTOR03/LAN05/USD12 "12,29" 1229 +29 13 29 AS/SECTOR03/LAN05/USD13 "13,29" 1329 +29 14 29 AS/SECTOR03/LAN05/USD14 "14,29" 1429 +29 15 29 AS/SECTOR03/LAN05/USD15 "15,29" 1529 +30 7 30 AS/SECTOR03/LAN06/USD07 "7,30" 0730 +30 8 30 AS/SECTOR03/LAN06/USD08 "8,30" 0830 +30 9 30 AS/SECTOR03/LAN06/USD09 "9,30" 0930 +30 10 30 AS/SECTOR03/LAN06/USD10 "10,30" 1030 +30 11 30 AS/SECTOR03/LAN06/USD11 "11,30" 1130 +30 12 30 AS/SECTOR03/LAN06/USD12 "12,30" 1230 +30 13 30 AS/SECTOR03/LAN06/USD13 "13,30" 1330 +30 14 30 AS/SECTOR03/LAN06/USD14 "14,30" 1430 +30 15 30 AS/SECTOR03/LAN06/USD15 "15,30" 1530 +31 1 8 AS/SECTOR03/LAN07/USD01 "1,8" 0108 +31 2 8 AS/SECTOR03/LAN07/USD02 "2,8" 0208 +31 3 16 AS/SECTOR03/LAN07/USD03 "3,16" 0316 +31 4 16 AS/SECTOR03/LAN07/USD04 "4,16" 0416 +31 5 16 AS/SECTOR03/LAN07/USD05 "5,16" 0516 +31 6 16 AS/SECTOR03/LAN07/USD06 "6,16" 0616 +31 7 31 AS/SECTOR03/LAN07/USD07 "7,31" 0731 +31 8 31 AS/SECTOR03/LAN07/USD08 "8,31" 0831 +31 9 31 AS/SECTOR03/LAN07/USD09 "9,31" 0931 +31 10 31 AS/SECTOR03/LAN07/USD10 "10,31" 1031 +31 11 31 AS/SECTOR03/LAN07/USD11 "11,31" 1131 +31 12 31 AS/SECTOR03/LAN07/USD12 "12,31" 1231 +31 13 31 AS/SECTOR03/LAN07/USD13 "13,31" 1331 +31 14 31 AS/SECTOR03/LAN07/USD14 "14,31" 1431 +31 15 31 AS/SECTOR03/LAN07/USD15 "15,31" 1531 +32 7 32 AS/SECTOR03/LAN08/USD07 "7,32" 0732 +32 8 32 AS/SECTOR03/LAN08/USD08 "8,32" 0832 +32 9 32 AS/SECTOR03/LAN08/USD09 "9,32" 0932 +32 10 32 AS/SECTOR03/LAN08/USD10 "10,32" 1032 +32 11 32 AS/SECTOR03/LAN08/USD11 "11,32" 1132 +32 12 32 AS/SECTOR03/LAN08/USD12 "12,32" 1232 +32 13 32 AS/SECTOR03/LAN08/USD13 "13,32" 1332 +32 14 32 AS/SECTOR03/LAN08/USD14 "14,32" 1432 +32 15 32 AS/SECTOR03/LAN08/USD15 "15,32" 1532 +33 3 17 AS/SECTOR03/LAN09/USD03 "3,17" 0317 +33 4 17 AS/SECTOR03/LAN09/USD04 "4,17" 0417 +33 5 17 AS/SECTOR03/LAN09/USD05 "5,17" 0517 +33 6 17 AS/SECTOR03/LAN09/USD06 "6,17" 0617 +33 7 33 AS/SECTOR03/LAN09/USD07 "7,33" 0733 +33 8 33 AS/SECTOR03/LAN09/USD08 "8,33" 0833 +33 9 33 AS/SECTOR03/LAN09/USD09 "9,33" 0933 +33 10 33 AS/SECTOR03/LAN09/USD10 "10,33" 1033 +33 11 33 AS/SECTOR03/LAN09/USD11 "11,33" 1133 +33 12 33 AS/SECTOR03/LAN09/USD12 "12,33" 1233 +33 13 33 AS/SECTOR03/LAN09/USD13 "13,33" 1333 +33 14 33 AS/SECTOR03/LAN09/USD14 "14,33" 1433 +33 15 33 AS/SECTOR03/LAN09/USD15 "15,33" 1533 +34 7 34 AS/SECTOR03/LAN10/USD07 "7,34" 0734 +34 8 34 AS/SECTOR03/LAN10/USD08 "8,34" 0834 +34 9 34 AS/SECTOR03/LAN10/USD09 "9,34" 0934 +34 10 34 AS/SECTOR03/LAN10/USD10 "10,34" 1034 +34 11 34 AS/SECTOR03/LAN10/USD11 "11,34" 1134 +34 12 34 AS/SECTOR03/LAN10/USD12 "12,34" 1234 +34 13 34 AS/SECTOR03/LAN10/USD13 "13,34" 1334 +34 14 34 AS/SECTOR03/LAN10/USD14 "14,34" 1434 +34 15 34 AS/SECTOR03/LAN10/USD15 "15,34" 1534 +35 1 9 AS/SECTOR03/LAN11/USD01 "1,9" 0109 +35 2 9 AS/SECTOR03/LAN11/USD02 "2,9" 0209 +35 3 18 AS/SECTOR03/LAN11/USD03 "3,18" 0318 +35 4 18 AS/SECTOR03/LAN11/USD04 "4,18" 0418 +35 5 18 AS/SECTOR03/LAN11/USD05 "5,18" 0518 +35 6 18 AS/SECTOR03/LAN11/USD06 "6,18" 0618 +35 7 35 AS/SECTOR03/LAN11/USD07 "7,35" 0735 +35 8 35 AS/SECTOR03/LAN11/USD08 "8,35" 0835 +35 9 35 AS/SECTOR03/LAN11/USD09 "9,35" 0935 +35 16 3 AS/SECTOR03/LAN11/USD16 "16,3" 1603 +35 10 35 AS/SECTOR03/LAN11/USD10 "10,35" 1035 +35 11 35 AS/SECTOR03/LAN11/USD11 "11,35" 1135 +35 12 35 AS/SECTOR03/LAN11/USD12 "12,35" 1235 +35 13 35 AS/SECTOR03/LAN11/USD13 "13,35" 1335 +35 14 35 AS/SECTOR03/LAN11/USD14 "14,35" 1435 +35 15 35 AS/SECTOR03/LAN11/USD15 "15,35" 1535 +36 7 36 AS/SECTOR03/LAN12/USD07 "7,36" 0736 +36 8 36 AS/SECTOR03/LAN12/USD08 "8,36" 0836 +36 9 36 AS/SECTOR03/LAN12/USD09 "9,36" 0936 +36 10 36 AS/SECTOR03/LAN12/USD10 "10,36" 1036 +36 11 36 AS/SECTOR03/LAN12/USD11 "11,36" 1136 +36 12 36 AS/SECTOR03/LAN12/USD12 "12,36" 1236 +36 13 36 AS/SECTOR03/LAN12/USD13 "13,36" 1336 +36 14 36 AS/SECTOR03/LAN12/USD14 "14,36" 1436 +36 15 36 AS/SECTOR03/LAN12/USD15 "15,36" 1536 +37 3 19 AS/SECTOR04/LAN01/USD03 "3,19" 0319 +37 4 19 AS/SECTOR04/LAN01/USD04 "4,19" 0419 +37 5 19 AS/SECTOR04/LAN01/USD05 "5,19" 0519 +37 6 19 AS/SECTOR04/LAN01/USD06 "6,19" 0619 +37 7 37 AS/SECTOR04/LAN01/USD07 "7,37" 0737 +37 8 37 AS/SECTOR04/LAN01/USD08 "8,37" 0837 +37 9 37 AS/SECTOR04/LAN01/USD09 "9,37" 0937 +37 10 37 AS/SECTOR04/LAN01/USD10 "10,37" 1037 +37 11 37 AS/SECTOR04/LAN01/USD11 "11,37" 1137 +37 17 2 AS/SECTOR04/LAN01/USD17 "17,2" 1702 +37 12 37 AS/SECTOR04/LAN01/USD12 "12,37" 1237 +37 13 37 AS/SECTOR04/LAN01/USD13 "13,37" 1337 +37 14 37 AS/SECTOR04/LAN01/USD14 "14,37" 1437 +37 15 37 AS/SECTOR04/LAN01/USD15 "15,37" 1537 +38 7 38 AS/SECTOR04/LAN02/USD07 "7,38" 0738 +38 8 38 AS/SECTOR04/LAN02/USD08 "8,38" 0838 +38 9 38 AS/SECTOR04/LAN02/USD09 "9,38" 0938 +38 10 38 AS/SECTOR04/LAN02/USD10 "10,38" 1038 +38 11 38 AS/SECTOR04/LAN02/USD11 "11,38" 1138 +38 12 38 AS/SECTOR04/LAN02/USD12 "12,38" 1238 +38 13 38 AS/SECTOR04/LAN02/USD13 "13,38" 1338 +38 14 38 AS/SECTOR04/LAN02/USD14 "14,38" 1438 +38 15 38 AS/SECTOR04/LAN02/USD15 "15,38" 1538 +39 1 10 AS/SECTOR04/LAN03/USD01 "1,10" 0110 +39 2 10 AS/SECTOR04/LAN03/USD02 "2,10" 0210 +39 3 20 AS/SECTOR04/LAN03/USD03 "3,20" 0320 +39 4 20 AS/SECTOR04/LAN03/USD04 "4,20" 0420 +39 5 20 AS/SECTOR04/LAN03/USD05 "5,20" 0520 +39 6 20 AS/SECTOR04/LAN03/USD06 "6,20" 0620 +39 7 39 AS/SECTOR04/LAN03/USD07 "7,39" 0739 +39 8 39 AS/SECTOR04/LAN03/USD08 "8,39" 0839 +39 9 39 AS/SECTOR04/LAN03/USD09 "9,39" 0939 +39 16 4 AS/SECTOR04/LAN03/USD16 "16,4" 1604 +39 10 39 AS/SECTOR04/LAN03/USD10 "10,39" 1039 +39 11 39 AS/SECTOR04/LAN03/USD11 "11,39" 1139 +39 12 39 AS/SECTOR04/LAN03/USD12 "12,39" 1239 +39 13 39 AS/SECTOR04/LAN03/USD13 "13,39" 1339 +39 14 39 AS/SECTOR04/LAN03/USD14 "14,39" 1439 +39 15 39 AS/SECTOR04/LAN03/USD15 "15,39" 1539 +40 7 40 AS/SECTOR04/LAN04/USD07 "7,40" 0740 +40 8 40 AS/SECTOR04/LAN04/USD08 "8,40" 0840 +40 9 40 AS/SECTOR04/LAN04/USD09 "9,40" 0940 +40 10 40 AS/SECTOR04/LAN04/USD10 "10,40" 1040 +40 11 40 AS/SECTOR04/LAN04/USD11 "11,40" 1140 +40 12 40 AS/SECTOR04/LAN04/USD12 "12,40" 1240 +40 13 40 AS/SECTOR04/LAN04/USD13 "13,40" 1340 +40 14 40 AS/SECTOR04/LAN04/USD14 "14,40" 1440 +40 15 40 AS/SECTOR04/LAN04/USD15 "15,40" 1540 +41 3 21 AS/SECTOR04/LAN05/USD03 "3,21" 0321 +41 4 21 AS/SECTOR04/LAN05/USD04 "4,21" 0421 +41 5 21 AS/SECTOR04/LAN05/USD05 "5,21" 0521 +41 6 21 AS/SECTOR04/LAN05/USD06 "6,21" 0621 +41 7 41 AS/SECTOR04/LAN05/USD07 "7,41" 0741 +41 8 41 AS/SECTOR04/LAN05/USD08 "8,41" 0841 +41 9 41 AS/SECTOR04/LAN05/USD09 "9,41" 0941 +41 10 41 AS/SECTOR04/LAN05/USD10 "10,41" 1041 +41 11 41 AS/SECTOR04/LAN05/USD11 "11,41" 1141 +41 12 41 AS/SECTOR04/LAN05/USD12 "12,41" 1241 +41 13 41 AS/SECTOR04/LAN05/USD13 "13,41" 1341 +41 14 41 AS/SECTOR04/LAN05/USD14 "14,41" 1441 +41 15 41 AS/SECTOR04/LAN05/USD15 "15,41" 1541 +42 7 42 AS/SECTOR04/LAN06/USD07 "7,42" 0742 +42 8 42 AS/SECTOR04/LAN06/USD08 "8,42" 0842 +42 9 42 AS/SECTOR04/LAN06/USD09 "9,42" 0942 +42 10 42 AS/SECTOR04/LAN06/USD10 "10,42" 1042 +42 11 42 AS/SECTOR04/LAN06/USD11 "11,42" 1142 +42 12 42 AS/SECTOR04/LAN06/USD12 "12,42" 1242 +42 13 42 AS/SECTOR04/LAN06/USD13 "13,42" 1342 +42 14 42 AS/SECTOR04/LAN06/USD14 "14,42" 1442 +42 15 42 AS/SECTOR04/LAN06/USD15 "15,42" 1542 +43 1 11 AS/SECTOR04/LAN07/USD01 "1,11" 0111 +43 2 11 AS/SECTOR04/LAN07/USD02 "2,11" 0211 +43 3 22 AS/SECTOR04/LAN07/USD03 "3,22" 0322 +43 4 22 AS/SECTOR04/LAN07/USD04 "4,22" 0422 +43 5 22 AS/SECTOR04/LAN07/USD05 "5,22" 0522 +43 6 22 AS/SECTOR04/LAN07/USD06 "6,22" 0622 +43 7 43 AS/SECTOR04/LAN07/USD07 "7,43" 0743 +43 8 43 AS/SECTOR04/LAN07/USD08 "8,43" 0843 +43 9 43 AS/SECTOR04/LAN07/USD09 "9,43" 0943 +43 10 43 AS/SECTOR04/LAN07/USD10 "10,43" 1043 +43 11 43 AS/SECTOR04/LAN07/USD11 "11,43" 1143 +43 12 43 AS/SECTOR04/LAN07/USD12 "12,43" 1243 +43 13 43 AS/SECTOR04/LAN07/USD13 "13,43" 1343 +43 14 43 AS/SECTOR04/LAN07/USD14 "14,43" 1443 +43 15 43 AS/SECTOR04/LAN07/USD15 "15,43" 1543 +44 7 44 AS/SECTOR04/LAN08/USD07 "7,44" 0744 +44 8 44 AS/SECTOR04/LAN08/USD08 "8,44" 0844 +44 9 44 AS/SECTOR04/LAN08/USD09 "9,44" 0944 +44 10 44 AS/SECTOR04/LAN08/USD10 "10,44" 1044 +44 11 44 AS/SECTOR04/LAN08/USD11 "11,44" 1144 +44 12 44 AS/SECTOR04/LAN08/USD12 "12,44" 1244 +44 13 44 AS/SECTOR04/LAN08/USD13 "13,44" 1344 +44 14 44 AS/SECTOR04/LAN08/USD14 "14,44" 1444 +44 15 44 AS/SECTOR04/LAN08/USD15 "15,44" 1544 +45 3 23 AS/SECTOR04/LAN09/USD03 "3,23" 0323 +45 4 23 AS/SECTOR04/LAN09/USD04 "4,23" 0423 +45 5 23 AS/SECTOR04/LAN09/USD05 "5,23" 0523 +45 6 23 AS/SECTOR04/LAN09/USD06 "6,23" 0623 +45 7 45 AS/SECTOR04/LAN09/USD07 "7,45" 0745 +45 8 45 AS/SECTOR04/LAN09/USD08 "8,45" 0845 +45 9 45 AS/SECTOR04/LAN09/USD09 "9,45" 0945 +45 10 45 AS/SECTOR04/LAN09/USD10 "10,45" 1045 +45 11 45 AS/SECTOR04/LAN09/USD11 "11,45" 1145 +45 12 45 AS/SECTOR04/LAN09/USD12 "12,45" 1245 +45 13 45 AS/SECTOR04/LAN09/USD13 "13,45" 1345 +45 14 45 AS/SECTOR04/LAN09/USD14 "14,45" 1445 +45 15 45 AS/SECTOR04/LAN09/USD15 "15,45" 1545 +46 7 46 AS/SECTOR04/LAN10/USD07 "7,46" 0746 +46 8 46 AS/SECTOR04/LAN10/USD08 "8,46" 0846 +46 9 46 AS/SECTOR04/LAN10/USD09 "9,46" 0946 +46 10 46 AS/SECTOR04/LAN10/USD10 "10,46" 1046 +46 11 46 AS/SECTOR04/LAN10/USD11 "11,46" 1146 +46 12 46 AS/SECTOR04/LAN10/USD12 "12,46" 1246 +46 13 46 AS/SECTOR04/LAN10/USD13 "13,46" 1346 +46 14 46 AS/SECTOR04/LAN10/USD14 "14,46" 1446 +46 15 46 AS/SECTOR04/LAN10/USD15 "15,46" 1546 +47 1 12 AS/SECTOR04/LAN11/USD01 "1,12" 0112 +47 2 12 AS/SECTOR04/LAN11/USD02 "2,12" 0212 +47 3 24 AS/SECTOR04/LAN11/USD03 "3,24" 0324 +47 4 24 AS/SECTOR04/LAN11/USD04 "4,24" 0424 +47 5 24 AS/SECTOR04/LAN11/USD05 "5,24" 0524 +47 6 24 AS/SECTOR04/LAN11/USD06 "6,24" 0624 +47 7 47 AS/SECTOR04/LAN11/USD07 "7,47" 0747 +47 8 47 AS/SECTOR04/LAN11/USD08 "8,47" 0847 +47 9 47 AS/SECTOR04/LAN11/USD09 "9,47" 0947 +47 10 47 AS/SECTOR04/LAN11/USD10 "10,47" 1047 +47 11 47 AS/SECTOR04/LAN11/USD11 "11,47" 1147 +47 12 47 AS/SECTOR04/LAN11/USD12 "12,47" 1247 +47 13 47 AS/SECTOR04/LAN11/USD13 "13,47" 1347 +47 14 47 AS/SECTOR04/LAN11/USD14 "14,47" 1447 +47 15 47 AS/SECTOR04/LAN11/USD15 "15,47" 1547 +48 7 48 AS/SECTOR04/LAN12/USD07 "7,48" 0748 +48 8 48 AS/SECTOR04/LAN12/USD08 "8,48" 0848 +48 9 48 AS/SECTOR04/LAN12/USD09 "9,48" 0948 +48 10 48 AS/SECTOR04/LAN12/USD10 "10,48" 1048 +48 11 48 AS/SECTOR04/LAN12/USD11 "11,48" 1148 +48 12 48 AS/SECTOR04/LAN12/USD12 "12,48" 1248 +48 13 48 AS/SECTOR04/LAN12/USD13 "13,48" 1348 +48 14 48 AS/SECTOR04/LAN12/USD14 "14,48" 1448 +48 15 48 AS/SECTOR04/LAN12/USD15 "15,48" 1548 +49 3 25 AS/SECTOR05/LAN01/USD03 "3,25" 0325 +49 4 25 AS/SECTOR05/LAN01/USD04 "4,25" 0425 +49 5 25 AS/SECTOR05/LAN01/USD05 "5,25" 0525 +49 6 25 AS/SECTOR05/LAN01/USD06 "6,25" 0625 +49 7 49 AS/SECTOR05/LAN01/USD07 "7,49" 0749 +49 8 49 AS/SECTOR05/LAN01/USD08 "8,49" 0849 +49 9 49 AS/SECTOR05/LAN01/USD09 "9,49" 0949 +49 10 49 AS/SECTOR05/LAN01/USD10 "10,49" 1049 +49 11 49 AS/SECTOR05/LAN01/USD11 "11,49" 1149 +49 12 49 AS/SECTOR05/LAN01/USD12 "12,49" 1249 +49 13 49 AS/SECTOR05/LAN01/USD13 "13,49" 1349 +49 14 49 AS/SECTOR05/LAN01/USD14 "14,49" 1449 +49 15 49 AS/SECTOR05/LAN01/USD15 "15,49" 1549 +50 7 50 AS/SECTOR05/LAN02/USD07 "7,50" 0750 +50 8 50 AS/SECTOR05/LAN02/USD08 "8,50" 0850 +50 9 50 AS/SECTOR05/LAN02/USD09 "9,50" 0950 +50 10 50 AS/SECTOR05/LAN02/USD10 "10,50" 1050 +50 11 50 AS/SECTOR05/LAN02/USD11 "11,50" 1150 +50 12 50 AS/SECTOR05/LAN02/USD12 "12,50" 1250 +50 13 50 AS/SECTOR05/LAN02/USD13 "13,50" 1350 +50 14 50 AS/SECTOR05/LAN02/USD14 "14,50" 1450 +50 15 50 AS/SECTOR05/LAN02/USD15 "15,50" 1550 +51 1 13 AS/SECTOR05/LAN03/USD01 "1,13" 0113 +51 2 13 AS/SECTOR05/LAN03/USD02 "2,13" 0213 +51 3 26 AS/SECTOR05/LAN03/USD03 "3,26" 0326 +51 4 26 AS/SECTOR05/LAN03/USD04 "4,26" 0426 +51 5 26 AS/SECTOR05/LAN03/USD05 "5,26" 0526 +51 6 26 AS/SECTOR05/LAN03/USD06 "6,26" 0626 +51 7 51 AS/SECTOR05/LAN03/USD07 "7,51" 0751 +51 8 51 AS/SECTOR05/LAN03/USD08 "8,51" 0851 +51 9 51 AS/SECTOR05/LAN03/USD09 "9,51" 0951 +51 10 51 AS/SECTOR05/LAN03/USD10 "10,51" 1051 +51 11 51 AS/SECTOR05/LAN03/USD11 "11,51" 1151 +51 12 51 AS/SECTOR05/LAN03/USD12 "12,51" 1251 +51 13 51 AS/SECTOR05/LAN03/USD13 "13,51" 1351 +51 14 51 AS/SECTOR05/LAN03/USD14 "14,51" 1451 +51 15 51 AS/SECTOR05/LAN03/USD15 "15,51" 1551 +52 7 52 AS/SECTOR05/LAN04/USD07 "7,52" 0752 +52 8 52 AS/SECTOR05/LAN04/USD08 "8,52" 0852 +52 9 52 AS/SECTOR05/LAN04/USD09 "9,52" 0952 +52 10 52 AS/SECTOR05/LAN04/USD10 "10,52" 1052 +52 11 52 AS/SECTOR05/LAN04/USD11 "11,52" 1152 +52 12 52 AS/SECTOR05/LAN04/USD12 "12,52" 1252 +52 13 52 AS/SECTOR05/LAN04/USD13 "13,52" 1352 +52 14 52 AS/SECTOR05/LAN04/USD14 "14,52" 1452 +52 15 52 AS/SECTOR05/LAN04/USD15 "15,52" 1552 +53 3 27 AS/SECTOR05/LAN05/USD03 "3,27" 0327 +53 4 27 AS/SECTOR05/LAN05/USD04 "4,27" 0427 +53 5 27 AS/SECTOR05/LAN05/USD05 "5,27" 0527 +53 6 27 AS/SECTOR05/LAN05/USD06 "6,27" 0627 +53 7 53 AS/SECTOR05/LAN05/USD07 "7,53" 0753 +53 8 53 AS/SECTOR05/LAN05/USD08 "8,53" 0853 +53 9 53 AS/SECTOR05/LAN05/USD09 "9,53" 0953 +53 10 53 AS/SECTOR05/LAN05/USD10 "10,53" 1053 +53 11 53 AS/SECTOR05/LAN05/USD11 "11,53" 1153 +53 12 53 AS/SECTOR05/LAN05/USD12 "12,53" 1253 +53 13 53 AS/SECTOR05/LAN05/USD13 "13,53" 1353 +53 14 53 AS/SECTOR05/LAN05/USD14 "14,53" 1453 +53 15 53 AS/SECTOR05/LAN05/USD15 "15,53" 1553 +54 7 54 AS/SECTOR05/LAN06/USD07 "7,54" 0754 +54 8 54 AS/SECTOR05/LAN06/USD08 "8,54" 0854 +54 9 54 AS/SECTOR05/LAN06/USD09 "9,54" 0954 +54 10 54 AS/SECTOR05/LAN06/USD10 "10,54" 1054 +54 11 54 AS/SECTOR05/LAN06/USD11 "11,54" 1154 +54 12 54 AS/SECTOR05/LAN06/USD12 "12,54" 1254 +54 13 54 AS/SECTOR05/LAN06/USD13 "13,54" 1354 +54 14 54 AS/SECTOR05/LAN06/USD14 "14,54" 1454 +54 15 54 AS/SECTOR05/LAN06/USD15 "15,54" 1554 +55 1 14 AS/SECTOR05/LAN07/USD01 "1,14" 0114 +55 2 14 AS/SECTOR05/LAN07/USD02 "2,14" 0214 +55 3 28 AS/SECTOR05/LAN07/USD03 "3,28" 0328 +55 4 28 AS/SECTOR05/LAN07/USD04 "4,28" 0428 +55 5 28 AS/SECTOR05/LAN07/USD05 "5,28" 0528 +55 6 28 AS/SECTOR05/LAN07/USD06 "6,28" 0628 +55 7 55 AS/SECTOR05/LAN07/USD07 "7,55" 0755 +55 8 55 AS/SECTOR05/LAN07/USD08 "8,55" 0855 +55 9 55 AS/SECTOR05/LAN07/USD09 "9,55" 0955 +55 10 55 AS/SECTOR05/LAN07/USD10 "10,55" 1055 +55 11 55 AS/SECTOR05/LAN07/USD11 "11,55" 1155 +55 12 55 AS/SECTOR05/LAN07/USD12 "12,55" 1255 +55 13 55 AS/SECTOR05/LAN07/USD13 "13,55" 1355 +55 14 55 AS/SECTOR05/LAN07/USD14 "14,55" 1455 +55 15 55 AS/SECTOR05/LAN07/USD15 "15,55" 1555 +56 7 56 AS/SECTOR05/LAN08/USD07 "7,56" 0756 +56 8 56 AS/SECTOR05/LAN08/USD08 "8,56" 0856 +56 9 56 AS/SECTOR05/LAN08/USD09 "9,56" 0956 +56 10 56 AS/SECTOR05/LAN08/USD10 "10,56" 1056 +56 11 56 AS/SECTOR05/LAN08/USD11 "11,56" 1156 +56 12 56 AS/SECTOR05/LAN08/USD12 "12,56" 1256 +56 13 56 AS/SECTOR05/LAN08/USD13 "13,56" 1356 +56 14 56 AS/SECTOR05/LAN08/USD14 "14,56" 1456 +56 15 56 AS/SECTOR05/LAN08/USD15 "15,56" 1556 +57 3 29 AS/SECTOR05/LAN09/USD03 "3,29" 0329 +57 4 29 AS/SECTOR05/LAN09/USD04 "4,29" 0429 +57 5 29 AS/SECTOR05/LAN09/USD05 "5,29" 0529 +57 6 29 AS/SECTOR05/LAN09/USD06 "6,29" 0629 +57 7 57 AS/SECTOR05/LAN09/USD07 "7,57" 0757 +57 8 57 AS/SECTOR05/LAN09/USD08 "8,57" 0857 +57 9 57 AS/SECTOR05/LAN09/USD09 "9,57" 0957 +57 10 57 AS/SECTOR05/LAN09/USD10 "10,57" 1057 +57 11 57 AS/SECTOR05/LAN09/USD11 "11,57" 1157 +57 12 57 AS/SECTOR05/LAN09/USD12 "12,57" 1257 +57 13 57 AS/SECTOR05/LAN09/USD13 "13,57" 1357 +57 14 57 AS/SECTOR05/LAN09/USD14 "14,57" 1457 +57 15 57 AS/SECTOR05/LAN09/USD15 "15,57" 1557 +58 7 58 AS/SECTOR05/LAN10/USD07 "7,58" 0758 +58 8 58 AS/SECTOR05/LAN10/USD08 "8,58" 0858 +58 9 58 AS/SECTOR05/LAN10/USD09 "9,58" 0958 +58 10 58 AS/SECTOR05/LAN10/USD10 "10,58" 1058 +58 11 58 AS/SECTOR05/LAN10/USD11 "11,58" 1158 +58 12 58 AS/SECTOR05/LAN10/USD12 "12,58" 1258 +58 13 58 AS/SECTOR05/LAN10/USD13 "13,58" 1358 +58 14 58 AS/SECTOR05/LAN10/USD14 "14,58" 1458 +58 15 58 AS/SECTOR05/LAN10/USD15 "15,58" 1558 +59 1 15 AS/SECTOR05/LAN11/USD01 "1,15" 0115 +59 2 15 AS/SECTOR05/LAN11/USD02 "2,15" 0215 +59 3 30 AS/SECTOR05/LAN11/USD03 "3,30" 0330 +59 4 30 AS/SECTOR05/LAN11/USD04 "4,30" 0430 +59 5 30 AS/SECTOR05/LAN11/USD05 "5,30" 0530 +59 6 30 AS/SECTOR05/LAN11/USD06 "6,30" 0630 +59 7 59 AS/SECTOR05/LAN11/USD07 "7,59" 0759 +59 8 59 AS/SECTOR05/LAN11/USD08 "8,59" 0859 +59 9 59 AS/SECTOR05/LAN11/USD09 "9,59" 0959 +59 16 5 AS/SECTOR05/LAN11/USD16 "16,5" 1605 +59 10 59 AS/SECTOR05/LAN11/USD10 "10,59" 1059 +59 11 59 AS/SECTOR05/LAN11/USD11 "11,59" 1159 +59 12 59 AS/SECTOR05/LAN11/USD12 "12,59" 1259 +59 13 59 AS/SECTOR05/LAN11/USD13 "13,59" 1359 +59 14 59 AS/SECTOR05/LAN11/USD14 "14,59" 1459 +59 15 59 AS/SECTOR05/LAN11/USD15 "15,59" 1559 +60 7 60 AS/SECTOR05/LAN12/USD07 "7,60" 0760 +60 8 60 AS/SECTOR05/LAN12/USD08 "8,60" 0860 +60 9 60 AS/SECTOR05/LAN12/USD09 "9,60" 0960 +60 10 60 AS/SECTOR05/LAN12/USD10 "10,60" 1060 +60 11 60 AS/SECTOR05/LAN12/USD11 "11,60" 1160 +60 12 60 AS/SECTOR05/LAN12/USD12 "12,60" 1260 +60 13 60 AS/SECTOR05/LAN12/USD13 "13,60" 1360 +60 14 60 AS/SECTOR05/LAN12/USD14 "14,60" 1460 +60 15 60 AS/SECTOR05/LAN12/USD15 "15,60" 1560 +61 3 31 AS/SECTOR06/LAN01/USD03 "3,31" 0331 +61 4 31 AS/SECTOR06/LAN01/USD04 "4,31" 0431 +61 5 31 AS/SECTOR06/LAN01/USD05 "5,31" 0531 +61 6 31 AS/SECTOR06/LAN01/USD06 "6,31" 0631 +61 7 61 AS/SECTOR06/LAN01/USD07 "7,61" 0761 +61 8 61 AS/SECTOR06/LAN01/USD08 "8,61" 0861 +61 9 61 AS/SECTOR06/LAN01/USD09 "9,61" 0961 +61 10 61 AS/SECTOR06/LAN01/USD10 "10,61" 1061 +61 11 61 AS/SECTOR06/LAN01/USD11 "11,61" 1161 +61 17 3 AS/SECTOR06/LAN01/USD17 "17,3" 1703 +61 12 61 AS/SECTOR06/LAN01/USD12 "12,61" 1261 +61 13 61 AS/SECTOR06/LAN01/USD13 "13,61" 1361 +61 14 61 AS/SECTOR06/LAN01/USD14 "14,61" 1461 +61 15 61 AS/SECTOR06/LAN01/USD15 "15,61" 1561 +62 7 62 AS/SECTOR06/LAN02/USD07 "7,62" 0762 +62 8 62 AS/SECTOR06/LAN02/USD08 "8,62" 0862 +62 9 62 AS/SECTOR06/LAN02/USD09 "9,62" 0962 +62 10 62 AS/SECTOR06/LAN02/USD10 "10,62" 1062 +62 11 62 AS/SECTOR06/LAN02/USD11 "11,62" 1162 +62 12 62 AS/SECTOR06/LAN02/USD12 "12,62" 1262 +62 13 62 AS/SECTOR06/LAN02/USD13 "13,62" 1362 +62 14 62 AS/SECTOR06/LAN02/USD14 "14,62" 1462 +62 15 62 AS/SECTOR06/LAN02/USD15 "15,62" 1562 +63 1 16 AS/SECTOR06/LAN03/USD01 "1,16" 0116 +63 2 16 AS/SECTOR06/LAN03/USD02 "2,16" 0216 +63 3 32 AS/SECTOR06/LAN03/USD03 "3,32" 0332 +63 4 32 AS/SECTOR06/LAN03/USD04 "4,32" 0432 +63 5 32 AS/SECTOR06/LAN03/USD05 "5,32" 0532 +63 6 32 AS/SECTOR06/LAN03/USD06 "6,32" 0632 +63 7 63 AS/SECTOR06/LAN03/USD07 "7,63" 0763 +63 8 63 AS/SECTOR06/LAN03/USD08 "8,63" 0863 +63 9 63 AS/SECTOR06/LAN03/USD09 "9,63" 0963 +63 16 6 AS/SECTOR06/LAN03/USD16 "16,6" 1606 +63 10 63 AS/SECTOR06/LAN03/USD10 "10,63" 1063 +63 11 63 AS/SECTOR06/LAN03/USD11 "11,63" 1163 +63 12 63 AS/SECTOR06/LAN03/USD12 "12,63" 1263 +63 13 63 AS/SECTOR06/LAN03/USD13 "13,63" 1363 +63 14 63 AS/SECTOR06/LAN03/USD14 "14,63" 1463 +63 15 63 AS/SECTOR06/LAN03/USD15 "15,63" 1563 +64 7 64 AS/SECTOR06/LAN04/USD07 "7,64" 0764 +64 8 64 AS/SECTOR06/LAN04/USD08 "8,64" 0864 +64 9 64 AS/SECTOR06/LAN04/USD09 "9,64" 0964 +64 10 64 AS/SECTOR06/LAN04/USD10 "10,64" 1064 +64 11 64 AS/SECTOR06/LAN04/USD11 "11,64" 1164 +64 12 64 AS/SECTOR06/LAN04/USD12 "12,64" 1264 +64 13 64 AS/SECTOR06/LAN04/USD13 "13,64" 1364 +64 14 64 AS/SECTOR06/LAN04/USD14 "14,64" 1464 +64 15 64 AS/SECTOR06/LAN04/USD15 "15,64" 1564 +65 3 33 AS/SECTOR06/LAN05/USD03 "3,33" 0333 +65 4 33 AS/SECTOR06/LAN05/USD04 "4,33" 0433 +65 5 33 AS/SECTOR06/LAN05/USD05 "5,33" 0533 +65 6 33 AS/SECTOR06/LAN05/USD06 "6,33" 0633 +65 7 65 AS/SECTOR06/LAN05/USD07 "7,65" 0765 +65 8 65 AS/SECTOR06/LAN05/USD08 "8,65" 0865 +65 9 65 AS/SECTOR06/LAN05/USD09 "9,65" 0965 +65 10 65 AS/SECTOR06/LAN05/USD10 "10,65" 1065 +65 11 65 AS/SECTOR06/LAN05/USD11 "11,65" 1165 +65 12 65 AS/SECTOR06/LAN05/USD12 "12,65" 1265 +65 13 65 AS/SECTOR06/LAN05/USD13 "13,65" 1365 +65 14 65 AS/SECTOR06/LAN05/USD14 "14,65" 1465 +65 15 65 AS/SECTOR06/LAN05/USD15 "15,65" 1565 +66 7 66 AS/SECTOR06/LAN06/USD07 "7,66" 0766 +66 8 66 AS/SECTOR06/LAN06/USD08 "8,66" 0866 +66 9 66 AS/SECTOR06/LAN06/USD09 "9,66" 0966 +66 10 66 AS/SECTOR06/LAN06/USD10 "10,66" 1066 +66 11 66 AS/SECTOR06/LAN06/USD11 "11,66" 1166 +66 12 66 AS/SECTOR06/LAN06/USD12 "12,66" 1266 +66 13 66 AS/SECTOR06/LAN06/USD13 "13,66" 1366 +66 14 66 AS/SECTOR06/LAN06/USD14 "14,66" 1466 +66 15 66 AS/SECTOR06/LAN06/USD15 "15,66" 1566 +67 1 17 AS/SECTOR06/LAN07/USD01 "1,17" 0117 +67 2 17 AS/SECTOR06/LAN07/USD02 "2,17" 0217 +67 3 34 AS/SECTOR06/LAN07/USD03 "3,34" 0334 +67 4 34 AS/SECTOR06/LAN07/USD04 "4,34" 0434 +67 5 34 AS/SECTOR06/LAN07/USD05 "5,34" 0534 +67 6 34 AS/SECTOR06/LAN07/USD06 "6,34" 0634 +67 7 67 AS/SECTOR06/LAN07/USD07 "7,67" 0767 +67 8 67 AS/SECTOR06/LAN07/USD08 "8,67" 0867 +67 9 67 AS/SECTOR06/LAN07/USD09 "9,67" 0967 +67 10 67 AS/SECTOR06/LAN07/USD10 "10,67" 1067 +67 11 67 AS/SECTOR06/LAN07/USD11 "11,67" 1167 +67 12 67 AS/SECTOR06/LAN07/USD12 "12,67" 1267 +67 13 67 AS/SECTOR06/LAN07/USD13 "13,67" 1367 +67 14 67 AS/SECTOR06/LAN07/USD14 "14,67" 1467 +67 15 67 AS/SECTOR06/LAN07/USD15 "15,67" 1567 +68 7 68 AS/SECTOR06/LAN08/USD07 "7,68" 0768 +68 8 68 AS/SECTOR06/LAN08/USD08 "8,68" 0868 +68 9 68 AS/SECTOR06/LAN08/USD09 "9,68" 0968 +68 10 68 AS/SECTOR06/LAN08/USD10 "10,68" 1068 +68 11 68 AS/SECTOR06/LAN08/USD11 "11,68" 1168 +68 12 68 AS/SECTOR06/LAN08/USD12 "12,68" 1268 +68 13 68 AS/SECTOR06/LAN08/USD13 "13,68" 1368 +68 14 68 AS/SECTOR06/LAN08/USD14 "14,68" 1468 +68 15 68 AS/SECTOR06/LAN08/USD15 "15,68" 1568 +69 3 35 AS/SECTOR06/LAN09/USD03 "3,35" 0335 +69 4 35 AS/SECTOR06/LAN09/USD04 "4,35" 0435 +69 5 35 AS/SECTOR06/LAN09/USD05 "5,35" 0535 +69 6 35 AS/SECTOR06/LAN09/USD06 "6,35" 0635 +69 7 69 AS/SECTOR06/LAN09/USD07 "7,69" 0769 +69 8 69 AS/SECTOR06/LAN09/USD08 "8,69" 0869 +69 9 69 AS/SECTOR06/LAN09/USD09 "9,69" 0969 +69 10 69 AS/SECTOR06/LAN09/USD10 "10,69" 1069 +69 11 69 AS/SECTOR06/LAN09/USD11 "11,69" 1169 +69 12 69 AS/SECTOR06/LAN09/USD12 "12,69" 1269 +69 13 69 AS/SECTOR06/LAN09/USD13 "13,69" 1369 +69 14 69 AS/SECTOR06/LAN09/USD14 "14,69" 1469 +69 15 69 AS/SECTOR06/LAN09/USD15 "15,69" 1569 +70 7 70 AS/SECTOR06/LAN10/USD07 "7,70" 0770 +70 8 70 AS/SECTOR06/LAN10/USD08 "8,70" 0870 +70 9 70 AS/SECTOR06/LAN10/USD09 "9,70" 0970 +70 10 70 AS/SECTOR06/LAN10/USD10 "10,70" 1070 +70 11 70 AS/SECTOR06/LAN10/USD11 "11,70" 1170 +70 12 70 AS/SECTOR06/LAN10/USD12 "12,70" 1270 +70 13 70 AS/SECTOR06/LAN10/USD13 "13,70" 1370 +70 14 70 AS/SECTOR06/LAN10/USD14 "14,70" 1470 +70 15 70 AS/SECTOR06/LAN10/USD15 "15,70" 1570 +71 1 18 AS/SECTOR06/LAN11/USD01 "1,18" 0118 +71 2 18 AS/SECTOR06/LAN11/USD02 "2,18" 0218 +71 3 36 AS/SECTOR06/LAN11/USD03 "3,36" 0336 +71 4 36 AS/SECTOR06/LAN11/USD04 "4,36" 0436 +71 5 36 AS/SECTOR06/LAN11/USD05 "5,36" 0536 +71 6 36 AS/SECTOR06/LAN11/USD06 "6,36" 0636 +71 7 71 AS/SECTOR06/LAN11/USD07 "7,71" 0771 +71 8 71 AS/SECTOR06/LAN11/USD08 "8,71" 0871 +71 9 71 AS/SECTOR06/LAN11/USD09 "9,71" 0971 +71 10 71 AS/SECTOR06/LAN11/USD10 "10,71" 1071 +71 11 71 AS/SECTOR06/LAN11/USD11 "11,71" 1171 +71 12 71 AS/SECTOR06/LAN11/USD12 "12,71" 1271 +71 13 71 AS/SECTOR06/LAN11/USD13 "13,71" 1371 +71 14 71 AS/SECTOR06/LAN11/USD14 "14,71" 1471 +71 15 71 AS/SECTOR06/LAN11/USD15 "15,71" 1571 +72 7 72 AS/SECTOR06/LAN12/USD07 "7,72" 0772 +72 8 72 AS/SECTOR06/LAN12/USD08 "8,72" 0872 +72 9 72 AS/SECTOR06/LAN12/USD09 "9,72" 0972 +72 10 72 AS/SECTOR06/LAN12/USD10 "10,72" 1072 +72 11 72 AS/SECTOR06/LAN12/USD11 "11,72" 1172 +72 12 72 AS/SECTOR06/LAN12/USD12 "12,72" 1272 +72 13 72 AS/SECTOR06/LAN12/USD13 "13,72" 1372 +72 14 72 AS/SECTOR06/LAN12/USD14 "14,72" 1472 +72 15 72 AS/SECTOR06/LAN12/USD15 "15,72" 1572 +73 3 37 AS/SECTOR07/LAN01/USD03 "3,37" 0337 +73 4 37 AS/SECTOR07/LAN01/USD04 "4,37" 0437 +73 5 37 AS/SECTOR07/LAN01/USD05 "5,37" 0537 +73 6 37 AS/SECTOR07/LAN01/USD06 "6,37" 0637 +73 7 73 AS/SECTOR07/LAN01/USD07 "7,73" 0773 +73 8 73 AS/SECTOR07/LAN01/USD08 "8,73" 0873 +73 9 73 AS/SECTOR07/LAN01/USD09 "9,73" 0973 +73 10 73 AS/SECTOR07/LAN01/USD10 "10,73" 1073 +73 11 73 AS/SECTOR07/LAN01/USD11 "11,73" 1173 +73 12 73 AS/SECTOR07/LAN01/USD12 "12,73" 1273 +73 13 73 AS/SECTOR07/LAN01/USD13 "13,73" 1373 +73 14 73 AS/SECTOR07/LAN01/USD14 "14,73" 1473 +73 15 73 AS/SECTOR07/LAN01/USD15 "15,73" 1573 +74 7 74 AS/SECTOR07/LAN02/USD07 "7,74" 0774 +74 8 74 AS/SECTOR07/LAN02/USD08 "8,74" 0874 +74 9 74 AS/SECTOR07/LAN02/USD09 "9,74" 0974 +74 10 74 AS/SECTOR07/LAN02/USD10 "10,74" 1074 +74 11 74 AS/SECTOR07/LAN02/USD11 "11,74" 1174 +74 12 74 AS/SECTOR07/LAN02/USD12 "12,74" 1274 +74 13 74 AS/SECTOR07/LAN02/USD13 "13,74" 1374 +74 14 74 AS/SECTOR07/LAN02/USD14 "14,74" 1474 +74 15 74 AS/SECTOR07/LAN02/USD15 "15,74" 1574 +75 1 19 AS/SECTOR07/LAN03/USD01 "1,19" 0119 +75 2 19 AS/SECTOR07/LAN03/USD02 "2,19" 0219 +75 3 38 AS/SECTOR07/LAN03/USD03 "3,38" 0338 +75 4 38 AS/SECTOR07/LAN03/USD04 "4,38" 0438 +75 5 38 AS/SECTOR07/LAN03/USD05 "5,38" 0538 +75 6 38 AS/SECTOR07/LAN03/USD06 "6,38" 0638 +75 7 75 AS/SECTOR07/LAN03/USD07 "7,75" 0775 +75 8 75 AS/SECTOR07/LAN03/USD08 "8,75" 0875 +75 9 75 AS/SECTOR07/LAN03/USD09 "9,75" 0975 +75 10 75 AS/SECTOR07/LAN03/USD10 "10,75" 1075 +75 11 75 AS/SECTOR07/LAN03/USD11 "11,75" 1175 +75 12 75 AS/SECTOR07/LAN03/USD12 "12,75" 1275 +75 13 75 AS/SECTOR07/LAN03/USD13 "13,75" 1375 +75 14 75 AS/SECTOR07/LAN03/USD14 "14,75" 1475 +75 15 75 AS/SECTOR07/LAN03/USD15 "15,75" 1575 +76 7 76 AS/SECTOR07/LAN04/USD07 "7,76" 0776 +76 8 76 AS/SECTOR07/LAN04/USD08 "8,76" 0876 +76 9 76 AS/SECTOR07/LAN04/USD09 "9,76" 0976 +76 10 76 AS/SECTOR07/LAN04/USD10 "10,76" 1076 +76 11 76 AS/SECTOR07/LAN04/USD11 "11,76" 1176 +76 12 76 AS/SECTOR07/LAN04/USD12 "12,76" 1276 +76 13 76 AS/SECTOR07/LAN04/USD13 "13,76" 1376 +76 14 76 AS/SECTOR07/LAN04/USD14 "14,76" 1476 +76 15 76 AS/SECTOR07/LAN04/USD15 "15,76" 1576 +77 3 39 AS/SECTOR07/LAN05/USD03 "3,39" 0339 +77 4 39 AS/SECTOR07/LAN05/USD04 "4,39" 0439 +77 5 39 AS/SECTOR07/LAN05/USD05 "5,39" 0539 +77 6 39 AS/SECTOR07/LAN05/USD06 "6,39" 0639 +77 7 77 AS/SECTOR07/LAN05/USD07 "7,77" 0777 +77 8 77 AS/SECTOR07/LAN05/USD08 "8,77" 0877 +77 9 77 AS/SECTOR07/LAN05/USD09 "9,77" 0977 +77 10 77 AS/SECTOR07/LAN05/USD10 "10,77" 1077 +77 11 77 AS/SECTOR07/LAN05/USD11 "11,77" 1177 +77 12 77 AS/SECTOR07/LAN05/USD12 "12,77" 1277 +77 13 77 AS/SECTOR07/LAN05/USD13 "13,77" 1377 +77 14 77 AS/SECTOR07/LAN05/USD14 "14,77" 1477 +77 15 77 AS/SECTOR07/LAN05/USD15 "15,77" 1577 +78 7 78 AS/SECTOR07/LAN06/USD07 "7,78" 0778 +78 8 78 AS/SECTOR07/LAN06/USD08 "8,78" 0878 +78 9 78 AS/SECTOR07/LAN06/USD09 "9,78" 0978 +78 10 78 AS/SECTOR07/LAN06/USD10 "10,78" 1078 +78 11 78 AS/SECTOR07/LAN06/USD11 "11,78" 1178 +78 12 78 AS/SECTOR07/LAN06/USD12 "12,78" 1278 +78 13 78 AS/SECTOR07/LAN06/USD13 "13,78" 1378 +78 14 78 AS/SECTOR07/LAN06/USD14 "14,78" 1478 +78 15 78 AS/SECTOR07/LAN06/USD15 "15,78" 1578 +79 1 20 AS/SECTOR07/LAN07/USD01 "1,20" 0120 +79 2 20 AS/SECTOR07/LAN07/USD02 "2,20" 0220 +79 3 40 AS/SECTOR07/LAN07/USD03 "3,40" 0340 +79 4 40 AS/SECTOR07/LAN07/USD04 "4,40" 0440 +79 5 40 AS/SECTOR07/LAN07/USD05 "5,40" 0540 +79 6 40 AS/SECTOR07/LAN07/USD06 "6,40" 0640 +79 7 79 AS/SECTOR07/LAN07/USD07 "7,79" 0779 +79 8 79 AS/SECTOR07/LAN07/USD08 "8,79" 0879 +79 9 79 AS/SECTOR07/LAN07/USD09 "9,79" 0979 +79 10 79 AS/SECTOR07/LAN07/USD10 "10,79" 1079 +79 11 79 AS/SECTOR07/LAN07/USD11 "11,79" 1179 +79 12 79 AS/SECTOR07/LAN07/USD12 "12,79" 1279 +79 13 79 AS/SECTOR07/LAN07/USD13 "13,79" 1379 +79 14 79 AS/SECTOR07/LAN07/USD14 "14,79" 1479 +79 15 79 AS/SECTOR07/LAN07/USD15 "15,79" 1579 +80 7 80 AS/SECTOR07/LAN08/USD07 "7,80" 0780 +80 8 80 AS/SECTOR07/LAN08/USD08 "8,80" 0880 +80 9 80 AS/SECTOR07/LAN08/USD09 "9,80" 0980 +80 10 80 AS/SECTOR07/LAN08/USD10 "10,80" 1080 +80 11 80 AS/SECTOR07/LAN08/USD11 "11,80" 1180 +80 12 80 AS/SECTOR07/LAN08/USD12 "12,80" 1280 +80 13 80 AS/SECTOR07/LAN08/USD13 "13,80" 1380 +80 14 80 AS/SECTOR07/LAN08/USD14 "14,80" 1480 +80 15 80 AS/SECTOR07/LAN08/USD15 "15,80" 1580 +81 3 41 AS/SECTOR07/LAN09/USD03 "3,41" 0341 +81 4 41 AS/SECTOR07/LAN09/USD04 "4,41" 0441 +81 5 41 AS/SECTOR07/LAN09/USD05 "5,41" 0541 +81 6 41 AS/SECTOR07/LAN09/USD06 "6,41" 0641 +81 7 81 AS/SECTOR07/LAN09/USD07 "7,81" 0781 +81 8 81 AS/SECTOR07/LAN09/USD08 "8,81" 0881 +81 9 81 AS/SECTOR07/LAN09/USD09 "9,81" 0981 +81 10 81 AS/SECTOR07/LAN09/USD10 "10,81" 1081 +81 11 81 AS/SECTOR07/LAN09/USD11 "11,81" 1181 +81 12 81 AS/SECTOR07/LAN09/USD12 "12,81" 1281 +81 13 81 AS/SECTOR07/LAN09/USD13 "13,81" 1381 +81 14 81 AS/SECTOR07/LAN09/USD14 "14,81" 1481 +81 15 81 AS/SECTOR07/LAN09/USD15 "15,81" 1581 +82 7 82 AS/SECTOR07/LAN10/USD07 "7,82" 0782 +82 8 82 AS/SECTOR07/LAN10/USD08 "8,82" 0882 +82 9 82 AS/SECTOR07/LAN10/USD09 "9,82" 0982 +82 10 82 AS/SECTOR07/LAN10/USD10 "10,82" 1082 +82 11 82 AS/SECTOR07/LAN10/USD11 "11,82" 1182 +82 12 82 AS/SECTOR07/LAN10/USD12 "12,82" 1282 +82 13 82 AS/SECTOR07/LAN10/USD13 "13,82" 1382 +82 14 82 AS/SECTOR07/LAN10/USD14 "14,82" 1482 +82 15 82 AS/SECTOR07/LAN10/USD15 "15,82" 1582 +83 1 21 AS/SECTOR07/LAN11/USD01 "1,21" 0121 +83 2 21 AS/SECTOR07/LAN11/USD02 "2,21" 0221 +83 3 42 AS/SECTOR07/LAN11/USD03 "3,42" 0342 +83 4 42 AS/SECTOR07/LAN11/USD04 "4,42" 0442 +83 5 42 AS/SECTOR07/LAN11/USD05 "5,42" 0542 +83 6 42 AS/SECTOR07/LAN11/USD06 "6,42" 0642 +83 7 83 AS/SECTOR07/LAN11/USD07 "7,83" 0783 +83 8 83 AS/SECTOR07/LAN11/USD08 "8,83" 0883 +83 9 83 AS/SECTOR07/LAN11/USD09 "9,83" 0983 +83 16 7 AS/SECTOR07/LAN11/USD16 "16,7" 1607 +83 10 83 AS/SECTOR07/LAN11/USD10 "10,83" 1083 +83 11 83 AS/SECTOR07/LAN11/USD11 "11,83" 1183 +83 12 83 AS/SECTOR07/LAN11/USD12 "12,83" 1283 +83 13 83 AS/SECTOR07/LAN11/USD13 "13,83" 1383 +83 14 83 AS/SECTOR07/LAN11/USD14 "14,83" 1483 +83 15 83 AS/SECTOR07/LAN11/USD15 "15,83" 1583 +84 7 84 AS/SECTOR07/LAN12/USD07 "7,84" 0784 +84 8 84 AS/SECTOR07/LAN12/USD08 "8,84" 0884 +84 9 84 AS/SECTOR07/LAN12/USD09 "9,84" 0984 +84 10 84 AS/SECTOR07/LAN12/USD10 "10,84" 1084 +84 11 84 AS/SECTOR07/LAN12/USD11 "11,84" 1184 +84 12 84 AS/SECTOR07/LAN12/USD12 "12,84" 1284 +84 13 84 AS/SECTOR07/LAN12/USD13 "13,84" 1384 +84 14 84 AS/SECTOR07/LAN12/USD14 "14,84" 1484 +84 15 84 AS/SECTOR07/LAN12/USD15 "15,84" 1584 +85 3 43 AS/SECTOR08/LAN01/USD03 "3,43" 0343 +85 4 43 AS/SECTOR08/LAN01/USD04 "4,43" 0443 +85 5 43 AS/SECTOR08/LAN01/USD05 "5,43" 0543 +85 6 43 AS/SECTOR08/LAN01/USD06 "6,43" 0643 +85 7 85 AS/SECTOR08/LAN01/USD07 "7,85" 0785 +85 8 85 AS/SECTOR08/LAN01/USD08 "8,85" 0885 +85 9 85 AS/SECTOR08/LAN01/USD09 "9,85" 0985 +85 10 85 AS/SECTOR08/LAN01/USD10 "10,85" 1085 +85 11 85 AS/SECTOR08/LAN01/USD11 "11,85" 1185 +85 17 4 AS/SECTOR08/LAN01/USD17 "17,4" 1704 +85 12 85 AS/SECTOR08/LAN01/USD12 "12,85" 1285 +85 13 85 AS/SECTOR08/LAN01/USD13 "13,85" 1385 +85 14 85 AS/SECTOR08/LAN01/USD14 "14,85" 1485 +85 15 85 AS/SECTOR08/LAN01/USD15 "15,85" 1585 +86 7 86 AS/SECTOR08/LAN02/USD07 "7,86" 0786 +86 8 86 AS/SECTOR08/LAN02/USD08 "8,86" 0886 +86 9 86 AS/SECTOR08/LAN02/USD09 "9,86" 0986 +86 10 86 AS/SECTOR08/LAN02/USD10 "10,86" 1086 +86 11 86 AS/SECTOR08/LAN02/USD11 "11,86" 1186 +86 12 86 AS/SECTOR08/LAN02/USD12 "12,86" 1286 +86 13 86 AS/SECTOR08/LAN02/USD13 "13,86" 1386 +86 14 86 AS/SECTOR08/LAN02/USD14 "14,86" 1486 +86 15 86 AS/SECTOR08/LAN02/USD15 "15,86" 1586 +87 1 22 AS/SECTOR08/LAN03/USD01 "1,22" 0122 +87 2 22 AS/SECTOR08/LAN03/USD02 "2,22" 0222 +87 3 44 AS/SECTOR08/LAN03/USD03 "3,44" 0344 +87 4 44 AS/SECTOR08/LAN03/USD04 "4,44" 0444 +87 5 44 AS/SECTOR08/LAN03/USD05 "5,44" 0544 +87 6 44 AS/SECTOR08/LAN03/USD06 "6,44" 0644 +87 7 87 AS/SECTOR08/LAN03/USD07 "7,87" 0787 +87 8 87 AS/SECTOR08/LAN03/USD08 "8,87" 0887 +87 9 87 AS/SECTOR08/LAN03/USD09 "9,87" 0987 +87 16 8 AS/SECTOR08/LAN03/USD16 "16,8" 1608 +87 10 87 AS/SECTOR08/LAN03/USD10 "10,87" 1087 +87 11 87 AS/SECTOR08/LAN03/USD11 "11,87" 1187 +87 12 87 AS/SECTOR08/LAN03/USD12 "12,87" 1287 +87 13 87 AS/SECTOR08/LAN03/USD13 "13,87" 1387 +87 14 87 AS/SECTOR08/LAN03/USD14 "14,87" 1487 +87 15 87 AS/SECTOR08/LAN03/USD15 "15,87" 1587 +88 7 88 AS/SECTOR08/LAN04/USD07 "7,88" 0788 +88 8 88 AS/SECTOR08/LAN04/USD08 "8,88" 0888 +88 9 88 AS/SECTOR08/LAN04/USD09 "9,88" 0988 +88 10 88 AS/SECTOR08/LAN04/USD10 "10,88" 1088 +88 11 88 AS/SECTOR08/LAN04/USD11 "11,88" 1188 +88 12 88 AS/SECTOR08/LAN04/USD12 "12,88" 1288 +88 13 88 AS/SECTOR08/LAN04/USD13 "13,88" 1388 +88 14 88 AS/SECTOR08/LAN04/USD14 "14,88" 1488 +88 15 88 AS/SECTOR08/LAN04/USD15 "15,88" 1588 +89 3 45 AS/SECTOR08/LAN05/USD03 "3,45" 0345 +89 4 45 AS/SECTOR08/LAN05/USD04 "4,45" 0445 +89 5 45 AS/SECTOR08/LAN05/USD05 "5,45" 0545 +89 6 45 AS/SECTOR08/LAN05/USD06 "6,45" 0645 +89 7 89 AS/SECTOR08/LAN05/USD07 "7,89" 0789 +89 8 89 AS/SECTOR08/LAN05/USD08 "8,89" 0889 +89 9 89 AS/SECTOR08/LAN05/USD09 "9,89" 0989 +89 10 89 AS/SECTOR08/LAN05/USD10 "10,89" 1089 +89 11 89 AS/SECTOR08/LAN05/USD11 "11,89" 1189 +89 12 89 AS/SECTOR08/LAN05/USD12 "12,89" 1289 +89 13 89 AS/SECTOR08/LAN05/USD13 "13,89" 1389 +89 14 89 AS/SECTOR08/LAN05/USD14 "14,89" 1489 +89 15 89 AS/SECTOR08/LAN05/USD15 "15,89" 1589 +90 7 90 AS/SECTOR08/LAN06/USD07 "7,90" 0790 +90 8 90 AS/SECTOR08/LAN06/USD08 "8,90" 0890 +90 9 90 AS/SECTOR08/LAN06/USD09 "9,90" 0990 +90 10 90 AS/SECTOR08/LAN06/USD10 "10,90" 1090 +90 11 90 AS/SECTOR08/LAN06/USD11 "11,90" 1190 +90 12 90 AS/SECTOR08/LAN06/USD12 "12,90" 1290 +90 13 90 AS/SECTOR08/LAN06/USD13 "13,90" 1390 +90 14 90 AS/SECTOR08/LAN06/USD14 "14,90" 1490 +90 15 90 AS/SECTOR08/LAN06/USD15 "15,90" 1590 +91 1 23 AS/SECTOR08/LAN07/USD01 "1,23" 0123 +91 2 23 AS/SECTOR08/LAN07/USD02 "2,23" 0223 +91 3 46 AS/SECTOR08/LAN07/USD03 "3,46" 0346 +91 4 46 AS/SECTOR08/LAN07/USD04 "4,46" 0446 +91 5 46 AS/SECTOR08/LAN07/USD05 "5,46" 0546 +91 6 46 AS/SECTOR08/LAN07/USD06 "6,46" 0646 +91 7 91 AS/SECTOR08/LAN07/USD07 "7,91" 0791 +91 8 91 AS/SECTOR08/LAN07/USD08 "8,91" 0891 +91 9 91 AS/SECTOR08/LAN07/USD09 "9,91" 0991 +91 10 91 AS/SECTOR08/LAN07/USD10 "10,91" 1091 +91 11 91 AS/SECTOR08/LAN07/USD11 "11,91" 1191 +91 12 91 AS/SECTOR08/LAN07/USD12 "12,91" 1291 +91 13 91 AS/SECTOR08/LAN07/USD13 "13,91" 1391 +91 14 91 AS/SECTOR08/LAN07/USD14 "14,91" 1491 +91 15 91 AS/SECTOR08/LAN07/USD15 "15,91" 1591 +92 7 92 AS/SECTOR08/LAN08/USD07 "7,92" 0792 +92 8 92 AS/SECTOR08/LAN08/USD08 "8,92" 0892 +92 9 92 AS/SECTOR08/LAN08/USD09 "9,92" 0992 +92 10 92 AS/SECTOR08/LAN08/USD10 "10,92" 1092 +92 11 92 AS/SECTOR08/LAN08/USD11 "11,92" 1192 +92 12 92 AS/SECTOR08/LAN08/USD12 "12,92" 1292 +92 13 92 AS/SECTOR08/LAN08/USD13 "13,92" 1392 +92 14 92 AS/SECTOR08/LAN08/USD14 "14,92" 1492 +92 15 92 AS/SECTOR08/LAN08/USD15 "15,92" 1592 +93 3 47 AS/SECTOR08/LAN09/USD03 "3,47" 0347 +93 4 47 AS/SECTOR08/LAN09/USD04 "4,47" 0447 +93 5 47 AS/SECTOR08/LAN09/USD05 "5,47" 0547 +93 6 47 AS/SECTOR08/LAN09/USD06 "6,47" 0647 +93 7 93 AS/SECTOR08/LAN09/USD07 "7,93" 0793 +93 8 93 AS/SECTOR08/LAN09/USD08 "8,93" 0893 +93 9 93 AS/SECTOR08/LAN09/USD09 "9,93" 0993 +93 10 93 AS/SECTOR08/LAN09/USD10 "10,93" 1093 +93 11 93 AS/SECTOR08/LAN09/USD11 "11,93" 1193 +93 12 93 AS/SECTOR08/LAN09/USD12 "12,93" 1293 +93 13 93 AS/SECTOR08/LAN09/USD13 "13,93" 1393 +93 14 93 AS/SECTOR08/LAN09/USD14 "14,93" 1493 +93 15 93 AS/SECTOR08/LAN09/USD15 "15,93" 1593 +94 7 94 AS/SECTOR08/LAN10/USD07 "7,94" 0794 +94 8 94 AS/SECTOR08/LAN10/USD08 "8,94" 0894 +94 9 94 AS/SECTOR08/LAN10/USD09 "9,94" 0994 +94 10 94 AS/SECTOR08/LAN10/USD10 "10,94" 1094 +94 11 94 AS/SECTOR08/LAN10/USD11 "11,94" 1194 +94 12 94 AS/SECTOR08/LAN10/USD12 "12,94" 1294 +94 13 94 AS/SECTOR08/LAN10/USD13 "13,94" 1394 +94 14 94 AS/SECTOR08/LAN10/USD14 "14,94" 1494 +94 15 94 AS/SECTOR08/LAN10/USD15 "15,94" 1594 +95 1 24 AS/SECTOR08/LAN11/USD01 "1,24" 0124 +95 2 24 AS/SECTOR08/LAN11/USD02 "2,24" 0224 +95 3 48 AS/SECTOR08/LAN11/USD03 "3,48" 0348 +95 4 48 AS/SECTOR08/LAN11/USD04 "4,48" 0448 +95 5 48 AS/SECTOR08/LAN11/USD05 "5,48" 0548 +95 6 48 AS/SECTOR08/LAN11/USD06 "6,48" 0648 +95 7 95 AS/SECTOR08/LAN11/USD07 "7,95" 0795 +95 8 95 AS/SECTOR08/LAN11/USD08 "8,95" 0895 +95 9 95 AS/SECTOR08/LAN11/USD09 "9,95" 0995 +95 10 95 AS/SECTOR08/LAN11/USD10 "10,95" 1095 +95 11 95 AS/SECTOR08/LAN11/USD11 "11,95" 1195 +95 12 95 AS/SECTOR08/LAN11/USD12 "12,95" 1295 +95 13 95 AS/SECTOR08/LAN11/USD13 "13,95" 1395 +95 14 95 AS/SECTOR08/LAN11/USD14 "14,95" 1495 +95 15 95 AS/SECTOR08/LAN11/USD15 "15,95" 1595 +96 7 96 AS/SECTOR08/LAN12/USD07 "7,96" 0796 +96 8 96 AS/SECTOR08/LAN12/USD08 "8,96" 0896 +96 9 96 AS/SECTOR08/LAN12/USD09 "9,96" 0996 +96 10 96 AS/SECTOR08/LAN12/USD10 "10,96" 1096 +96 11 96 AS/SECTOR08/LAN12/USD11 "11,96" 1196 +96 12 96 AS/SECTOR08/LAN12/USD12 "12,96" 1296 +96 13 96 AS/SECTOR08/LAN12/USD13 "13,96" 1396 +96 14 96 AS/SECTOR08/LAN12/USD14 "14,96" 1496 +96 15 96 AS/SECTOR08/LAN12/USD15 "15,96" 1596 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.orig b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.orig new file mode 100644 index 000000000..f2943296e --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD.txt.orig @@ -0,0 +1,268 @@ +1 1 1 AS/SECTOR01/LAN01/USD01 "1,1" 0101 +1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +2 2 2 AS/SECTOR01/LAN02/USD02 "2,2" 0202 +2 3 2 AS/SECTOR01/LAN02/USD03 "3,2" 0302 +2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 +2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 +2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 +3 1 2 AS/SECTOR01/LAN03/USD01 "1,2" 0102 +3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 +3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 +3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 +3 5 3 AS/SECTOR01/LAN03/USD05 "5,3" 0503 +3 6 3 AS/SECTOR01/LAN03/USD06 "6,3" 0603 +4 2 4 AS/SECTOR01/LAN04/USD02 "2,4" 0204 +4 3 4 AS/SECTOR01/LAN04/USD03 "3,4" 0304 +4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 +4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 +4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 +5 1 3 AS/SECTOR01/LAN05/USD01 "1,3" 0103 +5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 +5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 +5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 +5 5 5 AS/SECTOR01/LAN05/USD05 "5,5" 0505 +5 6 5 AS/SECTOR01/LAN05/USD06 "6,5" 0605 +6 2 6 AS/SECTOR01/LAN06/USD02 "2,6" 0206 +6 3 6 AS/SECTOR01/LAN06/USD03 "3,6" 0306 +6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 +6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 +6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 +7 1 4 AS/SECTOR01/LAN07/USD01 "1,4" 0104 +7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 +7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 +7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 +7 5 7 AS/SECTOR01/LAN07/USD05 "5,7" 0507 +7 6 7 AS/SECTOR01/LAN07/USD06 "6,7" 0607 +7 7 7 AS/SECTOR01/LAN07/USD07 "7,1" 0701 +8 2 8 AS/SECTOR01/LAN08/USD02 "2,8" 0208 +8 3 8 AS/SECTOR01/LAN08/USD03 "3,8" 0308 +8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 +8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 +8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 +9 1 5 AS/SECTOR01/LAN09/USD01 "1,5" 0105 +9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 +9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 +9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 +9 5 9 AS/SECTOR01/LAN09/USD05 "5,9" 0509 +9 6 9 AS/SECTOR01/LAN09/USD06 "6,9" 0609 +10 2 10 AS/SECTOR01/LAN10/USD02 "2,10" 0210 +10 3 10 AS/SECTOR01/LAN10/USD03 "3,10" 0310 +10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 +10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 +10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 +11 1 6 AS/SECTOR01/LAN11/USD01 "1,6" 0106 +11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 +11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 +11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 +11 5 11 AS/SECTOR01/LAN11/USD05 "5,11" 0511 +11 6 11 AS/SECTOR01/LAN11/USD06 "6,11" 0611 +12 2 12 AS/SECTOR01/LAN12/USD02 "2,12" 0212 +12 3 12 AS/SECTOR01/LAN12/USD03 "3,12" 0312 +12 4 12 AS/SECTOR01/LAN12/USD04 "4,12" 0412 +12 5 12 AS/SECTOR01/LAN12/USD05 "5,12" 0512 +12 6 12 AS/SECTOR01/LAN12/USD06 "6,12" 0612 +13 1 7 AS/SECTOR02/LAN01/USD01 "1,7" 0107 +13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 +13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 +13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 +13 5 13 AS/SECTOR02/LAN01/USD05 "5,13" 0513 +13 6 13 AS/SECTOR02/LAN01/USD06 "6,13" 0613 +14 2 14 AS/SECTOR02/LAN02/USD02 "2,14" 0214 +14 3 14 AS/SECTOR02/LAN02/USD03 "3,14" 0314 +14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 +14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 +14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 +15 1 8 AS/SECTOR02/LAN03/USD01 "1,8" 0108 +15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 +15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 +15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 +15 5 15 AS/SECTOR02/LAN03/USD05 "5,15" 0515 +15 6 15 AS/SECTOR02/LAN03/USD06 "6,15" 0615 +16 2 16 AS/SECTOR02/LAN04/USD02 "2,16" 0216 +16 3 16 AS/SECTOR02/LAN04/USD03 "3,16" 0316 +16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 +16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 +16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 +17 1 9 AS/SECTOR02/LAN05/USD01 "1,9" 0109 +17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 +17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 +17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 +17 5 17 AS/SECTOR02/LAN05/USD05 "5,17" 0517 +17 6 17 AS/SECTOR02/LAN05/USD06 "6,17" 0617 +18 2 18 AS/SECTOR02/LAN06/USD02 "2,18" 0218 +18 3 18 AS/SECTOR02/LAN06/USD03 "3,18" 0318 +18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 +18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 +18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 +19 1 10 AS/SECTOR02/LAN07/USD01 "1,10" 0110 +19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 +19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 +19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 +19 5 19 AS/SECTOR02/LAN07/USD05 "5,19" 0519 +19 6 19 AS/SECTOR02/LAN07/USD06 "6,19" 0619 +19 7 19 AS/SECTOR02/LAN07/USD07 "7,2" 0702 +20 2 20 AS/SECTOR02/LAN08/USD02 "2,20" 0220 +20 3 20 AS/SECTOR02/LAN08/USD03 "3,20" 0320 +20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 +20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 +20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 +21 1 11 AS/SECTOR02/LAN09/USD01 "1,11" 0111 +21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 +21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 +21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 +21 5 21 AS/SECTOR02/LAN09/USD05 "5,21" 0521 +21 6 21 AS/SECTOR02/LAN09/USD06 "6,21" 0621 +22 2 22 AS/SECTOR02/LAN10/USD02 "2,22" 0222 +22 3 22 AS/SECTOR02/LAN10/USD03 "3,22" 0322 +22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 +22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 +22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 +23 1 12 AS/SECTOR02/LAN11/USD01 "1,12" 0112 +23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 +23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 +23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 +23 5 23 AS/SECTOR02/LAN11/USD05 "5,23" 0523 +23 6 23 AS/SECTOR02/LAN11/USD06 "6,23" 0623 +24 2 24 AS/SECTOR02/LAN12/USD02 "2,24" 0224 +24 3 24 AS/SECTOR02/LAN12/USD03 "3,24" 0324 +24 4 24 AS/SECTOR02/LAN12/USD04 "4,24" 0424 +24 5 24 AS/SECTOR02/LAN12/USD05 "5,24" 0524 +24 6 24 AS/SECTOR02/LAN12/USD06 "6,24" 0624 +25 1 13 AS/SECTOR03/LAN01/USD01 "1,13" 0113 +25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 +25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 +25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 +25 5 25 AS/SECTOR03/LAN01/USD05 "5,25" 0525 +25 6 25 AS/SECTOR03/LAN01/USD06 "6,25" 0625 +26 2 26 AS/SECTOR03/LAN02/USD02 "2,26" 0226 +26 3 26 AS/SECTOR03/LAN02/USD03 "3,26" 0326 +26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 +26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 +26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 +27 1 14 AS/SECTOR03/LAN03/USD01 "1,14" 0114 +27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 +27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 +27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 +27 5 27 AS/SECTOR03/LAN03/USD05 "5,27" 0527 +27 6 27 AS/SECTOR03/LAN03/USD06 "6,27" 0627 +28 2 28 AS/SECTOR03/LAN04/USD02 "2,28" 0228 +28 3 28 AS/SECTOR03/LAN04/USD03 "3,28" 0328 +28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 +28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 +28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 +29 1 15 AS/SECTOR03/LAN05/USD01 "1,15" 0115 +29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 +29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 +29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 +29 5 29 AS/SECTOR03/LAN05/USD05 "5,29" 0529 +29 6 29 AS/SECTOR03/LAN05/USD06 "6,29" 0629 +30 2 30 AS/SECTOR03/LAN06/USD02 "2,30" 0230 +30 3 30 AS/SECTOR03/LAN06/USD03 "3,30" 0330 +30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 +30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 +30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 +31 1 16 AS/SECTOR03/LAN07/USD01 "1,16" 0116 +31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 +31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 +31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 +31 5 31 AS/SECTOR03/LAN07/USD05 "5,31" 0531 +31 6 31 AS/SECTOR03/LAN07/USD06 "6,31" 0631 +31 7 31 AS/SECTOR03/LAN07/USD07 "7,3" 0703 +32 2 32 AS/SECTOR03/LAN08/USD02 "2,32" 0232 +32 3 32 AS/SECTOR03/LAN08/USD03 "3,32" 0332 +32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 +32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 +32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 +33 1 17 AS/SECTOR03/LAN09/USD01 "1,17" 0117 +33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 +33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 +33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 +33 5 33 AS/SECTOR03/LAN09/USD05 "5,33" 0533 +33 6 33 AS/SECTOR03/LAN09/USD06 "6,33" 0633 +34 2 34 AS/SECTOR03/LAN10/USD02 "2,34" 0234 +34 3 34 AS/SECTOR03/LAN10/USD03 "3,34" 0334 +34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 +34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 +34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 +35 1 18 AS/SECTOR03/LAN11/USD01 "1,18" 0118 +35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 +35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 +35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 +35 5 35 AS/SECTOR03/LAN11/USD05 "5,35" 0535 +35 6 35 AS/SECTOR03/LAN11/USD06 "6,35" 0635 +36 2 36 AS/SECTOR03/LAN12/USD02 "2,36" 0236 +36 3 36 AS/SECTOR03/LAN12/USD03 "3,36" 0336 +36 4 36 AS/SECTOR03/LAN12/USD04 "4,36" 0436 +36 5 36 AS/SECTOR03/LAN12/USD05 "5,36" 0536 +36 6 36 AS/SECTOR03/LAN12/USD06 "6,36" 0636 +37 1 19 AS/SECTOR04/LAN01/USD01 "1,19" 0119 +37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 +37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 +37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 +37 5 37 AS/SECTOR04/LAN01/USD05 "5,37" 0537 +37 6 37 AS/SECTOR04/LAN01/USD06 "6,37" 0637 +38 2 38 AS/SECTOR04/LAN02/USD02 "2,38" 0238 +38 3 38 AS/SECTOR04/LAN02/USD03 "3,38" 0338 +38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 +38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 +38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 +39 1 20 AS/SECTOR04/LAN03/USD01 "1,20" 0120 +39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 +39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 +39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 +39 5 39 AS/SECTOR04/LAN03/USD05 "5,39" 0539 +39 6 39 AS/SECTOR04/LAN03/USD06 "6,39" 0639 +40 2 40 AS/SECTOR04/LAN04/USD02 "2,40" 0240 +40 3 40 AS/SECTOR04/LAN04/USD03 "3,40" 0340 +40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 +40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 +40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 +41 1 21 AS/SECTOR04/LAN05/USD01 "1,21" 0121 +41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 +41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 +41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 +41 5 41 AS/SECTOR04/LAN05/USD05 "5,41" 0541 +41 6 41 AS/SECTOR04/LAN05/USD06 "6,41" 0641 +42 2 42 AS/SECTOR04/LAN06/USD02 "2,42" 0242 +42 3 42 AS/SECTOR04/LAN06/USD03 "3,42" 0342 +42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 +42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 +42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 +43 1 22 AS/SECTOR04/LAN07/USD01 "1,22" 0122 +43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 +43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 +43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 +43 5 43 AS/SECTOR04/LAN07/USD05 "5,43" 0543 +43 6 43 AS/SECTOR04/LAN07/USD06 "6,43" 0643 +43 7 43 AS/SECTOR04/LAN07/USD07 "7,4" 0704 +44 2 44 AS/SECTOR04/LAN08/USD02 "2,44" 0244 +44 3 44 AS/SECTOR04/LAN08/USD03 "3,44" 0344 +44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 +44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 +44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 +45 1 23 AS/SECTOR04/LAN09/USD01 "1,23" 0123 +45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 +45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 +45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 +45 5 45 AS/SECTOR04/LAN09/USD05 "5,45" 0545 +45 6 45 AS/SECTOR04/LAN09/USD06 "6,45" 0645 +46 2 46 AS/SECTOR04/LAN10/USD02 "2,46" 0246 +46 3 46 AS/SECTOR04/LAN10/USD03 "3,46" 0346 +46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 +46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 +46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 +47 1 24 AS/SECTOR04/LAN11/USD01 "1,24" 0124 +47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 +47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 +47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 +47 5 47 AS/SECTOR04/LAN11/USD05 "5,47" 0547 +47 6 47 AS/SECTOR04/LAN11/USD06 "6,47" 0647 +48 2 48 AS/SECTOR04/LAN12/USD02 "2,48" 0248 +48 3 48 AS/SECTOR04/LAN12/USD03 "3,48" 0348 +48 4 48 AS/SECTOR04/LAN12/USD04 "4,48" 0448 +48 5 48 AS/SECTOR04/LAN12/USD05 "5,48" 0548 +48 6 48 AS/SECTOR04/LAN12/USD06 "6,48" 0648 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD_S1.txt b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S1.txt new file mode 100644 index 000000000..181e31f47 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S1.txt @@ -0,0 +1,61 @@ +1 2 1 AS/SECTOR01/LAN01/USD02 "2,1" 0201 +1 3 1 AS/SECTOR01/LAN01/USD03 "3,1" 0301 +1 4 1 AS/SECTOR01/LAN01/USD04 "4,1" 0401 +1 5 1 AS/SECTOR01/LAN01/USD05 "5,1" 0501 +1 6 1 AS/SECTOR01/LAN01/USD06 "6,1" 0601 +2 2 2 AS/SECTOR01/LAN02/USD02 "2,2" 0202 +2 3 2 AS/SECTOR01/LAN02/USD03 "3,2" 0302 +2 4 2 AS/SECTOR01/LAN02/USD04 "4,2" 0402 +2 5 2 AS/SECTOR01/LAN02/USD05 "5,2" 0502 +2 6 2 AS/SECTOR01/LAN02/USD06 "6,2" 0602 +3 2 3 AS/SECTOR01/LAN03/USD02 "2,3" 0203 +3 3 3 AS/SECTOR01/LAN03/USD03 "3,3" 0303 +3 4 3 AS/SECTOR01/LAN03/USD04 "4,3" 0403 +3 5 3 AS/SECTOR01/LAN03/USD05 "5,3" 0503 +3 6 3 AS/SECTOR01/LAN03/USD06 "6,3" 0603 +4 2 4 AS/SECTOR01/LAN04/USD02 "2,4" 0204 +4 3 4 AS/SECTOR01/LAN04/USD03 "3,4" 0304 +4 4 4 AS/SECTOR01/LAN04/USD04 "4,4" 0404 +4 5 4 AS/SECTOR01/LAN04/USD05 "5,4" 0504 +4 6 4 AS/SECTOR01/LAN04/USD06 "6,4" 0604 +5 2 5 AS/SECTOR01/LAN05/USD02 "2,5" 0205 +5 3 5 AS/SECTOR01/LAN05/USD03 "3,5" 0305 +5 4 5 AS/SECTOR01/LAN05/USD04 "4,5" 0405 +5 5 5 AS/SECTOR01/LAN05/USD05 "5,5" 0505 +5 6 5 AS/SECTOR01/LAN05/USD06 "6,5" 0605 +6 2 6 AS/SECTOR01/LAN06/USD02 "2,6" 0206 +6 3 6 AS/SECTOR01/LAN06/USD03 "3,6" 0306 +6 4 6 AS/SECTOR01/LAN06/USD04 "4,6" 0406 +6 5 6 AS/SECTOR01/LAN06/USD05 "5,6" 0506 +6 6 6 AS/SECTOR01/LAN06/USD06 "6,6" 0606 +7 2 7 AS/SECTOR01/LAN07/USD02 "2,7" 0207 +7 3 7 AS/SECTOR01/LAN07/USD03 "3,7" 0307 +7 4 7 AS/SECTOR01/LAN07/USD04 "4,7" 0407 +7 5 7 AS/SECTOR01/LAN07/USD05 "5,7" 0507 +7 6 7 AS/SECTOR01/LAN07/USD06 "6,7" 0607 +7 7 1 AS/SECTOR01/LAN07/USD07 "7,1" 0701 +8 2 8 AS/SECTOR01/LAN08/USD02 "2,8" 0208 +8 3 8 AS/SECTOR01/LAN08/USD03 "3,8" 0308 +8 4 8 AS/SECTOR01/LAN08/USD04 "4,8" 0408 +8 5 8 AS/SECTOR01/LAN08/USD05 "5,8" 0508 +8 6 8 AS/SECTOR01/LAN08/USD06 "6,8" 0608 +9 2 9 AS/SECTOR01/LAN09/USD02 "2,9" 0209 +9 3 9 AS/SECTOR01/LAN09/USD03 "3,9" 0309 +9 4 9 AS/SECTOR01/LAN09/USD04 "4,9" 0409 +9 5 9 AS/SECTOR01/LAN09/USD05 "5,9" 0509 +9 6 9 AS/SECTOR01/LAN09/USD06 "6,9" 0609 +10 2 10 AS/SECTOR01/LAN10/USD02 "2,10" 0210 +10 3 10 AS/SECTOR01/LAN10/USD03 "3,10" 0310 +10 4 10 AS/SECTOR01/LAN10/USD04 "4,10" 0410 +10 5 10 AS/SECTOR01/LAN10/USD05 "5,10" 0510 +10 6 10 AS/SECTOR01/LAN10/USD06 "6,10" 0610 +11 2 11 AS/SECTOR01/LAN11/USD02 "2,11" 0211 +11 3 11 AS/SECTOR01/LAN11/USD03 "3,11" 0311 +11 4 11 AS/SECTOR01/LAN11/USD04 "4,11" 0411 +11 5 11 AS/SECTOR01/LAN11/USD05 "5,11" 0511 +11 6 11 AS/SECTOR01/LAN11/USD06 "6,11" 0611 +12 2 12 AS/SECTOR01/LAN12/USD02 "2,12" 0212 +12 3 12 AS/SECTOR01/LAN12/USD03 "3,12" 0312 +12 4 12 AS/SECTOR01/LAN12/USD04 "4,12" 0412 +12 5 12 AS/SECTOR01/LAN12/USD05 "5,12" 0512 +12 6 12 AS/SECTOR01/LAN12/USD06 "6,12" 0612 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD_S2.txt b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S2.txt new file mode 100644 index 000000000..70811a8ba --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S2.txt @@ -0,0 +1,61 @@ +13 2 13 AS/SECTOR02/LAN01/USD02 "2,13" 0213 +13 3 13 AS/SECTOR02/LAN01/USD03 "3,13" 0313 +13 4 13 AS/SECTOR02/LAN01/USD04 "4,13" 0413 +13 5 13 AS/SECTOR02/LAN01/USD05 "5,13" 0513 +13 6 13 AS/SECTOR02/LAN01/USD06 "6,13" 0613 +14 2 14 AS/SECTOR02/LAN02/USD02 "2,14" 0214 +14 3 14 AS/SECTOR02/LAN02/USD03 "3,14" 0314 +14 4 14 AS/SECTOR02/LAN02/USD04 "4,14" 0414 +14 5 14 AS/SECTOR02/LAN02/USD05 "5,14" 0514 +14 6 14 AS/SECTOR02/LAN02/USD06 "6,14" 0614 +15 2 15 AS/SECTOR02/LAN03/USD02 "2,15" 0215 +15 3 15 AS/SECTOR02/LAN03/USD03 "3,15" 0315 +15 4 15 AS/SECTOR02/LAN03/USD04 "4,15" 0415 +15 5 15 AS/SECTOR02/LAN03/USD05 "5,15" 0515 +15 6 15 AS/SECTOR02/LAN03/USD06 "6,15" 0615 +16 2 16 AS/SECTOR02/LAN04/USD02 "2,16" 0216 +16 3 16 AS/SECTOR02/LAN04/USD03 "3,16" 0316 +16 4 16 AS/SECTOR02/LAN04/USD04 "4,16" 0416 +16 5 16 AS/SECTOR02/LAN04/USD05 "5,16" 0516 +16 6 16 AS/SECTOR02/LAN04/USD06 "6,16" 0616 +17 2 17 AS/SECTOR02/LAN05/USD02 "2,17" 0217 +17 3 17 AS/SECTOR02/LAN05/USD03 "3,17" 0317 +17 4 17 AS/SECTOR02/LAN05/USD04 "4,17" 0417 +17 5 17 AS/SECTOR02/LAN05/USD05 "5,17" 0517 +17 6 17 AS/SECTOR02/LAN05/USD06 "6,17" 0617 +18 2 18 AS/SECTOR02/LAN06/USD02 "2,18" 0218 +18 3 18 AS/SECTOR02/LAN06/USD03 "3,18" 0318 +18 4 18 AS/SECTOR02/LAN06/USD04 "4,18" 0418 +18 5 18 AS/SECTOR02/LAN06/USD05 "5,18" 0518 +18 6 18 AS/SECTOR02/LAN06/USD06 "6,18" 0618 +19 2 19 AS/SECTOR02/LAN07/USD02 "2,19" 0219 +19 3 19 AS/SECTOR02/LAN07/USD03 "3,19" 0319 +19 4 19 AS/SECTOR02/LAN07/USD04 "4,19" 0419 +19 5 19 AS/SECTOR02/LAN07/USD05 "5,19" 0519 +19 6 19 AS/SECTOR02/LAN07/USD06 "6,19" 0619 +19 7 2 AS/SECTOR02/LAN07/USD07 "7,2" 0702 +20 2 20 AS/SECTOR02/LAN08/USD02 "2,20" 0220 +20 3 20 AS/SECTOR02/LAN08/USD03 "3,20" 0320 +20 4 20 AS/SECTOR02/LAN08/USD04 "4,20" 0420 +20 5 20 AS/SECTOR02/LAN08/USD05 "5,20" 0520 +20 6 20 AS/SECTOR02/LAN08/USD06 "6,20" 0620 +21 2 21 AS/SECTOR02/LAN09/USD02 "2,21" 0221 +21 3 21 AS/SECTOR02/LAN09/USD03 "3,21" 0321 +21 4 21 AS/SECTOR02/LAN09/USD04 "4,21" 0421 +21 5 21 AS/SECTOR02/LAN09/USD05 "5,21" 0521 +21 6 21 AS/SECTOR02/LAN09/USD06 "6,21" 0621 +22 2 22 AS/SECTOR02/LAN10/USD02 "2,22" 0222 +22 3 22 AS/SECTOR02/LAN10/USD03 "3,22" 0322 +22 4 22 AS/SECTOR02/LAN10/USD04 "4,22" 0422 +22 5 22 AS/SECTOR02/LAN10/USD05 "5,22" 0522 +22 6 22 AS/SECTOR02/LAN10/USD06 "6,22" 0622 +23 2 23 AS/SECTOR02/LAN11/USD02 "2,23" 0223 +23 3 23 AS/SECTOR02/LAN11/USD03 "3,23" 0323 +23 4 23 AS/SECTOR02/LAN11/USD04 "4,23" 0423 +23 5 23 AS/SECTOR02/LAN11/USD05 "5,23" 0523 +23 6 23 AS/SECTOR02/LAN11/USD06 "6,23" 0623 +24 2 24 AS/SECTOR02/LAN12/USD02 "2,24" 0224 +24 3 24 AS/SECTOR02/LAN12/USD03 "3,24" 0324 +24 4 24 AS/SECTOR02/LAN12/USD04 "4,24" 0424 +24 5 24 AS/SECTOR02/LAN12/USD05 "5,24" 0524 +24 6 24 AS/SECTOR02/LAN12/USD06 "6,24" 0624 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD_S3.txt b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S3.txt new file mode 100644 index 000000000..1cc2c6195 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S3.txt @@ -0,0 +1,61 @@ +25 2 25 AS/SECTOR03/LAN01/USD02 "2,25" 0225 +25 3 25 AS/SECTOR03/LAN01/USD03 "3,25" 0325 +25 4 25 AS/SECTOR03/LAN01/USD04 "4,25" 0425 +25 5 25 AS/SECTOR03/LAN01/USD05 "5,25" 0525 +25 6 25 AS/SECTOR03/LAN01/USD06 "6,25" 0625 +26 2 26 AS/SECTOR03/LAN02/USD02 "2,26" 0226 +26 3 26 AS/SECTOR03/LAN02/USD03 "3,26" 0326 +26 4 26 AS/SECTOR03/LAN02/USD04 "4,26" 0426 +26 5 26 AS/SECTOR03/LAN02/USD05 "5,26" 0526 +26 6 26 AS/SECTOR03/LAN02/USD06 "6,26" 0626 +27 2 27 AS/SECTOR03/LAN03/USD02 "2,27" 0227 +27 3 27 AS/SECTOR03/LAN03/USD03 "3,27" 0327 +27 4 27 AS/SECTOR03/LAN03/USD04 "4,27" 0427 +27 5 27 AS/SECTOR03/LAN03/USD05 "5,27" 0527 +27 6 27 AS/SECTOR03/LAN03/USD06 "6,27" 0627 +28 2 28 AS/SECTOR03/LAN04/USD02 "2,28" 0228 +28 3 28 AS/SECTOR03/LAN04/USD03 "3,28" 0328 +28 4 28 AS/SECTOR03/LAN04/USD04 "4,28" 0428 +28 5 28 AS/SECTOR03/LAN04/USD05 "5,28" 0528 +28 6 28 AS/SECTOR03/LAN04/USD06 "6,28" 0628 +29 2 29 AS/SECTOR03/LAN05/USD02 "2,29" 0229 +29 3 29 AS/SECTOR03/LAN05/USD03 "3,29" 0329 +29 4 29 AS/SECTOR03/LAN05/USD04 "4,29" 0429 +29 5 29 AS/SECTOR03/LAN05/USD05 "5,29" 0529 +29 6 29 AS/SECTOR03/LAN05/USD06 "6,29" 0629 +30 2 30 AS/SECTOR03/LAN06/USD02 "2,30" 0230 +30 3 30 AS/SECTOR03/LAN06/USD03 "3,30" 0330 +30 4 30 AS/SECTOR03/LAN06/USD04 "4,30" 0430 +30 5 30 AS/SECTOR03/LAN06/USD05 "5,30" 0530 +30 6 30 AS/SECTOR03/LAN06/USD06 "6,30" 0630 +31 2 31 AS/SECTOR03/LAN07/USD02 "2,31" 0231 +31 3 31 AS/SECTOR03/LAN07/USD03 "3,31" 0331 +31 4 31 AS/SECTOR03/LAN07/USD04 "4,31" 0431 +31 5 31 AS/SECTOR03/LAN07/USD05 "5,31" 0531 +31 6 31 AS/SECTOR03/LAN07/USD06 "6,31" 0631 +31 7 3 AS/SECTOR03/LAN07/USD07 "7,3" 0703 +32 2 32 AS/SECTOR03/LAN08/USD02 "2,32" 0232 +32 3 32 AS/SECTOR03/LAN08/USD03 "3,32" 0332 +32 4 32 AS/SECTOR03/LAN08/USD04 "4,32" 0432 +32 5 32 AS/SECTOR03/LAN08/USD05 "5,32" 0532 +32 6 32 AS/SECTOR03/LAN08/USD06 "6,32" 0632 +33 2 33 AS/SECTOR03/LAN09/USD02 "2,33" 0233 +33 3 33 AS/SECTOR03/LAN09/USD03 "3,33" 0333 +33 4 33 AS/SECTOR03/LAN09/USD04 "4,33" 0433 +33 5 33 AS/SECTOR03/LAN09/USD05 "5,33" 0533 +33 6 33 AS/SECTOR03/LAN09/USD06 "6,33" 0633 +34 2 34 AS/SECTOR03/LAN10/USD02 "2,34" 0234 +34 3 34 AS/SECTOR03/LAN10/USD03 "3,34" 0334 +34 4 34 AS/SECTOR03/LAN10/USD04 "4,34" 0434 +34 5 34 AS/SECTOR03/LAN10/USD05 "5,34" 0534 +34 6 34 AS/SECTOR03/LAN10/USD06 "6,34" 0634 +35 2 35 AS/SECTOR03/LAN11/USD02 "2,35" 0235 +35 3 35 AS/SECTOR03/LAN11/USD03 "3,35" 0335 +35 4 35 AS/SECTOR03/LAN11/USD04 "4,35" 0435 +35 5 35 AS/SECTOR03/LAN11/USD05 "5,35" 0535 +35 6 35 AS/SECTOR03/LAN11/USD06 "6,35" 0635 +36 2 36 AS/SECTOR03/LAN12/USD02 "2,36" 0236 +36 3 36 AS/SECTOR03/LAN12/USD03 "3,36" 0336 +36 4 36 AS/SECTOR03/LAN12/USD04 "4,36" 0436 +36 5 36 AS/SECTOR03/LAN12/USD05 "5,36" 0536 +36 6 36 AS/SECTOR03/LAN12/USD06 "6,36" 0636 diff --git a/Noto/Configuration/CDB/alma/AS/tab_convUSD_S4.txt b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S4.txt new file mode 100644 index 000000000..07ed2389c --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/tab_convUSD_S4.txt @@ -0,0 +1,61 @@ +37 2 37 AS/SECTOR04/LAN01/USD02 "2,37" 0237 +37 3 37 AS/SECTOR04/LAN01/USD03 "3,37" 0337 +37 4 37 AS/SECTOR04/LAN01/USD04 "4,37" 0437 +37 5 37 AS/SECTOR04/LAN01/USD05 "5,37" 0537 +37 6 37 AS/SECTOR04/LAN01/USD06 "6,37" 0637 +38 2 38 AS/SECTOR04/LAN02/USD02 "2,38" 0238 +38 3 38 AS/SECTOR04/LAN02/USD03 "3,38" 0338 +38 4 38 AS/SECTOR04/LAN02/USD04 "4,38" 0438 +38 5 38 AS/SECTOR04/LAN02/USD05 "5,38" 0538 +38 6 38 AS/SECTOR04/LAN02/USD06 "6,38" 0638 +39 2 39 AS/SECTOR04/LAN03/USD02 "2,39" 0239 +39 3 39 AS/SECTOR04/LAN03/USD03 "3,39" 0339 +39 4 39 AS/SECTOR04/LAN03/USD04 "4,39" 0439 +39 5 39 AS/SECTOR04/LAN03/USD05 "5,39" 0539 +39 6 39 AS/SECTOR04/LAN03/USD06 "6,39" 0639 +40 2 40 AS/SECTOR04/LAN04/USD02 "2,40" 0240 +40 3 40 AS/SECTOR04/LAN04/USD03 "3,40" 0340 +40 4 40 AS/SECTOR04/LAN04/USD04 "4,40" 0440 +40 5 40 AS/SECTOR04/LAN04/USD05 "5,40" 0540 +40 6 40 AS/SECTOR04/LAN04/USD06 "6,40" 0640 +41 2 41 AS/SECTOR04/LAN05/USD02 "2,41" 0241 +41 3 41 AS/SECTOR04/LAN05/USD03 "3,41" 0341 +41 4 41 AS/SECTOR04/LAN05/USD04 "4,41" 0441 +41 5 41 AS/SECTOR04/LAN05/USD05 "5,41" 0541 +41 6 41 AS/SECTOR04/LAN05/USD06 "6,41" 0641 +42 2 42 AS/SECTOR04/LAN06/USD02 "2,42" 0242 +42 3 42 AS/SECTOR04/LAN06/USD03 "3,42" 0342 +42 4 42 AS/SECTOR04/LAN06/USD04 "4,42" 0442 +42 5 42 AS/SECTOR04/LAN06/USD05 "5,42" 0542 +42 6 42 AS/SECTOR04/LAN06/USD06 "6,42" 0642 +43 2 43 AS/SECTOR04/LAN07/USD02 "2,43" 0243 +43 3 43 AS/SECTOR04/LAN07/USD03 "3,43" 0343 +43 4 43 AS/SECTOR04/LAN07/USD04 "4,43" 0443 +43 5 43 AS/SECTOR04/LAN07/USD05 "5,43" 0543 +43 6 43 AS/SECTOR04/LAN07/USD06 "6,43" 0643 +43 7 4 AS/SECTOR04/LAN07/USD07 "7,4" 0704 +44 2 44 AS/SECTOR04/LAN08/USD02 "2,44" 0244 +44 3 44 AS/SECTOR04/LAN08/USD03 "3,44" 0344 +44 4 44 AS/SECTOR04/LAN08/USD04 "4,44" 0444 +44 5 44 AS/SECTOR04/LAN08/USD05 "5,44" 0544 +44 6 44 AS/SECTOR04/LAN08/USD06 "6,44" 0644 +45 2 45 AS/SECTOR04/LAN09/USD02 "2,45" 0245 +45 3 45 AS/SECTOR04/LAN09/USD03 "3,45" 0345 +45 4 45 AS/SECTOR04/LAN09/USD04 "4,45" 0445 +45 5 45 AS/SECTOR04/LAN09/USD05 "5,45" 0545 +45 6 45 AS/SECTOR04/LAN09/USD06 "6,45" 0645 +46 2 46 AS/SECTOR04/LAN10/USD02 "2,46" 0246 +46 3 46 AS/SECTOR04/LAN10/USD03 "3,46" 0346 +46 4 46 AS/SECTOR04/LAN10/USD04 "4,46" 0446 +46 5 46 AS/SECTOR04/LAN10/USD05 "5,46" 0546 +46 6 46 AS/SECTOR04/LAN10/USD06 "6,46" 0646 +47 2 47 AS/SECTOR04/LAN11/USD02 "2,47" 0247 +47 3 47 AS/SECTOR04/LAN11/USD03 "3,47" 0347 +47 4 47 AS/SECTOR04/LAN11/USD04 "4,47" 0447 +47 5 47 AS/SECTOR04/LAN11/USD05 "5,47" 0547 +47 6 47 AS/SECTOR04/LAN11/USD06 "6,47" 0647 +48 2 48 AS/SECTOR04/LAN12/USD02 "2,48" 0248 +48 3 48 AS/SECTOR04/LAN12/USD03 "3,48" 0348 +48 4 48 AS/SECTOR04/LAN12/USD04 "4,48" 0448 +48 5 48 AS/SECTOR04/LAN12/USD05 "5,48" 0548 +48 6 48 AS/SECTOR04/LAN12/USD06 "6,48" 0648 diff --git a/Noto/Configuration/CDB/alma/AS/usd_pos.txt b/Noto/Configuration/CDB/alma/AS/usd_pos.txt new file mode 100644 index 000000000..4b722c5e9 --- /dev/null +++ b/Noto/Configuration/CDB/alma/AS/usd_pos.txt @@ -0,0 +1,24 @@ +-1.5 -0.67 0 0.42 0.53 +-1.41 -0.62 0 0.39 0.47 +-1.21 -0.53 0 0.31 0.34 +-0.91 -0.38 0 0.2 0.15 +-0.55 -0.21 0 0.07 -0.07 +-0.1 0 0 -0.1 -0.34 +0.38 0.23 0 -0.27 -0.63 +0.83 0.44 0 -0.44 -0.9 +1.2 0.62 0 -0.57 -1.12 +1.51 0.76 0 -0.68 -1.3 +1.72 0.86 0 -0.75 -1.41 +1.81 0.9 0 -0.79 -1.47 +1.81 0.9 0 -0.78 -1.46 +1.72 0.86 0 -0.75 -1.42 +1.51 0.76 0 -0.68 -1.3 +1.2 0.62 0 -0.57 -1.13 +0.83 0.44 0 -0.44 -0.91 +0.38 0.23 0 -0.27 -0.63 +-0.1 0 0 -0.1 -0.35 +-0.54 -0.21 0 0.06 -0.08 +-0.91 -0.38 0 0.2 0.15 +-1.21 -0.53 0 0.31 0.34 +-1.41 -0.63 0 0.39 0.47 +-1.51 -0.67 0 0.42 0.54 diff --git a/Noto/Servers/NotoActiveSurfaceBoss/include/NotoActiveSurfaceBossCore.h b/Noto/Servers/NotoActiveSurfaceBoss/include/NotoActiveSurfaceBossCore.h index d58db088d..82aba5bb0 100644 --- a/Noto/Servers/NotoActiveSurfaceBoss/include/NotoActiveSurfaceBossCore.h +++ b/Noto/Servers/NotoActiveSurfaceBoss/include/NotoActiveSurfaceBossCore.h @@ -32,11 +32,11 @@ #define CIRCLES 7 #define ACTUATORS 48 #define firstUSD 1 -#define lastUSD 268 +#define lastUSD 244 #define LOOPTIME 100000 // 0,10 sec #define CDBPATH std::string(getenv("ACS_CDB")) + "/CDB/" #define USDTABLE (CDBPATH + "alma/AS/tab_convUSD.txt").c_str() -#define USDTABLECORRECTIONS (CDBPATH + "alma/AS/act_rev02.txt").c_str() +#define USDTABLECORRECTIONS (CDBPATH + "alma/AS/act_Noto_rev02.txt").c_str() #define MM2HSTEP 350 //(10500 HSTEP / 30 MM) #define MM2STEP 1400 //(42000 STEP / 30 MM) #define WARNINGUSDPERCENT 0.95 @@ -228,7 +228,7 @@ private: bool m_newlut; - const char* m_lut; + std::string m_lut; }; #endif /*NOTOACTIVESURFACEBOSSCORE_H_*/ diff --git a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossCore.cpp b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossCore.cpp index ca379d2e1..2583f1a42 100644 --- a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossCore.cpp +++ b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossCore.cpp @@ -2,7 +2,9 @@ #include #include -int actuatorsInCircle[] = {0,24,48,48,48,48,48,4}; +//int actuatorsInCircle[] = {0,24,48,48,48,48,48,4}; +// SOLO a Noto nel primo giro non ci sono attuatori +int actuatorsInCircle[] = {0,0,48,48,48,48,48,4}; CNotoActiveSurfaceBossCore::CNotoActiveSurfaceBossCore(ContainerServices *service, acscomponent::ACSComponentImpl *me) : m_services(service), @@ -131,7 +133,7 @@ void CNotoActiveSurfaceBossCore::execute() throw (ComponentErrors::CouldntGetCom //CIRATools::Wait(LOOPTIME); } - for (int i = 1; i <= CIRCLES; i++) + for (int i = 2; i <= CIRCLES; i++) { for (int l = 1; l <= actuatorsInCircle[i]; l++) { @@ -206,7 +208,6 @@ void CNotoActiveSurfaceBossCore::cleanUp() { if(!CORBA::is_nil(usd[circleIndex][usdCircleIndex])) { - printf("releasing usd = %s\n", serial_usd); m_services->releaseComponent((const char*)serial_usd); } } @@ -240,7 +241,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius if(circle == 0 && actuator == 0 && radius == 0) // ALL { printf("top.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -261,7 +262,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (90); printf("move to upper mechanical position.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -282,7 +283,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (5); /*printf("stop.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -303,7 +304,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (1);*/ printf("calibration.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -324,7 +325,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (15); /*printf("stop.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -345,7 +346,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (1);*/ printf ("calibration verification.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -366,7 +367,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (150); /*printf("stop.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -387,7 +388,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius ACE_OS::sleep (1);*/ printf ("write calibration results.....\n"); - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -824,7 +825,7 @@ void CNotoActiveSurfaceBossCore::calibrate (int circle, int actuator, int radius if(circle == 0 && actuator == 0 && radius == 0) // ALL { int i, l; - for (i = 1; i <= CIRCLES; i++) + for (i = 2; i <= CIRCLES; i++) { for (l = 1; l <= actuatorsInCircle[i]; l++) { @@ -963,7 +964,7 @@ void CNotoActiveSurfaceBossCore::calVer (int circle, int actuator, int radius) t /* if(circle == 0 && actuator == 0 && radius == 0) // ALL { - for (int i = 1; i <= CIRCLES; i++) + for (int i = 2; i <= CIRCLES; i++) { for (int l = 1; l <= actuatorsInCircle[i]; l++) { @@ -1181,7 +1182,7 @@ void CNotoActiveSurfaceBossCore::onewayAction(ActiveSurface::TASOneWayAction act if(circle == 0 && actuator == 0 && radius == 0) // ALL { - for (int i = 1; i <= CIRCLES; i++) + for (int i = 2; i <= CIRCLES; i++) { for (int l = 1; l <= actuatorsInCircle[i]; l++) { @@ -1337,7 +1338,7 @@ void CNotoActiveSurfaceBossCore::workingActiveSurface() throw (ComponentErrors:: void CNotoActiveSurfaceBossCore::asSetLUT(const char *newlut) { - m_lut= (CDBPATH + "alma/AS/" + newlut).c_str(); + m_lut= std::string(CDBPATH + "alma/AS/" + newlut); m_newlut = true; } @@ -1355,15 +1356,13 @@ void CNotoActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& new if(all_sectors) // USD tables has not been loaded yet { ifstream usdCorrections (m_lut); - //ifstream usdCorrections (USDTABLECORRECTIONS); if(!usdCorrections) { - ACS_SHORT_LOG ((LM_INFO, "File %s not found", m_lut)); - //ACS_SHORT_LOG ((LM_INFO, "File %s not found", USDTABLECORRECTIONS)); - exit(-1); + ACS_SHORT_LOG ((LM_INFO, "File %s not found", m_lut.c_str())); +// exit(-1); } actuatorsCorrections.length(NPOSITIONS); - for (int i = 1; i <= CIRCLES; i++) + for (int i = 2; i <= CIRCLES; i++) { for (int l = 1; l <= actuatorsInCircle[i]; l++) { @@ -1381,7 +1380,7 @@ void CNotoActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& new usdCounter = 0; for(unsigned int i = 0; i < SECTORS; i++) { - m_sector[i] = false; +// m_sector[i] = false; usdCounter += usdCounters[i]; } @@ -1616,7 +1615,7 @@ void CNotoActiveSurfaceBossCore::asStatus4GUIClient(ACS::longSeq& status) throw status.length(lastUSD); unsigned int i = 0; - for (int circle = 1; circle <= CIRCLES; circle++) + for (int circle = 2; circle <= CIRCLES; circle++) { for (int actuator = 1; actuator <= actuatorsInCircle[circle]; actuator++) { diff --git a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossImpl.cpp b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossImpl.cpp index d148c64af..858c714a3 100644 --- a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossImpl.cpp +++ b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossImpl.cpp @@ -100,7 +100,7 @@ void NotoActiveSurfaceBossImpl::initialize() throw (ACSErr::ACSbaseExImpl) try { - m_workingThread=getContainerServices()->getThreadManager()->create *>("MEDICINAACTIVESURFACEBOSSWORKER",m_core); + m_workingThread=getContainerServices()->getThreadManager()->create *>("NOTOACTIVESURFACEBOSSWORKER",m_core); m_workingThread->setSleepTime(workingThreadTime*10); } catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) @@ -116,7 +116,7 @@ void NotoActiveSurfaceBossImpl::initialize() throw (ACSErr::ACSbaseExImpl) for(int sector = 0; sector < SECTORS; sector++) { std::stringstream threadName; - threadName << "MEDICINAACTIVESURFACEBOSSSECTOR"; + threadName << "NOTOACTIVESURFACEBOSSSECTOR"; threadName << sector+1; try { diff --git a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossSectorThread.cpp b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossSectorThread.cpp index 616151b83..59838afa6 100644 --- a/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossSectorThread.cpp +++ b/Noto/Servers/NotoActiveSurfaceBoss/src/NotoActiveSurfaceBossSectorThread.cpp @@ -58,8 +58,7 @@ void CNotoActiveSurfaceBossSectorThread::onStop() void CNotoActiveSurfaceBossSectorThread::runLoop() { - char serial_usd[23]; - char graf[5], mecc[4]; + std::string serial_usd, graf, mecc; int lanIndex; int circleIndex; int usdCircleIndex; @@ -70,12 +69,12 @@ void CNotoActiveSurfaceBossSectorThread::runLoop() try { - current_usd = m_boss->m_services->getComponent(serial_usd); + current_usd = m_boss->m_services->getComponent(serial_usd.c_str()); } catch (maciErrType::CannotGetComponentExImpl& ex) { _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,std::string(m_thread_name + "::runLoop()").c_str()); - Impl.setComponentName(serial_usd); + Impl.setComponentName(serial_usd.c_str()); Impl.log(LM_DEBUG); } -- GitLab From e32149632a829b4e7ef7435797b8825c6e81cd51 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 5 Jun 2024 10:58:50 +0200 Subject: [PATCH 112/150] Fix #873, removed coordinates logging to file (#874) --- SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml b/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml index d9b99d241..b2614e2f6 100644 --- a/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml @@ -26,9 +26,8 @@ Moon="IDL:alma/Antenna/Moon:1.0" Satellite="" SolarSystemBody="" - Otf="IDL:alma/Antenna/OTF:1.0" - CoordinatesFilename="/tmp/coordinates.txt"> - + Otf="IDL:alma/Antenna/OTF:1.0"> + -- GitLab From f98073ab6d31daf8f0d943126b4e16fa72583b88 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 18 Jun 2024 11:57:58 +0200 Subject: [PATCH 113/150] Fix #875, updated SRT K band receiver feeds table (#876) * Fix #875, updated SRT K band receiver feeds table * Fix #875, fixed relative power to 0.98 --- .../SRTKBandMFReceiver/Feeds/Feeds.xml | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTKBandMFReceiver/Feeds/Feeds.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTKBandMFReceiver/Feeds/Feeds.xml index d11d450e1..60d56d8b9 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTKBandMFReceiver/Feeds/Feeds.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/SRTKBandMFReceiver/Feeds/Feeds.xml @@ -14,44 +14,44 @@ 1 - 0.00033355205 - -0.00057772859 - 0.97 + -0.00066710365 + 0.0 + 0.98 2 -0.00033355205 - -0.00057772859 - 0.99 + 0.00057772859 + 0.98 3 - -0.00066710365 - 0.0 - 0.97 + 0.00033355205 + 0.00057772859 + 0.98 4 - -0.00033355205 - 0.00057772859 - 0.95 + 0.00066710365 + 0.0 + 0.98 5 0.00033355205 - 0.00057772859 - 0.97 + -0.00057772859 + 0.98 6 - 0.00066710365 - 0.0 - 0.97 + -0.00033355205 + -0.00057772859 + 0.98 -- GitLab From b2c8455ddd90606881b2fc0bbf69deedfcaaa8e8 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 20 Jun 2024 22:25:34 +0000 Subject: [PATCH 114/150] Updated M3R coordinates --- .../MinorServo/M3R/LookupTables/LookupTables.xml | 8 ++++---- .../MinorServo/M3R/LookupTables/LookupTables.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml index fccec0b0f..cfc134bab 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -10,9 +10,9 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 + ROTATION 44.95999544939037931 + ROTATION 44.95999544939037931 + ROTATION 135.003886290282340384 + ROTATION 135.003886290282340384 diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml index fccec0b0f..cfc134bab 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -10,9 +10,9 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - ROTATION 0 - ROTATION 0 - ROTATION 0 - ROTATION 0 + ROTATION 44.95999544939037931 + ROTATION 44.95999544939037931 + ROTATION 135.003886290282340384 + ROTATION 135.003886290282340384 -- GitLab From 561fbc05e55c8d4155c43f84b92c4a6e9735f2ec Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 20 Jun 2024 22:29:40 +0000 Subject: [PATCH 115/150] Updated MinorServo test CDB setup table --- .../DataBlock/MinorServo/Tabella Setup.csv | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv index 18e70dd49..1a9f02b7e 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv +++ b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv @@ -1,14 +1,14 @@ CONFIGURATION;PFP_TX;PFP_TZ;PFP_RTHETA;SRP_TX;SRP_TY;SRP_TZ;SRP_RX;SRP_RY;SRP_RZ;M3R_RZ;GFR_RZ;DR_GFR1;DR_GFR2;DR_GFR3;DR_PFP;GREGORIAN_CAP; -Primario;0;0;0;-5;5;-120;0;0;0;*;*;*;*;*;*;1; -Gregoriano1;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-88.70659;*;*;*;*;3; -Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;*;*;*;*;3; -Gregoriano3;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;90.97161;*;*;*;*;3; -Gregoriano4;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;162.771;*;*;*;*;3; -Gregoriano5;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;55.373967;*;*;*;*;3; -Gregoriano6;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-51.82117;*;*;*;*;3; +Primario;0;0;0;-5;5;-120;0;0;0;*;*;*;*;*;*;*; +Gregoriano1;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-88.70659;*;*;*;*;4; +Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;*;*;*;*;4; +Gregoriano3;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;90.97161;*;*;*;*;4; +Gregoriano4;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;162.771;*;*;*;*;4; +Gregoriano5;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;55.373967;*;*;*;*;4; +Gregoriano6;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-51.82117;*;*;*;*;4; Gregoriano7;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; Gregoriano8;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; -BWG1;0;0;0;-1.5;11.1393650793988;0.358165166130078;0.049894179898239;-0.036111111111111;0;10;0;*;*;*;*;3; +BWG1;0;0;0;-1.5;11.1393650793988;0.358165166130078;0.049894179898239;-0.036111111111111;0;44.95999544939037931;0;*;*;*;*;4; BWG2;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; -BWG3;0;0;0;-1.5;11.1393650793988;-3.77159716192807;0.049894179898239;-0.036111111111111;0;20;0;*;*;*;*;3; +BWG3;0;0;0;-1.5;11.1393650793988;-3.77159716192807;0.049894179898239;-0.036111111111111;0;135.003886290282340384;0;*;*;*;*;4; BWG4;0;0;0;*;*;*;*;*;*;*;*;*;*;*;*;*; -- GitLab From 59b36e163ec4725cdf88b1566f50435c8f6c892b Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 24 Jun 2024 09:38:47 +0000 Subject: [PATCH 116/150] Updated pointing model for C-High band receiver Updated M3R position as well --- .../M3R/LookupTables/LookupTables.xml | 8 +-- .../DataBlock/PointingModel/PointingModel.xml | 54 +++++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml index cfc134bab..2c09bec47 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml @@ -10,9 +10,9 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - ROTATION 44.95999544939037931 - ROTATION 44.95999544939037931 - ROTATION 135.003886290282340384 - ROTATION 135.003886290282340384 + ROTATION -44.95999544939037931 + ROTATION -44.95999544939037931 + ROTATION -135.003886290282340384 + ROTATION -135.003886290282340384 diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index dfad02903..0d1d538ea 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -3,36 +3,36 @@ CCB 90.0 - 1 -2.2957174778 + 1 -2.2928903102 0 0.0 - 1 -0.0068070539 - 1 -0.0016828823 - 1 -0.0009974039 - 1 -0.0006166724 - 1 0.0852021798 - 1 0.0925736725 + 1 -0.0050373901 + 1 -0.0004504185 + 1 -0.0004917062 + 1 -0.0013179234 + 1 0.0518534295 + 1 0.1137315109 0 0.0 0 0.0 - 1 0.0148610147 - 0 0 - 1 0.0005418550 - 1 -0.0000714987 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 1 0.0103850271 + 0 0.0 + 1 -0.0000271092 + 1 -0.0002547238 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 -- GitLab From b0e2d31fce0bbb13103cb14120a56ef53d928dc6 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 27 Jun 2024 08:53:31 +0200 Subject: [PATCH 117/150] Fix #878, fixed number of digits for SkyOffsets (#879) * Fix #878, fixed number of digits for SkyOffsets * Reduced precision to 3 digits in order to be coherent with other fields --- Common/Clients/CaltoolClient/src/_ctc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/Clients/CaltoolClient/src/_ctc.py b/Common/Clients/CaltoolClient/src/_ctc.py index 4629daf41..a226d1b30 100644 --- a/Common/Clients/CaltoolClient/src/_ctc.py +++ b/Common/Clients/CaltoolClient/src/_ctc.py @@ -120,8 +120,8 @@ class MyWorker(QThread): self.emit(Qt.SIGNAL("scanAxis"),scanaxis) (azOffset,_)=self.azimuthOffset.get_sync() (elOffset,_)=self.elevationOffset.get_sync() - self.emit(Qt.SIGNAL("azoffset"),str(azOffset/math.pi*180)) - self.emit(Qt.SIGNAL("eloffset"),str(elOffset/math.pi*180)) + self.emit(Qt.SIGNAL("azoffset"),f'{azOffset/math.pi*180:.3f}') + self.emit(Qt.SIGNAL("eloffset"),f'{elOffset/math.pi*180:.3f}') rec= self.caltool.isRecording() if rec==True: -- GitLab From f98438c62404e5562faf067aaf3e04564ce17d75 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 2 Jul 2024 11:28:20 +0000 Subject: [PATCH 118/150] Updated SRT CCG pointing model --- .../DataBlock/PointingModel/PointingModel.xml | 108 +++++++++--------- .../DataBlock/PointingModel/PointingModel.xml | 54 ++++----- 2 files changed, 81 insertions(+), 81 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index dfad02903..39c27d3d2 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -3,36 +3,36 @@ CCB 90.0 - 1 -2.2957174778 + 1 -2.2928903102 0 0.0 - 1 -0.0068070539 - 1 -0.0016828823 - 1 -0.0009974039 - 1 -0.0006166724 - 1 0.0852021798 - 1 0.0925736725 + 1 -0.0050373901 + 1 -0.0004504185 + 1 -0.0004917062 + 1 -0.0013179234 + 1 0.0518534295 + 1 0.1137315109 0 0.0 0 0.0 - 1 0.0148610147 - 0 0 - 1 0.0005418550 - 1 -0.0000714987 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 1 0.0103850271 + 0 0.0 + 1 -0.0000271092 + 1 -0.0002547238 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 @@ -142,36 +142,36 @@ CCG 90.0 - 1 -2.2881932258 + 1 -2.2894389629 0 0.0 - 1 -0.0040601296 - 1 0.0014384996 - 1 -0.0003379379 - 1 -0.0015144897 - 1 0.2964673936 - 1 -0.1382924467 + 1 0.0002044142 + 1 0.0018049411 + 1 -0.0000764903 + 1 -0.0015140247 + 1 0.0495181828 + 1 0.1174282282 0 0.0 0 0.0 - 1 -0.0023407035 - 0 0 - 1 0.0002931280 - 1 -0.0004088043 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 1 0.0047037964 + 0 0.0 + 1 0.0004461684 + 1 -0.0008204504 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index 0d1d538ea..39c27d3d2 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -142,36 +142,36 @@ CCG 90.0 - 1 -2.2881932258 + 1 -2.2894389629 0 0.0 - 1 -0.0040601296 - 1 0.0014384996 - 1 -0.0003379379 - 1 -0.0015144897 - 1 0.2964673936 - 1 -0.1382924467 + 1 0.0002044142 + 1 0.0018049411 + 1 -0.0000764903 + 1 -0.0015140247 + 1 0.0495181828 + 1 0.1174282282 0 0.0 0 0.0 - 1 -0.0023407035 - 0 0 - 1 0.0002931280 - 1 -0.0004088043 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - 0 0 + 1 0.0047037964 + 0 0.0 + 1 0.0004461684 + 1 -0.0008204504 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 + 0 0.0 -- GitLab From e2eafa1d146273557e2940b35e408d3e02e65a44 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 14 Oct 2024 10:40:03 +0000 Subject: [PATCH 119/150] Pushing some minor updates --- .../DataBlock/PyCalmux/Mapping/Mapping.xml | 1 + .../StationProcedures/StationProcedures.xml | 1 + .../DataBlock/PyCalmux/Mapping/Mapping.xml | 2 +- .../StationProcedures/StationProcedures.xml | 1 + .../src/SRTMinorServoBossCore.cpp | 18 ++++++++++++++++++ .../src/SRTMinorServoSetupThread.cpp | 2 +- 6 files changed, 23 insertions(+), 2 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml b/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml index 96f138683..f083165cb 100755 --- a/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml +++ b/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml @@ -6,5 +6,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> DBBC60 +DFB70 diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index ef34edabf..e93c54bcc 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -145,6 +145,7 @@ wait=1 antennaPark logMessage=Telescope is now parked + project=Maintenance
diff --git a/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml b/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml index 091831a26..f083165cb 100755 --- a/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml @@ -6,6 +6,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> DBBC60 -DFB80 +DFB70 diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index ef34edabf..e93c54bcc 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -145,6 +145,7 @@ wait=1 antennaPark logMessage=Telescope is now parked + project=Maintenance
diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 3e8120561..7c50b8cca 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -162,6 +162,15 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) { AUTO_TRACE("SRTMinorServoBossCore::setup()"); + if(m_error_code.load() != ERROR_NO_ERROR) + { + _EXCPT(ManagementErrors::ConfigurationErrorExImpl, ex, "SRTMinorServoBossCore::setup()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is in error state. Reset the errors first with the 'servoReset' command."); + ex.log(LM_DEBUG); + throw ex.getConfigurationErrorEx(); + } + try { checkLineStatus(); @@ -283,6 +292,15 @@ void SRTMinorServoBossCore::park() { AUTO_TRACE("SRTMinorServoBossCore::park()"); + if(m_error_code.load() != ERROR_NO_ERROR) + { + _EXCPT(ManagementErrors::ParkingErrorExImpl, ex, "SRTMinorServoBossCore::park()"); + ex.setSubsystem("MinorServo"); + ex.setReason("The system is in error state. Reset the errors first with the 'servoReset' command."); + ex.log(LM_DEBUG); + throw ex.getParkingErrorEx(); + } + try { checkLineStatus(); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index c48f98d14..d782a86cb 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -66,7 +66,7 @@ void SRTMinorServoSetupThread::runLoop() if(IRA::CIRATools::getUNIXEpoch() - m_start_time >= SETUP_TIMEOUT) { - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, "Timeout while performing a setup operation.")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::runLoop()", (LM_CRITICAL, std::string("Timeout while configuring the system. Stopped at status " + std::to_string(m_status)).c_str())); m_core.setError(ERROR_CONFIG_ERROR); this->setStopped(); return; -- GitLab From de02d188aaa03bb833935c6e8470f476b5bdaacf Mon Sep 17 00:00:00 2001 From: aorlati Date: Wed, 16 Oct 2024 08:19:14 +0000 Subject: [PATCH 120/150] Some Noto Active Surface updates --- .../WeatherStation/WeatherStation.xml | 2 +- .../BACKENDS/TotalPower/TotalPower.xml | 1 - .../alma/BACKENDS/TotalPower/TotalPower.xml | 4 +- .../app-defaults/discosStartup.xml | 48 ++++++++++++++++--- .../src/NotoActiveSurfaceBossCore.cpp | 7 ++- SystemMake/Makefile | 8 ++-- 6 files changed, 55 insertions(+), 15 deletions(-) diff --git a/Noto/CDB/MACI/Components/WEATHERSTATION/WeatherStation/WeatherStation.xml b/Noto/CDB/MACI/Components/WEATHERSTATION/WeatherStation/WeatherStation.xml index 2190324a9..0caca7ec2 100644 --- a/Noto/CDB/MACI/Components/WEATHERSTATION/WeatherStation/WeatherStation.xml +++ b/Noto/CDB/MACI/Components/WEATHERSTATION/WeatherStation/WeatherStation.xml @@ -10,7 +10,7 @@ Name="WeatherStation" Code="NotoWeatherStationImpl" - Type="IDL:alma/Weather/WeatherStation:1.0" + Type="IDL:alma/Weather/GenericWeatherStation:1.0" Container="WeatherStationContainer" Default="true" KeepAliveTime="-1" diff --git a/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml b/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml index 332550d6f..ba08992d6 100644 --- a/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml +++ b/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml @@ -12,7 +12,6 @@ Code="TotalPowerImpl" Type="IDL:alma/Backends/TotalPower:1.0" Container="TotalPowerContainer" - Default="true" KeepAliveTime="-1" ImplLang="cpp" /> diff --git a/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml b/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml index 4e5107dd7..05b5037dc 100644 --- a/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml +++ b/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml @@ -18,14 +18,14 @@ RepetitionCacheTime="2000000" RepetitionExpireTime="5000000" DataPort="9001" - DataIPAddress="192.167.187.17" + DataIPAddress="192.167.187.40" DataLatency="3000000" SenderSleepTime="300000" SenderResponseTime="1000000" ControlSleepTime="900000" ControlResponseTime="1000000" BoardsNumber="4" - DataBufferSize="64"> + DataBufferSize="64">
- diff --git a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer06/SRTActiveSurfaceContainer06.xml b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer06/SRTActiveSurfaceContainer06.xml index 69ad936df..f994d42ca 100644 --- a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer06/SRTActiveSurfaceContainer06.xml +++ b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer06/SRTActiveSurfaceContainer06.xml @@ -1,11 +1,26 @@ - - - + + + + - + + + + diff --git a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml index c2efb0e9b..f994d42ca 100644 --- a/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml +++ b/SRT/CDB/MACI/Containers/SRTActiveSurfaceContainer07/SRTActiveSurfaceContainer07.xml @@ -17,7 +17,7 @@ diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h index 6a466ae03..fb9586a1d 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h @@ -73,7 +73,7 @@ class SRTActiveSurfaceCore : public QThread int ActuatorStatusCalLabelCode; signals: - int setGUIActuatorColor(int, int, bool, bool); + int setGUIActuatorColor(int, int, bool, bool, bool); int setGUIAllActuators(bool callfromfunction = false); int setGUIcircleORradius(bool callfromfunction = false); int setGUIActuator(bool callfromfunction = false); diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h index c2c110cb9..1a6f57b2c 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h @@ -45,7 +45,7 @@ class SRTActiveSurfaceGUI : public QWidget, public Ui_SRTActiveSurfaceGUI void setactuator(); private slots: - void changeGUIActuatorColor(int, int, bool, bool); + void changeGUIActuatorColor(int, int, bool, bool, bool); void changeGUIAllActuators(bool callfromfunction = false); void changeGUIcircleORradius(bool callfromfunction = false); void changeGUIActuator(bool callfromfunction = false); diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp index 112f53d86..d33ae2c26 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp @@ -8,6 +8,7 @@ #include // mask pattern for status +#define UNAV 0xFF000000 #define MRUN 0x000080 #define CAMM 0x000100 #define ENBL 0x002000 @@ -123,13 +124,23 @@ void SRTActiveSurfaceCore::run(void) CORBA::Long status = asStatus[actuator - 1]; - bool active; - if ((status & ENBL) == 0) - active = false; + bool active, statusColor; + + if(status == UNAV) + active = false; // red else + { active = true; - emit setGUIActuatorColor(i, l, active, true); + if((status & ENBL) == 0 || (status & CAL) == 0) + { + statusColor = true; // yellow + } + else + statusColor = false; // green + } + + emit setGUIActuatorColor(i, l, active, statusColor, true); } /*CIRATools::getTime(clock); @@ -149,7 +160,8 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) CORBA::Long acc_val; CORBA::Long delay_val; CORBA::Long status; - + bool active; + bool statusColor; /* ActuatorNumber_str = QString("%1_%2").arg(circle).arg(actuator); @@ -182,41 +194,50 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) try { tASBoss->usdStatus4GUIClient(circle, actuator, status); + active = true; + } + catch (ComponentErrors::ComponentNotActiveExImpl& ex) { + active = false; + ex.log(LM_DEBUG); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { //clearactuatorslineedit(); + active = false; ex.log(LM_DEBUG); } catch (CORBA::SystemException& sysEx) { + active = false; _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"SRTActiveSurfaceGUIClient::SRTActiveSurfaceCore::setactuator()"); impl.setName(sysEx._name()); impl.setMinor(sysEx.minor()); impl.log(); } catch (...) { + active = false; _EXCPT(ClientErrors::UnknownExImpl,impl,"SRTActiveSurfaceGUIClient::SRTActiveSurfaceCore::setactuator()"); impl.log(); } - if ((status & ENBL) == 0) { + if (active == true) { + //if ((status & ENBL) == 0) { /*qApp->lock(); tGUI->ActuatorStatusEnblLabel->clear(); qApp->unlock(); qApp->lock(); tGUI->ActuatorStatusEnblLabel->setText("UNABLED"); qApp->unlock();*/ - ActuatorStatusEnblLabelCode = -1; - emit setGUIActuatorStatusEnblLabel(); - } - else { + //ActuatorStatusEnblLabelCode = -1; + //emit setGUIActuatorStatusEnblLabel(); + //} + //else { /*qApp->lock(); tGUI->ActuatorStatusEnblLabel->clear(); qApp->unlock(); qApp->lock(); tGUI->ActuatorStatusEnblLabel->setText("ENABLED"); qApp->unlock();*/ - ActuatorStatusEnblLabelCode = 1; - emit setGUIActuatorStatusEnblLabel(); + //ActuatorStatusEnblLabelCode = 1; + //emit setGUIActuatorStatusEnblLabel(); try { tASBoss->setActuator(circle, actuator, actPos_val, cmdPos_val, Fmin_val, Fmax_val, acc_val, delay_val); ActuatorActualPosition_str.setNum(actPos_val); @@ -256,7 +277,7 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) //ActuatorStatus_color.setRgb( 0, 170, 0 ); //setactuatorcolor(circle, actuator, ActuatorStatus_color); //theCircle = i; theActuator = l; - emit setGUIActuatorColor(circle, actuator, true, false); + //emit setGUIActuatorColor(circle, actuator, active, statusColor, false); //setactuatorstatuslabels(circle,actuator); //The status has been updated right before this if-else section, there is no need to ask it again @@ -304,31 +325,45 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) } if ((status & CAL) == 0) { ActuatorStatusCalLabelCode = -1; + statusColor = true; //tGUI->ActuatorStatusCalLabel->clear(); //tGUI->ActuatorStatusCalLabel->setText("UNCALIBRATED"); + //printf("uncalibrated\n"); + //emit setGUIActuatorColor(circle, actuator, false, false); } else { ActuatorStatusCalLabelCode = 1; + statusColor = false; //tGUI->ActuatorStatusCalLabel->clear(); //tGUI->ActuatorStatusCalLabel->setText("CALIBRATED"); } - emit setGUIActuatorStatusLabels(); + //emit setGUIActuatorStatusLabels(); + //emit setGUIActuatorColor(circle, actuator, active, statusColor, false); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { // clearactuatorslineedit(); + active = false; ex.log(LM_DEBUG); } catch (CORBA::SystemException& sysEx) { + active = false; _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"SRTActiveSurfaceGUIClient::SRTActiveSurfaceCore::setActuator()"); impl.setName(sysEx._name()); impl.setMinor(sysEx.minor()); impl.log(); } catch (...) { + active = false; _EXCPT(ClientErrors::UnknownExImpl,impl,"SRTActiveSurfaceGUIClient::SRTActiveSurfaceCore::setActuator()"); impl.log(); } } + else { + active = false; + statusColor = true; + } + emit setGUIActuatorStatusLabels(); + emit setGUIActuatorColor(circle, actuator, active, statusColor, false); } diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp index 9abe44d9e..b672cbfb5 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp @@ -12,7 +12,7 @@ SRTActiveSurfaceGUI::SRTActiveSurfaceGUI(QWidget *parent) : QWidget(parent) { setupUi(this); - QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIActuatorColor(int,int,bool,bool)), this, SLOT(changeGUIActuatorColor(int,int,bool,bool))); + QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIActuatorColor(int,int,bool,bool,bool)), this, SLOT(changeGUIActuatorColor(int,int,bool,bool,bool))); QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIAllActuators(bool)), this, SLOT(changeGUIAllActuators(bool))); QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIcircleORradius(bool)), this, SLOT(changeGUIcircleORradius(bool))); QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIActuator(bool)), this, SLOT(changeGUIActuator(bool))); @@ -526,7 +526,7 @@ void SRTActiveSurfaceGUI::recoverUSD() } } -void SRTActiveSurfaceGUI::changeGUIActuatorColor(int tcircle, int tactuator, bool active, bool fromRun) +void SRTActiveSurfaceGUI::changeGUIActuatorColor(int tcircle, int tactuator, bool active, bool statusColor, bool fromRun) { if (!fromRun) { @@ -542,13 +542,17 @@ void SRTActiveSurfaceGUI::changeGUIActuatorColor(int tcircle, int tactuator, boo QPushButton* ActuatorButton = this->findChild(ActuatorButtonName.str().c_str()); - if(active) + if(active == true && statusColor == false) // attivo e calibrato { - ActuatorButton->setStyleSheet("background-color: rgb(85, 255, 0)"); + ActuatorButton->setStyleSheet("background-color: rgb(85, 255, 0)"); // verde + } + else if (active == true && statusColor == true) // attivo e scalibrato + { + ActuatorButton->setStyleSheet("background-color: rgb(255, 255, 0)"); // giallo } else { - ActuatorButton->setStyleSheet("background-color: rgb(255, 0, 0)"); + ActuatorButton->setStyleSheet("background-color: rgb(255, 0, 0)"); // rosso } } diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h index 89494afae..1531f90bb 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h @@ -46,6 +46,7 @@ #define DELTAEL 15.0 // mask pattern for status +#define UNAV 0xFF000000 #define MRUN 0x000080 #define CAMM 0x000100 #define ENBL 0x002000 @@ -80,6 +81,7 @@ class CSRTActiveSurfaceBossCore { //friend class CSRTActiveSurfaceBossWatchingThread; friend class CSRTActiveSurfaceBossWorkingThread; friend class CSRTActiveSurfaceBossSectorThread; + friend class CSRTActiveSurfaceBossInitializationThread; public: /** * Constructor. Default Constructor. @@ -188,9 +190,6 @@ private: int actuatorcounter, circlecounter, totacts; ACS::doubleSeq actuatorsCorrections; - /** pointer to the component itself */ - acscomponent::ACSComponentImpl *m_thisIsMe; - /** * This represents the status of the whole Active Surface subsystem, it also includes and sammerizes the status of the boss component */ @@ -220,15 +219,17 @@ private: char *s_usdCorrections; - std::vector m_sector; - bool m_profileSetted; bool m_ASup; bool m_newlut; + bool m_initialized; + std::string m_lut; + + std::vector actuatorsInCircle; }; #endif /*SRTACTIVESURFACEBOSSCORE_H_*/ diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h index d2f2c7be7..b57b172ea 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h @@ -30,11 +30,10 @@ #include #include "SRTActiveSurfaceBossCore.h" #include "SRTActiveSurfaceBossWorkingThread.h" -#include "SRTActiveSurfaceBossSectorThread.h" +#include "SRTActiveSurfaceBossInitializationThread.h" #include #define LOOPSTATUSTIME 10000000 // 1.0 second -#define SECTORTIME 1000000 // 0.1 seconds #define _SET_CDB(PROP,LVAL,ROUTINE) { \ maci::ContainerServices* cs=getContainerServices();\ @@ -213,7 +212,7 @@ class SRTActiveSurfaceBossImpl: public virtual CharacteristicComponentImpl, publ CSRTActiveSurfaceBossWorkingThread *m_workingThread; - std::vector m_sectorThread; + CSRTActiveSurfaceBossInitializationThread *m_initializationThread; SimpleParser::CParser *m_parser; diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossInitializationThread.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossInitializationThread.h new file mode 100644 index 000000000..274963ae0 --- /dev/null +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossInitializationThread.h @@ -0,0 +1,65 @@ +#ifndef _SRTACTIVESURFACEBOSSINITIALIZATIONTHREAD_H_ +#define _SRTACTIVESURFACEBOSSINITIALIZATIONTHREAD_H_ + +/********************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: SRTActiveSurfaceBossInitializationThread.h,v 1.1 2010-07-26 12:36:49 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 09/01/2025 Creation */ +/********************************************************************************************/ + +#include +#include +#include "SRTActiveSurfaceBossCore.h" +#include "SRTActiveSurfaceBossSectorThread.h" +#include + +#define SECTORTIME 1000000 // 0.1 seconds + +/** + * This class implements an initialization thread. This thread is in charge of setting up the active surface +*/ +class CSRTActiveSurfaceBossInitializationThread : public ACS::Thread +{ +public: + /** + * Constructor(). + * @param name thread name + * @param responseTime thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleepTime thread's sleep time in 100ns unit. Default value is 100ms. + */ + CSRTActiveSurfaceBossInitializationThread(const ACE_CString& name, CSRTActiveSurfaceBossCore *param, + const ACS::TimeInterval& responseTime=ThreadBase::defaultResponseTime,const ACS::TimeInterval& sleepTime=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~CSRTActiveSurfaceBossInitializationThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +private: + CSRTActiveSurfaceBossCore *m_boss; + std::string m_thread_name; + ACS::Time timestart; + std::vector m_sectorThread; +}; + +#endif /*_SRTACTIVESURFACEBOSSINITIALIZATIONTHREAD_H_*/ diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/Makefile b/SRT/Servers/SRTActiveSurfaceBoss/src/Makefile index c9a65272d..b55f8c367 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/Makefile +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/Makefile @@ -83,7 +83,7 @@ LIBRARIES = SRTActiveSurfaceBossImpl LIBRARIES_L = # # -SRTActiveSurfaceBossImpl_OBJECTS = SRTActiveSurfaceBossImpl SRTActiveSurfaceBossCore SRTActiveSurfaceBossWorkingThread SRTActiveSurfaceBossSectorThread +SRTActiveSurfaceBossImpl_OBJECTS = SRTActiveSurfaceBossImpl SRTActiveSurfaceBossCore SRTActiveSurfaceBossWorkingThread SRTActiveSurfaceBossInitializationThread SRTActiveSurfaceBossSectorThread SRTActiveSurfaceBossImpl_LIBS = lanStubs usdStubs ActiveSurfaceBossStubs SRTActiveSurfaceBossStubs AntennaDefinitionsStubs ManagmentDefinitionsStubs AntennaBossStubs ComponentErrors ASErrors ManagementErrors AntennaErrors IRALibrary ParserErrors DiscosVersion # diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp index bfe1c7c69..78db1dae9 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp @@ -2,11 +2,9 @@ #include #include -int actuatorsInCircle[] = {0,24,24,48,48,48,48,96,96,96,96,96,96,96,96,96,8,4}; - CSRTActiveSurfaceBossCore::CSRTActiveSurfaceBossCore(ContainerServices *service, acscomponent::ACSComponentImpl *me) : m_services(service), - m_thisIsMe(me) + actuatorsInCircle{0,24,24,48,48,48,48,96,96,96,96,96,96,96,96,96,8,4} { m_error_strings[ASErrors::NoError ] = "NoError"; m_error_strings[ASErrors::USDCalibrated ] = "USD calibrated"; @@ -43,6 +41,7 @@ void CSRTActiveSurfaceBossCore::initialize() { ACS_LOG(LM_FULL_INFO,"CSRTActiveSurfaceBossCore::initialize()",(LM_INFO,"CSRTActiveSurfaceBossCore::initialize")); + m_initialized = false; m_enable = false; m_tracking = false; m_status = Management::MNG_WARNING; @@ -50,7 +49,6 @@ void CSRTActiveSurfaceBossCore::initialize() actuatorcounter = circlecounter = totacts = 1; for(int i = 0; i < SECTORS; i++) { - m_sector.push_back(false); usdCounters.push_back(0); } m_profileSetted = false; @@ -1366,16 +1364,10 @@ void CSRTActiveSurfaceBossCore::asSetLUT(const char *newlut) void CSRTActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& newProfile) throw (ComponentErrors::ComponentErrorsExImpl) { - bool all_sectors = true; - for(unsigned int i = 0; i < SECTORS; i++) - { - if(!m_sector[i]) all_sectors = false; - } - if (m_newlut == false) m_lut = USDTABLECORRECTIONS; - if(all_sectors) // USD tables has not been loaded yet + if(m_initialized) // USD tables has not been loaded yet { ifstream usdCorrections(m_lut); if(!usdCorrections) @@ -1640,7 +1632,8 @@ void CSRTActiveSurfaceBossCore::asStatus4GUIClient(ACS::longSeq& status) throw ( { for (int actuator = 1; actuator <= actuatorsInCircle[circle]; actuator++) { - int usdStatus = 0; + // Initialize the status word as component unavailable. If the component is available it will be overwritten + int usdStatus = UNAV; if(!CORBA::is_nil(usd[circle][actuator])) { diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp index 54cb831db..117fec854 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp @@ -125,25 +125,18 @@ void SRTActiveSurfaceBossImpl::initialize() throw (ACSErr::ACSbaseExImpl) _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SRTActiveSurfaceBossImpl::initialize()"); } - for(int sector = 0; sector < SECTORS; sector++) + try { - std::stringstream threadName; - threadName << "SRTACTIVESURFACEBOSSSECTOR"; - threadName << sector+1; - try - { - CSRTActiveSurfaceBossSectorThread* sectorThread = getContainerServices()->getThreadManager()->create (threadName.str().c_str(), boss); - m_sectorThread.push_back(sectorThread); - } - catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) - { - _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SRTActiveSurfaceBossImpl::initialize()"); - throw _dummy; - } - catch (...) - { - _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SRTActiveSurfaceBossImpl::initialize()"); - } + m_initializationThread=getContainerServices()->getThreadManager()->create("SRTACTIVESURFACEBOSSINITTHREAD",boss); + } + catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SRTActiveSurfaceBossImpl::initialize()"); + throw _dummy; + } + catch (...) + { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SRTActiveSurfaceBossImpl::initialize()"); } // configure the parser..... @@ -170,12 +163,7 @@ void SRTActiveSurfaceBossImpl::execute() throw (ACSErr::ACSbaseExImpl) throw _dummy; } m_workingThread->resume(); - - for(unsigned int i = 0; i < m_sectorThread.size(); i++) - { - m_sectorThread[i]->setSleepTime(SECTORTIME); - m_sectorThread[i]->resume(); - } + m_initializationThread->resume(); ACS_LOG(LM_FULL_INFO,"SRTActiveSurfaceBossImpl::execute()",(LM_INFO,"SRTActiveSurfaceBossImpl::COMPSTATE_OPERATIONAL")); } @@ -188,13 +176,10 @@ void SRTActiveSurfaceBossImpl::cleanUp() m_workingThread->suspend(); getContainerServices()->getThreadManager()->destroy(m_workingThread); } - for(unsigned int i = 0; i < m_sectorThread.size(); i++) + if (m_initializationThread!=NULL) { - if(m_sectorThread[i] != NULL) - { - m_sectorThread[i]->suspend(); - getContainerServices()->getThreadManager()->destroy(m_sectorThread[i]); - } + m_initializationThread->suspend(); + getContainerServices()->getThreadManager()->destroy(m_initializationThread); } ACS_LOG(LM_FULL_INFO,"SRTActiveSurfaceBossImpl::cleanUp()",(LM_INFO,"SRTActiveSurfaceBossImpl::THREADS_TERMINATED")); if (m_parser!=NULL) delete m_parser; diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossInitializationThread.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossInitializationThread.cpp new file mode 100644 index 000000000..007a43ac8 --- /dev/null +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossInitializationThread.cpp @@ -0,0 +1,97 @@ +#include "SRTActiveSurfaceBossInitializationThread.h" + +CSRTActiveSurfaceBossInitializationThread::CSRTActiveSurfaceBossInitializationThread(const ACE_CString& name, CSRTActiveSurfaceBossCore *param, + const ACS::TimeInterval& responseTime,const ACS::TimeInterval& sleepTime) : ACS::Thread(name,responseTime,sleepTime), m_boss(param) +{ + m_thread_name = "SRTActiveSurfaceBossInitializationThread"; + + this->setSleepTime(1000000); + + AUTO_TRACE(std::string(m_thread_name + "::CSRTActiveSurfaceBossInitializationThread()").c_str()); +} + +CSRTActiveSurfaceBossInitializationThread::~CSRTActiveSurfaceBossInitializationThread() +{ + for(unsigned int i = 0; i < m_sectorThread.size(); i++) + { + if(m_sectorThread[i] != NULL) + { + m_sectorThread[i]->suspend(); + m_boss->m_services->getThreadManager()->destroy(m_sectorThread[i]); + } + } + + AUTO_TRACE(std::string(m_thread_name + "::~CSRTActiveSurfaceBossInitializationThread()").c_str()); +} + +void CSRTActiveSurfaceBossInitializationThread::onStart() +{ + AUTO_TRACE(std::string(m_thread_name + "::onStart()").c_str()); + + for(int sector = 0; sector < SECTORS; sector++) + { + std::stringstream threadName; + threadName << "SRTACTIVESURFACEBOSSSECTOR"; + threadName << sector+1; + try + { + CSRTActiveSurfaceBossSectorThread* sectorThread = m_boss->m_services->getThreadManager()->create (threadName.str().c_str(), m_boss); + sectorThread->setSleepTime(SECTORTIME); + sectorThread->resume(); + m_sectorThread.push_back(sectorThread); + } + catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) + { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SRTActiveSurfaceBossInitializationThread::onStart()"); + throw _dummy; + } + catch (...) + { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SRTActiveSurfaceBossInitializationThread::onStart()"); + } + } + + TIMEVALUE now; + CIRATools::getTime(now); + this->timestart = now.value().value; +} + +void CSRTActiveSurfaceBossInitializationThread::onStop() +{ + m_boss->m_initialized = true; + + ACS_LOG(LM_FULL_INFO, std::string(m_thread_name + "::onStop()").c_str(), (LM_NOTICE, "ACTIVE SURFACE INITIALIZED")); + + AUTO_TRACE(std::string(m_thread_name + "::onStop()").c_str()); +} + +void CSRTActiveSurfaceBossInitializationThread::runLoop() +{ + for(unsigned int i = 0; i < m_sectorThread.size(); i++) + { + if(m_sectorThread[i]->isAlive()) + { + return; + } + } + + // Set CDB calibrate parameter to 0 where needed + for(int circle = 1; circle <= CIRCLES; circle++) + { + for(int actuator = 1; actuator <= m_boss->actuatorsInCircle[circle]; actuator++) + { + if(!CORBA::is_nil(m_boss->usd[circle][actuator])) + { + int usdStatus = 0; + m_boss->usd[circle][actuator]->getStatus(usdStatus); + + if(!(usdStatus & CAL)) + { + CIRATools::setDBValue(m_boss->m_services, "calibrate", (const long)0, "alma/", m_boss->usd[circle][actuator]->name()); + } + } + } + } + + this->setStopped(); +} diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp index 0d35aed43..5abef165e 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossSectorThread.cpp @@ -83,7 +83,6 @@ void CSRTActiveSurfaceBossSectorThread::runLoop() } else { - m_boss->m_sector[m_sector] = true; this->setStopped(); } } -- GitLab From 460495864eb396f492a04c843bf2fdca1d9b33c5 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 Jan 2025 09:19:16 +0000 Subject: [PATCH 124/150] Generic SRT CDB updates --- .../DataBlock/PointingModel/PointingModel.xml | 20 ++++++++-------- .../CDB/alma/AS/set_calibrate.py | 24 +++++++++++++++++++ .../DataBlock/PointingModel/PointingModel.xml | 20 ++++++++-------- 3 files changed, 44 insertions(+), 20 deletions(-) create mode 100755 SRT/Configuration/CDB/alma/AS/set_calibrate.py diff --git a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml index 39c27d3d2..998546dc1 100644 --- a/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -108,20 +108,20 @@ XB 90.0000 - 1 -2.2955527306 + 1 -2.2917063236 0 0.0000000000 - 1 -0.0027078437 - 1 0.0173532944 - 1 -0.0008693041 - 1 -0.0019183123 - 1 0.1030814573 - 1 0.0856014490 + 1 -0.0013826370 + 1 0.0097995838 + 1 -0.0005712744 + 1 -0.0014260981 + 1 0.0759423449 + 1 0.1146249696 0 0.0000000000 0 0.0000000000 - 1 0.0087973252 + 1 -0.0027263802 0 0.0000000000 - 1 0.0003481323 - 1 0.0001999680 + 1 0.0002023144 + 1 0.0000791195 0 0.0000000000 0 0.0000000000 0 0.0000000000 diff --git a/SRT/Configuration/CDB/alma/AS/set_calibrate.py b/SRT/Configuration/CDB/alma/AS/set_calibrate.py new file mode 100755 index 000000000..1bcddca13 --- /dev/null +++ b/SRT/Configuration/CDB/alma/AS/set_calibrate.py @@ -0,0 +1,24 @@ +import os, fnmatch + +path = os.path.dirname(os.path.abspath(__file__)) + +result = [] +for root, dirs, files in os.walk(path): + for name in files: + if fnmatch.fnmatch(name, 'USD*.xml'): + result.append(os.path.join(root, name)) + +counter = 0 + +for filename in result: + counter += 1 + os.rename(filename, filename + '.bak') + original = open(filename + '.bak', 'r') + new = open(filename, 'w') + for fileline in original: + new.write(fileline.replace('calibrate="0"', 'calibrate="1"')) + original.close() + os.remove(filename + '.bak') + new.close() + +print(str(counter) + " files edited.") diff --git a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml index 39c27d3d2..998546dc1 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PointingModel/PointingModel.xml @@ -108,20 +108,20 @@ XB 90.0000 - 1 -2.2955527306 + 1 -2.2917063236 0 0.0000000000 - 1 -0.0027078437 - 1 0.0173532944 - 1 -0.0008693041 - 1 -0.0019183123 - 1 0.1030814573 - 1 0.0856014490 + 1 -0.0013826370 + 1 0.0097995838 + 1 -0.0005712744 + 1 -0.0014260981 + 1 0.0759423449 + 1 0.1146249696 0 0.0000000000 0 0.0000000000 - 1 0.0087973252 + 1 -0.0027263802 0 0.0000000000 - 1 0.0003481323 - 1 0.0001999680 + 1 0.0002023144 + 1 0.0000791195 0 0.0000000000 0 0.0000000000 0 0.0000000000 -- GitLab From 8e84af0fd4feb7846f0010ddc63a396f2bff64c0 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 Jan 2025 09:22:40 +0000 Subject: [PATCH 125/150] Added USD reset guard time --- Common/Servers/ActiveSurfaceUSD/src/ActiveSurfaceUSDImpl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Common/Servers/ActiveSurfaceUSD/src/ActiveSurfaceUSDImpl.cpp b/Common/Servers/ActiveSurfaceUSD/src/ActiveSurfaceUSDImpl.cpp index eb5132b2b..5d30ba850 100644 --- a/Common/Servers/ActiveSurfaceUSD/src/ActiveSurfaceUSDImpl.cpp +++ b/Common/Servers/ActiveSurfaceUSD/src/ActiveSurfaceUSDImpl.cpp @@ -325,6 +325,8 @@ void USDImpl::reset() throw (CORBA::SystemException,ASErrors::ASErrorsEx) //_SET_CDB(calibrate, m_calibrate, "::USDImpl::reset()") action(RESET); + CIRATools::Wait(0, 200000); // 0.2 secs, guard time to wait after a reset command + //* restore defaults *// _SET_LDEF(delay, "USDImpl::reset()"); _SET_LDEF(Fmax, "USDImpl::reset()"); -- GitLab From f9d46107563ecb6e1f5afc9a64e8532f960e7b68 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 Jan 2025 09:58:04 +0000 Subject: [PATCH 126/150] Several backends-related updates and additions Mostly functional for the new Skarab backend --- .../SystemTerminal/src/nuraghe_commands.py | 6 + .../BackendsInterface/idl/GenericBackend.idl | 2 + .../BackendsInterface/idl/Sardara.idl | 4 +- .../BackendsInterface/idl/Skarab.idl | 4 +- .../DiscosBackendProtocol/include/command.hpp | 4 + .../DiscosBackendProtocol/src/command.cpp | 8 + .../include/NoiseGeneratorImpl.h | 3 +- Common/Servers/Sardara/include/CommandLine.h | 13 +- Common/Servers/Sardara/include/SardaraImpl.h | 6 +- Common/Servers/Sardara/src/CommandLine.cpp | 110 +- Common/Servers/Sardara/src/SardaraImpl.cpp | 9 +- Common/Servers/Scheduler/include/Core_Basic.h | 2 + .../Servers/Scheduler/include/Core_Common.h | 2 + Common/Servers/Scheduler/src/Core.cpp | 1 + Common/Servers/Scheduler/src/Core_Basic.i | 20 + Common/Servers/Scheduler/src/Core_Common.i | 7 + .../Scheduler/src/ScheduleExecutor.cpp | 6 + Common/Servers/Skarab/include/CommandLine.h | 39 +- Common/Servers/Skarab/include/Common.h | 2 +- Common/Servers/Skarab/include/SkarabImpl.h | 12 +- Common/Servers/Skarab/src/CommandLine.cpp | 2927 ++++++++--------- Common/Servers/Skarab/src/Makefile | 4 +- Common/Servers/Skarab/src/SenderThread.cpp | 1 - Common/Servers/Skarab/src/SkarabImpl.cpp | 1436 ++++---- .../Servers/TotalPower/include/CommandLine.h | 3 + .../TotalPower/include/TotalPowerImpl.h | 2 + Common/Servers/TotalPower/src/CommandLine.cpp | 6 + .../Servers/TotalPower/src/TotalPowerImpl.cpp | 1 + Common/Servers/XBackend/include/CommandLine.h | 2 + .../Servers/XBackend/include/XBackendsImpl.h | 1 + Common/Servers/XBackend/src/CommandLine.cpp | 6 + Common/Servers/XBackend/src/XBackendsImpl.cpp | 1 + .../Components/BACKENDS/Skarab/Skarab.xml | 17 + .../SkarabContainer/SkarabContainer.xml | 30 + SRT/CDB/alma/BACKENDS/Skarab/Skarab.xml | 45 + .../DataBlock/PyCalmux/Mapping/Mapping.xml | 1 + SRT/CDB/alma/DataBlock/Skarab/Skarab.xml | 158 + .../StationProcedures/StationProcedures.xml | 1 + .../Components/BACKENDS/Skarab/Skarab.xml | 17 + .../SkarabContainer/SkarabContainer.xml | 30 + .../CDB/alma/BACKENDS/Skarab/Skarab.xml | 45 + .../alma/DataBlock/Equipment/Equipment.xml | 1 + .../DataBlock/PyCalmux/Mapping/Mapping.xml | 1 + .../CDB/alma/DataBlock/Sardara/Sardara.xml | 238 +- .../CDB/alma/DataBlock/Skarab/Skarab.xml | 233 ++ .../StationProcedures/StationProcedures.xml | 1 + .../SRTScripts/app-defaults/discosStartup.xml | 24 +- SystemMake/Makefile | 26 +- 48 files changed, 3073 insertions(+), 2445 deletions(-) create mode 100644 SRT/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml create mode 100644 SRT/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml create mode 100644 SRT/CDB/alma/BACKENDS/Skarab/Skarab.xml create mode 100644 SRT/CDB/alma/DataBlock/Skarab/Skarab.xml create mode 100644 SRT/Configuration/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml create mode 100644 SRT/Configuration/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml create mode 100644 SRT/Configuration/CDB/alma/BACKENDS/Skarab/Skarab.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/Skarab/Skarab.xml diff --git a/Common/Clients/SystemTerminal/src/nuraghe_commands.py b/Common/Clients/SystemTerminal/src/nuraghe_commands.py index 4b1723e37..22104b6ac 100755 --- a/Common/Clients/SystemTerminal/src/nuraghe_commands.py +++ b/Common/Clients/SystemTerminal/src/nuraghe_commands.py @@ -463,6 +463,12 @@ def integration(): sets the integration time """ +def backendPark(): + """ + backendPark + deprogram all the boards + """ + def log(): """ log=logfilename diff --git a/Common/Interfaces/BackendsInterface/idl/GenericBackend.idl b/Common/Interfaces/BackendsInterface/idl/GenericBackend.idl index 1bff25af1..572d58d0a 100644 --- a/Common/Interfaces/BackendsInterface/idl/GenericBackend.idl +++ b/Common/Interfaces/BackendsInterface/idl/GenericBackend.idl @@ -302,6 +302,8 @@ module Backends { ACS::doubleSeq getTpi() raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); ACS::doubleSeq getRms() raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + void endSchedule() raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); /** * Call this method in order to read the total power from each input when the input are connected directly to the 50 Ohm. diff --git a/Common/Interfaces/BackendsInterface/idl/Sardara.idl b/Common/Interfaces/BackendsInterface/idl/Sardara.idl index 4bf2d36f5..efba057d5 100644 --- a/Common/Interfaces/BackendsInterface/idl/Sardara.idl +++ b/Common/Interfaces/BackendsInterface/idl/Sardara.idl @@ -128,9 +128,9 @@ module Backends { void initialize(in string configuration) raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); - void getConfiguration(out string configuration); + string getConfiguration(); - void getCommProtVersion(out string version); + string getCommProtVersion(); }; }; diff --git a/Common/Interfaces/BackendsInterface/idl/Skarab.idl b/Common/Interfaces/BackendsInterface/idl/Skarab.idl index 929a04b94..67e7b604d 100644 --- a/Common/Interfaces/BackendsInterface/idl/Skarab.idl +++ b/Common/Interfaces/BackendsInterface/idl/Skarab.idl @@ -128,9 +128,9 @@ module Backends { void initialize(in string configuration) raises (ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); - void getConfiguration(out string configuration); + string getConfiguration(); - void getCommProtVersion(out string version); + string getCommProtVersion(); }; }; diff --git a/Common/Libraries/DiscosBackendProtocol/include/command.hpp b/Common/Libraries/DiscosBackendProtocol/include/command.hpp index 37d5120b0..049d75a42 100644 --- a/Common/Libraries/DiscosBackendProtocol/include/command.hpp +++ b/Common/Libraries/DiscosBackendProtocol/include/command.hpp @@ -27,7 +27,11 @@ namespace DiscosBackend{ static Message setFilename(string filename); static Message convertData(){return Message(REQUEST, "convert-data");}; static Message getRms(){return Message(REQUEST, "get-rms");}; + static Message getDDCoffset(){return Message(REQUEST, "get-ddcoffset");}; static Message setEnable(int feed1, int feed2); + static Message endSchedule(){return Message(REQUEST, "end-schedule");}; + static Message backendPark(){return Message(REQUEST, "backend-park");}; + static Message setShift(int shift); }; //class Command }; //namespace DiscosBackend diff --git a/Common/Libraries/DiscosBackendProtocol/src/command.cpp b/Common/Libraries/DiscosBackendProtocol/src/command.cpp index 7ed670fd0..0d820297c 100644 --- a/Common/Libraries/DiscosBackendProtocol/src/command.cpp +++ b/Common/Libraries/DiscosBackendProtocol/src/command.cpp @@ -18,6 +18,14 @@ Command::setIntegration(int integration) return command; } +Message +Command::setShift(int shift) +{ + Message command(REQUEST, "set-shift"); + command.add_argument(shift); + return command; +} + Message Command::getTpi(double frequency, double bandwidth) { diff --git a/Common/Servers/NoiseGenerator/include/NoiseGeneratorImpl.h b/Common/Servers/NoiseGenerator/include/NoiseGeneratorImpl.h index cff49b18a..89689b549 100644 --- a/Common/Servers/NoiseGenerator/include/NoiseGeneratorImpl.h +++ b/Common/Servers/NoiseGenerator/include/NoiseGeneratorImpl.h @@ -236,7 +236,8 @@ public: */ virtual void setTime() throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx); - + + virtual void endSchedule() throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx) {AUTO_TRACE("TotalPowerImpl::endSchedule()"); }; /** * Call this function in order to get a total power measure for each input channel. * @thorw CORBA::SystemException diff --git a/Common/Servers/Sardara/include/CommandLine.h b/Common/Servers/Sardara/include/CommandLine.h index 846c9dfa9..1c967513c 100644 --- a/Common/Servers/Sardara/include/CommandLine.h +++ b/Common/Servers/Sardara/include/CommandLine.h @@ -425,6 +425,9 @@ public: */ void setAttenuation(const long&inputId, const double& attenuation) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl); + + void backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); /** * Called to configure a range where compute a Tsys. @@ -480,9 +483,9 @@ public: static bool resultingSampleRate(const long& integration,const double& sr,long& result); //int getConfiguration(char* configuration); - void getConfiguration(char* configuration); + char* getConfiguration(); - int getCommProtVersion(CORBA::String_out version); + char* getCommProtVersion(); IRA::CString m_targetFileName; @@ -774,9 +777,15 @@ ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::Mal bool m_SK77; bool m_SK00; bool m_SK01; + bool m_SK04; + bool m_SK03; + bool m_SK06; bool m_SK77S; bool m_SK00S; bool m_SK01S; + bool m_SK04S; + bool m_SK03S; + bool m_SK06S; bool m_SC00; bool m_SL00; bool m_SP00; diff --git a/Common/Servers/Sardara/include/SardaraImpl.h b/Common/Servers/Sardara/include/SardaraImpl.h index 9112f1d82..22df8f23e 100644 --- a/Common/Servers/Sardara/include/SardaraImpl.h +++ b/Common/Servers/Sardara/include/SardaraImpl.h @@ -258,9 +258,9 @@ public: */ virtual CORBA::Boolean command(const char *cmd,CORBA::String_out answer) throw (CORBA::SystemException); - virtual void getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException); + virtual char* getConfiguration () throw (CORBA::SystemException); - virtual void getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException); + virtual char* getCommProtVersion () throw (CORBA::SystemException); /** * This method is related to the implementation of the genericBackend interface @@ -320,6 +320,8 @@ public: virtual ACS::doubleSeq * getRms () throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + virtual void endSchedule() throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx) {AUTO_TRACE("SardaraImpl::endSchedule()"); }; + /** * Call this function in order to get a total power measure for each input channel. The measure is done when the inputs are directly * connected to the 50 Ohm. diff --git a/Common/Servers/Sardara/src/CommandLine.cpp b/Common/Servers/Sardara/src/CommandLine.cpp index 050946a6a..b2f65b122 100644 --- a/Common/Servers/Sardara/src/CommandLine.cpp +++ b/Common/Servers/Sardara/src/CommandLine.cpp @@ -50,6 +50,10 @@ CCommandLine::CCommandLine(ContainerServices *service): CSocket(), // SRT configurations m_SK00=false; m_SK00S=false; + m_SK01=false; m_SK01S=false; + m_SK04=false; m_SK04S=false; + m_SK03=false; m_SK03S=false; + m_SK06=false; m_SK06S=false; m_SK77=false; m_SK77S=false; m_SCC00=false; m_SCC00S=false; m_SCH00=false; m_SCH00S=false; @@ -206,6 +210,12 @@ void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl clearStatusField(CCommandLine::SUSPEND); // unsets the component status to transfer job suspended...... } +void CCommandLine::backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + ACS_LOG(LM_FULL_INFO,"CCommandLine::backendPark()",(LM_NOTICE,"backendPark")); +} + void CCommandLine::stopDataAcquisitionForced() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl) { @@ -369,8 +379,8 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const throw impl; }*/ if (inputId>=0) { //check the section id is in valid ranges - //if (inputId>=m_sectionsNumber) { - if (inputId>m_sectionsNumber) { + if (inputId>=m_sectionsNumber) { + //if (inputId>m_sectionsNumber) { _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); impl.setReason("the section identifier is out of range"); throw impl; @@ -519,9 +529,23 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const if (newBW[i]==2300.00) filter=2350.00; if (newBW[i] == 420.00 || newBW[i] == 1500.00 || newBW[i] == 2300.00) { - for (j=0; jsetSection(j,-1, filter, -1, -1, -1, -1); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",i,filter)); + if(m_stokes) + { + // Configure the TotalPower sections corresponding to the selected Sardara section (should be equivalent to the feed) + // e.g.: if the selected Sardara section is 0 we will configure TotalPower 0 and 1 sections + // if the selected Sardara section is 1 we will configure TotalPower 2 and 3 sections + // ... + m_totalPower->setSection(i * 2, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", i*2, filter)); + m_totalPower->setSection((i * 2) + 1, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", (i*2)+1, filter)); + } + else + { + // Use the same section identifier for TotalPower + m_totalPower->setSection(i, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", i, filter)); + } } } /*if ((m_SL00==true || m_SL00S==true) && m_stationSRT == true) { @@ -592,10 +616,23 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const if (newBW[i]==2300.00) filter=2350.00; if (newBW[i] == 420.00 || newBW[i] == 1500.00 || newBW[i] == 2300.00) { - for (j=0; jsetSection(j,-1, filter, -1, -1, -1, -1); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",i,filter)); - } + if(m_stokes) + { + // Configure the TotalPower sections corresponding to the selected Sardara section (should be equivalent to the feed) + // e.g.: if the selected Sardara section is 0 we will configure TotalPower 0 and 1 sections + // if the selected Sardara section is 1 we will configure TotalPower 2 and 3 sections + // ... + m_totalPower->setSection(i * 2, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", i*2, filter)); + m_totalPower->setSection((i * 2) + 1, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", (i*2)+1, filter)); + } + else + { + // Use the same section identifier for TotalPower + m_totalPower->setSection(i, -1, filter, -1, -1, -1, -1); + ACS_LOG(LM_FULL_INFO, "CCommandLine::setConfiguration()", (LM_NOTICE, "TOTALPOWER_FILTER_CONFIGURED %ld, FILTER=%lf", i, filter)); + } } } } @@ -799,6 +836,10 @@ void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (C if (m_stationSRT==true) { m_SK77=m_SK77S=false; m_SK00=m_SK00S=false; + m_SK01=m_SK01S=false; + m_SK04=m_SK04S=false; + m_SK03=m_SK03S=false; + m_SK06=m_SK06S=false; m_SCC00=m_SCC00S=false; m_SCH00=m_SCH00S=false; m_SL00=m_SL00S=false; @@ -817,6 +858,30 @@ void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (C m_SK00=true; m_CK=true; } + if (config.Compare("SK01")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK01=true; + m_CK=true; + } + if (config.Compare("SK04")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK04=true; + m_CK=true; + } + if (config.Compare("SK03")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK03=true; + m_CK=true; + } + if (config.Compare("SK06")==0) { + m_filter=1250.0; + m_inputsNumber=m_sectionsNumber; + m_SK06=true; + m_CK=true; + } if (config.Compare("SCC00")==0) { m_filter=1250.0; m_inputsNumber=m_sectionsNumber; @@ -1770,30 +1835,37 @@ CCommandLine::sendBackendCommand(Message request) return reply; } -//int CCommandLine::getConfiguration(char* configuration) -void CCommandLine::getConfiguration(char* configuration) +char* CCommandLine::getConfiguration() { Message request = Command::getConfiguration(); try { Message reply = sendBackendCommand(request); if(reply.is_success_reply()) { - strcpy(configuration, reply.get_argument(0).c_str()); + return CORBA::string_dup(reply.get_argument(0).c_str()); } } catch (...) { - } + + return CORBA::string_dup(""); } -int CCommandLine::getCommProtVersion(CORBA::String_out version) +char* CCommandLine::getCommProtVersion() { Message request = Command::version(); - Message reply = sendBackendCommand(request); - string _version = reply.get_argument(0); - if(reply.is_success_reply()) - strcpy(version, _version.c_str()); - return _version.length(); + try + { + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) + { + return CORBA::string_dup(reply.get_argument(0).c_str()); + } + } + catch(...) { + } + + return CORBA::string_dup(""); } bool CCommandLine::checkConnection() diff --git a/Common/Servers/Sardara/src/SardaraImpl.cpp b/Common/Servers/Sardara/src/SardaraImpl.cpp index bea435bcb..9dbad5998 100644 --- a/Common/Servers/Sardara/src/SardaraImpl.cpp +++ b/Common/Servers/Sardara/src/SardaraImpl.cpp @@ -138,6 +138,7 @@ void SardaraImpl::initialize() throw (ACSErr::ACSbaseExImpl) m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); m_parser->add("getRms",new function1 >(line,&CCommandLine::getRms),0 ); m_parser->add("setTsysRange", new function2,I >(line,&CCommandLine::setTsysRange),2 ); + m_parser->add("backendPark", new function0(line,&CCommandLine::backendPark),0 ); threadPar.sender=this; threadPar.command=m_commandLine; @@ -780,12 +781,12 @@ void SardaraImpl::setIntegration(CORBA::Long Integration) throw (CORBA::SystemEx } } -void SardaraImpl::getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException) +char* SardaraImpl::getConfiguration() throw (CORBA::SystemException) { AUTO_TRACE("SardaraImpl::getIntegration()"); CSecAreaResourceWrapper line=m_commandLine->Get(); try { - line->getConfiguration(configuration); + return line->getConfiguration(); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { ex.log(LM_DEBUG); @@ -802,12 +803,12 @@ void SardaraImpl::getConfiguration (CORBA::String_out configuration) throw (CORB } } -void SardaraImpl::getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException) +char* SardaraImpl::getCommProtVersion() throw (CORBA::SystemException) { AUTO_TRACE("SardaraImpl::getCommProtVersion()"); CSecAreaResourceWrapper line=m_commandLine->Get(); try { - line->getCommProtVersion(version); + return line->getCommProtVersion(); } catch (ComponentErrors::ComponentErrorsExImpl& ex) { ex.log(LM_DEBUG); diff --git a/Common/Servers/Scheduler/include/Core_Basic.h b/Common/Servers/Scheduler/include/Core_Basic.h index 92ab5ba73..2d0128f6a 100644 --- a/Common/Servers/Scheduler/include/Core_Basic.h +++ b/Common/Servers/Scheduler/include/Core_Basic.h @@ -99,6 +99,8 @@ static void startDataTansfer(Backends::GenericBackend_ptr backend,bool& backendE static void stopDataTransfer(Backends::GenericBackend_ptr backend,bool& backendError,bool& streamStarted,bool& streamPrepared,bool& streamConnected) throw (ComponentErrors::OperationErrorExImpl, ManagementErrors::BackendNotAvailableExImpl); + static void endSchedule(Backends::GenericBackend_ptr backend,bool& backendError) throw (ComponentErrors::OperationErrorExImpl, ManagementErrors::BackendNotAvailableExImpl); + /** * This static method will call the stopScan() of the DataReceiver interface in order to inform the current data receiver component that a scan has to be finalized. * @param writer reference to the writer or data recorder or data dealer diff --git a/Common/Servers/Scheduler/include/Core_Common.h b/Common/Servers/Scheduler/include/Core_Common.h index 1e8554cbe..748f9dc80 100644 --- a/Common/Servers/Scheduler/include/Core_Common.h +++ b/Common/Servers/Scheduler/include/Core_Common.h @@ -166,6 +166,8 @@ void enableDataTransfer() throw (ComponentErrors::OperationErrorExImpl,Component */ void stopDataTransfer() throw (ComponentErrors::OperationErrorExImpl,ManagementErrors::BackendNotAvailableExImpl,ComponentErrors::CouldntGetComponentExImpl); +void endSchedule() throw (ComponentErrors::OperationErrorExImpl,ManagementErrors::BackendNotAvailableExImpl,ComponentErrors::CouldntGetComponentExImpl); + /** * This static method inquiries the DataReceiver to check if the data transfer is still active or not. * @throw ComponentErrors::OperationErrorExImpl diff --git a/Common/Servers/Scheduler/src/Core.cpp b/Common/Servers/Scheduler/src/Core.cpp index 7e8566567..a92646ba1 100644 --- a/Common/Servers/Scheduler/src/Core.cpp +++ b/Common/Servers/Scheduler/src/Core.cpp @@ -209,6 +209,7 @@ void CCore::execute() throw(ComponentErrors::TimerErrorExImpl, ComponentErrors:: m_parser->add("calSwitch", "backend", 3, &CCore::remoteCall); m_parser->add("getRms", "backend", 3, &CCore::remoteCall); m_parser->add("setTsysRange","backend",3,&CCore::remoteCall); + m_parser->add("backendPark","backend",3,&CCore::remoteCall); // minor servo m_parser->add("servoSetup", "minorservo", 4, &CCore::remoteCall); diff --git a/Common/Servers/Scheduler/src/Core_Basic.i b/Common/Servers/Scheduler/src/Core_Basic.i index f0d5b9803..d22038066 100644 --- a/Common/Servers/Scheduler/src/Core_Basic.i +++ b/Common/Servers/Scheduler/src/Core_Basic.i @@ -565,6 +565,26 @@ void CCore::stopDataTransfer(Backends::GenericBackend_ptr backend,bool& backendE } } +void CCore::endSchedule(Backends::GenericBackend_ptr backend,bool& backendError) throw (ComponentErrors::OperationErrorExImpl, ManagementErrors::BackendNotAvailableExImpl) +{ + if (!CORBA::is_nil(backend)) { + try { + backend->endSchedule(); + ACS_STATIC_LOG(LM_FULL_INFO,"CCore::endSchedule()",(LM_NOTICE,"COMMAND endSCHEDULE FOR BACKEND")); + } + catch (...) { + _EXCPT(ComponentErrors::OperationErrorExImpl,impl,"CCore::endSchedule()"); + impl.setReason("backend could not stop data acquisition"); + backendError=true; + throw impl; + } + } + else { + _EXCPT(ManagementErrors::BackendNotAvailableExImpl,impl,"CCore::endSchedule()"); + throw impl; + } +} + void CCore::startDataTansfer(Backends::GenericBackend_ptr backend,bool& backendError,const ACS::Time& startTime,bool& streamStarted,bool& streamPrepared,bool& streamConnected) throw ( ComponentErrors::OperationErrorExImpl,ComponentErrors::CORBAProblemExImpl,ComponentErrors::UnexpectedExImpl,ManagementErrors::BackendNotAvailableExImpl,ManagementErrors::DataTransferSetupErrorExImpl) { diff --git a/Common/Servers/Scheduler/src/Core_Common.i b/Common/Servers/Scheduler/src/Core_Common.i index ad91a3414..66f3a740e 100644 --- a/Common/Servers/Scheduler/src/Core_Common.i +++ b/Common/Servers/Scheduler/src/Core_Common.i @@ -635,6 +635,13 @@ void CCore::stopDataTransfer() throw (ComponentErrors::OperationErrorExImpl,Mana CCore::stopDataTransfer(m_defaultBackend,m_defaultBackendError,m_streamStarted,m_streamPrepared,m_streamConnected); } +void CCore::endSchedule() throw (ComponentErrors::OperationErrorExImpl,ManagementErrors::BackendNotAvailableExImpl,ComponentErrors::CouldntGetComponentExImpl) +{ + baci::ThreadSyncGuard guard(&m_mutex); + loadDefaultBackend();// throw (ComponentErrors::CouldntGetComponentExImpl); + CCore::endSchedule(m_defaultBackend,m_defaultBackendError); +} + bool CCore::checkRecording() throw (ComponentErrors::OperationErrorExImpl,ComponentErrors::UnexpectedExImpl,ComponentErrors::CouldntGetComponentExImpl) { baci::ThreadSyncGuard guard(&m_mutex); diff --git a/Common/Servers/Scheduler/src/ScheduleExecutor.cpp b/Common/Servers/Scheduler/src/ScheduleExecutor.cpp index 2446d35e9..94828b749 100644 --- a/Common/Servers/Scheduler/src/ScheduleExecutor.cpp +++ b/Common/Servers/Scheduler/src/ScheduleExecutor.cpp @@ -783,6 +783,12 @@ void CScheduleExecutor::cleanSchedule(bool error) //m_scanStarted=false; ex.log(LM_WARNING); } + try { + m_core->endSchedule(); + } + catch (ACSErr::ACSbaseExImpl& ex) { + ex.log(LM_WARNING); + } try { m_core->closeScan(false); } diff --git a/Common/Servers/Skarab/include/CommandLine.h b/Common/Servers/Skarab/include/CommandLine.h index 0afdf2768..7257d4138 100644 --- a/Common/Servers/Skarab/include/CommandLine.h +++ b/Common/Servers/Skarab/include/CommandLine.h @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,6 +26,10 @@ //#include "Protocol.h" #include "Configuration.h" +#define GAVINO "MANAGEMENT/Gavino" +#define PALMIRO "MANAGEMENT/Palmiro" +#define DUCEZIO "MANAGEMENT/Ducezio" + using namespace maci; using namespace DiscosBackend; using namespace std; @@ -224,6 +230,8 @@ public: * @param integration new integration time in milliseconds. A negative value has no effect. */ void setIntegration(const long& integration) throw (BackendsErrors::BackendBusyExImpl, ComponentErrors::ValueOutofRangeExImpl); + + void setShift(const long& shift) throw (BackendsErrors::BackendBusyExImpl); /** * This methos will changes the current value of the m_enabled array. @@ -231,7 +239,7 @@ public: * @param en new values sequence for the m_enabled elements. A value grater than zero correspond to a true, * a zero match to a false, while a negative will keep the things unchanged. */ - void setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl); + void setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl, BackendsErrors::ConfigurationErrorExImpl, ComponentErrors::ValueOutofRangeExImpl); /** * This function can be called in order to load an initial setup for the backend. Some parameter are fixed and cannot be changed during normal @@ -251,6 +259,9 @@ public: void sendTargetFileName() throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl); + void endSchedule() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); + /** * This function can be used to set up an input of the backend. The input is identified by its numeric value. If a configuration * parameter is negative the current value is not changed. Since the backend hardware does not support different sample rates @@ -378,6 +389,8 @@ public: void getRms(ACS::doubleSeq& rms) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + void getKelvinCountsRatio(ACS::doubleSeq& kcr) const; + /** * This a wrapper function of the getSample() method. In this case the sample correspond the power measurment in each channel with full attenuation. * @throw ComponentErrors::SocketErrorExImpl @@ -442,6 +455,10 @@ public: void setTsysRange(const double& freq, const double& bw) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl); + void backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); + + /** * Called by the component to fill the Backends::TMainHeader with the proper informations. * @param bkd the stucture that contains the required information. @@ -480,9 +497,9 @@ public: static bool resultingSampleRate(const long& integration,const double& sr,long& result); //int getConfiguration(char* configuration); - void getConfiguration(char* configuration); + char* getConfiguration(); - int getCommProtVersion(CORBA::String_out version); + char* getCommProtVersion(); IRA::CString m_targetFileName; @@ -503,6 +520,10 @@ private: ContainerServices* m_services; Backends::TotalPower_var m_totalPower; //Receivers::GenericIFDistributor_var m_ifDistributor; + /** This is the reference to the receiver boss component */ + Receivers::ReceiversBoss_var m_receiversBoss; + Management::Scheduler_var m_Scheduler; + char superVisorName[20]; /** * List the fields of the backend status @@ -669,6 +690,7 @@ private: double m_tpiZero[MAX_SECTION_NUMBER]; long m_inputsNumber; + long m_inputsNumberTP; double m_filter; @@ -780,6 +802,11 @@ private: bool m_SKARAB_4S; bool m_SKARAB_5; bool m_SKARAB_5S; + bool m_SKARAB_7; + bool m_SKARAB_11; + bool m_SKARAB_11S; + bool m_SKARAB_12; + bool m_SKARAB_12S; bool m_stationSRT; bool m_stationMED; @@ -787,6 +814,12 @@ private: bool m_SkarabInitialized; bool m_stokes; + + bool m_kkg77; + + IRA::CString m_recstr; + ACS::ROstring_var m_receiverRef; + CORBA::String_var m_receiver; }; diff --git a/Common/Servers/Skarab/include/Common.h b/Common/Servers/Skarab/include/Common.h index a7803b39a..6dbc2dfcc 100644 --- a/Common/Servers/Skarab/include/Common.h +++ b/Common/Servers/Skarab/include/Common.h @@ -17,7 +17,7 @@ //#define BKD_DEBUG // some hard coded, hardware dependant constants -#define STARTFREQUENCY 0.0 // this is the start frequency of all IF inputs +#define STARTFREQUENCY 1000.0 // this is the start frequency of all IF inputs #define MIN_FREQUENCY 0.0 // min frequency of all IF inputs #define MAX_FREQUENCY 1500.0 // max frequency of all IF inputs #define BINSNUMBER 1000 diff --git a/Common/Servers/Skarab/include/SkarabImpl.h b/Common/Servers/Skarab/include/SkarabImpl.h index 6a0ddb6f5..1f35ffb12 100644 --- a/Common/Servers/Skarab/include/SkarabImpl.h +++ b/Common/Servers/Skarab/include/SkarabImpl.h @@ -238,6 +238,8 @@ public: virtual void enableChannels(const ACS::longSeq& enable) throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + virtual void endSchedule() throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx); + /** * Sets the current integration time. * @throw CORBA::SystemException @@ -245,9 +247,9 @@ public: * @thorw BackendsErrors::BackendsErrorsEx * @param integration new integration value in milliseconds. A zero disables this feature, whilst a negative has not effect. */ - virtual void setIntegration(CORBA::Long Integration) throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + virtual void setIntegration(CORBA::Long Integration) throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + virtual void setShift(CORBA::Long Shift) throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); /** * This method allows the client to interface the component by sending text commands. The command is parsed and executed according the * defined command syntax and grammar. This method is required to implement the Management::CommandInterpreter interface. @@ -258,9 +260,9 @@ public: */ virtual CORBA::Boolean command(const char *cmd,CORBA::String_out answer) throw (CORBA::SystemException); - virtual void getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException); + virtual char* getConfiguration() throw (CORBA::SystemException); - virtual void getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException); + virtual char* getCommProtVersion() throw (CORBA::SystemException); /** * This method is related to the implementation of the genericBackend interface @@ -362,7 +364,7 @@ public: * @param bw bandwidth interval. */ virtual void setTsysRange(CORBA::Double freq,CORBA::Double bw) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); - + /** * In order to get the inputs definition in just one call. The returned argument contains the configuration sequentially, the first element corresponds to the first input and so on. * @throw CORBA::SystemException diff --git a/Common/Servers/Skarab/src/CommandLine.cpp b/Common/Servers/Skarab/src/CommandLine.cpp index eaedc4212..245f499bc 100644 --- a/Common/Servers/Skarab/src/CommandLine.cpp +++ b/Common/Servers/Skarab/src/CommandLine.cpp @@ -5,24 +5,23 @@ /****************************************************************************************************************************/ #include /****************************************************************************************************************************/ - #define _CHECK_ERRORS(ROUTINE) \ - else if (res==FAIL) { \ - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); \ - dummy.setCode(m_Error.getErrorCode()); \ - dummy.setDescription((const char*)m_Error.getDescription()); \ - m_Error.Reset(); \ - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,ROUTINE); \ - } \ - else if (res==WOULDBLOCK) { \ - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,ROUTINE); \ - } \ - else if (res==DECODE_ERROR) { \ - _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,ROUTINE); \ - } \ - else { \ - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,ROUTINE); \ - } + else if (res==FAIL) { \ + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); \ + dummy.setCode(m_Error.getErrorCode()); \ + dummy.setDescription((const char*)m_Error.getDescription()); \ + m_Error.Reset(); \ + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,ROUTINE); \ + } \ + else if (res==WOULDBLOCK) { \ + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,ROUTINE); \ + } \ + else if (res==DECODE_ERROR) { \ + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,ROUTINE); \ + } \ + else { \ + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,ROUTINE); \ + } #define DECODE_ERROR -100 @@ -31,23 +30,23 @@ _IRA_LOGFILTER_IMPORT; CCommandLine::CCommandLine(ContainerServices *service): CSocket(), m_services(service) { - AUTO_TRACE("CCommandLine::CCommandLine()"); - m_bTimedout=false; - m_reiniting=false; - ACS::Time init=0; - m_lastUpdate.value(init); - m_Error.Reset(); - m_configuration=NULL; - m_backendStatus=0; - setStatus(NOTCNTD); - m_setTpiIntegration=true; + AUTO_TRACE("CCommandLine::CCommandLine()"); + m_bTimedout=false; + m_reiniting=false; + ACS::Time init=0; + m_lastUpdate.value(init); + m_Error.Reset(); + m_configuration=NULL; + m_backendStatus=0; + setStatus(NOTCNTD); + m_setTpiIntegration=true; m_stationSRT=false; m_stationMED=false; m_sectionsNumber=0; m_inputsNumber=0; m_stokes=false; - m_TsysRange_freq=0.0; - m_TsysRange_bw=0.0; + m_TsysRange_freq=0.0; + m_TsysRange_bw=0.0; m_SKARAB_1=false; m_SKARAB_1S=false; m_SKARAB_2=false; @@ -58,343 +57,404 @@ CCommandLine::CCommandLine(ContainerServices *service): CSocket(), m_SKARAB_4S=false; m_SKARAB_5=false; m_SKARAB_5S=false; + m_SKARAB_7=false; + m_SKARAB_11=false; + m_SKARAB_11S=false; + m_SKARAB_12=false; + m_SKARAB_12S=false; m_SkarabInitialized=false; + + m_kkg77=false; } CCommandLine::~CCommandLine() { - AUTO_TRACE("CCommandLine::~CCommandLine()"); - m_Error.Reset(); - // if the backend is transferring data...make a try to inform the backend before closing the connection - /*if (getIsBusy()) { - WORD len; - char sBuff[SENDBUFFERSIZE]; - len=CProtocol::stopAcquisition(sBuff); // get the buffer - sendBuffer(sBuff,len); - }*/ - Close(m_Error); + AUTO_TRACE("CCommandLine::~CCommandLine()"); + m_Error.Reset(); + // if the backend is transferring data...make a try to inform the backend before closing the connection + /*if (getIsBusy()) { + WORD len; + char sBuff[SENDBUFFERSIZE]; + len=CProtocol::stopAcquisition(sBuff); // get the buffer + sendBuffer(sBuff,len); + }*/ + Close(m_Error); } void CCommandLine::Init(CConfiguration *config) throw (ComponentErrors::SocketErrorExImpl, - ComponentErrors::ValidationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl) + ComponentErrors::ValidationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl) { int res; - //WORD len; - //char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE]; - - AUTO_TRACE("CCommandLine::Init()"); - m_configuration=config; - /*if (!initializeConfiguration(m_configuration->getConfiguration())) { // throw (ComponentErrors::CDBAccessExImpl) - IRA::CString msg; - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::Init()"); - msg.Format("the requested configuration %s is not known",(const char *)m_configuration->getConfiguration()); - impl.setReason((const char *)msg); - throw impl; - }*/ - // this will create the socket in blocking mode..... - if (Create(m_Error,STREAM)==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); - } - // the first time, perform a blocking connection.... - if (Connect(m_Error,m_configuration->getAddress(),m_configuration->getPort())==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); - } - else { - setStatus(CNTD); - } - // set socket send buffer!!!! - int Val=SENDBUFFERSIZE; - if (setSockOption(m_Error,SO_SNDBUF,&Val,sizeof(int))==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); - } - // set socket in non-blocking mode. - if (setSockMode(m_Error,NONBLOCKING)==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); - } + //WORD len; + //char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + + AUTO_TRACE("CCommandLine::Init()"); + m_configuration=config; + /*if (!initializeConfiguration(m_configuration->getConfiguration())) { // throw (ComponentErrors::CDBAccessExImpl) + IRA::CString msg; + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::Init()"); + msg.Format("the requested configuration %s is not known",(const char *)m_configuration->getConfiguration()); + impl.setReason((const char *)msg); + throw impl; + }*/ + // this will create the socket in blocking mode..... + if (Create(m_Error,STREAM)==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + // the first time, perform a blocking connection.... + if (Connect(m_Error,m_configuration->getAddress(),m_configuration->getPort())==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + else { + setStatus(CNTD); + } + // set socket send buffer!!!! + int Val=SENDBUFFERSIZE; + if (setSockOption(m_Error,SO_SNDBUF,&Val,sizeof(int))==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } + // set socket in non-blocking mode. + if (setSockMode(m_Error,NONBLOCKING)==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::Init()"); + } /* After the first connection, the server send the protocol version string */ res=receiveBuffer(rBuff,RECBUFFERSIZE); - //printf("connect = %s\n", rBuff); m_totalPower = Backends::TotalPower::_nil(); - try { - m_totalPower = m_services->getComponent("BACKENDS/TotalPower"); - } - catch (maciErrType::CannotGetComponentExImpl& ex) { - _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); - Impl.setComponentName("BACKENDS/TotalPower"); - throw Impl; - } - + try { + m_totalPower = m_services->getComponent("BACKENDS/TotalPower"); + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); + Impl.setComponentName("BACKENDS/TotalPower"); + throw Impl; + } + m_receiversBoss = Receivers::ReceiversBoss::_nil(); + try { + m_receiversBoss = m_services->getComponent("RECEIVERS/Boss"); + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); + Impl.setComponentName("RECEIVERS/Boss"); + throw Impl; + } /*m_ifDistributor = Receivers::GenericIFDistributor::_nil(); try { - m_ifDistributor = m_services->getComponent("RECEIVERS/SRTIFDistributor"); - } - catch (maciErrType::CannotGetComponentExImpl& ex) { - _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); - Impl.setComponentName("RECEIVERS/SRTIFDistributor"); - throw Impl; - }*/ + m_ifDistributor = m_services->getComponent("RECEIVERS/SRTIFDistributor"); + } + catch (maciErrType::CannotGetComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"CCommadLine::Init()"); + Impl.setComponentName("RECEIVERS/SRTIFDistributor"); + throw Impl; + }*/ char *Station; IRA::CString cStation; Station = getenv ("STATION"); cStation = IRA::CString (Station); - if((cStation.Compare("SRT")==0)) + if((cStation.Compare("SRT")==0)) { m_stationSRT = true; - if((cStation.Compare("Medicina")==0)) + strcpy (superVisorName, GAVINO); + } + if((cStation.Compare("Medicina")==0)) { m_stationMED = true; + strcpy (superVisorName, PALMIRO); + } + m_Scheduler = Management::Scheduler::_nil (); + try { + m_Scheduler = m_services->getComponent < Management::Scheduler > (superVisorName); + } + catch (maciErrType::CannotGetComponentExImpl & ex) + { + _ADD_BACKTRACE (ComponentErrors::CouldntGetComponentExImpl, Impl, ex, "CommandLine::Init()"); + Impl.setComponentName (superVisorName); + throw Impl; + } +} - /*try { - setup (m_configuration->getConfiguration()); +void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::stopDataAcquisition()"); + /*****************************************************************/ + // since both suspend and stop data acquisition are mapped into Command::stop message to the backend + // It happens (@ the end of a scan) that the backend receives two Command::stop messages. Even if this is not + // an issue for the backend, this leads to an unwanted behviour of the control software. The thrown exception, infact, + // leads to skip the first subscan of the next scan. Temporarly workround if to catch the exception here. A debug messages is sent. + /*****************************************************************/ + try { + Message reply = sendBackendCommand(Command::stop()); } catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::Init()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZATION ERROR")); + ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_DEBUG,"backend error while issuing a stop ascquisition")); } + ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_STOPPED")); + clearStatusField(CCommandLine::BUSY); // unsets the component status to busy + clearStatusField(CCommandLine::SUSPEND); // unsets the component status to transfer job suspended...... +} - //Waits a bit so that everything can settle down - IRA::CIRATools::Wait(0,200000);*/ +void CCommandLine::endSchedule() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + AUTO_TRACE("CCommandLine::endSchedule()"); + /*****************************************************************/ + // since both suspend and stop data acquisition are mapped into Command::stop message to the backend + // It happens (@ the end of a scan) that the backend receives two Command::stop messages. Even if this is not + // an issue for the backend, this leads to an unwanted behviour of the control software. The thrown exception, infact, + // leads to skip the first subscan of the next scan. Temporarly workround if to catch the exception here. A debug messages is sent. + /*****************************************************************/ + try { + Message reply = sendBackendCommand(Command::endSchedule()); + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::endSchedule()",(LM_DEBUG,"endSchedule")); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::endSchedule()",(LM_NOTICE,"endSchedule")); + clearStatusField(CCommandLine::BUSY); // unsets the component status to busy + clearStatusField(CCommandLine::SUSPEND); // unsets the component status to transfer job suspended...... } -void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, - ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +void CCommandLine::backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) { - AUTO_TRACE("CCommandLine::stopDataAcquisition()"); - /*****************************************************************/ - // since both suspend and stop data acquisition are mapped into Command::stop message to the backend - // It happens (@ the end of a scan) that the backend receives two Command::stop messages. Even if this is not - // an issue for the backend, this leads to an unwanted behviour of the control software. The thrown exception, infact, - // leads to skip the first subscan of the next scan. Temporarly workround if to catch the exception here. A debug messages is sent. - /*****************************************************************/ - try { - Message reply = sendBackendCommand(Command::stop()); - } - catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_DEBUG,"backend error while issuing a stop ascquisition")); - } - ACS_LOG(LM_FULL_INFO,"CCommandLine::stopDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_STOPPED")); - clearStatusField(CCommandLine::BUSY); // unsets the component status to busy - clearStatusField(CCommandLine::SUSPEND); // unsets the component status to transfer job suspended...... + AUTO_TRACE("CCommandLine::backendPark()"); + try { + Message reply = sendBackendCommand(Command::backendPark()); + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::backendPark()",(LM_DEBUG,"backendPark")); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::backendPark()",(LM_NOTICE,"backendPark")); } void CCommandLine::stopDataAcquisitionForced() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, - ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl) + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl) { } void CCommandLine::startDataAcquisition() throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConnectionExImpl, - BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl) + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl) { - AUTO_TRACE("CCommandLine::startDataAcquisition()"); - /* if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::startDataAcquisition()"); - throw impl; - }*/ - //Message reply = sendBackendCommand(Command::start()); - ACS_LOG(LM_FULL_INFO,"CCommandLine::startDataAcquisition()",(LM_NOTICE,"ACQUISTION_STARTED")); - setStatusField(CCommandLine::BUSY); // sets the component status to busy - setStatusField(CCommandLine::SUSPEND); // sets the component status to transfer job suspended...... + AUTO_TRACE("CCommandLine::startDataAcquisition()"); + /* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::startDataAcquisition()"); + throw impl; + }*/ + //Message reply = sendBackendCommand(Command::start()); + ACS_LOG(LM_FULL_INFO,"CCommandLine::startDataAcquisition()",(LM_NOTICE,"ACQUISTION_STARTED")); + setStatusField(CCommandLine::BUSY); // sets the component status to busy + setStatusField(CCommandLine::SUSPEND); // sets the component status to transfer job suspended...... } ACS::Time CCommandLine::resumeDataAcquisition(const ACS::Time& startT) throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, - BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) { - TIMEVALUE now; - TIMEVALUE epoch; - long waitSec,waitMicro; - DDWORD diff; - ACS::Time expectedTime; - AUTO_TRACE("CCommandLine::resumeDataAcquisition()"); - /*if ( !(m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { - _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::resumeDataAcquisition()"); - impl.setReason("transfer job cannot be resumed in present configuration"); - throw impl; - }*/ - // check that the backend latency in preparing the data transfer is respected...... - if (startT==0) { // immediate start - IRA::CIRATools::getTime(epoch); //...so take the present time - } - else { - epoch.value(startT); - IRA::CIRATools::getTime(now); - if (startT<=now.value().value) { - ACS_LOG(LM_FULL_INFO,"TotalPowerImpl::sendData()",(LM_WARNING,"START_TIME_ALREADY_ELAPSED")); - } - } - diff=IRA::CIRATools::timeDifference(epoch,m_acquisitionStartEpoch); - if (diffgetDataLatency()) { //wait until the latency time is elapsed...... - double waitTime; - waitMicro=m_configuration->getDataLatency()-diff; - waitTime=((double)waitMicro/1000000.0); - waitSec=(long)waitTime; - waitMicro%=1000000; - ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_WARNING,"BACKEND_LATENCY_NOT_MATCHED,WAITING %3.2lf usec",waitTime)); - IRA::CIRATools::Wait(waitSec,waitMicro); - expectedTime=m_acquisitionStartEpoch.value().value+m_configuration->getDataLatency()*10; - } - else { - expectedTime=epoch.value().value; - } + TIMEVALUE now; + TIMEVALUE epoch; + long waitSec,waitMicro; + DDWORD diff; + ACS::Time expectedTime; + AUTO_TRACE("CCommandLine::resumeDataAcquisition()"); + /*if ( !(m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::resumeDataAcquisition()"); + impl.setReason("transfer job cannot be resumed in present configuration"); + throw impl; + }*/ + // check that the backend latency in preparing the data transfer is respected...... + if (startT==0) { // immediate start + IRA::CIRATools::getTime(epoch); //...so take the present time + } + else { + epoch.value(startT); + IRA::CIRATools::getTime(now); + if (startT<=now.value().value) { + ACS_LOG(LM_FULL_INFO,"TotalPowerImpl::sendData()",(LM_WARNING,"START_TIME_ALREADY_ELAPSED")); + } + } + diff=IRA::CIRATools::timeDifference(epoch,m_acquisitionStartEpoch); + if (diffgetDataLatency()) { //wait until the latency time is elapsed...... + double waitTime; + waitMicro=m_configuration->getDataLatency()-diff; + waitTime=((double)waitMicro/1000000.0); + waitSec=(long)waitTime; + waitMicro%=1000000; + ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_WARNING,"BACKEND_LATENCY_NOT_MATCHED,WAITING %3.2lf usec",waitTime)); + IRA::CIRATools::Wait(waitSec,waitMicro); + expectedTime=m_acquisitionStartEpoch.value().value+m_configuration->getDataLatency()*10; + } + else { + expectedTime=epoch.value().value; + } Message request = Command::start(); Message reply = sendBackendCommand(request); if(reply.is_success_reply()) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_RESUMED")); - clearStatusField(SUSPEND); - } - return expectedTime; + ACS_LOG(LM_FULL_INFO,"CCommandLine::resumeDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_RESUMED")); + clearStatusField(SUSPEND); + } + return expectedTime; } void CCommandLine::suspendDataAcquisition() throw (BackendsErrors::ConnectionExImpl,ComponentErrors::NotAllowedExImpl, - BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) + BackendsErrors::NakExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::BackendFailExImpl) { - AUTO_TRACE("CCommandLine::suspendDataAcquisition()"); - /*if ((m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { //not suspended....running - _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::suspendDataAcquisition()"); - impl.setReason("transfer job cannot be suspended in present configuration"); - throw impl; - }*/ + AUTO_TRACE("CCommandLine::suspendDataAcquisition()"); + /*if ((m_backendStatus & (1 << SUSPEND)) || !getIsBusy()) { //not suspended....running + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::suspendDataAcquisition()"); + impl.setReason("transfer job cannot be suspended in present configuration"); + throw impl; + }*/ Message request = Command::stop(); Message reply = sendBackendCommand(request); if(reply.is_success_reply()) { ACS_LOG(LM_FULL_INFO,"CCommandLine::suspendDataAcquisition()",(LM_NOTICE,"TRANSFER_JOB_SUSPENDED")); - setStatusField(SUSPEND); - } + setStatusField(SUSPEND); + } } void CCommandLine::setAttenuation(const long&inputId, const double& attenuation) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, - ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) { - AUTO_TRACE("CCommandLine::setAttenuation()"); - double newAtt; - - if ((inputId < 0 ) || (inputId >= MAX_SECTION_NUMBER)) { - /*//if (inputId>=m_sectionsNumber) { - if (inputId>m_inputsNumber) { // TBC !!! - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); - impl.setReason("the input identifier is out of range"); - throw impl; - } - } - else {*/ - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); - impl.setReason("the input identifier is out of range"); - throw impl; - } - if (attenuation>=0) { // // the user ask for a new value - if (attenuationMAX_ATTENUATION) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setAttenuation()"); - impl.setValueName("attenuation"); - impl.setValueLimit(MAX_ATTENUATION); - throw impl; - } - m_attenuation[inputId]=attenuation; + AUTO_TRACE("CCommandLine::setAttenuation()"); + double newAtt; + + if ((inputId < 0 ) || (inputId >= MAX_SECTION_NUMBER)) { + /*//if (inputId>=m_sectionsNumber) { + if (inputId>m_inputsNumber) { // TBC !!! + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setReason("the input identifier is out of range"); + throw impl; + } + } + else {*/ + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setReason("the input identifier is out of range"); + throw impl; + } + if (attenuation>=0) { // // the user ask for a new value + if (attenuationMAX_ATTENUATION) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setAttenuation()"); + impl.setValueName("attenuation"); + impl.setValueLimit(MAX_ATTENUATION); + throw impl; + } + m_attenuation[inputId]=attenuation; try { m_totalPower->setAttenuation(inputId, attenuation); ACS_LOG(LM_FULL_INFO,"CCommandLine::setAttenuation()",(LM_NOTICE,"TOTALPOWER_ATTENUATION INPUT=%ld,ATTENUATION=%lf",inputId,attenuation)); } catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); - impl.log(LM_ERROR); - } - } - else { - newAtt=m_attenuation[inputId]; - } + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); + impl.log(LM_ERROR); + } + } + else { + newAtt=m_attenuation[inputId]; + } } -void CCommandLine::setTsysRange(const double& freq, const double& bw) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, - ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) +void CCommandLine::setTsysRange(const double& freq, const double& bw) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl) { - AUTO_TRACE("CCommandLine::setTsysRange()"); - m_TsysRange_freq = freq; - m_TsysRange_bw = bw; - ACS_LOG(LM_FULL_INFO,"CCommandLine::setTsysRange()",(LM_NOTICE,"TSYS RANGE FREQUENCY = %lf, BANDWIDTH = %lf",m_TsysRange_freq,m_TsysRange_bw)); + AUTO_TRACE("CCommandLine::setTsysRange()"); + m_TsysRange_freq = freq; + m_TsysRange_bw = bw; + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTsysRange()",(LM_NOTICE,"TSYS RANGE FREQUENCY = %lf, BANDWIDTH = %lf",m_TsysRange_freq,m_TsysRange_bw)); } void CCommandLine::setConfiguration(const long& inputId,const double& freq,const double& bw,const long& feed,const long& pol, const double& sr,const long& bins) throw ( - ComponentErrors::ValidationErrorExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, - ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::ValueOutofRangeExImpl, - BackendsErrors::BackendBusyExImpl) + ComponentErrors::ValidationErrorExImpl,BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::ValueOutofRangeExImpl, + BackendsErrors::BackendBusyExImpl) { - AUTO_TRACE("CCommandLine::setConfiguration()"); - double newBW,newSR,newFreq; + AUTO_TRACE("CCommandLine::setConfiguration()"); + double newBW,newSR,newFreq; long newBins, newFeed, newPol; double filter; - -/* if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setConfiguration()"); - throw impl; - }*/ - if (inputId>=0) { //check the section id is in valid ranges - //if (inputId>=m_sectionsNumber) { - if (inputId>m_sectionsNumber) { - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setReason("the section identifier is out of range"); - throw impl; - } - } - else { - _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setReason("the section identifier is out of range"); - throw impl; - } - if (bw>=0) { // the user ask for a new value - if (bwMAX_BAND_WIDTH) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("bandWidth"); - impl.setValueLimit(MAX_BAND_WIDTH); - throw impl; - } - newBW=bw; - } - else { // else keep the present value - newBW=m_bandWidth[inputId]; - } - if (sr>=0) {// the user ask for a new value - if ((sr > MAX_SAMPLE_RATE) || (sr != 2*newBW)) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("sampleRate"); - impl.setValueLimit(MAX_SAMPLE_RATE); - throw impl; - } - newSR=sr; - } - else { - newSR=m_sampleRate[inputId]; - } + double ddcoffset; + ACS::doubleSeq_var lo_var; + ACS::ROdoubleSeq_var loRef; + ACS::doubleSeq lo; + ACS::ROlong_var IFNumberRO; + long IFNumber; + ACSErr::Completion_var completion; + + if (m_SkarabInitialized == true) { + +/* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setConfiguration()"); + throw impl; + }*/ + if (inputId>=0) { //check the section id is in valid ranges + //if (inputId>=m_sectionsNumber) { + if (inputId>m_sectionsNumber) { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } + } + else { + _EXCPT(ComponentErrors::ValidationErrorExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setReason("the section identifier is out of range"); + throw impl; + } + if (bw>=0) { // the user ask for a new value + if (bwMAX_BAND_WIDTH) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bandWidth"); + impl.setValueLimit(MAX_BAND_WIDTH); + throw impl; + } + newBW=bw; + } + else { // else keep the present value + newBW=m_bandWidth[inputId]; + } + if (sr>=0) {// the user ask for a new value + if ((sr > MAX_SAMPLE_RATE) || (sr != 2*newBW)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("sampleRate"); + impl.setValueLimit(MAX_SAMPLE_RATE); + throw impl; + } + newSR=sr; + } + else { + newSR=m_sampleRate[inputId]; + } if (freq >= 0) { // the user ask for a new value if (freq >= MIN_FREQUENCY && freq <= MAX_FREQUENCY) { @@ -402,8 +462,8 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const } else { _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("freq"); - throw impl; + impl.setValueName("freq"); + throw impl; } } else @@ -412,55 +472,55 @@ void CCommandLine::setConfiguration(const long& inputId,const double& freq,const if (feed >= 0) { // the user ask for a new value if (feed != 0) { // BUT for the moment is it possible to use ONLY feed 0 _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("feed"); - throw impl; + impl.setValueName("feed"); + throw impl; } newFeed = feed; } else newFeed = m_feedNumber[inputId]; - - if (pol >= 0) { // the user ask for a new value - if ((pol == 0) || (pol == 1)) { // LCP or RCP - newPol = pol; - } - if (pol == 2) { // FULL STOKES - newPol = pol; - } - if (pol >= 3) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("pol"); - throw impl; - } + + if (pol >= 0) { // the user ask for a new value + if ((pol == 0) || (pol == 1)) { // LCP or RCP + newPol = pol; + } + if (pol == 2) { // FULL STOKES + newPol = pol; + } + if (pol >= 3) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("pol"); + throw impl; + } newPol = pol; - } - else - newPol = m_polarization[inputId]; + } + else + newPol = m_polarization[inputId]; if (bins>=0) { // the user ask for a new value if (bins < MIN_BINS || bins > MAX_BINS) { - _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); - impl.setValueName("bins"); + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setConfiguration()"); + impl.setValueName("bins"); /*if (bins != MIN_BINS) - impl.setValue(MIN_BINS); + impl.setValue(MIN_BINS); if (bins != MAX_BINS) - impl.setValue(MAX_BINS);*/ - throw impl; + impl.setValue(MAX_BINS);*/ + throw impl; } newBins=bins; - } + } else newBins = m_bins[inputId]; if (m_stationSRT == true) { - try { + try { Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); Message reply = sendBackendCommand(request); if (reply.is_success_reply()) { - for (int j=0;jsetSection(2*inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(2*inputId+1,-1, filter, -1, -1, -1, -1); - } - else if (m_SK01S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK02S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+3,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+4,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK03S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+5,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+6,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK04S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+7,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+8,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK05S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+9,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+10,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK06S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+11,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+12,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK01==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK02==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK03==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId+4,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK04==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId+6,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK01==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId+8,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK06==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId+10,-1, filter, -1, -1, -1, -1); - } - } - else - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); - }*/ - /*if ((m_SL00==true || m_SL00S==true) && m_stationSRT == true) { - try { - if (newBW==128.00) { - m_ifDistributor->setup("BW-NARROW"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-NARROW")); - } - if (newBW==420.00) { - m_ifDistributor->setup("BW-MEDIUM"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-MEDIUM")); - } - if (newBW==500.00) { - m_ifDistributor->setup("BW-WIDE"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-WIDE")); - } - if (newBW==512.00) { - m_ifDistributor->setup("BW-UNFILTERED"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_FILTER_BW-UNFILTERED")); - } - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"CCommandLine::setAttenuation()"); - impl.log(LM_ERROR); - } - }*/ + temp="FULL_STOKES"; + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"SECTION_CONFIGURED %ld,FREQ=%lf,BW=%lf,FEED=%ld,POL=%s,SR=%lf,BINS=%ld",inputId,m_frequency[inputId],newBW,m_feedNumber[inputId], + (const char *)temp,newSR,m_bins[inputId])); } - } + } catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); } } if (m_stationMED == true) { - try { + try { Message request = Command::setSection(inputId, newFreq, newBW, newFeed, newPol, newSR, newBins); Message reply = sendBackendCommand(request); if (reply.is_success_reply()) { - for (int j=0;jsetSection(2*inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(2*inputId+1,-1, filter, -1, -1, -1, -1); - } - else if (m_SK01S==true) { - if (inputId == 0) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - } - if (inputId == 1) { - m_totalPower->setSection(inputId+1,-1, filter, -1, -1, -1, -1); - m_totalPower->setSection(inputId+2,-1, filter, -1, -1, -1, -1); - } - } - else if (m_SK01==true) { - if (inputId == 0 || inputId == 1) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - if (inputId == 2 || inputId == 3) { - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - } - else - m_totalPower->setSection(inputId,-1, filter, -1, -1, -1, -1); - } - ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %ld,FILTER=%lf",inputId,filter)); - }*/ + temp="FULL_STOKES"; + ACS_LOG(LM_FULL_INFO,"CCommandLine::setConfiguration()",(LM_NOTICE,"SECTION_CONFIGURED %ld,FREQ=%lf,BW=%lf,FEED=%ld,POL=%s,SR=%lf,BINS=%ld",inputId,m_frequency[inputId],newBW,m_feedNumber[inputId], + (const char *)temp,newSR,m_bins[inputId])); } - } + } catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_SET_SECTION ERROR")); } } + //get DDC offset + /* try { + Message reply = sendBackendCommand(Command::getDDCoffset()); + if(reply.is_success_reply()) { + ddcoffset=(double)reply.get_argument(0); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"DDC OFFSET = %f", ddcoffset)); + } + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setSection()",(LM_NOTICE,"BACKEND_SKARAB_GET-DDC-OFFSET ERROR")); + } + if (ddcoffset != 0.0) { + loRef = m_receiversBoss->LO (); + lo_var = loRef->get_sync (completion.out ()); + IFNumberRO=m_receiversBoss->IFs(); + IFNumber=IFNumberRO->get_sync(completion.out()); // number of output IFs of the receiver + lo.length(IFNumber); + for (int j=0; jcommand ((const char *) inBuffer, ret_val); + out = IRA::CString (ret_val); + } + catch (CORBA::SystemException & ex) + { + _EXCPT (ComponentErrors::CORBAProblemExImpl, impl,"CExternalClientsSocketServer::cmdToScheduler()"); + impl.setName (ex._name ()); + impl.setMinor (ex.minor ()); + impl.log (LM_ERROR); + ret_val = "CORBA Error"; + out = IRA::CString (ret_val); + } + catch (...) + { + _EXCPT (ComponentErrors::UnexpectedExImpl, impl,"CExternalClientsSocketServer::cmdToScheduler()"); + impl.log (LM_ERROR); + ret_val = "Unexpected Error"; + out = IRA::CString (ret_val); + } + } */ + } } void CCommandLine::getZeroTPI(DWORD *tpi) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, - ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, - BackendsErrors::BackendBusyExImpl) + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl) { - /*AUTO_TRACE("CCommandLine::getZeroTPI()"); - int res; - WORD len; - char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE]; - long integration; - bool busy=getIsBusy(); - long waitTime=0; - if (busy) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::getZeroTPI()"); - throw impl; - } - if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); - } - integration=(long)round(1.0/ (m_commonSampleRate*1000.0)); - //res=getConfiguration(); // refresh the m_currentSampleRate.......... - if (res>0) { // load OK - // do nothing - } - _CHECK_ERRORS("CommandLine::getZeroTPI()"); - //if the requested integration is not equal to the current sample rate (given is milliseconds as a sample period) - // or the integration time must be forced...and the backend is not busy. Then set the correct sample rate.... - if ((integration!=m_currentSampleRate) || (m_setTpiIntegration)) { - len=CProtocol::setIntegrationTime(sBuff,integration); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - if (!CProtocol::isAck(rBuff)) { - _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); - } - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); - } - m_setTpiIntegration=false; - waitTime=1000000+integration*2000; // //wait time in microseconds...we should wait 2 seconds plus twice the integration time (which is given in milliseconds). - } - // connect the backend to the 50ohm - len=CProtocol::setZeroInput(sBuff,true); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - if (!CProtocol::isAck(rBuff)) { - _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); - } - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); - } - waitTime+=integration*2000; - if (waitTime>0) IRA::CIRATools::Wait(waitTime); - // now read the total power - len=CProtocol::getSample(sBuff); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - if (!CProtocol::decodeData(rBuff,tpi,m_configuration->getBoardsNumber(),m_sectionsNumber,m_boards)) { - _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::getZeroTPI()"); - } - for (int j=0;j0) { // operation was ok. - if (!CProtocol::isAck(rBuff)) { - _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); - } - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); - }*/ + /*AUTO_TRACE("CCommandLine::getZeroTPI()"); + int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + long integration; + bool busy=getIsBusy(); + long waitTime=0; + if (busy) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::getZeroTPI()"); + throw impl; + } + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + integration=(long)round(1.0/ (m_commonSampleRate*1000.0)); + //res=getConfiguration(); // refresh the m_currentSampleRate.......... + if (res>0) { // load OK + // do nothing + } + _CHECK_ERRORS("CommandLine::getZeroTPI()"); + //if the requested integration is not equal to the current sample rate (given is milliseconds as a sample period) + // or the integration time must be forced...and the backend is not busy. Then set the correct sample rate.... + if ((integration!=m_currentSampleRate) || (m_setTpiIntegration)) { + len=CProtocol::setIntegrationTime(sBuff,integration); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + m_setTpiIntegration=false; + waitTime=1000000+integration*2000; // //wait time in microseconds...we should wait 2 seconds plus twice the integration time (which is given in milliseconds). + } + // connect the backend to the 50ohm + len=CProtocol::setZeroInput(sBuff,true); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + } + waitTime+=integration*2000; + if (waitTime>0) IRA::CIRATools::Wait(waitTime); + // now read the total power + len=CProtocol::getSample(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + if (!CProtocol::decodeData(rBuff,tpi,m_configuration->getBoardsNumber(),m_sectionsNumber,m_boards)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::getZeroTPI()"); + } + for (int j=0;j0) { // operation was ok. + if (!CProtocol::isAck(rBuff)) { + _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::getZeroTPI()"); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::getZeroTPI()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::getZeroTPI()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::getZeroTPI()"); + }*/ } void CCommandLine::getTpi(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl, - BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, - BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) { - getSample(tpi,false); + getSample(tpi,false); } void CCommandLine::getZero(ACS::doubleSeq& tpi) throw (ComponentErrors::TimeoutExImpl, - BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, - BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) { - getSample(tpi,true); + getSample(tpi,true); } void CCommandLine::getSample(ACS::doubleSeq& tpi,bool zero) throw (ComponentErrors::TimeoutExImpl, - BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, - BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) { - AUTO_TRACE("CCommandLine::getSample()"); + AUTO_TRACE("CCommandLine::getSample()"); try { - Message reply = sendBackendCommand(Command::getTpi()); + Message reply = sendBackendCommand(Command::getTpi(m_TsysRange_freq,m_TsysRange_bw)); if(reply.is_success_reply()){ - tpi.length(m_inputsNumber/*m_sectionsNumber*/); - for (int j=0;j(j); - //if (zero) m_tpiZero[j]=tpi[j]/(double)m_integration; // in case of tpiZero we store it...... - if (zero) + tpi.length(m_inputsNumber/*m_sectionsNumber*/); + for (int j=0;j(j); + //if (zero) m_tpiZero[j]=tpi[j]/(double)m_integration; // in case of tpiZero we store it...... + if (zero) m_tpiZero[j]=tpi[j]=0.0; // in case of tpiZero we store it...... - } - } + } + } } catch (...) { ACS_LOG(LM_FULL_INFO,"CCommandLine::getTpi()",(LM_NOTICE,"BACKEND_SKARAB_GET-TPI ERROR")); - } + } } void CCommandLine::getRms(ACS::doubleSeq& rms) throw (ComponentErrors::TimeoutExImpl, - BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, - BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) + BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, + BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl) { - AUTO_TRACE("CCommandLine::getRms()"); + AUTO_TRACE("CCommandLine::getRms()"); try { Message reply = sendBackendCommand(Command::getRms()); if(reply.is_success_reply()){ - rms.length(m_inputsNumber/*m_sectionsNumber*/); - for (int j=0;j(j); - } - } + rms.length(m_inputsNumber/*m_sectionsNumber*/); + for (int j=0;j(j); + } + } } catch (...) { ACS_LOG(LM_FULL_INFO,"CCommandLine::getRms()",(LM_NOTICE,"BACKEND_SKARAB_GET-RMS ERROR")); - } + } } void CCommandLine::setDefaultConfiguration(const IRA::CString & config) throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, - ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) { - AUTO_TRACE("CCommandLine::setDefaultConfiguration()"); - //if (m_stationSRT==true) { - if (config.Compare("SKARAB_1")==0 || config.Compare("SKARAB_2")==0 || config.Compare("SKARAB_3")==0 || config.Compare("SKARAB_4")==0 || config.Compare("SKARAB_5")==0) { - //m_filter=1250.0; + AUTO_TRACE("CCommandLine::setDefaultConfiguration()"); + if (config.Compare("SKARAB_1")==0 || config.Compare("SKARAB_2")==0 || config.Compare("SKARAB_3")==0 || config.Compare("SKARAB_4")==0 || config.Compare("SKARAB_5")==0 || config.Compare("SKARAB_7")==0 + || config.Compare("SKARAB_11")==0 || config.Compare("SKARAB_12")==0 ) { m_inputsNumber=m_sectionsNumber; - //m_SK77=true; - //m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false; } - if (config.Compare("SKARAB_1S")==0 || config.Compare("SKARAB_2S")==0 || config.Compare("SKARAB_3S")==0 || config.Compare("SKARAB_4S")==0 || config.Compare("SKARAB_5S")==0) { - //m_filter=1250.0; + if (config.Compare("SKARAB_1S")==0 || config.Compare("SKARAB_2S")==0 || config.Compare("SKARAB_3S")==0 || config.Compare("SKARAB_4S")==0 || config.Compare("SKARAB_5S")==0 + || config.Compare("SKARAB_11S")==0 || config.Compare("SKARAB_12S")==0 ) { m_inputsNumber=m_sectionsNumber; m_sectionsNumber=m_sectionsNumber/2; m_stokes=true; - //m_SK77=true; - //m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false;// - } - /*if (config.Compare("SK00")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK00=true; - m_SK77=m_SK03=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK03S=m_SK06S=m_SK00S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK01")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK01=true; - m_SK77=m_SK00=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK02")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK02=true; - m_SK77=m_SK00=m_SK01=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK03")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK03=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK04")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK04=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK05")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK05=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK06")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK06=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SC00")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SC00=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SL00")==0) { - m_filter = 2300.0; - m_inputsNumber=m_sectionsNumber; - m_SL00=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - if (m_stationSRT == true) { - m_ifDistributor->setup("BW-UNFILTERED"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); - } - } - if (config.Compare("SP00")==0) { - m_filter = 730.0; - m_inputsNumber=m_sectionsNumber; - m_SP00=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK77S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK77S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK00S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK00S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK01S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK01S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK02S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK02S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK03S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK03S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK04S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK04S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK05S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK05S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK06S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK06S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK06S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SC00S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SC00S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SL00S")==0) { - m_filter = 2300.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SL00S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SP00S=false; - if (m_stationSRT == true) { - m_ifDistributor->setup("BW-UNFILTERED"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); - } - } - if (config.Compare("SP00S")==0) { - m_filter = 730.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SP00S=true; - m_SK77=m_SK00=m_SK01=m_SK02=m_SK03=m_SK04=m_SK05=m_SK06=m_SC00=m_SL00=m_SP00=m_SK77S=m_SK00S=m_SK01S=m_SK02S=m_SK03S=m_SK04S=m_SK05S=m_SK06S=m_SC00S=m_SL00S=false; - }*/ - //} - /*if (m_stationMED==true) { - if (config.Compare("SK01")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK01=true; - m_SK00=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK00")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SK00=true; - m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SCC00")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SCC00=true; - m_SK00=m_SK01=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCH00=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SCH00")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_SCH00=true; - m_SK00=m_SK01=m_SL00=m_SP00=m_SCC00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SL00")==0) { - m_filter = 2300.0; - m_inputsNumber=m_sectionsNumber; - m_SL00=true; - m_SK00=m_SK01=m_SCC00=m_SP00=m_SCH00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SP00")==0) { - m_filter = 730.0; - m_inputsNumber=m_sectionsNumber; - m_SP00=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK00S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK00S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SK01S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SK01S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SCC00S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SCC00S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SCC00S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCH00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SCH00S")==0) { - m_filter=1250.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SCH00S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SL00S=m_SP00S=false; - } - if (config.Compare("SL00S")==0) { - m_filter = 2300.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SL00S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SP00S=false; - if (m_stationSRT == true) { - m_ifDistributor->setup("BW-UNFILTERED"); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setDefaultConfiguration()",(LM_NOTICE,"IFDISTRIBUTOR_BW-UNFILTERED_CONFIGURED")); - } - } - if (config.Compare("SP00S")==0) { - m_filter = 730.0; - m_inputsNumber=m_sectionsNumber; - m_sectionsNumber=m_sectionsNumber/2; - m_SP00S=true; - m_SK00=m_SK01=m_SCC00=m_SCH00=m_SL00=m_SP00=m_SK00S=m_SK01S=m_SCC00S=m_SCH00S=m_SL00S=false; } - }*/ } void CCommandLine::setTargetFileName(const char *conf) @@ -1154,277 +841,319 @@ void CCommandLine::setTargetFileName(const char *conf) void CCommandLine::sendTargetFileName() throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl) { - AUTO_TRACE("CCommandLine::sendTargetFileName()"); - int res; - WORD len; - char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE]; - // I do not check for backend busy because this is a call done at the initialization and never repeated - if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); - } - strcpy (sBuff,"?set-filename,"); - strcat (sBuff,(const char*)m_targetFileName); - strcat (sBuff,"\r\n"); - len = strlen (sBuff); - - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); + AUTO_TRACE("CCommandLine::sendTargetFileName()"); + int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + // I do not check for backend busy because this is a call done at the initialization and never repeated + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); + } + strcpy (sBuff,"?set-filename,"); + strcat (sBuff,(const char*)m_targetFileName); + strcat (sBuff,"\r\n"); + len = strlen (sBuff); + + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); //printf("set-filename = %s\n",rBuff); - } - if (res>0) { // operation was ok. - //if (!CProtocol::setConfiguration(rBuff)) { - // _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::setTargetFileName()"); - //} - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendTargetFileName()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendTargetFileName()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); - } - ACS_LOG(LM_FULL_INFO,"CCommandLine::sendTargetFileName()",(LM_NOTICE,"targetFileName SENT")); + } + if (res>0) { // operation was ok. + //if (!CProtocol::setConfiguration(rBuff)) { + // _THROW_EXCPT(BackendsErrors::NakExImpl,"CCommandLine::setTargetFileName()"); + //} + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendTargetFileName()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendTargetFileName()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendTargetFileName()"); + } + ACS_LOG(LM_FULL_INFO,"CCommandLine::sendTargetFileName()",(LM_NOTICE,"targetFileName SENT")); } void CCommandLine::setup(const char *conf) throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConfigurationErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, - ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,ComponentErrors::CDBAccessExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ReplyNotValidExImpl,BackendsErrors::BackendFailExImpl) { - AUTO_TRACE("CCommandLine::setup()"); - - /* if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setup()"); - throw impl; - }*/ - - if (!initializeConfiguration(conf)) { - _EXCPT(BackendsErrors::ConfigurationErrorExImpl,impl,"CCommandLine::setup()"); - throw impl; - } + AUTO_TRACE("CCommandLine::setup()"); + + int inputs; + + /* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setup()"); + throw impl; + }*/ + ACSErr::Completion_var completion; + m_receiverRef = m_receiversBoss->actualSetup (); + m_receiver = m_receiverRef->get_sync (completion.out ()); + m_recstr = IRA::CString (m_receiver); + + if (!initializeConfiguration(conf)) { + _EXCPT(BackendsErrors::ConfigurationErrorExImpl,impl,"CCommandLine::setup()"); + throw impl; + } try { Message request = Command::setConfiguration(string((const char*)conf)); - Message reply = sendBackendCommand(request); - if(reply.is_success_reply()) { + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) { setDefaultConfiguration(conf); - /*for (int i=0;isetSection(i,-1, m_filter, -1, -1, -1, -1); - } - if (i == 2 || i == 3) { - m_totalPower->setSection(i+2,-1, m_filter, -1, -1, -1, -1); - } - } - if (m_SK03S==true || m_SK03==true) { - if (i == 0 || i == 1) { - m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); - } - if (i == 2 || i == 3) { - m_totalPower->setSection(i+4,-1, m_filter, -1, -1, -1, -1); - } - } - if (m_SK04S==true || m_SK04==true) { - if (i == 0 || i == 1) { - m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); - } - if (i == 2 || i == 3) { - m_totalPower->setSection(i+6,-1, m_filter, -1, -1, -1, -1); - } - } - if (m_SK05S==true || m_SK03==true) { - if (i == 0 || i == 1) { - m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); - } - if (i == 2 || i == 3) { - m_totalPower->setSection(i+8,-1, m_filter, -1, -1, -1, -1); - } - } - else if (m_SK06S==true || m_SK06==true) { - if (i == 0 || i == 1) { - m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); - } - if (i == 2 || i == 3) { - m_totalPower->setSection(i+10,-1, m_filter, -1, -1, -1, -1); - } - } - else - m_totalPower->setSection(i,-1, m_filter, -1, -1, -1, -1); + if (m_recstr.Compare("KKG")==0) { + inputs=14; + } + if (m_recstr.Compare("CCB")==0) { + inputs=2; + } + if (m_recstr.Compare("CCG")==0) { + inputs=2; + } + m_filter=2350.0; + for (int i=0;isetSection(i,-1, m_filter, -1, -1, -1, -1); ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"TOTALPOWER_FILTER_CONFIGURED %d,FILTER=%lf",i,m_filter)); - }*/ + } } - ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZED, CONFIGURATION: %s",conf)); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZED, CONFIGURATION: %s",conf)); + m_SkarabInitialized = true; + } + catch (...) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZATION ERROR, CONFIGURATION: %s",conf)); } - catch (...) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setup()",(LM_NOTICE,"BACKEND_SKARAB_INITIALIZATION ERROR, CONFIGURATION: %s",conf)); - } } void CCommandLine::checkTime() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::MalformedAnswerExImpl,ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl) { - if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); - } - /*Message request = Command::time(); + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + } + /*Message request = Command::time(); Message reply = sendBackendCommand(request); string _time = reply.get_argument(0); if(reply.is_success_reply()) strcpy(time, _time.c_str()); return _time.length();*/ - + /*char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE]; - WORD len; - int res; - ///the check of th ebusy status is not done because this time chek must be performed also during sampling. - if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); - } - len=CProtocol::checkBackendTime(sBuff); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - bool sync; - if (!CProtocol::checkBackendTime(rBuff,m_configuration->getTimeTollerance(),sync)) { - _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::checkTime()"); - } else if (!sync) { - _IRA_LOGFILTER_LOG(LM_WARNING,"CCommandLine::checkTime()","BACKEND_CLOCK_NOT_SYNCHRONIZED"); - setStatusField(TIME_SYNC); - } - else { - clearStatusField(TIME_SYNC); - } - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::checkTime()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::checkTime()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); - }*/ + char rBuff[RECBUFFERSIZE]; + WORD len; + int res; + ///the check of th ebusy status is not done because this time chek must be performed also during sampling. + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + } + len=CProtocol::checkBackendTime(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + bool sync; + if (!CProtocol::checkBackendTime(rBuff,m_configuration->getTimeTollerance(),sync)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::checkTime()"); + } else if (!sync) { + _IRA_LOGFILTER_LOG(LM_WARNING,"CCommandLine::checkTime()","BACKEND_CLOCK_NOT_SYNCHRONIZED"); + setStatusField(TIME_SYNC); + } + else { + clearStatusField(TIME_SYNC); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::checkTime()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::checkTime()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::checkTime()"); + }*/ } void CCommandLine::setTime() throw (ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl, - ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, - BackendsErrors::BackendBusyExImpl) + ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl,BackendsErrors::MalformedAnswerExImpl, + BackendsErrors::BackendBusyExImpl) { - AUTO_TRACE("CCommandLine::setTime()"); - //int res; - //WORD len; - //char sBuff[SENDBUFFERSIZE]; - //char rBuff[RECBUFFERSIZE]; -/* if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); - throw impl; - }*/ - /*len=CProtocol::setBackendTime(sBuff); // get the buffer - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - bool sync; - if (!CProtocol::decodeBackendTime(rBuff,sync)) { - _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::setTime()"); - setStatusField(TIME_SYNC); - } else if (!sync) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_WARNING,"CLOCK_NOT_SYNCHRONIZED")); - setStatusField(TIME_SYNC); - } - else { - clearStatusField(TIME_SYNC); - ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_NOTICE,"TIME_IS_SYNCHRONIZED")); - } - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::setTime()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::setTime()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); - } + AUTO_TRACE("CCommandLine::setTime()"); + //int res; + //WORD len; + //char sBuff[SENDBUFFERSIZE]; + //char rBuff[RECBUFFERSIZE]; +/* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); + throw impl; + }*/ + /*len=CProtocol::setBackendTime(sBuff); // get the buffer + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + bool sync; + if (!CProtocol::decodeBackendTime(rBuff,sync)) { + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"CCommandLine::setTime()"); + setStatusField(TIME_SYNC); + } else if (!sync) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_WARNING,"CLOCK_NOT_SYNCHRONIZED")); + setStatusField(TIME_SYNC); + } + else { + clearStatusField(TIME_SYNC); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setTime()",(LM_NOTICE,"TIME_IS_SYNCHRONIZED")); + } + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::setTime()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::setTime()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); + } */ } void CCommandLine::activateCalSwitching(const long& interleave) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::NotAllowedExImpl) { - AUTO_TRACE("CCommandLine::activateCalSwitching()"); - /*int res; - WORD len; - char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE];*/ - if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); - throw impl; - } - /*if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); - }*/ + AUTO_TRACE("CCommandLine::activateCalSwitching()"); + /*int res; + WORD len; + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE];*/ + if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setTime()"); + throw impl; + } + /*if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::setTime()"); + }*/ Message request = Command::calOn(interleave); Message reply = sendBackendCommand(request); if(reply.is_success_reply()){ // TBD } - if (!m_calSwitchingEnabled) { - _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::activateCalSwitching()"); - throw impl; - } - if (interleave>=0) { - m_calPeriod=interleave; - if (m_calPeriod>0) { - ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_ON")); - } - else { - ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_OFF")); - } - } + if (!m_calSwitchingEnabled) { + _EXCPT(ComponentErrors::NotAllowedExImpl,impl,"CCommandLine::activateCalSwitching()"); + throw impl; + } + if (interleave>=0) { + m_calPeriod=interleave; + if (m_calPeriod>0) { + ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_ON")); + } + else { + ACS_LOG(LM_FULL_INFO,"CCommandLine::activateCalSwitching()",(LM_NOTICE,"CALIBRATION_DIODE_SWITCHING_OFF")); + } + } } -void CCommandLine::setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl) +void CCommandLine::setEnabled(const ACS::longSeq& en) throw (BackendsErrors::BackendBusyExImpl, BackendsErrors::ConfigurationErrorExImpl, ComponentErrors::ValueOutofRangeExImpl) { - int bound; - if (getIsBusy()) { - _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setEnabled()"); - throw impl; - } - if ((long)en.length()>=m_sectionsNumber) { - bound=m_sectionsNumber; - } - else { - bound=en.length(); - } - for (int i=0;i0) m_enabled[i]=true; - else if (en[i]==0) m_enabled[i]=false; - } - ACS_LOG(LM_FULL_INFO,"CCommandLine::setEnabled()",(LM_NOTICE,"CHANGED_ENABLED_CHANNEL")); + int bound; + int i; + long m_en[4]; +// bool kkg77 = false; +// IRA::CString recstr; +// ACS::ROstring_var receiverRef; +// CORBA::String_var receiver; +// ACSErr::Completion_var completion; + + /* if (getIsBusy()) { + _EXCPT(BackendsErrors::BackendBusyExImpl,impl,"CCommandLine::setEnabled()"); + throw impl; + }*/ + if (m_SkarabInitialized == true) { + if ((long)en.length()!=2/*m_sectionsNumber*/) { + /*errore;*/ + } + /*else { + bound=en.length(); + } + for (int i=0;i0) m_enabled[i]=true; + else if (en[i]==0) m_enabled[i]=false; + }*/ +// receiverRef = m_receiversBoss->actualSetup (); +// receiver = receiverRef->get_sync (completion.out ()); +// recstr = IRA::CString (receiver); + if ((m_recstr.Compare("KKG")==0) && (en[0]==7 && en[1]==7)) { + m_en[0]=m_en[2]=7; + m_kkg77=true; + } + if (m_kkg77 == false) { + if (m_recstr.Compare("KKG")==0) { + if ((en[0] < 0) || (en[0] > 6)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setEnabled()"); + impl.setValueName("feed"); + throw impl; + } + if ((en[1] < 0) || (en[1] > 6)) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setEnabled()"); + impl.setValueName("feed"); + throw impl; + } + } + if (en[0] == en[1]) { // central feed + m_inputsNumber = 2; + if (m_stokes == false) + m_sectionsNumber = 2; + if (m_stokes == true) + m_sectionsNumber = 1; + m_beams = 1; // TBC !!! + } + else { // nodding + m_inputsNumber = 4; + if (m_stokes == false) + m_sectionsNumber = 4; + if (m_stokes == true) + m_sectionsNumber = 2; + m_beams = 2; // TBC !!! + } + m_en[0] = en[0]; + m_en[1] = en[0]; + m_en[2] = en[1]; + m_en[3] = en[1]; + for (i=0;i=MIN_INTEGRATION && m_integration <= MAX_INTEGRATION) { Message request = Command::setIntegration(integration); Message reply = sendBackendCommand(request); @@ -1436,49 +1165,60 @@ void CCommandLine::setIntegration(const long& integration) throw (BackendsError else { _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setIntegration()"); impl.setValueName("integration"); - throw impl; + throw impl; + } +} + +void CCommandLine::setShift(const long& shift) throw (BackendsErrors::BackendBusyExImpl) +{ + AUTO_TRACE("CCommandLine::setShift()"); + Message request = Command::setShift(shift); + Message reply = sendBackendCommand(request); + if (reply.is_success_reply()) { + // TBD + ACS_LOG(LM_FULL_INFO,"CCommandLine::setShift()",(LM_NOTICE,"SHIFT is now %ld",shift)); } } void CCommandLine::getAttenuation(ACS::doubleSeq& att) throw (ComponentErrors::SocketErrorExImpl, - ComponentErrors::TimeoutExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl) + ComponentErrors::TimeoutExImpl,BackendsErrors::MalformedAnswerExImpl,BackendsErrors::ConnectionExImpl) { - AUTO_TRACE("CCommandLine::getAttenuation()"); + AUTO_TRACE("CCommandLine::getAttenuation()"); att.length(m_inputsNumber); - for (int i=0;i(0); day=seconds/86400; - seconds%=86400; - hour=seconds/3600; - seconds%=3600; - minute=seconds/60; - second=seconds % 60; - bkndTime.day(day); - bkndTime.hour(hour); - bkndTime.minute(minute); - bkndTime.second(second); + seconds%=86400; + hour=seconds/3600; + seconds%=3600; + minute=seconds/60; + second=seconds % 60; + bkndTime.day(day); + bkndTime.hour(hour); + bkndTime.minute(minute); + bkndTime.second(second); tm.reset(); - tm.normalize(true); - tm.year(1970); - tm.month(1); - tm.day(1); + tm.normalize(true); + tm.year(1970); + tm.month(1); + tm.day(1); tm+=bkndTime.value(); tt=tm.value().value; } @@ -1673,421 +1403,430 @@ void CCommandLine::getTime(ACS::Time& tt) throw (ComponentErrors::SocketErrorExI void CCommandLine::fillMainHeader(Backends::TMainHeader& bkd) { - bkd.sections=m_sectionsNumber; - bkd.beams=m_beams; - //resultingSampleRate(m_integration,m_commonSampleRate,intTime); - //bkd.integration=intTime; - bkd.integration=m_integration; - bkd.sampleSize=m_sampleSize; - bkd.noData=true; + bkd.sections=m_sectionsNumber; + bkd.beams=m_beams; + //resultingSampleRate(m_integration,m_commonSampleRate,intTime); + //bkd.integration=intTime; + bkd.integration=m_integration; + bkd.sampleSize=m_sampleSize; + bkd.noData=true; } void CCommandLine::fillChannelHeader(Backends::TSectionHeader *chHr,const long& size) { - long index=0; - for (int i=0;i0.0) || ((temp-accumulations)<0.0)) { - res=true; - } - result=(long)round((accumulations/(sr*1000))); - return res; + bool res=false; + long accumulations; + double temp; + temp=(double)integration*1000.0*sr; + accumulations=(long)round(temp); + if (accumulations<1) accumulations=1; + if (((temp-accumulations)>0.0) || ((temp-accumulations)<0.0)) { + res=true; + } + result=(long)round((accumulations/(sr*1000))); + return res; } // Protected Methods void CCommandLine::onConnect(int ErrorCode) { - CError Tmp; - if (getStatus()==CNTDING) { // if the line is connecting....... - if (ErrorCode==0) { - if (EventSelect(Tmp,E_CONNECT,false)==SUCCESS) { - setStatus(CNTD); - CSocket::setStatus(IRA::CSocket::READY); // force the socket status to be ready..... - try { - //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... - } - catch (ACSErr::ACSbaseExImpl& ex) { - - } - clearStatusField(BUSY); - m_reiniting=true; // ask to the datasocket to accept connection again - ACS_LOG(LM_FULL_INFO,"CCommandLine::onConnect()",(LM_NOTICE,"SOCKET_RECONNECTED")); - } - } - else { - setStatus(NOTCNTD); - ACS_DEBUG_PARAM("CCommandLine::onConnect()","Reconnection failed, exit code is %d",ErrorCode); - } - } + CError Tmp; + if (getStatus()==CNTDING) { // if the line is connecting....... + if (ErrorCode==0) { + if (EventSelect(Tmp,E_CONNECT,false)==SUCCESS) { + setStatus(CNTD); + CSocket::setStatus(IRA::CSocket::READY); // force the socket status to be ready..... + try { + //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... + } + catch (ACSErr::ACSbaseExImpl& ex) { + + } + clearStatusField(BUSY); + m_reiniting=true; // ask to the datasocket to accept connection again + ACS_LOG(LM_FULL_INFO,"CCommandLine::onConnect()",(LM_NOTICE,"SOCKET_RECONNECTED")); + } + } + else { + setStatus(NOTCNTD); + ACS_DEBUG_PARAM("CCommandLine::onConnect()","Reconnection failed, exit code is %d",ErrorCode); + } + } } void CCommandLine::onTimeout(WORD EventMask) { - if ((EventMask&E_CONNECT)==E_CONNECT) { - ACS_DEBUG("CCommandLine::onTimeout()","Reconnection timed-out, keep trying...."); - } + if ((EventMask&E_CONNECT)==E_CONNECT) { + ACS_DEBUG("CCommandLine::onTimeout()","Reconnection timed-out, keep trying...."); + } } // private methods IRA::CSocket::OperationResult CCommandLine::sendBuffer(char *Msg,WORD Len) { - int NWrite; - int BytesSent; - BytesSent=0; - while (BytesSentm_configuration->getCommandLineTimeout()) { - m_bTimedout=true; - return WOULDBLOCK; - } - else { - CIRATools::Wait(0,20000); - continue; - } - } - else if (res==FAIL) { - setStatus(NOTCNTD); - CString app; - app.Format("SOCKET_DISCONNECTED - %s",(const char *)m_Error.getFullDescription()); - _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()",(const char*)app); - return res; - } - else if (res==0) { - setStatus(NOTCNTD); - _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()","SOCKET_DISCONNECTED - remote side shutdown"); - return res; - } - else { - if (inCh!=PROT_TERMINATOR_CH) { - Msg[nRead]=inCh; - nRead++; - } - else { - Msg[nRead]=0; - return nRead; - } - } - } + char inCh; + int res; + int nRead=0; + TIMEVALUE Now; + TIMEVALUE Start; + CIRATools::getTime(Start); + while(true) { + res=Receive(m_Error,&inCh,1); + if (res==WOULDBLOCK) { + CIRATools::getTime(Now); + if (CIRATools::timeDifference(Start,Now)>m_configuration->getCommandLineTimeout()) { + m_bTimedout=true; + return WOULDBLOCK; + } + else { + CIRATools::Wait(0,20000); + continue; + } + } + else if (res==FAIL) { + setStatus(NOTCNTD); + CString app; + app.Format("SOCKET_DISCONNECTED - %s",(const char *)m_Error.getFullDescription()); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()",(const char*)app); + return res; + } + else if (res==0) { + setStatus(NOTCNTD); + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::receiveBuffer()","SOCKET_DISCONNECTED - remote side shutdown"); + return res; + } + else { + if (inCh!=PROT_TERMINATOR_CH) { + Msg[nRead]=inCh; + nRead++; + } + else { + Msg[nRead]=0; + return nRead; + } + } + } } int CCommandLine::sendCommand(char *inBuff,const WORD& inLen,char *outBuff) { - OperationResult Res; - if ((Res=sendBuffer(inBuff,inLen))==SUCCESS) { - int bytes=receiveBuffer(outBuff,RECBUFFERSIZE); - return bytes; - } - else { // send fails....m_Error already set by sendBuffer - return Res; - } + OperationResult Res; + if ((Res=sendBuffer(inBuff,inLen))==SUCCESS) { + int bytes=receiveBuffer(outBuff,RECBUFFERSIZE); + return bytes; + } + else { // send fails....m_Error already set by sendBuffer + return Res; + } } -Message +Message CCommandLine::sendBackendCommand(Message request) { - if (!checkConnection()) { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); - } - char sBuff[SENDBUFFERSIZE]; - char rBuff[RECBUFFERSIZE]; - strcpy (sBuff,request.toString(true).c_str()); - int len = strlen (sBuff); - int res = 0; - if ((res=sendBuffer(sBuff,len))==SUCCESS) { - res=receiveBuffer(rBuff,RECBUFFERSIZE); - } - if (res>0) { // operation was ok. - clearStatusField(CCommandLine::BUSY); - setStatusField(SUSPEND); - } - else if (res==FAIL) { - _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); - dummy.setCode(m_Error.getErrorCode()); - dummy.setDescription((const char*)m_Error.getDescription()); - m_Error.Reset(); - _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendBackendCommand()"); - } - else if (res==WOULDBLOCK) { - _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendBackendCommand()"); - } - else { - _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); - } - Message reply(string(rBuff, res), true); - try { - reply.validate(); - } - catch (BackendProtocolError& bpe) { - //TODO: somehow the reply is not valid - //we cannot proceed we need to throw an exception - _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"sendBackendCommand()"); - } - if(!(reply.is_valid_reply_for(request))) - { - //TODO: this answer is not valid for this request, throw exception - _THROW_EXCPT(BackendsErrors::ReplyNotValidExImpl,"sendBackendCommand()"); - } - if(!(reply.is_success_reply())) - { - //TODO: the reply has a FAIL o INVALID code, this must be - //managed - _EXCPT(BackendsErrors::BackendFailExImpl,impl,"sendBackendCommand()"); - //impl.setReason("transfer job cannot be resumed in present configuration"); - impl.setReason(reply.get_argument(0).c_str()); - throw impl; - } - return reply; + if (!checkConnection()) { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); + } + char sBuff[SENDBUFFERSIZE]; + char rBuff[RECBUFFERSIZE]; + strcpy (sBuff,request.toString(true).c_str()); + int len = strlen (sBuff); + int res = 0; + if ((res=sendBuffer(sBuff,len))==SUCCESS) { + res=receiveBuffer(rBuff,RECBUFFERSIZE); + } + if (res>0) { // operation was ok. + clearStatusField(CCommandLine::BUSY); + setStatusField(SUSPEND); + } + else if (res==FAIL) { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl,dummy,m_Error); + dummy.setCode(m_Error.getErrorCode()); + dummy.setDescription((const char*)m_Error.getDescription()); + m_Error.Reset(); + _THROW_EXCPT_FROM_EXCPT(ComponentErrors::SocketErrorExImpl,dummy,"CCommandLine::sendBackendCommand()"); + } + else if (res==WOULDBLOCK) { + _THROW_EXCPT(ComponentErrors::TimeoutExImpl,"CCommandLine::sendBackendCommand()"); + } + else { + _THROW_EXCPT(BackendsErrors::ConnectionExImpl,"CCommandLine::sendBackendCommand()"); + } + Message reply(string(rBuff, res), true); + try { + reply.validate(); + } + catch (BackendProtocolError& bpe) { + //TODO: somehow the reply is not valid + //we cannot proceed we need to throw an exception + _THROW_EXCPT(BackendsErrors::MalformedAnswerExImpl,"sendBackendCommand()"); + } + if(!(reply.is_valid_reply_for(request))) + { + //TODO: this answer is not valid for this request, throw exception + _THROW_EXCPT(BackendsErrors::ReplyNotValidExImpl,"sendBackendCommand()"); + } + if(!(reply.is_success_reply())) + { + //TODO: the reply has a FAIL o INVALID code, this must be + //managed + _EXCPT(BackendsErrors::BackendFailExImpl,impl,"sendBackendCommand()"); + //impl.setReason("transfer job cannot be resumed in present configuration"); + impl.setReason(reply.get_argument(0).c_str()); + throw impl; + } + return reply; } //int CCommandLine::getConfiguration(char* configuration) -void CCommandLine::getConfiguration(char* configuration) +char* CCommandLine::getConfiguration() { Message request = Command::getConfiguration(); try { Message reply = sendBackendCommand(request); if(reply.is_success_reply()) { - strcpy(configuration, reply.get_argument(0).c_str()); + return CORBA::string_dup(reply.get_argument(0).c_str()); } } catch (...) { - } + + return CORBA::string_dup(""); } -int CCommandLine::getCommProtVersion(CORBA::String_out version) +char* CCommandLine::getCommProtVersion() { Message request = Command::version(); - Message reply = sendBackendCommand(request); - string _version = reply.get_argument(0); - if(reply.is_success_reply()) - strcpy(version, _version.c_str()); - return _version.length(); + try + { + Message reply = sendBackendCommand(request); + if(reply.is_success_reply()) + { + return CORBA::string_dup(reply.get_argument(0).c_str()); + } + } + catch(...) { + } + + return CORBA::string_dup(""); } bool CCommandLine::checkConnection() { - CError Tmp; - char sBuffer[RECBUFFERSIZE]; - int rBytes; - if (m_bTimedout) { // if a previous time out happend....try if the buffer has still to be received - rBytes=receiveBuffer(sBuffer,RECBUFFERSIZE); - if (rBytes==WOULDBLOCK) { // if the operation would have block again.....declare the disconnection - setStatus(NOTCNTD); // another timeout! something has happend - _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::checkConnection()","SOCKET_DISCONNECTED - timeout expired"); - } - else if (rBytes==FAIL) { - // Nothing to do, this error will be handled below.... - } - else if (rBytes==0) { - // Nothing to do, this error will be handled below.... - } - else { - m_bTimedout=false; // timeout recovered - } - } - if (getStatus()==CNTD) { - return true; - } - else if (getStatus()==CNTDING) { - return false; - } - else { // socket is not connected.... - // try to close the socket, if it is already closed : never known.... - Close(Tmp); - Tmp.Reset(); - m_bTimedout=false; - // this will create the socket in blocking mode..... - if (Create(Tmp,STREAM)==SUCCESS) { - // Put the socket in non-blocking mode, registers the onconnect event....and allow some seconds to complete! - if (EventSelect(Tmp,E_CONNECT,true,m_configuration->getConnectTimeout())==SUCCESS) { - OperationResult Res; - ACS_DEBUG("CCommandLine::checkConnection()","Trying to reconnect"); - Res=Connect(Tmp,m_configuration->getAddress(),m_configuration->getPort()); - if (Res==WOULDBLOCK) { - setStatus(CNTDING); - } - else if (Res==SUCCESS) { - setStatus(CNTD); - try { - //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... - } - catch (ACSErr::ACSbaseExImpl& ex) { - - } - clearStatusField(BUSY); - m_reiniting=true; - ACS_LOG(LM_FULL_INFO,"CCommandLine::checkConnection()",(LM_NOTICE,"SOCKET_RECONNECTED")); //we do not want to filter this info so no logfilter..... - return true; - } - } - } - return false; - } + CError Tmp; + char sBuffer[RECBUFFERSIZE]; + int rBytes; + if (m_bTimedout) { // if a previous time out happend....try if the buffer has still to be received + rBytes=receiveBuffer(sBuffer,RECBUFFERSIZE); + if (rBytes==WOULDBLOCK) { // if the operation would have block again.....declare the disconnection + setStatus(NOTCNTD); // another timeout! something has happend + _IRA_LOGFILTER_LOG(LM_CRITICAL,"CCommandLine::checkConnection()","SOCKET_DISCONNECTED - timeout expired"); + } + else if (rBytes==FAIL) { + // Nothing to do, this error will be handled below.... + } + else if (rBytes==0) { + // Nothing to do, this error will be handled below.... + } + else { + m_bTimedout=false; // timeout recovered + } + } + if (getStatus()==CNTD) { + return true; + } + else if (getStatus()==CNTDING) { + return false; + } + else { // socket is not connected.... + // try to close the socket, if it is already closed : never known.... + Close(Tmp); + Tmp.Reset(); + m_bTimedout=false; + // this will create the socket in blocking mode..... + if (Create(Tmp,STREAM)==SUCCESS) { + // Put the socket in non-blocking mode, registers the onconnect event....and allow some seconds to complete! + if (EventSelect(Tmp,E_CONNECT,true,m_configuration->getConnectTimeout())==SUCCESS) { + OperationResult Res; + ACS_DEBUG("CCommandLine::checkConnection()","Trying to reconnect"); + Res=Connect(Tmp,m_configuration->getAddress(),m_configuration->getPort()); + if (Res==WOULDBLOCK) { + setStatus(CNTDING); + } + else if (Res==SUCCESS) { + setStatus(CNTD); + try { + //stopDataAcquisitionForced(); // ask the backend to exit the data transfering mode...... + } + catch (ACSErr::ACSbaseExImpl& ex) { + + } + clearStatusField(BUSY); + m_reiniting=true; + ACS_LOG(LM_FULL_INFO,"CCommandLine::checkConnection()",(LM_NOTICE,"SOCKET_RECONNECTED")); //we do not want to filter this info so no logfilter..... + return true; + } + } + } + return false; + } } bool CCommandLine::initializeConfiguration(const IRA::CString & config) throw (ComponentErrors::CDBAccessExImpl) { - int i; - CConfiguration::TBackendSetup setup; - if (m_configuration->getSetupFromID(config,setup)) { // throw (ComponentErrors::CDBAccessExImpl) - m_sectionsNumber=setup.sections; - for (WORD k=0;kgetSetupFromID(config,setup)) { // throw (ComponentErrors::CDBAccessExImpl) + m_sectionsNumber=setup.sections; + for (WORD k=0;k diff --git a/Common/Servers/Skarab/src/SenderThread.cpp b/Common/Servers/Skarab/src/SenderThread.cpp index e7ab900c6..46e71cc0a 100644 --- a/Common/Servers/Skarab/src/SenderThread.cpp +++ b/Common/Servers/Skarab/src/SenderThread.cpp @@ -61,7 +61,6 @@ void CSenderThread::closeSocket() void CSenderThread::runLoop() { IRA::CError err; - int res; IRA::CSecAreaResourceWrapper cmd=m_commandLine->Get(); if (cmd->m_reiniting) { cmd->m_reiniting=false; diff --git a/Common/Servers/Skarab/src/SkarabImpl.cpp b/Common/Servers/Skarab/src/SkarabImpl.cpp index d015b2b03..992164439 100644 --- a/Common/Servers/Skarab/src/SkarabImpl.cpp +++ b/Common/Servers/Skarab/src/SkarabImpl.cpp @@ -30,258 +30,260 @@ using namespace SimpleParser; _IRA_LOGFILTER_DECLARE; SkarabImpl::SkarabImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices) : - BulkDataSenderDefaultImpl(CompName,containerServices), - m_ptime(this), - m_pbackendName(this), - m_pbandWidth(this), - m_pfrequency(this), - m_psampleRate(this), - m_pattenuation(this), - m_ppolarization(this), - m_pbins(this), - m_pinputsNumber(this), - m_pintegration(this), - m_pstatus(this), - m_pbusy(this), - m_pfeed(this), - m_ptsys(this), - m_psectionsNumber(this), - m_pinputSection(this) + BulkDataSenderDefaultImpl(CompName,containerServices), + m_ptime(this), + m_pbackendName(this), + m_pbandWidth(this), + m_pfrequency(this), + m_psampleRate(this), + m_pattenuation(this), + m_ppolarization(this), + m_pbins(this), + m_pinputsNumber(this), + m_pintegration(this), + m_pstatus(this), + m_pbusy(this), + m_pfeed(this), + m_ptsys(this), + m_psectionsNumber(this), + m_pinputSection(this) { - AUTO_TRACE("SkarabImpl::SkarabImpl"); - m_initialized=false; - m_senderThread=NULL; - m_controlThread=NULL; + AUTO_TRACE("SkarabImpl::SkarabImpl"); + m_initialized=false; + m_senderThread=NULL; + m_controlThread=NULL; } -SkarabImpl::~SkarabImpl() +SkarabImpl::~SkarabImpl() { - AUTO_TRACE("SkarabImpl::~SkarabImpl()"); - // if the initialization failed...clear everything as well. - // otherwise it is called by the cleanUp procedure. - if (!m_initialized) deleteAll(); + AUTO_TRACE("SkarabImpl::~SkarabImpl()"); + // if the initialization failed...clear everything as well. + // otherwise it is called by the cleanUp procedure. + if (!m_initialized) deleteAll(); } void SkarabImpl::initialize() throw (ACSErr::ACSbaseExImpl) { - CError Err; - CSenderThread::TSenderParameter threadPar; - CCommandLine* line; - //IRA::CString hostName,hostAddress; - AUTO_TRACE("SkarabImpl::initialize()"); - ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZING")); - ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"READING_CONFIGURATION")); - // could throw an ComponentErrors::CDBAccessExImpl exception - m_configuration.init(getContainerServices()); - ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"CONFIGURATION_OK")); - ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"INITIALIIZING_COMMUNICATION_LINES")); - _IRA_LOGFILTER_ACTIVATE(m_configuration.getRepetitionCacheTime(),m_configuration.getRepetitionExpireTime()); - try { - line=new CCommandLine(getContainerServices()); - m_commandLine=new CSecureArea(line); - } - catch (std::bad_alloc& ex) { - _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); - throw dummy; - } - try { - m_ptime=new ROuLongLong(getContainerServices()->getName()+":time",getComponent(), - new DevIOTime(m_commandLine),true); - m_pbackendName=new ROstring(getContainerServices()->getName()+":backendName",getComponent()); - m_pbandWidth=new ROdoubleSeq(getContainerServices()->getName()+":bandWidth",getComponent(), - new DevIOBandWidth(m_commandLine),true); - m_pfrequency=new ROdoubleSeq(getContainerServices()->getName()+":frequency",getComponent(), - new DevIOFrequency(m_commandLine),true); - m_psampleRate=new ROdoubleSeq(getContainerServices()->getName()+":sampleRate",getComponent(), - new DevIOSampleRate(m_commandLine),true); - m_pattenuation=new ROdoubleSeq(getContainerServices()->getName()+":attenuation",getComponent(), - new DevIOAttenuation(m_commandLine),true); - m_ppolarization=new ROlongSeq(getContainerServices()->getName()+":polarization",getComponent(), - new DevIOPolarization(m_commandLine),true); - m_pinputsNumber=new ROlong(getContainerServices()->getName()+":inputsNumber",getComponent(), - new DevIOInputsNumber(m_commandLine),true); - m_pbins=new ROlongSeq(getContainerServices()->getName()+":bins",getComponent(), - new DevIOBins(m_commandLine),true); - m_pintegration=new ROlong(getContainerServices()->getName()+":integration",getComponent(), - new DevIOIntegration(m_commandLine),false); - m_pstatus=new ROpattern(getContainerServices()->getName()+":status",getComponent(), - new DevIOStatus(m_commandLine),true); - m_pbusy=new ROEnumImpl - (getContainerServices()->getName()+":busy",getComponent(), new DevIOBusy(m_commandLine),true); - m_pfeed=new ROlongSeq(getContainerServices()->getName()+":feed",getComponent(),new DevIOFeed(m_commandLine),true); - m_ptsys=new ROdoubleSeq(getContainerServices()->getName()+":systemTemperature",getComponent(),new DevIOTsys(m_commandLine),true); - m_psectionsNumber=new ROlong(getContainerServices()->getName()+":sectionsNumber",getComponent(), - new DevIOSectionsNumber(m_commandLine),true); - m_pinputSection=new ROlongSeq(getContainerServices()->getName()+":inputSection",getComponent(),new DevIOInputSection(m_commandLine),true); - m_parser=new CParser(line,10); - } - catch (std::bad_alloc& ex) { - _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); - throw dummy; - } - // command parser configuration - m_parser->add("integration",new function1 >(line,&CCommandLine::setIntegration),1); - m_parser->add("calSwitch",new function1 >(line,&CCommandLine::activateCalSwitching),1 ); - m_parser->add("setSection", new function7,I,I,I,I >,I,I > - (line,&CCommandLine::setConfiguration),7 ); - m_parser->add("setAttenuation", new function2,I >(line,&CCommandLine::setAttenuation),2 ); - m_parser->add("enable",new function1 >(line,&CCommandLine::setEnabled),1 ); - m_parser->add("getIntegration",new function1 >(line,&CCommandLine::getIntegration),0 ); - m_parser->add("getFrequency",new function1 >(line,&CCommandLine::getFrequency),0 ); - m_parser->add("getSampleRate",new function1 >(line,&CCommandLine::getSampleRate),0 ); - m_parser->add("getBins",new function1 >(line,&CCommandLine::getBins),0 ); - m_parser->add("getPolarization",new function1 >(line,&CCommandLine::getPolarization),0 ); - m_parser->add("getBandWidth",new function1 >(line,&CCommandLine::getBandWidth),0 ); - m_parser->add("getAttenuation",new function1 >(line,&CCommandLine::getAttenuation),0 ); - m_parser->add("getTpi",new function1 >(line,&CCommandLine::getTpi),0 ); - m_parser->add("getZero",new function1 >(line,&CCommandLine::getZero),0 ); - m_parser->add("getTime",new function1 >(line,&CCommandLine::getTime),0 ); - m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); - m_parser->add("getRms",new function1 >(line,&CCommandLine::getRms),0 ); - m_parser->add("setTsysRange", new function2,I >(line,&CCommandLine::setTsysRange),2 ); - - threadPar.sender=this; - threadPar.command=m_commandLine; - threadPar.configuration=&m_configuration; - //threadPar.dataLine=&m_dataLine; - try { - CSenderThread::TSenderParameter *temp=&threadPar; - m_senderThread=getContainerServices()->getThreadManager()->create ( - "DATAPUSHER",temp,m_configuration.getSenderResponseTime()*10,m_configuration.getSenderSleepTime()*10); - m_controlThread=getContainerServices()->getThreadManager()->create * > ( - "SUPERVISOR",m_commandLine,m_configuration.getControlResponseTime()*10,m_configuration.getControlSleepTime()*10); - } - catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) { - _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SkarabImpl::initialize()"); - throw _dummy; - } - catch (...) { - _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SkarabImpl::initialize()"); - } - m_initialized=true; - ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZED")); + CError Err; + CSenderThread::TSenderParameter threadPar; + CCommandLine* line; + //IRA::CString hostName,hostAddress; + AUTO_TRACE("SkarabImpl::initialize()"); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZING")); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"READING_CONFIGURATION")); + // could throw an ComponentErrors::CDBAccessExImpl exception + m_configuration.init(getContainerServices()); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"CONFIGURATION_OK")); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"INITIALIIZING_COMMUNICATION_LINES")); + _IRA_LOGFILTER_ACTIVATE(m_configuration.getRepetitionCacheTime(),m_configuration.getRepetitionExpireTime()); + try { + line=new CCommandLine(getContainerServices()); + m_commandLine=new CSecureArea(line); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); + throw dummy; + } + try { + m_ptime=new ROuLongLong(getContainerServices()->getName()+":time",getComponent(), + new DevIOTime(m_commandLine),true); + m_pbackendName=new ROstring(getContainerServices()->getName()+":backendName",getComponent()); + m_pbandWidth=new ROdoubleSeq(getContainerServices()->getName()+":bandWidth",getComponent(), + new DevIOBandWidth(m_commandLine),true); + m_pfrequency=new ROdoubleSeq(getContainerServices()->getName()+":frequency",getComponent(), + new DevIOFrequency(m_commandLine),true); + m_psampleRate=new ROdoubleSeq(getContainerServices()->getName()+":sampleRate",getComponent(), + new DevIOSampleRate(m_commandLine),true); + m_pattenuation=new ROdoubleSeq(getContainerServices()->getName()+":attenuation",getComponent(), + new DevIOAttenuation(m_commandLine),true); + m_ppolarization=new ROlongSeq(getContainerServices()->getName()+":polarization",getComponent(), + new DevIOPolarization(m_commandLine),true); + m_pinputsNumber=new ROlong(getContainerServices()->getName()+":inputsNumber",getComponent(), + new DevIOInputsNumber(m_commandLine),true); + m_pbins=new ROlongSeq(getContainerServices()->getName()+":bins",getComponent(), + new DevIOBins(m_commandLine),true); + m_pintegration=new ROlong(getContainerServices()->getName()+":integration",getComponent(), + new DevIOIntegration(m_commandLine),false); + m_pstatus=new ROpattern(getContainerServices()->getName()+":status",getComponent(), + new DevIOStatus(m_commandLine),true); + m_pbusy=new ROEnumImpl + (getContainerServices()->getName()+":busy",getComponent(), new DevIOBusy(m_commandLine),true); + m_pfeed=new ROlongSeq(getContainerServices()->getName()+":feed",getComponent(),new DevIOFeed(m_commandLine),true); + m_ptsys=new ROdoubleSeq(getContainerServices()->getName()+":systemTemperature",getComponent(),new DevIOTsys(m_commandLine),true); + m_psectionsNumber=new ROlong(getContainerServices()->getName()+":sectionsNumber",getComponent(), + new DevIOSectionsNumber(m_commandLine),true); + m_pinputSection=new ROlongSeq(getContainerServices()->getName()+":inputSection",getComponent(),new DevIOInputSection(m_commandLine),true); + m_parser=new CParser(line,10); + } + catch (std::bad_alloc& ex) { + _EXCPT(ComponentErrors::MemoryAllocationExImpl,dummy,"SkarabImpl::initialize()"); + throw dummy; + } + // command parser configuration + m_parser->add("integration",new function1 >(line,&CCommandLine::setIntegration),1); + m_parser->add("calSwitch",new function1 >(line,&CCommandLine::activateCalSwitching),1 ); + m_parser->add("setSection", new function7,I,I,I,I >,I,I > + (line,&CCommandLine::setConfiguration),7 ); + m_parser->add("setAttenuation", new function2,I >(line,&CCommandLine::setAttenuation),2 ); + m_parser->add("enable",new function1 >(line,&CCommandLine::setEnabled),1 ); + m_parser->add("getIntegration",new function1 >(line,&CCommandLine::getIntegration),0 ); + m_parser->add("getFrequency",new function1 >(line,&CCommandLine::getFrequency),0 ); + m_parser->add("getSampleRate",new function1 >(line,&CCommandLine::getSampleRate),0 ); + m_parser->add("getBins",new function1 >(line,&CCommandLine::getBins),0 ); + m_parser->add("getPolarization",new function1 >(line,&CCommandLine::getPolarization),0 ); + m_parser->add("getBandWidth",new function1 >(line,&CCommandLine::getBandWidth),0 ); + m_parser->add("getAttenuation",new function1 >(line,&CCommandLine::getAttenuation),0 ); + m_parser->add("getTpi",new function1 >(line,&CCommandLine::getTpi),0 ); + m_parser->add("getZero",new function1 >(line,&CCommandLine::getZero),0 ); + m_parser->add("getTime",new function1 >(line,&CCommandLine::getTime),0 ); + m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); + m_parser->add("getRms",new function1 >(line,&CCommandLine::getRms),0 ); + m_parser->add("setTsysRange", new function2,I >(line,&CCommandLine::setTsysRange),2 ); + m_parser->add("backendPark", new function0(line,&CCommandLine::backendPark),0 ); + m_parser->add("setShift",new function1 >(line,&CCommandLine::setShift),1); + + threadPar.sender=this; + threadPar.command=m_commandLine; + threadPar.configuration=&m_configuration; + //threadPar.dataLine=&m_dataLine; + try { + CSenderThread::TSenderParameter *temp=&threadPar; + m_senderThread=getContainerServices()->getThreadManager()->create ( + "DATAPUSHER",temp,m_configuration.getSenderResponseTime()*10,m_configuration.getSenderSleepTime()*10); + m_controlThread=getContainerServices()->getThreadManager()->create * > ( + "SUPERVISOR",m_commandLine,m_configuration.getControlResponseTime()*10,m_configuration.getControlSleepTime()*10); + } + catch (acsthreadErrType::acsthreadErrTypeExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,_dummy,ex,"SkarabImpl::initialize()"); + throw _dummy; + } + catch (...) { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"SkarabImpl::initialize()"); + } + m_initialized=true; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZED")); } void SkarabImpl::execute() throw (ACSErr::ACSbaseExImpl) { - AUTO_TRACE("SkarabImpl::execute()"); - ACS::Time time; - IRA::CError error; - ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"BACKEND_INITIAL_CONFIGURATION")); - try { - //sets the property defaults....some of them cannot be changed any more (hardware dependent) - m_pbackendName->getDevIO()->write(getComponent()->getName(),time); - } - catch (ACSErr::ACSbaseExImpl& ex) { - _ADD_BACKTRACE(ComponentErrors::InitializationProblemExImpl,impl,ex,"SkarabImpl::execute()"); - throw impl; - } - CSecAreaResourceWrapper line=m_commandLine->Get(); - ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"SOCKET_CONNECTING")); - try { - ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"HARDWARE_INITIALIZATION")); - line->Init(&m_configuration); // this could throw an ACS exception..... - //line->setTime(); // this could throw ACS exceptions.... - } - catch (ACSErr::ACSbaseExImpl& ex) { - deleteAll(); - throw ex; - } - //resume the threads - //m_senderThread->resume(); - //m_controlThread->resume(); - try { - startPropertiesMonitoring(); - } - catch (acsthreadErrType::CanNotStartThreadExImpl& E) { - _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); - deleteAll(); - throw __dummy; - } - catch (ACSErrTypeCommon::NullPointerExImpl& E) { - _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); - deleteAll(); - throw __dummy; - } - ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"COMPSTATE_OPERATIONAL")); + AUTO_TRACE("SkarabImpl::execute()"); + ACS::Time time; + IRA::CError error; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"BACKEND_INITIAL_CONFIGURATION")); + try { + //sets the property defaults....some of them cannot be changed any more (hardware dependent) + m_pbackendName->getDevIO()->write(getComponent()->getName(),time); + } + catch (ACSErr::ACSbaseExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::InitializationProblemExImpl,impl,ex,"SkarabImpl::execute()"); + throw impl; + } + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"SOCKET_CONNECTING")); + try { + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"HARDWARE_INITIALIZATION")); + line->Init(&m_configuration); // this could throw an ACS exception..... + //line->setTime(); // this could throw ACS exceptions.... + } + catch (ACSErr::ACSbaseExImpl& ex) { + deleteAll(); + throw ex; + } + //resume the threads + //m_senderThread->resume(); + //m_controlThread->resume(); + try { + startPropertiesMonitoring(); + } + catch (acsthreadErrType::CanNotStartThreadExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); + deleteAll(); + throw __dummy; + } + catch (ACSErrTypeCommon::NullPointerExImpl& E) { + _ADD_BACKTRACE(ComponentErrors::ThreadErrorExImpl,__dummy,E,"SkarabImpl::execute"); + deleteAll(); + throw __dummy; + } + ACS_LOG(LM_FULL_INFO,"SkarabImpl::execute()",(LM_INFO,"COMPSTATE_OPERATIONAL")); } void SkarabImpl::deleteAll() { - IRA::CError err; - if (m_initialized) { - if (m_senderThread!=NULL) { - m_senderThread->suspend(); - } - if (m_controlThread!=NULL) { - m_controlThread->suspend(); - } - if (m_commandLine) { - delete m_commandLine; - m_commandLine=NULL; - } - if (m_senderThread!=NULL) { - getContainerServices()->getThreadManager()->destroy(m_senderThread); - m_senderThread=NULL; - } - if (m_controlThread!=NULL) { - getContainerServices()->getThreadManager()->destroy(m_controlThread); - m_senderThread=NULL; - } - if (m_parser) { - delete m_parser; - m_parser=NULL; - } - // need to be closed before the thread that makes use of it - // m_dataLine.Close(err); - // ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"DATA_LINE_CLOSED")); - _IRA_LOGFILTER_FLUSH; - _IRA_LOGFILTER_DESTROY; - ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"LOGS_FLUSHED")); - m_initialized=false; - } + IRA::CError err; + if (m_initialized) { + if (m_senderThread!=NULL) { + m_senderThread->suspend(); + } + if (m_controlThread!=NULL) { + m_controlThread->suspend(); + } + if (m_commandLine) { + delete m_commandLine; + m_commandLine=NULL; + } + if (m_senderThread!=NULL) { + getContainerServices()->getThreadManager()->destroy(m_senderThread); + m_senderThread=NULL; + } + if (m_controlThread!=NULL) { + getContainerServices()->getThreadManager()->destroy(m_controlThread); + m_senderThread=NULL; + } + if (m_parser) { + delete m_parser; + m_parser=NULL; + } + // need to be closed before the thread that makes use of it + // m_dataLine.Close(err); + // ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"DATA_LINE_CLOSED")); + _IRA_LOGFILTER_FLUSH; + _IRA_LOGFILTER_DESTROY; + ACS_LOG(LM_FULL_INFO,"SkarabImpl::deleteAll()",(LM_INFO,"LOGS_FLUSHED")); + m_initialized=false; + } } void SkarabImpl::cleanUp() { - AUTO_TRACE("SkarabImpl::cleanUp()"); - stopPropertiesMonitoring(); - deleteAll(); - CharacteristicComponentImpl::cleanUp(); + AUTO_TRACE("SkarabImpl::cleanUp()"); + stopPropertiesMonitoring(); + deleteAll(); + CharacteristicComponentImpl::cleanUp(); } void SkarabImpl::aboutToAbort() { - AUTO_TRACE("SkarabImpl::aboutToAbort()"); - deleteAll(); + AUTO_TRACE("SkarabImpl::aboutToAbort()"); + deleteAll(); } -void SkarabImpl::sendHeader() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, - ComponentErrors::ComponentErrorsEx) +void SkarabImpl::sendHeader() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) { - AUTO_TRACE("SkarabImpl::sendHeader()"); - Backends::TMainHeader header; - Backends::TSectionHeader chHeader[MAX_SECTION_NUMBER]; - //DWORD tpi[MAX_SECTION_NUMBER]; - CSecAreaResourceWrapper line=m_commandLine->Get(); - line->fillMainHeader(header); - line->fillChannelHeader(chHeader,MAX_SECTION_NUMBER); - /*try { - line->setTime(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::sendHeader()"); + Backends::TMainHeader header; + Backends::TSectionHeader chHeader[MAX_SECTION_NUMBER]; + //DWORD tpi[MAX_SECTION_NUMBER]; + CSecAreaResourceWrapper line=m_commandLine->Get(); + line->fillMainHeader(header); + line->fillChannelHeader(chHeader,MAX_SECTION_NUMBER); + /*try { + line->setTime(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } */ char buffer[sizeof(Backends::TMainHeader)+header.sections*sizeof(Backends::TSectionHeader)]; @@ -289,562 +291,608 @@ void SkarabImpl::sendHeader() throw (CORBA::SystemException, BackendsErrors::Bac memcpy(buffer,(void *)&header,sizeof(Backends::TMainHeader)); memcpy(buffer+sizeof(Backends::TMainHeader),(void *)chHeader,header.sections*sizeof(Backends::TSectionHeader)); - #ifndef BKD_DEBUG - try { - getSender()->startSend(FLOW_NUMBER,(const char*)buffer, - sizeof(Backends::TMainHeader)+header.sections*sizeof(Backends::TSectionHeader)); - } - catch (AVStartSendErrorExImpl& ex) { - _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendHeader()"); - impl.setDetails("main header could not be sent"); - impl.log(LM_DEBUG); - throw impl.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendHeader()"); - impl.log(LM_DEBUG); - throw impl.getComponentErrorsEx(); - } - #else - /*printf("Sects: %d beams: %d integration: %d sampleSize: %d\n",header.sections,header.beams, - header.integration,header.sampleSize); - for(int h=0;hsaveDataHeader(&header,chHeader); - // measure the zero tpi - #ifndef BKD_DEBUG - /*try { - //line->getZeroTPI(tpi); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - }*/ - #else - //for(int i=0;isaveZero(tpi); - // start the job for the backend..... - try { - line->startDataAcquisition(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + #ifndef BKD_DEBUG + try { + getSender()->startSend(FLOW_NUMBER,(const char*)buffer, + sizeof(Backends::TMainHeader)+header.sections*sizeof(Backends::TSectionHeader)); + } + catch (AVStartSendErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendHeader()"); + impl.setDetails("main header could not be sent"); + impl.log(LM_DEBUG); + throw impl.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendHeader()"); + impl.log(LM_DEBUG); + throw impl.getComponentErrorsEx(); + } + #else + /*printf("Sects: %d beams: %d integration: %d sampleSize: %d\n",header.sections,header.beams, + header.integration,header.sampleSize); + for(int h=0;hsaveDataHeader(&header,chHeader); + // measure the zero tpi + #ifndef BKD_DEBUG + /*try { + //line->getZeroTPI(tpi); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + }*/ + #else + //for(int i=0;isaveZero(tpi); + // start the job for the backend..... + try { + line->startDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendHeader()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::terminate() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, - ComponentErrors::ComponentErrorsEx) + ComponentErrors::ComponentErrorsEx) { - AUTO_TRACE("SkarabImpl::terminate()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->stopDataAcquisition(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::terminate()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::terminate()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->stopDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::terminate()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +void SkarabImpl::endSchedule() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, + ComponentErrors::ComponentErrorsEx) +{ + AUTO_TRACE("SkarabImpl::endSchedule()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->endSchedule(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::endSchedule()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::sendData(ACS::Time startTime) throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, - ComponentErrors::ComponentErrorsEx) + ComponentErrors::ComponentErrorsEx) { - AUTO_TRACE("SkarabImpl::sendData()"); - - TIMEVALUE now; - ACS::Time expectedStartTime; - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - expectedStartTime=line->resumeDataAcquisition(startTime); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendData()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } - // if the resume succeeds....than set the start time accordingly. - //I explicitly release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock - line.Release(); - m_senderThread->saveStartTime(expectedStartTime); - //m_senderThread->resumeTransfer(); + AUTO_TRACE("SkarabImpl::sendData()"); + + TIMEVALUE now; + ACS::Time expectedStartTime; + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + expectedStartTime=line->resumeDataAcquisition(startTime); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendData()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + // if the resume succeeds....than set the start time accordingly. + //I explicitly release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock + line.Release(); + m_senderThread->saveStartTime(expectedStartTime); + //m_senderThread->resumeTransfer(); } void SkarabImpl::sendStop() throw (CORBA::SystemException, BackendsErrors::BackendsErrorsEx, - ComponentErrors::ComponentErrorsEx) + ComponentErrors::ComponentErrorsEx) { - - AUTO_TRACE("SkarabImpl::sendStop()"); - - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->suspendDataAcquisition(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } - //I explicity release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock - //line.Release(); - //m_senderThread->suspendTransfer(); - - try { - getSender()->stopSend(FLOW_NUMBER); - } - catch (AVStopSendErrorExImpl& ex) { - _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendStop()"); - impl.setDetails("stop message could not be sent"); - throw impl.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendStop()"); - throw impl.getComponentErrorsEx(); - } + + AUTO_TRACE("SkarabImpl::sendStop()"); + + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->suspendDataAcquisition(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + //I explicity release the mutex before accessing the sender thread because it also make use of the command line...just to make sure to avoid deadlock + //line.Release(); + //m_senderThread->suspendTransfer(); + + try { + getSender()->stopSend(FLOW_NUMBER); + } + catch (AVStopSendErrorExImpl& ex) { + _ADD_BACKTRACE(BackendsErrors::TXErrorExImpl,impl,ex,"SkarabImpl::sendStop()"); + impl.setDetails("stop message could not be sent"); + throw impl.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,impl,"SkarabImpl::sendStop()"); + throw impl.getComponentErrorsEx(); + } try { - line->sendTargetFileName(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + line->sendTargetFileName(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::sendStop()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setSection(CORBA::Long input,CORBA::Double freq,CORBA::Double bw,CORBA::Long feed,CORBA::Long pol,CORBA::Double sr,CORBA::Long bins) throw ( - CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setSection()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setConfiguration(input,freq,bw,feed,pol,sr,bins); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setSection()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setSection()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setConfiguration(input,freq,bw,feed,pol,sr,bins); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setSection()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setTargetFileName (const char * fileName) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, - BackendsErrors::BackendsErrorsEx) + BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setTargetFileName()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); + AUTO_TRACE("SkarabImpl::setTargetFileName()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); - line->setTargetFileName(fileName); + line->setTargetFileName(fileName); } ACS::doubleSeq *SkarabImpl::getRms() throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::getRms()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - ACS::doubleSeq_var rms=new ACS::doubleSeq; - try { - line->getRms(rms); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getRms()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } - return rms._retn(); + AUTO_TRACE("SkarabImpl::getRms()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var rms=new ACS::doubleSeq; + try { + line->getRms(rms); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getRms()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return rms._retn(); } ACS::doubleSeq *SkarabImpl::getTpi() throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::getTpi()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - ACS::doubleSeq_var tpi=new ACS::doubleSeq; - try { - line->getSample(tpi,false); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getTpi()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } - return tpi._retn(); + AUTO_TRACE("SkarabImpl::getTpi()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var tpi=new ACS::doubleSeq; + try { + line->getSample(tpi,false); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getTpi()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return tpi._retn(); } ACS::doubleSeq * SkarabImpl::getZero () throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::getZero()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - ACS::doubleSeq_var tpi=new ACS::doubleSeq; + AUTO_TRACE("SkarabImpl::getZero()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + ACS::doubleSeq_var tpi=new ACS::doubleSeq; //TODO: how many sections???? //tpi->length(2); - try { - line->getSample(tpi,true); + try { + line->getSample(tpi,true); //tpi[0]=0.0; //tpi[1]=0.0; - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getZero()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } - return tpi._retn(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getZero()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } + return tpi._retn(); } void SkarabImpl::setKelvinCountsRatio(const ACS::doubleSeq& ratio, const ACS::doubleSeq& tsys) throw (CORBA::SystemException) { - AUTO_TRACE("SkarabImpl::setKelvinCountsRatio()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - line->saveTsys(tsys,ratio); - //if (m_senderThread) { - //m_senderThread->setKelvinCountsRatio(ratio); - //ACS_LOG(LM_FULL_INFO,"SkarabImpl::setKelvinCountsRatio()",(LM_INFO,"KELVIN_COUNTS_CONVERSION_FACTOR_SET")); - //} + AUTO_TRACE("SkarabImpl::setKelvinCountsRatio()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + line->saveTsys(tsys,ratio); + //if (m_senderThread) { + //m_senderThread->setKelvinCountsRatio(ratio); + //ACS_LOG(LM_FULL_INFO,"SkarabImpl::setKelvinCountsRatio()",(LM_INFO,"KELVIN_COUNTS_CONVERSION_FACTOR_SET")); + //} } void SkarabImpl::enableChannels(const ACS::longSeq& enable) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, - BackendsErrors::BackendsErrorsEx) + BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::enableChannels()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setEnabled(enable); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::enableChannels()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::enableChannels()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setEnabled(enable); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::enableChannels()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setTime() throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, - BackendsErrors::BackendsErrorsEx) + BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setTime()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setTime(); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTime()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setTime()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setTime(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTime()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setAttenuation(CORBA::Long input,CORBA::Double att) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setAttenutation()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setAttenuation(input,att); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setAttenutation()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setAttenutation()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setAttenuation(input,att); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setAttenutation()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setTsysRange(CORBA::Double freq,CORBA::Double bw) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setTsysRange()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setTsysRange(freq,bw); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTsysRange()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setTsysRange()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setTsysRange(freq,bw); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setTsysRange()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } CORBA::Long SkarabImpl::getInputs(ACS::doubleSeq_out freq,ACS::doubleSeq_out bandWidth,ACS::longSeq_out feed,ACS::longSeq_out ifNumber) throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - long inputs; - ACS::longSeq pol; - AUTO_TRACE("SkarabImpl::getInputs()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - //no need to take care of freeing allocated memory in case of exception because there are no except........ - freq=new ACS::doubleSeq; - bandWidth=new ACS::doubleSeq; - feed=new ACS::longSeq; - ifNumber=new ACS::longSeq; - line->getFeed(*feed); - line->getFrequency(*freq); - line->getInputsNumber(inputs); - line->getBandWidth(*bandWidth); - line->getIFs(*ifNumber); - return inputs; + long inputs; + ACS::longSeq pol; + AUTO_TRACE("SkarabImpl::getInputs()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + //no need to take care of freeing allocated memory in case of exception because there are no except........ + freq=new ACS::doubleSeq; + bandWidth=new ACS::doubleSeq; + feed=new ACS::longSeq; + ifNumber=new ACS::longSeq; + line->getFeed(*feed); + line->getFrequency(*freq); + line->getInputsNumber(inputs); + line->getBandWidth(*bandWidth); + line->getIFs(*ifNumber); + return inputs; } void SkarabImpl::activateNoiseCalibrationSwitching(CORBA::Long interleave) throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::activateNoiseCalibrationSwitching()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->activateCalSwitching(interleave); // NOT YET AVAILABLE - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::activateNoiseCalibrationSwitching()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::activateNoiseCalibrationSwitching()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->activateCalSwitching(interleave); // NOT YET AVAILABLE + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::activateNoiseCalibrationSwitching()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::initialize(const char * configuration) throw (CORBA::SystemException, - ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) + ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::initialize()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setup(configuration); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::initialize()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::initialize()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setup(configuration); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::initialize()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } void SkarabImpl::setIntegration(CORBA::Long Integration) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, - BackendsErrors::BackendsErrorsEx) + BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::setIntegration()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->setIntegration(Integration); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setIntegration()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setIntegration()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setIntegration(Integration); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setIntegration()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } -void SkarabImpl::getConfiguration (CORBA::String_out configuration) throw (CORBA::SystemException) +void SkarabImpl::setShift(CORBA::Long Shift) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx, + BackendsErrors::BackendsErrorsEx) { - AUTO_TRACE("SkarabImpl::getIntegration()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->getConfiguration(configuration); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getConfiguration()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::setShift()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + line->setShift(Shift); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::setShift()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } -void SkarabImpl::getCommProtVersion (CORBA::String_out version) throw (CORBA::SystemException) +char* SkarabImpl::getConfiguration() throw (CORBA::SystemException) { - AUTO_TRACE("SkarabImpl::getCommProtVersion()"); - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - line->getCommProtVersion(version); - } - catch (ComponentErrors::ComponentErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getComponentErrorsEx(); - } - catch (BackendsErrors::BackendsErrorsExImpl& ex) { - ex.log(LM_DEBUG); - throw ex.getBackendsErrorsEx(); - } - catch (...) { - _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getCommProtVersion()"); - dummy.log(LM_DEBUG); - throw dummy.getComponentErrorsEx(); - } + AUTO_TRACE("SkarabImpl::getIntegration()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + return line->getConfiguration(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getConfiguration()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } +} + +char* SkarabImpl::getCommProtVersion() throw (CORBA::SystemException) +{ + AUTO_TRACE("SkarabImpl::getCommProtVersion()"); + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + return line->getCommProtVersion(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (BackendsErrors::BackendsErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getBackendsErrorsEx(); + } + catch (...) { + _EXCPT(ComponentErrors::UnexpectedExImpl,dummy,"SkarabImpl::getCommProtVersion()"); + dummy.log(LM_DEBUG); + throw dummy.getComponentErrorsEx(); + } } CORBA::Boolean SkarabImpl::command(const char *cmd,CORBA::String_out answer) throw (CORBA::SystemException) { - AUTO_TRACE("SkarabImpl::command()"); - IRA::CString out; - bool res; - // this is a cheat....it forces the acquisition of the mutex before the parser. It works only because the parser has no async behaviour configured - CSecAreaResourceWrapper line=m_commandLine->Get(); - try { - m_parser->run(cmd,out); - res=true; - } - catch (ParserErrors::ParserErrorsExImpl &ex) { - res=false; - } - catch (ACSErr::ACSbaseExImpl& ex) { - ex.log(LM_ERROR); // the errors resulting from the execution are logged here as stated in the documentation of CommandInterpreter interface, while the parser errors are never logged. - res=false; - } - answer=CORBA::string_dup((const char *)out); - return res; + AUTO_TRACE("SkarabImpl::command()"); + IRA::CString out; + bool res; + // this is a cheat....it forces the acquisition of the mutex before the parser. It works only because the parser has no async behaviour configured + CSecAreaResourceWrapper line=m_commandLine->Get(); + try { + m_parser->run(cmd,out); + res=true; + } + catch (ParserErrors::ParserErrorsExImpl &ex) { + res=false; + } + catch (ACSErr::ACSbaseExImpl& ex) { + ex.log(LM_ERROR); // the errors resulting from the execution are logged here as stated in the documentation of CommandInterpreter interface, while the parser errors are never logged. + res=false; + } + answer=CORBA::string_dup((const char *)out); + return res; } _PROPERTY_REFERENCE_CPP(SkarabImpl,ACS::ROuLongLong,m_ptime,time); diff --git a/Common/Servers/TotalPower/include/CommandLine.h b/Common/Servers/TotalPower/include/CommandLine.h index 7fc1de104..0327a622a 100644 --- a/Common/Servers/TotalPower/include/CommandLine.h +++ b/Common/Servers/TotalPower/include/CommandLine.h @@ -427,6 +427,9 @@ public: */ void setAttenuation(const long&inputId, const double& attenuation) throw (BackendsErrors::BackendBusyExImpl,ComponentErrors::ValidationErrorExImpl,ComponentErrors::ValueOutofRangeExImpl,BackendsErrors::NakExImpl, ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,BackendsErrors::ConnectionExImpl); + + void backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); /** * Called by the component to fill the Backends::TMainHeader with the proper informations. diff --git a/Common/Servers/TotalPower/include/TotalPowerImpl.h b/Common/Servers/TotalPower/include/TotalPowerImpl.h index 10adb0b1a..8a76ef6dd 100644 --- a/Common/Servers/TotalPower/include/TotalPowerImpl.h +++ b/Common/Servers/TotalPower/include/TotalPowerImpl.h @@ -308,6 +308,8 @@ public: */ virtual void initialize(const char * configuration) throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + + virtual void endSchedule() throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx) {AUTO_TRACE("TotalPowerImpl::endSchedule()"); }; /** * Call this function in order to get a total power measure for each input channel. diff --git a/Common/Servers/TotalPower/src/CommandLine.cpp b/Common/Servers/TotalPower/src/CommandLine.cpp index 7ec0519e9..8b4979864 100644 --- a/Common/Servers/TotalPower/src/CommandLine.cpp +++ b/Common/Servers/TotalPower/src/CommandLine.cpp @@ -167,6 +167,12 @@ void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl } } +void CCommandLine::backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + ACS_LOG(LM_FULL_INFO,"CCommandLine::backendPark()",(LM_NOTICE,"backendPark")); +} + void CCommandLine::stopDataAcquisitionForced() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl) { diff --git a/Common/Servers/TotalPower/src/TotalPowerImpl.cpp b/Common/Servers/TotalPower/src/TotalPowerImpl.cpp index 5b2188e45..dadcbca5b 100644 --- a/Common/Servers/TotalPower/src/TotalPowerImpl.cpp +++ b/Common/Servers/TotalPower/src/TotalPowerImpl.cpp @@ -180,6 +180,7 @@ void TotalPowerImpl::initialize() throw (ACSErr::ACSbaseExImpl) m_parser->add("getZero",new function1 >(line,&CCommandLine::getZero),0 ); m_parser->add("getTime",new function1 >(line,&CCommandLine::getTime),0 ); m_parser->add("initialize",new function1 >(line,&CCommandLine::setup),1 ); + m_parser->add("backendPark", new function0(line,&CCommandLine::backendPark),0 ); threadPar.sender=this; threadPar.command=m_commandLine; diff --git a/Common/Servers/XBackend/include/CommandLine.h b/Common/Servers/XBackend/include/CommandLine.h index 6eecec808..4bfed5c02 100644 --- a/Common/Servers/XBackend/include/CommandLine.h +++ b/Common/Servers/XBackend/include/CommandLine.h @@ -358,6 +358,8 @@ public: BackendsErrors::ConnectionExImpl,ComponentErrors::SocketErrorExImpl,BackendsErrors::NakExImpl, BackendsErrors::MalformedAnswerExImpl,BackendsErrors::BackendBusyExImpl); + void backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl); /** * Called by the component to fill the Backends::TMainHeader with the proper informations. * @param bkd the stucture that contains the required information. diff --git a/Common/Servers/XBackend/include/XBackendsImpl.h b/Common/Servers/XBackend/include/XBackendsImpl.h index deb87ccec..848a31c93 100644 --- a/Common/Servers/XBackend/include/XBackendsImpl.h +++ b/Common/Servers/XBackend/include/XBackendsImpl.h @@ -322,6 +322,7 @@ public: */ virtual void initialize(const char * configuration) throw (CORBA::SystemException,ComponentErrors::ComponentErrorsEx,BackendsErrors::BackendsErrorsEx); + virtual void endSchedule() throw (CORBA::SystemException, ComponentErrors::ComponentErrorsEx, BackendsErrors::BackendsErrorsEx) {AUTO_TRACE("TotalPowerImpl::endSchedule()"); }; /** * @thorw CORBA::SystemException diff --git a/Common/Servers/XBackend/src/CommandLine.cpp b/Common/Servers/XBackend/src/CommandLine.cpp index 0aaa23af8..60afc5e00 100644 --- a/Common/Servers/XBackend/src/CommandLine.cpp +++ b/Common/Servers/XBackend/src/CommandLine.cpp @@ -99,6 +99,12 @@ void CCommandLine::stopDataAcquisition() throw (BackendsErrors::ConnectionExImpl m_busy=false; } +void CCommandLine::backendPark() throw (BackendsErrors::ConnectionExImpl,BackendsErrors::NakExImpl, + ComponentErrors::SocketErrorExImpl,ComponentErrors::TimeoutExImpl,ComponentErrors::NotAllowedExImpl,BackendsErrors::BackendFailExImpl) +{ + ACS_LOG(LM_FULL_INFO,"CCommandLine::backendPark()",(LM_NOTICE,"backendPark")); +} + void CCommandLine::startDataAcquisition() throw (BackendsErrors::BackendBusyExImpl,BackendsErrors::ConnectionExImpl,XBackendsErrors::NoSettingExImpl) { diff --git a/Common/Servers/XBackend/src/XBackendsImpl.cpp b/Common/Servers/XBackend/src/XBackendsImpl.cpp index c47c82c43..5c796540a 100644 --- a/Common/Servers/XBackend/src/XBackendsImpl.cpp +++ b/Common/Servers/XBackend/src/XBackendsImpl.cpp @@ -167,6 +167,7 @@ void XBackendsImpl::initialize() m_parser->add("getAttenuation",new function1 >(commandL,&CCommandLine::getAttenuation),0 ); m_parser->add("getTime",new function1 >(commandL,&CCommandLine::getTime),0 ); m_parser->add("initialize",new function1 >(commandL,&CCommandLine::setup),1 ); + m_parser->add("backendPark", new function0(commandL,&CCommandLine::backendPark),0 ); m_initialized=true; ACS_LOG(LM_FULL_INFO,"XBackendsImpl::initialize()",(LM_INFO,"COMPSTATE_INITIALIZED")); diff --git a/SRT/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml b/SRT/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..80b544670 --- /dev/null +++ b/SRT/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,17 @@ + + + diff --git a/SRT/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml b/SRT/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml new file mode 100644 index 000000000..2b6f79973 --- /dev/null +++ b/SRT/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/SRT/CDB/alma/BACKENDS/Skarab/Skarab.xml b/SRT/CDB/alma/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..e7d02a72c --- /dev/null +++ b/SRT/CDB/alma/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,45 @@ + + + + diff --git a/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml b/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml index f083165cb..61e8f1698 100755 --- a/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml +++ b/SRT/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml @@ -7,5 +7,6 @@ DBBC60 DFB70 +SKARAB80 diff --git a/SRT/CDB/alma/DataBlock/Skarab/Skarab.xml b/SRT/CDB/alma/DataBlock/Skarab/Skarab.xml new file mode 100644 index 000000000..ab460fb64 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/Skarab/Skarab.xml @@ -0,0 +1,158 @@ + + + + + + SKARAB_1 + 2 + TRUE + GREGORIAN + 1 + 1400.0 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 2048 + + + + SKARAB_1S + 2 + TRUE + GREGORIAN + 1 + 1400.0 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 2048 + + + + SKARAB_2 + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 32768 + + + + SKARAB_2S + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 32768 + + + + SKARAB_3 + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 65536 + + + + SKARAB_3S + 2 + TRUE + GREGORIAN + 1 + 187.5 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 65536 + + + + SKARAB_4 + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 32768 + + + + SKARAB_4S + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 32768 + + + + SKARAB_5 + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 + L R + 0 0 + 0 1 + 65536 + + + + SKARAB_5S + 2 + TRUE + GREGORIAN + 1 + 93.75 + 7.0 + 0 1 2 3 + S S + 0 0 + 0 1 + 65536 + + + diff --git a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index e93c54bcc..aae9d9ce2 100644 --- a/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -142,6 +142,7 @@ servoPark asPark receiversPark + backendPark wait=1 antennaPark logMessage=Telescope is now parked diff --git a/SRT/Configuration/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml b/SRT/Configuration/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..80b544670 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Components/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,17 @@ + + + diff --git a/SRT/Configuration/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml b/SRT/Configuration/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml new file mode 100644 index 000000000..30af95bb8 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Containers/SkarabContainer/SkarabContainer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/BACKENDS/Skarab/Skarab.xml b/SRT/Configuration/CDB/alma/BACKENDS/Skarab/Skarab.xml new file mode 100644 index 000000000..d5113f155 --- /dev/null +++ b/SRT/Configuration/CDB/alma/BACKENDS/Skarab/Skarab.xml @@ -0,0 +1,45 @@ + + + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/Equipment/Equipment.xml b/SRT/Configuration/CDB/alma/DataBlock/Equipment/Equipment.xml index 4e1342187..b5c9923a2 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/Equipment/Equipment.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/Equipment/Equipment.xml @@ -24,5 +24,6 @@ + diff --git a/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml b/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml index f083165cb..61e8f1698 100755 --- a/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/PyCalmux/Mapping/Mapping.xml @@ -7,5 +7,6 @@ DBBC60 DFB70 +SKARAB80 diff --git a/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml b/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml index 8f3f05847..f57ce8009 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/Sardara/Sardara.xml @@ -7,12 +7,12 @@ SK00 - 2 + 2 TRUE GREGORIAN 1 - 1500.0 - 7.0 + 1500.0 + 7.0 0 1 L R 0 0 @@ -20,14 +20,74 @@ 1024 + + SK01 + 4 + TRUE + GREGORIAN + 2 + 1500.0 + 7.0 + 0 1 2 3 + L R L R + 0 0 1 1 + 0 1 0 1 + 1024 + + + + SK04 + 4 + TRUE + GREGORIAN + 2 + 1500.0 + 7.0 + 0 1 2 3 + L R L R + 0 0 4 4 + 0 1 0 1 + 1024 + + + + SK03 + 4 + TRUE + GREGORIAN + 2 + 1500.0 + 7.0 + 0 1 2 3 + L R L R + 0 0 3 3 + 0 1 0 1 + 1024 + + + + SK06 + 4 + TRUE + GREGORIAN + 2 + 1500.0 + 7.0 + 0 1 2 3 + L R L R + 0 0 6 6 + 0 1 0 1 + 1024 + + SK77 14 TRUE GREGORIAN 7 - 1500.0 - 7.0 + 1500.0 + 7.0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 L R L R L R L R L R L R L R 0 0 1 1 2 2 3 3 4 4 5 5 6 6 @@ -37,61 +97,61 @@ SCC00 - 2 - TRUE - BWG - 1 - 1500.0 - 9.0 - 0 1 - L R - 0 0 - 0 1 + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 + 0 1 + L R + 0 0 + 0 1 1024 SCH00 - 2 - TRUE - BWG - 1 - 1500.0 - 9.0 - 0 1 - L R - 0 0 - 0 1 + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 + 0 1 + L R + 0 0 + 0 1 1024 SL00 - 2 - TRUE - PRIMARY - 1 - 1500.0 - 10.0 - 2 3 - L R - 0 0 - 0 1 + 2 + TRUE + PRIMARY + 1 + 1500.0 + 10.0 + 2 3 + L R + 0 0 + 0 1 1024 SP00 - 2 - TRUE - PRIMARY - 1 - 500.0 - 10.0 - 0 1 - L R - 0 0 - 0 1 + 2 + TRUE + PRIMARY + 1 + 500.0 + 10.0 + 0 1 + L R + 0 0 + 0 1 1024 @@ -101,8 +161,8 @@ TRUE GREGORIAN 1 - 1500.0 - 7.0 + 1500.0 + 7.0 0 1 2 3 S S 0 0 @@ -116,8 +176,8 @@ TRUE GREGORIAN 7 - 1500.0 - 7.0 + 1500.0 + 7.0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S S S S S S S S S S S S S S 0 0 1 1 2 2 3 3 4 4 5 5 6 6 @@ -127,61 +187,61 @@ SCC00S - 2 - TRUE - BWG - 1 - 1500.0 - 9.0 - 0 1 - S S - 0 0 - 0 1 + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 + 0 1 + S S + 0 0 + 0 1 1024 SCH00S - 2 - TRUE - BWG - 1 - 1500.0 - 9.0 - 0 1 - S S - 0 0 - 0 1 + 2 + TRUE + BWG + 1 + 1500.0 + 9.0 + 0 1 + S S + 0 0 + 0 1 1024 SL00S - 2 - TRUE - PRIMARY - 1 - 1500.0 - 10.0 - 2 3 - S S - 0 0 - 0 1 + 2 + TRUE + PRIMARY + 1 + 1500.0 + 10.0 + 2 3 + S S + 0 0 + 0 1 1024 SP00S - 2 - TRUE - PRIMARY - 1 - 500.0 - 10.0 - 0 1 - S S - 0 0 - 0 1 + 2 + TRUE + PRIMARY + 1 + 500.0 + 10.0 + 0 1 + S S + 0 0 + 0 1 1024 diff --git a/SRT/Configuration/CDB/alma/DataBlock/Skarab/Skarab.xml b/SRT/Configuration/CDB/alma/DataBlock/Skarab/Skarab.xml new file mode 100644 index 000000000..3b7d4a6f0 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/Skarab/Skarab.xml @@ -0,0 +1,233 @@ + + + + + + SKARAB_1 + 14 + TRUE + GREGORIAN + 7 + 1400.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 2048 + + + + SKARAB_1S + 14 + TRUE + GREGORIAN + 7 + 1400.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 2048 + + + + SKARAB_2 + 14 + TRUE + GREGORIAN + 7 + 187.5 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 32768 + + + + SKARAB_2S + 14 + TRUE + GREGORIAN + 7 + 187.5 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 32768 + + + + SKARAB_3 + 14 + TRUE + GREGORIAN + 7 + 187.5 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 65536 + + + + SKARAB_3S + 14 + TRUE + GREGORIAN + 7 + 187.5 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 65536 + + + + SKARAB_4 + 14 + TRUE + GREGORIAN + 7 + 93.75 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 32768 + + + + SKARAB_4S + 14 + TRUE + GREGORIAN + 7 + 93.75 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 32768 + + + + SKARAB_5 + 14 + TRUE + GREGORIAN + 7 + 93.75 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 65536 + + + + SKARAB_5S + 14 + TRUE + GREGORIAN + 7 + 93.75 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 65536 + + + + SKARAB_7 + 14 + TRUE + GREGORIAN + 7 + 16.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 65536 + + + + SKARAB_11 + 14 + TRUE + GREGORIAN + 7 + 375.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 1024 + + + + SKARAB_11S + 14 + TRUE + GREGORIAN + 7 + 375.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 1024 + + + + SKARAB_12 + 14 + TRUE + GREGORIAN + 7 + 750.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + L R L R L R L R L R L R L R + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 8192 + + + + SKARAB_12S + 14 + TRUE + GREGORIAN + 7 + 750.0 + 7.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 + S S S S S S S S S S S S S S + 0 0 1 1 2 2 3 3 4 4 5 5 6 6 + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 + 8192 + + + diff --git a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index e93c54bcc..aae9d9ce2 100644 --- a/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/SRT/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -142,6 +142,7 @@ servoPark asPark receiversPark + backendPark wait=1 antennaPark logMessage=Telescope is now parked diff --git a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml index 29c8a78a6..d6a3d5e8b 100644 --- a/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/discosStartup.xml @@ -14,7 +14,7 @@ - + @@ -64,7 +64,7 @@ MASTERHOST discos - + LocalOscillatorCContainer py @@ -164,7 +164,7 @@ discos - SRT7GHzContainer + SkarabContainer cpp true @@ -173,7 +173,7 @@ discos - SRT5GHzContainer + SRT7GHzContainer cpp true @@ -182,7 +182,7 @@ discos - SRTKBandContainer + SRT5GHzContainer cpp true @@ -191,7 +191,7 @@ discos - SRTLPBandContainer + SRTKBandContainer cpp true @@ -199,17 +199,17 @@ MASTERHOST discos - - TotalPowerContainer + - WeatherStationContainer + TotalPowerContainer cpp true @@ -218,7 +218,7 @@ discos - XContainer + WeatherStationContainer cpp true diff --git a/SystemMake/Makefile b/SystemMake/Makefile index 2dca9aea0..bede02f70 100644 --- a/SystemMake/Makefile +++ b/SystemMake/Makefile @@ -34,9 +34,9 @@ COMMON_LIBRARIES:=SlaLibrary IRALibrary DiscosVersion TextWindowLibrary ParserLi DiscosBackendProtocol PyTestingLibrary \ COMMON_SERVERS:=AntennaBoss Observatory OTF PointingModel Refraction SkySource \ Moon FitsWriter Scheduler ReceiversBoss ExternalClients \ - CalibrationTool TotalPower NoiseGenerator CustomLogger \ - XBackend PyDewarPositioner Sardara PyLocalOscillator MFKBandBaseReceiver PyCalmux \ - ActiveSurfaceLan ActiveSurfaceUSD + CalibrationTool TotalPower CustomLogger \ + PyDewarPositioner Sardara Skarab PyLocalOscillator MFKBandBaseReceiver PyCalmux \ + ActiveSurfaceLan ActiveSurfaceUSD XBackend COMMON_CLIENTS:=AntennaBossTextClient ObservatoryTextClient \ GenericBackendTextClient ReceiversBossTextClient \ SystemTerminal CaltoolClient CustomLoggingClient \ @@ -77,32 +77,32 @@ ifeq ($(STATION),SRT) #Add all modules included in the SRT system in this sequence #Doc, (Errors, Interfacies, Libraries, Servers, Clients, Misc) MODULES:=SRTDox \ - ClientErrors ComponentErrors AntennaErrors ParserErrors BackendsErrors ManagementErrors ReceiversErrors MetrologyErrors MinorServoErrors XBackendErrors \ + ClientErrors ComponentErrors AntennaErrors ParserErrors BackendsErrors ManagementErrors ReceiversErrors MetrologyErrors MinorServoErrors \ ActiveSurfaceErrors \ - CommonInterface ManagmentInterface AntennaInterface ReceiversInterface BackendsInterface MinorServoInterface WeatherStationInterface ActiveSurfaceInterface XBackendInterface \ + CommonInterface ManagmentInterface AntennaInterface ReceiversInterface BackendsInterface MinorServoInterface WeatherStationInterface ActiveSurfaceInterface \ SRTAntennaInterface SRTActiveSurfaceInterface SRTWeatherStationInterface SRTReceiversInterface \ SlaLibrary IRALibrary TextWindowLibrary ParserLibrary XarcosLibrary SRTMinorServoLibrary ComponentProxy ModbusChannel PyTestingLibrary \ - AntennaBoss Observatory OTF PointingModel Refraction SkySource Moon FitsWriter Scheduler ReceiversBoss ExternalClients CalibrationTool TotalPower NoiseGenerator DBBC CustomLogger XBackend \ + AntennaBoss Observatory OTF PointingModel Refraction SkySource Moon FitsWriter Scheduler ReceiversBoss ExternalClients CalibrationTool TotalPower CustomLogger \ SRTMount SRTActiveSurfaceBoss SRTMinorServo SRTKBandMFReceiver SRTWeatherStation SRT7GHzReceiver SRTLPBandReceiver \ SRT5GHzReceiver PyDewarPositioner \ SRTPyIFDistributor AntennaBossTextClient ObservatoryTextClient GenericBackendTextClient ReceiversBossTextClient SystemTerminal CaltoolClient CustomLoggingClient SchedulerTextClient \ SRTActiveSurfaceGUIClient SRTMountTextClient MinorServoBossTextClient \ - Plotter KStars SRTScripts + Plotter KStars SRTScripts IDL_DOC:=Managment Antenna Backends SRTActiveSurface WeatherStation CPP_DOC:=Libraries AntennaImplementation SRTActiveSurfaceImplementation BackendsImplementation ReceiversImplementation WeatherStationImplementation MinorServoImplementation Managment_MODULES:=ManagmentInterface Antenna_MODULES:=AntennaInterface SRTAntennaInterface - Backends_MODULES:=BackendsInterface XBackendInterface + Backends_MODULES:=BackendsInterface WeatherStation_MODULES:=WeatherStationInterface SRTWeatherStationInterface Receivers_MODULES:=ReceiversInterface MinorServo_MODULES:=MinorServoInterface SRTActiveSurface_MODULES:=SRTActiveSurfaceInterface - Libraries_MODULES:=IRALibrary SlaLibrary TextWindowLibrary ParserLibrary XarcosLibrary SRTMinorServoLibrary PyTestingLibrary + Libraries_MODULES:=IRALibrary SlaLibrary TextWindowLibrary ParserLibrary SRTMinorServoLibrary PyTestingLibrary AntennaImplementation_MODULES:=Observatory SkySource OTF Moon PointingModel Refraction AntennaBoss SRTMount ManagementImplementation_MODULES:=Scheduler CalibrationTool FitsWriter ExternalClients - BackendsImplementation_MODULES:=TotalPower NoiseGenerator XBackend + BackendsImplementation_MODULES:=TotalPower ReceiversImplementation_MODULES:=ReceiversBoss SRTKBandMFReceiver SRT7GHzReceiver SRTLPBandReceiver WeatherStationImplementation_MODULES:=SRTWeatherStation SRTActiveSurfaceImplementation_MODULES:=SRTActiveSurfaceBoss @@ -121,10 +121,10 @@ ifeq ($(STATION),Medicina) SlaLibrary IRALibrary TextWindowLibrary ParserLibrary ComponentProxy ModbusChannel XarcosLibrary \ PyTestingLibrary MedicinaVertexLibrary \ AntennaBoss Observatory OTF PointingModel Refraction SkySource Moon FitsWriter Scheduler ReceiversBoss ExternalClients CalibrationTool \ - TotalPower NoiseGenerator MedicinaMount MedicinaPyLocalOscillator MedicinaPyDMed CustomLogger XBackend MedicinaMinorServo MedicinaActiveSurfaceBoss \ + TotalPower MedicinaMount MedicinaPyLocalOscillator MedicinaPyDMed CustomLogger MedicinaMinorServo MedicinaActiveSurfaceBoss \ AntennaBossTextClient ObservatoryTextClient GenericBackendTextClient ReceiversBossTextClient SystemTerminal CaltoolClient SchedulerTextClient MinorServoBossTextClient\ MedicinaActiveSurfaceGUIClient MedicinaMountTextClient CustomLoggingClient\ - Plotter KStars Scripts MedScripts + Plotter KStars Scripts MedScripts XBackend IDL_DOC:=Managment Antenna Backends WeatherStation Receivers CPP_DOC:=Libraries AntennaImplementation ManagementImplementation BackendsImplementation WeatherStationImplementation @@ -137,7 +137,7 @@ ifeq ($(STATION),Medicina) Libraries_MODULES:=IRALibrary SlaLibrary TextWindowLibrary ParserLibrary PyTestingLibrary AntennaImplementation_MODULES:=Observatory SkySource OTF Moon PointingModel Refraction AntennaBoss MedicinaMount ManagementImplementation_MODULES:=Scheduler CalibrationTool FitsWriter ExternalClients - BackendsImplementation_MODULES:=TotalPower NoiseGenerator XBackend + BackendsImplementation_MODULES:=TotalPower XBackend ReceiversImplementation_MODULES:=ReceiversBoss WeatherStationImplementation_MODULES:=MedWeatherStation Metrology MedicinaActiveSurfaceImplementation_MODULES:=MedicinaActiveSurfaceBoss -- GitLab From 864f5afad6896c5e54dea0e75bbfdb24d6bdb386 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 Jan 2025 10:12:12 +0000 Subject: [PATCH 127/150] Added MinorServos CABINET GFR configuration --- .../MinorServo/GFR/LookupTables/LookupTables.xml | 2 ++ .../include/SRTMinorServoContainers.h | 11 ++++++----- .../config/CDB/schemas/SRTMinorServoLookupTable.xsd | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml index 9481f7890..c8cb3564c 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml @@ -23,6 +23,8 @@ ROTATION -51.821170 ROTATION -51.821170 + ROTATION 40 + diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index 3c5446638..cae77edb3 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -79,11 +79,11 @@ namespace MinorServo using DiscosConfigurationNameTableType = std::map>; const DiscosConfigurationNameTableType DiscosConfigurationNameTable = { - {"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + //{"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + //{"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + //{"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + //{"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, + //{"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, @@ -92,6 +92,7 @@ namespace MinorServo {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, + {"CABINET", std::make_pair(CONFIGURATION_GREGORIAN7, false)}, }; /** diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd index 858936df2..4470ec709 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd @@ -44,6 +44,7 @@ + -- GitLab From fc2c1f1b26e8290a1c5e684ca914a4d84d66d0e7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 10 Jan 2025 10:20:35 +0000 Subject: [PATCH 128/150] Bypassed gregorian cover closing when parking the minor servos --- SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp | 5 +++-- SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 7c50b8cca..e89051753 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -357,7 +357,8 @@ void SRTMinorServoBossCore::park() m_current_servos.clear(); m_current_tracking_servos.clear(); - try + // Skipping this because of the cover not always engaging the limit switch + /*try { // Send the STOW command to close the gregorian cover if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::stow("GREGORIAN_CAP", COVER_STATUS_CLOSED)).checkOutput()) @@ -376,7 +377,7 @@ void SRTMinorServoBossCore::park() ex.setReason("Error while sending the STOW command to the gregorian cover."); ex.log(LM_DEBUG); throw ex.getParkingErrorEx(); - } + }*/ // Send the STOP command to all the servos for(const auto& [servo_name, servo] : m_servos) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index f13092fb3..2e6dff7e2 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -60,7 +60,9 @@ void SRTMinorServoParkThread::runLoop() case 0: { // First we check if the gregorian cover has closed - bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED; + // TEMPORARY: we skip the gregorian cover closing, therefore we don't check + //bool completed = m_core.m_status.getGregorianCoverPosition() == COVER_STATUS_CLOSED; + bool completed = true; // Then we cycle through all the servos and make sure their operative mode is STOP if(completed && std::all_of(m_core.m_servos.begin(), m_core.m_servos.end(), [](const std::pair& servo) -> bool -- GitLab From d73457062ca7e0e41867bafb1b48d04ae0d25874 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Sun, 12 Jan 2025 18:30:46 +0000 Subject: [PATCH 129/150] Some minor AS GUI updates --- .../src/SRTActiveSurfaceCore.cpp | 5 +++++ .../src/SRTActiveSurfaceGUIui.cpp | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp index d33ae2c26..fcc38d7a4 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp @@ -361,6 +361,11 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) else { active = false; statusColor = true; + ActuatorStatusRunLabelCode = -1; + ActuatorStatusEnblLabelCode = -1; + ActuatorStatusCammLabelCode = 0; + ActuatorStatusLoopLabelCode = 0; + ActuatorStatusCalLabelCode = 0; } emit setGUIActuatorStatusLabels(); emit setGUIActuatorColor(circle, actuator, active, statusColor, false); diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp index b672cbfb5..42e1e878f 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp @@ -740,6 +740,9 @@ void SRTActiveSurfaceGUI::changeGUIActuatorStatusLabels() ActuatorStatusCammLabel->clear(); switch (mySRTActiveSurfaceCore.ActuatorStatusCammLabelCode) { + case (0): + ActuatorStatusCammLabel->setText(""); + break; case (-1): ActuatorStatusCammLabel->setText("NO CAMM"); break; @@ -750,6 +753,9 @@ void SRTActiveSurfaceGUI::changeGUIActuatorStatusLabels() ActuatorStatusLoopLabel->clear(); switch (mySRTActiveSurfaceCore.ActuatorStatusLoopLabelCode) { + case (0): + ActuatorStatusLoopLabel->setText(""); + break; case (-1): ActuatorStatusLoopLabel->setText("NO LOOP"); break; @@ -760,6 +766,9 @@ void SRTActiveSurfaceGUI::changeGUIActuatorStatusLabels() ActuatorStatusCalLabel->clear(); switch (mySRTActiveSurfaceCore.ActuatorStatusCalLabelCode) { + case (0): + ActuatorStatusCalLabel->setText(""); + break; case (-1): ActuatorStatusCalLabel->setText("UNCALIBRATED"); break; -- GitLab From 6183b98d26cf015c0fd4498cb24c4e3437df5f3a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 15 Jan 2025 10:43:24 +0000 Subject: [PATCH 130/150] Added LUT filename to SRT AS Boss and GUI --- SRT/CDB/alma/AS/Boss/Boss.xml | 3 +- .../include/SRTActiveSurfaceCore.h | 1 + .../include/SRTActiveSurfaceGUIui.h | 1 + .../src/SRTActiveSurfaceCore.cpp | 17 +- .../src/SRTActiveSurfaceGUI.ui | 177 ++++++++++-------- .../src/SRTActiveSurfaceGUIui.cpp | 9 + SRT/Configuration/CDB/alma/AS/Boss/Boss.xml | 1 + .../CDB/schemas/SRTActiveSurfaceBoss.xsd | 1 + .../idl/SRTActiveSurfaceBoss.midl | 5 + .../SRTActiveSurfaceBoss/include/DevIOLUT.h | 56 ++++++ .../include/SRTActiveSurfaceBossCore.h | 2 + .../include/SRTActiveSurfaceBossImpl.h | 7 + .../src/SRTActiveSurfaceBossCore.cpp | 4 +- .../src/SRTActiveSurfaceBossImpl.cpp | 4 + 14 files changed, 196 insertions(+), 92 deletions(-) create mode 100644 SRT/Servers/SRTActiveSurfaceBoss/include/DevIOLUT.h diff --git a/SRT/CDB/alma/AS/Boss/Boss.xml b/SRT/CDB/alma/AS/Boss/Boss.xml index d2fdada51..0439cefcd 100644 --- a/SRT/CDB/alma/AS/Boss/Boss.xml +++ b/SRT/CDB/alma/AS/Boss/Boss.xml @@ -9,4 +9,5 @@ - \ No newline at end of file + + diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h index fb9586a1d..47fd52762 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceCore.h @@ -82,6 +82,7 @@ class SRTActiveSurfaceCore : public QThread int setGUIActuatorStatusLabels(); int setGUIasStatusCode(int); int setGUIasProfileCode(int); + int setGUIasLUTFileName(QString); private: ActiveSurface::SRTActiveSurfaceBoss_var tASBoss; diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h index 1a6f57b2c..66c398444 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUIui.h @@ -54,6 +54,7 @@ class SRTActiveSurfaceGUI : public QWidget, public Ui_SRTActiveSurfaceGUI void changeGUIActuatorStatusLabels(); void changeGUIasStatusCode(int); void changeGUIasProfileCode(int); + void changeGUIasLUTFileName(QString); private: SRTActiveSurfaceCore mySRTActiveSurfaceCore; diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp index fcc38d7a4..f3a3b578b 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceCore.cpp @@ -59,6 +59,7 @@ void SRTActiveSurfaceCore::run(void) Management::ROTSystemStatus_var bossStatus_var; ActiveSurface::ROTASProfile_var asProfile_var; + ACS::ROstring_var asLUTFileName_var; while (monitor == true) { @@ -72,6 +73,9 @@ void SRTActiveSurfaceCore::run(void) asProfile_var = tASBoss->pprofile(); emit setGUIasProfileCode((int)asProfile_var->get_sync(completion.out())); + asLUTFileName_var = tASBoss->LUT_filename(); + emit setGUIasLUTFileName(QString(asLUTFileName_var->get_sync(completion.out()))); + ACS::longSeq_var asStatus; tASBoss->asStatus4GUIClient(asStatus); @@ -218,7 +222,8 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) impl.log(); } - if (active == true) { + if (active == true) + { //if ((status & ENBL) == 0) { /*qApp->lock(); tGUI->ActuatorStatusEnblLabel->clear(); @@ -293,7 +298,8 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) //tGUI->ActuatorStatusRunLabel->clear(); //tGUI->ActuatorStatusRunLabel->setText("RUNNING"); } - if ((status & ENBL) == 0) { + ActuatorStatusEnblLabelCode = 1; + /*if ((status & ENBL) == 0) { ActuatorStatusEnblLabelCode = -1; //tGUI->ActuatorStatusEnblLabel->clear(); //tGUI->ActuatorStatusEnblLabel->setText("UNABLED"); @@ -302,7 +308,7 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) ActuatorStatusEnblLabelCode = 1; //tGUI->ActuatorStatusEnblLabel->clear(); //tGUI->ActuatorStatusEnblLabel->setText("ENABLED"); - } + }*/ if ((status & CAMM) == 0) { ActuatorStatusCammLabelCode = -1; //tGUI->ActuatorStatusCammLabel->clear(); @@ -323,7 +329,8 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) //tGUI->ActuatorStatusLoopLabel->clear(); //tGUI->ActuatorStatusLoopLabel->setText("LOOP"); } - if ((status & CAL) == 0) { + if ((status & CAL) == 0) + { ActuatorStatusCalLabelCode = -1; statusColor = true; //tGUI->ActuatorStatusCalLabel->clear(); @@ -361,7 +368,7 @@ void SRTActiveSurfaceCore::setactuator(int circle, int actuator) else { active = false; statusColor = true; - ActuatorStatusRunLabelCode = -1; + ActuatorStatusRunLabelCode = 0; ActuatorStatusEnblLabelCode = -1; ActuatorStatusCammLabelCode = 0; ActuatorStatusLoopLabelCode = 0; diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUI.ui b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUI.ui index 561b9138c..6e7eb895f 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUI.ui +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUI.ui @@ -29,7 +29,7 @@ 970 - 15 + 50 130 30 @@ -48,7 +48,7 @@ 970 - 152 + 187 130 20 @@ -67,7 +67,7 @@ 970 - 225 + 260 130 20 @@ -89,7 +89,7 @@ 970 - 305 + 340 90 35 @@ -114,7 +114,7 @@ 1065 - 305 + 340 95 35 @@ -139,7 +139,7 @@ 1115 - 265 + 300 140 35 @@ -164,7 +164,7 @@ 970 - 265 + 300 140 35 @@ -189,7 +189,7 @@ 1165 - 305 + 340 90 35 @@ -211,7 +211,7 @@ 970 - 105 + 140 130 42 @@ -230,7 +230,7 @@ 970 - 60 + 95 130 42 @@ -249,7 +249,7 @@ 970 - 176 + 211 130 20 @@ -268,7 +268,7 @@ 970 - 200 + 235 130 20 @@ -287,7 +287,7 @@ 1120 - 15 + 50 135 30 @@ -312,7 +312,7 @@ 1120 - 60 + 95 30 20 @@ -331,7 +331,7 @@ 1120 - 82 + 117 30 20 @@ -350,7 +350,7 @@ 1120 - 106 + 141 30 20 @@ -369,7 +369,7 @@ 1120 - 127 + 162 30 20 @@ -388,7 +388,7 @@ 1153 - 60 + 95 100 20 @@ -407,7 +407,7 @@ 1153 - 82 + 117 100 20 @@ -426,7 +426,7 @@ 1154 - 106 + 141 100 20 @@ -445,7 +445,7 @@ 1154 - 127 + 162 100 20 @@ -464,7 +464,7 @@ 1120 - 152 + 187 135 20 @@ -483,7 +483,7 @@ 1120 - 176 + 211 135 20 @@ -502,7 +502,7 @@ 1120 - 200 + 235 135 20 @@ -521,7 +521,7 @@ 1120 - 225 + 260 135 20 @@ -543,7 +543,7 @@ 970 - 760 + 755 287 32 @@ -568883,9 +568883,6 @@ Calibration - - - @@ -569347,9 +569344,6 @@ Stop - - - @@ -569811,9 +569805,6 @@ Reset - - - @@ -570275,9 +570266,6 @@ RefPos - - - @@ -570739,9 +570727,6 @@ Top - - - @@ -571203,9 +571188,6 @@ Stow - - - @@ -571667,9 +571649,6 @@ Bottom - - - @@ -572131,9 +572110,6 @@ Setup - - - @@ -572595,9 +572571,6 @@ Down - - - @@ -573059,9 +573032,6 @@ Up - - - @@ -573523,9 +573493,6 @@ Move - - - @@ -574008,9 +573975,6 @@ Correction - - - @@ -574493,9 +574457,6 @@ Update - - - @@ -574523,7 +574484,7 @@ 970 - 830 + 825 90 30 @@ -574983,8 +574944,8 @@ - 1164 - 830 + 1170 + 825 90 30 @@ -575444,8 +575405,8 @@ - 1067 - 830 + 1070 + 825 90 30 @@ -575905,9 +575866,9 @@ - 990 + 970 890 - 120 + 140 30 @@ -575930,10 +575891,10 @@ - 990 - 870 - 120 - 20 + 970 + 860 + 140 + 30 @@ -575955,8 +575916,8 @@ - 1104 - 792 + 1110 + 790 151 30 @@ -575992,7 +575953,7 @@ 970 - 792 + 790 131 30 @@ -576453,9 +576414,9 @@ 1120 - 870 - 120 - 20 + 860 + 140 + 30 @@ -576479,7 +576440,7 @@ 1120 890 - 120 + 140 30 @@ -576499,6 +576460,56 @@ true + + + + 970 + 10 + 131 + 30 + + + + LUT File + + + Qt::AlignCenter + + + false + + + + + + 1074 + 10 + 181 + 30 + + + + + Cantarell + 12 + + + + + + + 32767 + + + true + + + Qt::AlignHCenter + + + true + + diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp index 42e1e878f..2f3b92a9b 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceGUIui.cpp @@ -21,6 +21,7 @@ SRTActiveSurfaceGUI::SRTActiveSurfaceGUI(QWidget *parent) : QWidget(parent) QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIActuatorStatusLabels()), this, SLOT(changeGUIActuatorStatusLabels())); QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIasStatusCode(int)), this, SLOT(changeGUIasStatusCode(int))); QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIasProfileCode(int)), this, SLOT(changeGUIasProfileCode(int))); + QObject::connect(&mySRTActiveSurfaceCore, SIGNAL(setGUIasLUTFileName(QString)), this, SLOT(changeGUIasLUTFileName(QString))); #ifdef MANAGEMENT buttonGroup1->setEnabled(true); @@ -716,10 +717,18 @@ void SRTActiveSurfaceGUI::changeGUIasProfileCode(int asProfileCode) ProfilelineEdit_2->setText(QApplication::translate("SRTActiveSurfaceGUI", asProfileString.c_str(), 0, QApplication::UnicodeUTF8)); } +void SRTActiveSurfaceGUI::changeGUIasLUTFileName(QString filename) +{ + LUTLabelFileName->setText(filename); +} + void SRTActiveSurfaceGUI::changeGUIActuatorStatusLabels() { ActuatorStatusRunLabel->clear(); switch (mySRTActiveSurfaceCore.ActuatorStatusRunLabelCode) { + case (0): + ActuatorStatusRunLabel->setText(""); + break; case (-1): ActuatorStatusRunLabel->setText("STOPPED"); break; diff --git a/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml index 3482c5193..770a0535e 100644 --- a/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/AS/Boss/Boss.xml @@ -4,4 +4,5 @@ + diff --git a/SRT/Interfaces/SRTActiveSurfaceInterface/config/CDB/schemas/SRTActiveSurfaceBoss.xsd b/SRT/Interfaces/SRTActiveSurfaceInterface/config/CDB/schemas/SRTActiveSurfaceBoss.xsd index 3907fddd4..ee4bb987e 100644 --- a/SRT/Interfaces/SRTActiveSurfaceInterface/config/CDB/schemas/SRTActiveSurfaceBoss.xsd +++ b/SRT/Interfaces/SRTActiveSurfaceInterface/config/CDB/schemas/SRTActiveSurfaceBoss.xsd @@ -30,6 +30,7 @@ + diff --git a/SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.midl b/SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.midl index 634d21e76..fd92b43e9 100644 --- a/SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.midl +++ b/SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.midl @@ -66,6 +66,11 @@ module ActiveSurface { */ readonly attribute Management::ROTBoolean tracking; + /* + * This attribute shows the filename of the currently loaded lookup table + */ + readonly attribute ACS::ROstring LUT_filename; + /** * This method can be called in order to disable the component. That * means that the activesurface subsystem cannot be commanded any more via the diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/DevIOLUT.h b/SRT/Servers/SRTActiveSurfaceBoss/include/DevIOLUT.h new file mode 100644 index 000000000..8c83a47e8 --- /dev/null +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/DevIOLUT.h @@ -0,0 +1,56 @@ +#ifndef _SRTACTIVESURFACEBOSSIMPLDEVIOLUT_H_ +#define _SRTACTIVESURFACEBOSSIMPLDEVIOLUT_H_ + +/****************************************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* $Id: DevIOLUT.h,v 1.0 2025-01-13 15:42:32 G. Carboni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Giuseppe Carboni (giuseppe.carboni@inaf.it) 13/01/2025 Creation */ + +#include +#include + +using namespace baci; + +/** + * This class is derived from the template DevIO. + * @author Giuseppe Carboni, + * Osservatorio Astronomico di Cagliari, Italia
+ */ +class SRTActiveSurfaceBossImplDevIOLUT: public virtual DevIO +{ +public: + + SRTActiveSurfaceBossImplDevIOLUT(IRA::CSecureArea* core): m_core(core) { + AUTO_TRACE("SRTActiveSurfaceBossImplDevIOLUT::SRTActiveSurfaceBossImplDevIOLUT()"); + } + + ~SRTActiveSurfaceBossImplDevIOLUT() { + AUTO_TRACE("SRTActiveSurfaceBossImplDevIOLUT::~SRTActiveSurfaceBossImplDevIOLUT()"); + } + + bool initializeValue() + { + return false; + } + + ACE_CString read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) + { + CSecAreaResourceWrapper resource=m_core->Get(); + AUTO_TRACE("SRTActiveSurfaceBossImplDevIOLUT::read()"); + timestamp=getTimeStamp(); + return resource->getLUTfilename().c_str(); + } + + void write(const CORBA::Long& value, ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl) { + AUTO_TRACE("SRTActiveSurfaceBossImplDevIOLUT::write()"); + } + +private: + IRA::CSecureArea *m_core; +}; + +#endif /*DEVIOLUT_H_*/ diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h index 1531f90bb..1b3ceb2b9 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossCore.h @@ -147,6 +147,8 @@ public: inline bool getTracking() const { return m_tracking; } + inline std::string getLUTfilename() const { return m_lut.substr(m_lut.find_last_of('/') + 1); } + /** * Sets the AutoUpdate flag to false, i.e. the component will not update automatically the surface. */ diff --git a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h index b57b172ea..a7832376d 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h +++ b/SRT/Servers/SRTActiveSurfaceBoss/include/SRTActiveSurfaceBossImpl.h @@ -128,6 +128,12 @@ class SRTActiveSurfaceBossImpl: public virtual CharacteristicComponentImpl, publ */ virtual Management::ROTBoolean_ptr tracking() throw (CORBA::SystemException); + /** + * Returns a reference to the tracking property implementation of IDL interface. + * @return pointer to read-only ACS::ROString property enabled + */ + virtual ACS::ROstring_ptr LUT_filename() throw (CORBA::SystemException); + /** * This method can be called in order to disable the automatic update of the surface. * @throw CORBA::SystemException @@ -221,6 +227,7 @@ class SRTActiveSurfaceBossImpl: public virtual CharacteristicComponentImpl, publ SmartPropertyPointer< ROEnumImpl > m_penabled; SmartPropertyPointer< ROEnumImpl > m_pprofile; SmartPropertyPointer< ROEnumImpl > m_ptracking; + SmartPropertyPointer m_pLUT_filename; IRA::CSecureArea *m_core; /* * diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp index 78db1dae9..a958afa13 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossCore.cpp @@ -45,6 +45,7 @@ void CSRTActiveSurfaceBossCore::initialize() m_enable = false; m_tracking = false; m_status = Management::MNG_WARNING; + m_lut = USDTABLECORRECTIONS; AutoUpdate = false; actuatorcounter = circlecounter = totacts = 1; for(int i = 0; i < SECTORS; i++) @@ -1364,9 +1365,6 @@ void CSRTActiveSurfaceBossCore::asSetLUT(const char *newlut) void CSRTActiveSurfaceBossCore::setProfile(const ActiveSurface::TASProfile& newProfile) throw (ComponentErrors::ComponentErrorsExImpl) { - if (m_newlut == false) - m_lut = USDTABLECORRECTIONS; - if(m_initialized) // USD tables has not been loaded yet { ifstream usdCorrections(m_lut); diff --git a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp index 117fec854..0be0e130b 100644 --- a/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp +++ b/SRT/Servers/SRTActiveSurfaceBoss/src/SRTActiveSurfaceBossImpl.cpp @@ -6,6 +6,7 @@ #include "DevIOEnable.h" #include "DevIOProfile.h" #include "DevIOTracking.h" +#include "DevIOLUT.h" static char const *rcsId="@(#) $Id: SRTActiveSurfaceBossImpl.cpp,v 1.2 2010-07-26 12:37:07 c.migoni Exp $"; static void *use_rcsId = ((void)&use_rcsId,(void *) &rcsId); @@ -58,6 +59,7 @@ SRTActiveSurfaceBossImpl::SRTActiveSurfaceBossImpl(const ACE_CString &CompName, m_penabled(this), m_pprofile(this), m_ptracking(this), + m_pLUT_filename(this), m_core(NULL) { AUTO_TRACE("SRTActiveSurfaceBossImpl::SRTActiveSurfaceBossImpl()"); @@ -86,6 +88,7 @@ void SRTActiveSurfaceBossImpl::initialize() throw (ACSErr::ACSbaseExImpl) (getContainerServices()->getName()+":pprofile",getComponent(),new SRTActiveSurfaceBossImplDevIOProfile(m_core),true); m_ptracking=new ROEnumImpl (getContainerServices()->getName()+":tracking",getComponent(),new SRTActiveSurfaceBossImplDevIOTracking(m_core),true); + m_pLUT_filename=new ROstring(getContainerServices()->getName()+":LUT_filename",getComponent(),new SRTActiveSurfaceBossImplDevIOLUT(m_core),true); // create the parser for command line execution m_parser = new SimpleParser::CParser(boss,10); @@ -604,6 +607,7 @@ _PROPERTY_REFERENCE_CPP(SRTActiveSurfaceBossImpl,Management::ROTSystemStatus,m_p _PROPERTY_REFERENCE_CPP(SRTActiveSurfaceBossImpl,Management::ROTBoolean,m_penabled,enabled); _PROPERTY_REFERENCE_CPP(SRTActiveSurfaceBossImpl,ActiveSurface::ROTASProfile,m_pprofile,pprofile); _PROPERTY_REFERENCE_CPP(SRTActiveSurfaceBossImpl,Management::ROTBoolean,m_ptracking,tracking); +_PROPERTY_REFERENCE_CPP(SRTActiveSurfaceBossImpl,ACS::ROstring,m_pLUT_filename,LUT_filename); /* --------------- [ MACI DLL support functions ] -----------------*/ #include MACI_DLL_SUPPORT_FUNCTIONS(SRTActiveSurfaceBossImpl) -- GitLab From 9c7b8639ce20b67ee0ac5fb4240f2897763858b7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 17 Jan 2025 09:54:45 +0000 Subject: [PATCH 131/150] Added RFIMonitoringContainer to SRT test CDB --- .../RFIMonitoring/RFIMonitoring.xml | 18 +++++++++++ .../RFIMonitoringContainer.xml | 30 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 SRT/CDB/MACI/Components/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml create mode 100644 SRT/CDB/MACI/Containers/RFIMonitoringContainer/RFIMonitoringContainer.xml diff --git a/SRT/CDB/MACI/Components/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml b/SRT/CDB/MACI/Components/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml new file mode 100644 index 000000000..a1dedfe22 --- /dev/null +++ b/SRT/CDB/MACI/Components/MANAGEMENT/RFIMonitoring/RFIMonitoring.xml @@ -0,0 +1,18 @@ + + + diff --git a/SRT/CDB/MACI/Containers/RFIMonitoringContainer/RFIMonitoringContainer.xml b/SRT/CDB/MACI/Containers/RFIMonitoringContainer/RFIMonitoringContainer.xml new file mode 100644 index 000000000..a861d4726 --- /dev/null +++ b/SRT/CDB/MACI/Containers/RFIMonitoringContainer/RFIMonitoringContainer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + -- GitLab From c853c4a4af56d22548c0095149246c70d5216e00 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 20 Jan 2025 15:36:24 +0100 Subject: [PATCH 132/150] Fix #887, commanded minor servo preset after offset (#894) --- .../src/SRTMinorServoBossCore.cpp | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index e89051753..5e3aaeb2d 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -682,9 +682,11 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) for(const auto& [servo_name, servo] : m_current_servos) { servo->clearUserOffsets(); - if(motion_status == MOTION_STATUS_CONFIGURED) + if(motion_status == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } @@ -702,9 +704,11 @@ void SRTMinorServoBossCore::clearUserOffsets(std::string servo_name) { auto servo = m_current_servos.at(servo_name); servo->clearUserOffsets(); - if(motion_status == MOTION_STATUS_CONFIGURED) + if(motion_status == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } @@ -764,9 +768,11 @@ void SRTMinorServoBossCore::setUserOffset(std::string servo_axis_name, double of } servo->setUserOffset(axis_name.c_str(), offset); - if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } @@ -835,9 +841,11 @@ void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) for(const auto& [servo_name, servo] : m_current_servos) { servo->clearSystemOffsets(); - if(motion_status == MOTION_STATUS_CONFIGURED) + if(motion_status == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } @@ -855,9 +863,11 @@ void SRTMinorServoBossCore::clearSystemOffsets(std::string servo_name) { auto servo = m_current_servos.at(servo_name); servo->clearSystemOffsets(); - if(motion_status == MOTION_STATUS_CONFIGURED) + if(motion_status == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } @@ -913,9 +923,11 @@ void SRTMinorServoBossCore::setSystemOffset(std::string servo_axis_name, double auto servo = m_current_servos.at(servo_name); servo->setSystemOffset(axis_name.c_str(), offset); - if(m_motion_status.load() == MOTION_STATUS_CONFIGURED) + if(m_motion_status.load() == MOTION_STATUS_CONFIGURED || m_tracking_servos.find(servo_name) == m_tracking_servos.end()) { - // We are not tracking but we need to update the servo position to load the offsets + // We get here in 2 different scenarios + // 1) The system is configured and is not tracking the elevation, therefore we ALWAYS need to update the position of the servo we just set the offset + // 2) The servo we set the offset is not a program track servo, therefore we need to update its position manually servo->preset(ACS::doubleSeq()); } } -- GitLab From 6fe21d90af3ebc2e0ad033a6f048251ed8a7f78a Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 30 Jan 2025 15:01:33 +0100 Subject: [PATCH 133/150] Implemented continuous integration (#897) * First continuous integration attempt * Firse continuous integration attempt * Added push to ci workflow * Another attempt * Third attempt * Fourth attempt * First parallel attempt * Second parallel attempt * Fix #891, continuous integration completed This commit fixes the failing build of Medicina branch --- .github/utils/download_from_gdrive.py | 53 ++++++++ .github/utils/gdrive_requirements.txt | 4 + .github/utils/upload_to_gdrive.py | 31 +++++ .github/workflows/workflow.yml | 70 +++++++++++ .../include/MedicinaActiveSurfaceGUI.h | 23 +--- .../src/MedicinaActiveSurfaceGUI.ui | 39 ------ .../src/moc_MedicinaActiveSurfaceCore.cpp | 95 +++++++++------ .../src/moc_MedicinaActiveSurfaceGUIui.cpp | 113 ++++++++++-------- 8 files changed, 284 insertions(+), 144 deletions(-) create mode 100755 .github/utils/download_from_gdrive.py create mode 100644 .github/utils/gdrive_requirements.txt create mode 100755 .github/utils/upload_to_gdrive.py create mode 100644 .github/workflows/workflow.yml diff --git a/.github/utils/download_from_gdrive.py b/.github/utils/download_from_gdrive.py new file mode 100755 index 000000000..1a01b42db --- /dev/null +++ b/.github/utils/download_from_gdrive.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +from google.oauth2.credentials import Credentials +from google.auth.transport.requests import Request +from googleapiclient.discovery import build +from googleapiclient.http import MediaIoBaseDownload +import os +import io + +TOKEN_FILE = 'token.json' +VM_FILE_PATH = '/home/runner/discos_manager.ova' +ARCHIVE_FILE_PATH = '/home/runner/vagrant.tar.gz' +SCOPES = ['https://www.googleapis.com/auth/drive.readonly'] + +# Create the token file from the GH Secret +with open(TOKEN_FILE, 'w') as tokenfile: + tokenfile.write(os.environ.get('GOOGLE_DRIVE_TOKEN')) + +# Authenticate with the token and eventually update it +creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) +if creds.expired and creds.refresh_token: + creds.refresh(Request()) + +# Download the VM +creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) +if creds.expired and creds.refresh_token: + creds.refresh(Request()) + +service = build('drive', 'v3', credentials=creds) + +downloader = MediaIoBaseDownload( + io.FileIO(ARCHIVE_FILE_PATH, 'wb'), + service.files().get_media( + fileId=os.environ.get('PROVISIONED_ARCHIVE_GDRIVE_ID') + ) +) +done = False +while not done: + _, done = downloader.next_chunk() + +downloader = MediaIoBaseDownload( + io.FileIO(VM_FILE_PATH, 'wb'), + service.files().get_media( + fileId=os.environ.get('PROVISIONED_VM_GDRIVE_ID'), + ), + chunksize=5*1024*1024 +) +done = False +while not done: + _, done = downloader.next_chunk() + +# Finally update the token file +with open(TOKEN_FILE, 'w') as tokenfile: + tokenfile.write(creds.to_json()) diff --git a/.github/utils/gdrive_requirements.txt b/.github/utils/gdrive_requirements.txt new file mode 100644 index 000000000..7c6866175 --- /dev/null +++ b/.github/utils/gdrive_requirements.txt @@ -0,0 +1,4 @@ +google-auth +google-auth-oauthlib +google-auth-httplib2 +google-api-python-client diff --git a/.github/utils/upload_to_gdrive.py b/.github/utils/upload_to_gdrive.py new file mode 100755 index 000000000..a9cc1c674 --- /dev/null +++ b/.github/utils/upload_to_gdrive.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +from google.oauth2.credentials import Credentials +from google.auth.transport.requests import Request +from googleapiclient.discovery import build +from googleapiclient.http import MediaFileUpload +import os + +TOKEN_FILE = 'token.json' +VM_FILE_PATH = '/home/runner/discos_manager.ova' +SCOPES = [ + 'https://www.googleapis.com/auth/drive', + 'https://www.googleapis.com/auth/drive.file' +] + +# Authenticate with the token and eventually update it +creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) +if creds.expired and creds.refresh_token: + creds.refresh(Request()) + +# Prepare the files to be uploaded +service = build('drive', 'v3', credentials=creds) +vm_media = MediaFileUpload(VM_FILE_PATH, resumable=True) +service.files().update( + fileId=os.environ.get('DEPLOYED_VM_GDRIVE_ID'), + media_body=vm_media, + fields='id' +).execute() + +# Finally update the token file +with open(TOKEN_FILE, 'w') as tokenfile: + tokenfile.write(creds.to_json()) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml new file mode 100644 index 000000000..b31e19644 --- /dev/null +++ b/.github/workflows/workflow.yml @@ -0,0 +1,70 @@ +name: DISCOS deployment and build + +on: + push: + workflow_dispatch: + +jobs: + deploy-discos: + env: + REPOSITORY_TOKEN: "${{ secrets.DEPENDENCIES_TOKEN }}" + GH_TOKEN: "${{ secrets.GH_WORKFLOWS_TOKEN }}" + GOOGLE_DRIVE_TOKEN: "${{ secrets.GOOGLE_DRIVE_TOKEN }}" + PROVISIONED_VM_GDRIVE_ID: "${{ secrets.PROVISIONED_VM_GDRIVE_ID }}" + PROVISIONED_ARCHIVE_GDRIVE_ID: "${{ secrets.PROVISIONED_ARCHIVE_GDRIVE_ID }}" + strategy: + fail-fast: false + matrix: + station: ['SRT', 'Medicina', 'Noto'] + runs-on: ubuntu-22.04 + steps: + - name: Free up space + uses: jlumbroso/free-disk-space@main + with: + tool-cache: true + - name: Install Vagrant + run: | + wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg + echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list + sudo apt update && sudo apt install vagrant + - name: Install VirtualBox + run: | + wget https://download.virtualbox.org/virtualbox/7.0.14/virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb + sudo apt install ./virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb + - name: Clone the repository + uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3' + check-latest: true + - name: Download the provisioned virtual machine from Google Drive + run: | + pip install -r .github/utils/gdrive_requirements.txt + python .github/utils/download_from_gdrive.py + gh secret set GOOGLE_DRIVE_TOKEN --org discos --visibility selected --repos discos,deployment < token.json + - name: Install the virtual machine + run: | + vboxmanage import discos_manager.ova --vsys 0 --options keepallmacs + rm discos_manager.ova + tar -xzvf vagrant.tar.gz + working-directory: /home/runner + - name: Add the virtual machine to Vagrant + run: | + sed -i "s/$(cat id)/$(vboxmanage list vms | grep 'discos_manager' | grep -oP '(?<=\{)[0-9a-fA-F-]+(?=\})')/" action_provision + sed -i "s/$(cat id)/$(vboxmanage list vms | grep 'discos_manager' | grep -oP '(?<=\{)[0-9a-fA-F-]+(?=\})')/" id + working-directory: /home/runner/.deployment/.vagrant/machines/manager/virtualbox/ + - name: Clone the deployment repository + uses: actions/checkout@v4 + with: + repository: 'discos/deployment' + - name: Install deployment package and dependencies + run: | + python -m pip install -r requirements.txt + pip install . + - name: Deploy DISCOS + run: | + discos-deploy manager:development --deploy-only -s ${{ matrix.station }} -b ${{ github.ref_name }} + - name: Shutdown the virtual machine + run: | + discos-vms stop diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/include/MedicinaActiveSurfaceGUI.h b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/include/MedicinaActiveSurfaceGUI.h index 577e6de9e..8968f6099 100644 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/include/MedicinaActiveSurfaceGUI.h +++ b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/include/MedicinaActiveSurfaceGUI.h @@ -1,10 +1,9 @@ /******************************************************************************** -** Form generated from reading ui file 'MedicinaActiveSurfaceGUI.ui' +** Form generated from reading UI file 'MedicinaActiveSurfaceGUI.ui' ** -** Created: Wed Dec 7 09:22:24 2022 -** by: Qt User Interface Compiler version 4.5.2 +** Created by: Qt User Interface Compiler version 4.8.7 ** -** WARNING! All changes made in this file will be lost when recompiling ui file! +** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ #ifndef MEDICINAACTIVESURFACEGUI_H @@ -17675,9 +17674,6 @@ public: buttonGroup1->setEnabled(false); buttonGroup1->setGeometry(QRect(970, 448, 288, 291)); CalibrateButton = new QPushButton(buttonGroup1); - QButtonGroup *buttonGroup = new QButtonGroup(MedicinaActiveSurfaceGUI); - buttonGroup->setObjectName(QString::fromUtf8("buttonGroup")); - buttonGroup->addButton(CalibrateButton); CalibrateButton->setObjectName(QString::fromUtf8("CalibrateButton")); CalibrateButton->setGeometry(QRect(192, 45, 90, 35)); QPalette palette321; @@ -17731,7 +17727,6 @@ public: palette321.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); CalibrateButton->setPalette(palette321); StopButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(StopButton); StopButton->setObjectName(QString::fromUtf8("StopButton")); StopButton->setGeometry(QRect(4, 5, 90, 35)); QPalette palette322; @@ -17785,7 +17780,6 @@ public: palette322.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); StopButton->setPalette(palette322); ResetButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(ResetButton); ResetButton->setObjectName(QString::fromUtf8("ResetButton")); ResetButton->setGeometry(QRect(98, 5, 90, 35)); QPalette palette323; @@ -17839,7 +17833,6 @@ public: palette323.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); ResetButton->setPalette(palette323); RefPosButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(RefPosButton); RefPosButton->setObjectName(QString::fromUtf8("RefPosButton")); RefPosButton->setGeometry(QRect(4, 45, 90, 35)); QPalette palette324; @@ -17893,7 +17886,6 @@ public: palette324.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); RefPosButton->setPalette(palette324); TopButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(TopButton); TopButton->setObjectName(QString::fromUtf8("TopButton")); TopButton->setGeometry(QRect(5, 125, 90, 35)); QPalette palette325; @@ -17947,7 +17939,6 @@ public: palette325.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); TopButton->setPalette(palette325); StowButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(StowButton); StowButton->setObjectName(QString::fromUtf8("StowButton")); StowButton->setGeometry(QRect(98, 45, 90, 35)); QPalette palette326; @@ -18001,7 +17992,6 @@ public: palette326.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); StowButton->setPalette(palette326); BottomButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(BottomButton); BottomButton->setObjectName(QString::fromUtf8("BottomButton")); BottomButton->setGeometry(QRect(98, 125, 90, 35)); QPalette palette327; @@ -18055,7 +18045,6 @@ public: palette327.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); BottomButton->setPalette(palette327); SetupButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(SetupButton); SetupButton->setObjectName(QString::fromUtf8("SetupButton")); SetupButton->setGeometry(QRect(192, 5, 90, 35)); QPalette palette328; @@ -18109,7 +18098,6 @@ public: palette328.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); SetupButton->setPalette(palette328); DownButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(DownButton); DownButton->setObjectName(QString::fromUtf8("DownButton")); DownButton->setGeometry(QRect(98, 85, 90, 35)); QPalette palette329; @@ -18163,7 +18151,6 @@ public: palette329.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); DownButton->setPalette(palette329); UpButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(UpButton); UpButton->setObjectName(QString::fromUtf8("UpButton")); UpButton->setGeometry(QRect(4, 85, 90, 35)); QPalette palette330; @@ -18217,7 +18204,6 @@ public: palette330.setBrush(QPalette::Disabled, QPalette::LinkVisited, brush10); UpButton->setPalette(palette330); MoveButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(MoveButton); MoveButton->setObjectName(QString::fromUtf8("MoveButton")); MoveButton->setGeometry(QRect(5, 165, 90, 35)); QPalette palette331; @@ -18279,7 +18265,6 @@ public: ActuatorMovelineEdit->setAlignment(Qt::AlignRight); ActuatorMovelineEdit->setReadOnly(false); CorrectionButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(CorrectionButton); CorrectionButton->setObjectName(QString::fromUtf8("CorrectionButton")); CorrectionButton->setGeometry(QRect(5, 205, 90, 35)); QPalette palette332; @@ -18339,7 +18324,6 @@ public: ActuatorCorrectionlineEdit->setAlignment(Qt::AlignRight); ActuatorCorrectionlineEdit->setReadOnly(false); UpdateButton = new QPushButton(buttonGroup1); - buttonGroup->addButton(UpdateButton); UpdateButton->setObjectName(QString::fromUtf8("UpdateButton")); UpdateButton->setGeometry(QRect(5, 245, 90, 35)); QPalette palette333; @@ -20676,7 +20660,6 @@ public: StatuslineEdit_2->setText(QString()); StatuslineEdit->setStyleSheet(QApplication::translate("MedicinaActiveSurfaceGUI", "background-color: rgb(0, 85, 255);", 0, QApplication::UnicodeUTF8)); StatuslineEdit->setText(QApplication::translate("MedicinaActiveSurfaceGUI", "STATUS", 0, QApplication::UnicodeUTF8)); - Q_UNUSED(MedicinaActiveSurfaceGUI); } // retranslateUi }; diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceGUI.ui b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceGUI.ui index 13d9fe7fd..3ffe3444d 100755 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceGUI.ui +++ b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceGUI.ui @@ -149211,9 +149211,6 @@ Calibration - - - @@ -149675,9 +149672,6 @@ Stop - - - @@ -150139,9 +150133,6 @@ Reset - - - @@ -150603,9 +150594,6 @@ RefPos - - - @@ -151067,9 +151055,6 @@ Top - - - @@ -151531,9 +151516,6 @@ Stow - - - @@ -151995,9 +151977,6 @@ Bottom - - - @@ -152459,9 +152438,6 @@ Setup - - - @@ -152923,9 +152899,6 @@ Down - - - @@ -153387,9 +153360,6 @@ Up - - - @@ -153851,9 +153821,6 @@ Move - - - @@ -154336,9 +154303,6 @@ Correction - - - @@ -154821,9 +154785,6 @@ Update - - - diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceCore.cpp b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceCore.cpp index 3783a3dd1..007c3f222 100644 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceCore.cpp +++ b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceCore.cpp @@ -1,8 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'MedicinaActiveSurfaceCore.h' ** -** Created: Wed Dec 7 14:02:43 2022 -** by: The Qt Meta Object Compiler version 61 (Qt 4.5.2) +** Created by: The Qt Meta Object Compiler version 63 (Qt 4.8.7) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ @@ -10,8 +9,8 @@ #include "../include/MedicinaActiveSurfaceCore.h" #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'MedicinaActiveSurfaceCore.h' doesn't include ." -#elif Q_MOC_OUTPUT_REVISION != 61 -#error "This file was generated using the moc from 4.5.2. It" +#elif Q_MOC_OUTPUT_REVISION != 63 +#error "This file was generated using the moc from 4.8.7. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif @@ -20,13 +19,15 @@ QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_MedicinaActiveSurfaceCore[] = { // content: - 2, // revision + 6, // revision 0, // classname 0, 0, // classinfo - 12, 12, // methods + 12, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors + 0, // flags + 12, // signalCount // signals: signature, parameters, type, tag, flags 35, 31, 27, 26, 0x05, @@ -58,14 +59,57 @@ static const char qt_meta_stringdata_MedicinaActiveSurfaceCore[] = { "setGUIasProfileCode(int)\0" }; +void MedicinaActiveSurfaceCore::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + Q_ASSERT(staticMetaObject.cast(_o)); + MedicinaActiveSurfaceCore *_t = static_cast(_o); + switch (_id) { + case 0: { int _r = _t->setGUIActuatorColor((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< bool(*)>(_a[3])),(*reinterpret_cast< bool(*)>(_a[4]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 1: { int _r = _t->setGUIAllActuators((*reinterpret_cast< bool(*)>(_a[1]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 2: { int _r = _t->setGUIAllActuators(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 3: { int _r = _t->setGUIcircleORradius((*reinterpret_cast< bool(*)>(_a[1]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 4: { int _r = _t->setGUIcircleORradius(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 5: { int _r = _t->setGUIActuator((*reinterpret_cast< bool(*)>(_a[1]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 6: { int _r = _t->setGUIActuator(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 7: { int _r = _t->setGUIActuatorStatusEnblLabel(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 8: { int _r = _t->setGUIActuatorValues(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 9: { int _r = _t->setGUIActuatorStatusLabels(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 10: { int _r = _t->setGUIasStatusCode((*reinterpret_cast< int(*)>(_a[1]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 11: { int _r = _t->setGUIasProfileCode((*reinterpret_cast< int(*)>(_a[1]))); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + default: ; + } + } +} + +const QMetaObjectExtraData MedicinaActiveSurfaceCore::staticMetaObjectExtraData = { + 0, qt_static_metacall +}; + const QMetaObject MedicinaActiveSurfaceCore::staticMetaObject = { { &QThread::staticMetaObject, qt_meta_stringdata_MedicinaActiveSurfaceCore, - qt_meta_data_MedicinaActiveSurfaceCore, 0 } + qt_meta_data_MedicinaActiveSurfaceCore, &staticMetaObjectExtraData } }; +#ifdef Q_NO_DATA_RELOCATION +const QMetaObject &MedicinaActiveSurfaceCore::getStaticMetaObject() { return staticMetaObject; } +#endif //Q_NO_DATA_RELOCATION + const QMetaObject *MedicinaActiveSurfaceCore::metaObject() const { - return &staticMetaObject; + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; } void *MedicinaActiveSurfaceCore::qt_metacast(const char *_clname) @@ -82,33 +126,8 @@ int MedicinaActiveSurfaceCore::qt_metacall(QMetaObject::Call _c, int _id, void * if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { - switch (_id) { - case 0: { int _r = setGUIActuatorColor((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< bool(*)>(_a[3])),(*reinterpret_cast< bool(*)>(_a[4]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 1: { int _r = setGUIAllActuators((*reinterpret_cast< bool(*)>(_a[1]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 2: { int _r = setGUIAllActuators(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 3: { int _r = setGUIcircleORradius((*reinterpret_cast< bool(*)>(_a[1]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 4: { int _r = setGUIcircleORradius(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 5: { int _r = setGUIActuator((*reinterpret_cast< bool(*)>(_a[1]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 6: { int _r = setGUIActuator(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 7: { int _r = setGUIActuatorStatusEnblLabel(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 8: { int _r = setGUIActuatorValues(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 9: { int _r = setGUIActuatorStatusLabels(); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 10: { int _r = setGUIasStatusCode((*reinterpret_cast< int(*)>(_a[1]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - case 11: { int _r = setGUIasProfileCode((*reinterpret_cast< int(*)>(_a[1]))); - if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; - default: ; - } + if (_id < 12) + qt_static_metacall(this, _c, _id, _a); _id -= 12; } return _id; @@ -128,7 +147,7 @@ int MedicinaActiveSurfaceCore::setGUIAllActuators(bool _t1) { int _t0; void *_a[] = { const_cast(reinterpret_cast(&_t0)), const_cast(reinterpret_cast(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 1, 2, _a); + QMetaObject::activate(this, &staticMetaObject, 1, _a); return _t0; } @@ -137,7 +156,7 @@ int MedicinaActiveSurfaceCore::setGUIcircleORradius(bool _t1) { int _t0; void *_a[] = { const_cast(reinterpret_cast(&_t0)), const_cast(reinterpret_cast(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 3, 4, _a); + QMetaObject::activate(this, &staticMetaObject, 3, _a); return _t0; } @@ -146,7 +165,7 @@ int MedicinaActiveSurfaceCore::setGUIActuator(bool _t1) { int _t0; void *_a[] = { const_cast(reinterpret_cast(&_t0)), const_cast(reinterpret_cast(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 5, 6, _a); + QMetaObject::activate(this, &staticMetaObject, 5, _a); return _t0; } diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceGUIui.cpp b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceGUIui.cpp index 3652a8c53..02756b88f 100644 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceGUIui.cpp +++ b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/moc_MedicinaActiveSurfaceGUIui.cpp @@ -1,8 +1,7 @@ /**************************************************************************** ** Meta object code from reading C++ file 'MedicinaActiveSurfaceGUIui.h' ** -** Created: Wed Dec 7 14:02:43 2022 -** by: The Qt Meta Object Compiler version 61 (Qt 4.5.2) +** Created by: The Qt Meta Object Compiler version 63 (Qt 4.8.7) ** ** WARNING! All changes made in this file will be lost! *****************************************************************************/ @@ -10,8 +9,8 @@ #include "../include/MedicinaActiveSurfaceGUIui.h" #if !defined(Q_MOC_OUTPUT_REVISION) #error "The header file 'MedicinaActiveSurfaceGUIui.h' doesn't include ." -#elif Q_MOC_OUTPUT_REVISION != 61 -#error "This file was generated using the moc from 4.5.2. It" +#elif Q_MOC_OUTPUT_REVISION != 63 +#error "This file was generated using the moc from 4.8.7. It" #error "cannot be used with the include files from this version of Qt." #error "(The moc has changed too much.)" #endif @@ -20,13 +19,15 @@ QT_BEGIN_MOC_NAMESPACE static const uint qt_meta_data_MedicinaActiveSurfaceGUI[] = { // content: - 2, // revision + 6, // revision 0, // classname 0, 0, // classinfo - 36, 12, // methods + 36, 14, // methods 0, 0, // properties 0, 0, // enums/sets 0, 0, // constructors + 0, // flags + 0, // signalCount // slots: signature, parameters, type, tag, flags 26, 25, 25, 25, 0x0a, @@ -91,14 +92,69 @@ static const char qt_meta_stringdata_MedicinaActiveSurfaceGUI[] = { "changeGUIasProfileCode(int)\0" }; +void MedicinaActiveSurfaceGUI::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + Q_ASSERT(staticMetaObject.cast(_o)); + MedicinaActiveSurfaceGUI *_t = static_cast(_o); + switch (_id) { + case 0: _t->Quit(); break; + case 1: _t->move(); break; + case 2: _t->correction(); break; + case 3: _t->update(); break; + case 4: _t->reset(); break; + case 5: _t->stop(); break; + case 6: _t->up(); break; + case 7: _t->down(); break; + case 8: _t->top(); break; + case 9: _t->bottom(); break; + case 10: _t->calibrate(); break; + case 11: _t->calVer(); break; + case 12: _t->stow(); break; + case 13: _t->setup(); break; + case 14: _t->refPos(); break; + case 15: _t->recoverUSD(); break; + case 16: _t->setupAS(); break; + case 17: _t->startAS(); break; + case 18: _t->stowAS(); break; + case 19: _t->stopAS(); break; + case 20: _t->setallactuators(); break; + case 21: _t->setradius(); break; + case 22: _t->setcircle(); break; + case 23: _t->setactuator(); break; + case 24: _t->changeGUIActuatorColor((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< bool(*)>(_a[3])),(*reinterpret_cast< bool(*)>(_a[4]))); break; + case 25: _t->changeGUIAllActuators((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 26: _t->changeGUIAllActuators(); break; + case 27: _t->changeGUIcircleORradius((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 28: _t->changeGUIcircleORradius(); break; + case 29: _t->changeGUIActuator((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 30: _t->changeGUIActuator(); break; + case 31: _t->changeGUIActuatorStatusEnblLabel(); break; + case 32: _t->changeGUIActuatorValues(); break; + case 33: _t->changeGUIActuatorStatusLabels(); break; + case 34: _t->changeGUIasStatusCode((*reinterpret_cast< int(*)>(_a[1]))); break; + case 35: _t->changeGUIasProfileCode((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +const QMetaObjectExtraData MedicinaActiveSurfaceGUI::staticMetaObjectExtraData = { + 0, qt_static_metacall +}; + const QMetaObject MedicinaActiveSurfaceGUI::staticMetaObject = { { &QWidget::staticMetaObject, qt_meta_stringdata_MedicinaActiveSurfaceGUI, - qt_meta_data_MedicinaActiveSurfaceGUI, 0 } + qt_meta_data_MedicinaActiveSurfaceGUI, &staticMetaObjectExtraData } }; +#ifdef Q_NO_DATA_RELOCATION +const QMetaObject &MedicinaActiveSurfaceGUI::getStaticMetaObject() { return staticMetaObject; } +#endif //Q_NO_DATA_RELOCATION + const QMetaObject *MedicinaActiveSurfaceGUI::metaObject() const { - return &staticMetaObject; + return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; } void *MedicinaActiveSurfaceGUI::qt_metacast(const char *_clname) @@ -117,45 +173,8 @@ int MedicinaActiveSurfaceGUI::qt_metacall(QMetaObject::Call _c, int _id, void ** if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { - switch (_id) { - case 0: Quit(); break; - case 1: move(); break; - case 2: correction(); break; - case 3: update(); break; - case 4: reset(); break; - case 5: stop(); break; - case 6: up(); break; - case 7: down(); break; - case 8: top(); break; - case 9: bottom(); break; - case 10: calibrate(); break; - case 11: calVer(); break; - case 12: stow(); break; - case 13: setup(); break; - case 14: refPos(); break; - case 15: recoverUSD(); break; - case 16: setupAS(); break; - case 17: startAS(); break; - case 18: stowAS(); break; - case 19: stopAS(); break; - case 20: setallactuators(); break; - case 21: setradius(); break; - case 22: setcircle(); break; - case 23: setactuator(); break; - case 24: changeGUIActuatorColor((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2])),(*reinterpret_cast< bool(*)>(_a[3])),(*reinterpret_cast< bool(*)>(_a[4]))); break; - case 25: changeGUIAllActuators((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 26: changeGUIAllActuators(); break; - case 27: changeGUIcircleORradius((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 28: changeGUIcircleORradius(); break; - case 29: changeGUIActuator((*reinterpret_cast< bool(*)>(_a[1]))); break; - case 30: changeGUIActuator(); break; - case 31: changeGUIActuatorStatusEnblLabel(); break; - case 32: changeGUIActuatorValues(); break; - case 33: changeGUIActuatorStatusLabels(); break; - case 34: changeGUIasStatusCode((*reinterpret_cast< int(*)>(_a[1]))); break; - case 35: changeGUIasProfileCode((*reinterpret_cast< int(*)>(_a[1]))); break; - default: ; - } + if (_id < 36) + qt_static_metacall(this, _c, _id, _a); _id -= 36; } return _id; -- GitLab From 38708a6a6815e89710406d8ecbe39f6f85e62df2 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Thu, 30 Jan 2025 14:02:57 +0000 Subject: [PATCH 134/150] Removed unnecessary script for CI --- .github/utils/upload_to_gdrive.py | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100755 .github/utils/upload_to_gdrive.py diff --git a/.github/utils/upload_to_gdrive.py b/.github/utils/upload_to_gdrive.py deleted file mode 100755 index a9cc1c674..000000000 --- a/.github/utils/upload_to_gdrive.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python -from google.oauth2.credentials import Credentials -from google.auth.transport.requests import Request -from googleapiclient.discovery import build -from googleapiclient.http import MediaFileUpload -import os - -TOKEN_FILE = 'token.json' -VM_FILE_PATH = '/home/runner/discos_manager.ova' -SCOPES = [ - 'https://www.googleapis.com/auth/drive', - 'https://www.googleapis.com/auth/drive.file' -] - -# Authenticate with the token and eventually update it -creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) -if creds.expired and creds.refresh_token: - creds.refresh(Request()) - -# Prepare the files to be uploaded -service = build('drive', 'v3', credentials=creds) -vm_media = MediaFileUpload(VM_FILE_PATH, resumable=True) -service.files().update( - fileId=os.environ.get('DEPLOYED_VM_GDRIVE_ID'), - media_body=vm_media, - fields='id' -).execute() - -# Finally update the token file -with open(TOKEN_FILE, 'w') as tokenfile: - tokenfile.write(creds.to_json()) -- GitLab From f3ce596f15ee133a49164eaa07908fed7b17e954 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 3 Feb 2025 15:43:41 +0100 Subject: [PATCH 135/150] Fix #899, added Outdated CDBs for each station (#900) * Reworked SRT CDBs * Reworked Medicina CDBs * Updated Outdated CDBs --- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR01/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR01/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR01/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR01/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR01/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR01/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR01/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR02/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR02/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR02/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR02/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR02/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR02/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR02/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR02/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR02/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR03/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR03/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR03/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR03/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR03/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR03/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR03/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR03/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR04/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR04/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR04/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR04/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR04/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR04/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR04/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR04/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR04/LAN12/LAN12.xml | 10 +- .../MedicinaActiveSurfaceContainer.xml | 2 +- .../MedicinaActiveSurfaceContainer01.xml | 2 +- .../MedicinaActiveSurfaceContainer02.xml | 2 +- .../MedicinaActiveSurfaceContainer03.xml | 2 +- .../MedicinaActiveSurfaceContainer04.xml | 2 +- Medicina/CDB/alma/AS/Boss/Boss.xml | 4 +- .../Components/AS/SECTOR01/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR01/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR01/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR01/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR01/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR01/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR01/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR01/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR01/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR01/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR01/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR01/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR02/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR02/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR02/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR02/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR02/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR02/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR02/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR02/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR02/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR02/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR02/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR02/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR03/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR03/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR03/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR03/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR03/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR03/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR03/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR03/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR03/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR03/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR03/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR03/LAN12/LAN12.xml | 10 +- .../Components/AS/SECTOR04/LAN01/LAN01.xml | 12 +- .../Components/AS/SECTOR04/LAN02/LAN02.xml | 10 +- .../Components/AS/SECTOR04/LAN03/LAN03.xml | 12 +- .../Components/AS/SECTOR04/LAN04/LAN04.xml | 10 +- .../Components/AS/SECTOR04/LAN05/LAN05.xml | 12 +- .../Components/AS/SECTOR04/LAN06/LAN06.xml | 10 +- .../Components/AS/SECTOR04/LAN07/LAN07.xml | 14 +- .../Components/AS/SECTOR04/LAN08/LAN08.xml | 10 +- .../Components/AS/SECTOR04/LAN09/LAN09.xml | 12 +- .../Components/AS/SECTOR04/LAN10/LAN10.xml | 10 +- .../Components/AS/SECTOR04/LAN11/LAN11.xml | 12 +- .../Components/AS/SECTOR04/LAN12/LAN12.xml | 10 +- .../MedicinaActiveSurfaceContainer.xml | 2 +- .../MedicinaActiveSurfaceContainer01.xml | 2 +- .../MedicinaActiveSurfaceContainer02.xml | 2 +- .../MedicinaActiveSurfaceContainer03.xml | 2 +- .../MedicinaActiveSurfaceContainer04.xml | 2 +- Medicina/Outdated/CDB/MACI/.gitignore | 1 + Medicina/Outdated/CDB/alma/.gitignore | 1 + .../NoiseGenerator/NoiseGenerator.xml | 0 Noto/Outdated/CDB/MACI/.gitignore | 1 + Noto/Outdated/CDB/alma/.gitignore | 1 + SRT/CDB/alma/BACKENDS/XBackends/XBackends.xml | 32 -- .../SRTLPBandReceiver/NoiseMark/NoiseMark.xml | 34 -- SRT/CDB/alma/MINORSERVO/PFP/PFP.xml | 41 -- SRT/CDB/alma/RECEIVERS/LO1/LO1.xml | 10 - SRT/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml | 11 - .../SRTIFDistributor/SRTIFDistributor.xml | 13 - .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 456 ------------------ .../NoiseGenerator/NoiseGenerator.xml | 29 -- .../NoiseGenerator/NoiseGenerator.xml | 29 -- .../Configuration/Configuration.xml | 61 --- .../SRTLPBandReceiver/Feeds/Feeds.xml | 21 - .../SRTLPBandReceiver/Modes/C1C1/C1C1.xml | 28 -- .../SRTLPBandReceiver/Modes/C1C2/C1C2.xml | 28 -- .../SRTLPBandReceiver/Modes/C1C3/C1C3.xml | 28 -- .../SRTLPBandReceiver/Modes/C1C4/C1C4.xml | 28 -- .../SRTLPBandReceiver/Modes/C1C5/C1C5.xml | 28 -- .../SRTLPBandReceiver/Modes/C1L1/C1L1.xml | 28 -- .../SRTLPBandReceiver/Modes/C1L2/C1L2.xml | 28 -- .../SRTLPBandReceiver/Modes/C1L3/C1L3.xml | 28 -- .../SRTLPBandReceiver/Modes/C1L4/C1L4.xml | 28 -- .../SRTLPBandReceiver/Modes/C1L5/C1L5.xml | 28 -- .../SRTLPBandReceiver/Modes/C1XX/C1XX.xml | 28 -- .../SRTLPBandReceiver/Modes/C2C1/C2C1.xml | 28 -- .../SRTLPBandReceiver/Modes/C2C2/C2C2.xml | 28 -- .../SRTLPBandReceiver/Modes/C2C3/C2C3.xml | 28 -- .../SRTLPBandReceiver/Modes/C2C4/C2C4.xml | 28 -- .../SRTLPBandReceiver/Modes/C2C5/C2C5.xml | 28 -- .../SRTLPBandReceiver/Modes/C2L1/C2L1.xml | 28 -- .../SRTLPBandReceiver/Modes/C2L2/C2L2.xml | 28 -- .../SRTLPBandReceiver/Modes/C2L3/C2L3.xml | 28 -- .../SRTLPBandReceiver/Modes/C2L4/C2L4.xml | 28 -- .../SRTLPBandReceiver/Modes/C2L5/C2L5.xml | 28 -- .../SRTLPBandReceiver/Modes/C2XX/C2XX.xml | 28 -- .../SRTLPBandReceiver/Modes/C3C1/C3C1.xml | 28 -- .../SRTLPBandReceiver/Modes/C3C2/C3C2.xml | 28 -- .../SRTLPBandReceiver/Modes/C3C3/C3C3.xml | 28 -- .../SRTLPBandReceiver/Modes/C3C4/C3C4.xml | 28 -- .../SRTLPBandReceiver/Modes/C3C5/C3C5.xml | 28 -- .../SRTLPBandReceiver/Modes/C3L1/C3L1.xml | 28 -- .../SRTLPBandReceiver/Modes/C3L2/C3L2.xml | 28 -- .../SRTLPBandReceiver/Modes/C3L3/C3L3.xml | 28 -- .../SRTLPBandReceiver/Modes/C3L4/C3L4.xml | 28 -- .../SRTLPBandReceiver/Modes/C3L5/C3L5.xml | 28 -- .../SRTLPBandReceiver/Modes/C3XX/C3XX.xml | 28 -- .../SRTLPBandReceiver/Modes/L1C1/L1C1.xml | 28 -- .../SRTLPBandReceiver/Modes/L1C2/L1C2.xml | 28 -- .../SRTLPBandReceiver/Modes/L1C3/L1C3.xml | 28 -- .../SRTLPBandReceiver/Modes/L1C4/L1C4.xml | 28 -- .../SRTLPBandReceiver/Modes/L1C5/L1C5.xml | 28 -- .../SRTLPBandReceiver/Modes/L1L1/L1L1.xml | 28 -- .../SRTLPBandReceiver/Modes/L1L2/L1L2.xml | 28 -- .../SRTLPBandReceiver/Modes/L1L3/L1L3.xml | 28 -- .../SRTLPBandReceiver/Modes/L1L4/L1L4.xml | 28 -- .../SRTLPBandReceiver/Modes/L1L5/L1L5.xml | 28 -- .../SRTLPBandReceiver/Modes/L1XX/L1XX.xml | 28 -- .../SRTLPBandReceiver/Modes/L2C1/L2C1.xml | 28 -- .../SRTLPBandReceiver/Modes/L2C2/L2C2.xml | 28 -- .../SRTLPBandReceiver/Modes/L2C3/L2C3.xml | 28 -- .../SRTLPBandReceiver/Modes/L2C4/L2C4.xml | 28 -- .../SRTLPBandReceiver/Modes/L2C5/L2C5.xml | 28 -- .../SRTLPBandReceiver/Modes/L2L1/L2L1.xml | 28 -- .../SRTLPBandReceiver/Modes/L2L2/L2L2.xml | 28 -- .../SRTLPBandReceiver/Modes/L2L3/L2L3.xml | 28 -- .../SRTLPBandReceiver/Modes/L2L4/L2L4.xml | 28 -- .../SRTLPBandReceiver/Modes/L2L5/L2L5.xml | 28 -- .../SRTLPBandReceiver/Modes/L2XX/L2XX.xml | 28 -- .../SRTLPBandReceiver/Modes/L3C1/L3C1.xml | 28 -- .../SRTLPBandReceiver/Modes/L3C2/L3C2.xml | 28 -- .../SRTLPBandReceiver/Modes/L3C3/L3C3.xml | 28 -- .../SRTLPBandReceiver/Modes/L3C4/L3C4.xml | 28 -- .../SRTLPBandReceiver/Modes/L3C5/L3C5.xml | 28 -- .../SRTLPBandReceiver/Modes/L3L1/L3L1.xml | 28 -- .../SRTLPBandReceiver/Modes/L3L2/L3L2.xml | 28 -- .../SRTLPBandReceiver/Modes/L3L3/L3L3.xml | 28 -- .../SRTLPBandReceiver/Modes/L3L4/L3L4.xml | 28 -- .../SRTLPBandReceiver/Modes/L3L5/L3L5.xml | 28 -- .../SRTLPBandReceiver/Modes/L3XX/L3XX.xml | 28 -- .../SRTLPBandReceiver/Modes/XXC1/XXC1.xml | 28 -- .../SRTLPBandReceiver/Modes/XXC2/XXC2.xml | 28 -- .../SRTLPBandReceiver/Modes/XXC3/XXC3.xml | 28 -- .../SRTLPBandReceiver/Modes/XXC4/XXC4.xml | 28 -- .../SRTLPBandReceiver/Modes/XXC5/XXC5.xml | 28 -- .../SRTLPBandReceiver/Modes/XXL1/XXL1.xml | 28 -- .../SRTLPBandReceiver/Modes/XXL2/XXL2.xml | 28 -- .../SRTLPBandReceiver/Modes/XXL3/XXL3.xml | 28 -- .../SRTLPBandReceiver/Modes/XXL4/XXL4.xml | 28 -- .../SRTLPBandReceiver/Modes/XXL5/XXL5.xml | 28 -- .../SRTLPBandReceiver/Modes/make_modes.py | 208 -------- .../Synthesizer/Synthesizer.xml | 22 - .../SRTLPBandReceiver/Taper/Taper.xml | 16 - SRT/Outdated/CDB/MACI/.gitignore | 1 + .../MACI/Components/BACKENDS/DXC2/DXC2.xml | 0 .../BACKENDS/Holography/Holography.xml | 0 .../NoiseGenerator/NoiseGenerator.xml | 0 .../BACKENDS/XBackends/XBackends.xml | 0 .../MACI/Components/MINORSERVO/PFP/PFP.xml | 0 .../MACI/Components/RECEIVERS/LO_LP/LO_LP.xml | 0 .../RECEIVERS}/LO_SBAND/LO_SBAND.xml | 0 .../SRTIFDistributor/SRTIFDistributor.xml | 0 .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 0 .../HolographyContainer.xml | 0 .../HolographyDXCContainer.xml | 0 .../LocalOscillatorLPContainer.xml | 0 .../LocalOscillatorsContainer.xml | 0 .../NoiseGeneratorContainer.xml | 0 .../PyIFDistributorContainer.xml | 0 .../SRTLPBandContainer/SRTLPBandContainer.xml | 0 .../MACI/Containers/XContainer/XContainer.xml | 0 SRT/Outdated/CDB/alma/.gitignore | 1 + .../ANTENNA/BossSimulator/BossSimulator.xml | 0 .../CDB/alma/BACKENDS/DXC2/DXC2.xml | 0 .../alma/BACKENDS/Holography/Holography.xml | 0 .../NoiseGenerator/NoiseGenerator.xml | 0 .../CDB/alma/BACKENDS/XBackends/XBackends.xml | 0 .../PFP/LookupTables/LookupTables.xml | 0 .../MinorServo/PFP/Properties/Properties.xml | 0 .../Configuration/Configuration.xml | 0 .../SRTIFDistributor14/Mapping/Mapping.xml | 0 .../SRTLPBandReceiver/Feeds/Feeds.xml | 0 .../SRTLPBandReceiver/Modes/C1C1/C1C1.xml | 0 .../SRTLPBandReceiver/Modes/C1C2/C1C2.xml | 0 .../SRTLPBandReceiver/Modes/C1C3/C1C3.xml | 0 .../SRTLPBandReceiver/Modes/C1C4/C1C4.xml | 0 .../SRTLPBandReceiver/Modes/C1C5/C1C5.xml | 0 .../SRTLPBandReceiver/Modes/C1L1/C1L1.xml | 0 .../SRTLPBandReceiver/Modes/C1L2/C1L2.xml | 0 .../SRTLPBandReceiver/Modes/C1L3/C1L3.xml | 0 .../SRTLPBandReceiver/Modes/C1L4/C1L4.xml | 0 .../SRTLPBandReceiver/Modes/C1L5/C1L5.xml | 0 .../SRTLPBandReceiver/Modes/C1XX/C1XX.xml | 0 .../SRTLPBandReceiver/Modes/C2C1/C2C1.xml | 0 .../SRTLPBandReceiver/Modes/C2C2/C2C2.xml | 0 .../SRTLPBandReceiver/Modes/C2C3/C2C3.xml | 0 .../SRTLPBandReceiver/Modes/C2C4/C2C4.xml | 0 .../SRTLPBandReceiver/Modes/C2C5/C2C5.xml | 0 .../SRTLPBandReceiver/Modes/C2L1/C2L1.xml | 0 .../SRTLPBandReceiver/Modes/C2L2/C2L2.xml | 0 .../SRTLPBandReceiver/Modes/C2L3/C2L3.xml | 0 .../SRTLPBandReceiver/Modes/C2L4/C2L4.xml | 0 .../SRTLPBandReceiver/Modes/C2L5/C2L5.xml | 0 .../SRTLPBandReceiver/Modes/C2XX/C2XX.xml | 0 .../SRTLPBandReceiver/Modes/C3C1/C3C1.xml | 0 .../SRTLPBandReceiver/Modes/C3C2/C3C2.xml | 0 .../SRTLPBandReceiver/Modes/C3C3/C3C3.xml | 0 .../SRTLPBandReceiver/Modes/C3C4/C3C4.xml | 0 .../SRTLPBandReceiver/Modes/C3C5/C3C5.xml | 0 .../SRTLPBandReceiver/Modes/C3L1/C3L1.xml | 0 .../SRTLPBandReceiver/Modes/C3L2/C3L2.xml | 0 .../SRTLPBandReceiver/Modes/C3L3/C3L3.xml | 0 .../SRTLPBandReceiver/Modes/C3L4/C3L4.xml | 0 .../SRTLPBandReceiver/Modes/C3L5/C3L5.xml | 0 .../SRTLPBandReceiver/Modes/C3XX/C3XX.xml | 0 .../SRTLPBandReceiver/Modes/L1C1/L1C1.xml | 0 .../SRTLPBandReceiver/Modes/L1C2/L1C2.xml | 0 .../SRTLPBandReceiver/Modes/L1C3/L1C3.xml | 0 .../SRTLPBandReceiver/Modes/L1C4/L1C4.xml | 0 .../SRTLPBandReceiver/Modes/L1C5/L1C5.xml | 0 .../SRTLPBandReceiver/Modes/L1L1/L1L1.xml | 0 .../SRTLPBandReceiver/Modes/L1L2/L1L2.xml | 0 .../SRTLPBandReceiver/Modes/L1L3/L1L3.xml | 0 .../SRTLPBandReceiver/Modes/L1L4/L1L4.xml | 0 .../SRTLPBandReceiver/Modes/L1L5/L1L5.xml | 0 .../SRTLPBandReceiver/Modes/L1XX/L1XX.xml | 0 .../SRTLPBandReceiver/Modes/L2C1/L2C1.xml | 0 .../SRTLPBandReceiver/Modes/L2C2/L2C2.xml | 0 .../SRTLPBandReceiver/Modes/L2C3/L2C3.xml | 0 .../SRTLPBandReceiver/Modes/L2C4/L2C4.xml | 0 .../SRTLPBandReceiver/Modes/L2C5/L2C5.xml | 0 .../SRTLPBandReceiver/Modes/L2L1/L2L1.xml | 0 .../SRTLPBandReceiver/Modes/L2L2/L2L2.xml | 0 .../SRTLPBandReceiver/Modes/L2L3/L2L3.xml | 0 .../SRTLPBandReceiver/Modes/L2L4/L2L4.xml | 0 .../SRTLPBandReceiver/Modes/L2L5/L2L5.xml | 0 .../SRTLPBandReceiver/Modes/L2XX/L2XX.xml | 0 .../SRTLPBandReceiver/Modes/L3C1/L3C1.xml | 0 .../SRTLPBandReceiver/Modes/L3C2/L3C2.xml | 0 .../SRTLPBandReceiver/Modes/L3C3/L3C3.xml | 0 .../SRTLPBandReceiver/Modes/L3C4/L3C4.xml | 0 .../SRTLPBandReceiver/Modes/L3C5/L3C5.xml | 0 .../SRTLPBandReceiver/Modes/L3L1/L3L1.xml | 0 .../SRTLPBandReceiver/Modes/L3L2/L3L2.xml | 0 .../SRTLPBandReceiver/Modes/L3L3/L3L3.xml | 0 .../SRTLPBandReceiver/Modes/L3L4/L3L4.xml | 0 .../SRTLPBandReceiver/Modes/L3L5/L3L5.xml | 0 .../SRTLPBandReceiver/Modes/L3XX/L3XX.xml | 0 .../Modes/SINGLEDISH/SINGLEDISH.xml | 0 .../SRTLPBandReceiver/Modes/VLBI/VLBI.xml | 0 .../SRTLPBandReceiver/Modes/XXC1/XXC1.xml | 0 .../SRTLPBandReceiver/Modes/XXC2/XXC2.xml | 0 .../SRTLPBandReceiver/Modes/XXC3/XXC3.xml | 0 .../SRTLPBandReceiver/Modes/XXC4/XXC4.xml | 0 .../SRTLPBandReceiver/Modes/XXC5/XXC5.xml | 0 .../SRTLPBandReceiver/Modes/XXL1/XXL1.xml | 0 .../SRTLPBandReceiver/Modes/XXL2/XXL2.xml | 0 .../SRTLPBandReceiver/Modes/XXL3/XXL3.xml | 0 .../SRTLPBandReceiver/Modes/XXL4/XXL4.xml | 0 .../SRTLPBandReceiver/Modes/XXL5/XXL5.xml | 0 .../SRTLPBandReceiver/Modes/make_modes.py | 0 .../SRTLPBandReceiver/NoiseMark/NoiseMark.xml | 0 .../Synthesizer/Synthesizer.xml | 0 .../SRTLPBandReceiver/Taper/Taper.xml | 0 .../SRTSBandMFReceiver/Feeds/Feeds.xml | 0 .../MarkCoefficients/MarkCoefficients.xml | 0 .../Modes/SINGLEDISH/SINGLEDISH.xml | 0 .../SRTSBandMFReceiver/Modes/VLBI/VLBI.xml | 0 .../Synthesizer/Synthesizer.xml | 0 .../SRTSBandMFReceiver/Taper/Taper.xml | 0 .../CDB/alma/RECEIVERS/LO1/LO1.xml | 0 .../CDB/alma/RECEIVERS/LO_LP/LO_LP.xml | 0 .../CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml | 0 .../SRTIFDistributor/SRTIFDistributor.xml | 0 .../SRTIFDistributor14/SRTIFDistributor14.xml | 0 .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 0 .../SRTSBandMFReceiver/SRTSBandMFReceiver.xml | 0 .../TestNamespace/Positioner/Positioner.xml | 0 .../Positioner00/Positioner00.xml | 0 .../Positioner01/Positioner01.xml | 0 .../Positioner02/Positioner02.xml | 0 .../Positioner03/Positioner03.xml | 0 331 files changed, 554 insertions(+), 3659 deletions(-) create mode 100644 Medicina/Outdated/CDB/MACI/.gitignore create mode 100644 Medicina/Outdated/CDB/alma/.gitignore rename Medicina/{ => Outdated}/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml (100%) create mode 100644 Noto/Outdated/CDB/MACI/.gitignore create mode 100644 Noto/Outdated/CDB/alma/.gitignore delete mode 100644 SRT/CDB/alma/BACKENDS/XBackends/XBackends.xml delete mode 100644 SRT/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml delete mode 100644 SRT/CDB/alma/MINORSERVO/PFP/PFP.xml delete mode 100644 SRT/CDB/alma/RECEIVERS/LO1/LO1.xml delete mode 100644 SRT/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml delete mode 100644 SRT/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml delete mode 100755 SRT/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml delete mode 100644 SRT/Configuration/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml delete mode 100644 SRT/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py delete mode 100644 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml delete mode 100755 SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml create mode 100644 SRT/Outdated/CDB/MACI/.gitignore rename SRT/{Configuration => Outdated}/CDB/MACI/Components/BACKENDS/DXC2/DXC2.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/BACKENDS/Holography/Holography.xml (100%) rename {Medicina/Configuration/CDB/alma => SRT/Outdated/CDB/MACI/Components}/BACKENDS/NoiseGenerator/NoiseGenerator.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml (100%) rename SRT/{CDB/MACI/Components => Outdated/CDB/MACI/Components/RECEIVERS}/LO_SBAND/LO_SBAND.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/MACI/Containers/XContainer/XContainer.xml (100%) create mode 100644 SRT/Outdated/CDB/alma/.gitignore rename SRT/{ => Outdated}/CDB/alma/ANTENNA/BossSimulator/BossSimulator.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/BACKENDS/DXC2/DXC2.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/BACKENDS/Holography/Holography.xml (100%) rename SRT/{ => Outdated}/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/BACKENDS/XBackends/XBackends.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTIFDistributor14/Mapping/Mapping.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/SINGLEDISH/SINGLEDISH.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/VLBI/VLBI.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml (100%) rename SRT/{ => Outdated}/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/Feeds/Feeds.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/MarkCoefficients/MarkCoefficients.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/SINGLEDISH/SINGLEDISH.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/VLBI/VLBI.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/Synthesizer/Synthesizer.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/DataBlock/SRTSBandMFReceiver/Taper/Taper.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/RECEIVERS/LO1/LO1.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml (100%) rename SRT/{ => Outdated}/CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml (100%) rename SRT/{ => Outdated}/CDB/alma/RECEIVERS/SRTIFDistributor14/SRTIFDistributor14.xml (100%) rename SRT/{Configuration => Outdated}/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml (100%) rename SRT/{ => Outdated}/CDB/alma/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml (100%) rename SRT/{ => Outdated}/CDB/alma/TestNamespace/Positioner/Positioner.xml (100%) rename SRT/{ => Outdated}/CDB/alma/TestNamespace/Positioner00/Positioner00.xml (100%) rename SRT/{ => Outdated}/CDB/alma/TestNamespace/Positioner01/Positioner01.xml (100%) rename SRT/{ => Outdated}/CDB/alma/TestNamespace/Positioner02/Positioner02.xml (100%) rename SRT/{ => Outdated}/CDB/alma/TestNamespace/Positioner03/Positioner03.xml (100%) diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml index b731bc5f2..bbe97f872 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index d431b18f6..ee657b93e 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index baa2b0e94..e7a13dad9 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index 87e72a6e0..43c71c39b 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index 1a58647b4..98d4e65e4 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index 8109d4b9a..7b05fabe0 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index 890eed68d..8335432c9 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index d5f96ee09..19ee8a30d 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index 391b9704e..39dfaf014 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index 87dd01511..203e82ba2 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index dd76e40df..e7d027452 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index a0616d642..0f1f87771 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index 956741b1d..853178ff1 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index e24bbd38d..937a69734 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index f43bcfe8d..1f21c92ab 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index aa56f71c9..ed0f1c208 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 2cacfccbb..a81d3a278 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index e1fa8d036..1796ff38d 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index f6d0a4f64..56affd411 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index 104be2efe..a08378c74 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index 4dc436b35..8d88f2866 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index c544bb661..30b69e097 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index 6f4663cb4..98e722282 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index 54f04d1e6..28ddc74b2 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 8cc2514a7..8fda36ea5 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index 2930fd549..82cbb8b87 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index dec50ed50..1ded634d5 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index 2b7de7b3e..71a15facb 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index 2b7388648..e781a84a9 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index e5d2ec2f6..9498f0415 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index 19ea4d0ea..bffcb99a3 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index 7d473ed93..a9c92f964 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index 091eab441..1d4e0a1d4 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index 8849be343..740115c05 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index 64f8ff2fb..d361fefa6 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index 6f12e020f..00de5dd7b 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index 1c80c6513..df5dc602b 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index 3a726ace1..d1107a5ac 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index 8970cfae2..11a3dde61 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index c5d8eb7b5..1041a83ae 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index aff7ae2c1..3011f8e99 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index 88763b92a..43b42d3a5 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index 560436cc0..8268c02cb 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index 60e4181b6..8374e04d3 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index 823f6d8f6..a1106f3a3 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index 1a3f3c0ba..e5358b366 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 91b503685..4f25815de 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 13e8c9991..2ca8a2c8d 100644 --- a/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/Medicina/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml b/Medicina/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml index 8dfd82ea8..749ef249b 100644 --- a/Medicina/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml +++ b/Medicina/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml @@ -11,7 +11,7 @@ ServerThreads="5"> - + - + - + - + - + - + - \ No newline at end of file + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml index b731bc5f2..bbe97f872 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml index d431b18f6..ee657b93e 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml index baa2b0e94..e7a13dad9 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml index 87e72a6e0..43c71c39b 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml index 1a58647b4..98d4e65e4 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml index 8109d4b9a..7b05fabe0 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml index 890eed68d..8335432c9 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml index d5f96ee09..19ee8a30d 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml index 391b9704e..39dfaf014 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml index 87dd01511..203e82ba2 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml index dd76e40df..e7d027452 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml index a0616d642..0f1f87771 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR01/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml index 1ffef9e34..4bdf9f755 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml index ffa584111..1556f12e8 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer01" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml index f43bcfe8d..1f21c92ab 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml index aa56f71c9..ed0f1c208 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml index 2cacfccbb..a81d3a278 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml index e1fa8d036..1796ff38d 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml index f6d0a4f64..56affd411 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml index 104be2efe..a08378c74 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml index 4dc436b35..8d88f2866 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml index c544bb661..30b69e097 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml index 6f4663cb4..98e722282 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml index 54f04d1e6..28ddc74b2 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR02/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer02" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml index 8cc2514a7..8fda36ea5 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml index 2930fd549..82cbb8b87 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml index dec50ed50..1ded634d5 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml index 2b7de7b3e..71a15facb 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml index 2b7388648..e781a84a9 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml index e5d2ec2f6..9498f0415 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml index 19ea4d0ea..bffcb99a3 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml index 7d473ed93..a9c92f964 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml index 091eab441..1d4e0a1d4 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml index 8849be343..740115c05 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml index 64f8ff2fb..d361fefa6 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml index 6f12e020f..00de5dd7b 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR03/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer03" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml index 1c80c6513..df5dc602b 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN01/LAN01.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN01" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml index 3a726ace1..d1107a5ac 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN02/LAN02.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN02" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml index 8970cfae2..11a3dde61 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN03/LAN03.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN03" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml index c5d8eb7b5..1041a83ae 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN04/LAN04.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN04" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml index aff7ae2c1..3011f8e99 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN05/LAN05.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN05" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml index 88763b92a..43b42d3a5 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN06/LAN06.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN06" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml index 560436cc0..8268c02cb 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN07/LAN07.xml @@ -4,12 +4,12 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN07" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD07" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml index 60e4181b6..8374e04d3 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN08/LAN08.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN08" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml index 823f6d8f6..a1106f3a3 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN09/LAN09.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN09" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml index 1a3f3c0ba..e5358b366 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN10/LAN10.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN10" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml index 91b503685..4f25815de 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN11/LAN11.xml @@ -4,11 +4,11 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN11" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD01" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml index 13e8c9991..2ca8a2c8d 100644 --- a/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml +++ b/Medicina/Configuration/CDB/MACI/Components/AS/SECTOR04/LAN12/LAN12.xml @@ -4,10 +4,10 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="LAN12" Code="lanImpl" Type="IDL:alma/ActiveSurface/lan:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"> - <_ Name="USD02" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD03" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD04" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD05" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> - <_ Name="USD06" Code="ActiveSurfaceUSDImpl" Type="IDL:alma/ActiveSurface/USD:1.0" Container="MedicinaActiveSurfaceContainer04" ImplLang="cpp"/> + + + + + diff --git a/Medicina/Configuration/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml b/Medicina/Configuration/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml index 8dfd82ea8..749ef249b 100644 --- a/Medicina/Configuration/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml +++ b/Medicina/Configuration/CDB/MACI/Containers/MedicinaActiveSurfaceContainer/MedicinaActiveSurfaceContainer.xml @@ -11,7 +11,7 @@ ServerThreads="5"> - + - + - + - + - + - - - diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml b/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml deleted file mode 100644 index 73548c457..000000000 --- a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - -0LEFT310.03.40 -0LEFT330.03.87 -0LEFT350.04.31 -0LEFT380.04.81 -0LEFT410.05.64 - -0RIGHT310.03.53 -0RIGHT330.04.17 -0RIGHT350.04.71 -0RIGHT380.05.58 -0RIGHT410.06.33 - -1LEFT1300.01.73 -1LEFT1400.01.65 -1LEFT1500.01.89 -1LEFT1600.02.15 -1LEFT1700.01.97 -1LEFT1800.02.28 - -1RIGHT1300.01.50 -1RIGHT1400.01.39 -1RIGHT1500.01.59 -1RIGHT1600.01.60 -1RIGHT1700.01.88 -1RIGHT1800.02.11 - - diff --git a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml deleted file mode 100644 index 5503ee2fd..000000000 --- a/SRT/CDB/alma/MINORSERVO/PFP/PFP.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SRT/CDB/alma/RECEIVERS/LO1/LO1.xml b/SRT/CDB/alma/RECEIVERS/LO1/LO1.xml deleted file mode 100644 index 657c8defb..000000000 --- a/SRT/CDB/alma/RECEIVERS/LO1/LO1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/SRT/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml b/SRT/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml deleted file mode 100644 index d8351a7e5..000000000 --- a/SRT/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/SRT/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml b/SRT/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml deleted file mode 100644 index d91a8cd08..000000000 --- a/SRT/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/SRT/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml deleted file mode 100755 index 31ba32dd6..000000000 --- a/SRT/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml +++ /dev/null @@ -1,456 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SRT/Configuration/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/Configuration/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml deleted file mode 100644 index 6f206ea78..000000000 --- a/SRT/Configuration/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml deleted file mode 100644 index 6f206ea78..000000000 --- a/SRT/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml deleted file mode 100755 index 51fb4fa2c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - LO-DEFAULT - - 0 - 1 - 2300.0 - - - - BW-NARROW - - 1 - 0 - - - 2 - 0 - - - - BW-MEDIUM - - 1 - 1 - - - 2 - 1 - - - - BW-WIDE - - 1 - 2 - - - 2 - 2 - - - - BW-UNFILTERED - - 1 - 3 - - - 2 - 3 - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml deleted file mode 100755 index 822569380..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 0 - 0.0 - 0.0 - 1.0 - - - - 1 - 0.0 - 0.0 - 1.0 - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml deleted file mode 100755 index 84efd5a14..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml deleted file mode 100755 index 486dbda00..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml deleted file mode 100755 index 96c8bbfa3..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml deleted file mode 100755 index 27538375d..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml deleted file mode 100755 index 3c1fed631..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml deleted file mode 100755 index ee724029f..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml deleted file mode 100755 index ef198849a..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml deleted file mode 100755 index 258a99af9..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml deleted file mode 100755 index 2e9b081ca..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml deleted file mode 100755 index e54d1e4bf..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml deleted file mode 100755 index 7a99b4df4..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml deleted file mode 100755 index 1176a6c82..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml deleted file mode 100755 index 3b1864465..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml deleted file mode 100755 index bf0b3bb04..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml deleted file mode 100755 index 11821495d..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml deleted file mode 100755 index 5bfd21a59..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml deleted file mode 100755 index 5cd5f7c22..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml deleted file mode 100755 index e5644e90c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml deleted file mode 100755 index 193a868d7..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml deleted file mode 100755 index 926adb8fd..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml deleted file mode 100755 index 0095de270..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml deleted file mode 100755 index bbf5eef3f..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml deleted file mode 100755 index aa0ed2acd..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml deleted file mode 100755 index b0cf43e30..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml deleted file mode 100755 index b759bdc87..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml deleted file mode 100755 index d6f9a64f2..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml deleted file mode 100755 index 6d2ff7b6d..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml deleted file mode 100755 index 92d133b12..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml deleted file mode 100755 index efc49c516..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml deleted file mode 100755 index 80d52142e..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml deleted file mode 100755 index ad7c48bd4..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml deleted file mode 100755 index 3efc4df4c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml deleted file mode 100755 index bcb5bc99d..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml deleted file mode 100755 index ba4961e9e..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml deleted file mode 100755 index 99547746c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml deleted file mode 100755 index e0a0dae8a..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml deleted file mode 100755 index 4e7aeea44..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml deleted file mode 100755 index 9319a10bf..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml deleted file mode 100755 index 725282b04..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml deleted file mode 100755 index 1d22139d7..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml deleted file mode 100755 index 8509452ae..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml deleted file mode 100755 index 0ea4504a9..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml deleted file mode 100755 index ca18f637b..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml deleted file mode 100755 index 0e9a1265e..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml deleted file mode 100755 index 11ea5d837..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml deleted file mode 100755 index 0aebdfc9a..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml deleted file mode 100755 index 4759629e3..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml deleted file mode 100755 index 35941cc4b..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml deleted file mode 100755 index 5a71cc9bd..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml deleted file mode 100755 index 965f288f5..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml deleted file mode 100755 index 5246e2c67..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml deleted file mode 100755 index 499981212..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml deleted file mode 100755 index e187d9c24..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml deleted file mode 100755 index d92449d7b..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml deleted file mode 100755 index 6cf6a3d80..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml deleted file mode 100755 index 3da871496..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml deleted file mode 100755 index d529c01e7..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml deleted file mode 100755 index cd7f901ac..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml deleted file mode 100755 index 298787cb0..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml deleted file mode 100755 index e9ba2b21f..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml deleted file mode 100755 index f3bb74695..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml deleted file mode 100755 index 888c4be95..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml deleted file mode 100755 index b5677847c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml deleted file mode 100755 index 84b1cdb86..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml deleted file mode 100755 index a7b81c097..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml deleted file mode 100755 index 048c849e3..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml deleted file mode 100755 index ac82399fd..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml deleted file mode 100755 index dad909161..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml deleted file mode 100755 index c3987d50a..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml deleted file mode 100755 index 612d1e291..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml deleted file mode 100755 index d3b3bfaec..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml deleted file mode 100755 index 5d1c6d0eb..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml deleted file mode 100755 index 88698ade9..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml deleted file mode 100755 index d7046bc61..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml deleted file mode 100755 index b19421f85..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml deleted file mode 100755 index 58d03bb99..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py deleted file mode 100755 index 8b18f3181..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py +++ /dev/null @@ -1,208 +0,0 @@ -""" -This script makes for each mode its directory and .xml file (Python 3.3 or higher) - -Each mode is composed by 4 characters, that indicate respectively the: - - - P band polarization (*, L, C) - - P band filter ID (1, 2, 3): - * 1 -> all band filter, 305-410 no filter - * 2 -> 310-350 MHz - * 3 -> 305-410 MHz (band-pass filter) - - L band polarization (three character choices: *, L, C) - - L band filter ID (1, 2, 3, 4, 5): - * 1 -> all band filter, 1300-1800 no filter - * 2 -> 1320-1780 MHz - * 3 -> 1350-1450 MHz (VLBI) - * 4 -> 1300-1800 MHz (band-pass) - * 5 -> 1625-1715 MHz (VLBI) - -For instance, the code C1L2 means: - - - Circular polarization of the P band - - Filter n.1 of the P band - - Linear polarization of the L band - - Filter n.2 of the L band - -The * character means the corresponding value should not change. -For instance, the code *1** means: - - - Do not change the polarization of the P band - - Filter n.1 of the P band - - Do not change the polarization of the L band - - Do not change the filter of the L band - -It is possible to use only one receiver. In the case the observer want to -use the P band, the 2 characters of the mode related to the L band are "X". -For instance, if we want to use a P band in circular polarization, with the -filter n.2, the mode will be C2XX. -""" - -import os - -pband_filters = { - 1: (305.0, 410.0), # all band filter, 305-410 no filter - 2: (310.0, 350.0), # 310-350 MHz - 3: (305.0, 410.0) # 305-410 MHz (band-pass filter) -} - -lband_filters = { - 1: (1300.0, 1800.0), # all band filter, 1300-1800 no filter - 2: (1320.0, 1780.0), # 1320-1780 MHz - 3: (1350.0, 1450.0), # 1350-1450 MHz (VLBI) - 4: (1300.0, 1800.0), # 1300-1800 MHz (band-pass) - 5: (1625.0, 1715.0) # 1625-1715 MHz (VLBI) -} - -formatter = { - 'default_lo': 2324.0, - 'fixed_lo': 0.0, - 'lo_min': 0.0, - 'lo_max': 3000.0, - 'lpfilter_min': 0.0, - 'lpfilter_max': 1000.0, -} - - -for pband_pol in 'LC': - for lband_pol in 'LC': - for pid, pband in pband_filters.items(): - for lid, lband in lband_filters.items(): - code = "%s%s%s%s" %(pband_pol, pid, lband_pol, lid) - formatter['code'] = code - formatter['pband_pol'] = 'L R' if pband_pol == 'C' else 'H V' - formatter['lband_pol'] = 'L R' if lband_pol == 'C' else 'H V' - formatter['pband_rf_min'] = pband[0] - formatter['pband_rf_max'] = pband[1] - formatter['lband_rf_min'] = lband[0] - formatter['lband_rf_max'] = lband[1] - formatter['pband_filter_id'] = pid - formatter['lband_filter_id'] = lid - file_name = os.path.join(code, code + '.xml') - os.mkdir(code) - outfile = open(os.path.join(code, code + '.xml'), 'w') - text = """ - - - """.format_map(formatter) - lines = [line.lstrip() + '\n' for line in text.split('\n')] - outfile.writelines(lines) - - -pband_code = 'X' -for lband_pol in 'LC': - for lid, lband in lband_filters.items(): - code = "%s%s%s%s" %(pband_code, pband_code, lband_pol, lid) - formatter['code'] = code - formatter['pband_pol'] = 'L R' - formatter['lband_pol'] = 'L R' if lband_pol == 'C' else 'H V' - formatter['pband_rf_min'] = 305.0 - formatter['pband_rf_max'] = 410.0 - formatter['lband_rf_min'] = lband[0] - formatter['lband_rf_max'] = lband[1] - formatter['pband_filter_id'] = 1 - formatter['lband_filter_id'] = lid - file_name = os.path.join(code, code + '.xml') - os.mkdir(code) - outfile = open(os.path.join(code, code + '.xml'), 'w') - text = """ - - - """.format_map(formatter) - lines = [line.lstrip() + '\n' for line in text.split('\n')] - outfile.writelines(lines) - - -lband_code = 'X' -for pband_pol in 'LC': - for pid, pband in pband_filters.items(): - code = "%s%s%s%s" %(pband_pol, pid, lband_code, lband_code) - formatter['code'] = code - formatter['pband_pol'] = 'L R' if pband_pol == 'C' else 'H V' - formatter['lband_pol'] = 'L R' - formatter['pband_rf_min'] = pband[0] - formatter['pband_rf_max'] = pband[1] - formatter['lband_rf_min'] = 1300.0 - formatter['lband_rf_max'] = 1800.0 - formatter['pband_filter_id'] = pid - formatter['lband_filter_id'] = 1 - file_name = os.path.join(code, code + '.xml') - os.mkdir(code) - outfile = open(os.path.join(code, code + '.xml'), 'w') - text = """ - - - """.format_map(formatter) - lines = [line.lstrip() + '\n' for line in text.split('\n')] - outfile.writelines(lines) diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml deleted file mode 100644 index 83793c03b..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - -0.019.0 - -400.019.0 - -800.019.0 - -1200.019.0 - -1600.019.0 - -2000.019.0 - -2400.019.0 - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml b/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml deleted file mode 100755 index abcfab1de..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - -0300-13.0 -0350-15.0 -0410-17.0 - -11300-15.0 -11550-14.0 -11800-17.0 - - diff --git a/SRT/Outdated/CDB/MACI/.gitignore b/SRT/Outdated/CDB/MACI/.gitignore new file mode 100644 index 000000000..f83a0eb46 --- /dev/null +++ b/SRT/Outdated/CDB/MACI/.gitignore @@ -0,0 +1 @@ +# This file only exists here in order to prevent the directory from being ignored by git if empty diff --git a/SRT/Configuration/CDB/MACI/Components/BACKENDS/DXC2/DXC2.xml b/SRT/Outdated/CDB/MACI/Components/BACKENDS/DXC2/DXC2.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/BACKENDS/DXC2/DXC2.xml rename to SRT/Outdated/CDB/MACI/Components/BACKENDS/DXC2/DXC2.xml diff --git a/SRT/Configuration/CDB/MACI/Components/BACKENDS/Holography/Holography.xml b/SRT/Outdated/CDB/MACI/Components/BACKENDS/Holography/Holography.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/BACKENDS/Holography/Holography.xml rename to SRT/Outdated/CDB/MACI/Components/BACKENDS/Holography/Holography.xml diff --git a/Medicina/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/Outdated/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml similarity index 100% rename from Medicina/Configuration/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml rename to SRT/Outdated/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml diff --git a/SRT/Configuration/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml b/SRT/Outdated/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml rename to SRT/Outdated/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml rename to SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml diff --git a/SRT/CDB/MACI/Components/LO_SBAND/LO_SBAND.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/LO_SBAND/LO_SBAND.xml similarity index 100% rename from SRT/CDB/MACI/Components/LO_SBAND/LO_SBAND.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/LO_SBAND/LO_SBAND.xml diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml diff --git a/SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml b/SRT/Outdated/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml b/SRT/Outdated/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml b/SRT/Outdated/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml b/SRT/Outdated/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml b/SRT/Outdated/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml b/SRT/Outdated/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml b/SRT/Outdated/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml diff --git a/SRT/Configuration/CDB/MACI/Containers/XContainer/XContainer.xml b/SRT/Outdated/CDB/MACI/Containers/XContainer/XContainer.xml similarity index 100% rename from SRT/Configuration/CDB/MACI/Containers/XContainer/XContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/XContainer/XContainer.xml diff --git a/SRT/Outdated/CDB/alma/.gitignore b/SRT/Outdated/CDB/alma/.gitignore new file mode 100644 index 000000000..f83a0eb46 --- /dev/null +++ b/SRT/Outdated/CDB/alma/.gitignore @@ -0,0 +1 @@ +# This file only exists here in order to prevent the directory from being ignored by git if empty diff --git a/SRT/CDB/alma/ANTENNA/BossSimulator/BossSimulator.xml b/SRT/Outdated/CDB/alma/ANTENNA/BossSimulator/BossSimulator.xml similarity index 100% rename from SRT/CDB/alma/ANTENNA/BossSimulator/BossSimulator.xml rename to SRT/Outdated/CDB/alma/ANTENNA/BossSimulator/BossSimulator.xml diff --git a/SRT/Configuration/CDB/alma/BACKENDS/DXC2/DXC2.xml b/SRT/Outdated/CDB/alma/BACKENDS/DXC2/DXC2.xml similarity index 100% rename from SRT/Configuration/CDB/alma/BACKENDS/DXC2/DXC2.xml rename to SRT/Outdated/CDB/alma/BACKENDS/DXC2/DXC2.xml diff --git a/SRT/Configuration/CDB/alma/BACKENDS/Holography/Holography.xml b/SRT/Outdated/CDB/alma/BACKENDS/Holography/Holography.xml similarity index 100% rename from SRT/Configuration/CDB/alma/BACKENDS/Holography/Holography.xml rename to SRT/Outdated/CDB/alma/BACKENDS/Holography/Holography.xml diff --git a/SRT/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/Outdated/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml similarity index 100% rename from SRT/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml rename to SRT/Outdated/CDB/alma/BACKENDS/NoiseGenerator/NoiseGenerator.xml diff --git a/SRT/Configuration/CDB/alma/BACKENDS/XBackends/XBackends.xml b/SRT/Outdated/CDB/alma/BACKENDS/XBackends/XBackends.xml similarity index 100% rename from SRT/Configuration/CDB/alma/BACKENDS/XBackends/XBackends.xml rename to SRT/Outdated/CDB/alma/BACKENDS/XBackends/XBackends.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml rename to SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml rename to SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml diff --git a/SRT/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTIFDistributor/Configuration/Configuration.xml diff --git a/SRT/CDB/alma/DataBlock/SRTIFDistributor14/Mapping/Mapping.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTIFDistributor14/Mapping/Mapping.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTIFDistributor14/Mapping/Mapping.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTIFDistributor14/Mapping/Mapping.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Feeds/Feeds.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C1/C1C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C2/C1C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C3/C1C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C4/C1C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1C5/C1C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L1/C1L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L2/C1L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L3/C1L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L4/C1L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1L5/C1L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C1XX/C1XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C1/C2C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C2/C2C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C3/C2C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C4/C2C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2C5/C2C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L1/C2L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L2/C2L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L3/C2L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L4/C2L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2L5/C2L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C2XX/C2XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C1/C3C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C2/C3C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C3/C3C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C4/C3C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3C5/C3C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L1/C3L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L2/C3L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L3/C3L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L4/C3L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3L5/C3L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/C3XX/C3XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C1/L1C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C2/L1C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C3/L1C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C4/L1C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1C5/L1C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L1/L1L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L2/L1L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L3/L1L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L4/L1L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1L5/L1L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L1XX/L1XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C1/L2C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C2/L2C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C3/L2C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C4/L2C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2C5/L2C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L1/L2L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L2/L2L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L3/L2L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L4/L2L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2L5/L2L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L2XX/L2XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C1/L3C1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C2/L3C2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C3/L3C3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C4/L3C4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3C5/L3C5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L1/L3L1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L2/L3L2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L3/L3L3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L4/L3L4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3L5/L3L5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/L3XX/L3XX.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/SINGLEDISH/SINGLEDISH.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/SINGLEDISH/SINGLEDISH.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/SINGLEDISH/SINGLEDISH.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/SINGLEDISH/SINGLEDISH.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/VLBI/VLBI.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/VLBI/VLBI.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/VLBI/VLBI.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/VLBI/VLBI.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC1/XXC1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC2/XXC2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC3/XXC3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC4/XXC4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXC5/XXC5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL1/XXL1.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL2/XXL2.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL3/XXL3.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL4/XXL4.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/XXL5/XXL5.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Modes/make_modes.py diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/NoiseMark/NoiseMark.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Synthesizer/Synthesizer.xml diff --git a/SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml similarity index 100% rename from SRT/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTLPBandReceiver/Taper/Taper.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Feeds/Feeds.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Feeds/Feeds.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Feeds/Feeds.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Feeds/Feeds.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/MarkCoefficients/MarkCoefficients.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/MarkCoefficients/MarkCoefficients.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/MarkCoefficients/MarkCoefficients.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/MarkCoefficients/MarkCoefficients.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/SINGLEDISH/SINGLEDISH.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/SINGLEDISH/SINGLEDISH.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/SINGLEDISH/SINGLEDISH.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/SINGLEDISH/SINGLEDISH.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/VLBI/VLBI.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/VLBI/VLBI.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/VLBI/VLBI.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Modes/VLBI/VLBI.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Synthesizer/Synthesizer.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Synthesizer/Synthesizer.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Synthesizer/Synthesizer.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Synthesizer/Synthesizer.xml diff --git a/SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Taper/Taper.xml b/SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Taper/Taper.xml similarity index 100% rename from SRT/Configuration/CDB/alma/DataBlock/SRTSBandMFReceiver/Taper/Taper.xml rename to SRT/Outdated/CDB/alma/DataBlock/SRTSBandMFReceiver/Taper/Taper.xml diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/LO1/LO1.xml b/SRT/Outdated/CDB/alma/RECEIVERS/LO1/LO1.xml similarity index 100% rename from SRT/Configuration/CDB/alma/RECEIVERS/LO1/LO1.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/LO1/LO1.xml diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml b/SRT/Outdated/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml similarity index 100% rename from SRT/Configuration/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/LO_LP/LO_LP.xml diff --git a/SRT/CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml b/SRT/Outdated/CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml similarity index 100% rename from SRT/CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/LO_SBAND/LO_SBAND.xml diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml b/SRT/Outdated/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml similarity index 100% rename from SRT/Configuration/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml diff --git a/SRT/CDB/alma/RECEIVERS/SRTIFDistributor14/SRTIFDistributor14.xml b/SRT/Outdated/CDB/alma/RECEIVERS/SRTIFDistributor14/SRTIFDistributor14.xml similarity index 100% rename from SRT/CDB/alma/RECEIVERS/SRTIFDistributor14/SRTIFDistributor14.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/SRTIFDistributor14/SRTIFDistributor14.xml diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/Outdated/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml similarity index 100% rename from SRT/Configuration/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml diff --git a/SRT/CDB/alma/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml b/SRT/Outdated/CDB/alma/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml similarity index 100% rename from SRT/CDB/alma/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml rename to SRT/Outdated/CDB/alma/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml diff --git a/SRT/CDB/alma/TestNamespace/Positioner/Positioner.xml b/SRT/Outdated/CDB/alma/TestNamespace/Positioner/Positioner.xml similarity index 100% rename from SRT/CDB/alma/TestNamespace/Positioner/Positioner.xml rename to SRT/Outdated/CDB/alma/TestNamespace/Positioner/Positioner.xml diff --git a/SRT/CDB/alma/TestNamespace/Positioner00/Positioner00.xml b/SRT/Outdated/CDB/alma/TestNamespace/Positioner00/Positioner00.xml similarity index 100% rename from SRT/CDB/alma/TestNamespace/Positioner00/Positioner00.xml rename to SRT/Outdated/CDB/alma/TestNamespace/Positioner00/Positioner00.xml diff --git a/SRT/CDB/alma/TestNamespace/Positioner01/Positioner01.xml b/SRT/Outdated/CDB/alma/TestNamespace/Positioner01/Positioner01.xml similarity index 100% rename from SRT/CDB/alma/TestNamespace/Positioner01/Positioner01.xml rename to SRT/Outdated/CDB/alma/TestNamespace/Positioner01/Positioner01.xml diff --git a/SRT/CDB/alma/TestNamespace/Positioner02/Positioner02.xml b/SRT/Outdated/CDB/alma/TestNamespace/Positioner02/Positioner02.xml similarity index 100% rename from SRT/CDB/alma/TestNamespace/Positioner02/Positioner02.xml rename to SRT/Outdated/CDB/alma/TestNamespace/Positioner02/Positioner02.xml diff --git a/SRT/CDB/alma/TestNamespace/Positioner03/Positioner03.xml b/SRT/Outdated/CDB/alma/TestNamespace/Positioner03/Positioner03.xml similarity index 100% rename from SRT/CDB/alma/TestNamespace/Positioner03/Positioner03.xml rename to SRT/Outdated/CDB/alma/TestNamespace/Positioner03/Positioner03.xml -- GitLab From 7978abec65a50e73b5afbc477f39737cdd4d92a7 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 10 Feb 2025 20:13:03 +0100 Subject: [PATCH 136/150] Fix #904, fixed `Schedule` ELEVATIONLIMITS (#905) --- Common/Servers/Scheduler/src/Schedule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Common/Servers/Scheduler/src/Schedule.cpp b/Common/Servers/Scheduler/src/Schedule.cpp index 056b3673e..60c1c9775 100644 --- a/Common/Servers/Scheduler/src/Schedule.cpp +++ b/Common/Servers/Scheduler/src/Schedule.cpp @@ -23,7 +23,7 @@ using namespace Schedule; #define BACKENDLIST "BACKENDLIST:" #define MODE "MODE:" #define SCANTAG "SCANTAG:" -#define ELEVATIONLIMITS "ELEVATIONLIMITS" +#define ELEVATIONLIMITS "ELEVATIONLIMITS:" #define INITPROC "INITPROC:" #define SCAN_START "SC:" -- GitLab From 32ce82f2f56545ee64c13b3cc5910c416e014a10 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 19 Feb 2025 15:08:08 +0100 Subject: [PATCH 137/150] Fix #908, sped up compilation of ActiveSurfaceGUIClient(s) (#909) * Fix #908, sped up compilation of SRTActiveSurfaceGUIClient(s) * Fix #908, modified Medicina and Noto lines as well --- Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/Makefile | 4 ++-- .../src/MedicinaActiveSurfaceManagementGUIui.cpp | 1 - Noto/Clients/NotoActiveSurfaceGUIClient/src/Makefile | 4 ++-- .../src/NotoActiveSurfaceManagementGUIui.cpp | 1 - SRT/Clients/SRTActiveSurfaceGUIClient/src/Makefile | 4 ++-- .../src/SRTActiveSurfaceManagementGUIui.cpp | 1 - 6 files changed, 6 insertions(+), 9 deletions(-) delete mode 120000 Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceManagementGUIui.cpp delete mode 120000 Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceManagementGUIui.cpp delete mode 120000 SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceManagementGUIui.cpp diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/Makefile b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/Makefile index f283919ff..0654fb0dc 100644 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/Makefile +++ b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/Makefile @@ -134,9 +134,9 @@ QT_COMPILE_FILES = $(subst .cpp,,$(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) # # -MedicinaActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) MedicinaActiveSurfaceGUIui MedicinaActiveSurfaceCore MedicinaActiveSurfaceClientEventLoop MedicinaActiveSurfaceGUIClient +MedicinaActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) MedicinaActiveSurfaceGUIui MedicinaActiveSurfaceCore MedicinaActiveSurfaceClientEventLoop MedicinaActiveSurfaceGUIClient MedicinaActiveSurfaceGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs MedicinaActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs -MedicinaActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) MedicinaActiveSurfaceManagementGUIui MedicinaActiveSurfaceCore MedicinaActiveSurfaceClientEventLoop MedicinaActiveSurfaceGUIClient +MedicinaActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) MedicinaActiveSurfaceGUIui MedicinaActiveSurfaceCore MedicinaActiveSurfaceClientEventLoop MedicinaActiveSurfaceGUIClient MedicinaActiveSurfaceManagementGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs MedicinaActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs $(PROG)_OBJECTS = $(PROG) diff --git a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceManagementGUIui.cpp b/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceManagementGUIui.cpp deleted file mode 120000 index 59e99f14e..000000000 --- a/Medicina/Clients/MedicinaActiveSurfaceGUIClient/src/MedicinaActiveSurfaceManagementGUIui.cpp +++ /dev/null @@ -1 +0,0 @@ -MedicinaActiveSurfaceGUIui.cpp \ No newline at end of file diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/src/Makefile b/Noto/Clients/NotoActiveSurfaceGUIClient/src/Makefile index 5e9a26bd3..c6e73aac9 100644 --- a/Noto/Clients/NotoActiveSurfaceGUIClient/src/Makefile +++ b/Noto/Clients/NotoActiveSurfaceGUIClient/src/Makefile @@ -134,9 +134,9 @@ QT_COMPILE_FILES = $(subst .cpp,,$(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) # # -NotoActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) NotoActiveSurfaceGUIui NotoActiveSurfaceCore NotoActiveSurfaceClientEventLoop NotoActiveSurfaceGUIClient +NotoActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) NotoActiveSurfaceGUIui NotoActiveSurfaceCore NotoActiveSurfaceClientEventLoop NotoActiveSurfaceGUIClient NotoActiveSurfaceGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs NotoActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs -NotoActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) NotoActiveSurfaceManagementGUIui NotoActiveSurfaceCore NotoActiveSurfaceClientEventLoop NotoActiveSurfaceGUIClient +NotoActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) NotoActiveSurfaceGUIui NotoActiveSurfaceCore NotoActiveSurfaceClientEventLoop NotoActiveSurfaceGUIClient NotoActiveSurfaceManagementGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs NotoActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs $(PROG)_OBJECTS = $(PROG) diff --git a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceManagementGUIui.cpp b/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceManagementGUIui.cpp deleted file mode 120000 index 329c09c5c..000000000 --- a/Noto/Clients/NotoActiveSurfaceGUIClient/src/NotoActiveSurfaceManagementGUIui.cpp +++ /dev/null @@ -1 +0,0 @@ -NotoActiveSurfaceGUIui.cpp \ No newline at end of file diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/Makefile b/SRT/Clients/SRTActiveSurfaceGUIClient/src/Makefile index 24010f5d8..3d5195e56 100644 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/Makefile +++ b/SRT/Clients/SRTActiveSurfaceGUIClient/src/Makefile @@ -134,9 +134,9 @@ QT_COMPILE_FILES = $(subst .cpp,,$(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) # # -SRTActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) SRTActiveSurfaceGUIui SRTActiveSurfaceCore SRTActiveSurfaceClientEventLoop SRTActiveSurfaceGUIClient +SRTActiveSurfaceGUIClient_OBJECTS = $(QT_COMPILE_FILES) SRTActiveSurfaceGUIui SRTActiveSurfaceCore SRTActiveSurfaceClientEventLoop SRTActiveSurfaceGUIClient SRTActiveSurfaceGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs SRTActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs -SRTActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) SRTActiveSurfaceManagementGUIui SRTActiveSurfaceCore SRTActiveSurfaceClientEventLoop SRTActiveSurfaceGUIClient +SRTActiveSurfaceManagementGUIClient_OBJECTS = $(QT_COMPILE_FILES) SRTActiveSurfaceGUIui SRTActiveSurfaceCore SRTActiveSurfaceClientEventLoop SRTActiveSurfaceGUIClient SRTActiveSurfaceManagementGUIClient_LIBS = IRALibrary ActiveSurfaceBossStubs SRTActiveSurfaceBossStubs ASErrors ComponentErrors ClientErrors ManagementErrors ManagmentDefinitionsStubs $(PROG)_OBJECTS = $(PROG) diff --git a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceManagementGUIui.cpp b/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceManagementGUIui.cpp deleted file mode 120000 index 6736aa4aa..000000000 --- a/SRT/Clients/SRTActiveSurfaceGUIClient/src/SRTActiveSurfaceManagementGUIui.cpp +++ /dev/null @@ -1 +0,0 @@ -SRTActiveSurfaceGUIui.cpp \ No newline at end of file -- GitLab From 0f626c6f786325ed335ac07e644574c942a72b38 Mon Sep 17 00:00:00 2001 From: Sergio Poppi Date: Mon, 3 Mar 2025 16:46:21 +0100 Subject: [PATCH 138/150] Solar system bodies tracking (#912) * First skeleton issue #002 * SolarSystemBody.midl interface and makefile patched * Xephem Astro lib added to Common Libraries * Patched Makefile XEphem libastro * Xephem libastro wrapper to solarsystem comp * Patched makefile in astrolib * inclded dynamic comp in cdb * added build.log to gitignore * Git ignored solarsystem body * Xephemlib added to System Make * Modified xephemAstrilib wrappe. implemented SolarSystemBodyImpl::execute. * Site implementation * Removed handy shortcuts from astro.h in astrolib * Refactored libastrowrapper to opimize handling solar system body names with static methods. * Unresolved symbols due to missing linking objects in SolarSystem makefile * Implemented Method body position * getAttribute method implemented. * Implemented getCoordinates and getAllCoordinates * patch to allow test component with python * test_solarsystembody.py added az el calculation * Testing output Solar System Body output * patched libastrowrapper. Added getJ2000EquatorialMethod. * unittest setup * patched test planet jupiter * SolarSystemBody comp. test apparant equatorial and horizontal * SolarSystemBody:added test for setting offsets. * Add to git new tests * test on Sun and offsets * test Sun added * Implemented distance * Test jupiter distance * Patched getAttributes * Implemented SUN in Antenna boss component * Sun tracking:implemented in scheduler * SolarSystem module added to SystemMake * Error handling if a wrong planet is chosen * Included functinality for planet tracking. Typos patched. * Bug fixed Mercury planet code. Planet not found i NOBJ code * Wrong planet name gives correct exception * planet tracking with schedule, first draft * Patched schedule subscan to allow planet tracking in schedule file * Otimized logging of the SolarSystemBody component * Generator showed in antennaBoss TUI * typos fixes * patche logs --------- Co-authored-by: Giuseppe Carboni --- .gitignore | 9 + .../include/UpdateGenerator.i | 45 +- .../src/AntennaBossTextClient.cpp | 5 +- .../AntennaBossTextClient/src/Makefile | 2 +- .../AntennaInterface/idl/SolarSystemBody.midl | 93 + .../Interfaces/AntennaInterface/src/Makefile | 4 +- .../idl/AntennaDefinitions.midl | 2 +- .../idl/ManagmentDefinitions.midl | 7 +- .../include/ManagementModule.h | 4 + .../ManagmentInterface/idl/Scheduler.idl | 19 + .../Libraries/XEphemAstroLib/include/astro.h | 825 ++ Common/Libraries/XEphemAstroLib/include/bdl.h | 6 + .../Libraries/XEphemAstroLib/include/chap95.h | 68 + .../XEphemAstroLib/include/deepconst.h | 34 + .../XEphemAstroLib/include/preferences.h | 41 + .../Libraries/XEphemAstroLib/include/satlib.h | 206 + .../XEphemAstroLib/include/satspec.h | 43 + .../XEphemAstroLib/include/sattypes.h | 28 + .../Libraries/XEphemAstroLib/include/vector.h | 19 + .../Libraries/XEphemAstroLib/include/vsop87.h | 93 + Common/Libraries/XEphemAstroLib/src/Makefile | 253 + Common/Libraries/XEphemAstroLib/src/a.out | Bin 0 -> 409952 bytes .../Libraries/XEphemAstroLib/src/aa_hadec.c | 77 + .../Libraries/XEphemAstroLib/src/aberration.c | 161 + Common/Libraries/XEphemAstroLib/src/actan.c | 67 + Common/Libraries/XEphemAstroLib/src/airmass.c | 26 + Common/Libraries/XEphemAstroLib/src/anomaly.c | 63 + Common/Libraries/XEphemAstroLib/src/ap_as.c | 68 + Common/Libraries/XEphemAstroLib/src/astro.h | 824 ++ Common/Libraries/XEphemAstroLib/src/atlas.c | 196 + Common/Libraries/XEphemAstroLib/src/auxil.c | 42 + Common/Libraries/XEphemAstroLib/src/bdl.c | 238 + Common/Libraries/XEphemAstroLib/src/bdl.h | 6 + Common/Libraries/XEphemAstroLib/src/chap95.c | 174 + Common/Libraries/XEphemAstroLib/src/chap95.h | 68 + .../XEphemAstroLib/src/chap95_data.c | 783 ++ Common/Libraries/XEphemAstroLib/src/circum.c | 861 ++ Common/Libraries/XEphemAstroLib/src/comet.c | 83 + Common/Libraries/XEphemAstroLib/src/constel.c | 1803 +++++ Common/Libraries/XEphemAstroLib/src/dbfmt.c | 1029 +++ Common/Libraries/XEphemAstroLib/src/deep.c | 790 ++ .../Libraries/XEphemAstroLib/src/deepconst.h | 34 + Common/Libraries/XEphemAstroLib/src/deltat.c | 334 + .../Libraries/XEphemAstroLib/src/descrip.mms | 92 + .../Libraries/XEphemAstroLib/src/earthsat.c | 792 ++ Common/Libraries/XEphemAstroLib/src/eq_ecl.c | 72 + Common/Libraries/XEphemAstroLib/src/eq_gal.c | 99 + Common/Libraries/XEphemAstroLib/src/formats.c | 212 + Common/Libraries/XEphemAstroLib/src/helio.c | 51 + Common/Libraries/XEphemAstroLib/src/jupmoon.c | 391 + .../Libraries/XEphemAstroLib/src/libration.c | 2213 ++++++ Common/Libraries/XEphemAstroLib/src/magdecl.c | 381 + .../Libraries/XEphemAstroLib/src/marsmoon.c | 265 + Common/Libraries/XEphemAstroLib/src/misc.c | 503 ++ Common/Libraries/XEphemAstroLib/src/mjd.c | 256 + Common/Libraries/XEphemAstroLib/src/moon.c | 3467 ++++++++ .../Libraries/XEphemAstroLib/src/mooncolong.c | 236 + Common/Libraries/XEphemAstroLib/src/moonnf.c | 69 + .../Libraries/XEphemAstroLib/src/nutation.c | 441 ++ Common/Libraries/XEphemAstroLib/src/obliq.c | 27 + .../XEphemAstroLib/src/parallactic.c | 54 + .../Libraries/XEphemAstroLib/src/parallax.c | 42 + Common/Libraries/XEphemAstroLib/src/plans.c | 227 + Common/Libraries/XEphemAstroLib/src/plmoon.c | 284 + .../Libraries/XEphemAstroLib/src/plshadow.c | 50 + Common/Libraries/XEphemAstroLib/src/precess.c | 146 + .../XEphemAstroLib/src/preferences.h | 41 + Common/Libraries/XEphemAstroLib/src/reduce.c | 78 + Common/Libraries/XEphemAstroLib/src/refract.c | 96 + Common/Libraries/XEphemAstroLib/src/rings.c | 45 + Common/Libraries/XEphemAstroLib/src/riset.c | 100 + .../Libraries/XEphemAstroLib/src/riset_cir.c | 426 + Common/Libraries/XEphemAstroLib/src/satlib.h | 206 + Common/Libraries/XEphemAstroLib/src/satmoon.c | 510 ++ Common/Libraries/XEphemAstroLib/src/satspec.h | 43 + .../Libraries/XEphemAstroLib/src/sattypes.h | 28 + Common/Libraries/XEphemAstroLib/src/sdp4.c | 430 + Common/Libraries/XEphemAstroLib/src/sgp4.c | 401 + Common/Libraries/XEphemAstroLib/src/sphcart.c | 43 + Common/Libraries/XEphemAstroLib/src/sun.c | 44 + Common/Libraries/XEphemAstroLib/src/thetag.c | 90 + Common/Libraries/XEphemAstroLib/src/twobody.c | 243 + Common/Libraries/XEphemAstroLib/src/umoon.c | 270 + Common/Libraries/XEphemAstroLib/src/utc_gst.c | 95 + Common/Libraries/XEphemAstroLib/src/vector.h | 19 + Common/Libraries/XEphemAstroLib/src/vsop87.c | 209 + Common/Libraries/XEphemAstroLib/src/vsop87.h | 93 + .../XEphemAstroLib/src/vsop87_data.c | 6988 +++++++++++++++++ Common/Servers/AntennaBoss/include/BossCore.h | 1 + Common/Servers/AntennaBoss/src/BossCore.cpp | 6 +- .../AntennaBoss/src/BossCore_prepareScan.i | 97 +- Common/Servers/AntennaBoss/src/Makefile | 2 +- Common/Servers/Moon/src/MoonImpl.cpp | 2 +- .../Scheduler/include/Core_Operations.h | 18 + Common/Servers/Scheduler/include/Schedule.h | 23 + .../Servers/Scheduler/include/SchedulerImpl.h | 25 + Common/Servers/Scheduler/src/Core.cpp | 2 + Common/Servers/Scheduler/src/Core_Common.i | 1 + .../Servers/Scheduler/src/Core_Operations.i | 36 + .../Scheduler/src/Schedule_ScanList.cpp | 195 +- .../Servers/Scheduler/src/SchedulerImpl.cpp | 35 + .../Servers/Scheduler/src/SubScanBinder.cpp | 42 + .../Scheduler/templates/MapJupiter1x1.bck | 2 + .../Scheduler/templates/MapJupiter1x1.cfg | 13 + .../Scheduler/templates/MapJupiter1x1.lis | 208 + .../Scheduler/templates/MapJupiter1x1.scd | 85 + Common/Servers/Scheduler/templates/calib.lis | 2 +- Common/Servers/SolarSystem/ChangeLog | 1 + .../SolarSystem/include/SolarSystemBodyImpl.h | 222 + .../SolarSystem/include/libastrowrapper.h | 104 + Common/Servers/SolarSystem/src/Makefile | 113 + Common/Servers/SolarSystem/src/MyMake | 22 + .../SolarSystem/src/SolarSystemBodyImpl.cpp | 424 + .../SolarSystem/src/libastrowrapper.cpp | 281 + Common/Servers/SolarSystem/src/mainastro.cpp | 22 + Common/Servers/SolarSystem/src/test.cpp | 86 + .../SolarSystem/src/test_SolarSystemBody.py | 130 + Common/Servers/SolarSystem/test/Makefile | 3 + Common/Servers/SolarSystem/test/__init__.py | 0 .../Servers/SolarSystem/test/test_jupiter.py | 54 + .../SolarSystem/test/test_jupiter_distance.py | 44 + .../Servers/SolarSystem/test/test_offset.py | 54 + Common/Servers/SolarSystem/test/test_sun.py | 55 + .../Components/ANTENNA/IncludeDynamic.xml | 5 + .../AntennaBossContainer.xml | 6 +- .../AntennaContainer/AntennaContainer.xml | 4 +- .../ManagementContainer.xml | 4 +- SRT/CDB/alma/ANTENNA/Boss/Boss.xml | 18 +- .../Components/ANTENNA/IncludeDynamic.xml | 5 + .../CDB/alma/ANTENNA/Boss/Boss.xml | 8 +- SystemMake/Makefile | 4 +- 131 files changed, 32826 insertions(+), 39 deletions(-) create mode 100644 Common/Interfaces/AntennaInterface/idl/SolarSystemBody.midl create mode 100644 Common/Libraries/XEphemAstroLib/include/astro.h create mode 100644 Common/Libraries/XEphemAstroLib/include/bdl.h create mode 100644 Common/Libraries/XEphemAstroLib/include/chap95.h create mode 100644 Common/Libraries/XEphemAstroLib/include/deepconst.h create mode 100644 Common/Libraries/XEphemAstroLib/include/preferences.h create mode 100644 Common/Libraries/XEphemAstroLib/include/satlib.h create mode 100644 Common/Libraries/XEphemAstroLib/include/satspec.h create mode 100644 Common/Libraries/XEphemAstroLib/include/sattypes.h create mode 100644 Common/Libraries/XEphemAstroLib/include/vector.h create mode 100644 Common/Libraries/XEphemAstroLib/include/vsop87.h create mode 100644 Common/Libraries/XEphemAstroLib/src/Makefile create mode 100644 Common/Libraries/XEphemAstroLib/src/a.out create mode 100644 Common/Libraries/XEphemAstroLib/src/aa_hadec.c create mode 100644 Common/Libraries/XEphemAstroLib/src/aberration.c create mode 100644 Common/Libraries/XEphemAstroLib/src/actan.c create mode 100644 Common/Libraries/XEphemAstroLib/src/airmass.c create mode 100644 Common/Libraries/XEphemAstroLib/src/anomaly.c create mode 100644 Common/Libraries/XEphemAstroLib/src/ap_as.c create mode 100644 Common/Libraries/XEphemAstroLib/src/astro.h create mode 100644 Common/Libraries/XEphemAstroLib/src/atlas.c create mode 100644 Common/Libraries/XEphemAstroLib/src/auxil.c create mode 100644 Common/Libraries/XEphemAstroLib/src/bdl.c create mode 100644 Common/Libraries/XEphemAstroLib/src/bdl.h create mode 100644 Common/Libraries/XEphemAstroLib/src/chap95.c create mode 100644 Common/Libraries/XEphemAstroLib/src/chap95.h create mode 100644 Common/Libraries/XEphemAstroLib/src/chap95_data.c create mode 100644 Common/Libraries/XEphemAstroLib/src/circum.c create mode 100644 Common/Libraries/XEphemAstroLib/src/comet.c create mode 100644 Common/Libraries/XEphemAstroLib/src/constel.c create mode 100644 Common/Libraries/XEphemAstroLib/src/dbfmt.c create mode 100644 Common/Libraries/XEphemAstroLib/src/deep.c create mode 100644 Common/Libraries/XEphemAstroLib/src/deepconst.h create mode 100644 Common/Libraries/XEphemAstroLib/src/deltat.c create mode 100644 Common/Libraries/XEphemAstroLib/src/descrip.mms create mode 100644 Common/Libraries/XEphemAstroLib/src/earthsat.c create mode 100644 Common/Libraries/XEphemAstroLib/src/eq_ecl.c create mode 100644 Common/Libraries/XEphemAstroLib/src/eq_gal.c create mode 100644 Common/Libraries/XEphemAstroLib/src/formats.c create mode 100644 Common/Libraries/XEphemAstroLib/src/helio.c create mode 100644 Common/Libraries/XEphemAstroLib/src/jupmoon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/libration.c create mode 100644 Common/Libraries/XEphemAstroLib/src/magdecl.c create mode 100644 Common/Libraries/XEphemAstroLib/src/marsmoon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/misc.c create mode 100644 Common/Libraries/XEphemAstroLib/src/mjd.c create mode 100644 Common/Libraries/XEphemAstroLib/src/moon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/mooncolong.c create mode 100644 Common/Libraries/XEphemAstroLib/src/moonnf.c create mode 100644 Common/Libraries/XEphemAstroLib/src/nutation.c create mode 100644 Common/Libraries/XEphemAstroLib/src/obliq.c create mode 100644 Common/Libraries/XEphemAstroLib/src/parallactic.c create mode 100644 Common/Libraries/XEphemAstroLib/src/parallax.c create mode 100644 Common/Libraries/XEphemAstroLib/src/plans.c create mode 100644 Common/Libraries/XEphemAstroLib/src/plmoon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/plshadow.c create mode 100644 Common/Libraries/XEphemAstroLib/src/precess.c create mode 100644 Common/Libraries/XEphemAstroLib/src/preferences.h create mode 100644 Common/Libraries/XEphemAstroLib/src/reduce.c create mode 100644 Common/Libraries/XEphemAstroLib/src/refract.c create mode 100644 Common/Libraries/XEphemAstroLib/src/rings.c create mode 100644 Common/Libraries/XEphemAstroLib/src/riset.c create mode 100644 Common/Libraries/XEphemAstroLib/src/riset_cir.c create mode 100644 Common/Libraries/XEphemAstroLib/src/satlib.h create mode 100644 Common/Libraries/XEphemAstroLib/src/satmoon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/satspec.h create mode 100644 Common/Libraries/XEphemAstroLib/src/sattypes.h create mode 100644 Common/Libraries/XEphemAstroLib/src/sdp4.c create mode 100644 Common/Libraries/XEphemAstroLib/src/sgp4.c create mode 100644 Common/Libraries/XEphemAstroLib/src/sphcart.c create mode 100644 Common/Libraries/XEphemAstroLib/src/sun.c create mode 100644 Common/Libraries/XEphemAstroLib/src/thetag.c create mode 100644 Common/Libraries/XEphemAstroLib/src/twobody.c create mode 100644 Common/Libraries/XEphemAstroLib/src/umoon.c create mode 100644 Common/Libraries/XEphemAstroLib/src/utc_gst.c create mode 100644 Common/Libraries/XEphemAstroLib/src/vector.h create mode 100644 Common/Libraries/XEphemAstroLib/src/vsop87.c create mode 100644 Common/Libraries/XEphemAstroLib/src/vsop87.h create mode 100644 Common/Libraries/XEphemAstroLib/src/vsop87_data.c create mode 100644 Common/Servers/Scheduler/templates/MapJupiter1x1.bck create mode 100644 Common/Servers/Scheduler/templates/MapJupiter1x1.cfg create mode 100644 Common/Servers/Scheduler/templates/MapJupiter1x1.lis create mode 100644 Common/Servers/Scheduler/templates/MapJupiter1x1.scd create mode 100644 Common/Servers/SolarSystem/ChangeLog create mode 100644 Common/Servers/SolarSystem/include/SolarSystemBodyImpl.h create mode 100644 Common/Servers/SolarSystem/include/libastrowrapper.h create mode 100644 Common/Servers/SolarSystem/src/Makefile create mode 100644 Common/Servers/SolarSystem/src/MyMake create mode 100644 Common/Servers/SolarSystem/src/SolarSystemBodyImpl.cpp create mode 100644 Common/Servers/SolarSystem/src/libastrowrapper.cpp create mode 100644 Common/Servers/SolarSystem/src/mainastro.cpp create mode 100644 Common/Servers/SolarSystem/src/test.cpp create mode 100644 Common/Servers/SolarSystem/src/test_SolarSystemBody.py create mode 100644 Common/Servers/SolarSystem/test/Makefile create mode 100644 Common/Servers/SolarSystem/test/__init__.py create mode 100644 Common/Servers/SolarSystem/test/test_jupiter.py create mode 100644 Common/Servers/SolarSystem/test/test_jupiter_distance.py create mode 100644 Common/Servers/SolarSystem/test/test_offset.py create mode 100644 Common/Servers/SolarSystem/test/test_sun.py diff --git a/.gitignore b/.gitignore index 12abadff6..d7349f20e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,13 @@ object/ *~ *.swp *.pyc +.project* # Ignore the SliLibrary directory Common/Libraries/SlaLibrary # Files generated by the building process +Common/Interfaces/build.log Common/Clients/CaltoolClient/src/calibrationtool_ui.py Common/Clients/CaltoolClient/src/calibrationtool_ui.pye Common/Errors/AntennaErrors/idl/AntennaErrors.idl @@ -26,12 +28,16 @@ Common/Errors/ParserErrors/idl/ParserErrors.idl Common/Errors/ReceiversErrors/idl/DerotatorErrors.idl Common/Errors/ReceiversErrors/idl/ReceiversErrors.idl Common/Errors/XBackendErrors/idl/XBackendsErrors.idl +Common/Errors/ActiveSurfaceErrors/idl/ASErrors.idl +Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceCommon.idl +Common/Interfaces/AntennaInterface/idl/SolarSystemBody.idl Common/Interfaces/AntennaInterface/idl/AntennaBoss.idl Common/Interfaces/AntennaInterface/idl/Moon.idl Common/Interfaces/AntennaInterface/idl/Mount.idl Common/Interfaces/AntennaInterface/idl/OTF.idl Common/Interfaces/AntennaInterface/idl/Observatory.idl Common/Interfaces/AntennaInterface/idl/SkySource.idl +Common/Interfaces/AntennaInterface/idl/SolarSystemBody.idl Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceCommon.idl Common/Interfaces/CommonInterface/idl/AntennaDefinitions.idl Common/Interfaces/CommonInterface/idl/BackendsDefinitions.idl @@ -50,4 +56,7 @@ SRT/Clients/SRTActiveSurfaceGUIClient/include/SRTActiveSurfaceGUI.h SRT/Clients/SRTActiveSurfaceGUIClient/src/moc_SRTActiveSurfaceCore.cpp SRT/Clients/SRTActiveSurfaceGUIClient/src/moc_SRTActiveSurfaceGUIui.cpp SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceBoss.idl +Common/Libraries/build.log +SRT/Interfaces/SRTActiveSurfaceInterface/idl/SRTActiveSurfaceCommon.idl +.DS_Store .vscode/settings.json diff --git a/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i b/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i index 395214319..c4007114f 100644 --- a/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i +++ b/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i @@ -162,6 +162,49 @@ void updateGenerator(maci::SimpleClient& client,Antenna::TGeneratorType& lastGen extraLabel6->Refresh(); break; } + case Antenna::ANT_SOLARSYSTEMBODY : { + IRA::CString str1,str2; + + Antenna::SolarSystemBodyAttributes_var att; + Antenna::SolarSystemBody_var ssbody; + try { + ssbody=Antenna::SolarSystemBody::_narrow(lastGenerator); + if (!CORBA::is_nil(ssbody)) { + ssbody->getAttributes(att); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + tmpString=(const char*)att->sourceID; + outString="Source name : "+tmpString; + extraLabel1->setValue(outString); + extraLabel1->Refresh(); + IRA::CIRATools::radToHourAngle(att->rightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->declination,str2); + outString="Apparent Eq. : "+str1+"/"+str2+"/"; + str1.Format("%.5lf",att->julianEpoch); + outString+=str1; + extraLabel2->setValue(outString); + extraLabel2->Refresh(); + IRA::CIRATools::radToAngle(att->gLongitude,str1); + IRA::CIRATools::radToAngle(att->gLatitude,str2); + outString="Galactic : "+str1+"/"+str2; + extraLabel3->setValue(outString); + extraLabel4->Refresh(); + IRA::CIRATools::radToAngle(att->azimuth,str1); + IRA::CIRATools::radToAngle(att->elevation,str2); + outString="Horizontal : "+str1+"/"+str2; + extraLabel4->setValue(outString); + extraLabel4->Refresh(); + extraLabel5->setValue(""); + extraLabel5->Refresh(); + extraLabel6->setValue(""); + extraLabel6->Refresh(); + break; + } case Antenna::ANT_OTF: { Antenna::OTFAttributes_var att; Antenna::OTF_var otf; @@ -175,7 +218,7 @@ void updateGenerator(maci::SimpleClient& client,Antenna::TGeneratorType& lastGen catch (...) { _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); - return; + return; } IRA::CIRATools::radToAngle(att->startLon,str1); IRA::CIRATools::radToAngle(att->startLat,str2); diff --git a/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp index 616ab7337..cd1820bbd 100644 --- a/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp +++ b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -396,7 +397,7 @@ int main(int argc, char *argv[]) { generatorType_box->setStatusLook(Antenna::ANT_SIDEREAL); generatorType_box->setStatusLook(Antenna::ANT_MOON); generatorType_box->setStatusLook(Antenna::ANT_SUN); - generatorType_box->setStatusLook(Antenna::ANT_SOLARSYTEMBODY); + generatorType_box->setStatusLook(Antenna::ANT_SOLARSYSTEMBODY); generatorType_box->setStatusLook(Antenna::ANT_SATELLITE); generatorType_box->setStatusLook(Antenna::ANT_OTF); @@ -434,6 +435,8 @@ int main(int argc, char *argv[]) { _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); #endif + + // Monitors ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); /** Add all required monitor installation here */ diff --git a/Common/Clients/AntennaBossTextClient/src/Makefile b/Common/Clients/AntennaBossTextClient/src/Makefile index 61ae88472..ec223f759 100644 --- a/Common/Clients/AntennaBossTextClient/src/Makefile +++ b/Common/Clients/AntennaBossTextClient/src/Makefile @@ -66,7 +66,7 @@ EXECUTABLES_L = _tui_AntennaBossTextClient_OBJECTS = AntennaBossTextClient _tui_AntennaBossTextClient_LIBS = AntennaBossStubs IRALibrary \ ManagmentDefinitionsStubs TextWindowLibrary ClientErrors ComponentErrors ManagementErrors \ - AntennaErrors AntennaDefinitionsStubs EphemGeneratorStubs SkySourceStubs OTFStubs MoonStubs acsnc + AntennaErrors AntennaDefinitionsStubs EphemGeneratorStubs SkySourceStubs OTFStubs MoonStubs SolarSystemBodyStubs acsnc SCRIPTS = antennaBossTui diff --git a/Common/Interfaces/AntennaInterface/idl/SolarSystemBody.midl b/Common/Interfaces/AntennaInterface/idl/SolarSystemBody.midl new file mode 100644 index 000000000..d0d856e20 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/SolarSystemBody.midl @@ -0,0 +1,93 @@ +/* ************************************************************************************/ +/* INAF DISCOS +/* */ +/* $Id: SolarSystemBody.midl,v 1.3 2010-09-24 15:42:03 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL) */ +/* */ +/* Who when What */ +/* S.Poppi, S.Righini 09/May/2017 created */ + +#ifndef _SSB_IDL +#define _SSB_IDL + +#include "baci.idl" +#include +#include + +#pragma prefix "alma" + +module Antenna { + /* + * Here we have defined a struct "SolarSystemBody structure" that contains all the properties of the component. + * Since EphemGenerator defines all the properties of the component and we have inherited the SolarSystemBody component from EphemGenerator. + * This Interface will be mapped into the ACS dynamic component so it can't expose properties in their classic definations. + * Component attributes are read via their accesor method (getAttributes()). * +*/ + DEFATTRIBUTES (SolarSystemBodyAttributes) + double angularSize; /** apparent angular diameter of the body degrees**/ + double distance; /**body distance AU **/ + double radialVelocity; /**body radial velocity km/s**/ + Antenna::TReferenceFrame vradFrame; /** reference frame of the radial velocity */ + Antenna::TVradDefinition vradDefinition; /** definition of the radial velocity */ + + ENDDEFATTRIBUTES; + + + interface SolarSystemBody: EphemGenerator { + /*This is the Interface of the component Moon and this is inherited from EphemGenerator + * all the properties metioned below are inherited by the interface SolarSystemBody + * # input Source ID:SolarSystemBody, the name of the source + * # double right Ascension of the body in radians + * # double decination of the body in radians + * # double azimuth in radians + * # double elevation in radians + * # Julian Epoch the current time as a julian epoch + * # double userAzimuthOffset in radians + * # double userElevationOffset in radians + * # double userRightAscensionOffset in radians + * # double userDeclinationOffset in radians + * # double parallacticAngle in radians + */ + void getAttributes(out SolarSystemBodyAttributes att); /*this method is the attribute accessor*/ + + /** + * This method is only for control software internal use. It used, given a timestamp, to retrive the apparent + * J2000 Equatorial coordiantes coordinates in one shot. + * @throw CORBA::SystemException + * @param timestamp this parameter is used to pass the exact time the caller wants to know the topocentric coordinates. + * @param ra that's the returned value in radians of the right ascension for the requested time. + * @param re that's the returned value in radians of the declination for the requested time. + */ + void getJ2000EquatorialCoordinate(in ACS::Time timestamp, out double ra,out double dec); + + + /** + @param bodyName of the target + + */ + + void setBodyName(in string bodyName) raises (AntennaErrors::AntennaErrorsEx); + + /** + * This method is only for control software internal use. It used, given a timestamp, to retrive the distance of the body + * @param timestamp this parameter is used to pass the exact time the caller wants to know the topocentric coordinates. + * @param distance body distance in AU. + + * J2000 Equatorial coordiantes coordinates in one shot. + + */ + void getDistance(in ACS::Time timestamp, out double distance); + + + }; + +}; + + + + + + +#endif + diff --git a/Common/Interfaces/AntennaInterface/src/Makefile b/Common/Interfaces/AntennaInterface/src/Makefile index e486056f0..3115b17e5 100644 --- a/Common/Interfaces/AntennaInterface/src/Makefile +++ b/Common/Interfaces/AntennaInterface/src/Makefile @@ -30,7 +30,7 @@ CDB_SCHEMAS = Mount Station PointingModel # IDL Files and flags # IDL_FILES = Observatory Mount PointingModel EphemGeneratorMACRO_include \ -EphemGenerator SkySource OTF Refraction AntennaBoss Moon +EphemGenerator SkySource OTF Refraction AntennaBoss Moon SolarSystemBody IDL_TAO_FLAGS = USER_IDL = ObservatoryStubs_LIBS = baciStubs maciStubs AntennaDefinitionsStubs ComponentErrorsStubs @@ -48,7 +48,7 @@ AntennaBossStubs_LIBS = baciStubs maciStubs ManagmentDefinitionsStubs Management EphemGeneratorStubs ComponentErrorsStubs AntennaErrorsStubs \ AntennaDefinitionsStubs MoonStubs_LIBS = baciStubs maciStubs EphemGeneratorStubs - +SolarSystemBodyStubs_LIBS = baciStubs maciStubs EphemGeneratorStubs # # list of all possible C-sources (used to create automatic dependencies) diff --git a/Common/Interfaces/CommonInterface/idl/AntennaDefinitions.midl b/Common/Interfaces/CommonInterface/idl/AntennaDefinitions.midl index c80421b74..972eaf596 100644 --- a/Common/Interfaces/CommonInterface/idl/AntennaDefinitions.midl +++ b/Common/Interfaces/CommonInterface/idl/AntennaDefinitions.midl @@ -105,7 +105,7 @@ module Antenna { ANT_SUN, /*!< tracks the sun */ ANT_MOON, /*!< tracks the moon */ ANT_SATELLITE, /*!< tracks an artificial sattelite */ - ANT_SOLARSYTEMBODY, /*!< tracks a body of the solar system */ + ANT_SOLARSYSTEMBODY, /*!< tracks a body of the solar system */ ANT_OTF, /*!< perform a On the Fly Scan */ ANT_NONE /*!< no generator */ }; diff --git a/Common/Interfaces/CommonInterface/idl/ManagmentDefinitions.midl b/Common/Interfaces/CommonInterface/idl/ManagmentDefinitions.midl index 3eaf865d5..75a79d126 100644 --- a/Common/Interfaces/CommonInterface/idl/ManagmentDefinitions.midl +++ b/Common/Interfaces/CommonInterface/idl/ManagmentDefinitions.midl @@ -62,11 +62,12 @@ module Management { MNG_SUN, /*!< tracks the sun */ MNG_MOON, /*!< tracks the moon */ MNG_SATELLITE, /*!< tracks an artificial sattelite */ + MNG_PLANET, /*!< tracks a planet */ MNG_SOLARSYTEMBODY, /*!< tracks a body of the solar system */ - MNG_OTF, /*!< perform a On the Fly Scan */ + MNG_OTF, /*!< perform a On the Fly Scan */ MNG_OTFC, /*!< this is a wrapper of the otf, it allows the system to compute the center of the on-the-fly */ - MNG_PEAKER, /*!< perform a peaker measurement, involving the subreflector or minor servo systems */ - MNG_SKYDIP, /*!< perform a skydip scan */ + MNG_PEAKER, /*!< perform a peaker measurement, involving the subreflector or minor servo systems */ + MNG_SKYDIP, /*!< perform a skydip scan */ MNG_NONE /*!< no action */ }; diff --git a/Common/Interfaces/CommonInterface/include/ManagementModule.h b/Common/Interfaces/CommonInterface/include/ManagementModule.h index bb2bd2801..6725d43ac 100644 --- a/Common/Interfaces/CommonInterface/include/ManagementModule.h +++ b/Common/Interfaces/CommonInterface/include/ManagementModule.h @@ -40,6 +40,10 @@ public: mode=Management::MNG_SOLARSYTEMBODY; return true; } + else if (strcasecmp(strScan,"PLANET")==0) { + mode=Management::MNG_PLANET; + return true; + } else if (strcasecmp(strScan,"OTF")==0) { mode=Management::MNG_OTF; return true; diff --git a/Common/Interfaces/ManagmentInterface/idl/Scheduler.idl b/Common/Interfaces/ManagmentInterface/idl/Scheduler.idl index 4b7b30dbc..080fc150a 100644 --- a/Common/Interfaces/ManagmentInterface/idl/Scheduler.idl +++ b/Common/Interfaces/ManagmentInterface/idl/Scheduler.idl @@ -293,6 +293,25 @@ module Management { */ void moon() raises (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx); + /** + * It allows to immediately start a tracking of the Sun. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ManagementErrors::ManagementErrorsEx + */ + void sun() raises (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx); + + /** + * It allows to immediately start a tracking of the Sun. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ManagementErrors::ManagementErrorsEx + */ + + + void planet(in string name) raises (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx); + + /** * It allows to immediately go to a fixed horizontal position (beampark). * @param az azimuth in radians. It could be -1, in that case the current position is taken diff --git a/Common/Libraries/XEphemAstroLib/include/astro.h b/Common/Libraries/XEphemAstroLib/include/astro.h new file mode 100644 index 000000000..614b3125e --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/astro.h @@ -0,0 +1,825 @@ +#ifndef _ASTRO_H +#define _ASTRO_H + +#include + +#ifndef PI +#define PI 3.141592653589793 +#endif + +/* conversions among hours (of ra), degrees and radians. */ +#define degrad(x) ((x)*PI/180.) +#define raddeg(x) ((x)*180./PI) +#define hrdeg(x) ((x)*15.) +#define deghr(x) ((x)/15.) +#define hrrad(x) degrad(hrdeg(x)) +#define radhr(x) deghr(raddeg(x)) + +/* ratio of from synodic (solar) to sidereal (stellar) rate */ +#define SIDRATE .9972695677 + +/* manifest names for planets. + * N.B. must coincide with usage in pelement.c and plans.c. + * N.B. only the first 8 are valid for use with plans(). + */ + +#ifdef __cplusplus +extern "C" { +#endif + +// all of your legacy C code here + + + + +typedef enum { + MERCURY, + VENUS, + MARS, + JUPITER, + SATURN, + URANUS, + NEPTUNE, + PLUTO, + SUN, + MOON, + NOBJ /* total number of basic objects */ +} PLCode; + +/* moon constants for pl_moon */ +typedef enum { + X_PLANET = 0, /* use to mean planet itself */ + PHOBOS = NOBJ, DEIMOS, + IO, EUROPA, GANYMEDE, CALLISTO, + MIMAS, ENCELADUS, TETHYS, DIONE, RHEA, TITAN, HYPERION, IAPETUS, + ARIEL, UMBRIEL, TITANIA, OBERON, MIRANDA, + NBUILTIN +} MCode; + +/* starting point for MJD calculations + */ +#define MJD0 2415020.0 +#define J2000 (2451545.0 - MJD0) /* yes, 2000 January 1 at 12h */ + +/* the Now and Obj typedefs. + * also, a few miscellaneous constants and declarations. + */ + +#define SPD (24.0*3600.0) /* seconds per day */ +#define MAU (1.4959787e11) /* m / au */ +#define LTAU 499.005 /* seconds light takes to travel 1 AU */ +#define ERAD (6.37816e6) /* earth equitorial radius, m */ +#define MRAD (1.740e6) /* moon equitorial radius, m */ +#define SRAD (6.95e8) /* sun equitorial radius, m */ +#define FTPM 3.28084 /* ft per m */ +#define ESAT_MAG 2 /* default satellite magnitude */ +#define FAST_SAT_RPD 0.25 /* max earth sat rev/day considered "fast" */ + +#define EOD (-9786) /* special epoch flag: use epoch of date */ + +/* info about the local observing circumstances and misc preferences */ +typedef struct { + double n_mjd; /* modified Julian date, ie, days since + * Jan 0.5 1900 (== 12 noon, Dec 30, 1899), utc. + * enough precision to get well better than 1 second. + * N.B. if not first member, must move NOMJD inits. + */ + double n_lat; /* geographic (surface-normal) lt, >0 north, rads */ + double n_lng; /* longitude, >0 east, rads */ + double n_tz; /* time zone, hrs behind UTC */ + double n_temp; /* atmospheric temp, degrees C */ + double n_pressure; /* atmospheric pressure, mBar */ + double n_elev; /* elevation above sea level, earth radii */ + double n_dip; /* dip of sun below hzn at twilight, >0 below, rads */ + double n_epoch; /* desired precession display ep as an mjd, or EOD */ + char n_tznm[8]; /* time zone name; 7 chars or less, always 0 at end */ +} Now; + +/* handy shorthands for fields in a Now pointer, np */ +/* +#define mjd np->n_mjd +#define lat np->n_lat +#define lng np->n_lng +#define tz np->n_tz +#define temp np->n_temp +#define pressure np->n_pressure +#define elev np->n_elev +#define dip np->n_dip +#define epoch np->n_epoch +#define tznm np->n_tznm +#define mjed mm_mjed(np) +*/ +/* structures to describe objects of various types. + */ + +/* magnitude values in two different systems */ +typedef struct { + float m1, m2; /* either g/k or H/G, depending on... */ + int whichm; /* one of MAG_gk or MAG_HG */ +} Mag; + +/* whichm */ +#define MAG_HG 0 /* using 0 makes HG the initial default */ +#define MAG_gk 1 + +/* we actually store magnitudes times this scale factor in a short int */ +#define MAGSCALE 100.0 +#define set_smag(op,m) ((op)->s_mag = (short)floor((m)*MAGSCALE + 0.5)) +#define set_fmag(op,m) ((op)->f_mag = (short)floor((m)*MAGSCALE + 0.5)) +#define get_mag(op) ((op)->s_mag / MAGSCALE) +#define get_fmag(op) ((op)->f_mag / MAGSCALE) + +/* longest object name, including trailing '\0' */ +#define MAXNM 21 + +typedef unsigned char ObjType_t; +typedef unsigned char ObjAge_t; +typedef unsigned char byte; + +/* Obj is a massive union. + * many fields are in common so we use macros to make things a little easier. + */ + +/* fields common to *all* structs in the Obj union */ +#define OBJ_COMMON_FLDS \ + ObjType_t co_type; /* current object type; see flags, below */ \ + byte co_flags; /* FUSER*... used by others */ \ + ObjAge_t co_age; /* update aging code; see db.c */ \ + char co_name[MAXNM];/* name, including \0 */ \ + float co_ra; /* geo/topo app/mean ra, rads */ \ + float co_dec; /* geo/topo app/mean dec, rads */ \ + float co_gaera; /* geo apparent ra, rads */ \ + float co_gaedec; /* geo apparent dec, rads */ \ + float co_az; /* azimuth, >0 e of n, rads */ \ + float co_alt; /* altitude above topocentric horizon, rads */ \ + float co_elong; /* angular sep btwen obj and sun, >0 E, degs */ \ + float co_size; /* angular size, arc secs */ \ + short co_mag /* visual magnitude * MAGSCALE */ + +/* fields common to all solar system objects in the Obj union */ +#define OBJ_SOLSYS_FLDS \ + OBJ_COMMON_FLDS; /* all the fixed ones plus ... */ \ + float so_sdist; /* dist from object to sun, au */ \ + float so_edist; /* dist from object to earth, au */ \ + float so_hlong; /* heliocentric longitude, rads */ \ + float so_hlat; /* heliocentric latitude, rads */ \ + float so_phase /* phase, % */ + +/* fields common to all fixed objects in the Obj union */ +#define OBJ_FIXED_FLDS \ + char fo_spect[2]; /* spectral codes, if appropriate */ \ + float fo_epoch; /* eq of ra/dec and time when pm=0; mjd */ \ + float fo_ra; /* ra, rads, in epoch frame */ \ + float fo_dec; /* dec, rads, in epoch frame */ \ + float fo_pmra; /* ra proper motion, rads/day/cos(dec) */ \ + float fo_pmdec; /* dec proper motion, rads/day */ \ + char fo_class /* object class */ + +/* a generic object */ +typedef struct { + OBJ_COMMON_FLDS; +} ObjAny; + +/* a generic sol system object */ +typedef struct { + OBJ_SOLSYS_FLDS; +} ObjSS; + +/* basic Fixed object info. + */ +typedef struct { + OBJ_COMMON_FLDS; + OBJ_FIXED_FLDS; + + /* following are for galaxies */ + byte fo_ratio; /* minor/major diameter ratio. use s/get_ratio() */ + byte fo_pa; /* position angle, E of N, rads. use s/get_pa() */ +} ObjF; + +/* true-orbit parameters of binary-star object type */ +typedef struct { + float bo_T; /* epoch of periastron, years */ + float bo_e; /* eccentricity */ + float bo_o; /* argument of periastron, degress */ + float bo_O; /* longitude of node, degrees */ + float bo_i; /* inclination to plane of sky, degrees */ + float bo_a; /* semi major axis, arc secs */ + float bo_P; /* period, years */ + + /* companion position, computed by obj_cir() iff b_2compute */ + float bo_pa; /* position angle @ ep, rads E of N */ + float bo_sep; /* separation @ ep, arc secs */ + float bo_ra; /* geo/topo app/mean ra, rads */ + float bo_dec; /* geo/topo app/mean dec, rads */ +} BinOrbit; +typedef struct { + float bp_ep; /* epoch of pa/sep, year */ + float bp_pa; /* position angle @ ep, rads E of N */ + float bp_sep; /* separation @ ep, arc secs */ + + /* companion position, computed by obj_cir() iff b_2compute */ + float bp_ra; /* geo/topo app/mean ra, rads */ + float bp_dec; /* geo/topo app/mean dec, rads */ +} BinPos; +#define MAXBINPOS 2 /* max discrete epochs to store when no elements */ +typedef struct { + OBJ_COMMON_FLDS; + OBJ_FIXED_FLDS; + + byte b_2compute; /* whether to compute secondary positions */ + byte b_nbp; /* number of b_bp[] or 0 to use b_bo */ + short b_2mag; /* secondary's magnitude * MAGSCALE */ + char b_2spect[2]; /* secondary's spectrum */ + + /* either a real orbit or a set of discrete pa/sep */ + union { + BinOrbit b_bo; /* orbital elements */ + BinPos b_bp[MAXBINPOS]; /* table of discrete positions */ + } u; +} ObjB; + +#define fo_mag co_mag /* pseudonym for so_mag since it is not computed */ +#define fo_size co_size /* pseudonym for so_size since it is not computed */ + +/* macros to pack/unpack some fields */ +#define SRSCALE 255.0 /* galaxy size ratio scale */ +#define PASCALE (255.0/(2*PI)) /* pos angle scale factor */ +#define get_ratio(op) (((int)(op)->f_ratio)/SRSCALE) +#define set_ratio(op,maj,min) ((op)->f_ratio = (byte)(((maj) > 0) \ + ? ((min)*SRSCALE/(double)(maj)+0.5) \ + : 0)) +#define get_pa(op) ((double)(op)->f_pa/PASCALE) +#define set_pa(op,s) ((op)->f_pa = (byte)((s)*PASCALE + 0.5)) + +#define NCLASSES 128 /* n potential fo_classes -- allow for all ASCII */ + +/* basic planet object info */ +typedef struct { + OBJ_SOLSYS_FLDS; + PLCode plo_code; /* which planet */ + MCode plo_moon; /* which moon, or X_PLANET if planet */ + char plo_evis, plo_svis; /* if moon: whether visible from earth, sun */ + double plo_x, plo_y, plo_z; /* if moon: eq dist from center, planet radii */ + double plo_aux1, plo_aux2; /* various values, depending on type */ +} ObjPl; + +/* basic info about an object in elliptical heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + float eo_inc; /* inclination, degrees */ + float eo_Om; /* longitude of ascending node, degrees */ + float eo_om; /* argument of perihelion, degress */ + float eo_a; /* mean distance, aka,semi-maj axis,AU */ + float eo_M; /* mean anomaly, ie, degrees from perihelion at cepoch*/ + float eo_size; /* angular size, in arc seconds at 1 AU */ + float eo_startok; /* nominal first mjd this set is ok, else 0 */ + float eo_endok; /* nominal last mjd this set is ok, else 0 */ + double eo_e; /* eccentricity (double for when near 1 computing q) */ + double eo_cepoch; /* epoch date (M reference), as an mjd */ + double eo_epoch; /* equinox year (inc/Om/om reference), as an mjd. */ + Mag eo_mag; /* magnitude */ +} ObjE; + +/* basic info about an object in hyperbolic heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + double ho_epoch; /* equinox year (inc/Om/om reference), as an mjd */ + double ho_ep; /* epoch of perihelion, as an mjd */ + float ho_startok; /* nominal first mjd this set is ok, else 0 */ + float ho_endok; /* nominal last mjd this set is ok, else 0 */ + float ho_inc; /* inclination, degs */ + float ho_Om; /* longitude of ascending node, degs */ + float ho_om; /* argument of perihelion, degs. */ + float ho_e; /* eccentricity */ + float ho_qp; /* perihelion distance, AU */ + float ho_g, ho_k; /* magnitude model coefficients */ + float ho_size; /* angular size, in arc seconds at 1 AU */ +} ObjH; + +/* basic info about an object in parabolic heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + double po_epoch; /* reference epoch, as an mjd */ + double po_ep; /* epoch of perihelion, as an mjd */ + float po_startok; /* nominal first mjd this set is ok, else 0 */ + float po_endok; /* nominal last mjd this set is ok, else 0 */ + float po_inc; /* inclination, degs */ + float po_qp; /* perihelion distance, AU */ + float po_om; /* argument of perihelion, degs. */ + float po_Om; /* longitude of ascending node, degs */ + float po_g, po_k; /* magnitude model coefficients */ + float po_size; /* angular size, in arc seconds at 1 AU */ +} ObjP; + +/* basic earth satellite object info */ +typedef struct { + OBJ_COMMON_FLDS; + double eso_epoch; /* reference epoch, as an mjd */ + double eso_n; /* mean motion, rev/day + * N.B. we need double due to a sensitive differencing + * operation used to compute MeanAnomaly in + * esat_main()/satellite.c. + */ + float eso_startok; /* nominal first mjd this set is ok, else 0 */ + float eso_endok; /* nominal last mjd this set is ok, else 0 */ + float eso_inc; /* inclination, degs */ + float eso_raan; /* RA of ascending node, degs */ + float eso_e; /* eccentricity */ + float eso_ap; /* argument of perigee at epoch, degs */ + float eso_M; /* mean anomaly, ie, degrees from perigee at epoch */ + float eso_decay; /* orbit decay rate, rev/day^2 */ + float eso_drag; /* object drag coefficient, (earth radii)^-1 */ + int eso_orbit; /* integer orbit number of epoch */ + + /* computed "sky" results unique to earth satellites */ + float ess_elev; /* height of satellite above sea level, m */ + float ess_range; /* line-of-site distance from observer to satellite, m*/ + float ess_rangev; /* rate-of-change of range, m/s */ + float ess_sublat; /* latitude below satellite, >0 north, rads */ + float ess_sublng; /* longitude below satellite, >0 east, rads */ + int ess_eclipsed;/* 1 if satellite is in earth's shadow, else 0 */ +} ObjES; + +typedef union { + ObjAny any; /* these fields valid for all types */ + ObjSS anyss; /* these fields valid for all solar system types */ + ObjPl pl; /* planet */ + ObjF f; /* fixed object, plus proper motion */ + ObjB b; /* bona fide binary stars (doubles are stored in f) */ + ObjE e; /* object in heliocentric elliptical orbit */ + ObjH h; /* object in heliocentric hyperbolic trajectory */ + ObjP p; /* object in heliocentric parabolic trajectory */ + ObjES es; /* earth satellite */ +} Obj; + + +/* for o_flags -- everybody must agree */ +#define FUSER0 0x01 +#define FUSER1 0x02 +#define FUSER2 0x04 +#define FUSER3 0x08 +#define FUSER4 0x10 +#define FUSER5 0x20 +#define FUSER6 0x40 +#define FUSER7 0x80 + +/* mark an object as being a "field star" */ +#define FLDSTAR FUSER3 +/* mark an object as circum calculation failed */ +#define NOCIRCUM FUSER7 + +/* Obj shorthands: */ +#define o_type any.co_type +#define o_name any.co_name +#define o_flags any.co_flags +#define o_age any.co_age +#define s_ra any.co_ra +#define s_dec any.co_dec +#define s_gaera any.co_gaera +#define s_gaedec any.co_gaedec +#define s_az any.co_az +#define s_alt any.co_alt +#define s_elong any.co_elong +#define s_size any.co_size +#define s_mag any.co_mag + +#define s_sdist anyss.so_sdist +#define s_edist anyss.so_edist +#define s_hlong anyss.so_hlong +#define s_hlat anyss.so_hlat +#define s_phase anyss.so_phase + +#define s_elev es.ess_elev +#define s_range es.ess_range +#define s_rangev es.ess_rangev +#define s_sublat es.ess_sublat +#define s_sublng es.ess_sublng +#define s_eclipsed es.ess_eclipsed + +#define f_class f.fo_class +#define f_spect f.fo_spect +#define f_ratio f.fo_ratio +#define f_pa f.fo_pa +#define f_epoch f.fo_epoch +#define f_RA f.fo_ra +#define f_pmRA f.fo_pmra +#define f_dec f.fo_dec +#define f_pmdec f.fo_pmdec +#define f_mag f.fo_mag +#define f_size f.fo_size + +#define e_cepoch e.eo_cepoch +#define e_epoch e.eo_epoch +#define e_startok e.eo_startok +#define e_endok e.eo_endok +#define e_inc e.eo_inc +#define e_Om e.eo_Om +#define e_om e.eo_om +#define e_a e.eo_a +#define e_e e.eo_e +#define e_M e.eo_M +#define e_size e.eo_size +#define e_mag e.eo_mag + +#define h_epoch h.ho_epoch +#define h_startok h.ho_startok +#define h_endok h.ho_endok +#define h_ep h.ho_ep +#define h_inc h.ho_inc +#define h_Om h.ho_Om +#define h_om h.ho_om +#define h_e h.ho_e +#define h_qp h.ho_qp +#define h_g h.ho_g +#define h_k h.ho_k +#define h_size h.ho_size + +#define p_epoch p.po_epoch +#define p_startok p.po_startok +#define p_endok p.po_endok +#define p_ep p.po_ep +#define p_inc p.po_inc +#define p_qp p.po_qp +#define p_om p.po_om +#define p_Om p.po_Om +#define p_g p.po_g +#define p_k p.po_k +#define p_size p.po_size + +#define es_epoch es.eso_epoch +#define es_startok es.eso_startok +#define es_endok es.eso_endok +#define es_inc es.eso_inc +#define es_raan es.eso_raan +#define es_e es.eso_e +#define es_ap es.eso_ap +#define es_M es.eso_M +#define es_n es.eso_n +#define es_decay es.eso_decay +#define es_drag es.eso_drag +#define es_orbit es.eso_orbit + +#define pl_code pl.plo_code +#define pl_moon pl.plo_moon +#define pl_evis pl.plo_evis +#define pl_svis pl.plo_svis +#define pl_x pl.plo_x +#define pl_y pl.plo_y +#define pl_z pl.plo_z +#define pl_aux1 pl.plo_aux1 +#define pl_aux2 pl.plo_aux2 + +#define b_2compute b.b_2compute +#define b_2spect b.b_2spect +#define b_2mag b.b_2mag +#define b_bo b.u.b_bo +#define b_bp b.u.b_bp +#define b_nbp b.b_nbp + +/* insure we always refer to the fields and no monkey business */ +#undef OBJ_COMMON_FLDS +#undef OBJ_SOLSYS_FLDS + +/* o_type code. + * N.B. names are assigned in order in objmenu.c + * N.B. if add one add switch in obj_cir(). + * N.B. UNDEFOBJ must be zero so new objects are undefinied by being zeroed. + * N.B. maintain the bitmasks too. + */ +enum ObjType { + UNDEFOBJ=0, + FIXED, BINARYSTAR, ELLIPTICAL, HYPERBOLIC, PARABOLIC, EARTHSAT, PLANET, + NOBJTYPES +}; + +/* types as handy bitmasks too */ +#define OBJTYPE2MASK(t) (1<<(t)) +#define FIXEDM OBJTYPE2MASK(FIXED) +#define BINARYSTARM OBJTYPE2MASK(BINARYSTAR) +#define ELLIPTICALM OBJTYPE2MASK(ELLIPTICAL) +#define HYPERBOLICM OBJTYPE2MASK(HYPERBOLIC) +#define PARABOLICM OBJTYPE2MASK(PARABOLIC) +#define EARTHSATM OBJTYPE2MASK(EARTHSAT) +#define PLANETM OBJTYPE2MASK(PLANET) +#define ALLM (~0) + +/* rise, set and transit information. + */ +typedef struct { + int rs_flags; /* info about what has been computed and any + * special conditions; see flags, below. + */ + double rs_risetm; /* mjd time of rise today */ + double rs_riseaz; /* azimuth of rise, rads E of N */ + double rs_trantm; /* mjd time of transit today */ + double rs_tranalt; /* altitude of transit, rads up from horizon */ + double rs_tranaz; /* azimuth of transit, rads E of N */ + double rs_settm; /* mjd time of set today */ + double rs_setaz; /* azimuth of set, rads E of N */ +} RiseSet; + +/* RiseSet flags */ +#define RS_NORISE 0x0001 /* object does not rise as such today */ +#define RS_NOSET 0x0002 /* object does not set as such today */ +#define RS_NOTRANS 0x0004 /* object does not transit as such today */ +#define RS_CIRCUMPOLAR 0x0010 /* object stays up all day today */ +#define RS_NEVERUP 0x0020 /* object never up at all today */ +#define RS_ERROR 0x1000 /* can't figure out anything! */ +#define RS_RISERR (0x0100|RS_ERROR) /* error computing rise */ +#define RS_SETERR (0x0200|RS_ERROR) /* error computing set */ +#define RS_TRANSERR (0x0400|RS_ERROR) /* error computing transit */ + +#define is_type(op,m) (OBJTYPE2MASK((op)->o_type) & (m)) + +/* any planet or its moons */ +#define is_planet(op,p) (is_type(op,PLANETM) && op->pl_code == (p)) + +/* any solar system object */ +#define is_ssobj(op) is_type(op,PLANETM|HYPERBOLICM|PARABOLICM|ELLIPTICALM) + + +/* natural satellite support */ + +typedef struct { + char *full; /* full name */ + char *tag; /* Roman numeral tag */ + float x, y, z; /* sky loc in planet radii: +x:east +y:south +z:front */ + float ra, dec; /* sky location in ra/dec */ + float mag; /* magnitude */ + int evis; /* whether geometrically visible from earth */ + int svis; /* whether in sun light */ + int pshad; /* whether moon is casting shadow on planet */ + int trans; /* whether moon is transiting */ + float sx, sy; /* shadow sky loc in planet radii: +x:east +y:south */ +} MoonData; + +/* separate set for each planet -- use in pl_moon */ + + +enum _marsmoons { + M_MARS = 0, /* == X_PLANET */ + M_PHOBOS, M_DEIMOS, + M_NMOONS /* including planet at 0 */ +}; + +enum _jupmoons { + J_JUPITER = 0, /* == X_PLANET */ + J_IO, J_EUROPA, J_GANYMEDE, J_CALLISTO, + J_NMOONS /* including planet */ +}; + +enum _satmoons { + S_SATURN = 0, /* == X_PLANET */ + S_MIMAS, S_ENCELADUS, S_TETHYS, S_DIONE, + S_RHEA, S_TITAN, S_HYPERION, S_IAPETUS, + S_NMOONS /* including planet */ +}; + +enum _uramoons { + U_URANUS = 0, /* == X_PLANET */ + U_ARIEL, U_UMBRIEL, U_TITANIA, U_OBERON, U_MIRANDA, + U_NMOONS /* including planet */ +}; + +#define X_MAXNMOONS S_NMOONS /* N.B. chosen by hand */ + + +/* global function declarations */ + + +/* aa_hadec.c */ +extern void aa_hadec (double lt, double alt, double az, double *ha, + double *dec); +extern void hadec_aa (double lt, double ha, double dec, double *alt, + double *az); + +/* aberration.c */ +extern void ab_ecl (double m, double lsn, double *lam, double *bet); +extern void ab_eq (double m, double lsn, double *ra, double *dec); + +/* airmass.c */ +extern void airmass (double aa, double *Xp); + +/* anomaly.c */ +extern void anomaly (double ma, double s, double *nu, double *ea); + +/* ap_as.c */ +extern void ap_as ( Now *np, double Mjd, double *rap, double *decp); +extern void as_ap ( Now *np, double Mjd, double *rap, double *decp); + +/* atlas.c */ +extern char *um_atlas (double ra, double dec); +extern char *u2k_atlas (double ra, double dec); +extern char *msa_atlas (double ra, double dec); + +/* aux.c */ +extern double mm_mjed (Now *np); + +/* chap95.c */ +extern int chap95 (double m, int obj, double prec, double *ret); + +/* chap95_data.c */ + +/* circum.c */ +extern int obj_cir (Now *np, Obj *op); + +/* comet.c */ +extern void comet (double m, double ep, double inc, double ap, double qp, + double om, double *lpd, double *psi, double *rp, double *rho, double *lam, + double *bet); + +/* constel.c */ +#define NCNS 89 +extern int cns_pick (double r, double d, double e); +extern int cns_id (char *abbrev); +extern char *cns_name (int id); +extern int cns_edges (double e, double **ra0p, double **dec0p, double **ra1p, + double **dec1p); +extern int cns_list (double ra, double dec, double e, double rad, int ids[]); +extern int cns_figure (int id, double e, double ra[],double dec[],int dcodes[]); +extern int cns_loadfigs (FILE *fp, char msg[]); + +/* dbfmt.c */ +extern int db_crack_line (char s[], Obj *op, char nm[][MAXNM], int nnm, + char whynot[]); +extern void db_write_line (Obj *op, char *lp); +extern int dbline_candidate (char line[]); +extern int get_fields (char *s, int delim, char *fields[]); +extern int db_tle (char *name, char *l1, char *l2, Obj *op); +extern int dateRangeOK (Now *np, Obj *op); + +/* deltat.c */ +extern double deltat (double m); + +/* earthsat.c */ +extern int obj_earthsat (Now *np, Obj *op); + +/* eq_ecl.c */ +extern void eq_ecl (double m, double ra, double dec, double *lt,double *lg); +extern void ecl_eq (double m, double lt, double lg, double *ra,double *dec); + +/* eq_gal.c */ +extern void eq_gal (double m, double ra, double dec, double *lt,double *lg); +extern void gal_eq (double m, double lt, double lg, double *ra,double *dec); + +/* formats.c */ +extern int fs_sexa (char *out, double a, int w, int fracbase); +extern int fs_date (char out[], int format, double jd); +extern int f_scansexa (const char *str, double *dp); +extern void f_sscandate (char *bp, int pref, int *m, double *d, int *y); + +/* helio.c */ +extern void heliocorr (double jd, double ra, double dec, double *hcp); + +/* jupmoon.c */ +extern void jupiter_data (double Mjd, char dir[], Obj *sop, Obj *jop, + double *jupsize, double *cmlI, double *cmlII, double *polera, + double *poledec, MoonData md[J_NMOONS]); + +/* libration.c */ +extern void llibration (double JD, double *llatp, double *llonp); + +/* magdecl.c */ +extern int magdecl (double l, double L, double e, double y, char *dir, + double *dp, char *err); + +/* marsmoon.c */ +extern void marsm_data (double Mjd, char dir[], Obj *sop, Obj *mop, + double *marssize, double *polera, double *poledec, MoonData md[M_NMOONS]); + +/* misc.c */ +extern void zero_mem (void *loc, unsigned len); +extern int tickmarks (double min, double max, int numdiv, double ticks[]); +extern int lc (int cx, int cy, int cw, int x1, int y1, int x2, int y2, + int *sx1, int *sy1, int *sx2, int *sy2); +extern void hg_mag (double h, double g, double rp, double rho, double rsn, + double *mp); +extern int magdiam (int fmag, int magstp, double scale, double mag, + double size); +extern void gk_mag (double g, double k, double rp, double rho, double *mp); +extern double atod (char *buf); +extern void solve_sphere (double A, double b, double cc, double sc, + double *cap, double *Bp); +extern double delra (double dra); +extern void now_lst (Now *np, double *lstp); +extern void radec2ha (Now *np, double ra, double dec, double *hap); +extern void gha (Now *np, Obj *op, double *ghap); +extern char *obj_description (Obj *op); +extern int is_deepsky (Obj *op); + +/* mjd.c */ +extern void cal_mjd (int mn, double dy, int yr, double *m); +extern void mjd_cal (double m, int *mn, double *dy, int *yr); +extern int mjd_dow (double m, int *dow); +extern int isleapyear (int year); +extern void mjd_dpm (double m, int *ndays); +extern void mjd_year (double m, double *yr); +extern void year_mjd (double y, double *m); +extern void rnd_second (double *t); +extern void mjd_dayno (double jd, int *yr, double *dy); +extern double mjd_day (double jd); +extern double mjd_hr (double jd); +extern void range (double *v, double r); +extern void radecrange (double *ra, double *dec); + +/* moon.c */ +extern void moon (double m, double *lam, double *bet, double *rho, + double *msp, double *mdp); + +/* mooncolong.c */ +extern void moon_colong (double jd, double lt, double lg, double *cp, + double *kp, double *ap, double *sp); + +/* moonnf.c */ +extern void moonnf (double mj, double *mjn, double *mjf); + +/* nutation.c */ +extern void nutation (double m, double *deps, double *dpsi); +extern void nut_eq (double m, double *ra, double *dec); + +/* obliq.c */ +extern void obliquity (double m, double *eps); + +/* parallax.c */ +extern void ta_par (double tha, double tdec, double phi, double ht, + double *rho, double *aha, double *adec); + +/* parallactic.c */ +extern double parallacticLDA (double lt, double dec, double alt); +extern double parallacticLHD (double lt, double ha, double dec); + +/* plans.c */ +extern void plans (double m, PLCode p, double *lpd0, double *psi0, + double *rp0, double *rho0, double *lam, double *bet, double *dia, + double *mag); + +/* plshadow.c */ +extern int plshadow (Obj *op, Obj *sop, double polera, + double poledec, double x, double y, double z, float *sxp, float *syp); + +/* plmoon_cir.c */ +extern int plmoon_cir (Now *np, Obj *moonop); +extern int getBuiltInObjs (Obj **opp); +extern void setMoonDir (char *dir); + +/* precess.c */ +extern void precess (double mjd1, double mjd2, double *ra, double *dec); + +/* reduce.c */ +extern void reduce_elements (double mjd0, double m, double inc0, + double ap0, double om0, double *inc, double *ap, double *om); + +/* refract.c */ +extern void unrefract (double pr, double tr, double aa, double *ta); +extern void refract (double pr, double tr, double ta, double *aa); + +/* rings.c */ +extern void satrings (double sb, double sl, double sr, double el, double er, + double JD, double *etiltp, double *stiltp); + +/* riset.c */ +extern void riset (double ra, double dec, double lt, double dis, + double *lstr, double *lsts, double *azr, double *azs, int *status); + +/* riset_cir.c */ +extern void riset_cir (Now *np, Obj *op, double dis, RiseSet *rp); +extern void twilight_cir (Now *np, double dis, double *dawn, double *dusk, + int *status); + +/* satmoon.c */ +extern void saturn_data (double Mjd, char dir[], Obj *eop, Obj *sop, + double *satsize, double *etilt, double *stlit, double *polera, + double *poledec, MoonData md[S_NMOONS]); + +/* sphcart.c */ +extern void sphcart (double l, double b, double r, double *x, double *y, + double *z); +extern void cartsph (double x, double y, double z, double *l, double *b, + double *r); + +/* sun.c */ +extern void sunpos (double m, double *lsn, double *rsn, double *bsn); + +/* twobody.c */ +extern int vrc (double *v, double *r, double tp, double e, double q); + +/* umoon.c */ +extern void uranus_data (double Mjd, char dir[], Obj *sop, Obj *uop, + double *usize, double *polera, double *poledec, MoonData md[U_NMOONS]); + +/* utc_gst.c */ +extern void utc_gst (double m, double utc, double *gst); +extern void gst_utc (double m, double gst, double *utc); + +/* vsop87.c */ +extern int vsop87 (double m, int obj, double prec, double *ret); + +#ifdef __cplusplus +} +#endif + +#endif /* _ASTRO_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: astro.h,v $ $Date: 2013/01/06 01:12:57 $ $Revision: 1.33 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/bdl.h b/Common/Libraries/XEphemAstroLib/include/bdl.h new file mode 100644 index 000000000..3b4d0ea33 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/bdl.h @@ -0,0 +1,6 @@ +extern int read_bdl (FILE *fp, double jd, double *xp, double *yp, double *zp, + char ynot[]); + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: bdl.h,v $ $Date: 2003/03/20 08:56:31 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/chap95.h b/Common/Libraries/XEphemAstroLib/include/chap95.h new file mode 100644 index 000000000..fff8acdd7 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/chap95.h @@ -0,0 +1,68 @@ +/* Position of outer planets; straightforward from: +ftp://adc.gsfc.nasa.gov/pub/adc/archives/journal_tables/A+AS/109/181: + +J/A+AS/109/181 Planetary ephemerides (Chapront, 1995) +=============================================================================== +Representation of planetary ephemerides by frequency analysis. Application to +the five outer planets. + CHAPRONT J. + + =1995A&AS..109..181C (SIMBAD/NED Reference) +=============================================================================== + +Keywords: ephemerides - planets and satellites: general - methods: numerical + +Contents: + Heliocentric equatorial rectangular coordinates of the five outer planets + (X, Y and Z). The source is based on DE200 (tables 4 to 7) or a reconstruction + of DE200 by numerical integration (tables 9 to 13). The reference frame is + the mean equator and equinox J2000 of DE200. + + The general formulation of the series X is: + X = SUM[i=1,Records] T**n_i*(CX_i*cos(Nu_k*t)+SX_i*sin(Nu_k*t)) + The formulation is identical for Y and Z. + T is the time (TDB) in Julian centuries from J2000: + T = (JulianDate - 2451545.0)/36525 + t is the time (TDB) in Julian years from J2000: + t = (JulianDate - 2451545.0)/365.25 + Nu is the frequency. Frequencies are identical for all terms of rank k: + Nu_k = Nu_i when n_i = 0 + For purely secular terms k = 0 and Nu_0 = 0 + +=============================================================================== +(End) Patricia Bauer [CDS] 03-Oct-1994 +*/ + +#define CHAP_SCALE 1e10 + +/* JDs of validity period */ +#define CHAP_BEGIN (2338032.5 - MJD0) /* 1689/3/19 */ +#define CHAP_END (2542032.5 - MJD0) /* 2247/10/1 */ + +/* coding flags */ +/* calculating rates increases time by about 10% + * + * On an HP715/75, for pluto the times per step are 0.00049 s and 0.00057 s + * This method is quite fast. + */ +#define CHAP_GETRATE 1 + +typedef struct { + short n; /* order of time; "-1" marks end of list */ + double amp[6]; /* amplitudes of cosine and sine terms for x,y,z */ + /* in original order [CX,SX,CY,SY,CZ,SZ] */ + double Nu; /* Frequency Nu_k; given only at n=0 */ +} chap95_rec; + +extern chap95_rec chap95_jupiter[]; +extern chap95_rec chap95_saturn[]; +extern chap95_rec chap95_uranus[]; +extern chap95_rec chap95_neptune[]; +extern chap95_rec chap95_pluto[]; + +extern int chap95 (double m, int obj, double prec, double *ret); + + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: chap95.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.2 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/deepconst.h b/Common/Libraries/XEphemAstroLib/include/deepconst.h new file mode 100644 index 000000000..8c715676a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/deepconst.h @@ -0,0 +1,34 @@ +#ifndef _CONST_H +#define _CONST_H + +/* $Id: deepconst.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + + +#define GE (3.986005E14) + +#define PI (3.1415926535897932385) + +#define XKE (7.43669161E-2) +#define CK2 (5.413080E-4) +#define CK4 (6.2098875E-7) +#define E6A (10E6) +#define QOMS2T (1.88027916E-9) +#define S (1.01222928) +#define TOTHRD (2.0/3.0) /* 6.6666666666666666667E-1 */ +#define XJ3 (-2.53881E-6) +/* #define XKE KE */ +#define XKMPER (6378.135) +#define XMNPDA (1440.0) +#define AE (1.0) +#define DE2RA (1.7453292519943295769E-2) +#define PIO2 (1.57079632679489661925) /* PI/2 */ +#define TWOPI (6.2831853071795864770) +#define X3PIO2 (4.7123889803846898578) /* 3*PI/2 */ + +#define RHO (0.15696590235) + +#endif /* _CONST_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: deepconst.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/preferences.h b/Common/Libraries/XEphemAstroLib/include/preferences.h new file mode 100644 index 000000000..c5786611f --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/preferences.h @@ -0,0 +1,41 @@ +/* global info for the preferences facility. + * N.B. many of these enums are used as indexes -- don't change without + * checking where they are used! + */ +#ifndef _PREFERENCES_H +#define _PREFERENCES_H + +#ifdef __cplusplus +extern "C" { +#endif + +// all of your legacy C code here + + +typedef enum { + PREF_EQUATORIAL, PREF_UNITS, PREF_DATE_FORMAT, PREF_ZONE, PREF_DPYPREC, + PREF_MSG_BELL, PREF_PRE_FILL, PREF_TIPS, PREF_CONFIRM, PREF_WEEKSTART, + NPREFS +} Preferences; + +typedef enum {PREF_GEO, PREF_TOPO} PrefEquatorial; +typedef enum {PREF_ENGLISH, PREF_METRIC} PrefUnits; +typedef enum {PREF_MDY, PREF_YMD, PREF_DMY} PrefDateFormat; +typedef enum {PREF_LOCALTZ, PREF_UTCTZ} PrefStampZone; +typedef enum {PREF_LOPREC, PREF_HIPREC} PrefDpyPrec; +typedef enum {PREF_NOMSGBELL, PREF_MSGBELL} PrefMsgBell; +typedef enum {PREF_PREFILL, PREF_NOPREFILL} PrefPreFill; +typedef enum {PREF_TIPSON, PREF_NOTIPS} PrefTips; +typedef enum {PREF_CONFIRMON, PREF_NOCONFIRM} PrefConfirm; +typedef enum {PREF_SAT, PREF_SUN, PREF_MON} PrefWeekStart; + +extern int pref_get (Preferences p); +extern int pref_set (Preferences p, int newp); +#ifdef __cplusplus +} +#endif +#endif /* _PREFERENCES_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: preferences.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.6 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/satlib.h b/Common/Libraries/XEphemAstroLib/include/satlib.h new file mode 100644 index 000000000..31c34675c --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/satlib.h @@ -0,0 +1,206 @@ +#ifndef __SATLIB_H +#define __SATLIB_H + +/* $Id: satlib.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +typedef struct _SatElem { + float se_XMO; + float se_XNODEO; + float se_OMEGAO; + float se_EO; + float se_XINCL; + float se_XNDD60; + float se_BSTAR; + float pad1; + double se_XNO; + double se_XNDT20; + double se_EPOCH; + struct { + unsigned int catno : 21; + unsigned int classif : 5; + unsigned int elnum : 10; + unsigned int year : 14; + unsigned int launch : 10; + unsigned int piece : 15; + unsigned int ephtype : 4; + unsigned int orbit : 17; + } se_id; +} SatElem; + +#if 0 +struct sat_loc { + double sl_X; + double sl_XDOT; + double sl_Y; + double sl_YDOT; + double sl_Z; + double sl_ZDOT; +}; +#endif + +struct sgp4_data { + unsigned int sgp4_flags; + unsigned int pad; + double sgp4_AODP; + double sgp4_AYCOF; + double sgp4_C1; + double sgp4_C4; + double sgp4_C5; + double sgp4_COSIO; + double sgp4_D2; + double sgp4_D3; + double sgp4_D4; + double sgp4_DELMO; + double sgp4_ETA; + double sgp4_OMGCOF; + double sgp4_OMGDOT; + double sgp4_SINIO; + double sgp4_SINMO; + double sgp4_T2COF; + double sgp4_T3COF; + double sgp4_T4COF; + double sgp4_T5COF; + double sgp4_X1MTH2; + double sgp4_X3THM1; + double sgp4_X7THM1; + double sgp4_XLCOF; + double sgp4_XMCOF; + double sgp4_XMDOT; + double sgp4_XNODCF; + double sgp4_XNODOT; + double sgp4_XNODP; +}; + +struct deep_data { + struct { + unsigned int IRESFL : 1; + unsigned int ISYNFL : 1; + } deep_flags; + double deep_s_SINIQ; + double deep_s_COSIQ; + double deep_s_OMGDT; + double deep_ATIME; + double deep_D2201; + double deep_D2211; + double deep_D3210; + double deep_D3222; + double deep_D4410; + double deep_D4422; + double deep_D5220; + double deep_D5232; + double deep_D5421; + double deep_D5433; + double deep_DEL1; + double deep_DEL2; + double deep_DEL3; + double deep_E3; + double deep_EE2; + double deep_FASX2; + double deep_FASX4; + double deep_FASX6; + double deep_OMEGAQ; + double deep_PE; + double deep_PINC; + double deep_PL; + double deep_SAVTSN; + double deep_SE2; + double deep_SE3; + double deep_SGH2; + double deep_SGH3; + double deep_SGH4; + double deep_SGHL; + double deep_SGHS; + double deep_SH2; + double deep_SH3; + double deep_SHS; + double deep_SHL; + double deep_SI2; + double deep_SI3; + double deep_SL2; + double deep_SL3; + double deep_SL4; + double deep_SSE; + double deep_SSG; + double deep_SSH; + double deep_SSI; + double deep_SSL; + double deep_STEP2; + double deep_STEPN; + double deep_STEPP; + double deep_THGR; + double deep_XFACT; + double deep_XGH2; + double deep_XGH3; + double deep_XGH4; + double deep_XH2; + double deep_XH3; + double deep_XI2; + double deep_XI3; + double deep_XL2; + double deep_XL3; + double deep_XL4; + double deep_XLAMO; + double deep_XLI; + double deep_XNI; + double deep_XNQ; + double deep_XQNCL; + double deep_ZMOL; + double deep_ZMOS; +}; + +struct sdp4_data { + double sdp4_AODP; /* dpa */ + double sdp4_AYCOF; + double sdp4_BETAO; /* dpa */ + double sdp4_BETAO2; /* dpa */ + double sdp4_C1; + double sdp4_C4; + double sdp4_COSG; /* dpa */ + double sdp4_COSIO; /* dpa */ + double sdp4_EOSQ; /* dpa */ + double sdp4_OMGDOT; /* dpa */ + double sdp4_SING; /* dpa */ + double sdp4_SINIO; /* dpa */ + double sdp4_T2COF; + double sdp4_THETA2; /* dpa */ + double sdp4_X1MTH2; + double sdp4_X3THM1; + double sdp4_X7THM1; + double sdp4_XLCOF; + double sdp4_XMDOT; /* dpa */ + double sdp4_XNODCF; + double sdp4_XNODOT; /* dpa */ + double sdp4_XNODP; /* dpa */ + + double sdp4_XMDF_seco; + double sdp4_OMGADF_seco; + double sdp4_XNODE_seco; + double sdp4_EM_seco; + double sdp4_XINC_seco; + double sdp4_XN_seco; + + double sdp4_E_pero; + double sdp4_XINC_pero; + double sdp4_OMGADF_pero; + double sdp4_XNODE_pero; + double sdp4_XMAM_pero; +}; + +typedef struct _SatData { + struct _SatElem *elem; + union { + struct sgp4_data *sgp4; + struct sdp4_data *sdp4; + } prop; + struct deep_data *deep; +} SatData; + +void sgp4(SatData *sat, Vec3 *pos, Vec3 *dpos, double t); + +void sdp4(SatData *sat, Vec3 *pos, Vec3 *dpos, double TSINCE); + +#endif /* __SATLIB_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: satlib.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/satspec.h b/Common/Libraries/XEphemAstroLib/include/satspec.h new file mode 100644 index 000000000..0986dd789 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/satspec.h @@ -0,0 +1,43 @@ +#ifndef __SATSPEC_H +#define __SATSPEC_H + +/* $Id: satspec.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +#include "sattypes.h" +#include "satlib.h" + +#define SGP4_SIMPLE 0x00000001 + +extern void init_deep(struct deep_data *deep); +void init_sdp4(struct sdp4_data *sdp); +char *tleerr(int); +int readtle(char *, char *, SatElem *); + +double current_jd(); + +double ut1_to_gha(double); + +void smallsleep(double t); + +double epoch_jd(double); + +double actan(double sinx, double cosx); + +double thetag(double EP, double *DS50); + +void dpinit(SatData *sat, double EQSQ, double SINIQ, double COSIQ, + double RTEQSQ, double AO, double COSQ2, double SINOMO, + double COSOMO, double BSQ, double XLLDOT, double OMGDT, + double XNODOT, double XNODP); + +void dpsec(SatData *sat, double *XLL, double *OMGASM, double *XNODES, + double *EM, double *XINC, double *XN, double T); + +void dpper(SatData *sat, double *EM, double *XINC, double *OMGASM, + double *XNODES, double *XLL, double T); + +#endif /* __SATSPEC_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: satspec.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/sattypes.h b/Common/Libraries/XEphemAstroLib/include/sattypes.h new file mode 100644 index 000000000..61891ff03 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/sattypes.h @@ -0,0 +1,28 @@ +#ifndef __SATTYPES_H +#define __SATTYPES_H + +/* $Id: sattypes.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +typedef struct _Vec3 { + double x, y, z; +} Vec3; + + +typedef struct _LookAngle { + double az; + double el; + double r; +} LookAngle; + + +typedef struct _Geoloc { + double lt; + double ln; + double h; +} GeoLoc; + +#endif /* __SATTYPES_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: sattypes.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/vector.h b/Common/Libraries/XEphemAstroLib/include/vector.h new file mode 100644 index 000000000..be1ec56c2 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/vector.h @@ -0,0 +1,19 @@ +#ifndef __SATVECTOR_H +#define __SATVECTOR_H + +/* $Id: vector.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +#define dotp(A,B) ((A).x*(B).x+(A).y*(B).y+(A).z*(B).z) + +#define crossp(A,B,C) {(C).x=(A).y*(B).z-(A).z*(B).y;(C).y=(A).z*(B).x-(A).x*(B).z;(C).z=(A).x*(B).y-(A).y*(B).x;} + +#define vecabs(V) (sqrt((V).x*(V).x+(V).y*(V).y+(V).z*(V).z)) +#define vecsq(V) ((V).x*(V).x+(V).y*(V).y+(V).z*(V).z) +#define vecsub(A,B,C) {(C).x=(A).x-(B).x;(C).y=(A).y-(B).y;(C).z=(A).z-(B).z;} +#define vecscale(A,k) {(A).x*=(k);(A).y*=(k);(A).z*=(k);} + +#endif /* __SATVECTOR_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: vector.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/include/vsop87.h b/Common/Libraries/XEphemAstroLib/include/vsop87.h new file mode 100644 index 000000000..b5cb958f5 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/include/vsop87.h @@ -0,0 +1,93 @@ +/* Position of planets mercury to neptune; from: +ftp://ftp.bdl.fr/pub/ephem/planets/vsop87/ +from README: + +========================== =========================== + BUREAU DES LONGITUDES + PLANETARY SOLUTION VSOP87 + 1996, January +========================== =========================== + +These files and programs are associated to : + +Planetary Theories in rectangular and spherical variables: VSOP87 solution. + Bretagnon P., Francou G. + Astron. Astrophys. 202, 309 (1988). + +Theorie du mouvement de l'ensemble des planetes (VSOP82). + Bretagnon P. + Astron. Astrophys. 114, 278 (1982). + +============================================================================== + +Description: + The Planetary solutions VSOP87 (Variations Seculaires des Orbites + Planetaires) are analytical solutions of the motion of the planets in + different versions. The main version VSOP87 consists of the series in + elliptic elements as in the case of VSOP82 solution and the other + versions VSOP87 (A-B-C-D-E) are built in rectangular and spherical + variables. + +Authors' Address: + P. Bretagnon, G. Francou + Bureau des Longitudes, CNRS URA 707 + 77, Avenue Denfert-Rochereau + 75014, Paris, France + Tel : (33) 1 40 51 22 69 (33) 1 40 51 22 60 + Fax : (33) 1 46 33 28 34 + E-mail : pierre@bdl.fr francou@bdl.fr + +Contents: + The main version of VSOP87 is similar to the previous theory VSOP82. + In the both cases the constants of integration have been determined by + fitting to the numerical integration DE200 of the Jet Propulsion + Laboratory. The various versions of VSOP87 are different from one to + another in the type of coordinates and the reference frame. + VSOP87 : heliocentric elliptic variables; equinox and ecliptic J2000. + VSOP87A : heliocentric rectangular variables; equinox and ecliptic J2000. + VSOP87B : heliocentric spherical variables; equinox and ecliptic J2000. + VSOP87C : heliocentric rectangular variables; equinox and ecliptic of date. + VSOP87D : heliocentric spherical variables; equinox and ecliptic of date. + VSOP87E : barycentric rectangular variables; equinox and ecliptic J2000. +... +============================================================================== +User feed-back is encouraged. Unless otherwise specified, send comments and bug +reports to: E-mail : comments@bdl.fr + Fax : (33) 1 46 33 28 34 + Postal mail: Bureau des longitudes + 77 avenue Denfert Rochereau + F-75014 PARIS +============================================================================== + implemented for C: stern +*/ + +#define VSOP_ASCALE 1e8 /* amplitude factor as stored */ + +/* coding flags */ +#define VSOP_SPHERICAL 1 /* version in data.c uses spherical coords */ +#define VSOP_GETRATE 0 /* calculate time derivatives of coordinates */ + +/* data tables */ +extern double vx_mercury[][3]; +extern int vn_mercury[][3]; +extern double vx_venus[][3]; +extern int vn_venus[][3]; +extern double vx_earth[][3]; +extern int vn_earth[][3]; +extern double vx_mars[][3]; +extern int vn_mars[][3]; +extern double vx_jupiter[][3]; +extern int vn_jupiter[][3]; +extern double vx_saturn[][3]; +extern int vn_saturn[][3]; +extern double vx_uranus[][3]; +extern int vn_uranus[][3]; +extern double vx_neptune[][3]; +extern int vn_neptune[][3]; + +extern int vsop87 (double mj, int obj, double prec, double *ret); + + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: vsop87.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.2 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/Makefile b/Common/Libraries/XEphemAstroLib/src/Makefile new file mode 100644 index 000000000..0e1eb839e --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/Makefile @@ -0,0 +1,253 @@ + +#******************************************************************************* +# ALMA - Atacama Large Millimiter Array +# Copyright (c) UNSPECIFIED - FILL IN, 2021 +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# SPOPPI 2021-06-29 created +# + +# ALMA - Atacama Large Millimeter Array +# Copyright (c) ESO - European Southern Observatory, 2014 +# (in the framework of the ALMA collaboration). +# All rights reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +#******************************************************************************* + +#******************************************************************************* +# This Makefile follows ALMA/ACS Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +USER_CFLAGS = -c -pedantic -Wall + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lm + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# +# +astro_OBJECTS = aa_hadec aberration actan \ + airmass anomaly ap_as atlas auxil \ + bdl chap95 chap95_data circum comet constel \ + dbfmt deep deltat earthsat eq_ecl eq_gal \ + formats helio jupmoon libration magdecl marsmoon \ + misc mjd moon mooncolong moonnf nutation obliq \ + parallactic parallax plans plmoon plshadow precess \ + reduce refract rings riset riset_cir satmoon sdp4\ + sgp4 sphcart sun thetag twobody umoon utc_gst vsop87 vsop87_data + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = astro.h chap95.h preferences.h satspec.h vector.h \ + bdl.h deepconst.h satlib.h sattypes.h vsop87.h + + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = astro +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# For expressing dependencies between jarfiles (parallel builds) +jjj_JLIBS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Libraries/XEphemAstroLib/src/a.out b/Common/Libraries/XEphemAstroLib/src/a.out new file mode 100644 index 0000000000000000000000000000000000000000..b53e559fff301498abe59a1e4864ec5d0bdf55de GIT binary patch literal 409952 zcmb<-^>JfjWMqH=W(GS35Klo3BH{p{7!oYmpezOk2L=lUUIqsS1qOKrkSGfSNDLwk zQxBtWFhRs&GzWysz|6qF0MaJ`VlXf;pwlu?bub#_CXf(_2I&K_v0)3S1{lpC08s_f z#|mO9fCvT#1~hu=GLQ-e1{jU34{YBBh&%%t-QWf>4@M*F1BDHTBqRVhG*M}RXAqCi zPzRgN0MiFj1=6P>17a~SXy~BQ0uU|(jE03L$P^H^fEdewPNR930bO4NR3AF+0`VRL zj0V{O5(<7=k^*9*+XLg{vM&It&)_#CJkjYnPTvzUWIoZNIl35kewhkAcH~r zp-~Ltg7up*Fo5$U*r|*YL2M?Fm^lLjg9QTv!^PBdxt5>0WkhH2ID<7|A?g?z7=*Bh zPsAa98;5uZ4)FjS;#oMv6PU2OM<0jyCmiO)GhjEz5Qq9JIK)@r5Vyr49)!c4$vD(2 z<50g2hk92W;*L1PZE%R2;js5O4)tC*#LaPtAI1^>>^SV*ghTxs9Oh5QA>NHcya|WB zd^p7OahMZ_LwqX^@!vT7wFig#gE+*0;t==8A+C)>JPL=nJW|z%TpXz5P;Y@lJQGKF zR^t!{m2~pSCST=oRQ6tmS2#X$B;?-T4H7nLt;`s$c~btlKd2gVi1+Xkd~UC#*mhtT2jmqAD>*27@t^@T9H}8 zkeixYoLa&VAD>!Ol$Rf$lb@Vel9`{!kXD?Unhlao&Mjbwk55CkJ2@x6IF%tcF()TK znW4BOCAFxCA+5Y9vm_OyvM4n%1>_cx&B+->VCNMj7gU19Aah6EpJ|(o(?^X+^224DLRjPR45O%zgo{=Sjsb>mj zBNUj!#X#B^7?>EC8JHPZz!1b@W?*Gtfr>FPurRQJW!V{6z$!uNSQ$WSm>D?0svvqH zBFqdR9V`s&3=9k)9U$`<7(lHem^_FLYQHdo+AZK_E~p$R(VWBqQr8Y`>@YGgF~~AP zn!yGP3=EwUr?G)doXi9fE0xOR1oar^!PT=clt9&kvZqL9CNBd62g53;dT}tHjbRIv z57E!e0MZXCi%KLx<}oqsgPI3#pMwkoVRaC}z#sr?w?nuLDjE=m1e*8(Xn#oqO}ybU zqyVu%6XygqL>L$tJkZ4DpyCl|;`&hW3^Z{!sCWgMcnnm$15G?1Dn0{Eyag)00!@52 zRD1`T_$H|M2{iFTQ1KgR;uoOeFVMtaK*fKciT{U+b7(;#2-aT_zX}OY4K#5@sJI21 zxG7ZJ15Ml+DjtC*9s(85Kod`ZidUeC=R?Ii(8Oz@;xo|1`=H`0(8Q-e#dn~IFMx`l zKoegM6~BQdz7;C|0!{odRQv~;_ywpqhc;?BKZJ@)pozbLiff>W>t2Jziv^naFQ|GC zG;waI`Uo^}6{vUynz#{Eya7#IVJWD`#K6#jCceNB;-3j<;tl&D>Sv&d9{~5*7#J3y zi7z+|F=qvu_yb3X_y%87xL*NHyaDQd4g-ijnE5cif(N9Whl!g! zf~1E8G;wRFcm|qyBUF3=nz$oWd9@-Rd)bQoFN@z?g=#U35^i(3uxjqpyCqTsOB$#iYuUrAGirIM*~fK1614qP5i+M zi24(tfhGn9@c1=oEDh4CV_>*|B+dmBWME*pfh4YjB>n(NTpvmN1(LWSlK2NCabqO$ zA4uY+NaC=5D9F{Iu|Aj-tltU}2aN;5!~^so)66c4Cfv5vW;-G#5NDPEeAc+ft1fci= zk~s1>#SJ8JVW?UV^#Dm6G+qo61K}4);-Vk{DE@#XE(R3?Q9qEx#X$lv3{6*{u$O>| zF)%Q2Ac;#Ni3=c!OCgC%Ac;#Oi7Oz9%OHtsAc@N&i5nn^%OQzdAc=#LM%WM*M$gy$rVWAdSDRnaO)X#>9 zGBE5w5{JxiKx7UeiJL%#M#<3-7!8485(1z3<$ifIzv1xcX1&SJ#Ng3-poHoF1&`(< z9H5yU28REpQhZDdpZ=>#^D!~-%QJw~XMp_v>E*-!|Nl<_^Fa-bPcJXR`Je{IrE%K=AJmZe^l~Dc4{AVsdf5o)gDS62FAL#(P=n#q%S1RI)KK{J zG7!!OHQYYEbcFLk4TeuI4dHxHL*dg)MK~YSK=|}h5Y7iR3_iVNg!4fSf=@3${)71! z)DZae@*$iLY5;tCc@fSBRs5e`9)$Bj75=A}8{vFVMgQsLLO35(!GC%=5zYry?4MpX z!ug;I{nN`rI3HAze|nh+=YuNnPcH-Ed{D*x>7^r_52~;~y)=aLK^66 zRkWX8E`;+z73`;%6XASN#ro-GBb*PaP(Qsag!4fa>8F>8a6YI4{q!;r&IeVTpI$n` z`Jf8((@R4*AJl;V^imPd2UVP(UJAnbpbGQTOGX&~(|^^uJfPI?!T?VHpZ=?ga-;Hj z(fF)r{J&hN>c67#-=guKqVeyd@voxs&!X{lFjjxKvmqp`?qVajr_^fFBznp0C zkH&wC#(#>&zl+AdipD>S#y^V2-;2iIipF1y#$SreH+<{ac`?qT^N~mMlMewQKE14N z3m6$ZdU?;!2T`^M85kJ;i%#NXV)!z_qu2J}3swe?Ue;Y8%JN5vs7E(z9w($~;r#!A zU%mlUeH@0;9=)~`K?-|KyFirYKab829tYpqdmQ}1?7?`<e2bsqxnrhXYC%3&e9Dj9^EXept8oJ)Afhp0gv9$ z10LP1w^lGRcywM%<9~k=JQkbg!Jl{F#TU?APPgj;Fwdjc_Q`Wrh8Oey{r~ULYq}7u zqquWI#BgMlQ67u}5Q$f+$e54@OF~%|W@Py|7?4=hz z@e8OHFK1-<#4jKVqCI*;R6Nr7HO_kUmZ$`H^wy|2eBu|>QTfC#AQ}x($7;Qtk>Ld& zF9S%EjtWR%k3T_314i1z4aHC+x$(KRXwpZFt>f@0vrC;muQbFiW~F#Uo{4s3>t zO2mu#e?akDqhbLv&fpWj0PojjAXi160C`jptSjaq$OK+6ThLYD6Tg6qO28-n2p5%v z7yZBf|Nq1<;G+W4TcTnCmIOK7M}^}Pzo3cAi?csLDk51_UVQ!yVhOr(Koq@D{sZDi zvVc74qr&lGGFWAVi;Bl5enD4;ms|e*|IaVa018)dSorkjs08@*rl@$ln4tjnL8yRF z=R2Ry=b!imd_ktVGJwJ{;>Ax9u(XZ}T$=UYQbq=lUJH;Z2B46B;mitE1q$v2kTowB zcz}gmR6HO$U#thaNgzeV0wMtSD>w)QQ&a>#@eBH>XuN2HD0D$rDChzT2mu#RdG;unljk@&u|H%)uAc;5dSXdju$O1zv{#{r~^P#-Gsk zkYl)Gm}978NN8~9Z;!?|FTh1Xi;4y~WrGrAXNXFKPxl@b1+a*Viibyci;4l5~rVB9idw{MPyY z6MxJ>kO?mgL8-aBMn%J?^OaBMvrqg2d%)U1@e6EG*}wpf+a8q_3=E(|buEow{gV&KtTqoVMlR)~S2_4X%z0kDYzB`N~^Et!m9BYVJpYW~g0-|EiDz|i?3jbGy; zs03KK7?fv48b0wyUi9cZ?9t1b&I~HebS{9(5|2;(0-)#>1iAXyC;rG|pZFsVrSWTA z`@|n{?Gt|tD6&s|;*UEB%D=gb!G+Ta{`O$7t+6-K_%#lH;uow@0i~!C6@eF7-@$1J z>~VoqP{!evUku9if+?U-0Ox&3_BO*c3lfYM?FI8}lI;uC*_uLL+`G(PczrF;dTj1!;u1v&UzBtR*u8y6MrOc$0A0C=EICHpM&axZq~v@j0~XI2mnVf2dET0 z@QGj0{>1}pNbwx;iC-WGocSPe@`+!d1mtx=4N!n5eBu{005LK^t^%2_v51l3^*l(u zoyMG@Zy6YIO0WLJOrf`0p1&6InkXE zF6&J&*K`w@vfT{Q(Z>(gkps%^g1QcjObjn?{Q;MQU?+ou&qc)|jbG!uNADJu8Q?S> zp}SxqDEb6s0~Uhg>Y7LI9+e3YIoT43WvVG4lQLHywLpe|3ApT z4r%-v;DSE_Y+mHSPy8{gA#ipC!zX@0hL_R*{{Meb_VxdNNO(Z%PjKD&H`t@|vq$rr z3Z%Rbtv~fx?=XTg{yPRx#s|e@8owUz0Y)ZJ__02C016*L7nK11F3@^4{#Gt<;uT=s z2a^FsnQFxXus?-A@eAmtK-jitz;xu5Py7Ngpn6Hbm*F#io#|4LunWHc>lP4$Kj!`? z{>U?*_~WjEvO^kw$gwm>e*FWV_~Xug;*Y%gi9hZNf4d|zD0BpUK!vqHj0&iFy`RP( z@)@M`1AjYc<>x2<$g`jLsd;G@C;3WpsGpl}dmh0u`tRgm@6eO3nk?hpS!A+2!`WDcnC=23Z( z2{8d&3AliqDacy}HKFf5D+9P6pT;lW0%~1>!q@i0d{DT>$!36Q0oEJyp|#;BegV_j zU`~#T0k|d=i~*I0k-vR9-+?P24rp!i`4fNSZwOnk1XPrOcoCqY==dl82v8H@=qLWT zBQI({LCXXVv>LMpoNNz)>q~`C{DL+rF9IQIV^l!(IH;*(0BVkRvv$q{IaiZHia zpym<}$n7qm#)kzcL%;CoX3Yev6RZJcmdMAST=*fiZRF)NevKm_MGrpl$AD^6(feSP zAcJ5SBpwNI@~MwtC;O-+BTs(fkG$~76-2o3 zM;`dZ501>p^Pl)5uYcl?JpRd%Kjy?INB)RQkRW`q;{(`+7!?6fEP8l!v#y&9_9Cwu z*kJ-CDjHz-dUUh)fMp_&eBzHh4HA3ti9hZri1Ud*;v6WxenS+1A_Ro*ed3R}`H4T` z2B^ix4>nFPM#baB7f2!r0i`gFLoZ4{f$})38CbJ`54g1nZlOQ$=w_7wi$-37*>@F| zCtmXW1*JYve+3jaqV;p(2`5fg3am?jH3=*TO+YUE0=%AJ32;hs;g7tGnv`7lBTs(< z34;@p3%L0N;X8uTkt2V^p-=oVCqTt4s0j;BR2q=*3sFHNsu~pwkc&c8K#e(2sNF@cw}J#+KxGF!SqXuJK#ebnPyCUe zL8iv2fGd#)plC?r*Ej}haeyk@4zS9|(;#sO1~--=$*LIS3>SU@NcHFfZt?kmlU0a{ z1Sl;%0(k&rvMhaMc8mc`l%I1x`{f{E-hq$?WwfM^K>gM;-zN)Flw{2$Z}| zeRAcGcnWf0iVDYz;CC=@dvvq<%?33oz})}=-j}l(89;XVAX1qcNQfU>Ds$nFI0^FG z9*7E<-)@2|ya{P-2!fll0;~&XGcvsBF<}53o}$8$=E$#cn&LdVS=pd+KRmiwnZP#3T}|`h&pQB5iJ8Ct|9|oS-T(h- zda$Am+>Zv=KVhK$8z{**hJNCYIqDeV+4&{Zqw{L8N9S*k<|7TDs%|paO2H6NMK2)A z3bq8)u1@3Ezrf$F$^vR`=BQNo^p=2|e&A+{U<#;p`^^W`$P@$>5d4BUDgrNNyafj} z>xo&63_hLTz*RG-V+2+q5Ta55))4ms)VNy%wpO4-r2j$xH>KY zbqGLB2?1F~u-O7R;DQ$1%}D_Tb>yv2{1LKmz(z#s{sGg1Dd3!vqLT2*g+BsR#Ii01 zOMtXRu+E3DkAHIEj{!?gg9sdht6mBcaN&<*4S_HsSgRq7NLH;G;Or2`stIE7gW9{1 z7eG}8s99eMQsoFXH3F3OKYii{73`p*Hv&}i^Rj>x@JI4KnGOyh2<^xp0cyhfsCc}n zc@0h*B}nSp!!p=2Hd#|0R>g$7jQg9eBzJ%364xq%QFO=bB?9) zYux|DA9L#ye;lY8AEOfRA`@aoj7mTn|9epCO99762)NziqXN?GqT-Ooum739-4xuA zii8zH0%`o=tUtj{2W9@4Q=dSUW(1`7An2nK@PY?oxDVLyCu#f|7t;9kAM&@~0k7h@K{DLehpe*>J$^hKJ0rvnv-Fc7B_a5D>ccy{DOVAZu z1RQt~3Q@!=Is=pe^j%aq%3Z;II)hLAkuKmsaRCL8fDb6JBEbb`#K9NqAg<$m2KGV> zDA2h*n%^`)np=)>hbMdjmAIg4`_PNPm*A+V0fkQ74^V&aMIKncATx>{a5(~se1U0< z3@^q1!`j=X3}81$d;s?&9Ka(IAoFuTMTnq2$jdS+pZEopP)x&CK81RA{sncfq3vUj z-W-(-P=^=P)o@YK0JTYdI-hxfiLBAkf}kpyKk^s2GZg@G0_%w>AnlQ$ zDoOyHE@N(hsxnZgm(>NN6TE7*HAm^`Aij{(=hfcq7o7y{>mPy7NYDiUQJpw#kcGT3*Z*5H#* z{1Io;_%%L$;t%`=PAwXsteM8I_mRKdjgf%?5^11#24@+M7opF=X|n{JXTh;203H;I zi-9Buupyw)r5Y897ZuMz2asPnfWi+Xh9cH2tiU@jEf4#i*HY% zHd=s3nk1khWqNNCI7}cmf+7}dFT6Piv+)_Sjpcry_@TD-gKZN4bub+H1xrCaEN0~1 z6r{3)40(m92)wX|s0RxOgs2F-obnIkE-QCk?``7+4pm}lo7&;W6;N9Sda<~IhQkwgtpYXQ`o2~iR7>4div zBwm!k%mocmfoe%m3sV7{dO&FjRAtA2OA!^77hVvx;Ff!af9{2HKPpM#DeY5ecse&UZjnZ~d2IMlQA3urho z*rW3=#1EiWz{50t{iopShod|glxRJUgJ!E4()jhRRVkG!cpL{!W;3MmhlmDF1VyeO z$YKSM#fSOj9T-4bKwXb1lfVV}HU2ixPBu{4$fEN4WZHx@evQ-Mz!rG1@iA!n0MvQ` zc|d^m_#KKSfk(WO4M_ftc*ZY;muW<@&04RRAJ(`a|+zfK-2ard=71m1?P<%ry z01ZOFgBb0j!tojuW=Fs-mjEXjffpAck|CgMCICrMDJmQOJ|2Zg)F1(Y`E zn*fwS5f8%yY5aPu=RYtqRQZ;AgBDet8Cu&;m^od_^3wRtDGLS0>8<-YsQ31_{fjh303>p&efoc+fjIu(@AaD%}oiYef;dqe`(cz;aVF>Dm zlz@sZjR&CNN!vb<1p+ZD3ZQEA6MqcI%ivrE8Z-m7a6s*E0oAQwhs3aog4IW|_I88x z#lh$!pnlpXenDo4DPVo9nNT%Q8l(nPKss}HbZ-G?nG_FW6Yz8@f2$xUGc+CnWin71 z;TQ`ZI|l`EFgPwj(|E3i-(Hm70}b?qv)%=p9m8r1O3|Hrpwk`#yry8)k>HkO9It*a zXhg*YlxO2kfHIQ>D5-dOG#`)v@gU=!4j{1tr|ysqJgt}bTe87}^Wa9JK#GckU$4rB zy`UW7(apM|3*>15eQ-4dHUU&W=cs6SHvePdZxLh!WpC(sreimcisdQ(K2^}9K=Mb> zIKM~pD@IUK^XO$M(>&$VYjfO#@e|1M0FPdgAdg;|3;gn+f=hrO+-{Ue(|P^;7()Y<}7!jAkA?i?>#U{MQ74Ip8DP$xFxf@kw_2_MVfrRzWOM}lX4TvRMP zn~(5(;*SVX(QxbzQQ-ks8laB80Lb6Pe?TGo9+WId4F@^b^0_0S=JXAD{{KZct&?%W4DG2x^sr zLgo{Hq{n8AW*X#;62* z=C9Lz05(Cul%t!GfnPHR)GGuHKEGB6#V2_5O29M+qQ>?J*sU=iKJmx@`@|mys^LK6 zz=u3K??L)iDWL8oxczYRHaMSy1)yUYkd`#q2GBHt0C=_xG!UQ0uK^lR0gZgcfSeoh zI*nidZ&@QK2YqY@c~F4&C76yl@`*nNG{pd(jD!qG>7Dq*ANckYXvBqszkM?}9fKP) z;Qn|dt9chA!wW62b0R^_>V7a2GGrKW094nyf)cKvh>Az^kqk%%J`9<6`NSV_9^5W5 z0I$5G!z^HYLw-GN9aLAQM&8F zff)yyBLxj+f@c;dgT+8|(l0#jfCCWh2?5hAu!I13@-P-u5P?Rs!Q%#?absx7nF5M= zaOmH@1=S2%A>aZo9}m4KgLoXQN&qs976Tpu0vDN}C;=6hF|2iMpdbfT1reYT5l}Dh zavFa~45;AMk5SPmp8!gV;3~tRj3bRdT$Bgw^9WTJu+F#?kasoSfTAUhUk}v2%TeJd zH-fqn?4wB51s#kGFO+Zo|Nk-t(w_hgD__0|b+^Jxb8xoO0O(>Y14D24 z-_GCQEZqEyg}?nPxXJVW39J?LkiY#ASV*6@2<&4}ABeyG95ZNGa}BsM+XtEw^y#(L zieO>z>3shpi3Qx;6MfXe$l#HD7+ey93Oh*4R+YO0RC$W-0hx zKX}4Tl^-k_@eo|%LEx`8RusqED}_{!|c~r9`y(H>*#tZNgC&&_b`7B`gd+{4PIS z`L~;cI!vHJ)uU|j`S%}lCJQ9(=;$%lO8l^M%L32P~jwRtP)CCs%#}A9m0X#4XTR%)vDN zkUMGoA)qS!24uhvblwoCH3S+!5l-U|=k*2!3CJO>pdG=jZ~0q6JIz7ncfZUP)Hpkw2I_9P@C)c_H8V1R z3hy5vCC@*(@E>~226Eh;G)MlByPx=DenZ9}1#CIm7#Y$W`9puC@rQvXRAt$lL20B! zC85(t#RSy62BiU5xncn>o;1J%+Ag3z2xxvy5YmJKb>4%nK}M>4R3t#PI4J3X2A9B- zZJ_E0)Dd(9_xQnsfR2!I60(0TncmDgxZbgSGGZBdI+mzg+?02lb+oc|fBppz(%>4IqmI!F2@K`r~Q*8joP9D((TKodX?!01r$Hf*WdD zA3pKN9RrV`alDvw8C(*{P5~PxVB69J$`2Z#2}V#u9hAuULk_3$>-{Lx2IUJ-?G0+H z*$Ov+6o%dbWsL)$_z#_6OXCkY|A{~1L>hnCX^(DJEl`>R`CY)H`7jG;X6wKUy{jPG zKy^8|JtOdmKNhr9=Ypr@of6(|W^g+Unr=W-&7cU@{R9qA$b8VddXS|WH`Dkv9;We! z+(_fsdkyJKf!uXFjX(4V$UUIZo!6iE54{9+rp|);8>wK8A!k4F$AC1S26d)DRUu^f z5**Z!d3sR28F?s;U;jp#38}(G3GG1z6<8x#^3OhoxdGqk4LZRg%(Bz{%sdQlW)l^(>xeI*nyVK zLe?XA^s>q}F)~EM*6(=qvi@pB<)1?1vmvYJ-&P*r(aXA{k&(fn&fz2@SVXW-uk%9sMphZr3!&Xs=jNWSFJ%liBpBSW;u!AC3} z-7W$g;Bl<(aFDULn;99Je{t})fChCudRYw{L3~dB7N7tB|9AU`c=WP1H8L`^p5$+_ z`VXGx%-IJT@HoKVG8vQ$dwDMH19xhAZJj|9y&_&7y}V(KpoHymfq9nz$YBRwxL*XV zyJS_^$I1{5ZO=jdB?9tG%QyZOP}AL`SJW5e9Y?UP*TSIqYCgc&{6n8 zkf+{w%<$+H6}}Gk(*uy7m_UAlg}3d=y{rr`QWQXIpIGIUrf-`V8Ne%K4G+Ayc>e$Y7d03D|4&0yf8h8AulD&0nOuDXs{YuKMr~YF zEIQ2gMdi^<`;J%i(8pNLtqA= zI$Gm}lr-2RZ~+nFqN4F)JrZ zlP|h9&w*dF1k{1dFALz;tWin$%%5ME05YTCGk^XxP^j{2_JGIg_%-K%Ta5ggOTbNJ ze$6%DAv=Ce$haK8<{ofW&#yT}ApzwDL>AaA}|Nb^;kR%w@QfBjV##%rJ|So4QV=W)>J-@ zl>p7}uKepSb^dedeC(omxbr^$`rnMdK!eFzw>n?(ufM>*{vZGP1N`g1fuynG+g-`ripc)s{aRA{npmDe~e*G8x%{t&tu^wnK?1NAIflv6`6~Q7Jr$CKg zKd_f0ZbQ1(F^@j+$DIasFd(zx06n_ysrK?*+cYn=v-bQW|nf|`$DAxD0#6Oc++=RhZD3e3O|TL13&|NsC0*DWrc zJ}Npcoh~XGojxj{Node?Cb%&I9_ZwFp>q2Ff0u5MqHgdE^ZU2mV1=NOB3Ro5G|vRy zwTD!|gVIazC;rGMpxV3n4XDfk&+CIa_TV*)pjH8BN(Z#;DdHfws{#(C81RxcNMlui z_h}h8Vons-gW9>rA-se9O}^kEq{z$QRvf4wbm+yeli=c*^->uq(L*LyBEWWn`jw#B z2=H2*7>Ml;!Rz3Uf%ORRn$?2zfWlLN8I-0#L#5zoISgAQ1Zo_;0GI0mydWC1&>tK` zpaD8?e;>T0r}Q+$5oc={8D3O?IRfC}AOYS(VBLZ)paN3k=nHSKWF+fmkV-!=2QpwI z0G>t`1kZSa*B~BxArEn8ii*TeP^$pEqFex!-Jg|$+#SIJiaBOb<139{?*ad;L;S86 zTP~FfrSa>X;GcDX-}PY20sab`2?_EK%E&-m#QCZ zUnJ}Oaz=(1mrj7Z1ez8FHv&O}^)Ft21!+RmK55|k98@-d2C%j6r}68b1`UdWMp)uN zWyZ-*{95Ne@yCId7>ah3gIuixnqrgvQUYclw!FaabLcR_L~#0nq#e-28#o?83s(^R zJ}xA8fhvDc-~Pqd<6y^vRYmf~gXP6cTB*BcMeQVYn=5AZ;R1Z-(4c!?rEbYT~0{B1wX6$&sV&~@VA zp-NEL3+8}k!a=K7CqvXiR*HfbR0za?Mkob9%lr5>KvN1I!7IZ+OK2a124+=0@kf68 z#2@i2jbC4NOEDt@f7?Dty|KI)wluEwb_vTTenDmM92%&~`NS_^8c_w#OrOhxz>8x* zealCm_#%i0cyNB#=e}+!@vOV zUkaH1C<5t<|B}Y9@$97~Wc>`N+5!!N7ViMrxvhwi;q^LDISE<=@nZQ=(73e5i`TP3 z{Ryb4hr#VpQ2OzJ?B`xt1oCzW>rD{t!Jl{Hh5d1mK7H2oB1VQXkb^~A!B)qBW|t0u zH+_Tj^Kat^kCa{h(fok1M4f+IctG2I)6eP-|GDT z|9@A*lglGtm*1ZRi$MyiNZ#mTMuwN`;qsvL02=B_ zeD6S) ztei{Z4*{<)DANHA7aRjs?`iy@_dr1pN`TXjT<#QPq)_iSfBPe_ zt0P2bLF!9c5Dijt<`aM9tu%g(*B}mPRQydEzusT|_9BpaNB)QlpZH@gLs~QfvZkOs z#jkM@q!u)30g@1nfLQnnBzP%}KLl(*nJLJhpk~tBG*|x6Qy`CmmMd$3mUSI^1oEoJ z70^&2$oyAn{2Eu&9Qng8f*s=mUc?b0%MLLZ)nyQaLF15U2EPT3LB0kXd>3T!jZgeB zuR)7dK?dLa#2<4SG(5b!l#v1CP|(f~-82w~U*qN{{-{RNHGya!qE0<>uLEXabFY5ZYt zKn?64;0iA0Y#P5lv|f#P1X=E{1Da#t>ty0@pTfYv(9PcbgQ>2xo2m6cJ!|s|#!jYg z@lIB*b>Q5=`)e&LL#HSMgva`4EjY(B@V83+{r|t4^~G9{Dgo9jAXV($5Sr-|zaSf= zT;Okg0^UBys$9azaGV`4@$a+A; z4|lS^jE0MQ@atfS+rOZ={S6N8`=HQ3joX(Yi2Vj0khb}4(17zxP@=m53i96|{lCEa zLBpCMphO2s^q154!>+!33Yu$0v_(MmjYsnv56{luNZn2F00pQErvTb6Dgzn-Q{ey& z6-c}||NH;{?h+Lla6^rw`QQIi-s3JRGXMVn|Gy7JfHY`;CUd@JLx)Mg?N|z^nO3kEG=IhzZr z!+*c1J@Eg($1YXRNh%-&$`mI&nh!F1be{0|{t84M{9*5L@t23@A&*{`tDvPY9-0?C zG!J@oo~mSSKE&QBYA+7hd|q34&RP5m#SqR*No{u-u5_NB(ICK*~Vw_h^2j;nDdMCC(&3 z``1HMct8;c9t+}lq4*0N;2h0Am`XI7Uod*~irN)2GI-43-*4j7X$b0(Ng(>jo*vCd zG!9PyP0)Wk#9S(q`3vNbeW0U5U`}Cb{10+(`Qgk<2)RRGXP#nd`~`Am+49#@UsUV^ zH8zpPH#|CFd*6`vy}GDyK!#)@Rp^iU%z#IGF}2Nj*S?HFzrM&>_$;{9#ZyfR@Ch@rNDxc*!IyV3Q zU&8LvdE2r1Fe9j;3CfBbo%g_*@rBYi(4cFGiU61kl6L95_k!meDD%7r?Rf#Ox&$qd z1NF$k(^mX3pn4263;^n|hJy1SQj%f^B`MIDOZpyAf&hm*$p4@+JtiOQUC@#fS&0lV zTbCmXL`R+hRbMt)pca(|sDS{Q1-zWbulEWu(tiomXr7o3QWAO-RQQ3K7NF%*A3^oV zu{8dWqo4R8t==^LFwo8oP({HG&5t1a?_`2BgZFdF&PWH@E1=r}j)EA_N@aZZN|Io2 z#F4{Dg9p&_l|c5#K-mJZg6 zCB%+{wz{IG6!1a{kOTO^^B$nHEpDVSGL)%-+`|Vp2-ISU0WBl4`@|o?|1uu6Jukrj z(idFIgVVcXIH;HB(aZa}gpt89%%`^zw7Lm&nt)HQ>i?yz456UqM4;`vyp5ni4;Ov` z(F_m+wDANqfz6tf0^W}!Ae&hVs-sF&z!TajU^Ow|^m8KxBvGT{0NSDo+F@9p0uHLH zpj^@n(#{WBCLq8n4rvBH0<{!C^KPF$@yD4qfm1;wXyOpEE620}B;o>IKm^){9(m-G zBYy-aF`WQ4%Rp5wXjdm_OHbT+a4F*gYAHje2|qyEd7wTQWXTiAt_z@6$wjs_SN@QT zpB(vP4uJ(hMNArhD5$*{2AVC6Ipxv$YsVjOmn!lswA=-i>>kaBI6$R)^8xS(;3s}T zrytEfSW6#!G#^y(Xg==YX?dbV3bZ0X@)N&+CupYJQ2@jZlmK_PT@4QyUIGnt8Xj=z zJm%ADtDeuu;A;5R@NF9BwPP+S`V2n3rq{C=89aOEtAJO1K-L9;4zS>F1>MwxXfuJv zfj^I^;;C7e9i@dGiVI$Dc5NHq%6b9h7 z8))k$XmJpDL`D$2JV@gZX!&d}#8?rCvFf1MeKB)8*bosFP*8z7-cP_Ad_fEPK+gHFsoosS?}4n?~XKzq&J zzbHBfj;0uu0H4lB;MGc?Qbja-A;{ALDJlsbo$tU)+XZ;zA!54rU>Y>qEMOW8VS|^NBxF^*V%q7CaW+ z1#uT>822P-)T<1%7L@f(JSa{*+oT9?v(QTsQ(+S!~l`;Apkz|2(*Y0G|mFf!wTRy_5c;7XF)6ZoFE~p>NOt}IpFP5F8q-vK=L57WglGy zCGyCtppCGgvO?5wJ}cV&`uB+ z&>9}lp%AX14e2iYf~-I0v4V#h4uXsZt#Lh)#;@@dwEq@V*kAa>FDQB!q=aAN0%T?h zyiOam^zX81zAD#OYy&;Oa|#c@VBZ#M!9UA7O*lPVi?qZ(EukiP$a%I z1D(3TunBU^7bw57TxDUX5(3rPLJL?KN^NS9IFNh007y$(r|7#S ztPH#I!Itq>EoEicnGc#n>@)=#mFCjPI&B#%!!gzi^H>?!J&v=Af;`8-z;K*3Y(6VP zSZZGBF;<`X5V?u-S;5x?9cR5XpOwKkv8ebM>v@p+W2^_EO4t^#GJxzo&YHi3l_4M_ zKj|22-V#;@hGVR8OIR7$kF&mC!ph*1nwfiy73466W32Z;;>TFU7eFkDSpd4v2&5rt zDOg|FQn0?~OIaCQON;W4u|9){UjvDIbh65WJ?x&CSDBldlIqdP8VMEvg#ZY9bh1tb z3pgj{0oo(BtnWI>0WdUUdKF9(GphyxA9NniojyyVoJ#FSExPS!JE0gwui z_dGgTIaaVT?5HdT$D#KMn0Anv9-XYsAjwp4II|vuOM-NJbh7?~3$TJzxODRF2ItRC z(aXy~d9hPAeK{yfWI(0eN$X1BB*a}t#m(2XUW2`(Y zzzXNCU}Xr(NKHJ(Itz3z|1s7ckhn)D>s65N@<49yWR+M6^EzlNoku5Y09e4IvLLl6 zGe6IxleG&h0P;I%@0~{{>oKr^XJSEWNog@C4Ku8QnE~3;<kFo9r zQO8;RR}Z=cHoTAsq| zm%+&3(s{@unPs8};|V+PA(fE&3CWniHLMITY@o)luz@uCsCa-T>p-iKSyViFMfEm- zLN`aH!lT=^X(ouhNr8!hA=IPSMWrGDLi+UjfR5R4Q7L%g4>_sNMWw){J3HhPzo2sk zxYDoiJouCiG{fu3_|~IW_r`i~<=G7CaJ~dhxbe#~Ai0YZQKw9l+EJb(cr4 zs0zqM-L_w6fE<&fQUP=7rWuS3453JFc`OSGm+X*;D3Ik4i=VG&Wq1i1w?p)gknH`q zik0Do4%A)~a6m%sg;^pxZ5`BFk8ax{uoE_|z!M(wZJ+^l0Yc&702$*4hsS4r0bkJm zCC~|ipgx;tx2w!&enD>qkc0||r2=9Z9Crqveh(5b014QDST-P*1Bm4SVtIgA9w3$r zh~)xe`FM0XOE`ABYJfz1K+~5U&Jm8?t~#F``J+GwxCweEfJ8s@M}_KiI7fnoMLzKh zdS`%zL8?H@6TAz+T>dCunHLr3KzkhCg9co9=Y)Xf-lAePKuZt6TQ*oDLqV&`5vNju z_UFG)SpjXBf_7?yx2k}a1cTbFpZNt+L8JINDgvKD$DK%g=8rn^;>b!+TS>rM;xm7Y zuf%8YzWvYq0>Lt$`J+J7sV6@3$AG4ez+Ey>yYn-D)TK}S;9&yLs%CH_5VABN;s~f; z`I$c|RR`4I|HL14;4{CVvks`2`Y!dn*{+n!5<21D@Tb3?9AJ%)3CxcBgeZTf9(T{{O$>0gvt;a8Uz4 zjg`N(9MoHBJOV0_ApOR}Na=s!a!~qT2FZ6_DsDiB%6hJXn7_~p$^0eDkj-BP=PB@O+OB}}K<2N4@*w7~S;orn z@-k?88*+}YN3Uri)O<%|^QXXd3Gi#0f*PP8uhoFuZ#x4nXTYy%It$9H0lD9H4#@oC z-^lI<)$gG2d1#5`{wq*jIiT>-y$0n$!siB*2MM2BP+ktmeBC=B^Jk-kk0sRojZpJV zRQNSbRiL^c;jaeeLCn{H@*w7GL3xny(E*vi_~-xsFNBu<|DQGiWiOQk$}Z3~df+A8h6j9l_o#px^B%ptd%%M(pw&t~o&R5SEC$Uan5Kt<1}6T$ zs9XZh{VpmT9<2vFJCE_VsDKU5QAq%eX$bg&9B~|UdMW4-QV;Oqq&}T5UkIu&Fo0Hn z=rS@eH2>h>Z`}@B2Es4E`ymljCf11t1b}uyL-z|f@(ZxAK$h2m%O97+0ie1P)D8$g zgd!dS%4;rIBqBgtR6Lr0IFxSm>HPkpaWN# zmvw3aB)ndp{s+y8uXlNL^Qd@q+n(!VWpL~~;J6dqO6?VWmcYmW4b2yi7K2VP`Tl}y zF-%v>i@t^b|94xwIKB|HmYzoitkk31w!M#)!L###N3W=70w@SxEQ9F*4?ROIOYCE1 z@a+U2Y%Qt?v*<-N)SAVMpw_&U0!?NeSp>=w4h*2Ns`vjvi!U6*KJ!QY_{<;m5!C() z1jmXjK)B9OZUcmC1Lbx=xTa9<1PE6T%54CZ%iXN%P;Li=s{rLr zfN&+D+!+wA5ZLK4qETR4fE7f89K8S{{W~5Mt1T*^_Q@xH@G8$=9^KG!tO!;Uu&zj3 zko&-^=o~=h~uES>7P(3 z(9Mh<-K?{~Qi3Te8Xy}iAnJP|M&1C=)+>M{93T=kP|Y3?ZYh)-0NS+2uW{H1dP1}y z_>34q6_ppa=Yw;riV93hzz1~Jl0XP(uOfI)CwK!Sc(3Yum|DC?I1$2EN z4*COLOA8v22kVN=0h99yf-*Pz)QnGyWh)LKnE6qJhc^K3gmDVaGNFa@QWEx z!x}(_{hkLl40O&ISY80EHUe}gI%r)KXqh03N*U)T{s_=%bC5I3`5^;H7t{FluYl|V zx3qKxA)-2Lh5dV5q> zfa^Ta>2Z*KG6JG=qCv`HKtTtJNywp9pau4kcVA0__tgt*VG)3gKTlyP0OhLY1E2*i zry-{_y$7xSJqOwb2RR2<=OSpP;}buqSqnNj5_CSUAP?wV5|7f&pb82!)(kqO{YBCo za2T^@f#U)s^oc(PGEQ6q3OfPtL2ZJdF=5bo+%JqE>LEvsv5G*v$qS{yXZ?asND?s3 z@&Ne=G;#@AA`Lky2{dxcFTndA>{(FogLdtK*6)H2aR429r2#rv?-{5XNaNT00NHpT z18!Z!fmWS^Gcag3A!xI~iyyPWSpbxuAWiug&{}Z)cjS)*4NQxMgE-)`6l1{0k3kNP0wt-)dmxiR9XHS<%fch?KoVsPXoCnWbAh&%fEF`f1w{cUYeKT+GH_tTo!Sj*rug*MfEsF$9Y5e~ z#xV;N-x{EK0`T66aMNQTd-x%T&Ip#M7`*s81JneZ0&X9I8k?aJpgwDh$_7w9-3cya zKpR(IgJ$`AWCB2<-H@&(3uqz!MM&k7#vd-4?FOoM!E%D&6d@?0^1^H;IIlqV9E*Tv zNx2OWG0 zIy4P5gC{se1=P;}#2@hvvUF4svd8NazhI9FXy4XnegR&y2vFG!8czdt>OVR1N3pPf z1|6~lIz|gLPaVa=#vgtVEF=O}!XL%L1QU^fwyQl#4|;UBsDK)a@O4@It&yN0Z9D>M zQzEsd5$mG`coSSf0R~}Fx`?Cb|MO?^6ldT9Ri&^*_85Y!+&_>%dv$5PO-ZCoDRwiiGHS)Ep(JL$MQx=l}l zxgej`fKKJsv-Q{sn%Vuu!oc9$`i;M34-2?|F5o8N$iLss0yO9ZT8#nQL=vI9!x5B9 zL1${cKlvGSOqUF3##I4ydV<7fM}7e}8PDVHpsJt2@whv94qRJ zwWtFg;B}gyIRej4cksOj0${}|5XFKzDxi@(Hxtl~e*q_uo=DaY4j?)XN(+L{{yP9x zmnbyYtSTQ2{YQePd%|We_ukk%8gt z85t0B324(_8XJfSy5RflnG_IHg^7W|*x1++WJ#C}i1c%Lv1---{~oPxKk*CbsPMPU z0k7!SIO@~+4|2|rj>?M@@4+cqM+MZot_CZ34_ZtJ?)HI9aWepsbq*l1%m%c2Ocd-j z&@CCDy{8@^UvoKtc5Q>Fumw$2e0$e}`V=qzOaf(2(D?!H4}9j2at0l82|5;mMdgLy zRPgzRKAq2AluZV^phU&Nqw~EF_%0ILL-vq$PA)1Qp1t{?GqS+THUz-4@St@@$3OAM zfyzqoLH3{{qCrQafyVeiksamd@rfT?bsl^n0WuwYPKE*Kc#&?~bdb@YJ1s!%LeLR6 z&~@&h`DoC27@)%m{-?R{hl~ETXJi2HcL7B+D0P9R+d-?IPJHH%V))D-6#?3=1e(S^ z4XSWKO%>1y^B2KmmHbg2ppFBmC43W71A~rRj64IHg1-Tp8wVXQ4La2-<~C&BI}$`+ zPUF|V&OiMS=o*EC{L>G5G#_x_JjK85QfI&&Ps^kHt)P1mJ$u_Lm>3v*d($gCI$2Z@ zikOBI#Uxu5w3WL<+mweSnj2s&h(<1@bi!)Ja0 z50=mTkq18WN1pu5A90Xh|L|vi0S6BL>4*6B5256tZp9a?JKvz)X>(FQZC|}Ta%u}EELB~>o$BSIgKo*UFj;MzST=2AfTe=@)r^HSV z(2!5B?YS+WvJiCR4fy^VLEX7CK~paR;FYhS{d~4lwt&_X2(s2dB|dvB1?`4U1x@xe zA344iDBa*@jUeWNCQu0vx+O*QjvXijA^8+#xiN>~0guk-kPeFu z_++bx)}UeyR6K(29uN?93;^*#;RHGpSb*0O%#Q?ZH2^i+LA_{RU5MC0&>6&N=LiNJ`wiK{2|Boe^~V+#hAKOd zo2E@?WhgZPt-c2FDjY$X=Kd#sLGBkVSHLA6s}9($k)SOLpnb~%u=6cIdm+G!_CPCD zL{wgcKwJiH+d`VXtd>wWb#4K<3Fzo2?Wz^C)2Pv;|#&UY_F_`u~+2k4Tm<{zy5t&rzQRurDaokcNFhhm?9W9svb1 zN<$So55gMh3kfIi^aXeZ=JihKQ0%n|=(sN{xEv9E=Y<&eeboyY_Z8}e4#>W4ele{Z zJnnnG8+F{bzXCSy8|Ve{{fl)lJug8Aus|)#tU!$WYQijf(G0a_bq~~_zG>i*r1^TugDB<$xW(B1;&rSy4){|gvGdNi? zf{&sE6ITN6pjM!}1*lQx1}gmp++{qEyMbGGU@??d zU7tCqgg|Z8xq(}CprTjM4cw}8JnjZ-6h^s&8+PUvAZ?MX;$ZD@P+E||@wi)xv2n7a zwyYa&tA6x-`;iLq3li<6@}Mzp!0cJ+5Usd|NkX|pd!U}GGvz%D8w;KcNYc*bVH6i zfVzsHvv3`bJAgK|G8}gR9iGbos!$(!bn{x5u`=ueT__BhT%pzUa&W8gzbPnu;H^TB-WbqQ$T-&b5OL7R;hPSSL6CX|R7bmjRDedA;y@e9 z|8;?zgdUyuUL<#dO9@Dm(4+GnXaIOU$Q*D(4zx@c(i|)S^$j!#w+Hpo`agkpeFL|LDL>= z19eb5d*i@|HFJ3Mdb4G~skl^@A!J zL0hS{pn?sxDF;8^9I{>sd|RYv=ao>8&adEOpc>zR?rrhOBo6Z@U6*MR;*xBd9%;uMKL``gFeg%%5KjI_{@h;S+z9E5m2d zx!B+t)NWQbOUQ|^;6f183EgB(3WkD)BLzUM8iYLP99I#Q&;0q;pZW8%1wQddT>^Ox zbZU{e1FF|RjsuBT8-Q#EooHkLaWi;wyhbH}U(*M4ppoDdu*bkb0`dmL@eESnbv2hD zw@rNJkD3BKY8-S^1oRq7&WeF++v@$CEp zPA2ecnjptRfl>|RRum4D1OquC3UqAg>h<7q)J28kGk?A?q+gmJ4N51;3ZM(W9QmVo zK!KeNNeZBiy`XhLJ>Y|#Ji1v=L-N>3&@!H5E-DF(;6R)Mj=m^g22eT)_zW5w1l4?? za18(*9VLJ`aS9YG4lkxifWsOz1^_yX6dYopIQz^W<)Tva33P=mX!r=^ZbaDd!Ov-O zjB$)T{6fD4^|(YA1_n@j*C+YYF3`w~W2k56S)b02p!=-;gm!-22Wp80do;dT0bbhY zqQU_hyB6^5{NdC2A0@az8PM>+i~mjk|2tY9<8PhHz`)>i%*8~2q4_UkiF5N`rqVp0 z&PQMaK}}e*7D$_L4){*V6c1w==-HB=K*dDk5s-zj2nFB0$*|7_?1uj@q?cZ~p(^vD1~o@WAU{(7F`O7SIx+5_ONA zPA)zQp8g7{pdy*Wqm$#f14mI&e$g=p9>{*na>*P%*e3Q z-wm|X*hAo$gAfD1AXJMwXps;|*{+;a1_qDaAUldP@{2q=C5}6AlqjTSrgaAJ9CP4< zs{j7)|Nj@$n!rgG93P&Y-$BEP=NvB3jz0&KRy|EyZeL7#FDrST#23^PQ*?g44)ADZVb)Rk>70=#Si0Nn= zK>L+JLwulfZa^A*EMJ#i2OXuw;nSN9vI4{L^ZtNBw;~BN2?8?yHb}LAPj5EJd<@kE z5Y;Ad)rKbxFZp&p*aulS{r-hNM1e3UTsGJJ|F7+$A^|#e(uDz%m_Sn%p!5GAC$*M> zI_=QIZon&QUg$TVbWT9$6@bgfa7gDQ)Ti?(w0Z@v;Q-x|VfYPngGIqEh!cENDnQe` zpq?AJszog{LCZo654>3U8|>*UP;%-~0WH+??0n(Tc^_=Xi*AUlPj?Ggs`UVWAE@~D z>0JVz9dR{$`&yh|o&hTD*nE`Hv-t>%i{*6dZ6;sOC#`3 zR~JZL>;Ye74Glby`WJp+TlqV<|NsB*+4*7@KO(2x2Sp6%1g968P({!FL9%_13g|L5 zWMkN&Dvp3uoHV@T+4%yR#_qp({S)Ld{*D!(Q;0k7gBGP3fV1Zk70`M7FRW|+|M%_u z>D&3hqZ4c=DE2^S6oZ!=bwZBB2Hh46x^>s1vj=>e2x!r^N9Pm>yK@Wp?vYT?wcFqo zOr4O+NCH3tFF@J6vju!yV!(@czyAO4gtVMM%dv!GIPm`# zuq!~zRKb4fh8@ZX5q}Z*>;He4tE&EjTM43bH9$Q$0n=VBFx{d8(h0if7<7kA8h^+s z&>dZn)wH1Q59qjo%b=aBpyLZ(e&Rp$0<_;Ae9Snr2B>Wg-ggg@JebBGb_g{3R}3*3 zJS!Cg>SML2fMNi2RB;+VXwSJ|2)IkQ=W5Rgb>lf=EJL0hvn$ z&26XgYaDy=wi4ua0q{}+&@Ex0bqZkXL0kTosCa;;bwIa*9)+j_2Zg{K=(-fh#c`26 z;8}CffkB`6Bj$ipHRMuTfgTl5ClGSrMI>Z(bq?spw8$2f6Ohq7sDD5c?BHt_K)wcT z(FZL^=utTURul=oLlAUqTm)!KKj@@{7!`vTMi3|2fC7AvN(5Lb)Cas@a< zK)1OZfAOON>S>TC_kfrAeS%(pc>Kj}h$O_PTU2g<%>|uc4!JP{dZ1j3$_20l=s>v0 z9+d|W&K{K?URjcc>_6 zPzs_rqDKW(9DL#jt+%Z z0qD3I-uV`w^I#8wj_ib1E$?4=m;e9&^7fDa|6dqZ{Qo}zT)#KJ0nM#|o3fxqO5mw+ zW=INz+{g$%iV~X5kG^;TPGXUu=HlFPa8d;Ca~I(CR|bU;Xg5O|zXoV=8fXRHqjHH) z{Ge08^&gjsK?VTQ`1Na4I3T+%UW4@rf(Gjqq7P31t&i0J-8%cp5p=8WIcQ%EGCJD$ z269PNjOtS*kWHWgaZm>fv_9@Qct0{Y6N0X|yModm0rek1Crk>0R|kM@o&*;X0x$kT zrU6_)3jhUp#VtS)7Q*^m2}J9IHn6&=c<{Gx1Q#RvtpCkH7kn)S=Me$$re*N#ss1Pa z_CAoHBfkJB`3tx*fQISNG3?q+3I0xci>4(j6u0WSR3-GYPS9xo^{KOym;uGjDXnp}5X3%03XjyO+QjSJk@M!)a zQ3{&4QngV8MVtWd9y1Uf$D;y@mN?M5Eddu+@Zg0C8{`%;&{i1mp{}4wE*8*)4hz_9 zuvzE9>s}K;A*_KkJ^5P^yEh zZ~%?2-egXnX@L7ve#?mE3GlQW&VW1qvZO*;i`d;lMD^bf}-pXa1-M{9VhK zKt~OLRyzCiZczcn8)#+*wAsuRw2A>V`uWYH^ZjT3sA|w!hGHMkI7GoGez5;R7c_nN z#2@kN6Mw`mCcytn{dV1v$40k1y=-Rusz76H7d2Xr<$*kq7RK@gjCjlfw~fJX(gE&+USFlgl~ zcr;D`bgkJBP-)ir{)GbEOD{zCf$j8Bu>gkk27UAAqMAJizUJ(1byX94H%sBJUIE;$YBK#;hK4ptKEXP=P1SoDE*MEChRi zcMqgWapeG=CBq-t15OO!#9RRi;*3xHk-QvW{c%t_#z&>#h3GwSG=c8*5b#w1>lFx5 zNq7-EAMEJ^pFqPt2_R>Kw}pYZ86d6(sP+IQPIxxpZ%qfasT+@gQZwXOXVA55havrz zPyA80p~txfg4?iyA>dFGwUz}1rv_**+FNkqg{9=r{86vLi`l@*y7L=om8DPT^UwT( zkdaj#l^5YP;35Rn!hPb?`OTx7^{oszlQ`ReiYn0R9Z<6O_VMX_4l2uDfC$ihH>idM zt)Kh~UTyP!0|eAhvzx7pw+l z>~o*_1&du?T7wQB1FvWK#2@wl6MxhCpx?EH!}k^>n~ zgUn8Y%KrdR_=09+TvU(;Z(6{EV}=J_a6AAfh8XZn7c4D+*GRvRwF66)fa|jwl>kU? z0iQbrI>+I~+551}oB&SJFV1xT|KDKEUdr9=9MJrNqxlD8Suv<&2Oqr)KGftrC|tnV zJOUb7!63JVfVMkEdAmSrTyUlbH6kD@mqB-#Cfx@+B?oj7G-yFExax&22?XC)3tA2j zQpouOJW2J!@II&n`vw}4Q`-e`62ss^z7XLlgk0MyR} zC3djVC>Isbj#6jHAboEQC>=++fKKKYbXIw>8M2l=7PKBNlmk?e6oAgWkb%@sJ}Lp= z>PLCMSooIW92 zKtF-z1VCEB+5N@pyWqi$mc!r?WdYt~utPv?vQMDm2I3je7T-_&alCdQNk@J`U(nJP zUkA`F8QKaUhsUIVE?10kQ3>Gh0v#F1-`WQ@F9PIA{s{2GU_mfj5X=@}t(F88gwJ36 z-UP|(;35bd{-E2LAq7+b$cZwb5((7Ug_lUBg&tUjcp>}0Kk*Ad+%;JqRQ`bGpEMru zcjth2p+uyBu62t5HHSLiL-G$em_g|i)C{V`1J$L%bVnamaaH3K*qKq z^GKjERnYk~E-D(J%mM0tLXHjxb-T`d;ui!j0KN*o*$4HYMGH_X1~i8RuJ$-yEc*g3 z?R8WJ zYd|YrBSEvMA(e~rg z3=A)x-U1o71>98wHD30Bht6KyYXcWGpuLcwos}>4ftB@uF97lFeBsjh9MrA`t;z=F zN6=UeXgmlsXasUHct8r3;nUj#9^-gnQV1FR@#*{png!w)SOOk~0T)C9bHLZ4e&QFH z0=DTBKd8$L&QAi65us1~0uZ-;;uly0acVNS_7&hY76ZjsWDj)wC4#pJoMHrIoxl3bc4u(B0%UH@`fCPv^fE z3|~R5<~d*wA6hm09{?|*iawHz~8cmfq}u5e_MKx z<1zO@2G^D+{4JLRAO#p`D}-lnd<2Vwq zTcBfUL1Vk1$zX7X7XY<|Ko_8R^v(e%IgmM`2N4Y~y$EUn zxkA8HN(2;tpzJ5WdrXrNwD=~b-UUSSSyXn>YG zUk48&aD3vAd;ST0(`wxH7o`>8jQ!&6H3o1e(jSyso`BocAU}Za1a#yVh_3+cxB}Uf zo&dV`8N@1&0WD$=0H53z2bn_q#2*7X-W0T&_!{UO))(x@L3L^+t7C&dW5XwY0Txi- z1>9eWgpUS+F9{KZaU)v5S^mY_R8XHB)GPZ0DiR`nzoFt`O52^n|>D}-o;Ts$cV?Vp22K&8QnSv^D5O4z&GGXzFUto?3#Q6d>pqo-PK0-#O1(ra=0o1GqZ{B+a87_?U zQ30K}cQw&r67Wq}f@{DJlb2_6oGRL}wtSEcdmpW<(`g-C;jH4cHU3XK&6r*-fKD)33Aplyc- zUzEXo1v*d?=HCd=ku!V1g)4YRGN=@Tl(pbKqQQ#~kYhRKK$QsW0hj)eWze8QMLzMz zfJUuqR1{vQCPRY_v<_zrxCQ{t5`beK)K-GDIY9fOA)BlOz=z_2*W-g%+r}MyaS38X zjfw)K(t!*t!7hado%@}}ukip>uYpP?aAgE73Vc*RBTmPCI)A-*`|baK$L@Ym&IL6B zK+RtT$b!JAc2L8*^(235CnqRK1(rZv3FIW@Jd7(4o|9{Zl5cd>* zJ=T0xMh4JDA^uzpptb&>%1LxHIK(k3rI$IJpgTSoUPxbtl%AkDMv!wrm(d$udLdE| z4lva_e2DT7R3?L53oZviMIC4s15{@1=L5A(AA%-(9#i{ zI0aKcGYF7wC%91b=!71*F5t@mDvA_9ftR9E0-|C-xjOPGh#8`i0V*89t!>ce!3!4MUL7ws3pDWF6p1LR;0&rZN;*SHbM~o{0 z<>ELtP}lGWc8F7Dv|tUOlmpiQN@<|n0SX~dXUma4%15Q<#XQLFHr{zWpkgAj2U;RV@V?~( z2?)rp1xpC1&gBDD>Zpw}$m{@ULk;-Q93vi(62zf7pktAjg0! z$4~rmEztHLtPuxo-o3Q>2I<#;5;iEg;%T>(fCizrfa@u&?Use-Avq5elA!Pag|y+N z7qhA%IWLJDk@G;AEDFR2-3SIs{h<5=YKeT}2hTG`ECIKAKp7L9nLt4c;(%M!@RSFt zsa1`+85xeds3agaF2LP9NLB(5xW5Ny9B69-)I($dHy1$Rlb!=2<3U;C8Hg1QG8DX- zB=X)T{+P3%oZub+&N`pKo9P81l?A9NaUIm0c%fAQX-X`DoDy{jlt93(1JKkND7^=O z&8+~D{w3hHf+K&7d&G-}`^ar29FIk+W|zR~N^GqJ(51#TDh@BE#)2aOT%}`eC4lb1 zhTK70@Zv`tNUGfZv?d1UK4|*@(%?zs2TuWkE}8oIi67iD0I@;4 zUwpu~#2<&uVT1d@i1q>K*a~R-K!g`mw!qp4H7W_9;zf7593umNt0MSxfk^P!u3!oH zpatY6K^82)_Du~fEqi{mH?~7vVc2Jlhbz0AY15rS>7c3#5TFVJ4{P32KLhK+Vi1HET`T^YK zBWTzNS{QMFp=QX2QXWxr~du_KLNa~ z8I%z~9dKBM3u=gh3bYq?kn=FW)fKqu0a68uoOICTprENL@YEl;-31z^egcw<&j6AB z5g;-hG!Otjwpu_{k_8kypnZX$&I7nw>V^ClL;eU`?r&!Yla&L9I08ffm zc(EoF>^kslZX{?e5a7pX=;v+;UxZa8c6$o+QxmEC{QSjm< zLGY3Ur~wCGID)l8*C~L#4_Y?$i9ZJHp%+RJY4BkPkzoCC;A!JDe*J^|?Y-c`Xh6~P ziC=IDw6Q4w+Sk*&2g(DT!0>`+Hd6HuYm|bV@ZwVl$mIgyk`Z(s185ovlu*NEKuh02 zd&t~NK&{$O{869{?7UjwV2b1cZTuH>ulU3t2fuMt5EPJ+EzraR@-U=42RDX6J3C*5 zLgE6loFK9Xnz|q!0$J(~>bQfw2eJ-qdCg0K*C4n5d+}q%|Nk$UUxUgbh8L@kfUX9I zj^6f80cQr#3WMG~;Fj`>*#-aq@9Ovp_8Vl72Xuy5C<7xynqz0U1*j+h)rpSB-EBal ze~!o9L0erwCnESTFr0Au1lmOcQUID3aA#m-cyVebq=W{K96tkBv7jadxZ;k2gecg( zF5qEfP~Qa_YKQp4S^o-yi#b7e&=QzKFXlalm<5`S5PTB4{^f zBeGmcxpT}qHNr~&aJBp+llxXOZ5ieQg}q(DkQ#pEacs1qQE z`@4XOx=;L3J>W40un_2q76|u+^=)ue=-&PZ@{Pb0SU1n~5JaE{9Bt5RcfmbmfjMBO zKn7Dli5NW830kWFT4M-0>I{;)+(8pShhF>&23r8mC!lo-pv}pk44lTV0lHQdv^oWJ zE)a-)8ZW1VkIb@g$(?_zyIo4!&ZE^)7gnHwK*9B6-;% zUe^@|tBhpr2iF_|w)_8r!YGDyJ6N?~4QQkQv{o;Y^(0(5B&sE9iOz3%aKnLen3 z2Tk1HPU8=K09u*~lK=dP|Ii0eUlnv6C8!t%t$941#vgX(6F+EEJESBMSObm>c-Sj| z>-`s&0Z>1J#=0O0=!Ggw4Af4A)J-o0!D5gd;{u?fQ2;!&5y{IS3@Yxy=lkWTfac~v z*Mx&7o+D-72!RqY_y$?fc{?vb6aJ7PL;=|wV7W-pRhrK}@y9%doFE1|2MScwfbMU8 z!5aiB5`KXeDS&1a1;F=ZLyAz)5niCS1t?}CdFT8A1tm0V`GB(~DA|K!4b|Np(Ea;cveR&c&dHh=A$5 z-=KlaI@@i(7#Kivx4d&f(E_@?i)Xb7}mb+d(5i`2=)&A82Y8bow6X zMy=y%F8ul@iXEZrNWk4)(CH@;pe6|D^b?Q)pi{*_ho0azpy&u_?MMb_U10*KP6S;$ z;-V7a)A`S*^EKud`Oa@kBY~OAYV{KKvrxCxPS*GL1T>kpuz`KzJViF;YBq_ z8F-H{+$hjkGI)7mz$boCbrAt-D?9Ro-FpYL?@C7H#TOr_>7el!@IB{{+hITltwD~p z294){-N_FsEnWosK{bF*69;Vv1RZw2itW&`!pK|N;=*TYsT1W66G&>ao4t7Yfb_o*bpgz4I_>LQJX?ziKKM?4wyHEU)mqC>U z=&p897J-~4*8*C23OZh#12k@Gk;bnNO3VWMZI{3k%;3@vv|{QaxWQ=vn&hYe2Lq^0 z3AvIt?$C>=VE09Uhlrp@HTr<|aI-G?4hkjE;tFU;D?kEFWFpu@Ai)^s7inH#9=H`5 z39cz4eZVt4pbZJ2Glf8F<3K0-fKLj3q3#WuXapf7OZ9D>+ z_&}L)2H*Dz?Jt8W3UK=ulA1ul2D-yE?$C>qNREkMerXQs4!}1MgGMS>d;=wei1XmJ zl%PdR+%MmN`_$m$SHV+Pg5Wj#f;pfL0BG9iMF_-Duq0?TJ-AE+&6uUA2)uj?IVsEs zH2EYL13F9+JWQ?t(E}D101JceU47~I@BjZ7Tf9JJm;(douF4CbE9yWadoC&xpkq2T zK&yupUJHZPJ%H}V3*cd7;GcY;XtD8qPk-UBxdLCGGRNjYA$c|yZq0F(v5(@z@U zC0igDfR|NG6S3(p&=ARC7s;o!z5evk9prE^j8@L%6 zz>=kpK_(f39V4Ks38q2qkeG*`_~Sr{^#SOdNpP9P0rC(i#g|)t;*S(<{SLPM(2Eie zkdHyt=8Kyi;F|Ucs4xOKzpNFsFXr_Z2G9WxASZwWN#Mmquoh4^|MiwM*!T&g{s7e- z@CA9GmA;VO1_G+0-$4N;ppRM`FoI5d`OIG@yYCC6+-F@2Nm8IC31>g?3xXCEYJkf2 z(`hdJdI!s_L9HmzC66c5_%;557RRUYhk`G$18)KN#DC~0=*C7}xi28^p>FblWOV`F zEG|&RB*-ci2s&CDbTcIASlc+!MV~=>Ks$W|Sk1s{B0<++g9c2&8-%nVVxS!Lk62MuyWf{sW%0a~S|0CEImcfO2VU?)ebBj$r=Y5e)Qna1D(SQT1swf3z7Kyi9ZI+H-+&3eBuWc69Tre z5I$(xDQKL6RTaVqolgc@XUd!F5AvM=uP9g?bd;h1t00&SzKcs2Vm?Hi5h4zboWC64 zNad9U>j&+Q5wQIU7K{7?y6KG{545-jG|2?o8IumyAs`$75uB_*XQ_fPIHa<{rbqBP zgVn^m0u4m^gT+9Hu*O~d#2*J5P+|S;3-TH0;>(yDpo>vKXRm^$%0byI9IO}Ag|guX z`ANVPG+N4g0IWp-bclfc z^`pjG%GH$Y{S%nt?z{x&o4vH$_yx(^HtptU@p{Ue~>JZQETG#v)o1qqrC z1IdAQOn~IT>r+6h_HwF~BG2fEb|dqo7kA5*R@|4TwU> z7zc#yqGADJfXxM!|g}vFKJGP^<`;LTJbe zDbR7StZRHgfv3mHlFh%?oEMKHMfollRQd;;7u_+hCg{rIGf&Cr=zF+Vt*gjC3b&d+e zsi6ETsOt)Go-Bk0*nQ<3S^Q;FJnl(FJx} z8uXwN0Av(sxfiJCkjAg^`4d0v%7yh;(& zbaT~!^xELggSfUvrQk(oE;zx01q5n9Yj@DHIcN(A=yD^7UeHD|$bd3Y9|^Jww1(>lq>PVbwFi$!fz^XAkK%8!fLI3_&5jXu@Bn3tNYMuHNHC~^ z`NSU~sst64dJXnAc!*0dL?z(GLtAi=ho}U2bhG|>1u6^wgPN}34$3Ef!71Q12QRW9 z>ntH#$kX`sT~rMC+fBh6zCrip>cyy7@V7^CLJgMykGng(Xt4tsF6g3S@uJffTzY^) zRJHaMSe*}e&J}dlC3yZ9Tnd1Ol|W}egGzx*{OxZzKq@04U0-k)DC*>Ae!*_gu*D~S z0ZX_ zH0A*+Q9(C?hpRGxgC`PvJNHeHFz7;80g#7W_#^Lv1m1uMP&EY}rinZSDs)V5f;L9F z@JGG{NuK`X0-6{B4U$BH?ukDB$rZFC$`M@3M1l&`$loBLzo4MxT?W$1AM@dp3xCAR zPy7+jL7V2mrBA^pSJ3K17yih1pb`_*TQ~;NcL=2P4YnhM4M2!3`K9G!g0Ccu7sA~>cPzy@?AQ2Vt^a*Hu6}0Nd z0kmJG`Yi(kf7euI&<4wXW(I~GpkxWXZ4RUjygdeV4hHC^F;F82wjBks3?3u`-jM>@ zl8!V4aR79WU*i!_KM=7;&M_WzD+=p`XQ13A2+4^rw}Q4$z{eLrR$^-}p?z|i>U|9?gX-5hq19|S~~JY`^j z9Rbzd^;2J}-#oZ<@!*!0=*cJ!k{<9`M>fkJkSstS{ItLGAH9;Atg@$X5$+ z$-?^dC&=VT$S^%9Zd$-r3Fx+f$A=N?X7_-nslbH{=yHL(kQ=ok|9;|+Tmzm(0XNw} z-5&5-9_ZXVq>lkA{cB(rf%d0BGz+#s2j~S@<6yFogE!(p4FJ$?An2&FAY`XBw3Ps= zwn1$!(9&yAdl<4P>@X+~r}1li0L^KE;~2EU;S+!0H*k|#gTGypkpa@5dFc;cAOmXs zfSM1W-SAt$b9bPrJ#f->bNc`PWze7h|0h63pFrs&hIIvaR6-AA_X$W-x)OYiQaJB1 z@Lu0I9~BKl&>pGCkDxZ+IncQIIsWMfz*!KwALT`LDg(pISkT@L=y*D~vj`gI22DVN z#&bd00^|}FQ!A5&9m}D3T#M@1!(~}9=y-jz@wYB^ARX+ z<5&~HbPOzxp?d(pt&kUQtN;Ih835`v3!DA_4?6FS;iVyD9tE}pLJ)G`Kcwvmsmujo zBg%r{mbzdGxUCP`9dOnZoUXva0x%NItR631z;=G1!};{x*(>#WCc%JgZlL^ z+Dt(^VC!W6Jp_3H)Y5vn>;t%sD+rkbC;<&j3&wy4G(l~xP>{VY`~qNE0kEt9SQd1- z`^%6YAXkCc_vwHXg4BU#xqMVCUjFz7k^@!CF9b~g|9?3R%ol|1rbJ9fL59skR0>|a zFac`;3kbjzBF{(_yo?0uN)?*h7Vo&yv~CMqx7VFrL^FhN}) z7k*F}f@*6Mm6zV&v1I6ZgP`*SG;TPCg7z6+0iRdd`P-xUO#sq>qKk?Lcy5XHKr{;j zf7dETP*n!HkN{L<``Ci|&p9dU zhaPBOJVX#Q=nN_%0wH6WDWHJ?&_NC%vj4&RXd#DU9J;{@x!p4ql>b1dl7RY1pxdxC zAqJ*^#=-?cK(lA>L2Y4h8(0g(s!;*Wl)w4JANT4LzaVI)7INiiBzPhw60~9rG%y98 zyZ{aVc-#kf__#yx zFgN6m8PGftcz6WV`~_7@aV#n?4jO?H#QT$JkkvV$LE&}aZS;`YCDxPoz`6c~Cur|b zw~LAgQuV(SGy~CmBmg%3a2PgT407Acc<`xQ;PMUBv;|ELfo2wER6xfzfZB*5Dhkl} z0B`%<~@Sr$(am^4c0A7>@?g|Kit6Bj_Zvm3(AmzMmur*S2>)JwivQr~j z7+x}gCK9qizC@hI4;s(*===qq1bzuRPY>yAbCyQKG&11&`q#gXc^Jmh~^UlHdq4$dZdkZ}w(eS{FU!c(HeE&kp0D2Jl>*g2B^uXtx z-`4}RQxNxD&XRoOf;sv*^WSs5QIwq1Lxp$EYpotHft-#{7E@%yv>J_lOfbJf!d}NLa2YAjb@&UNi z0F@W4JHbjKz%*olNH7Ill7ZTetleOZ5qH4tE{PW^de9up0a^?OUK_%i09GOZ8y*pu z0(So={)qqJ(hIZ;9lXvRG!PQUYITc&;l*9J3n7O!f!Dr+%0IB{ApK|oU3Rd+p!2W5 zwu8mTNbwF?=ng6# z<5)LxJ zt)d6Oyhzy{H$gdH19UDNXzL#MvWpzB9AqM-0nCnsHB%!%6%P28h?ujWsxJ^C4eE@l z`hwY@w#z5}n5UokL1PS%^)QjFj$pY6C>;Zuy9eF$WC6M)5wgWDl6C71Pyoe&=@$_? z;1C2?7@$oZ@JIl4uRu41eBuYqO@PKbQ0CyTe&Uau0u5r&ImVzH+Mvx}(Bj>1psW1& z+Y>p!R{6jNQz8$)Cb9?0~?56}b-16Voe zx-3Y`9JFEr)Lkh6tBGKR(xA2QE}%)aNY-=L!FEGvM}9%j60L(TG77=|1r?axte3BY zO40Wqb1b0dKxyzG6=WVblC=eD5}0-b9VZNF(8_@JxwqctZ^?pmAi-N}K-XL%vc<>u zAV!`ApVZV8IAbpn`fFte3#`1ZXf?5OVVYXt)D(nha@Rqzb8pbw})AIG}&Dg(od2)LQ7 zb3w|$t=9zbBmnrp7#IFX-Z}3W7~p~04pPM*X`2qF1!7bRKvJMlCCGLn0oGEGj0?Yj zXbXf9$?6SafQ~f)?BaD2DEu%3Cw4amp{4i$AHd-u{8lJ1owYj zKqm<$fNZ=E8ngmgD+n6LbK#G<0UCS<4Ou~Uo`cRUjAT7|1>)rx(DKGO)LG2WRgBVaV>h&NELL;_qFfzDL{wa`H&>n@O@y%0saAi(+>y!RI3w&xca7+$~L>zRy zGkASJzhJWn(ukeRi$^Mu?ieV@pIrhqx}&@mKqKofG$1md<88oJ3WzR)OtbKUXwZta zV-Qb6i$KtoBA^x=G;e}D4jMCKZ2;?v0WCcM*BKWsfFl;Pk>nJ}B2fJdY3PB@;DO8s zg72E|br$gGoeUa`{0v&Vx#9`PbpoJz1k`(ce-d;-+GiL3D32qcs^#Km{-_h6vGGgb zg~cwQ4Tz5Xpc6^KLEv$KA95XwBY!yPRy$BOJp>x}J_rpLha(=Ahf3$cP7M3RANBSV zf7BDu$zc(n`2{zF=FmR#3$6w&H2BOfxEQ<}pz#Q(#SHI`LfVBd_9=tYB{;2vMj&1` ze+LObZ@YwS2Lbonq2q<1u?l`rGvY-HOebhe0jvA z1s`4ux!#h`qnnq}2XwtwJ)A?x8qJ!y6T}4FYcy--N)QutuTfgsH3#3;+a(I% zgGNBTAcu3HCfhfk&igN7KY+WjEk~I_W6&ikkjpoHIzdzTEGjShK7sQXXbsm}(Bd4> z))!asMzCD)wL+!fYlT*v1vw9N-#KWpum@<#p#!LdoBy+N55e*MTMhu&S!oB*+=(5*#&&XBsn(>9S2`7N&5Xl z$4e2{N*;&A26#Ip$XC?8U+6vTGD*-{DxXeJbz-C9(Q8}j23{zntEd4QNkh6zG6EvO z$^eysTtvkBQk@mFaunq*N%;I8f9pE%eUWcV?tm(?vmmv|_eE}j3V;rS0Zo3e&V~wr zCNt5E<(G$?_yInS0KD*=MdigQ(Cw7w;M*xd_kVNv)9CU=Dz>Af0!DUuQ zI3s9|mx;giF?eM<AteJSFLvGo z4=hEn@*ZPgcyR!H9SVPk2XsvZWGOxP_AOU~&-_uTpp$Gv!A*jxM?o$Htm)^tq}1L6@eE`5=cz~N6>l0h(>|Hiz!l|UI=Kb(TkrFAfE`B1|9`9TR@ljg0J`z zs8KNh&5*f(wqkvUu1Y%wUTy_ibae_mxS|1?VFRBi2RiZV{mIY#QQ(FEs11Mc#e9&- z;HHIwN3U~$N4M?UBOrG}XHQZ<$D(frbyrau1T`uepa#KrP^Vk8<|w#s1+|cFgO6Ev z$7g;4upzAn_%%NAYaHR9asbqA@{ah-A9;jd%0^GCk=%pdUqya2%ZsUcA(Qa z10r|;BDn29XY&fsRbF6)WgLbF`1SwsPe0JgZOuTb!Il60fzD>oMSY+6BmaT=dCoGR74JXgLG6V|(3#TrA?Hei z*3E-XI{3sN^BUBn16>fH8f6b^UVsNDoD;yl;*SC?T|ExEaSz(L163@mLB$p*_r`#< zLUvj63pRspe&g4)HL+)50AJ6?uc>PRVJ9o_YpU8n*wqI7nzjxQcD4h*rmhQwT^zu# zY3c!CCnxZ0s`^0K)dl>TwgC|KYEWs)uc;dd;cf=SI=`lA5QIA$1ft_u7aRa(1JIUE0ns%VK}ohwR^=c_4s2TVY&4dpTYC58Y$~>H3`J z$RF|vz9YtwKMb_KmlraB6!{5c4`@v$XfZW!9e83V2DGU9ENp8@5m*f5$_U#$Fk6s! znJj2^y~g=Z{BfW&S3ZIaIhn>E@;QxP?^&50Xg3k)(3Nip*FD(}aoq=y(r2Gs_zyh< zyY39gb)eA?(3y+p(j582K&!h?ferxWgaySX{z%aM0;UXL+hcxy;*b2A#t*Vx!1fDx zKn(0U(9spPZ@_#(ULKNN=!EP-(4hRGmtYs3#qGj&&;$~wIDxn@#JE{wdz+wm& zW`X&FyhSpkhT(#JNMZO56owzcE(8Tz2=*{!MRj3>=^yZ%4XO)2fW^Qrw0#3+M}T%u zfi`aNUXcbBGI5~Ec+h$#4bX=A(`k@2=)tdZ3{?3bV)@@*hzr4si3?&sr@Fsx;VW}X3Hww&$q=GOwJAyX|&W_>rgRtQ#!VSU)rwAu7 zTadR%0vz5Xr0I-ZknjfkhH$QY2%dF9^UW2oAj~&0yl23Ch;L3Hv5z3J4?x&(-|T?! z!M@o7W()GJ5hv9*vvwl+hHwrI23v&Un;2dPr%aBBR5B{hQP2M$1H(0Dh1 z=}6GhchJ5?koRK#ff{$hg9ZPl0xD9eM}$)K@H?;uqirT}JtdAAB7g*nu)&ixDv>0_KCg$SVM6NAU8%*)hBv z5cW$@7lsAG278`(A_M^8DPJZH#fwZ#t!_I>avQFa%@6vwxiC<9H1?*1&T_1@3FFx_d z=z3fRw_8cD|KC<5`~QJb>Q8W_o(DxLhW(&59&f<2li)*6Kzpe{y=>hB!eD=c&L#mh zd0(gT>pevrPWv{EKlI)w4}LAs)DHo9N=++7!?kW~ppmnLB4f`N3 zfEvZGAeKaeF0MNZHGv1T8;a$SNAm$j56cgwCq0^vNPzZ(z}JI<&YsaY;n{f|)K3R5 zc6$J-M?qot!Vz@1!wt{QbDo`lL8G`norgUd-&lYTBZ=dU0?lc9@auqfK&ys=IQ((C zv0z%j^y?|`@`E^C7qCE_?4He#(gd_d3Uu3^3%`Kuf-PW00;=|4MUkI9I=84uFoA-2 zjfw^n=)A5aDheR$JovRPfo3d0R}t!50kIx`;*U86ax*BVL2{rID?q)TtDq5>6wv-Q z$eIz*X>so_K~#D0>s$rx7JB@NKSK4=1+eWguTV?@pK%Qm10Av#Cps0Rh(C@MOndO_ zTmtWK-~b;D?7^?~3Y5n{7d>4?i133p_koYqBJMuHg z8K5I9o`P12g@a_Es)E66@PZ$H@UF|lP^BP41VLAfMzWfN)kHw)NY?3_K%K)lF#Tc{ zD`+GOw208Q9xNVdqXM2xhh5GInkviP#K7=EfDM{}L1&TJegaSW39v%xEs&7skNgdu zs|BqTheQhaE(gd)0>K>6nrhG?F(6Mxun>jH>2P`49wUL|-NVFYUvNYs%(2DEL9b?Ziu4?)W;L9SoFk%8ew5G!benKgP7 zXp|1*UGNei0oEvxJ{Qou8fYnCnh$>-XyuNK3TW&Oba=NTe4LmCm$tt!1 z6g?mZN7^QV6u9!o+ydXU0A6hdS|r751ri6Zj*3)$wjQKD4opK%rvx2R17426AHgdD zI=R}BU*q*BkaHmi%<>)vYk_PVh&c`3-wfK^1}dyTP1Z;d0Xil0g%vYow$%q|foTu8 zH~}rG1FxJBm;;G*&_c0jkhw1WalBFM85lt0A)xStoXG>-crix>v}WhUBPNKs;8pP8 zg{v<7k*qbK*<#Rs5zwaRH85iZwm>Z87hD6qD;P4w8>t%tQt!eKS|SLZ(~1DaLZt51 zb>IMj(2o2upgjaf!3VK`PL0_Pkrjo|f}lGFLqM(puN;96ySjjG-hre>sQ1$NHNJ!5 zXbtqb+KBJqL(e{d2Us;Ahigl`;0754-WekSH3_sp4_xZH@W+UNvrP-kH;^+6L55CI z5diINa^%+lFJEf`U$gsSA0xO#u>svL0xEM{Knv)gW(hzd0p_YL;L9XF@kfB&*rNhE zy%@5)Q?Nuu<3$O?q$v=a!HWjL=7826W`IKubk!orB|YGsXP|WO2o%AOKyi2kB$1+G z@S>Li>>x-v1qy1x7Vs{xsYAA1oGQH``T8M;aG6Mqc&fN>4b(X%ls z9xtv!RQiDSC&lnU0}1RvL_D~F_UeH)X@QpIf*iC4JO}mS=l_48EwbQqWg=8SK?Tk! z5ugQb{GeU8pd)Et6hmx)2PMD297tI3$AETLfOjy1Ed(882RiBjzQz``g-Q@|@aGF% zkSQ+wpmQIgv5V}!2uP{e0!y}nYar(WxPZ(AT^$VyOHdgt*aE&(>BT*W)4|(3V!-Dz z2_Vw^5~%wGAy;6h@oW47`5Ja74e0()!9C#Z%pj+}`1J1|_)r4y;rQT7x&Cz*Ihv87=W_{ zxVQ#~m<#AcSkO2z$a#>>aUgTR2^n-f#1E*oE-D64Q;`gbVFAZB)Y~AFK*RYUlh%Om zhz6N-;KkN|$S#7WVo(l+IbaHSEitH05|vy7Zis-7#1&ivx$_&AuR>HDUSy(}1+9d^ z{(>0>U5oDmT37~}ql(E<0TtMSOCTFm9r-nmzEFmG3bY2$g&&k=;dv8uQXOc%e+%Rm zZ&01`BIGZ!2cSg=I2(d8DyYiRop=J`Zr%wHh5)1x0Lihof`mYu>>+tIQnUsl&;z{( zTVM@18-C)C)GdO@KyFw7t>?^y2tW@oaRu-Ej+9LXiGs@$@IBiu{E?;^AR$-&h!>!I z4?dVj4kW@4s;D9%+tMND_2?snr-1VyXqoO?aCIL6(hFXq{|hqN`S25e!e3;_Ff2 z05z2PBW1HdsvP+vu7eN9bL5Y?0`kZOkaf_-+#s`JpsFr_3Qka!7s(n45^~{>cm--& zfVQc|yZ|L;kfh)m@QK7P?)?TAU7&(A22`fHAW9_xXj2_j z$M}oizaZJ(1$6r-xEci&lb}f)P@sdRPQm5o3Xld;a;1w*) zT1b@&s@lL=2b3>CN$*7u$U0E{tni6HLIhOUg6btuF%kjV3I|?&pYVbWWCutUC@kRx zEt1)DAla2a0@MLm0yfu_iz=7fNk{fgd)2t_~?f=hQ-P*V|{ zctO!v0ctfJgsK9U40}KvkOTO^mO_gG{zy^KdD&n~)A%(&2aAJpxad5PYDfNvr;tOI zBS2d-KuHs{FDC+gK8yfl8%PAGp$6)LfN zHklw~4KQdI`HM!7cJS%|0Z;%#wIZ?@B#DC}&y`;TG@c_k2eR?Nl|KT^-2*vA%aLE> z_=_pu!EOPSg5XvhD8+-1ReezfkpZ0*EdZ&Gk&_4HdOuLJ3|s^ILKMU9KNE!P%myb} zBZyRp3cQkp-WL0bKL)&DLJ*Q9K?Mw`ArNB&uC0&1mfTp_doFqfR5!6 zKqN`l>mbGak*w_C$y8{$3^@lIcF3v?q}q4nk2w4y4WtB|L_luX0zRl7)XD4)dO?&{i<71wJdVnt;e*q_0 zSo(veC6FJlgKBF~Nd+p|U+e~{16K#2mQDmHiUlEcB*c-kLGt_pqS`CK;Q^Hg#So~x ze^CRH1~((X4M14k1JZl!MLb9n)Tsh(CPEZ{tj|GH=b&;0v;Y`(YC)vz36QW0KWJ}5 z1n4jU7k&ZTDB1i=dUii(WL5)| z1>$TkfG&jxMK)*;3HSn3&=D-G8|Q;!G!8;L@<$v89n}mv>O_Eb-+Ts!7mk+Tz8+|` z=QOBAu+#EDXIg*?PH;=O5+unl0J@VQ22{s_(!dRnEWgIV7cme?@GgQF$QcDKDix`0xZ2S_`311(Y}I`$$AqyQ8y z-~W`d342X*OVSX5plgOq^10%`+BK)nL1ijKc<2FZg)6%9V| z$G{>4v{ny%zX+%-1Z5IX&ml$!T+tnUApp?=8ad>TfCVyWR}6A9?AVK!?;*LOMdbk~ z{y|0mG0+@6s8R%_%TN4~wtFE0OTbAH)JfU`5&$>IKnV}j=h9sX71{z$S|B0Qc~GG} zkfI;dESn4x0uAwiixL-5Hge&Q09}g%-A&~Ry0p}VUqE*vNTmyZTShQ#lb}r$b5FF zIH>%L_yfLy7F=_=@<)Kq2Ln|sprzO@{E@m}b~7-5+zA%feFx%!oep!I?qj%+3qRPb z6cteU1aZ6WS#;SYkh9R>+P7dT0HqC3=?yw3Qb2b$rUGc{=mDSO2UiKX9~a21R*UUXfH~z2i!LY6*{204qkHPg0%31N1tNAT@vVy%VRHsK{DVXwg7xP z1~@W7wd*O+`T}t63JO_JJhJWw34z9lz)1phbu?58DN}%~6@ct41L@J74AHX(>@JXq z=|ZqbB(3V)1?ipGmSuRuvu5E7^0UAdrp13@+3Be0CX6ctdP z8WFRg0cMa^P)Z0DIjH_0XIk^6B@0c(_CFt zI9`-NWWl|3cwr6-6mabt0g(lFHlejH*rlL3okK6IAhNK!1axqY3+ND2jl(bGAyTjd zDI-8f2!gU%1}Oi1;)mpw5|xA(-(G@30dfwNpbL1z>#-LPL4x4!9=O(Z;g6Kv23iE+ z!XFU>K8yjha~x$n2qX(?mV(av?EyF1!DS@0TothG2Ppv8^Pr8jsudtEzX0nDFb$p_ z1*aE~$3ZFZC-`DrXzGaobuA)6@e8Vlz(oP5oOJ=~jnoCx;6%b7397~;O|3vO;3NR8 zK_ZTV3gly;VhuF4$EpcZ0B$Wuf^GqJ<&OY)2t3CL+GENpxE*rz0qAZKP#ZG_IUT(? z`~n3CL~)ErI|A z8)%;~Xl@WR0__5xW{MP@1D1>ck8pzy{Q@;;CxFDj9aeBFM@I!zEQ9V#0^NjirO@dV5B|Id z9^I_xA*y3;fR?o1@aS#<&x(UA0Y!?y9O&)Ak)T2FNLfa(MRA8g@}L6<1Z1Z}_1^*u zfeJm4CE$h+cs!6l66|8oWQM?tTcBhI>hyq`is0i*Ks&=hS@^|%B&i6P6sReG{KXQG z6gX*lfcgcX(FAZpb_Ct&-VT+74N8K_Vvs99tFdBaz^$XhFOootK)C}na|X+a65tHz z4w3@bRN(3!q{so3mY#t81M)QJpqm$pP*tGlgY@;mJK`PrBS6R49(utDlIIsN{RvuT z02-(S&3t|0kCc4?5&-uB!B-xEhLZ1sgg~t#(BXQZ&HYzE0^sp(@Eum5nZlD$A;{DU zC=NyUfrR)YK(qM~ptXM*zdrFtd<1XkO8DdmVuH?MfUa|hJPFd%1HFAN0=&`+RD=ug zwu6ju;fE*ybx9ogBOo%R$TB_PNf^+sk58aHX#lRpBW)u=Y8?3^KvTJ(eYBzhAOZfE z?_gD+ZOES>17E*B!30641cI8CdLWhHfQIaG1>cqg8hw@pNr3tfpmUH#^+7yvl@Ho7 zqiX==f;vFp0t9qgCfsb$NtPh9A8iJ8*94Y821`L@2Lni-BY(sfPy<#O!~xZ2LLdfc z8jxSWb{kj^sFxbK2R!QvHx;zs4`k{bu!;!K{u|KFoGsu%1ZlQJLZ(zax>;v}HAGwm7aE|0 zq(6Z-^+$p(C3y_$E31EU`Uw(qRfdW)9fzE6IEot&m;qd9TwSUXP z@WKjV^n8fXqW{6GML-7%fL2T#><0y89C$G76ThG^s7Rj*7K;I03j#InMbbI&@PUsC z2WTg24DYE4p#8=%DheK*pgT1|tKh(^9pZF3PJwpJ2*;L!~-xSMw_SXAS8 z8o$P8NB;c+9^I_7PO>m~_7*U;UgGcg4?02Cg};uqwI8$^N|x^*$PmzdhTwJe{O_ND z7B+E$2!+;5{4IX03=GY$7(rF;X;8=4)$o8%Z^$&3*S7HU|6KSr9)ZeYP>m4z0Mtyp z398OO^9YfLK!q%5Wz`{&iZecz*Z5mN2OPWb@8|PqKE~qGdCIl*WXW^>{dNCbJI|*% z9{kVmV)(21J)?`}FOTH^{M#>icK&aE#prqPIg3Z~B~Q)&e!VtTpPcyxM1H%ro~&d| zbL0=d;Mw`p^WZ}kPtBhmy|&SBSQxx|MZ7?@pvZOC)&u;l5&!@H2bJ{TgQib8f<`SF zKyGO*0i9d8UktQh3$#P-l25N26Ugs@93H)u0-t>NwE{SNdOZZvS}*bUJz@ceg(qlD zUJ;YW!DlQUj2|a_;*UHF(tF#p`H;XTUw*Bq58%_X9Qh+ogT=vOKR|`|WlzgfrJ#k7 zCp?-DF?uk50EZK3HJ?W>kGN0gdC=y%Py7*|K<5&E;*Wd^a+gQ*aRHE%!a;2t&?#II zk3hm;A#gYLl85E-(uiaw6BOCpi}^j{!a0K;3Ua9|2QbYK{mNq zzXG#Cn}S&7K}%Nn^^bwK9x9Z9+NY-3bHN$UlzTk`1AqHn$fTg@*+rl{06K69yqZhH zr`MJVY!GBg734gTIMZ{-K!yvN9(xILAo8glyg=r;8R8x6gBtweiO$zC-i_5z2t8e2A^J0qgN~pX%j%{9u$~dtq1s9_?Z|OnqPpE`(aRWH~jC@>(j{c z+6r;r2Pi9C0ukV4Ru@3&{RAi;K}GTrP$~zfdC-vTAs@?=B{eSm`x!l&53;y)9&l|v zQ1Y68f8jsZ&g0Oe{-gOFql@MbkK}Ls+Yfkles6vON$N8^HNX4y+El<&`hiN8H2(1G zo}C{&4?bY=)coMp%K|!NNkHXL>wo^%bWj54*Ej-l*CFsxmp+y!OI!H&GlI6bdh`}D zdGuC+lTi{!TI&J+K0b&?J$gNuJPtl&@nAgV(fJb`{-85$KncvF`5;(BASgLM1C{(B zQBX()f)-*w^02&EdKtV7^xy*)k6saW@J-#0{GjVML03_L7Mex80L4eIA5-fA{?5tZ zv=^y+_y{N|2=I0<02POzIXWLu?;Ugq9H`bRSpZ5{5xgp0AUcxw2}C)o4wx@k%K%;+ z2U=YKy32STo;saU5shPECz;`Vt+w`4E+1um^^yxSUh^YAVJ5?$iUEB@ZY2Jghy}4Cr}l7 z&ZGGN2dGwpr6mtg2%Ye-yioekqc`LuC>y=>==}Hc-M|0;9r^bMFnRV?u=w_Db&2I`&D)|ghC9fx{b{KTR?+ykA2FL-VY5aP!TwpQKZf^e8 zd7$Aq@CAV$y&)i{(lz$ZI}zXlIMKlut;U-HPO^Bs6TUI5aa19!P& zSpPo-rMVc<_h1@yzrl+X(6k@FfGY#YxN?wjo$nzhDL_xd-QCW>@WM_Jv?kO=B?GA~ zaT65W%|{Ai9b+70LB+%&(0R8WAh&_~?%+dtL8sh;6Dnvh0n~~6dJEi0DN%u(%>ruC z99juV;R32w?O?h_1=JQk20lX)bafZx&@a%8G}uJYDW5SfK)0uz1?BRiAWwtadIFzZ z`2!D>dw+7|k9z?N^01)nJ}?a$jg3@|0^0{ZfDqKzeD;Z7koDOUusYRi zPgodUf^z5!o!cOX3dVpJJcE|Eg3fsc%@u(gxzOXVAPdGo-MSY(xBmV2=w>Z#1A79j z4Rop(xXS|Sh=H|%ssm6f5;W}%(F>|MUV8oqow_ae3v|<5^BeHFI~Jg0Y7M|sJfKrP z55d+;fleTMvEe4jZJ^`QV8Q~Bz8d6y2~fieGLW95BJrXbrq}?q2YD9*C?$b<&lYL? zdZ0EUXoU=DmOz1j_5ps^LoEmRTR{y%@QGlcqY)nP&pyQOa;W7%X%6^O2at0Pzv#UI zb^^FN9|`KOfQA7;g#f6R#UBH{&JncQwX_vnYn~{V2l2vNA=6O{9z=DL86$^#!I;Vki@0b(e4bQp9b=O_M1&^d|x0=CDRLDBR6 z+b8}=@PM~K3}}c~05p%t51u~;ZSMe2Hb;V&RYpDpjU#{>SfBV~ex&j1f%=Q@Kk)~? z}Lz=w?W8rUb3c2Pa=}X9cv>#79Nqg(+B(0Cp zksox!UCez*K@|zwivSwl)dTIZ1noJ3-n!HZ&aH8`()jfu=VO6J#*UX~fljMS4FCjU}ix1YU3f zO5>n&MqXV3n_dIDj}2@(SQGS+L|A-)mS+k;w1V!d1J@z~FMB~})$wZ_2WL1?Ar6js z=-GEEDgrP1AZCLj8G6_{q%D=ABJfiE@BjZ3KpW#HG=Opocr_Ean^4gJF6?Cmz)M6T zcn!dG4N!fh3K5Tk+8Xg2K$Aab!aD;J0V(C~86VGU$499~Frr&^b1|5@4xFSq%sc+HZCfyoi!tFq8o_ zM1d$<`CF$#niU4IF#l;B1{L?9lm;$>1R-mn!1auvjLM5-aAOVH=mp)L6~Vh=A;_aGQq%RP-IH1Nl}EJT?#UAE;#j zK8l1t4s=%wXr;*&@I;G-M<;062sjWxEs0P3f+8v}F8&4Ae2}6a5=^GO;LZVfp;rv3 zZTBLLKScLMEjWFAEo%A%i#ZEKttbMjvZFyQLC`n~SjFo*FP>ZkRqqav_Ha08pa!%j z&V^s&fMb|v=Qr?`0v?@zLAMHk1~`#IuSEqk#0n0;!yeu49H2WjL8Hi^77U0D+B^bc z^LK$}D*0O{ff5d=_sYlv3J?L=kKlDJ0=gg?bj2j-q9o8E@{m1N0;VTxK4{_%*@JPXSqJaL5SesCazluhVsf=mK950=gE3Uo%Ig z;AJnUAukUuKRrM$Iu5z{(KH_7B3TfP#YMXN!Sc|d15-_y`y4>-%ZBhEF4{H`$wi%z z1W*EYk?CfLI`A|aXcn7avqYu9qdOEdNCrCH=p-l(KJg2z0MBOe3nX}a=8t0f%pc{& z@|iy>3RKrk00k(hGyeiI7V5|!3A(y10<>fXbWR}X1RW<(Zw}OsZ2(WIIr4)l8NoG> zL3l@g(7tEECEy(-;6fLq`XFdf2Hc$j?WzRTT^6SpZEnjz!PGQ{E?ts z2tKG;um!r)M-Vbh|A{{abSTC(P+be^27m@>LR2jHyKZrSdQVrtr>qM$fTq@cdZ$2L zAON}4%cHjkX4nEyXUnG(bQ}`sdLPhsl281C4WNl;kKQ@ZF>-+xFvFwy4XE5(0h)aF z?7Rt52b#48c?Z;D=>RP~0bSY!nm7pX>4j?Q^Z{M#0XjkzT#XgHsEh)&BtciyLhc9^ zfcY$@0c0}BSO_i9q5?YG^%H+g1IU#i2?#9!*;E0N0QnCj0imG|1xbK>0Fr>v0fm#Ex4$^Lmf!c&-BV-A4%mk3FpZEo# zG-#1BXlWY1#-mUCF$z3@=>Hf@7-$l=hy1Rsr(IfhLLJp|=G**YzUzG*}t9E`?0T z3Ye&X;upLo1LAOSgsy?ki3(JJPWc8+w)8-zT0zs({GhRVP!a+ikOfLCpZFsiz_Z?< zc{Y9l-Z0SW8u0P@5un=v`D0*7Ua&?*;swVUP=yNG5DZyH0ID}Yi%EStAub2`{Ker@ zV3$IgW1vnmXw@7v34mszUHCOXHx7bs=LRhR6qo~Xo(q5EHE`<>oTgBmKwLAQf%p9Kogh=U*j&<=0VMG~Mc>=E!BG-#!SBR{Ab3<38g^nVm{ zHos=%Zw>elt~en}&_UC<;0tFR`C~xGD5-$AGl34B<=40l8KsE44zd7rRU+tg^h2No z30?>cnn3~IaeDw%=z>R8K_&HpPp7Z+)aQ5zGU6e)tp;klJ%T8mgsRk$Uk}tbi3FW#5edGp33S3A$Y`i~HUUt8 z2!i{8kVe2)$W&VlXvvJA3&=_h@H7Hw-v+p89|4*_22TbZ2MvLOoB`hOa_AF(3~09x zc$6PJB?3AN0W?J(qXHT&1YMI}qGIsE+X7^z0HhfM-kk?Noe|V{1$UU=LvAerZ7=rd zj)m$3pG^%eRzM9+(5b+n^U*;Q#oh(rE(`d20MIPZ{ZIUHpbbZ$^Xpw8mr=!h2So>H zhjTG#bpxpX4PKQ6s<%J!N51~V4{DwZ=76pXhy-0YEPK2fc z!EJK^u!|$Vf_Hl>fI=Fyh7)`*1b8hD$R!}rC!ZiWbqjRyeq@P?2WYJcXyOKR8dix4 zXfa(l=-z42(84v)WX31xLJLrD8QjT_1dX4A(j90qb>u71dVmL@(0&V6?Z_Yb5)?^a zK^Y1p839@v54yV)95I4sAj#LD9^Z zRfd;=!K3jAs2Pme4~MlcK(0LC(fJB`~J z4Vnr8^@Jdmmmv6Bgg6I<7k`g}hI2u^(^yc`4>6qPB;e5r8p!?wRuBRz!rp_%6?Ll% zKxPX%gVr2?Hu(v-s2F_a7l`5k?>6VxIQGw7NH*4jewc-6^I{DPnnt{BkB z%*!->y}xPv8lYtU^b@~ewgl+1OK?XI)Dm*8;BOb<2F*}_F5i9ZH(pvm!1{Ba=nfE(|i$)C^sQKvx{D}3S? zkev;&05pgI$|#^r%341O+>yM&-*y$!FXpXBe?TLP zf)N3r9!1eZXT+Pd(^f%ZfT&H-O!0cs9V>%8bRR~2Wk;Jf-dRi*8t_79B?U^qXH^GE`w?pP@M)kwgj}H26T%^ z1n5Lejk_SHf(Gjy`6F+C;)l#JLo=NR=rASl38p7NQ4gvHK_?|Ufc8BKdV^v~um`*- z`Ni3N;P3-)q!TCxr+UziE`jWfPyB+;pj{p%;4AMwgR0`IpFm6TKs(DIZF@o3MmyMM zGXD3V5)X3!kzk1mXaTWcZ~>?~2>8q&p+8!>T^?RU} z1<32KK`nr9AOq(>b_%$FR*-|+ZZ7;0x}S2uWk#gv&O!*o)}W68G(R4B6|`XGE$G1C z3?5Kh0J^cZ0#uz}1*MPoAW_ivjTq3WX&TQ!V&6aUM}p2j02$aYeYaiF#es5}5IXLkjyzH{V{0sG-CD2U#I zT2i0*1%p8&^r8+R^FZ67LD38?g+z_Pf&$T?G$bJU6g{1nJV$>6Qu7eN!4VGuJw zH6ob5Efbt{BEZW-9U+oeK__T^;ui?E07df4&-`_~@|mFeF8m|ECiDs~(27{_$c+mq zO28LGMt%ZW589e5pvw+2$%Q`>6i0%^9-mzKV<7u)+(7oZ^2fXZ2|WOXEO_fsjS6U0 zEa+13h~uDi1{$|xb?OGYEfU-d11SR~nn=)KfQt&K0VfDPcp7BJK@jl~l<`4reAb8Q z;NSq&*x);dKvN&JAj9}0SdV6a+7psT0^n?cD2G@~B@RxD5r%FKd` z!5NNUpcqsifTpIMK@+gf4xnNTG^FYR8bkmUK;U6d@P;)|MJi~c@}fc;JY8%69+v>` z3;|VkFZEx8yWO^d;H5AEtS>u3ZW0iM(1MT+lP{lshb(pjB~|d{)!^I@9`pp)n-Iqe z!ZxgfSM7r?lmksPz$Ups%`WgRGf>~~MdmKZCK}M~W#G;f)G)-g+K`j7U`7gnya!qU z4(h`~#xKBz38biSymbBmJ~bZ{$e>|Pu;akPu3*POO%{Y5i2=XBPY@K;xCC5c32eB|WJ4gY4n}cf>&Tp8(8M$bwz?MRNjR^Pp1*Au1d%PrZi( zA!r|hpbMxQ47;8i>|9913WC>`2!bc$pfh-&9W5X?f+jdXmj)St+y(BXgEmw^FYX41 zAjAj(un_`aBcStnU?T(|vw9^e953_V|NsAD2FM&xms{Y)-5p@BhNuX<{PYGKl1IS( zeU2B0cYvA=pte0|auYf)1POfyP&*(&0@5l6yT{<=#xIcm0%$%5d}iMT=)44Y*$!w1 z4Ky{O0lLJbJD$S>bi?IBPH=jYo!Jg*!`GQ!OabNY_fJ5L2H7eGhHhqPQ-fbXHZ=vT z##S~JG+#nB?&B~U$khViTt68+5CJ*<0aRasM)@NT zgPaPoC`N_n6MxJ-@URc0(*-)=%>{JVJZR-k1SqdS7CV5dInYQ8Xz2P_8u-W!0no4k zf8Zt1Y&(B@pBN}gG(cNNVpKFhlRlskUY}mb;&-3Ue?FbhcXNUJ9)ge)gI+{$1E(k- zP`g!N4S3xD6KJRrq!HXT1}$m=ui^nM{&{g{J6L&%N&>ia0v*W%&c2}OZqS9Tka8B} z0m!6s1-P5$240H-4sp=%68PXg5Dz*P4I2Z2tUmw^+(v@-27)&3KxYC#4arE*=%I@W zs5b=;9MDM4i#^+r#!@vv>p3+JLHr3W90XoeZv{IT>;r)v~g9cHd2fl+xiX-t4q@oO<3g~WZ1;sqLqlRT5)gX;u{{?g))&Kwh|De_qXxtQ( zRl(z^ppp}^KnK*DJNk(~@+ioWHz5v+JP+c4j*U17y009h8+7+x3}{LUw9An{64cxV zSCLOX@yA^RsRpS$0qRqOIG4bq!yak;dKdWHw+Vxs8VM=CLqIDG^g!b_k)UCmNYL4+ zkX2}BK$`j6uYt$kL8?LR&oiGu>pDPH=qXT>Dg?BC4bmM0jnIRJZ_n_z^MSPpg2!q> z2k6Iq{lp&wIxqkf-q4d1!5vaZ(7+>PSPrz1CXHVM=t*V#5umfiL16?M#seRq1FFphz(X~lk@ZOM-2ui zi_%TtTma6Kk)LspTW!NnbaR0OC&4L)2I9NVC+F~`7r?k;TvI}u#$ z3czn;g`9B*uERl7w9qOX95JA_J9NepT&aQ9(SaJI5T}Fs^`K-5Y7_dXWPq5Up-};7 z7Uz!ykBWj;LW0&cK{wL!M}lXxV?fJXz$Hy2DA9pZVkBr>7F6aUjmv^Mwcv6k0yG)~ zk_7cS!29NIfFc0YvW)~U5eJ{P0$L9P8m0%OiHKLw6b>3qhyd*e0Z$QtI=PYWK_jJd zkcr{QTOfl#YnZNs7=J)gaiDSmw6y6Ci020yj6MgF1ntQIT_hd}I{Y){7APBm3J=I| zKDZ+dKH8#D$f05btJ=K;!Epi@o3cc0~`fUmg*^`j!s`*f#*mWG2%ApzLwT9M#5i~tX; zMpj#Z`fH#iV-G;%cc6^v138HXv|H5K0a7pt!V(<#08wzW9CRrw^kQZHNN0~vplg;P z=PH7R*{aupDxmkE!={}<-3tL970}k3D9HG{Hz<*U9Thnl6pEk>0$%PC0qKhI3xMiE zaK?ia3j!&i3J$ih8?@mV+FCjBiC+NH(*PBCp!hxrT9^&$Yk>wKA`ZRm`~Ls`g#F-A z0MHU9i5C;rgL9NBX#EPP7k8r;G_nI~BD#Y1J%L(|puEBl8u(?|@b5n;3_(RDcuraX z(GC)L!M5Sw|Idz~13o|lgS^|L!Oe^tpstevs5f601&TlD8vYynpu<1~LR2I^gC|%( zoe0oTtdNC{F`(13K?{}NfTrj^@e6iCJT905+VuSX3Fz=`@HCzWfBRcrusxtooIr_6 z!Ds%cZ{W3kpvg;BDbNxW@L(5csuMiZ1j>S-ymIste;lY91Vt?GFVMmeM}F|oFZd|; zk01e1Jqa3kgACV39tZWv|3g*;M1t39fcm4A&7Avbmh$_{y5Ol7pkcs$AQ;b2|9D6@#}+}7XzBBRc(gY&Rbl=zyP|Z zi5Voz-v+uz57dXusR4Oe{~&+!S}t&ynkIooG#-LvQ-Uc@`z0U?+nI zX(5--fl4gU$xq!tbxzW1NAjQgI3^?paU;nt^zyP zbY?hs;7Ne>1Bd}Sz5`?;$Zepg>j58I11c!Mr(lB0Z1Anp;0a~W7||Q>3E!YC3ZQWy z$Ys8f;EoP>lN)$36(~R=bt@_$7A*k}4}+={=-L$U1T#2|JAzx15uj_UKwVr|2P@(O z$N`{b6_FqZfRBX+Ek`;668;5hBV7Y|?Aj;(NKjKF5~MQb703&q(LGQV1kH6W;PXHQ z_CSW8T_MAZ0&Aet9fD8>Xp?quG-PlY)F=TTB`#olq8u{j`5RPufyNUdbtUf#kT`$b zX^>+;&7lZTh6Z)E=Rn4>`N17@P>%^b7#s;|!GkW)0AbMKHQj?1CH=u@5BzQOwv{*qvRS%>MoQXgw0Mz0J6%@(f zRo1qWAW41!-iMG%PgM}Y*9D7%QyD1ULD8Zs2aJT4%8Ajdj_?jv*MkGu(rAn;n6pP+G2aD0IVhy`q?m4Q=4BzT+a zd5|(t^hJO>W`96j&>4h~aq06QYe1vMk)URYD}MxNU^xO53%m&sQv@f25;!>0!BY>8 z{O}|opz8us10KAMv<(2UUBH{&1#}k&fr~y+=8FWKmjGI70J@L>bfW}lL>jy(L_k*r zq6fShDFVE47&Ia-pqmm5P7^VpQQL^WpI!LtbRPyWFt~uG*}!4+8H2)0hJPEFWHc3H~a00Tg!R{6Wt-f~z zuh;<(@<)PhM+6P*fRh}kYyl4ffl|@27eAJPGd!eN2gP#_cw!C2f)pOm+6&a~1ZPQb z`O6QUpJa^&xraYe6-+yVjxT|%8jS;Gbw_Yt3v>XWAn5Ky4NxBsw3j3fQb;yK$|`t1 zi_{GTPq9Ldbraw{58<_di&1c&3A9Nx5;Q;%$+`B|t8V18pa01|@M&F%BxhSyWy;T?z`4NXU_L9^I@{ z!OB4mddR%x(xs5*C1^h?sLBObfgrsqp!MFM@J&$>c%i@e-+$03BDfI@KB^Yn0p=HU z2901sS_aJz7(uZB>IHzCFM{0=H3HreB~qXvdns_~3px;=fq~)WgV&I8PEeWw)u}F^ zeNGzSxid%w2wKM@d#xCpe*~aM7l8^I&_Ns5!M=#R53&$685RldXMqYu&}oXG#Y3RM z2*}!pm!J6Kbmu|B4YcPcM1P|krK=4qP=5^w}fbGh&fm?npT zod9+BC;kY~>aBa9_#;4FM$obZ(8fNa7cewFK!0E%AYr6QK3E*`Q0}btOQq zfFJq61>r^B0A+m800HRC#=D?F+X#sFUVy4@@VSzpVXhaSKnHJv>T&)^Q@K!3IuP6q z9+&5j0Qn2tSqB|?aHt3@2foenW#uc#+{9MUoFcyft1pCBh0ubKKHSTwuaJRtNPL3_ z7$8+Xs51tc-UP8A$8UmI;89`7(1Rdsast$nEm0A8acLna$q9gZFyJwDaAOIaXu#PG ze0q-uBu|2SUZAcPC?de-K%259DgrNK-@?byLF4W&pou_mJ_EM^K4`+?)d2 z1Zr1+EdsT4AQpfw8UT;CfF>!x=^5fgh_M3D#Q@;W9@tn=e+pcsKn(}&B?OH_3(SFK z;1qCY5H{@&O`b0+-hgk85S#)lb_5|uAVN+K1dZ;3t1htXzz&8w54_Vsum*GlB;=+Q z(1U>4a32%biQt{2Hs5qR-%K4^v`mIKoM z1&t7Z7iEFQO2K_dLKR2YEe? z^&yDE1Bo&pki0&xSpfq>Ie528h!1#9P6Bzi5olcuc>W|bjsHEU^LPWalNGe7qw}*z z^P7w`emziG2`Q#RR1EmLLFZ|J7dC;4B2@=(P!19>wSds97xF>;7|^~bP{R$h_6Rbn zX_3aS0lJyWG|n5;MbJOS-~NOd#CrcWjbHyPf7?Isz9q;4o=DjbU~}TYy%lg@9<;Oq zbnVTNG=4qMP!)JEn7=&)yyOVnLlQj#)+3<$#|z{J0o^w~AUYDXYfe(4eB}da%KQB`OM_{cfxp zVBHY&BM-fpIS1-$&`<|t0NHkF9>^rnwQK^cKf%522p>?s0xf}#12<c@UI6K*QFv=7Fq(I$2c)$;se;EI(+dA3FKz zqoVNA8?s*uma1ZOUwMG61W(I>7Oe6|$})f*8+R7mZ*zdG_XpMFpw5^cs6Pu$58J>~ zR^aqtItQF4L37iPQFlS`&~aRd3dd^+P`Xd!*XIrJWMJTLTM8<0K)b|21CfV7IRP?N z7QvbTc8MNnfz*vp{DHUm+f!IUZUb!+1#KAv4f}#810`OFLc$n)8YOhM7^oi$8gT&` z3+m#7YJ5-+gq70+6!tNo!8`tN-rZnc9B5h$ygmG7~*4wcR3@?sBya!$Z7U`p603O8xk90?{T0x8f4HR%A z_M#q!pW^`97zery40M9pCs4}-j3JAM;y`Y& zLHfaqcfq?CKr?Ra=4V<4Nz{_YO4}sFHPba8cdXYL46kVW+AW)NWyDP}C zka9^N2DJNJ1GJ{+_$U6D^UwqhjyllUf_k8tNzfY8W02quW(Mhv3{e3U(x6MILFo%L z@CZs5w?2WF{zV*4<3~+V9Qcsd2Dn)a&4b`P2EIrftX&{R#p5LtO8A3DB`aJYCl7)a70G71 zfWiZ`wiwj*;?)7I+;IUXyExF%IMB|BE=ZU^g4GtRIu3MdBI`%U8XIuld<$ZOE{*}U zG(qc>K&R@14z+@;Hj4xu`3CC6g9lr0fE0uG@aEO2v1Olu<5CM>hE}#W0aiB#(%r80rfFcSs9uI0O zfM?R6+su8yK7msP)@DnKnEaD^raI!vb#rVdmmf`vh=NL~hmx5*;R16Ni8FM?sJLG3Td z_I4i?ftU9oW`nCh&=%7d+7NYM0nje#mtA0Q2!e}uP#yb%6QTkv0IHi`Rzl1G3xHIB zZRB|Ia4OUvsP3zW_!n#e*v6d@bzlLojT%3p{sqlgVb1}r5Ix}F2hHGsC&@uR0|!5- zKl*Y7%vGRm&*1C;ZP|h&0Vy|G!ps7#%mpiiwpGCjA+ZHEal)_v|3OFPJOXb72Dcd_ zkTwFlsCa;P0kd+{urO4Wm6m+s7m&4?4?3|$Komr$@rU#7aRi-&Q=;Mk+AIz(f_U1K%Nw2jz(^i zgWBVsoj*J}zx#9^dpQrKtOAw)AbH3=q@Z>XN_!o&CPH>i73f4F&^ZA7t&sTz0ow<2 zK^_ngy#S^K!6PC9xeTDAYAisFUeJ245ETtb)dIPx6SP6_1;b=;Fe6LBvK8p!2T)%N z)NTUJLx9#S#Hc8|I6Dcfh55x4NYI+rq<}mLDquc=E+7LnLBahZ&>|TD@Td^zV#LUM zkUdzCCLF$-S6Bn{cn4nE!pRDbdY z*nz4Yjmx09nls4^498e&D_Iyo>$qe=j8FVApgUVZ$AyBHQi;w?201wbN`u-;F^@pY zO(EhSeuU^$uo}qBprC5~98ds5WSYS;k)pzOAXDO?w4iA492SO`Eui>B9L5GaZz{yI z^Ghh?(1!?+P0ww?W6t0!89=8LeF7cy= z@P>oT;TK^2p9INdpruF9{tT$}j$nP41af2~Yo9Fx!wbQQ|Net4ae$vr1c`0l8(>ue ztS7*9BxqO=bY&*!JaW+T2hjsy@d$8hJp#P<5OlRFxYUCrEsGahSA+V#E-FYllmnDQ zK}Q9>sF(;kYXEY787O^&PHF@7bJO_sFP7V-@#~$cQYe*6~Z@(U==J8VF{ghW={!55ViKmi3B+XHKc zpUa>NRhOf}@%kF9eFkbDaM(fn&iwKWApVU+28P#%A^P}R%KrcV|GEdJ9_0Sc{~o=p z#^o#w-7Gth^ESvmAbF2oR?%`6hR**k-7GsgO?J3+9ypAwALRE>`~v)-91adeju%UH zKwbdVXQ2CD{hc8W0?oJ_MovzU@&|O95$JwmkH$C9v+F^7l0kJOIAlNrP~Z(0f;pgF z--0EeOQZyAK!=2Nv#4r-j$`O-0pBuYc)+8%UVx!Q3$*JEbh{|LeC2QbBn95}2C@LQ z?gA7K9-V*pgN{-K&prx(cEW&;Z+&sJ9~9=0^>G30SAK@bMzq-h@fVzPv4;PGhiE>_U`C5Zikd%&kMr19%LIe=mbwJfLo8M`j+4@gx-9?AGZV%%s;@rYysOP)?g)& zn;5~T+Cv85z)KWO)4)ax?txB?3)rp&Pp!v5=6gW{S*G0(JK)pKwv)h01mQ~~O$#9c zu(5DK$R5Kq&|NK{_4}Y*m*9{F4-taLo&{lt#e+8vLnZ~&_%%Qi#qg=SAK)or&`Mf} zNuWE4B0=+XSHTkC5m)|5RT+rou(>k9DUfaL;AIQob*Yd^W$1os$cIG^p=)y4YB02E+(vVs32*`?g@ER%5HJ>j*GnM?2UqQq6pjB~@tD_(b>_D@M zpnV1ckQ;!~_`&Njpo7=oA(;qJHypH-tOPU;1m0K(>Lr4P)ImN3A5<3u>YstvR)UGU zAe%mY0--9u(*v#W7s!FE z(}Pa%y7EI-vfKs9gO+%K))Pj6C*aS1;s6J%2xNF)Z-odsXu^cd8yligwtu3{s>E7m~!H6lR=0LOqAzkxP|gKk~| zHG)8jbwEb~ME(W234Bww?0Hay;sUAzUHBvKfri&XTcKP*?FjISD+!QN&<+*>*)0~3 zoh_e0ldvEwB0+OEkyk(}PD5riT=`=_VgkGxpb1&%vFD&ItspfJ88(n>UHBtE!gNHQ z0L`F6BppG+11|iL=RgjDoY1HNo{#Ae&+?gS3DY37Cq3w7Bv|g11bA1MLH7 zdh#5|M$rD5NYM5xK_8U>Pz-~QX$MCeXbL6*WI`nG8Bk&auU-PJhXmc#>cSrhp3wz) z5_GndE5F8fka?g}e!&YZ9)hd@3xRigo6dxK>Mz(`Af+IyLBmBLC;tF>^(n0o~Z`UC4r{8d_ab|f>uSj@PMgmn(k+c%mQF z?N;3hszJbuJ3v7q7z4SOGe*S%q#2ZOB2R&4sz41e*|}!m*)rH34)8oGf6U`FehpCK z1E+k@8fnmidDcQRP(`9~=M#Sfcp2Yeka?iBlaZjyNI*FRvVTKB)*R#l(8Ucd{E^^E zdQe=%fL4&Q>VPZ+TjRcfGSU8I37s{$1j zpnJ}ynu5atbUCZQ9>`@*&`T6Rg8`t0P2f#(prMdR(C)4X@F^SMynYW<27Cae4ba(F z;M@o*iNI5RAbY^`$Ixxhk-A5WK@JyyI@J-purJ~xcnLax1n53{S)(wJ3eX8|ppXDB zi3P8!`vX44&5=I_v}ggem@E=}PBExUutWt?t$`LyMV%&1?W58E)TuI{(7hPop4w6XlNgtr8Z}5S5uAmuB7ycO5 zWN-{XHx_{mJp)=v1RAshsRa#-3-H>5S7Pb+fY;ZQi-Jc^!M6<+fT9L;KNINE&xj{! z{2HKi83W$*3*TN80m|z!pnVRq|3Gum&l;_B5We!*tYWpd!%AD{*G z*FeDp+9$Ued;yvxzs8s52cR-2q8Zdc`UF01O>i;f7AVlj#wY%W#h~WWCw|z}vA`ba zF&7cL8yFcFIzU^6ph^V5Rb#|r@Ljb0g0N+>f~&!ImAUW>?uK4tCO8>-#hBn`&=KyS zrK8}x%J>CmgD%tqEy{$N0k-24e;nu_3h+`P$d#52VW5IQzXj5&a^V+*IzM7FX-iPcVZf(#!S1NlrjT1>~{F zDG&?z1ysX8r3ODtz!7v&C3tof)b<7Sgsw$^)?BiFj{wC*7Q6qnq_DNCdo) z4!qizKZf8wE951Vp<)MuFCu z@C)$rLD;O{KuL%nv~m)$=Hn5_6JRmWiW86=XhcAO)e58sVq*-esv*Qi(8diHutg7$QO0$pjr51M@h%~eFQo&&kp5j=`4=v?8^&3ZK)6qVr4!4ha+Ct?ZoHp_@5 zD&VBUAETNV4h}TX6gH#_6!8bNF&lK^n+IrFOAENm0a}IzTIvEi1`FH|0tp-gWdqRF zQ6Al_`5eLCFqu*O*6VGpJ|x^5I9=`0o*)&TrroaUkPtk*o%wHBtNmybv0EUMpzK*hfX+ z#nJ|FCy7-Sqy#)o56V`b_yu@{K_dJDrjJ2AUdYlS=x`jYvjo~BAlL)G=mgS31{Hds zsSVJw?Z9u~wmqnW1nNaWwv|;wP8MX{4_+%JVA>8c8$1ma2RVrc+z|nFpgw_5z(X?( z)LTLr_KzEs*ab|hf^3pj}tFuz5@*>gLaL=A}rz<_}n&u7ku^LXh~7A0ClB7 z*V1eO+aSOSrT2il=^ovzG1{O|5Zt2z>OO+kNP+v0pdx3jtf!)v^_a1O1_A(Bf%s}V23+@JYe_Z(EKzp!22M2)S z2h1f9>K*RH-m2mgZ2fRK_jKma09L1=!SH{LEEc9 zEmy(Gkn%1Pw98v?F{H2s9pE518)AUK5*4t2K?`%i^@a1P4+B zD(2JpHNXc>K=*5aHn&5fI|g+2z!q@0f*SOzAsGX-!clMwWL=FbX!Dc{zhF0XEMf}e zSPM|jggIk3G)x3HLs}@%MS~vQqRsxGh!dCt&OaXAyv_FDWc=Hsa|(1bYUCe}PS_H3 zL3n2v)Dipz?(2c_7C5GmI>VqPte?Pwprv?e{2G72*$^C4pzU1zk)V@t_CVLy3fQuO zT@krQ1rj&V3md`5rYbZaV0?M;1E^F1Pp%2D&hQ605nAu@x97hFr(Z}d1v)*s!5?(B zN5osuY3u^5w}KcL`1M;L?tu>QVRZ*v0Iqge zogpr}0@@}6s^UQWG=6V?qy}V)BY5!| zXnN=qzkqB%MELF}{utSAFdL#ADh`@~1Z$rTmIJNZ1Q!wf0RAs-F7eyF#!~=-~+}Xr=|$VCV?d*Rf`}rxGMtgGJx+34*`qD zfV$t1r7xh%zoGpYaD0FVML@$*pup#EJAxGKy!K$t0<7v_8k7@3duwA@<-vT=;fn&i z%3wCA2?5%KDZr}@;hzC7vH{I(v2sF0R1G0CXs4>KD3~3?`qdAVOCTow1hXSgff|>f z5+KI(J48hEKZthWj{%kMpe=HsBNYT$K%)hq?mKvO7pSSFDy{};U#aqe7@$5<1>_(~ z@Vtl%zkqBnxax=ip8*4!?G@ma)_~|)13pd{lss;OdMhADfW{I8L|=g{=Z}n z-UV-6kCgr83yQKxaK{+rDFKKJKk-L`CY&5WJyCwaXa|s=?}2*I;GcgchDT?BZI zH+UdObqB~K@D2pXQdhxf@H)&Il?rep%!OZobty;*f28VO5Dm)jXFx#(zWW?>S_{Y$ z&G@CawaG`$$mF0%RPh z9!LglSP@V)0a@tC9|KM#pyfs`;Gz}OWsTG|2T6jP%8|U%U^ckt&B_j9JAyaFfCkJ2 zSk*wQ4OqJ=u}l`OP3$K=K&mspmq0=A)sRyK-n|~l>Y>SL8nJHgIc|y zCU6V19WB7C23jEJ!XMEBX=1zZgO!5`@FmU>ps~n^V=pg!0j=Q#oo5Ov`a$c%K%t!iIwvs_G*Am(qaLF=5iAEO9d*I%NYHwC&?;nD zLCyvd1{bPKU^YZKR2*I$^MU1{#W84VPxcKct$=e?3?$v~Lv%vL;X1!S)PY*5plrY| zAbSZS0=DxUgsuAzOhZg~1ZIP~ouE?-1Y~bQ1XN!_XlOysFTnZ$A^?hw2++_K*ht8F zwwODhGz&_<{GcQVD%f8t{eqmY2Ch1JZ-c#rs5)79fdvqS`6e(Q6t@Dr+rVr@VZIN- zM=H$cKtxoJKxlBaJ^{kkT>z#bCiQ^XAd@0RA>t9BL2dA;Oao}KqYJ;rr%(K#U7nDV zJOVVx3M$TD>iqiu|HYXSPzxElm^(!UwA>kVyTuC@usC?|5;SrJ5(kajyu9=o)L6k( zf29~?4yO9h&;OB^6oBsofShjv>Q{pHpd-!hff|e+-SGk*-RvHnkUekBpyuLd{wNO~ zk52Fec?27%We2KAKk*B)fi~fS+lb)4Xav(IenBRX7_?0bN;aT*aZvN98QhYEr~|DF z1D#0b0p4&8ngneIwPB$PB@d?Y>)+sScLZ(tbmSLgbm8A7?D*{vBYz7IGXsNT^CKq1 zx2}dyc7Z0KKtoQT0v>W5Unl4Y-Or%4Q9iw*$S^)!TUe=f=*-J1zL^wvhY77y{-o7bZt4n-|`-^KoFF; zzylqi!XdZDg8-WB1htKQI{&+LxTr+#P zFXk13Q$Y^sJcoBaouC6L=Ri+77uXHj>jyfg?h}6uWY~mXU<;%%0NM}>Ib0Uh#{{3C z0$!+9qvG(w8)l>hcssEQQW1F-_U>j30%kT)P(vq2>pX!{Xp z2cIBlJ|DbmPvgb60@x8s0iYxZKI#S3h61e)0uKm+57Py=OI%bmT==(vHUqivM}n>d z1bGVNaZt7Z@Bf3WDhL5>mj?CNVV(llG+@I(8~h_dl_hw;T_h_9$l2ijEhu=wdo*1^ zS9!Yfg9a1@HbY`KVl!x1q7!sZY~;C@Tfok};Hn^pM>lx!L&R)Qk^to!a23TL z13rEZSMM-?*M87F2dz87ODXg(^EclIS;Q}}7&OlFiCt#x zZyLY;pEBh%e*Me*O^l#%NT_X&dq9Q4F3=TlFB$**|33kwjdzvG^{*7{wxwrV+>OpIyUHJ76^EZJm#ssP0Z&C#>F9(eq2rLGL zF!-`Jet8B^>_ZC07;vn@qv&M>XpIhheeNfI0cX(ZjG#CYTml|JNaNQ49gGdakZF4t zet~KYmyQ+{en!w%f<1^#ssSq#K(!%cRvVHlK`{ziS_xVP-~wt&fsU2{W#%3g$W*G} z6v*ViBfkcyQ4bw40&Pk>@`*o&b*nQ2!;6GmXz2l2x&_K;OW;|%7}Uy!mlxnGsWd?6 zqpMaqgVVa;7Vy9dxSI|dBLJO^@q!Q2M9^w67k+_kP)mCX#B@;c12TOH#G~L{$dI0X z1Zc_}c8(hK&@ssIwK1YxAbUZD3us9G(2K=6kRm170TLqM{vITM3rv9<3_TwbWFx4& z0gtA{fSSFaITO%*<)HI;OxJ_g0SZE{Q9Jg+18Ow*%w%w}>H=D;1e%o-@CF$J>lr{V zJOD*b4|vx!D9s)Kg>Nd%#0u~NoPrl$vcX~Pq9Ooy?iOfh#ITx!RD&`As9fIy9Y%qb zYcBkPEzteHf?L2x3cOejF|0-f5pg{*FAGG2E>#zRN2K5!@U~k}f&p!=jgh_N2r9n> zp>y}}ol+pDAAaErF*yfxRT~u&=8#pq>V=J^)u4{NO$F;7h|Hkrn}7%qIvrqZJf{Mi6VEd;A4UR4iVs zhZvV#fG`eT-GTasVB;Xh$AEiv&|xc31c8n`b>Rn{QVQuh$FN>>U|@I=lLbD$1T@_! z0LfsW5*3!V1-3wE=wN64fjt0DtKiLF;GsfrJqQ}h0<|ST9RbiRA*e(IFTeopB?d`= z=cb`s;6Q_pJ0L0|Yg9n-6$xFy06OplTH8W0FnE{|G@J-J-T*u!6#z2rC}<)MWMm}x z_}B>0W^d5(j;^3Z4&ccO@DO4FR2Otdp)2SJHt-~_3x8w}G@XI^s z2C5mfS{qzdI)ZlRx`6t_pc`QzR)X)52ltsl&3Mo@0C4>Z+7OokawBN&5_B>t`20f9 zI58qwgHI#@ogWHKNT9_vpu)?Ae;cGI1e@f-9|4}lKM6AJ)Jq@eIp3f7A>}c01;FqP zbRIMK%^f`Ng*DFD0$L%>_$6MtMV=x`*^8hg-oA@JG) zxlfM#f^whuBS8CcKnr9Y`2|4h`68M@L#-f57R)=~Ku;YkB zFYZHBrhtz66JXs5i80Za;7LOP=r}y6(<(3mdlzM%kAzlMO$ z?~CMp3cgJuq8mEN0j}#fr9deGdIU8{E$B*L&|y@d9mStP(E=Xq2Jci61l_X)p3k2R z8CeEv16LT}&g^W+&_8I=MC4-7s6S|peXG78jXm1(xcqvdYg3dL%{E1%>nnFOkRbGgug2U8DMZ%*S9D0$gS~j3r zBJghBh=VVtKorENM1UHMph`+~A!uy`XwESJ)OL>srA!zO$w3HdNP78E)3S@IE zXwFk$F?8{RKr>_lQD8T8a7JJu|TI; z%m!sf(4;vy<2mvR_%gh#fwy--mv%;gR!f5#2}ePPSZjd$SD@H{?Ai0^G*NjWn*xrP zR0fZ36BV!m@WKu7p(YWaCebH;LC|;wbUzUIW}BDEU_Fp!9+2x|W`o@T)&=Uk2t!6o(~{`L1g+oK0bkzZk$j>zfRTT{iT@{ltz(V9+Ckd}`^`WH z$tGU{Z505G!|?AH3D^AeiC^nfZ@_=(j;Vua7+oU)28Pb_ zj-3a(LsVoSZi~66d7SZti?)l3fF@{*!%dJMKJjaTu9g6ueg60pf1K(faHxS-xw`d+d%8aKxfr~ zsxsE?pj8+Af~@h`EDSH%Q2SRN{5qg9V9+vY)%QH02n)Rh+aGx16aS%8Y-#)b$9gZQu+5}!a0LoX9vg;sfKm$Oa z>nG1Z>VZhvWngj8!UO@VnI1oTXajXvD1%mpAiVuC_*SX};%PZ~$ z4g=8fT&&gxpfG)ZvhmOhQ1(hbbnutFN9FaR#W71$GwbI@WUL!=U}P5r>erR6yI4KE1ZDlNcC4jmc}E#^hJW z5J%9>@V&ZEk{B3*eKbM$wQ{`JANlXU$HBkMCGv*1q2rc5ou7O<-??-?clt@+CLH6D_lSV@ha6@A9X>7h3w$9^^AQdZAGCC56px0$Xb6mkz-S1J zhQMeDjE2By2v9!+7(vrpAY;Lcr9lh^h7aG~IDl9?PJaT8RWNuk{Ri_GTz%+Jyguam z=Cl9o%{2dhl|TC5-av1|DreQp_G@IKQmpTvw{Lh`V{fSNz(J8guy?X!fxU#TOUQ3U zPOyH4hBOGx@WEdHt_oY@QD+!`KSZ6RLv?$}W5E^W_8|Ki7$TwaB4GMjj*}xq{EPkB zGa$eMI+o!7|NsB%A>vTdVZKAP$U66jRa5LU18#=Ct$$+wcq?Py=eNf8>!SUFMN_WY z)ui5A_4>j?`|CF+)Tar^+u!F#D+4k{a`kP z0Jr@?Oo+NCV09ecVo>)tM@ueQ|;9Bl~X}G5v?WayiVJ2?8r2{!>^3 zHg^Hf12E0N-~*u>ydm`O0}z^l!(qw2V9VTnsSXdTMAo^V%yxJaxI>P&>xILT0+0@Ihj@bve28H}q{0XwJL1&ATBSifHdnNx#>t^!UIOsadynbY6W&h>x zm5P_kv>h}-&NN7chTjrs{QZQ{pqW&Vx8WG#uN(GYZ*n~c*~7rV@BKrBhc~KrH~PYq>rh8m=l(_ew$SF>vmEyLG|$ zV+-sGLBa4r+abbo%Zajm^X;c(&F?$Tv&6oS@#gEh^4p>A=R9E5WALc2(iI$E3=9wK zL&4xG)I15WeNel>6t(=vz`&pozktaJZ0MCTc)E2gE-A{-O)V+POjbzB%u6h)Wbn<; z&r`@xQ*cczD#>67&d*6KQqWZhNGwWB%FoG6W^e*4Qz))1E=kRW%e&^}WEPZUCMV{= zg*++?Qi~vZ+%hXtQy9P|Dg-B%Fa+cz=B1Xvtx_#!a84{qOwOq+&dp3#C`&BLOiap2 zWpGW-$t)<&%u9#4%_B2CLpL|ExL6@VwwIkpxxB z;F4dOl#{9uT#{JC;F6h^R$82@;Fk(g!w_7MS(KQg05++TA-EtTwFqP%Odu#RB{QGF zC9x-cwN1;5kBtsz&ph0Y07^W6o9wZLJAaM{4vKO@6 zf{B5FffdAoV?Ag-w}8;Hhr#t61A~CW*0Y8+)0ljn!R4UF6MIN`$#no+p0|Fs2bH_6 zum3{JK^6y(^?PQ0x?Tk>PZ${F8Dtpb8RVcC!Gc)*!agx1NPWRfX!+M*54PXI^AFhm zj;jwHPET6^%)oH;zZApS|I!S%{tGb3GW`E9%kbs@!~eVtQVjq9i!yxsFTn8Q|L6bg z4B!5+_yGlKmNV>2=Q{|^ca1kJzzVly&;njIkjLF6I+1BroTAYljcH;4z417QfCfdQQj z;$y=g^&oK&jR-01ER}@6Aj|(7{RC70E7KvmBB9D5JO&0n(9$CYkRKotjej8OLE!=t zfl4#fo`HyefKdN4#6YqP3=g4vNUSq3OoD2>2NgGiC zTTo#Jm^{p%uyA6BDS*;)F#0>hq<;|V|3#?7ena{4P<1Cjg$|PYpwR-iAJ*KigBk>l zhX0_6HK-9_N)b#lFkFVJgK`;Q{)bxoUll3=Ef~Q04kUCRssO|WVKorJz`$?}Dh{Jy z?tx0f;}6CsM8m=jl(IlM8039O-vYz~l_ww>5C-K4NFD%*GJ$g&NHs_u#1xPiNCd(I z*$gu2-+z$U|Nk&qkXewN2~q*l4WdD^5E?{+FvJuP$;1GXg_r`7f#_lahZe+SkWC;t zkjbFb1=0b@%@8+3)I#(@+z&DtRAzw81?d3k29*#X8ln?qCQJuN6~qjXJOqQpASyvD zm@G&KDEC9ekX1t1kZ=UCAuN#ZAbLSMK&}FX5JVKD3WPzTARmE5L9!4GBVo2d%max+ zTm|wcL=2=4BnC1Efb z6c8U0gCNzQ*n{Z+*#lxTF@W@fSP%>fcZd!UAH)OEpt=R*N|3n_StbS+1`rP>3$YCp zE+CUZGN6 zps)p*2ayBCE+{lW@*r1&%!RlHBKq$?$X-zDhsc234AKLmL82fGau>)95DjuYL^sGJ zh$wb4pm+MaRm)`^g_>8mgv`9@*njA&MvT9`1EfE=!G6`pOJ{d4HgVP6#Bt7%6XHi--*f~GD@<+HISj)mK5+Xd*Z^>Q?qH>~RnzV@UtBJuUgEYT5P4D zTFk`|3|7bBo0*$f%;1`roSKuEQd-Oql3J2cS`HoLE_`pqiop3Z7yeaF{5hR)Bhj zAYriD1Erh6<3J9qd%*Mo^}|k%`4c%h&-hu{r&?QaGHAZDw{G}-WqIBeNOib^4IDoU z1bD&phChN}x`0a@Odk+a0Mic^gVt~|F#K3x2IdE8dOM1X{|)DP`_*1vmUr3$(|`7! znHbXk2^eH z>g3237dJC^?nHZGX2&~KGk@F94E&v5z3h+uG~>-$XO*1o6LWL-g^IE}aGw$8Zh!F8 z{_i4|zpZi;?SHBHHZQ7NV}D%yoHW1d2mATC3tu(7`e6SuU-9nNzwhl2F-xgF<56}v z{8b~Se^;u*r}}+Ce}%W%m(<1gS}^_j~Mr+r?hBTK~j;2D{8J!K>%(OYd$@IN0`N|A}>5-_7lLVSmm) zC9^jR(obnWoQ72F`PU3jMbR& zmfhfYYOl0s+N-fII zWAM!^O3X`1WMI%wdfB_=or?XN&=B{lKLj0)YZB88&VWChg}kbgjFx-<`xf>TozTtQ+C4*j6;h>5+r&=J;MhKx3V(>uHj0I3D_ zuah&2G&B{GAteX6a}MfUgK`NdH!?6Bd-v}@%hiAXZLa?NFLUkR|10~r_m2VVk$G~tyJ2uM^JTA2+B*KwBM#NZc z*+LtT-Jo&2`7y7=CA;3+gGN(D4C+DdW?*12asUsnim*WVlO{OKxPR>&Xxx_j@R#Z= zzG8dss(c99e*AAPHxy+|w3z1rc85`cgXP?yMQ-;e+Iv+u>-#M0vJcc% z>N;6$?y$=EoZ$ZE-FD~ICvDpEV1XTETsOsDiaSKW_Z6$XVC++8ef5dSL*~q=x*8cF6N&1`CowmF0-#h)`I_D>L&n6nHTI@r4#&OC zI~@~_+OJu0(1b^RqP@kwZ)YYke6YXt``Gn)kxKTmp}qp8@)zud7A%{#_Ns^j`v)

28|)e)&JJe;F2}I<&}Dvv=loL(=V$0*AF#T&L;` zp?sAh2d1xSSN`N=I>dROV7FBcb#U3+Dzz#o(&1{wOEtp-E)M_RhA(50^K|e6H7n|( z9j@O_(>kK=2^r7MOn2~m|LE_IiKY;KVKLNQGwj3WuU>m&zPLk>=iCOhL)+{fKPI1v zJ+0(0k-y4pwcT`kwP4o8lYZ$s9KNibD*5PyeVMKaWG3(-^8L~hJcLxr2JwAm(|w4ypED@2!rshUX(!9Gd5)lPvk?|^w4KgV zvikkieTNl({cn0V#s1&*pH~;=PH;5ubUfhJX6$(7(<6@w_n+>Y-*w=xs$aAH)CP&3 z)7MfQLF0a6hW{My|C(?=JofwE#`Z7COLpbk%|9S)s6P3!UBts1tIJ;T+Dq-9I#GVw zWqaeSePwkg0vt;xOR#KXWOFRa%e-;0g~yJi^wSoO+Gaa}BEgS2qA%=r_s$LxKA~!_ z_$EK4(&&Z#)#*zO13S$f_moWjk?LURIA2=sb@}XXcH3hX$!~f)(SC2A#gaD+8jkvR zRn(quH*lQr&T!GcBaimI;%{C*&oj|pd9FRUeY@^sq6MhE`&Pv6VCJN-y}GHsx8o%C z*gEa0eZKmys$E+B5$#JE%=UHrK5xHXR%0Kr|IMVkAEX?j8McAj&(BVk^YztUKMno`}5CI%F5^)aW*Et%to)%H#=wHd+pgXNZH_ z=gTq{?%lW8*pc^?o|l@!W$W2#jTt&$({21_v0UkP{b*w}^>26J#aP<}WpSs*@Ef*E zZY^O;nV)GlIX&$Y&&KC=tvuDN&hNzRyZ3))UAp0+{j_;I!2N)zb>cJ@VM;Z< zc+;`zdcZvOKkAOh*|t2G?G@|GR{VCU zv0t}ICh^ETF^7YPXV3NT|G9gI9(Npfez%Rpy>RZ>t50pViC*1W##wGVZ&PPD+n?vQ zceaSFeVr6+SDhzsyM4_MI|;5Ed~R=q?FE-QCZY9YND` z)-yF6t3}p*S11p01Wl7gzkswyjcTkMe+J(+2@bM$h}+CqtA3@-LB{1d&-Y$yhajsb zE3UNLI%v!Y5)Lu5cF17fz!=-N%Rx=xfOx@!{dPM;1(-qg%_6m5HB$t?+ntymaPT2( zqWvkOBOBit6@ctFHa0ealnXOG9n@IZmPDLvf{b&|PJqn+ttfR^DsV!z&!zw}k7rQm z0CI0y8k57Ez|Wzdo)tKVc~7iSoe*T7t<`-rw|rg?J~{_HcXUC3)%bl?nD=ea-K5cHOr-w&>-Xl!6rdACJ1fRVc>V zH(3WPx7k%_e`m+hKX)#q*n5B~P<2U%`$o%8CnbHce_>?Gc~9V}{r>vTkB)?&wl9rV z5}$MMxc!9GgGc0D_u3n+F5e+5wa#8@$pg(NUTf{6If?=f`K-2gF|1@hQ?uOu`Qgnh zl8j63WgNAR_8nVj-*sX`m$}h=dzl!kXEw?G_9rdeHo33pv}e2FzI=aze*{zeNX^t!s7B>U;Bwj4FJOSYeLL}5cwMxuS&I+q2%*c0uyJO>3p0;v7$*uWEOeyTixtSYPMJ;&v3Ta&s)s6ht5eEgs&(8|he%r9z zK2@T;Ib-bt`{M7Gc2RRC+8drNSwHz#ll{jJ^O#QyHrd;$1%?&-guXgH+U*Cc^lmSi8sKcn5}XM+9u%Fy(!2jc7nk3Qiw z_#A7`5@OL5(iLmJ{oS*bd^;oUD_^P^a;%B5-=@Dn{9R0h{Y5$bC5N3O?0@c8)(SBX zw_kT7zRX`P%%02JW!LG}yGMOPYZ3$Xw5=lg@L-rn|inwIWrnC@wR zN6?Qu?u)CvR*1QH{cUIaTE!=O{`WiEyIsorVkqxmKk0P6$NpMd``BO8mlz$jv2U5( zqjh+Pwf*#`uZ{jJx3=#+pYq>^*TR0nomnN(O6K+&?u?5Pj+xl2S)JB#+GuM3xm5Ds zWnL5e*|ID5eeO20pMKMD|C0%J_JZ%Gtw14KX$r~<4jJ12 znzK7r-`CK-EPE!;@z0v}f{#ttzgnYa|1Ns1@bt&3_KY37t3)Mb?fp+JX)|Mxwm*6N z9g`}nn7#0aY!%K!qV`r36IRXKDq?TH`plGT_l4{s^Y#Mv*F}vF-EJ1JkCk}o`nHZ0 z+RkHw+Q(?032yNHx0|rf^YVg>e|D^k)Ki0;f7?~JvVLclgO#(NLG9xPWecN&pni*6 zhPdNX*GC*VQEcG$pTK%$u(-f_Wyg1$Y`rFBSKH5O$-WJ0Cqvr#U+loiS!jyA$NpMb zi}WM*`Jjfw!maj@dB6u?a~K2)A?+##T_~;Z;PAR=vC29TX#3@*z4uL{{uY-7cENKC zmvHe-faqf|anNEk*^5LPOPwmg2>bN5c8~{_H!JFTq-4UX-^>3 zo+x_=-_f4o)|$N+xL1L~kAZ<<14O+-BE+1A7zoWE1EDumKxl>s(D_d%2*1GtLNgdU zG$_w_G`-egf-#$!GN}W5=USt1)2YcBh9UOYLR>-awbpb~zgC1o5 zn?VVho=l;93n(pdV8Qh@?_Qo;1&Kcf2B^5v0e^07=E4~{_6=)3>wO1>6oj31Q zgZ)P1)^pi!nxOUf6KFYc2ePhh>gD~Ae#{el@NjjVmIHVk;w=xPzvg8CX=g>mIz**d z-}m=5b~p;EwtI6Nz~MM4*`evt@fo{|q8;3sE4Wo&7&&OI6u#hcCCec&dsg|Jpd<%y zcR4K2Aq>>f?RRkiucs@lh4dTe7dwDfopJehIY@&fe3Kj|OR$9TmCOX&zxV9~2T(ux z%jD${`xZ1n!X;;$1IRhOKh`*$EZa9x?7UZDaE_U3Rq7`1|DOcz zpRb>`$zj>-BMJt^6C4(~Zu|UKa*soI&hy_d+t)aN+Hrg{&x6Np5`V7-(;FXO2lrc@ zoKJw=d%$87Bpe@2gRF~7Ukh!gKC=h)cjwe>c1T^75OQf}4_IH)mV;pRrpvZEfX18V z-Pq{xV#)X3^;X=iqQ=>S@uR`6KJ@$grTnC!cZj-YiU=I2?! z^BsS>9y@^6uSGB51&ha8{sG(1&|&Kk`{ehFES7zC(to{TO(bT5^9=(7bX2>gR;Zask|Hv8-yXWgOtPeFW$!^H!0aIovIjp z_H`jN-M_LgT3)i@U%r$BgK_V#jE%hz{S5Eyw{FvsT*+|A?y84U+MaU<>=TwGI*AFh zJMd~}%&Gf+9iqRX4Pt*o8zlcM;dg|n6LYcqglTXRVOMmRoyzX!|yYRu@ zf@`byfhB?veGGPx^r*Jb9x^_-2V^b?L$Yzse2BWb1rWMm4uocKaEMU=jja5Is`Yd@ z#cn%0G(I0%?;HU8qoG9)Jg(0$VHQN6LqEiw0W%?dh6DDH^*mi*^$eYR95zb`e3)S@ z>2R-AqV(MA-}a2s%+_<585oKf7#KdN{QG}_nStSh`oI4_m>C!tH2(b;U}0eRp!M%R z=oZAA+W-D*urM$z*ZKF~gN1?Ni_X9Q87vG80=obHcYtVvfB*NeFfas|{QED!%D`~J z>fiqWRtAOw`+xrrure?hIRE<(TFCOi`QLvBHU@?S*MI*z*cccZ-2VMPz{bEJ;Pdal z06POig8#q&0qhJ61tI_bFJNb2XbAcDe+xSULqOQS|6kY{7#t%0{deGCVAv4(?|%sg z14BX7zyC8h7#Kc8|NDP}gMmRI?%#hNP6h^ngn$1HI2jlc68`;n;bdUAknrz+3MT`@ zgM@$oD>xY#79{=qe+0x&`uG11Cj)~*^1uHdI2jl|r2PBO!o|SwA>-eF2`&bP2bur= zn{Y8O1Z4gDAHc=HupsN-f6%N}K=!}?4O|Qi208!!ui;`~NXYs3{{V>2{rCS3NMG*1 z{|wv=3<-Jv{)=!kFg(cn_g@3V&;R$|hMR#Qpy1#C0B!~bfs%j!=YaSn|Nd{_W?(o_ z{_j5n4+BF$#lQa&JPZs8761P0@Gvk;sQvfffro)%L(9MaCqN5F+W-BR;ALQVFzMg_ z3=loz-~S7|3=9)y{`>!imw`cH*1!K8d<+a5X8rqbz{kMAF!$g820jJ`heiMXzu;qF zXjt;^zX3l3!-A#%{ul5wFc>WV_kRzFzw+OI9svf12^;_Y?+{>MP}ubE{|W&Hh6P*x z{r@4rz`(Hc-+u=|28IcH{{5dI$iVPm@4x>?1Q{3tZvFeOA;iESaR1-`3LyrD2@n4L z-yp=m@Zrn9{|v$m3<=-={r3=NU}*UM?|+Oi1H*#v|Na*UGcbJk`S1S$VFrc+tpERW zh%hi1aR2{bAi}^ff%pIa4I&H-4kG{mONcTse31YDUq_UI;ex{d{~@9b3=drX|6c&& z`~3g^L6m`k!TbtE zK%9Z$LHPgw4&n?94F&)I9}s6?DCqqEUqFI^;XvpA{~8hu3=C8L|DPbiz#uU7|NlJ_ z3=9EN|Np-s!N5>3_5c455)2Fu)Bpe1kz`;9nDPIAgd_ulz|8;u8zdPR3}*iSKLsQ{ z^Z)-9lA!qb|Nnp_14F{r|NmK}7#JoT`2Rmdih)7k*#G}KK=i5q|8Gb!Fg!T*|NjRm z28Mvs|NmP^Ly8Cy2*toy6~w?;A;2ij!_EOZ<_RP&!@$5`p#JZ_K1huVJ1AxtR2Uc- zOc)p#BozPs2T$tr3Aph|c=2f|Nc*ex~Y%Ji%+7L z*^N)3hsA|Yqm9*t&!Cyjoo@pp^FwAXuv;9F+~UNYg(>L9&E$Zgl7WE%o@s-1r3gKw;Pm3PV))CNQ;P zI04ikUBbk`FvIrW|1!|x2tPi79wuKti8f{rK80o$FFuDVNUS-6W6hPDX*Dt*>kI! z9vCE(7Z)FgA2(Aa7axZ^H(1{WU(IJ`jlb_oju!w>&||1&{mf#b~)-(-2rOw=&&*{CpID556uG6bE-$85k16|NY+$ zvJ0GVG0K?&W-s()=EKe8f?Du^%4`ib28Ju3b`i*a4?cl%J`S*3LG7$R5&!;MgTxsa zz+xe63=A5P|Nfr>*$WlRU}Io-67}!@M^Ksv)gKHD3^i;F3>V`5{eKS9>%tenbQcoq zpsH~O8w10Vc&LAaLFtDnkdMRVFvzc4*ccdo#Q*ybDxX1GLFz$wnwTW~`wzN5gu#Q) zfGLa%RD?5tt}A@P#=vkQ;opDIF@~VD(8lBfif4B|1ExB7EPFu09@IXpN&E+29}3d1 z!p^`jBk|w=pCHS?>BI-5--XYC=?+}KBSb%_U73^g?|&UgE!6KR>`fGCxJ_nE@o_15+tq|I2agmGXDKHhMEs5Uqm<<7-nSr`(FSuA6(wKfy_s% z^IZ5Wn%TjXj0_{z@&#Oig3?Y32Lr>7?0^4zp>}{MP#Dy3K-#vTrY1~m0tW+wPR_so z`k=B6RG%|2Ff8Fd>ofDWiFU;gjE4=DeG!yRW^z@6^`7jqu= zaDkWOH6ZgU|NXxLD%ip1d4a;&3m%W)wgotxefTD@F^6zr4QEe~cF^LPGn@GQ~bdVi`3!ehhGDN-w z^t z!jY307(ne5kUs+^|NCzaayQO)ju+nnCT3nH%qAGPz5}%nrf@Sbcuf8GUl3G&BGS7j zsC@u#AA0d^U}AcPk!V4|3MwB!=}BYSzyDnz{or&3P6yz08o)P{6~$ z&@=Pj|M$?mjJ-V#jteio3#?3MvAWHTo4JUQ?*?li-vib_z89>4d>>c?K+41UZmdT<6;yYM~(I7fiowS<>}VaM`+|9e2?F*pvu@d-}9XmQ}h_kfX^8GHK^ zTuy-6Q(t%)7=En!_umnkK6*g)VH-2NJ*9@yj&bBp01egfF))a%`S(8q)EEJmE#Pzj zb^|zU!072 zfwZ#`^$ysdi17E~yTHi28@oTj^$w_ydWVmJVZxbz|I0!CbOiM$T_N>$0MiwCz3l;R zd4k%p;HDnP9U}Y;3^&gH`yURfyuf}%gg3&k;B?@{cY&FigO7{P!WrCkLGJT`(>y30 zr0_E^ymUx;|)|_uHk235P0(MKWq;UNbCSV1B1+y zfB!*kOHi@~x&I131B1pB>Xe@#_p1mnFlapc_x~uUq5-F4Pf$8`g{NajP=6Dg^o+PM z-46~2P&u3Tg2(`QZMQJKqLQW>6`Q(!U1hH;_9;1Q{4^{P_2O1+;$-Eu&odU}YX6 z9lC%bjfoAbbKJO@a&gw9pt!3MWMEME|L^}IP`HBnnG6gJpz*FfT>t-r&f{bNr&(uE znswtdU^>Ys;S4UTKxO<6K?a5r?*IQeKm#)1G6CEM^ar`o2VO3N^P?Bv2Nvez%GjL( zN-r!zpz(r zaWH`LT@PqXw($Rd2hffVaJ$C~G%f-jp98mhK#7Ohj0LUXfKdA`A=})&Ku9g2Er1$2>rJ3^WAP3rT0-s(=CHT?J7F2A`V$|4l)03~saL^MUq! zg8X44%D_-i^Z&mPNDhiY2Qh%gjw@>Z|33sWAG<#an0e5h?8FUn+XPVt2A;bA|3QbB zLh^tMXp8~mws#P>Ie|wcK-qo|Xw16qKV*!R8AnOs;^P37hoE%&M3jM{ zqy9fiz41eofniGh|NkIAf}9TW4-aT8yZ--wBanaxpF%1h2Lou_Lq&{%;Y9ua|3^S$ z#%S$Ya61NE{=4&CU}j3hEdC+wNYH-RklFwL>w^*jA`N42KQu5iZ^2%-gCh~t9@!zr zz+kfM|NjbjUE%}J6KHwag>L~P(dO#u28I{w|Nl<~iGlsrBd{B7-5(4uq7mT2Ms5G2XSPCkP85kBAf*SV>3=R7s`~wW2 zPBsI>g2NE;2aZrWA0iJkKp_R94#r2P8=&Sh7(w+z%~xQA>N^4vcW{Ez;6YM^DGgBb zA--n-@0170!uYaK29yHN1%l*3LlYpH0osv+&Bb&agQx`0X)-V{aA-p81y#i$^`LqJ zL`#7P(D)ow9#nsUgg|W-5dHPve{fb>01XaUouUCfm;%(*0jUG6&j8V&CK!l51+fma z%mBm%w~0UuQ4oQIp~f;;=s`3Kud_ndS1~Yv&#P;F4PE!BA$S0?Z*99hWIrG?bl=yL z{owubJCq!Pz>FXJ!ROk|1fO4rVmWAi;JWDZS zxD3esA6A$+eqQh39~Up?u+!pr&yr7v!Rs0=KYevbczQwUwxy`UfzqQrOFmtO>?=y$ z>ag{%wzlsoK?m1)DzVvH_CeN5{$J%V`=t5pJ2O}v@Djc>ZeR`c$?#3r`sKt+~3DH$N0ZJ zct2-v1K3|PW!oIKUu3w)#QD))ZutujJ(~`Qy>3ko6>}CT@BG8>P=C|5GU8o2M4YR` zVS-_~uA=-ad(eK&hk1t};&$~8Hhvc;#?%Qw{dEpvZ*qwPn~;e8u^1tT=RF#4V}p)B z+i6R7#g4m*3< zK8SgUIh604FLl`9GDQ8)cn6ov{12@s-`Tru`}{XVb{j-}LX?Bsly7YDGk(~6zhW_& z$kz#RM@}esJ@J+k*X%*3FUBuj0ddc<2=F@J_sd_|D}wf6ugrpk!{!JF$oUva!(6>tE{mdHTFdjcW;oB7m!MxIb}0Q+@_Icc5_pmn?&G3TNFJqA(F;|^Kx z>?{f{zjBvdgoyjNIrL7?6KZyl0K0$5r^irnR|nAU<);Cn4xsZ;cPB1_i$m6f|FH*c z<9)hjH`E<24v_u5*X<2C*2qM?D~E{Rbaa61KVb#0zZQFc7!q!u9U$wn^%)%Mv-Xq- zckh6xm$Y?I278nT?C)PSS0VA$VB-Mt=Ydm?6Y9b=+%ioPwzHv4zG9j|2GF&Ao+CaVrN|@WS?o_8@)T zPcAr|owHMU&CXm{_W@qcfXdz7vELouy?oVobQ?3YJUI+@e}mZ>2QBGqA!4l$>|x~$ zI2_kxfzv_Uu0Qq#=Q=Kd@-?WuO8b`N0LqPDawHre>2L|HuUJSPymE`380t3&Sd-z!1+8stu6V=svO86I$c(T9}} zYR(R-Y@i(W0ku4tY3l$wrAC6~3p9Ohg~pd9WIsTz1UQ^QQ}!zaY4N6MYX& zKWS2sb?&xI;P$}Y#6{5bBk2IC&jrBsX5!Kn&~SvQ7lG8fe4SwRk8@u^{0&bfP)7PX zhcC;NM30GGv){n{99|#Id_Kit)|93^eN6@jSE0S&`Uv8FbI3l4I0gq$sp1KXcOPT$ z{(^PxJm7r|p!5T=K?R!5`Qh;k5to6w{|7i6VwTQ;x=#X1e}J58@h%+_zcV?(>-iTK z2!j0!NqC) z2X%0P!3!0?40VSUl!mw(M1s{De}?Rfbr%Jn7ySM8U5L7d7za=__aAmXGXnzyBz`%e z?KcsqJE8Tv@o#(BxgVhR(b7+cq4D?z>VD`s&v0{gLifczw1@Z?TEEQP2?@vkfA%nQ z7#J89oShNoxN@J!tlwf6?P2W=kRKYRK6Y5!$+~Y*^e2>Z;125phx)yTn&9V4GcYiK z{X4tgq4eyN*|~Wi?P2vk$Q*_ZNe-ZD`5&{S!`{atvY_%D>|e`72k`L>ZLgvA7c_ny z62RrSbv!TlyaiA^g3Wml>+tLC>jRdHc^#(zpHK%X=fUC((UAI1UC6<@;9Lj19A*dy zhx_%#KkPyKV?g;7tiHj^p%{Gd1(O4${({!;XWSe*9YHOu=a7Af|Dol7v9klHKE6`H z4&KjG_Y_i2G8}M)=0^!|c@Jt|f&F#U#X$hH0qL7K_}mSPyvxw|at80SS^1F8q<-jafTY7^4i2F0Ki`9e!TEIm{L^4@zEF8bvwEg`J8u86cTh&O4<%(b zI$YPk!FyYb8=fD*@iI9BT0XEipp@IspzU~Ypdb@E(E5=HUJgTKwV?IR4{-Vc#Umtt zsYA-WY%vEPP({3S2Gl<);Cz1Wy9hWwLGc9+pP8_Jh6FghgW?M!E(^&Y3_t8`xvnn; zg(t*b1!y>5vIqGG9*+!i(DFe9eC{_WUO?{2xpmb+>c05&RU+K*dJUw{cs6VwDa2F| z2`&egr8+?NRf{@6%D2nla87$>1+Lc*edPoD15{pt-D%q5aP4TWNyB$U`2aGDfx!ft zeh~Q)A}$6^hcDpy5hBh4j@SM}i1GpKPGcQ#`TkYoihaoArL#fh57^$BCn4tooMD2O z4={01J{MW{9DJStsGNa`L;86L_rS!#{!WAR4?*S0teG<>f47^6(H{YYXTwuj$0z)& zpKyo?IKa{ySpSQe4%5zmve_|P7@pq1;tew$mK?g_G~qBCygvf=Z^u*z1vidJ^Gy;{A)ig3_L2`tcdIJ6&;Q0|b)kl)C1^qW1bp8|G&Wr0H}(<}~YIWg4oVMDG% zovcN=OC}4v{SUVHK(@pA@4=6kN;5#shqiAY#5(L)&-}bcg9F|#fS4cea5x3DfsGZl zJ;M|1@L~BeZ}ZNd@bUy4U%{b}{c4Z-!R=E}dmb!4IS5h@RSCe$8L;?g7l&GK#rVq} z)LetNw;f!;?Qj2HK5+d4s`tU_H#0f}_OQ3i><6{lAR~YIZXuI9V9@>s#0=Mr#?R-$UJ-GM4;qL;yAdT)f(DEPJ-f+ux z;Ovr5ei!uz+8%(`gATbE^%^*SpP573dmrsl+jXkYc7hPZy|8|zu@W@>3xV4+pmrMA zoHQv&IrCZ^T%PtcZ-wO3UsD|(I(Uc~IEp~?FSLAS(02e=*H0k*9e97)7p0>04jeDWkL^MG2NxH-1(%1Qd;~QPOeHfiFq~s#U;y2m z*~iGh;K0nl@Rxys0dy~B5(@)^H6sJVK}H4!B~}K8XhsHxGmH!jk*o|1Nl<+$tPBhw zGr)$S5ou{^>`y}vVC2_XGiP$HUzzB5TcuEDX7d|+HUp+@teb+s;r0EqnPYTU<%C)m zUWYWHD7i+ncSd zo07oku0#8y!})J7c)w2+b?BXO^SR+Ye{gw!^5O@F@HhIq)#D``>Tj*^V;2ktw<|BZ zzH?~!$RqVjoyj5ecZp5f0d}zY*X-Xp9N|_9x_pk!Vb`s$zp3JCU~?>Q-gJ02S@iH# zMNWsq^}8CGz665pT_AnaVQyMuS$m0u!=Hf6BRzRFVD&qvUUBG2zi`36P|!hft>KH7 zrX;X`*Q8x^`0z8a<-?2L_DhY9%CH1O_KzRvI^$rne-<;#XCVj2Pv;i$l=6ekcQ||0 zfeCalg`c=X=+Ai*IkzjkN!4h_d zM`zYQW0(rr2ij1%*C8*{ROQ`A5r_Mok@{^l(O`3oYc@E%xOZ6f_+3s&e`s4E*qvvV zuXmWU-0Df11(O4Ff=zSV!z74$(^U@V3YhKec|O`7&yWrEy&wn~LV}n;RSj!4UOVmN{&X z%~*FiLliO&QW6Rd&zT1oI_Po+1fMPwg!(HGVlUeQhmYQW_pJ2zVK3&JuHL+O54b)y zKDof*v82ft|ANQ%E88=U zi3xk}y|o8jt5H+T2~q!Lx#^5nfRDPjLWmSB-sW&%u0tZ~N_RhfdRg_9jt`p&uYKH#mr$g~QFn^Tw}>JLnC039cG zT=Sg$ow-|Y>nZp{#JMIqc)gd7uTJ}8&$z^_u!vt1Vvc;9!0fpvm zw|hTM5`&gYW)N|;d`SBHBjgYgq`sijDhFcz%UlP@cmNZ)f54}h2=P~Pkpt+ox$tOl za66alyfei80@;v$uB@=b3DACNAILubnU(nt|E^TLR5Sc#uK?O8za|@EPI0!wKW9+S z=bt^ezw{~qVva+m12`HFe6hEk9XfyY+7*!e$eiP_stGjU_`p6LG@vLN3Q;eR?eLI$ z^2(-(5)OrHx^HJ35Qmt5IU8~=-aa-5h&dM^;r}z!p{wu7C;1>TNWE?fDTf&f(jBHL z_LUY&f3*i4lb}&|1TtQKAlc#BI@Kr5^Pby-$6>|1A?82MaNu@REoGYZ&b|aRkSUl9 z5f@H%5c_@l-N|NghYzhMLk?;fLBi8B)xqg}+STV-ybf=9_ZiGwB?<|DvkXXk$Mm25 z;z?GFzHK!Se<@@@{1y1t9-P0!Y9Qsno-~JduR$4x2O9p6`p9^3Dy025?}t5T+_y$J z1>&B`DGm+WK}SG*vo`@T_C-O=Z%75V|Icj~bNKkhE3&O78{*E$6bI0FFLOEvB;8uY zK-?LY1a;>Z`;$-Ym)w8m3o)l45!%iYb?Did&G}OTT0R6PLfpwE=LeA4z6$EkTfe;7quv!i~Bwf!hfT-_@ zc1V?c6d`WT0O_{`G(yG0q5k5Bq~D!E5cm8HcDU>da^MGh@VOarQV{XTXa^HPGn>7a z#31KY)CNPuD?=SXr$-+1{tdYoX8(0st~#(o8;J0MyNb$=kFd=%pYx3AykBtYD+777^$>k)^HPjNuc zgPR-#Znt0gApsd*{8J58?++OtUU(EdjywBHEyR5~LC|<)1Gm%T9@Ie8y9GLc-EmM5 z;=i@d5OK9&2hg#ZVv$0Sb2=VMK-?J_1n$?&mlA}GFI*0Vs9)v{IoIUp;Toj1wfCxk`ZB?;=%M5OE)8sQbAg{d4_fh&YcsbR1d`GH&=D(tbX};{pkPFCj?3 zPRbqPeo060_=8+4JER_KfQC<`vx5_8I4N2Ta<2KQ2uL`jIYQ00L* z4?TmVb6@B=Ob!l^`r@ttWSmqY6JpLYduaNEj=P9L^W9As$ayl;`5^9bfaaq#M~8Xu zK^@qe_Tb_7?_Z(u>G zK-2SPM@V|E_-_xkN1_WFFOJZ7;f18nC9RNf_OXV{+gxCP%wuS0LBgTI3X%@q2}1Hy zTscJC!4Wzy^wAzXUjGa_ANb4`G7kTj4^p04K;2_(1({#qP_Tcf3#s;{5LGxnP_n$+~yUHkZm^D*!;_pwtvGpHkUcANR z=ol?weEGYGLrj_yxc>+mSCD*k-QoQt3++W|zwM)TtT_bgKZ5$@&qNM6sA$yn?99Gx z59`N)yQ``Pp!2#vpzUOTus=61+~>e-XWt_r_thTK{)F~Z%GNoA-Yj?hu>Y>T!ESYa z?oxh8I=sHnq5DC-_RWm~4%21Iy+Hj+kiBVA^BkIFKoiUl>>=$Lc8GtSCObS#a^+o? z_|qOd@3akCFYN4a0N2O+L>)T5+`ise3>_Ey(e5w_RGq&4Zx61|gM+~CG?uOdk6T*b zXNUKXz~clmH4f`R&758VXgvtc?>DRA=^WJB0rek2;Wl$+l|!_X-HV%Vgd9?0@3=94 z351xxyVT)mzhSxVLS{%i5Y~^ADRbCr{^L-}Di#O(V|TWK`mk-oF7J5^?~f!q z>|qrWv3FyKv}Z28gR~zOr#lp17y9IQUI5;H28VxGvV+}=n`?f>h&l9urn4^yLgMRZ z8sz*ejZ5~R)0aX0S#WyzkO;{yJ6RkGrFkFd!umT5$qwNAxjNY$z~@00K+o4RNOsuF zQ@EykwvYoWsKE#AUo#}cIb407rTuNXfCEbZ>p=`e{cT=I`_2zmUqkP+JRkt?7l6Yp zC(3W+;o^Y!c?_1bMw2k<`Arb6bESvEo2pA6;@cmHLCh68k5 z$k-Ta4iCgWF>grtoiT-m^IP~j4sg2lF@~g%Q-2}n-pRtuF@V;m9FTbbq6=}Su@a-pEu_N?O!u!L)sNxg5dG&W>`PbSPPPWI>b@ilQY$!?UO5z z_QW>GI2Z$i8l)Z-`fU$t2HigC2DMiM8V*+=;Xlh0Dy|A?Cp{8J?RT6}gVgJ6+>rDx z3hk#bXh8b=S9l=)y;lGUzch77_`d#a4?d6YJhXo?Qybb&V};bKRymM#%b)>mPl`g? zKZ4M9;2CA8ycmQwfQhR>>fN;h5cP=`&~R3Tj^A^@>uYd%YYa2z0c4y(I}4hxVDn%+ zkbH0v)(%mI`a=xTZ`}@SzbQlVk;Vt``J{(Tq2)=M5_FzQ5VD?TjtNx13UvJf55&K{ z4N!L~Ldr2Yen|b5EC|W>mlELq zf{csvL-NIWXQ;jM&~}$7L>$(xJ|hS1Ux-8K5@>t-j2y&$hXf(^v%=c*3J`uPGsNB? z$hb5Eg90?(#USR3r$hZE2UQQvcgoOlp_!6UcfE#;cSu6}QrDMV2qxtkD)Lr0O5ln#7N%kTK@bWJa zCg`{vG#ofOpyPEy(D5iWh<=+!hsVcf?4BmT1+536%jJnf-2)xR+mi;KXTNk$ z0F@jyhm4m5BtqO{YzXN$y0bvaOOqsM zel&%Qj~FsT{0Fc1O`!D=BP73bL)RIeF@W@+cX30~GruOpUknU1X zEiVZ=fL4tuz}r`9&~&>MG7fVO+K)?9gr-kHXugD=H_V_4N%t#6Ant~>2hPCczd+~1 zMB(KCI1w|5LGl5t-I68&l^2DygJA731_?+$7ZC#IhnWwd>FSIaG~A%)NqRv0xoHy6 z`i2W)-k)k{I7qG@Z}ng}UbtWE|;lDbzh24q$ih;Df}& zDL1HlI3V%e&js-xtbN760ST{}(EcNQyoCoEZbA_EL+8b2&SZtgt0<&gx>o=-p9O0F z2S_;<4y#9)pyebhB%I*wD@I8D6bK7HU8p-4q3cS%LF)ZO(D|J+43Kn_CJ3?TNFRhg z!vOUc6C|CB$3fNogT%)fF{r)Jd)OHmApEa*OxFz}*RMH(dX04_6({2RL7 zN)qCp08l@A=FFLvanNz&8PNVLWd1abEf7*(Rm0Z9@)0XV4f~+uaLe4FoyZAQ4@)nQ+=n17q2rChkntqw{On9gQ;7L`LXdHhZP0js zW(;Y^G%`W@2b*B|Q4yN1enQrb`TIb_4OU*9g@m()5j5O*pz$jT$v1+~a*}}ul8#>s zL(*3%bUuQC2f}X^faHS+#5zw%dHfE%4yd3u7~RkWKB!6D#hlI}q$b9$A znJ*#!v=xEqhm9MjJ%i-Kv};iF#Gv8!4ANfw`T=5p0IXm045|(~ZUQe4A3)R<{DicN z9>Us7H=+4X5bFLoh&wAW*E2%mPYhaa2tnwL(E4;HH2tPsgP1R=1_>wQ&yaYHf!25M z^!6B1&Mp>$mZQ*lqM0Y5{^f(34|C^EsQU#W@q5o75>98Zua|tfb$UBF6wDpgm_R`JL!wwvvYfNtcw1H1dyOTll^`P*a`7_I5ZxCn(@+V}RTo5|nF)a@={$l>pKJ?&>AEJ( z0la$WA;-xNn3r)r3F0L{DmerAD>zk%H^8SAiEdFP+@FJkcaGgy3P z6m)&%J9}2}co%dWrYF<^wC(3--7|ae`S9nV{#6Ttl<#q;AnV_)VC7XHv|szz5o|VTH7-WuqbGgPJ#V+<*%*{tW9kIk-6-Jhjku+hzb1x^pkT%h612_G*4r=K22h`Ef=c9T^MBwl(P9JYP_d!^zf4`e)W zO*TZ_#~zZN4zWV&6J=<8EpvkSM-)+yfb$oF162PP`>UX7b$ERN9p|6T3vp*KWSr}x z0jFb@(~=Lb>I6{6y=U$`;PAZ^bo1a;+0dO?JtPyKqNRE{!~Er1D#-VKq&__YaI4Wo4{XX#s}}Of%Btru|vQg ziQ?-*U+huFhdq-WcqXrG3iRZI_XolD?u>Sj1}&fn5QT&vEI&%dK*o{0#Ng!v$W06n zLg4#az~ixBpy}|8H*{W`8#2xY%cq-NAm#5x*!&~3-Fwpu+J5+L4_@C<0G)sT>;i3< zezphSdms+&&oVeb`$v3`_`MB_cRNTtHM2m&0ouP~u!i*eB1O^mRaim#q4RHnS6PC_ z>%ie4X#yR87KfKtVE;0hL(>~GwBHA-M~orbH zuJ{OE57>Gen!nPFq3sPmNO~89t@l=ijC1+I_LsoghbjdC;zbr-E+`y1zERdY^(r@??ce}adGH;S(+3y9g0EPu~Qr&_4rI#NW1Of zCrJMe-d}^QyA+1_{~2UH<>udm4q{6ryO$Y@L(5g@yh(Z^)O<+jf=F;We^TgBwN%Gh zCYuqe9y)GwARL-RD#ZXF)%QIJ5)LsEdKHdlm2X3hQ z#Ubr8*m%gypYZl1czrp%ef0%0j7rF{$Z8K zI(O)LQDfuBko@!dFWg^{a_=!DTxP=7<3h);7#={)7lgzobp7XH`L(2DmTS4n-K}VG&I(RwOI)z@i z%Y4;-&wV}cx>?ZC@K0my9Z&Snjrq~`$9~bpKj3yFD4Z`}PyOl>1M6#+56;>rp}Jf8kDE$7%6w$u3Gi?IY|bHi6d7g3Lef$nN;IXX!tKAOG#U z9;g(-=52)zF+1+zSm(Phgw0`F4#!JSdlIa^i_!6q==HgimA~0?4zP8zAn`kIzB+7>`@Z&?C$Gcz)9Tvrb+9~- z9Ug_Rd8oAgmp#vhe!p1g{Orn8&m5R;G;kEAezS+IrvaQNhhJ=gv#=cS?ROC?!vIwX`-7Vlsab(kGq8U|_yg2Ja*@210Y zy9s-WJ@_2%Iy9DlDuK+W_()%K&<0(QWb)j;D0hWKdoN`E-RIwBhm12SuUO;R93cLJ zln-jv7agou%~E)^@1Z?xT{I{jB}Gm+7{X=TcbI0&nRAZukNpSH zyH&7tqz(or9W?D%etY?Y#o@yNhC}VQA??ftwc`#(Ct_PPPrbLl|FA40BEkz?er!H{ z(BYLG!%E*j!Va+Yt{{7TiVisZx+zXn^kId8i|in74^*W01vh-)G35XmW99X7x3dQktG!vVHl z8kCP37VdFqm|ytN;RL@!r%ILNQRq6-XD(YEVxE;m`s9c>XzYjx1g&2Mg_~sA76`&)~=qv&S6zT zNRT>%pu_LV;EC{cp+A>7OnY;KlF@+pnE6#1)%HFq3cUk zmpichk3QMg`^w%3w6Wda2U0J6UgqGk*t%nGCa**IretM-2I%;9(lUqUJpIg`YnS2c zlR@FhaAmQBlkzloX%K^nJu=SJgraGv}1(-eU5_5p9=Lef}f2PA} zugO6da{t>y(gSqdtYxypp~bz**A9s~Ts*BYEn3VQVt(!n2dC(BOLwgLZf{uQ;?oIR zciJ%7;Uwsq)P7-yr|MVj=6LlbDbt7p2y-0L?~SA7?8 z_?m7Xn#0S4zw-~*{IKVqabWFk*f>1XGzZqe z?~ER61s&LY9$brsjl+vfcTfi{)b>20 zT-Y4>b>}Y$@IEcjx?FI&3h8mUa5e0WezllGT1Rs1omJ3zF|LUYQTlB~i{=VAFiMCV8NyByqA^5s?a5^bzgY-`r1RTK2o#hfB;d!UkA+pWl z+R@x4_TY8Uu=SIF8zJ-8Q^XyVK+CCN>q~dEL-&OAWs?#h6pT7gUC#Jp96JAE)CO6v{6N6rxTe*l(>I~}r2Cp2z~0)z2a%V6o?~Fp z=CCk*^Q+>of{^j#VCeb>o;Juja>cv$C0j**drNdd!at!2(yk5>afsJEEpXfoI)A#c z$-zE6dgJ~#*X(;W-tz8)t)t^_aRBo-usW!KhEXnuLelxqItTE&F;iB^`X<;q$xY3W z@Vp@iS$}E)9k>742wzVHTL%TI?~KnkI;epUHu+@_TDG;u4^ofJOl^d&Yx-ypa%X$* z1W12Kti}O+%)yI`;PI;>zh@eU`%yhG4- zQC^LMH+W-#fP?9K3s-m8y3=d5ko7cb?9lNj=s41+28TP>8;jkhh(gvcfY%4koH=u0 zC3wH~$yC_Bn@UJ}{!`{~Yt65i+@sIz!TGWtI$m8^57`$GE$*NMN|4W>^Y0aPkaZnN z8{q48!TGwN2D%;(x=#nTKGUTdG9Iy<0kRJhwm!tB8ZvJi%?4SA_8yvlElMEcR{_G1 z@wt=?NO+c&Ijk@Rg-|1W{X95dT&Z&K{oEH^vV;S&j-wa0?xMuuf$oF_KR${&psbUB zQVAJ95!h}IzV8mU-gS35blh*Py(?$}eHHW^5yvVA@Ub=QOptLM2Wa^dUFHx6ikRC% z4nd%e9Q#rs?#wH5s0T%F$2EJ%zMd+Gcvz)F6zGD{TIjl5*gBKTWezKsfCfy(AnWBH z=0nn(V=-i0GMV22oZh5kA>~GN3AA4?uNMA z99nBYCGk`6c{75SpyLVB#h}d*Gj@ydLB@f)OCjm-L!pBvc%#N&$o+x($q@HQmO;ve z1wxSZjB`sM;tz`)4qw(zm3(x-URP26%bOLA5O*r)LC5QU+Q))6yo859)LZ5|xEKB8 zfB9X&0km8%=`yq*w>S?n{(M^80dxytENneFXFhb@<41e&I?wnhNO+1BJ4hXfR&Xq2 zaWGqL7w+w_1CpLwiXiLjZU{Ksf51KYWzbZJcuh8BpU(z%2XHYY76);saW3RMgTw3& zTOz;iyd~uhF+Z&UGJds@4>BI`qZ1N72D#93OwhpqbfM_7W{CMY>EM0J-X0u~@$8S# z^)r&$4xsY!bRIWk+}k)05)MD}9bQe{#8bHDll|-Bt)joJ(;((g$aZ*a2J+cSd(d{8 z!yQm@fgI@i+gtYFbTkt>zPcvU0ko_`FOSIqlnqp1>!p*k9A=e+Qm!zhopm%4YHz9o zA85dvLkzNRu>`sfU_!dXJtodB`Nxc?`*g}uA^U*ti9pT?y5s^0H|8{l8FweQw?_T9 zH?!FrG;L8kBpiHFq2u$yka6py&~=ptsSX?WznN#FBLLYic?CKzoRAG^59~e<-XDJ? z3)=3jOoy&Vh3;!>uY|b&WSYYR(6LjCp4o%S=LE$e z#*4O;OF+gcA67!*iy;*f?;N7w^rmSFU6(aE89IOQ)E+#4(hIHMPo_cYYmt}s;QbK- zRSB zIDncD&NA$faj-b(`bOmx2hcX1plN&#ouFwRd+7XQW*Q{lc?(1L-<3hqzgwC^quQai z<=6QgtR|hVcQ^|@r({o}!++2*TLE7n>Gm*o|d1(9AG9EIIWg+NbI8#evstL6J6`TxNf8!wt9!KRq z1Wj*u5+Ub@&1Zn@kDLcx|H+f=0B$c%6N1zWl~8v|#zM;By@K$4bKrJ+WDLapbA=%F z1rKzc-m@qN(6-QLdVG+5hv%U4t=keH?N1v~2hh1?mFzl@aAS*g;M->~Q%eH2-W!^( zloK2pJU|ztU$+OJ>tr4QNw=HhAoFX2%nm1J?4CAZJ#>C8G7>Vr`uc=p+sf+{|Wyj!0ocnzuF<@1jj(u(@uT`*=HmX2~mG0%E7C;S>H#E8Cp-3Lek02 zaOnDE==fU-G@Lg_L&tA#*iW`%^lg!auJ1h%4^3CM?ZNxZww6Hrs}|#6vS^F>k3(C) z>RAe)`^e5jI^2@3Ni+(5W)JQ+{(!Ge%^fQ8U{BsdH*-rLLw8K>O}?O*uBI(!iG2>3ID z-=Xbf$iWp8pzAu^VCuyo?WuJzb0Q%1qUkex&@m`ayZfO2jfK|Bf5H33PO49VglA+Z zWPh5OIAmNpP6`q)n?oV}qAFFFsKYDQ9B6PaGF_kOggIXodQVEe28!Cx5p8 zv>_mS*6b2UxE%sSs!!?`CE>P|Mue9I2#K4ph6X!}{n0lZ)DaTDBMA&-~NKBDjsvaZ;;0%C7Z7-Zj2 z9v@`h=>jbLL!s;Qzd+K%5$L|kH9^pMoUh<>IQ*YN)AQ$WNIh;S2AOyD>4SvN0c~|hV$nj$UK29biRf?3}Vjb5XgK+<6lU6&dPzfe@!5C z-bx6lcSG_{76S3-8FolJwiGg6dL{=J4*Zb(Q3mZt9PowCBlAGw zjTgEvV3{u@Ts$AxgZI<pt~n%rH$(SI-&E94Ic1$Sn$3#d1I(K z&~}-mC}e(&2fALX!5FNy zUeI|)Hpo1oNEyVx#qLmdLC;ydl>#wG(iIYJ?^z)0R5 z=z5YsVMuswMWmCvDxezeIrw~lmCY+5=AUtejPFUjum^{eCv=?Zj6F2H@j=Wlg6=n$ zbc5zQL5M$8svz$9>;&m|SaU$mt9k@Y=Qmv;<%0H4$i9OeP~Eg?9{kuJ zT8{bHL-UmYr2o4LcHWc=WSz=eHpsZLGc+C@oFL`?78XeRR2f#^J3!TQK+4f;kx+L! zK+A{2koEj>(EUfB9ij356;hrofvtOYfV7h}UO>uoWoUcyj4i~zU{Of;s7`={KLd0h z%w{1-K3fj$k2Baq+sQ(ZdQ%VDepu!R$^SARAnQ*8CPLh~*#VlbxgquB1XoCW`8Ytz zA68LFJajFBWPb(&w7tP#56$mP5c3(LpyoTm^A~u3 z-z-Z={z|ifrq4f+`eFfee1-wqUP$AI^wVF$&PB9^w3C;!K+>rkbY1Z?2Wb0896~EX z$6eEGq4`K0QV;Y)^M#~6)ZTCQ8K8qOBGVx0TG9@ZKCPInah&!J-K-%j(k`TTW zv|ZO=4ILj~gzO99se{Nrvx1asQqc1RA3@jUN?JkV{S3I@(fJa(f4sp8T8{BU+SP8* z{q+ov(D3{YKBw)YQ5f8v;P!XfE66$xO=vpYYz--wrwc*Khf~n?`8OS)?Xgdg^@{UD zAnB?Bx=(ZEe@OfJ2DF}?X$3u3?C+zCjuM5)AA{y2 zxcX=I;B!I5q3K7`7Ftj7L(*vyte&-jv{!a;L)Q7!O@pMLGuDuDxlRC5u54(9y5AC7 z4vRv>f5br2xv@25{D@l|?5-7mCPB>cv4YC8LE3{0q4AYw1~A)7giLXzzbiu3>ud>nDo(Mu3MB={&NZV`D~!^ zc7uZ-95&t;ejU;&0bkE-Y;0^C9CyXx)pK80tv`r$zo2n)p6^#2xa-@@voEl~&vOIK zA3dwPjD_I_FIU~|hNNw4O z4vn05cFj&_b%4#kgWdUND&!obS6}T>&TTW8>=3f@CiB_@A5hN?n=swsjBAa0nym=@ z967K#4E>Ptf_O&wzId>>(gX+4bTrrd3-+-2dQf^We&6N53z`VA5P_e&1r~R1ci0$^ zJ*#{U2Yj6~Sp0DlWL$#%E&QA@u()}PgD7aA;)x(sJ#_y4Ya?Wy<_0HZJ^?n5T+`|R zK2Pc&Vt*Xioi)(;w3)B%!P8pu(ES>94UqVoE#d%M?+r?aX?>00^E`R?u|nnr9@IeM zWpV>_oLU^djvbU=W*)48)GJQ};O8fR?R`=QS*Nk!E`0qkSiGbTdLI8X`1)|Lz30ju zPK6v?vE&>dd>$4oeykdDzLp&$$g2@-WF_rTqSf~;IlpC{0-=NW#xaKdK+czdtxNfw53SeOA>;h8^T8|% zAmcT${E&G$*uHzQ9LT)88$Wzr9&GQnY{+?Gy1dYO5V}6(az1pvfCtj=fUS2und<b1g(Ptm2V6a z(jn(@Ef;inJI_W3wC)1z&ay1Xxq?TZ+JmMsK0$!lAiYoIxvDJ zfJCAFg5q#UJ5opl(msLB+rEi}v`=QSz~_a*?pYHB>1VC`Y!5q64;+sP;m~#z2c+Ev zn}3gtfVMwj>!_0<^`;v1{HkYS5Pz6K%bCbv$bJL+t&nlTlhFPTPcWq2a6tf)?_vAR zdqN@ol)n$4?PTaW*v~=G_6&4f@jayeO-l=gq2r+jPFC?F~!}?9o@c?6fX#Yfc8gz zK=zx!)@6P6h4z~s+k?+9gsrP#@Q03bLHB`%LCfLI{?Kte0Z6+Ewk}=GA960qbLe?u zSsJw~dg1jC*)M-QVL29Vht#Iq#?qI=|!N1)aa+fwae9 z=UJtBLE2kqMIhtud1Vm$czhxGEnF1RKJA5;OT}K0eG{hyA>pwS>ds$T=imbRpq+zysQz5rp(FVdu9j^MsExgU_u$3SEcu%o93}{RcAc z0Xx5?!3Wacc=-x44iF5T2kG&EluI)2AmMNdI)7yB4hiRU$hqU!VdJ+99#DIs=XWte z$4{QQLdIvkIUw;o8+wn;0S`z&KS>-iPGuDX@fQQ^9P8zf`AXP2C?5~VI2s!-B;FjL z{elB7&~(TIF(&}pPhoI@%oij=_n~it?!*1;0vTr!V}YdGL<>m1P;-WiQ-9`x*t0Jc zQtul(L*liH0n$&rRRW1$A6IDp{Q@2j(OfwlqQ2M}TK+tT%vH-8QT6Ah2#SXSp3>U<}KVGLdKb4>#vqM zK+~-x#NY7yWb7dB@nwOOXWh{8d1G71xX?~fNV?;Njyp-(IY90WI{_&VjVqw>WeZ8? z*Et~J_ZPNb+Yy?cc_HP1Idt4?rZqHtuG@p}2jYRoqk{t^pL7aB$J?OufDG2q`27m$ z-@)cheC(m&^Aa+S9ROWFBWVvA@5p0-)DM?(Ao2Um5^66uWL$>@T0R@wf%}JIH=jZF zeZbCJ-fRJ>55hPg;R>5?eP#_gpG80zV*d~5Isr*bXunSc(msN%KbdI>%@-_?eq;#r zeugv)=zI+$q~E-(84{iimXPv%#~;YP;V;m3k+B7ITwM$jZ+oHV5pA}F)R((NQRf|u zq3JqJ4API6aDaqEngw(`nacq@@8Acs*Bsife+t>h3}2UG1_>_@=>0PvVdu`l#uFIe zi9*JoVCw;9nnTSKhLmTW&~g4}7La(VcnCkA6WmT#3v6E@?fDy0-XLh^~PFeG0H7DCErV?AiQju#S7 zP0)5%nh|8&_8d2)eH82jk@qoxl(R<;K*uMc>&#~wLE?M*IeW;xXt4CB1I_QOkb1Hm zvR@-DO%GDvG(zX0VB^&cI`DD>Jbq(h3yFuB`VjGd0+9N`2UcF`K+^ZiANJ*-3#NJ@ z`z9C~3?cIfa?tu$q6-o~Y1)wXoarw}{SKR-nyC#fZx7mo?aj%BhL1M1+-8G}gC6vN zifcm4WlqTW6@0yi1~fmiL+Sx{*m+QTka)j)1yT=MK*zVwXhPk?28oCGD5!rmp#I{5 z^cT9I=h>#|LDSU*d(iz_EPAl>Ff}0I`+PUV{jmAXGn$a`@uim`@g)=wiN`al(0YN} z0es%=L|A#K2C26`3q#V|<0hzkRH5ecLGlr7-HWk0#Glt$ApX7uoqtJFfwq@KA@vSy zUh<48Bt11hfw;c_mVPwA<9!-2(Dv;b1E@QdA^Y44oFp_GUP%PH-iAR9+TLJ=lvfVW{AjEMDfeHqL&`ZH=sB)uRG{(2 z1X%|(2YT*t8f?F+FvMN_(DiKa`+r_Q!p9c69`%eOw0-gddhP{uzIG<;{4ohgJ$M0@ zk6`YHx(7Dz%%BP>Z|7cz^vmwHLeqm1)ZafK>lPLpL*q*c>R)KQ>p|D+8mmCs=dC=D z^qT=|mnuWTvx)=a-mTDm=xIujdeoK!BJY#}HD3Xm9vC6%C8ZRauVLrEi9*7Y0lH3O zrZUuCW=OiZ3|;5UpaRWzuORb!Cb0e;%>Dl%{z``IgPS>19#YOe6oS~_0L!O}5cgG0 zf%J2|Ve^#oP z;VuW&#|o8))<0>mb7mew+|vzhCo?EOJ02$xbM*Yps?~p0UAD#dzM7*1vwXP=1f^g`iK#L^y`Jgq2VP9N%tDi`}!8a!V{J+ zK11^F9q2xVnbJ`8&~vk%Lf7xjgoX20NINYNRxijx>|4wQv7ZMv|0oSDAE4*3#>~p3hcMXgiic3L2iG zP<_z(>ohrN{(_b#?Zwb=mVu=20_gpD$6@u00<@g}4~gF;u=x}zs6Oa9irLWhNNG~g z@s@9pcB2V&UGYq5s5_za5vySHeKJt@i9^EA8I~_3A^gQG5ce*Gw)fKHAmJNxA5yP1 zLHETlz|u(z*twLjefRv3eCg^6O~)|vKS1_J--E8dO@r-E{{-15?FkEiNoc$r zft=UW0W%+VPqF|czdVPYdv7cWO+P%4{Cf*Jk2zBs5`X<%ka9&Ax?X6eG&KCbLehDG zJT$*ZLB;Pv(%VGnI(+!~1ENrSp#9UC(D}}^Ymji*3GJ87l!T@S5s3Zvh;tVq=e7w$ z+;0wD|2z}AKi`%OlE0wyl0RQwb=Yh1@oHbvGyAru=eI-maWgQKZ*o}kzj%he{%`pC zIpBKJeU^jv!AAwprVBa1&XET9kJ6_(fUl>}=7Ek6L(BhTGabCa8@)K7`vKJ;@g>*+ z4G&1K1x{Y5fu4K(!X9=`Be-4dR__41#Vmh=gac@~CupBISUj!5VUu3oV#Ys$knwMS zA4okCR{^_NlKpnbStbNC7&x*FXYcC5S`x9Jv zAmix4&~-0sG95O*0&O_pgzg)H&V!d_JAjXW&ixPBrj-NTzwk550W?drNcpurcs)ri zv|N%*fV2yjF~H|Xz~MPL33{Hhu!A0G;WX?%orGA(`PX}d;qye`abukr$hvy-5BA`F zAFy+=c1A$g9Z5j)J#1d@W*9X6JhcbiMzIBUUYQSUed$@qdI^tANV&ih2JKg}L+UpL z==!R*80flaVaU32*m*KPBOSok?5yX3@23NY^D|g~hzrtw{0pu3pZP%g)eD3n^ZDY? zeWQ{A(DIfW+AoBj|8^`8QeR|CK-yz@HIVew;0YOzc+UsPr?B%n4){aITlgX4l(73^ z8hjz;n1vW*-auX%l0G9npzHde%PG4aQHbDu8{HE zZVAZv3T!?_%?)DDOmRrN^$WB=waf{c9w7I*ojKA6Q77pHX%Ej4g^U{%K=;EkxI)KC zpyvqkYeLe0nmv460(`G{6LkF32eCc`+&@ZzuHQ4ZhP1yOq4y_i!`9c?K*qWJ5$E56 z^O2+#G+v%U!a)pnZlMKqoJ1T_E`>wa6Ec`X`m3`)K<){I?RVa628q9%-}bO`v%%?q zvo)j~TmiY~6Mj$D858Jw7)D6^!1hNlz{Hs#=N?UEhJ@Qp0|+e%9p_mIJ7?GcnjZc_ z*WW_dIU5^7%&mmpD+b$NENK84kJjde)MMhXcBwA3KLR}`89ra24Xro1A@xiibbaGY zEy(&gCQ(SgUJ*9VpapHmeu31>u>ELfG$HLsXAVez*(My4&KWeJ@$wbzyl5>*zH0sf z8K235?wd=4ott{o9(>=zeAu~{8qoDNB9QTtXV816&uBu^72-Y=a5-~E4eCw?_`Cx+ zJxj{8B^&%^JJfc1YlA^AW$7MecQq5WuHNPitRk6^40jduY^dF2i(FI1r8cvtNg zxo-OmIyW9-uNtJhF#iaduM~xjGp8Z?BjEFY4zWYh!AvDcyP=gCY7caMEQ1oXJcPC< zVfR?gRDq<2pPwM>l)4e^M#w!l(D9#jqR@CzgwoJ{(>|Db*ttW{_V!oUd7-fO2DDub zyLZf30n(m$2t6+lwl2|F9#S5kc?0Pe+=lfZ6(H^Suh9Eh+F|V+So>BS;w}T&Ix(0y zKg8d#@&7Z*P_URbI z+G9}v9)qs;V1Tvj*dgWiA=vsWC1`t60@6G?JGz- z@EojtE)I=%=)FG&q3es%VCP*vg`Dri=L-oZ2G}{e%n*BF>(9@KLF%2?jF5QXf%S_; zA?+=9=zLihbiL~t5omi)5OUs5H?%yT32Vo{hJ+7nUA-}M-ssR(i2IL0_ubDFhuRB0 zw^k0ikHANLo`rM6tZA?7fubaV!8kryW`!r13!93%h^ni~uxULHlv%gQ4aKK;8KZ zQl87f#tmTc@(q%YSdyUW4cgyumw<%lVq>^CxSke)-Y>ui>mP|ge-~l>KG=EDFCpm@w%>|D2wLv3LDDmPT#g4) zF2q3Zu{MVFXLz9TA_R$-X6X8SV`w{|iUm@>=@mfz4;?2x!vHbQ1A5hTw>UGDHqiJ z(ET;Abs%Rrpy9^?$#>GQ@(q^$py%l=h0T+4K*Bfh3#9)m0qsYe;ehxv<~L+N!++Sg z2M4sA;f18P)v$RK9!ULkNEl+?PUyN{1|Dd<2tvZM2fD8(4LV*E1I@?qeE}TM^a-s; zOknv47LSY&dtmqXo#BAwlf@4p;V(TA8g9_@$6qr;%6n_*`VC{)`HK%A<%}q790nF{ z0+4tJf{oL{+9S~W8eYNnr$EO~zuth%qq)M?X~WVVbi7fj8=8Jtq4h7cT(5_&w={;% zTU>{x-&pARKWS{xaDdK#!N8&VDyK=b{I z7D#$GW{1Y(cgT5ouyaw;*r4%s17iMl*tjAaBptU3LGqW`RH!-JP;(d|`m$l;>MYQD zA69-t*JICQg`|(b7m#{0tqvYO;PcQIL+inuT-0>j56wsB(0y&j+|cyN32~1s?3_uM zy<(7ZCD8(IK6pRa>%Wlp7;IhQ85T%<*7mxWWDB!chL2g(DNJLz}lfR zA?r6__g^RkLFb{~L*|b*LGwkiH?%*+0_|V$L(3ya$oiyq*g7|8JBI%B?jql!On?F(}Se5hkTHJ zXE1EOLm!%c+2P|Y;P7XF-p2*uAdv=;bxNn9>xG`d#IbA<)C8O7;)IkJuh}8; z@O4elbEOacg|y$qq3a~mxS;9z8^pix`#5+Y<=2i+knk~pwa3_@^$xTj0YCqr6`DVw z_nusWwR_nh^`-kuNVq+OuIGfe2cYpO4BcNg6Hy;|fDS^{hn}-B6IS1`LF`!xJr634 z37TJiLFVc5VB`PLc8rKPqVPXvpx5@ zZ{m0OF=>VY=zLC)Hufo|j#tk4o^(;$1+ z;f5|#a;>m9_*_lbV~}$s)SjJl$n3cmc$MXy{h2qPC0vg|+ru4a9DJJ>RWfk@w0Hb; zZXpkJUys_BlMXu+qNlAtEeQ3m4!GPqkapIg60~t*H>-oIr^gcA|IOg~ep%W{hovnE zp?lwm!{=W>C)%jc843hx5ZM;{@DMUwI&cWP75+;^X$#wb2fc)I2}Yw zsy&mXA@>tCeAwvFdM^8o(ACF~^|z0p_ojKThn}y+2%YcnhvXaK<&bkWir?EG18s}? z2i@22yv|`xSBOOP2~KFc9lDOrYO%x0Z!as(I52?E*JS?R1`Z#F?v)OkS{2w;&%Ce) zollv*vKJgaX%({_WM;bmOHkl)C~ipTn->CI7q?(0=<72dMi0dW9A0XB7>ijz*OhIW;lLu}G<8<3po5m|n*YTi&~b^ri4GD8@^g1>VnaQb z^;EyZMzQ%!343@Q@m8i%{S=`1I`e0O!+B7!?G|tlnO5O&a|$!W z{m*(GK&JuDvw^J7cRe;45^gIyAmuH)2>jksP<~;kXmv0u2c0nX+x`#excoxs{=t$K z2k>z_Q-9h+?z>+BZAZ65<|EV?q5FfN=M!FNcKB)dY@KQf6XblLqtJEcHti1L+b=TQ zV-khzLxRmWE$wmu-*X?&?XbD}(}sYj&~?c2P0)5G2fY0WNM~#Cq z_yC6N$ z%Y>|3{dmuQ>E46l&on1N(z#d`WM5Y6SIEAh-eyR?zK{mlU-V7XK>HxXV_piO+@m)K5*`WPMv2=%~Vz(*Z*bwvD z;CT6v25pDEx4#8G_fY_1uX7S)KI@GHBz>kp_f1boad^uM%3*ix!SpKVd_h4HbMBj`R6wMfW5-#fza{e9r{^B@S?PGf|ur#{vOiAUiGX#Wd( z-Uxi%V+d3|biAz>dQM$s5aisOXz0B&^;04FS& zk%KoleZODM3`wW3dnX+{A@kINf{<`K1=}a$4V_PXXMa)Y_RqQkXgg$?2V~u?7&CbM zgZck7Ncx=V4oMfr43PQKX6U$Lj~{e>_z!#Vc|Ot5erS&yWIW;2TgbVNuJa-J)W;99 z?z)Z@((iGH?q4|I3Z2hofw-R$Ixgw}TerXm+26mi1mcd*&XDwWTMV-98#dp~1KWos z0Uo!h@m&a2?*>_~5b@A{MxIdffiCF$yQDXC-@!}BJoP{5diVzDc|NH^kZ_BF?gue; zh0as|gRF~w0bSR0(-}IB@e3^eYvlw;`ciX(rtjB~^A=V^>zxCR&~X?6h`+u=`;Tf) zkaf~!{E+;<0;-8A##BF>m}rzBHlTW@PFn6-RH;)UbnFG(PU^iSVPw>e21J5vlO;o&>FH|G3p<< zpF1yP0wn$4bb`)n2tm>t?7ZJ%M@YK5AqeT0pMa)+9|vgt^3}LVUI0nxJ?xXk zAmJ|u8_#!uj4M8Y-k-}1Tfboq4d;!J^tl`nzo6q#Oyk7B`xK6C-41algFUnyyAHWG z>Mv}4rY&Tj+l51rb9mt6238RBmqFJH!R{&8Yza+of{=Pg9uy86jyOFQb^_N+XvFoC z#*S{!7eLm~T54H$noWC`t2?DhI+uYYGJ zxPJ|5KfLk$bJ{+$pO|M2bptu`D2F*+~s;bAq>!dG~|A(oXX1%F>={%Y?WW^ zFaL^W`T#w5_h$PMhk}^~b^W%ZBw1#fxHFr^K^6Y*08GVbTk|x2|xl!!mW9j}1n=kaN?a z{qD5FRSxOu&5NIeGQ<17;Ck@PN{72=gJp}1zu3e2xgdMb{9Ep@*5}94x_L~Ha_kYb z9oRAta?WQH52SrA4!!5Gb+SYA;wM)v*;pN5{amm+&-OTk&0oFtM*M&K?@tmJUMqn1 z6M5Po=U}W7gp>!p(D_i`7KcF4fuWlu;OA+8-7}{d(he+yoOcT9pMu46>Y(j933&ew z>@T-k$obOcLh$}LIBC47g{)KjEbOpe^+_|RzYG=^sB-9k@=5;Edj@F#0(!1>WhJye z`T{@K9c*t+DWsfS%@6NCg3^Prbt!beJTK(DZs<5k+P@OWc@8>!(E70rQqJrvaR6PP z_4*N;1FWA2b`M7xw0+0~K93hPt^)R#SP^91>K#@{`yAGPoKpZjkMyBE_&x!P7D&Fk zkOMgn*Z&t}eGxx&9<8qsT91oC&LM{N$G@dJd<0z^zJnd!{{{PZPAVk-`a#aqhL0ya zPJ#5(kF%h*^Enft_tr7N+xcK~auOUq%U{ZmZ|4U457eIphui0P$T_8n(0e!3q3ePy zqa6%D3u%`^*A>9_bykK$);r#Z?hAvB11N+;*U#}o+BxR1b><6ijbp#>n8DaNy9}9qvyIz9Uv(WkWVjoDoBP;^%r-Sp6q&KAgXcU3$1BRWe@8bd5^KbTq?86NH4%v@$47x9}H~_jo4zXSooUWevK;ritGh`jzzjR2sWDGlJ zj}@BUMIq@n%^kWQ?Gx(!m$3_Eou>>xq_U7_>u{F=~qojcS$BJg%E zBt5u6+i8rDeS433q3&^k)K7W0AoEc7VCxW^pzRGlNI1u_L)`hy0n$F+zzK=3B-nk8 z&ft38a?2A)`wi9(FLrQ%oJV)rJ^*yk@L%XY@dgLzJc1~=J_oha!0Fk?4l?hxiw$BA ztew;22;HYF0XdhlMGWHp&9>0?9_)VA36OTeOb19iU;?zh4uI}QcxDe-ci1fm?q?M8 zLdO%H*+AR943PHAO4$B)8%VwWo)xmsay~SCB<&#Sb3bAoFU0-!(0&0k#D5W9kaDBJ z3fex0-YX3o=V35|q|eDBkoY_b9XBvGgM@Fvf5<#3Y&_?T33MC-dO!Rl=s4tNQ|P=T zs{^bb0Z!*L&7l4jhvaWqzu*kwKI=a#KVI^Ug6%^zhJ>4dFr?oD>#zA3L(La}w;RFf zYO@){Up)elbp8yM&W)hwOT2;P-#gIu=Vn7_{6O<{2<*IBLufcKL(+R$6(l{M(SxMp z&ye*~pz$BDy~er_`;I~G#|E_zA>ukv|FT2UEo@xE2fE(X3VI&tN@#z7rWPc=enIb# z5QL8ZoY9B2lRrYjAAZlW4zwTo4KhB^UI|Hu##+#RfjDHm2ew~eratt%8ZoH9q4V$z zdXRcrOdQewUfc=>Wl%zKlj8T?e1l;^PV&z{q8>kko*z?bB{J8 z{8I&>_2V?CJM|#@mbX2J?E8~|t+#~E&!71L*+2UkTCb(4J3!jEf9%2c+)6|5F`20X z?Kg2l@?$-8JkVGJYW`oe_9tw;E_5CCLFhSzXQ1orXF}J7!TNDCq32hnLD#qZf}P8u z3SCbw3dyJ6q2s{D8j$(EL}5s|`>zvHUZtr(_3qR&IGoOloz7zTp}c&GAKdj zt*?KE@5h1UBiO!0=su>!G7x=f%8>rEEo?s&bY1-!1?cz*bUoT%Xuso(0<@kIgV+b# zH<6|QogZX|r2Cc7{*kdfG`&55tV1hkf!Zqv(a*pKiC5S-0DRxvMaVb>19aRn4Yqz* z0&1Qv)EpTo{{f^Q=UxF7hpoTmhRAPqgxaSBao-tXhW7xhe=sukfv!VG+ z8mgWF(hr8+?~^749j}AVFB{i^-8DJ)k3$Wgj{AuRpX_1thM;`MQ~1px++pE7JEqMj z_W-iUeS?MvxOE98K;=*IwX+WQbBdFzoCF*o{gh0w`I`?PaX7SZu1ib(1$)@MAxKlh zwj&NR`R2|mUo7eX>mPyJ4=Xn~#GLHwb=dR4-mm_fvTF%sUXS75BnR+4I+5%SM$A(` zzCQ|?mpo%M$$>%k*=g3hd9|g3f%_AC*!&&H z{l>u)95^3dJSM0u0Pm-O)t_mGwC{TbA@d35ka^NHtwu=u&r8e!)T~s6^^f{$Am_?? ze}Uf90X^S-Vim-kv!~$w7qGq3h0uG#1RW;wSDCH;2iw<~;@~Xv`jMH`H~2atu)hov zAou6-{>3PbxN(DuATq(cb!;)gf(uyJ*W zf5V~eLovvB-cjg2yGrQ&6=@$J^;$?QB)#nng4BaN!jSbf&d~9PHL!JauyqlT{_L4I z;n4FR*dgWRG3Y+Qo3L}yuR+$gSU~$tmZ6aLzy~qNz6#hn6Cda~1P#JabD;Ae3t;DL z--E2Lo2~-Qx3F{F??URe5a{^QGT6E0tdM%C7b^bD4cab&wzqnr?Sy4+(DvRh_`Wc3 zx>a+9wqwQM{RMD%^1#l6-2^$07ko?~g!^)6yW$`8zO$LI z^JJjsnEh{qg#Sz{sQOnB|H9@OB~7611aZjuE3o;m23R`;x=*$jTAxZ9Lh3V?Uyya< z=IzjOL>pRO@qyc`p#BKhziAqfcGZ0$Nc{_Iubxqdwo4B{(+RYl!(afNZ+Zl+Pod$Q zrUuc!0lHrS*1s@@ottqAGG1y9oo{7OgSN-SAoUuoUy!B_sUN>{K<3Q~VCq#M?wQ zRDjqk#|WX}`{rbz@dn)&QwY5m;|#1`gY*lk?m)*^XG%irW$3v5A=rLfSbYp#pS}^c zeqIh@pPT@cRtA^D#>V2%@eSxYYxuqu*!~g7`Lr4#(D~~#V$gaGdJcdz?3@kgz2G9y z^)sJf>tKbU^_MWjo`M!=z7vA*HJG3@Y<->(v^_5fNmsD(|1@ZRGe)d)1DAUY&~uJ7 z#31bs*t&%@*g7sDNd2}k2%2sMAnI&IA>kbY3ujokutVA-uyMkV=z8;|kb2YD7$y#F*A~FaM?QEs?2v1H9T?#Sbq{o1c)tY1U9fq{nb7+HY;Qs8 zeFfOQ18!(|2}0`eUlGvogx(82^CV=w6Kp)$m>=5ix(-=?1z(582~7t-A?+O4y@Y83 z5dZgIf{dU4>x6{UOkQYuISg6v4WD;_t!L(h_-7k*pC)`A^;L*_p25m1R!F>x{DbW8 zD1gqVFz`Udg(2>O_jh3Hc%kbS;r(kCsC)P!bTq8p1-&o4;3vdhIoLiI==#(hJdp6p zfvvlPt$%}_SMawKVxBQGB;5o;_mxb9)t8Kr_SS1izF4ttJ2ZS4q4|OVTrWM|gAfOo z_h%sLHDLRHXR<=#j|+N^bbBQv{L+{p{+ENEOCW9raqk%hsJ$P->lpJ}4#UME>(e0X z;Ci}Y;;{AA&~=xv`()4jfy`UX6oBYoIT=Eq`2!iBG8TdO-wk@7-I+g-bki>Y=}*At zJD~GSBGCEV09g9`4R&Aup|6nee+Sz?!T=2)=svsuuyeCv{(|mvfvwM(`4f`C4W z+<)kN?#!Ric06<)=(1*rdyRiX*3*B5=DUv*!SNCqeBR;N)YrMjU&Wx~;W7~a&fMSt zx}K;wTnO4Of~KESa~)JCy+{?|7KV;{L)$0Mra{_=%f+GNvCw{^#w3U8G|z@vRbmc) z&~_=f9$YoS!4`B8@?9PW$bH$+{`;F;2hj1S@{jo(m^r)TVe7sa7UVjZfG$oG5{I`l z!S&AO6v((|xd>!j8M?0Q3}_uU=-$1bLJlb7-fxni=CeA?4xPUmHqL+Mj2~oP`-hMN zxc>?}A8fNfbiU~c>w;}XU$(0LhANPir*zCzN)!3jJ-DGq5z{DYon80ichj}nK> z!@|y|Vz7ap8^r-RUkx^H%m6*#Z0>u=I9mxnIKE~|8bR~H2YWu^HLh31QAhLCZ( zUM@&I9|Ao;*4O}2-|Ium0oc6%OnpebUkS&4jM& z{rUm2uGkqmzdRGVAEsXjQtpPp&Hy4r7Y&{_TM`L5?{Y)az zeNV9YcVp-|aSx&Q5cNXWIWRCl-6aSqN8#f(F!R4c){}=o(_0!7Bp%OjLHuYvf-itT$C#0RBApxoP z%%S%lp7{cakACPr&3mx*|6d^Oco7juy9VCw{RSEDc*p=5CozYP#~Oczq)RU7`h56) zhYyhc$#v+tdA3lhKZ{V6XY?zj$Zulf7H&DV_SKlD`t8vpS2(o1MP z3#CJ#>n_rsLBkE&euIxQKZCjxI*wfc8;^Zy4_@Ez&J4+y3D9$2)1KLb(@h#QUdmwU z^8qyc*&z8#3c7BD0lH6*OA?a)d!g%E86H5xg&Pv@@czOB@HzvzR%m<`%$rbu zLHAX+L&pJT-h|8p*+R?1|FH7mCN$oEL*(J@+nZ4HKST0MA#|SN`%H%zTlKy9fA}Hy zOGDSI&lD_h09|*^`+yyCk7X}({;o3@vhLIZrd|gUFKdz@_ou&Qh1c(p@QQX&0AIZQ z16sd8>+yyd=sn}ma)yC{0X$A383J@eogm|==RTvZ)8=u3)FW{Wkp8ta zY<&)FT?z-J9xj01k8G?5?f<@l+;a`z@2LcBxAQ{MXSgZEUuVQ1Wq_2s@OqOIYCg1|1e^CahK@^WutCxZtX@uI zgOraV(DQQ5!=UbDfuvVhIKt}LGc1sD;p+`Zd*f&%B)_KpgO*p&{qZ5t@t>KDkbaRZ zbesV;AARNzw4Dh(j{;slLiZglhPo>Rwx972q@VMe5z@bbtrIqeo`ZJg2c*3UA6J3q z+nLb)j<9j3nJ=O4gzoEyt-CgU40R85pSm=3KGgUzR6P@<{Dz+!^B7{E9CRO52tqyN z+ze(&J#Y-xzI_aBpI?TQAMo*t$B=p}2HG!y*K0T7{ss3B;O*y|kbc)0==$1Kh;jhD z-zM-2q#l6RYta3=Gok4s1d-n%=R!mGF|UM<%gwwA^%plJ{tIB^eV3u-ssJSZ;q}60 zX!!%(kJSqchs)4<=NrVou=z6M%g}NIy0768Y#s+D4m}^^7;GHuBs6?@A@2DIy=Th! zGNe7U7}~#tt*4rK5-QFENq4-Hp#6)>(DD{mug!wCCr(1r@mCf|I);x^U53^d(EY6N z_RLABzo6qbvuD7~fz%_=^KG)Ayd7>1q?~&O5kCs+ zzeC3bNc7hbQOgtSW-VB>Poa(m`UNV?JBfUI}8 z0-JZ(2`Tq&q3x*x=y>MLozU>%hPNLe?tq04w0{Y&2X{isuXPg8d;!@Xl=dvnAppEl zg9$SJ3ac+99U=46zKl?D=zKwgHMGC*+5W@wW8UV_{Ys#5u-4b0iz`1v`~feYq3hvx zoP&lBtRD*7k0t>L$Ca>l9S5Yneh4})@(6Z*6s-J&?#Dj{3x8-kj6o7=4s@LS3^X0c zi9*sJyk2+%Z4W@t$+T#J=$rWx-hPk=c?78(gPf1?3{pNlf{nL)fT}+SX)nOmr7(Pe z=3hiT2pMNXvmHcXn6u{_rd#vuzV^4=|92xr!!AN%TH*%3Gct0gqDZU zeh|F>vJ+Zv+=to=?msr@wgxyd7R_W`aEZqOw%!kv-yVhWI+kBup|k!X8_K@9c^ke! z${k1`f=N(1zo~rB;c>^-A0iL9;p_T9;nuw3fkW6f{>sy#kD%-NAnP7^j-PRO+7RnI z?-K)j{~E}g$hgA}b@`X)|J4vjUB4H&+d&d^Vf#lR)OOVIO%Br(`$`LUi=ynaOWU%^ z;au-aPVYOgaS!NvzYD7zHr~0E<#C4l(183 z6LUb>ALr2rX}4Vzfv-0M_Xi7lA?s8lzS&nD*R+}hYbVIGLDmiA@ImLNp!>+28X@Bj zZ6fgXdtiHiS3vep-RFXjhk(Lo=D}j(;>T|5ohK1KJM4$P3>`29BH)g^>BG zZejTPG_d)LiyhiQ`%jMCh0MFb`W-#Fko&D<7~$&`!Tx%aSpydkvTr{)Bm|M~?vuX`DEA8U^z#6KCoA?v{kVd@>B<5bY~a2rn<0j4Uig0##c?fdPnI&BgCJoyi znjYP@zi#s00=Dls?N}jXpWd^dsPpp9MGhUwv3J~@MWOvlXuW1w=)itXGVqo(KV<(I zY(ez~XP>9s1ZlhStI#RMH7@|CiKXNIQ`mHcsdWX)o@8_3xnT4I~{P>rjIowe@=tc`|xt$j2UFUyF~!fPlv4smb8ZKcQ_&lAJ>JHZ${8{q0n*W zN6>Y@&rBfw%>HkXd)`B!`;yM+Le{6%e1)tF{Rb^iX6ixWaq4IIdH_iH=t9el50G{= ze4J1dTFx**`s48Szb0gzVxKT%ohH0rsRbQRV0O6dnwYeLh{C5XRZ>s^gu=WzUi^he<1w21Xx;P&YY==zy71!(*V zLE23}py`uA30j`t1((~Pd2on3Vdrl{>x-4Jb-c1r_lQHnXCv%fL@CJlwLA2DZ1{Yi zG(=tC56E~`6l9%tgX$HB_8#|@E$R>KA@exU^>zGf9bUajDVXwyA3h%hPH#CgA@>jN zl7P=2f%7Q`Y@HXx)gTfq&e!G;YM`}JIDiAbjtC^jaG?xxZgQ#!w48zU2TLI5>Bx%0 z=a0bYFf$vnFLePQ>by@*q66r7ktl2 zC;uV$3m=1}+dxRVpAM}@VEvlUp3r(6wr&Ty-lo9=ntlY~^FHA8yx9e^e#Vs((k_7a z3v3|mbvYr_a*4qLI^XmW>V9ZDq`?HTo+e!oGR_8H$6^fOTSNOzz0h%8A0y~`_1EzG zQ^4V$rtfgI0(2vlAf)_&tsgsM0Ldpiq2p)p@gi-Ay1(p@^7SZeeW^NRe#aboKL~u@ z0k*yodTyKtZ2VRVT0UHY^fTc79Z9J8CrCPnt*4p^Th{@dCl7)4f77HO?Ic_1IeYN= zBj~*8b?CS;d>#RMzW+n0IgeoD;R4X{ZVqTZgNgG%`k%&#bwS{GG={B1;Df|l8EoDV zCJr6PhL68N*X8#^-Sr>3Za)on?u{^{9=HQ52iTzP96^Y?;OjNAS{pZJ^ z=U|-q11Xnnq2rbTuyr`F`4s4S87}BKQI}dE^Ul}*L;E|>^5k$c2$#bIC-^Q-j?jX#~AT{y*9{wkjmQ)QUpe%g}v- z#)$RI>)an!iCDna@ybBUAL#jZ$DrqgFhKW@8Vf_me_-RH(EB{9ra;E+;Pac%^x7{5 z35QZ>xxpX=8J}wX44KDR32EOlz}FE$&&7m~hd|Hyx(;1O1kdlV@th}+@jvMPyO}eg z=OiBDh2&#c`-cItE@W{5blsymw0)cQ4N~85{f6Xs__*$8Xu5*+n_%;^(0M@y=)4|$ zoctwZeCH6f9RllTr9FeRtBfB*#_d)?`xj}?AmdybXCUKR@bSr)&~anv_%Q5z`!ld{ zC+PW7NaMo~t3Wk4v^@r&Cw%}NUxJ>G3NH^IK>R5p1es@mjjKzBK+5yyAMGLQ6QJ|F zo9&_d$T*~&%!ucM={l}p7GQ$H%d;0oi zNP7&Po?+wg;*fm45;kvp8Io=oSRmyy()b%_)-$GG6q+Al^ED?S?tTaz-+<>w*!Ui_ zUVx9Y!N%X9=i$TedxDJ*|A)j2JbmtjhRU-rNZdw>yyh)C*mA zJyRZ%Kl|ArU3Y#~9j!(kxCD{p0KhSe3z~$sK>D$$3FwOyEU|=v&wCQwQH~CIXlrl5?9I&*s zv}gR&Z5-VqQy!>(6mj@w>;XRS3*`QYNHfRVK3e-X#{7crUxw7{t9HTj~1h&$+dsyzFiP=*kK?e3F;Sv!tM2}Uk=}GU#$<1;DVY1 zx##Y~jSmi&R!u9Ja#-BKP8o7;7|8sU=ifT46t9^zS^S+n>|8I9`3jGoJM`$~^Id=S z!ya~i7fAij)ejtay92M^`hCLwS;W0i(0N=Sf8{K>@8EV`w?y@ksDt4D4NGC?U#S&c zak$}G8+mKxUHd1Ck4l2Z*+BX3SmYIlCpVu)%ZL52SDc#U4qC?rGG~p`6$f+6noFG_ zq7ENAxUTv__cc2_JnQf)K~j2GC5J;%?g|OexnUr8I=ngUAhclFw6#}R9IEds8NklV zT9$L%VWG&{JKS%?9k$n}E(P^xLH4Ry9dlS{pm8~4({KBq0wKMi{ly@Ad9+SCO!$&1 z`Zw_x)L+nZO+EHO&H>91hwqyPt5-VgutN6VtTh)!pyR-kA?*yOoelwqd~WaGbj*I% zYm-YtuzC5ST@IQ`hqdl;aGzXl!8Y}mcUp-d`s$WA;-?aT@&r4h~8I@`BM z34MQIzk5e7+lQmj@zTUq4#ykbe0|r?3m>Ni#qZ3nWe(XNH5rZ>f3x2)Nmd$k-W1q; zhvg0%o-rJh*((O$2MtPZ#@kmp>^y#{UGD_s93;^BPN48P!@1f)@u~V%ySabu`^ z!q4NHxXK~1lYNTs&WBKO=z7uViycbdKb-W~kH=yDiOEYq`;NixQCRFyp~3Z~bB_dg zd=h?6)R{#Nmk<83Z{Nx8plio^paNE3H!X80%VBv``u7;LzX@%h{8`|TBKNbo@p+#; z%i04ILSg$Q7tMFL*1d2}hPeo2oCmgF-f*_V0;7Mm$Br_=&szh#M|7^k>j|?Tvh5Lf zxTP?;2VSl=&UFx-m?)Z`GSA)sbnH|qbUmK-Oo!WdX3X1gI@@2^xBuhR6N8=K^?jm)_XdkOKfj7Oz|PA8$M39(4y9#A7GC!R z9W-1HC|-fx_wjAAL%-yTp8EUj(0mGQFWs5s!2j;ttz7XJ_P3bV9uRqG-RqUoX7&=vKDLf+N06BkeE+jwdOoW^}C;Ar}{?PGllYR%#DQwSqSRvz-643V2 z`98?_rU(=K94D}QlzSaOyM_)#^Frn)1EBYM9BF~{x4j=j&e?#iTbtM7u+{v>p_ElZ zkaGZ1GQj2hOy6b)@HvXrV&L^M^##!JmdVWy;N#qmh&$Zw`kPuV4ZRmzxemH+^{@S^ zra;fRU!eD$Ro6Mxf--z08&n>;jxeznx?kp%J!D=3x=z@p#^J!5c{Vyz#31g4o!jHl z=-`r>|Dn~B8-9Ki*uR?_9H#%DQ1{#Fi@i4J04CTuQJuAr{j@Uw>|e2%2yT;x&Ub`W zLi^Fbz~hAQ^SCq{9P~j6|EQotVD_wX(78R}^y56jTkoBq=&~dXlbq*T*+*_AfiaWs0-2$hF9aYeC71lz|Pk^mkvnhq{L;q%PdF^Pf z32a={v(zEa1Tt^V1n#ph4s5_3L*1r zbM8U*7Yjn~n-I={_TwJfA5K}7Fy+H+$hxC1MG$jU-q?f2=|ShifXfZXB8Muo)pp^x zB^(4mjA&@T+Zon=zhNH(Iw0>HwB8IUgxq)L1{p`%3_B+$CeL9?du!C?8d321eivZ- zQa5Khw4Dq&xMImW`x!o>Jzk7O;QG$^bEd=B+t(Y5+e95owu=5kJ9EvNXs#?InVc z^C4m9P3h!8&X;5SWDlP2b+3T9XK{vuHz?to@jJlocLV2_$+?hmW4^ccpm|G)dg%K9 znpB5lxu66m=5Tq>V-eZa(Dey6sSY#lPHu0##pYo8-on-W6l@<#7NlK$9@6h~J+>H9 zjy0r0=NXwC6fWh*v#)^qYg>u~AL!UW308+EBC;o+eutWWC&z&+Ln)`?mnbB^!q1CH zbC`OCGearohP@Q%AeR@=af}b?4jcEsnP;mPm%q zq&a|(HO*lHmlOZmq5DK+5+L*Vxh#HpMH|Rqz~H<@+J{{j;G_t z_x7-R2EpZ_PPD`G9*wuW`=H}$U!mdIoB-Vq$mY-`pZqSW9Xg)O6XO6X#U35M06k}Q z0VMzW#6#w{l!PJaZ8>xtOfm{`-=8?ILn+fN4r$nVeK(^V)=x?8NRH)&oHH{68V+jF z4)f2hI)C*V8)W|kZ2e?T1a$sI1aiK@lqHaSxi74>I>TWZdrube-Ez=sA}&q35$~bAcm z!kwdYA>wKg4#&OCI~@~*A?YFqdM??4K*&0iWA7pEhn*vFIUF)xEXM+!uY-=SD+EE> z1MNbPd4r945c8LXK=+OQum{gGm_W}%&mNOhwWPofUaBK4mlT59y$*DED(|( zCU-#2saOGRA1(-h&X;|J-yaQbw;b??jcC>pyx?S zI{XNJy!7@AIhgc=-WspD_4B>eDBp(C~-eznK;U z%`dzVbC{v~@r#2X^<6&?^!$(SknulDn7^1I;jp~`Qa%`aL+3YnA?NFKL(PBY0Sz~P zh`nMNkoY~|0X~=K<0Vc=eBOfYJ3inJ%`g0ra{DE8o#AE=NPRg+7_yI9A384(=?|Gt zp9P(dy9sUo7`sEvJ-`6T?-OC=r#m#AL+=@wt^!HVYTl4@^VB}t=YtMhS_{3mG13>( zZuzBR7try1-sKSgGPpy-AG&`ZdJpf+NOwqiFq0WF zAN~YdzZAPc&iBds13#w)oIV}gpzV3+I>`=b_G-YZxN z@o$-Yg(0vyCnvit$*$Wa5 zub}%iVE1G4ctX`f_vNud(@%pNq<+a2g_NVQuytH6;Byt#HVQ+^r5~-3 z7`R^Wh3#wZae?MLW{5kt=0fAe1seX)b4qie?K(+EXt+JMciZ;)@09}RdFBj`kaX@K z3OT3hICS5KgA-)^7SnJ0dGD7W^AWPW!!H)I~t7+RjEIYQGpBcy&St%LZt z!2xq(p%8^H#_KlGzVu$`0f{k(84JYa~PbU z>+bj<>r&wNfY?L!ht3d&_=^R)PD9NB8vZ*nU6F! zo=y|i}MIh^;nxNxL4UW+Imm89Q1)<{@Jr2%kn({OnjW&#py6x{O}8)Y&wmeoyi~jq>K8%%bE`&X#9?5~0 zpUVp&?o6|UsuzWvfAbW&F4V^ox_(I*Tpllbxf~KcGi@Q|d=@{XKEDP_=QiMW&+H?t zkoG(5T(4(V(0NrhNcoy*0r8iQ4a7Zfgdp{>3-rDrA4_OE1bS~5V=C00R?u|y6EaS? z7kYo3q&0NirWj-$Pz=l*Yv{e|Jdkp(6WaeZwuGdcx<8QluM^OA{!B|~e)$Pb4^K6r z<0LaJq4B~1N$=v|@+w$xTDYU-p@^x*T^FG9R*-g!+iN+;iEgZZ+YUa1-cth^fA+X0 z;&^WL)RYQ+arpXt(6~o56T72wm&(;k=J)Jj^H!kt!m?JR6GS&98^?odDg~>z}M}A+R17)mmTT? zoBlbS{{+7W2PFP1^^(J)w=;HW@BRrr7YllCj^0U!5BK+2d^{@dfIQ#iBX!!rdNu2} z86Gd}Ve?HO_iPr~>hR*;Vb$YvzrfGS0`=2m?K@SfBti3=pzu%Qndl(0IgaP4%Vzkz1~?op_d>=GXNx$XoPTT3=K#Kr zWZOOX`d+X(eccY%!az58{DY2fK=(-nb~}KV1LuFU2Mymrsj> zCiudQ-}bQkU%=tKvk5XjnZg2@SAwlq$*TwNE6C<#gr9E)4*v_44ve6KE#ieB?IPH^ zS;sQSIA#tLq+B`%-N)Ti>R<<&Naz)JfQ@g1&Dl@^DMy4J+OvZOjvw_x+7CZU95(Y5 zuIax06Mo+c*!^qD9I~~)O}~3t2tE!EcE4l^c$_XL?7e-*7tjDKTbd8G~ngc!OHY{U<-wy(I&x8U8&^CyNnauEeG$8R?;Bf5D)|Q$8amcvq zCTPF@OfjVYzJ|vEG|UQ`UjVx^rN|)#G+@@w1_@7b==qX!@*w9(Z~tJw{Dp@eXg&q3 z{tfIt7aqtsE$sf^h5|@Gcj6cOc+JxSp!-L_?m3nR86W0&3t7ht8!tVa4H;Kz7lF@@ zfc=$_;jnm;6{D|<5F~vSK-aO~OaqTopUz{2rXT3NKbzAWD&{Ow-nmB@>R;%2O4m{y z9v`2vd)fqU$T`7^&~qa4DwzIUaKFjz0^yUjn+%0%C8x z!;KGLydv44`v_s@O$kRjfJP^mzu*D4J3!;o;B;~(5?Y?zfZuZjHs?VU#2hz4_*gncYNPAu24J6%`LDx;O1wrSbpzGOS`+wp0d_J+y z+EX$aG*1Ec*USLOI>icB$hmQ_b3C5;L)wunf57*a8oG@ayv|T6)(I)|Ehoq$iK-+t3 zz~d*N@qDoQWgZZBZxDclQ$QlLo#qK?ZwpI8`W>I4<2f_EA??FNAxOI$b`H{KcW{4F z>?ZWwzv(KFc4MSFq+gxH2w5N63|+4!i8$XIcAhOH96X@yKIr`>uz49C7x4H<+%6ID zI4x+N7vg?rXgEKD+*1P^-)?Y(w7>U4@23!i&ReCqLf4D3L&jY`OoZfj2PbH}KY^@| zgPoK1%o$R?=w5=1Pv#^*!sm=VWIp?l2&8>02s*+k?h~LF1EPf2FxX`{Uf;aZ5)L*tnT3q?}3>fw;c_dS95aEjV1hUlxYc z1F-o}Nn7YTMpj6_*#o+dJ`#FANVS9mYEGH9uBeB8j_EGh(O{E zb`MU26}a57zW*N5uYsQfW(nz^{$_)Wufy)$cxD0ZZ+?XATl^IPaSwwfWc}h-3Fvqu zY+TC%GS2e)C8Xa9nNrhoqsVlhsLi6B;S33-3xC4 z%@-Vy{zMmaJcPjvqRvGEQXas@)fvpd{Vp{_en|eF3+X`|29E=N+zP1HI!l%I$vMx4;4>AtC54vwr(hM^H z@&bDPj~%QWFoBO7fR4*r{tmj%Jk1o^Z-vz(uzr~-B;7u}0U4i!k4Kq+>*@E)nIYpa zuyb!DtswnODM3hlLC*&^-fRMi_i7PHKW{B;+z)#GIgc1*ys8*FzMWn)na<3a`J{O$+8;l_3?c^2q;C)gXVdG$i4wB#tbNHbB(0Zu(2GH;n zfTW)luykSyjduY^I824k6EPS-#w$86LfZLOuyHK|sJ-7HUk zK+*|=K4f0f`!l4R)SM4VS7~~X^n8R5%m?l3gp^|j(DI)HGOiCBA3mcG;mcixth?@k z&Woj)K>d3ba&OTJ=(v*)^uBEG-{AAoLGvu&c8HGw)Lvo8_)R!;UO>_aGJkYj4AQ^% z_W`>rElnFT{^jo9OHqE-^4=a3(~Y9`TC+5q#k5O?3*)<1C6wQ zg{-$_hmJ!sXhPisJqO@EbbNTGCM3Ns{0Z3y1RD=$(1O&9ckkH4#yP?1fk6Wj&Zos8 z^Lp@ejntv;WP`+yKFpoEkow3;3_iaDX`g6<(;uJiFYx%rQrLLf8FgqlGegS%Uf8)M zT9EwDCJvrg0*yyO+@lN4?{^^ccS+Fk&zb6w@l2UN_Qe?!-_{7HKW+Wl`|058Ab63;QpB zuT;DYgU(Z&ft{trUofb z9ht%9tNfMO(EP3n@&8QdIqkb(<(?9xyozCm(Ep+R3kKMI0UsgbX%R6{{jhWRxghR_ zt$&-T2F-W>>_O8b74UI6MQC};2&tbZLe_yB8!JNH^&hfseJgZ6Jxv9&o`7pR#9sI~ zo;qZFehV*jz6?6PZLA0>2i*Tc#!1&e$2rd^K-@eXr8^xil4xG3yi18zusH$msA85E%Ihn&lLh6Q$yIc(p72xOc!54uj{j3T%l z7Sj(se=ir7Uts4yi$mQ1AF?l%fdO_7BqJoeVDp>CuzL-l`%aRULfi%4SNjeUU%z1I zcq>5VuR-dO4A{7|0yN!1!}%U~+|}6FSQ?rhpy#%&6NRL&Gm4P>(+WL5Q#=l;P97Rx zLXh@dKg@h7h`Skhp!E+d9ZN#_S0VdWc$Y)dvoutk8^YfSt>0(LLgO8_uM2vQ1X4VL ziqtDk|M|9XZGV$MNWxhDxp_g@(x{!oODKQO@dSBiqu3*uZ~NvOZ?fYUSR++A?L z-dGaa?|`0%oChnfq@dya3(_B139D!2AnusC6DH`_yPD_)5 zjIS+*p3BRx2@c0utE3zq@39HYR27Dw&j2c)b^1R-#z`1ipySezdFPuxFC6-d3}!Pt z7KWcc15!Un>Z!v{@fo6BU-;nXHh|j?pYJ%F*>1PS{FXR;9|yQz)7{|kV*Z09*IWUV z^I@J9Y;s`jK0Gu2EaJQZkojk3t#$bH-dIoO1PA=w25`NmvD_g$^^pG8&tL6P?s53B z*r8Ou;fmThHu(8AVD*j*9cpxHUo=TcLibri&#Mt%=)kUeX3O7fariz3usbKubLf1v zwsGwyVfelSu(<9baQK1Egc4x?-s^#^XT2@z02%Lvo=3#r20aIc9kPD!UpOQk2sA?0 zc{B^a$FafwjVXtYLyAMzQNz~x_mx5VpXOXp^IIV1xRgQK0Uez1eF|WAW>!Gf4ZjhD zv^Qbv?SE83?wj5w0v*?ap1T-X;sCk^+((TGx_=zHk078DvL11x0P49n6EdOeu(#QR zkFkJ_+uzBAxL*u*Zw~an_<%I%x@7_Q_$@g7H>W|yORtHBv;$>@!Rs7B`$xd;KNbsFM`$hv zNf)sD6e`1^?Rh~+dk40EK_?oru2e@9J`M~vXIU_$9C#)MiT`j@Ncu|%fwYhFMIiMi z?EYoR2#EQd(DJ|>x}M4hdLE9E0A!xJgddWAd;%cmn)5;0O|bK1*a9HoW-ktzCxz|D zbnu7tyDFgL39xfw8+@ScRZhsb6ny;C2NFK9(EZx5bAyY$p#519NWT!ae%r?r62AIu zka^33UWhx-xIpWDVd#7=WPgxxu^Y5Je*`%f`W|#1d9w>-yz3z^q`e2b_b|;1(l5^7 zhl~@z&wp@+)Hknr!R0yVJ}hv4JOjPQ?I84g%VW^>|H~X9`PZ2pG9C$AhkwQaT<$L} z;Dfa5VB`EfE|BrP03q=DEYQ9WaQvp(LB|=O=M%%mKhx~t;pUel5CIw=2B&9ZJE;2w zA>j;LXSmrJnm(cHA7JNcY=({V`~gX(bJz>7NTeE(dX^A;h1bxgD0xKB52`2L^|mqyfbJ`+h_E`%7W- z+NO|kp6@*HaT{=aZ8n6cw-W@9^T5aL8MGneeQT~j#?=d;>;H{4!R`C`Qk;-+q)kE4 zaMpnKLzy7sYOwtX#<2c74=%NBKWto=K^q+I8;YR!$hX7dT?LYlE{H(J!F-_OT{Bgn?N2Ue!Y21)@+4dRGcCRcno*5wF4!>^#*585NPx4_l-26gF zhXayN3t;DONI~5%2=TWGbbSs3%stTl9cOLu` zeP1E_yy55Vz}mfhkbcSJVyJrPI;5EoA^ivqBZ&XbNI+>ehOGNW8WRLgF93o(j5;x*xjk@jvYR4d{6sX@ZdOhpp>QgO2;iu|oU{ z+mB-m-LKBY3w9@{Jr8O2i9zj$-Z$9`JD&u4ABM3ASRT~Qhp7k8lZkwSj90_&LllO_ zC-hzz!C+|n9(E6o1f*UvhOQfA5P`}=@418R=YpT-{28+U8@9jC7<#V9R}M(Jh3$ho z13jN2@C&%V0J@h1TwWPN*MrJI*Xc>Y?xTdBn;-ZBQr^PHtA(KMe+M~N0Jg3ber^UU zI9@>akATb1nb38#GokzA;rmvEq5U9nNIen)>%R-Y$CtqFgRQ$ugPu#v03APKfzAV_ z2|&&H59!zMgRZk>fbM7DVh6|LVgcB^5;Xo`_W&G(rE>v@x&n5H{jha|GZEnluD@5# zg~kW;ykG_{NI0)8gN6$qwB7OsGM)p!#}IZ-2z0%udj&YXoH@e-EjOU|OueXri$lV1 zCG=bw*gZ8cbD;h1?j6v42kR&Q1@{xv;P>o6$4y}A;eIo;{DJn9XFdeS2A0?uP-jJ<+=_#Pa78R(DQ{`q4#Im!TQ%cP<_yIW#Qvs zywLE6?iVP8?lU^W0Vz*opz#9RuWHN=ai2T%J`vbFDeU~~7=DO83+TQu23UF)frxv+ z>NS37xh()G&#plCC!T@M#~k_z8DBaEYo~EQ>L)G{NO{{1D{na<<@j}IdVsI1gq}me z1-++eVHz}@a6s*S11<+N{zKbEGg+bHE#P)zRZRvo9dba^HS}C2c360_K-}F5E$;+}97iw+lYs!3lLgKSWji@UKA3Z zXQ21%rLjTyG0^aFgPqF_&Cff2LC(2>&l9mj!ws?zu{9iaPY2AuEZ} z9K#AJA0oVX|^RHZx_+^Ei_YR9+9!UKA!Nw<9p!u2|QvUlc zgu0&+)kuz4Klcw8&=zPJWh{lyG5A9~(cGpw9sfcPg6 za*vip8+3nP+CNDBu?~8VT(J!_-T#A(Gja(+@;!XMfCbW?Sj+=X?{{GPiPHW--1ik) zzQOkAru~D|(*-{v<#Q9P{({{{zymQKzTboa8Xo+R^Z;8YFq09SF5MqO@1u)eh~`e{ zxj;{$>yF^}b3xmgu=VqB_dvr9K0eO~N#8p}An^d-xBCZDpIv8#pB>q z{)XOfdu1XtT_Wx&1K*=}0+yctK+hdwgXFWPu=d73sQK)WacKB>{vU|@(xC0ZQ*Lng zL(VmlfTYI&*nI9!XgYzOTjc|rm-!7f2Uz0w%)CG5a!pIUG!7{a$W`OTuQ%n4lP=y)eA%! zpyos8p>|Jzthc;?IDZn{UW@8+*k21;QOg8B4-?!E{m|sl!t1|&N-8J(d`qzSk|yXn zLzulf(0H$d^m~tevWMN91}={$W1hbUZvSt{ap07m7pHkz2!3uS*gb9Oko*%P1X(8t zy9aGU5@bGmE+_naU~s;PjB^05M^#0fa}IW=PbB2r05@@HxIy=2w?#TMJvu&P_cbB- z_%qmEw{S?h|N70Ihe^8~bp8ogTrCJ{FSMN#5)1LKa44i)7J=61uyeO0{h{LwOb~Uw z(DO5U+#vJLwStgv`Uf2!H~`&mD8mey2Zx_O=?$qTS}#NI&4G?TJGel{yZ%DTOW3&? zJkF5v@whl-zk)e*AFreXWc>!W0AySTb`M>o3#6aV@(g}&FF3x8ZJ^^z;*j}m*!ji` zuzd#{5P!qZr8I%gS3=JV?1ioqkc5q!J%`^*3y${&==y{=hknsD_)FJcH-^3yM{zJ#@8B`(h=OzIe7lMs98Y@BLiyh)F*gnKGMQA-G1gS6J z=g6r*;(PuhNPF@TG=3T6AnLdv=PFmh&WACE&A(rQ-`figpEM)*YVm|y_P&sJ+`VJX?C_tPW2|0%lI-U>$YoE(N%E3VB{XVd9RAU8*KVJ(%D?GHUI8v&;pgAVLEUo)(yxKvhawNHm!SD81-1?Wc7HCU9kSydY&`&Myy6q2-Z%uC z4;6!y?>nIFRoM7Eg9tQVL+kf~B53(91q}yoNP3>40xq9H=U5*8su9zFh#8^|eoiU$ z-V`qA{g|tu=NiH9hk6C6M_}iK8w*0x-*xCcv9R^b4AA>N3*JK7!|?maxFF#e2)#!b zHXb{Z7wWHd5cTl&OR)21_dx1>Uf8}uK4|)pfYeik6QJ<|y_dIN4BC(9hx!-M9|ZRo z;q&9Lb~yB2sg1Dp`Oy1{0#88P^AWn=JPkT-Rqz&4AHvt4utD2n&~XCTzV$P(`>i-2 z@>gKve(cb8Bjnr|V>eiPfC-vTpzTKZy=<^{GW4FWcIY`U3@niL$06uACw$xtnop{r z_uu`8&R?W4LG!OTB)ocI`5k%=7X7}B4f7Xll9 zfSo7&7t*fugRO`E2}yr5q31Ni&uRYyDR-)%A?fJKY-o7?fS7v*Iu6_mUB8<44YF<~5OPjz!R|cnH)Ng4j(L!NMj0$U z{{Y8FTAC-Bo{{|I*1}Wd*_gj60`U@JrA<%k%CQKaKZ-S2_eT2G`A5ss%_Qf;& zfToilkb3F`Y+V`b99I!Yc)D6b)5B-Tcvw;I=IfUbf82x3_kDnd5AS5>IL+_nk3_ZVmK6F0U_%kFv`oDqe@zNXCgP`}r^2~>Z&l^ZS;gW>36YC)T5e9}2kaSb<5mGL}&ZC$Ki!W%u^*?l<3;f4QTlQUq|{98jsL>(WPPQ;$Y|ELdPM0!1m|9gvJXqxPSd26Jam7A9Ds; zo=eYy`}Ym#nzh%^_L3&_yttV!q2-b|q<&9=)tk>C>2)2nUJHSZ8$|l2*G(gsi ze3gK#i$4nOx2~>o_~-oV?dt=~kbXl6^gQ$31<-qBjzi6Xj{mqp&+od1I4>QXzLk@p z_tt%f-!B7BM<s>bAvq!lf+#wEfzLp&`w7(3UmtE!#ZO@BA))D`Q)yw+O`CN9$ zx&zp~Fq;h^>vi8gfW$xioO5I7dS-FR`UTkenZ`O0{>?Aoa}nY9ai?iQ=E3(dK-y^* zuyw_{kokC}%aC+x4(-1it3kqR3v^us{Cs9LNPqA7X~_A6@Ow*@!0D;LmI=}h4L60x zuM)I946Scr=MXX|LCV2HPa)+B>|Uxfa?thw4@CYEY+ha-Y7TV%3U=?<83jmv6Zi#E zp2OC+7%M~S6{P#D!SQGeo7ZE3luNMlB-5bn*LBeLJN$fjLCE-Q)f7nm1zW!apGW%% zPS3C5_i6G%{mlhwSHjQJ7KF4rABscjBltPkFmdSm9QZlgoRDz5&I-w2A+Ym~pySIk ze?r0CZpWnJ*A^X}|2j{?0Ijw_70nYv_C~Y@Haq{)LXC!tZPN z05u;v-vV!EeuUQ7(Dm^DVf!6kLfduFaTtFeNIg6gcCP^|gnzUi8g3sT?$dzoYe2eR z8&Z#dgv2{+o=7;s0d%bK)@9<*aXIKXgPH?$9nmw$dNWvgzS#;=?k^XItWzq0?yGuc z3|VJ3@hN2gQ3-7P&;+tx=d3Vf9iTL99z+|m4$A*KWFH*-9swQ5x|TRr$hg{3SiaDL z><^3*f|S!MVdbYRq#fBR1PObrWf5Ptx<$#nIi=p?M{DaM#K=%*C+=t|M zc)1N-4?PoVUN3CkjSEt)xkKmS;q?M^-o1bmB5w|@@6wnc?wiRA6%T`!U(kMdpeVc? z2IucHhy``{yJ<#$f1{&}1dpe-$`}IRe{)N{gKcW4&*N}ED{Ql+Nu>1(=rorx` zhPTt8?TrH1xE!n<4o&Cqal$u{^6oWs{t-4_Iun+UjzG%oqpyZ3aYy%A! zSi4IEl24^!?Qn?mY8e<9wlOd;STQg#OkrSPNMU4Ph+<%1Sjxb_aE_6Ip@4ybVLbx_ zgBTM7Llpx9!xjbx1|22_h8hM2hOG^X2p%;~gs(*Nfk`PZPRQl6K%bxIJo<{?9>B*=iRocwzYdLGivg$^eBXEC!}7H~M8Asgy@K@d{jq)mhP%Y_Yo{sFkXrq~0y_ir|X z!^baPk!>}Q`wAF5+9Bsgw{k+x_4ookmvM1DjDm+Gb+W9b={}$+slIwAb9|emor}q9rhg* zR|{qpaA zjQfNgep?ls>$vm|l8%#epzYs3_MqdE&xF-L^7phn$ho_pKih-PU65CXxKk$A0ld7M zlLb=FDkehwwYU(np87kZLni2A#9-+7Tur{if5pGwN)^N*_td&qK+HduY$S<`6yyKm&0T$M&B0MXo&cmB*?r|2P5SC4A^;Bok@^=;*GEE zL9;_0x1s9S#5!>PT#&vw3wn<16lRD!iz6LC=SzoN5`)asEZqa?k5@)O+EE2;koK!O zbRW&JNXYrL^8_7OK?iJ1g~t2kNQaKrsLOjEFR_Qj%LPby21h%9jwk;f%nV*HfAl%@ zJfzAX$T~{kyj~nR>J(mJ{PFNgtoTb4XQqTT{o+r8$>aR2IkaWL>1-zcOxdytg zI?~Mnybtt=D5U-ufu38Y<^bL22;Jwm%?^@IjBTLlO#oW2gZBGO`*Lpj8;tT6RPXVa zUvP*&mlOV?SlA(I$C^X1a<%9FIR^&=_x}6VOb+QYZUw>0;WXY=5Pz2NI!u=-_X3rZ z;QmMY6o+LyR=wGs#0$+A&~tB}H8~i8FBbe^4@rlP5O)TrIjl+u2~uAGT|aW(8B)G2 zh;jg*dpw63a{uTB=s12(6lA`XlMQmN$~9=Yp%Vm|&-x?^i63bBf2IezKj5wiG+d$m z%*{T~b0eVVS=)WOXU{Ak?XI`b@xK#kkZ?1G?vGa& zhpcOU*$)Xf24hG&$NevA`rK>;S$XlYzPiHopg5#}N!$&n^S)Up|JkD`Oz_{^WpHPa zw8G|{py?ml?mBY@Hva(KM|&OGUV^VjgSN8^f}!sJ4ekFy*Ym;32OoQk^Z#)33`bwQPi^Ec*qcZSzyUsa>la?FXzX|d{d_VXdS3yT1FT&NZl6aMIDkfLEtUBo?d6rwajb?yhh*>tn!h0DTfoxo z=1jjJW3pw}N+ZCMO zEBA3bTIU?ETvEp8ATp~S-j7Sund1=sy1QlDod5Q)_5-*aUN#l7PuEu%((eg&g2YSe zG>5!4=?_2A)9uj-4uK*sge!w2;QcSKIWrx*pKuRa zK10j%$$^me)&U7feL4l&KKbkk9k+&_w;BvB_m(+9*EvAzO;|t3#}!&WT!x${F*62| zPI{c6>j=c5_Q1*kE68~GT@gqJI4qehhS+ zTL3aXFmopCK1t~M6#>vaLWi|-(w||p&lwmPEdHOXbewVOXZi~Ful8q6E`syX*)wN+ zN-kJB&PnThex8}jVb6U%aQO)ef8FI8j%w4lGNPVIl~kGd|20o^+X z%10mS7#tmciW$29;&PBUD9{WlpF!et_WX6|$Xipj-ay>p-p^P5pmq_+J>M4oa4-+) z`E0Iu!~WK#NEy($2gp6YIX^lizkQ$6AIAqDp8=JVKTkh%kcjjA6!Txq;r*k(J3!+h zAoay8HypJ8NZwoH_`v@AX?1PT_y)+{GhG)PzO!_`eb@NY{&4-SMy4-;;PU6@snZT_ zDqOm+?LOMKJw3mjbrU52J}W)$;H&dN^zN>I_EMQE_xyd?4^|(UdceV0I%U$t%}*ic zM#IJdChv9dy}f_aC6$l%t=r~!7ed?l&my)tfNnYI*~tPQp8>gZ^Ycv(66Y5ztZ({f z?~`M z4$hC{yydIdp!F$qJmJV8JXr4pEtf+0*%0(P5PAk@22V2K|bgqNaG8dt}J-_Y! zwyd7;3Dz#UG1H;`o3d-ljeqtUJ0b#`Vg3D_X^?qK&hx<9j$yH7t?C*C*>bJrA-M6PY9Eb+h;4kb|lDt$dia^Ih-cEHW zJ^N&KuAhX%?-y65p5F>RmwM4e2is5V%;)clI}{7v?~H`?`wS;L?Dxnxy>rS>`vX(o z+~9!K@6ufkpyLPr9p*=EKSXvy$IUn#wnTp2c}vP2QV-s5gRGyt#^7*qV$4719nf(A zyJiQ_?RW`S*dg=2`=IC8v9&q$2ZJiSPxj#ZoHz;~;ha$KU_ufb@@cMnKG2Q4BekVhz7TB4}9QYB@Mx&+IIOw#S4Z z>#t*=>+5$HIPif7-b5hdidN8isK-W>46+2}4 ze(nn{xdOhQQ1)CCq#nu1caVG(A-+A3#{nE|&CvC0Z21m6lUFtcdU89gyAfaJe-2uI zDHJ<^?~gmf>af}_Jo;k_bU#W&kwc+0?*rWl&~w}yq4TZ*xei9)3%MRa>UVEfi2Fb1 zLfjp|366KBFVJ@8g)C^g;&E^XUG$U!T{n6x4>F!?`@tUE&Rq^2Up<`a0KNy!SPXJ5 z;Xdg3e>Ex4@f`-peOXhW`e zQ|HD7X}_^R`#TrX9G3NfEpy?+9(q2Erf;1kOmX^jA?+^=KK*9mJ2X75@ADB+O z!%{y7;l#u24j}R}>|Tz^F%E*@1CTG+^UpC}WHPl0;+_Mr`_{N1=MHy3%Sp>PhZk9( z1F`?vgYTi7WeIVQP86hl9`nv#0o3u?Spi9J#nF)U<~v0lj6ns~3ut{|837$HdkyLD zZtRDcvj*1Rd1K!=)ww&T6WT9!2!pH#mq*;=0cuyw{22u`=e@nom08bXCqmcTx_E z{WM)>Nc(+d6~r8$U`YG^h5)3U9v=mX$I39s_#+b+=z49pKZe z#nV=ZduIAT!{-&`K9)G>xYlNWs5yd=a&8keo!|6^x`!V!UVQ^ve;LE((GlaZ;CPYr zf%;1na;{-T55(S^eh~MskbulX--C{GE(nC4ySc^wU5&kIoELN+YE2OI+!|rXegik? zJo9HiNWV-~7;|_=(&>i&~)YC2MI4rZt%GvN3x*niHhB!`TZ#5zPJst5cAV~An|H;qJUtbi2^#7(h zLClGCfsQ{Pfvkf$51oIM^nj$}iof;?r1bBq7(w?{7dt`6N$!Bprwrq>gM{-lcj)=D zZ@~HG>zS3%@NtHmcf!L1KbI6-&hxlJ&a?DtJKOa}<`ZylQxJxjo|7dJ%T;zkuFT`USdvzX5hn7xaEDedu`XO$SIg{uF_f zTh{_0;Zy7aH~-(2ikE6zq4A#P3_XYDBjmhZap-)_0Vl}1yhsU%|6%tWra42#owh^g z*SMhVC`o7N_=Y6JzIfQaHakfDeMJy*9?T*$h|4p^ZHR^w6 zk39aScIl)8qv_V1wf$W1`94tl|MRs24(rbuDpcP^T^Eriz0_gr1J`&*sekscbq=6@ zecGi34jZJm>7H660-py2i(g&fP*C%Brs_ck_&gxEoWDQKL89WFZOo@n@O2K5^gk04 z9^lR@gaEn6c>hEP^}YEuZzK8PURxpXuSzNH*vEUq&>7>6w)5s2`wKS+~D~I zTux4fjsLko>dP-esOulpJmBLYkoHU}B;0PgK-_&)7}AbrftIU0ZqV}l8)Ux4dIm)O zOc!YTWNPK4gM~YcI4tY3u-T-xAokF>Lb%GbKGI;CDKeG<>TDf_Mq!R7aoP~J4!Q$ z+Vcxy&el{&y<}_wo$rR0&&o+qaT7?pp;Qdg-jK6^mS5J8_QoUuNVveq=Pe-VL*@gd zzE}y}r|x3}iNAIKA@?e<1VQxq7(wczjS`UYhBeT3tg$hq9Wz@9l1}zP`wKG-A?@3x zKOyZsSU<7B0NO774ZjZ)T<%GlK$p#8Crfq?@`4(jO%*V}~sSGWLzeDol4R>fb!_IGmo>v8LkHOBjhVDn516|iNQx-BW@(?lZL6L)SlCgpAk0`oCvnAnm~ZR}lA9^gzQ=25Qb^%(s_9%kwj^`KhmvdGlWAc*q$! z=z3@9`imE^@)e$-yreqw2;`TrsLXMr2k zU(j<_1EJ?S-Ef49gWD-*o_yn~k2q|@~$*r4kVq3!Jl5s>^I3_U;KDXhE=faW`HNd9n#jtd0`L+YW7 ziIDqtc0k8@4tPM^?JfXmFAGA~Wi4}tq?1JGd@gK#l!FtbJY0`XnxB@(%Lf03qf$bNOfwpJ< zLDzRc*QXiFLh?!fFGx8i2uq&|&~yvkkJ}3y-+-;t0jDM~0gm@HDR{jMPNyuedJ}g3 z`X|Wx^Cp5JUta`0r|UKJe0nK&sQ+Q}s?c-RVdH^kpzGLQL-%K2t%a)x zJC1<|;_n}@a#9$Q&TJv)D#e_K_M?r3q3tW^IR`zkbs*6An|TtlZ|4&1{4nS~g@>OY z`Oy%zo)fxmNdvks8a5xD20M>I0%Ff+=sZH25Hy_mA?}Q6f~E&?X!!;`4@(5P-jxBm zpK%AYd@g{E7eUXTT>JpCj_64>)Es_@eTy%^+qaN#fu4^c0z0PwcD@%cG+#r{w}RJS z(0$N>d=PiR)`z4)>ks4K5PNs@LF*STXg-DRx0wT5Zw6bZav8E8=`}Q8GYCNP??Z7& z`=|}pUgd|b8-uQ=O7eroFLXVe1_LBMH^TNaLC@=R{|GTZxg6>qsJmh51Xg~gu|dLp zhXkbk$Ob#N0D4}Q`%6f@pa`AsNQ2g|a$h0+O?~M4@H94v{wh&OJ25vOnlEAJLqOBf zO4vRXE~vkt=MzkXoi7Dj|MnEJo}n3b{u%7t1?WCP*nG+v7HInU4yo64VeNL9InZ-R zbz%2)z|4W3W10@_FT>A!V1=ZcWavC&8WS{p-a+bR*mx`h?EE(9epfkIxWUAs=XkDZ zg@!-0TwC`XQr|W7LF%=WDGoPnK^JkN-_K?SX?ITLhqT{e>mhwiA^pAQY>;*kd_ANA zv|aiTbsem+KBPU*E)MCZz~+C?K<}%WBM4vb2d>v-FG%?YU-t;Te%WlkNp0Bv9_YR&_m`0Ua`1CjSfJ)Z%a3B%Ic?DM^kxb{{O1JAk1UXI)PU}L(}(3p z*tsCk^WJts#}8*h`=9He=WfEw8R))R5$HLuaj^UgT{m|Iy3eu#I_{mu1WmWlb4P@s z^YUk4njUnb%_NbtGF@bU+?FYN09x+XL@AJb|A6q34Uh#+M+4C3xt z>KGUpPBSnta4|A4v@5cPp=ko62J zf7suDz&&|k3RJyZ3&b2#Q3oLr`(uCDuY$wD*tyan$a8LkniF_m&)J`qoDhGpl|k;$ z{Vw9Lf%$pQl24Z*?kp*Fc+x!Y>?(e7@Vysj?({;;F)now?eTiWQX&pschLLw2E;vv zH4fq)0e>WnC7|LjAm)UWIDoD(mQVg_-?ic4%cU%@AnGj(9IieGO{~5LuOIkwd?UpC z$)yfoy&~Hz!q^-beOq|_8P7w)fv*r!-hE+)j2raA?&ZjJ`1=iX;p|0w(DtBE*<%p% zZ{|Yo2WH=Ek1`+KQUEod-$7CSOU@G8HxPS;v!V0XPwhd=3m#;gg1G-p8q^$Ca5y~3 zfUN^ggUnm23W3+(`o4bwF=um{LtW3#Y|cu^IkLh0H^J$OK_SawlV09p#yt!U2Q8Jo zemgvesGpn)sSoBdgU5rnzPS!@|H(v1dGV0T0TgXPE{`DYu}OrC+s?lPo-bbV2|DlJ z6AM|F>A(hVN4wtq1Tn`l0y>^A0j_^6SMoT5+p|9L(0f;S!RsST!XHE2vpE#H9ujiS z_hIvw5PR2zLd&=R;Qdqn+nzzx3x`3*>6VFt=b6*~-GtaXGYWEl^d$kP`IjN#&=3ag z2Z@8n!vbobK*SwFA@f8*g5deMiwU10_WA@u$3LOxDy=q#s6XHj9dG0W_qW!%?SY6Z z1VZLTJfDE)kppVKK+MSrg!XqJ_x%cY-+-t;;0qnEV+D`%{hxXP;xFR>sQMM)^Zzcn zK7fdC_J+)_m&d;!MV-c`=;cn=<8U|4jjF9UQw@rNjQo^zSYONjZK9U<+-uUz1LLd$kOgsOLh#tR#GTxj04GZ1&qw1cKA zaqxWXANHqE^-hp+)f3jTuCcJOvW7@zK@!{$FB z<}|>@pPoR+En)k=t-$ej?mJ|BHAMCr#2gtq_N zq3(YVp68vO@eE?l8Q3^5h|Tm9&PmR}O6jx99yC-#g4IEj;D@yU7V`4-x^& zr{#Kvj%^)@E9~z{IBf9&)pwBmwYOEsQRH)y`0qjv2P<=sI3zu+Sozr@WlDM+U$z9a z{`w3K2Z#Mv9FANJ-L-oin?n~PNc~T+dn9jcb%>adrZdY=+<`?g5?l|0>^;LU-2uGL zO_c>|4znY89DupZVRQAT4FTC4;BpUC4}#UZR6y6^K<LIRu~K=mCs zJueFby9?x9P&*Y=e}T;YX6y!8*W@Jx zJ`V*{Z-UI5DQN?ZFAnf}3Q+kBvWtPi4ALK42R+~G4)k0iA8Y7%C}dw7sGJ15GtC6r zU*H9|(?Rtk*geK3ka5`AkbT0SdKPScgCV4Rdm#qCkNGpKUfXN{E$0#YPr>e-sRtc* z{sX?JG(`3oH2vs7!tDoi`~X(&G3Y?b`2&#ge0Y5^QxjS~K+f9+)w2+HYC_w?{Lp+1 zJ%`;`6S{r?Iu73p>t`uI{R=ryFcn^&%R}Sq0VLgSdj{ph?)~Ej^Fj3^I3CZ)f$Jfz z>yUmoyq-0NjT=Myr|@#gSQ_e1#5e#X{G}k{zjBas=(iT_g2p@SJ`l(`%M~~HA@$lB z*uFXFxtpO2!RdVFOxQhmj9~qs@*fobmd_#i1{`-#0_6TTjTaoe67N0sIV|LmDJ24K ze}cku^OHRe;Vl27PxgJaf4hzQ?9WO_`*Y@$!A$(HDCUW3jV8D}RFRH(p#09ZwK+Sh>UxobSNaABb~EJbYO@Rq~^K?S;+Y_9xh! zNM}fV1qy)Y^FjFw)L&$mtc)mNs z0}X#ZaK8|g{vqmFpyMad@%DaL`v-Qe%n$H52`GPo!pFEd9onu~Xdkh{6dXR_cs!N} zxz~(=)4}m$@)=Nj9_%m62#EVRIKcTA)NTih-*ko4zrqsWaaMS^ZHA7&f&&YgFoJ}u zF&lV1vI5$kXJC+lhBIWp52!s4^B3e?YRI{bi137-^B)5_7ZVh2VE4CS?mGj!b0#Nb zyv7!C{tn1rVD)Lx^JI2F_RoR*1r8r$=)OMaxECn>K*T>o#t|4G<85&N8b5}Ng9Ls7 zk8^_j1yO$)GQMdGxz`2cFNk|~LdM0uegMd(DpUs3y60uA8ybak^JyuJX3|F=xYJ$S2y!Rwkq^$s}PgtHuGaexk*W^jP@ zo4~24A;IC32P&_??qP6%wi`de+wBl>d&qn_8{~c!P(2Ga|BSsu5ct4)X7GJ} z@cz_h8)!ZF7vAoLsJDddFEeEW*SDa03hW+ZOQ^pf^CO^kJ1Bl@4W%5V&)!z5V&-vp zl>=%oLE2qsZ!$VgzgQQAoc=-PTvoZ};Lv4N%+J|x4{2Y4^9w_R`%#Coyjwk&1@7BJ z#uFgzv4)E~92gJE*w*E9JHYA%a5&d5cG#>LUNOD`oW7U%=@As~5oG6Hy3R z2Yy`wwO;56g|;^!<5i$?4CJqwl2*|6i8#1_07~Z|_Zx4vhW9H$*MEcZ3t0V3O|ZEV zEZpFB0jOO8c4wLv!QzVx9HKYwe=~27AT)eF zL+X9cREKo%K*LXHeFUw4g(D#O%vczl4?yKA*uRl((Dd*Vyj~Ghu7cB#j}fH5xmE}q z9-wj+tR6m}3%MT{6wVOmLheIxe+Ze!fQPg3Z^$^i`(Ma>aX+-5n3D@0U+`IW%^p@i zg3S>~!3YO%_&+m(%=Z@yg4Y3o>Jf;0B%%Ev$ap!Z-T|vm6N1i*Nr3BlQ2he-*BR)& zS6?CL&4I!J9G=F%A>)Z6knv-9IGlL{E~l<9hUf!@14KP+KQ83{15iB(c0a=haJ{ty zsosIO^CnarGA|5rKg68Nknzxmr@;LwkozI(cS7q&$bC^D_rt^?G(R}LLH5p?IkVR4 zW)ox_4&n$fX>4r#x#dx;iXn zXFcVTaDa^~f(&cOxa#1wUA5?-C0c)qX`{nR;R`M|0ucQvu=_Ulfa7W5Q5I}d%3%nk&$#j^1cGdZ-)5PHE5Uk!H6S7YvP7FG3 zb{~>%4kUu>xs^cN9!Rdi5(xI;uw3CJxK28W0PYZ_jXA%7!u=p~6@HmUEksx?H z12pajwzt6_TCWL1$K{~&t(&3iaE)0|>zxNd;QW^G6lM;z9#r#ygpVs^UJ+EzfWz&k z8@!wc#Rn*VfyHM!I&|ke|Go0#2k?G#PSsDZ=D)iifa?)Z{Q?%3v;&uefjj z{)SS&IBY-cpi#4pkMEfvw7mo^_ZSyDSO`pF^?C3a-tPdJKQj??ohmpUA2fmMMGhTA ze*_fXXJnEc<`^&9V*cX;YJX&=GbH>A1>orrtp1E4q@2_hg7^2q<}(;U)>q$zoVN#0 zhiNL1c8&sMKR76U!SP}YyEh(kP9!}2N3U?uDv3*;zJkL6(*J_g%QH(SJG?Qu6jV7| z0xAw2x9q8M(3Y5bg)@U4n(rX<0>;dVka3LH;tr603Zz{+Q_>Z>&XyINPC?}%#9yY+ zaZ$uRad3Ff)C9NlEKS70>$pJWBskvFpyzw{Bl;I$^^p$Haou0w^%9`+3gTZ2a687l zQwW?75apo;w14r<9(2zws62$2F9NM+1>xm6B%B$b`S&xpd4jI$)Ya{e|!1a*i&Lfcf(p%UamcQK0Ty|+8xV`b2_k@GVf_pu)^k3UE zv)(&-{p(VQ`S}MOq#G+@_b(8Do`*FN9PT$+4}!0-+Y0bLZl9dj_D^>NTSdHsuHWof;!rMN z9sFX?6Z^~{u3fr9tH9yF@Oha-Z_>`CR|6y*9A|CJu(I9=9(OpiYLUa-jBv%L>LLz2 z@`Axhk2=8i&QxFGP3tHLTsI6Ro{Anf_Ys4Ml8{mPrnYdhF?K-@1q z$Kn6^#C>}hp4!9qorBZY!O7r!m-3s(!FS)yXKGJ2gX8gx#1sd|+S7CNx;Y$7Ro-n3 zIkEs^ujUK~G4KXec841&y;T}l@1@1K_^Jvhn~|7 z-RIO?3t7*`$O|5KJh^fb#66nD;CUaJs2lbf6W`YCm)QjoZ!CtiXFtCO&#!J4g^u$D z7dZrG&nlnuNWh^v&~t9XF%wAmKPz%L;D7fJw+UPp8lO&$bQ=zQAl`eY=GE1IUTa!>h^bg z(0+QMu0s%WmSscsiF5Km))~Kptq)3r+;b)N!G6-|dXN2kq4T%RsSXniK^vv-*k76T zO!jylw0uy`aM;WPT1d&|0Gi)c-U%tkW^yJu{Eo>z`ft-Wd-nJlKBAAH`{Wo>AnmJC|;E7vi2heKGJ|E~lxr7ABxtO{F;B?x-egfitw?uF|ZI6i{q#lKx z7tEXhJx}P5{jO}zp9>y9^L0%kWWUU8F0lD|l1m}s!<^s%-j1@05z-!g1YMtE8S4Pv zZq3FC9+wolzYh|>Gozv779Z@v^BLiJko1!fc<4uLEeCGw5D$a6QQu=>Q6a z>Q9^w6YG9kZTNQ#;{Iph(DB8G;B_&tCtZe^zcT`|k0D7IY>%xZbbe1E3bOBB@umHR z&5>U>+Cs}2o>2IFAZY#RKmCnRb71{=M({Z3^{+=E;x_}K>%rNe{#^la4_gp;940tf z9K6o^?VoK>e+7Zt;a4gc!Si18%An=L&Im|)Ze@eae@H^}qhug>z9Z*3D`Z~q0i^yi z-W&=ZXJ!feU=La*8^3%vB>aN|AnJ-(A@jIJ(0R8vA<%IJ=sKaGO%V4S2!f6?y#Vju zee1jvBJL0f-DkiD@yAT)eWGgup!-Lk+lM?}I-5m&EyTae{GsX*=R1STrJH_`_Usx7 zaD8fhWFbVonwP_m;Kxg6A9(}5pZ><_LlAopctgWe2t4i_a%2NU{W4E*IQC8#0G|`8 zFAZrYobmC2%)>Z{K+3sBJxDlg_J@v(yoKz;IJ_ES&NDZt_)BoV`j-^+z6}Qtu(|J- z^Mm)<@Nb94`%D)|`7a^?o>z{|SqCxyvkTZizgO}&Sl{>W6_4K!5jXaMwp)LJm*20s z0WCj2dqeWo7H&xSP*?y>Kb}x`vqAbf;?R03(!~K3uk)oiA@j6*4?*e|9%pdB?`_R< z$oRz+Nc)H3fHP!0TDuse9dEn>V!ossbi9ER9G+kPY=wwNI)UexCrhwG>|NLjasOvG zNcxMr1YYm9>m9UQGIoZnUkHHgUzdCbGv66HKg$#!S^v{@HKotWrwDfY1e`T1mW#-useUOf}Gp@R>%Q-o{c^a z#6Q`K9sDP)n^{vV1aDV^)%$cgc!LgHzA6Y_mr-_UAtYYTG&q3wKMIII%UkGvK92_I zIm*J|bP8(6g3BMyYRI`OH7tZH{#3ud7$P)+sO-y z9cJ8}+}?Ui*a6o51iN!hA*6lg&glTD9~VR7aa$(jdr+OPJY z^DjW{c5uIQb222o?G*rzn}gcJ;QDS`0_5DkyNvMmAy`~37BY^$l@Z=v1&gP}I)IPI zmXLtf@6dKmS`1{p%r;R6SbG&>ZvxnTQ=W=L{1Gr4;{Ib{(0=eod(b(~<>FHz>HKmC zWZ#3nDA;~@yRkCH0dzXYWOhb)I}>caaR}62v~vd^1VhV7M)3GFsGSe)8Y%=q%O7z_ zy%U}XN&l8XkoaO@fz)Grdm-uPK_GNIgAd#e0=56a_6CQ7`|k@~`N8?F*QXKUuV(=e zzPJcvp9ZX*<`w`QANl~E&ja-rz~Si@08y910iG8D^%ubIJm3e;=Syb`K-@VC+Majt zfb4&-gUs7ZgzwLDhtA)Ah4vF+>U|s_--6S*j~PU~OB_7^0cxLv%}+A}*O&TtMIq&GlnErhW}1QX;nNGR!0m)1#?W?A znkgh6TOj8&fcgax^UWP9U#b~$tdRiEgMs=H;QTw&3R2F?@q^7vg|*Mmm^px_op$`N zcj?Y~4sTbanLxvh30$s&+Kmu@!Nj@1^DPS>Y=*ki3ew*x76G>(;qBPX#*lP2p9Q>s z71T}!$9sdZ18AH6+nW3Krx&_z1ND!9;p2TvDW}nzg}Viw^KmvAF#bM4Z!-VM81H}9RamZ zAnJ`F`=0F~`32OD1&cH2LE8f#?3c|xqOjosY(19=q}}yK2x4B)CP=zEqX(_On8EQ3 zY8OGwF@cQNs)~ctFR1+qagQD}zL>!65P17AO&6Sh4t?c9ZHF^xL+3>y=MaGUL6C6J z1gEpxm15v{SvTb{G(0t-@x~4w2L#oRkoeUG$M>m)|KaTxh�)?Jdh6_P^?~_JG_9``&Rxf7aR6(Qm44p}eB zAmW=%q2_Qy+gH%`8-oFK-x4I>f!a&pa7Z%&uSZqbAPT9s zeW2&PozaE(D^UV!4s=||*Z{gt;VE>y8#7n5)L}xa<)WR08-xX zg|0(9qYe(Q;KzLMb`CfmjrF1JqR)_X7XoI3)5FY}YS8&EA+UQv{IJXLEi?EYFMa5}!em=9b&znTPH$IYMwsh7F< zA^FdAEz}&?x* zW{N}fr+tE+_YFILT?*j}ZcnIZA9;~jW@9#k(w(kJwO z>@-OD33oxq4dC}Wi$mNE8;_mI2u@E`uyb5s?NzvX$o*@eb}uA+VEgu<`yr=5`^#sb z>0^fw*q!VCt%imh^qhQS$UcVSD;GhLrf4b69q(DZNwGS5-F6B>U^Q1KRU{8j~Rf~tq!&vqSh4=bV_2t5b#&_{5& z0c!6-;sti^@;yj>C%F`E4kY~uL+pdMOJVm3K=y^QibLlG&cN;uhQ{+(s5zR`9T-3Z znFV+3^-kr0>k+WM8(JJ7{m?hyeMO-90^Awgv(+=c94eAEGT&o}URQ{WEB{jZ?%6CBQGzCg<_ zXgL}49z1?*Z2TD&1NeOlu>0Pi{X4igbU)`m zSo`n+q+WRq-4A_iDcBzj4AA}E8Xq9x1nbW-Jb>_bK+glH-3d+qH^J*PUPJGf0JRgq z>2u~y=(;2(NIe6uj~+nd>lHYEf$9Zty25pj#AX|CyVJ7=GVTUS|B&*>0@D8I6M>AU z!sd6<)S&Hf32?swlrJFe;e?h0JdkoXHyN59p!be0J^&6^P=0}^e+hP=J0~e2c;8;_)chi{esy44?6Ch_6%yi0JvRk z0q^f%-pc`w7x+CPf{=Ffq{Hxd_W)m*2|b50HyJ8^670Sz5y*M^7V!GzBqY7234_%k z!Wp(6K>||GLc+5lJ;lTE^hg)43KHdmY&#S;xB3$K_JM z>caRC<6~fZza=|xcF8BdyM-9v1IKS>B6L3iv%`A}S9egm1uVWY2@+3%jNp5OK_ z=3Gm3nBfE3Df-DCHV+OH2Z^$5;e^kFgWbO%1UxTwt{gGG2Ued38<#_jyMoJ4ogm1* zLp3pn`m8-Apm8LyduE1$^Wp8EV&MJ-Xnq_V{+B}_<4|89=P825Pr&Bz_<`%2#Ra_3 z_IwAVyzKFZ))&vgECxyZB0~*JJh(p&SXYjzsXJF!x{_+p_I0;x>(h7R+ z8e)72WbfrzQAd5nt7$=%uys4ocKf8$4)uEvH6gFp2FK&$Lkq zr#VC}mRodjE+=ZgcwQCszDjPW`cshlt0B@M?fa9&h1Xu7jjIPk&tc#N#|x-D2f5SO z7p=(0uycULeA93urwII39hBApJ&p#C<7Xf2HX= zfXCO0_)*8V84Mxru@eU83s89iHs4qaJf3wy={0jhq($V*Wv9D*m**K!0XcHJy;CMzh@Mov^Y3Fg7Oi>{jhVbUV-~T zBHgfg3MFX$3|R*Us@GuZAv9!tGpOAK3jZ~s7aShwr+J6DKDLLA!+^xkRBgt%=LhWm zheZzOBm-|r+lYbJ;ey%~VD)D#q3dD(!P^6n{ACI)Z{OM{JiVZVXjiC1#|at1;RmWO z!0H)b?Pn%%c?L>v5OEGjJ=YJ}|Ag=tGr0clKLi=40;M;Id;UP{amcwFpn4x{&X*== z`S9OfMWe0t)2`wi^=Gg>&@ z{|xG$2jF#-pmqzy{W~H3y))2uH@tna6VmQ+X9b5VvU{pUKqu!3L)$;#{)mE^-6D+k zLt0vznmu2(qg?#Cb;Z}Xq3sPwJ0w6$#c_2c&*3*+u=WXL951=&nS;r#RVth23&6`O zQ21=PeIgn3+p0><8v<^{AIr#Wj*0c+xZSspbJL|MIB)41Hs{(vDm?%&Hd!+ z&B6|_b%tQ^1@j!{LyU-8P`6nULtVS~fYUbYWn9f)~V zaQffS3|V(L^9y9%LfmYK`8~Ce^%kc^9AN7J!Rh&6sl$Oc^K5iN5cA7mdv_N)XO@F6xPd4NzApsSjsm;KxDdLIjvYQ<4EC=@p+hWqVb*8x zJuRU1bzt?6a~(KA+x)y4!1W1e{1a^NvuyDG)7aAj@O6D)@oQ<2dohAU;Nz}fakq4b z*gI~_6{p1jM`jIDoIOS@6TY zeR=pPA=o;%orw-6pagx18QhKltzf6M@so8Q6UNV|(p(v77VC4nXpqLMXJpdkh`tht4~%35Ccr`~jD{@cGlvu=7}% zQQM`#q0n_cKOy}^_&lRObo`1HK3@ioceOz1dM##fI}0?A33jKCFGT$#*m^VQIS>r~ z(EWBF?Lo73p!s5me*+-(%@#&*J1}_Wc1SzpnKyKw*=MM~p!4z#-q8JdVqkms!PadW zdx6&#sTp#B=M6yPx8QiZ=?!gHi-N}?K=YnpdmDVg{i4YdhVb!4fT$x3{>qp!O=nd{=0B z{sGz_JO&6{3=YtFkpJ-c9dP&? zTY>H43Ks*CLg6wlj;DEPJ!11104Ou5F%?=LN zGT40L?h5F9B{zIr1!TVQ0EaVAg2St+n|KO!B;eyeV1GRbb(r`T zbTJI99Ri)NJP-n1hrL-HDVF-e*k7Wb*-$D2FfyEcV z))zs~Ta1IQzf$uC=R@61Pr>K&fyQ~j>Ki=4>Eq@(UU>Zo@mBz}9Dv^Q2^&xT><(!s zxI@l^2aOwm!+Em@WPJ9u7&!gH`<0tL93blHMQONksBWOM4V*%j{@PYkXkedw37iZ3# zF@uh){085b0-6s3rw1Q1Xg+!eIfocl{%q#C6z{g=A?l%J02h;OzfzK6yuZQt50H>!DWsq}0KBI=J?iU;{&kP{(qKa5Y4GzzluyZRR_dbEz4`B6a`jGQ`PVs`v5qNokabyzbwrwA|5S-Q1Fv%f)%y^0 zpy$UkOQP00XH?+r4e)(0@N-+$AmxG>`nq2g@Oa$cD{sL2WkK`25cg|9>vsVMSp5#M zR~cF#azolT?_lRZ!`20Tf{eEugU&zBl!vBU=sK$h(DnIgO3?PnU+_FEXx{`Reab`4 z7Xa7Kp!GZu_b5Tj8OXc_Xgw7;UKn8O79jiZLG!;5bEKj3*XO|F2cY&R#2guDc=CY9 zi$Lunh`16sT^buh&NIGv7&gBQTW=r;iO=vnXne^)-N_4frw9vdTuTZ%AG8E)FY@{& zNcb^A!c81@uB{X_d>Fv(^m%0mpze@{(ujF*h`(f^?uX1%&x5Z^mjjP8e%1H@o-YFR zHzDdJA@-&HgUp-3_6ZtGLf!upJnjNo*8~Yq*m>A&V0VGmFM-0xZPrtVoXs1BKCih4 z9|r@gKegWhy#4svYkSbOs_^lj*OMKhcE5Ehp8MGzwvQ5=e{<5o`-Pdbe?rwm_c=zo zK-)|IA@`Ljz}6vnLB}o8_v2bY`k`z7*^A#i_Z>721~&hUA*B4>3)wFV8g~V`KP^oi z;$KN2NICrowq8^P!k-`t$sh1@zLlZloVTFkkR8x)RDy=H5IFsWA6Wp6Cs}BE=7hu} ze0)*{GX53F1a9wu#uXv)A`Oj4QHXot^X9PhgP7lhsF#PPXXv~tto}6?ho(p9xv=6> zp?ugq4TyPRNcce9eSPr@aQ%A-z79te>^=qt#QZEIy$V9o_c~^9dN>5Dr;G)m{^o~- z%cB`k{jm8)#5^*@9LV~cDiOr|IK*Gja=f1p(hh~SPtt^-?FYzwDX9L1n8OKi$5#e$ z_#xW!ka@u!a$h0idEBt{!wzjHe}>Fw!tWdBfW|Kym`1D@;(+=Kay}Di{SU;Q(0c@p zKSSncVf%E9`N8_#AM%0613~k!ko3j|bw6YtpFw&)B>l}~g_mQX(L#9tZYC?l|1s=f zb3o&Y5PMuu=UIg43K`!bqR3%gW8P{_y2^BV~at;4Zg365t<)A zg6F$I^#aU%@bvOS=z1&ox&?%PLGyT^bwS{GOquAQF}tX>e5Qy4Z2b&aysgRsd=G62 zVw@jhexw5{XdvdVxC3nc48)zrka@|H&8Xx53_RfSLay~Td>k7RUqVp#Bg#EUxIxbO zIdcXvj}H-t%rkw}K&%r0yEE+>B;CJ;tOo&=KM;35faL$Lkaz^G1B96K7%Kh(JbnV7 z7hre*=2wXz)~CVDfvi*d2~Iztby*Pq-UNp`Xq_!Mp5g2IjG^sk9>{nJe4f+*!Z#5B zr$PSgzGWL{WFDUJ~}LO54N2t&+G70Af$I*2=t!k#P<&E zf9FLk_u_WA{41L2!_i1^xqLYPvBNJl-{wV;Ob&L+f>H;~t03v+=OYK}Kp~;b=r7>= z;a!hG?wwZizwMA3vz2{_DpZE{Jd5PBYu z`X&eEeZrgL&Im!yEhvSY*U4~dxr5)%L%U;K1Rb{Ktks_c+b@u^#9`$@6CQcNpZ2Vo z#}=(D=mOh&X2X1k%o6sE#;hOh{lWX^I3fO;Jlo-~uZGJ3MMej&_tNpdS3=JdeKX5} zb2+R2FD`zEPL(Q2*JIH3Ez3LyZPV%nq7v`zEj1FC>HcqqnBOwf!M*?f?JvuD9FEjf zGH#QG#(Tmv2iYkGm%r%?I^0s2+!NE=3<;mCKIr}S0uB@TtISsa3x~L8aW`~76f-ow zp!c0VZ*$N|m3$NtE&-mWI%p2{*NryF{_Y|^@I6D>P%Q1))b;FqZQc$Je+H9g$T(fT0C+y9TzWdhJ)i3wrfuRWT*J-hkWl6? zCuRY?ms`IHZ0>RmA;@@nNHIixbvdM8d0xoD=-E2eB}vfp3gRjpnjRgWv3r`Z!>Pkg zYgZP`g4i2S3K{pfE#@E(Fi{@O2Q+`}rA2UWiy1Jb_I7Iko5n|ZI0cM>E#lXD&Z zrGge}e71k|a_Xj@JlOrrsSf_@r=)f)7KhC5J%X;oUy}rGH}p3_&XY3@nFUF2&r%`l zW6yIsE*9bVQ2VE;40=>UzO`^ks&J7P=igG%z zJnzwX3%j4{K?L+X>~Ho@FDTvqxeU6Foh<^o-|Z8m{ttRE z-h@KWANUNJKZo5bs1OJqhkbg12|C^hy^pRf05VRMAPU}R&-{NHxLlnX84Mn$v)?KR znQvJOy}y?s2s*C>xwp`#9@_uf><<|~d?5@S=Y9cMXS>-Kets2b)b5xoY(GA1J_vH| zmw9hCBwiK-K>f=O_Fs)J^ju*{Kj?ZV0q{O4(0z>H@|?j3+^&6C^~rwT`{l>H!=d~1 zioGD^gZ^7cyI{HsB-|zkLi3#nWZp@l3nKp66Oz8t1R(w0m6IXj#_o{*<_gGpgc2=~ z^{O)^eWBxZ;^6jhQYG}>2_6@4I5r=Etbcx3bp(=5BHf|qbqPcAr6{C+Ok3s*-A4vF zkALFIE=V{qxP#kCiwi`+<4eC+3PHpjydmyW`e_f|r?{gJ;?81c$hfqx1f(Bh3cDB7 z85(ZPkog2@*ge4R&~(5984p+u-7oSCc7Lf5#QsOnd%{0ELdw0_%;0`s)eGqP?w_5Y z`-x72+gUF*EP zA?pgw!yx8vwswGwhyMld$G@O-8j^3$SVG)!pARywFTDurP6zO~@MMV(;C|Jamxmz! zm9&PY2R6ug2^vOF|5`a*RJ#4MF6)oIx*^9JnT1gIOG5XheumuB<9ZCXp2`k<9z>qd zZF`XW%l3VT^rsu_p!=9Kq+Hta zk=yaXrVtGoX$c2dyAjl`zR7so;o=Lvq;xMKhoamS;C3TO+|uTXL*K+Vf?3x@;q60^ z_{}B99sH83bzkf~iqfu=+_K#v@RoE<;wC`{Bj%|e-ye+xhubsDtq%V=^}?<^;CBd1 zy)O!CH-g-Grgwuw|DS^giu=VO=XjOqK*G&^p~G_f-xHODM4|19Oh|m$PjUER_V;GL zi5T=;0ZvGGxX*U@E~jVtZi_H{J{{!FnYxo4zC3uh=5E;od+<3@rTh@}mHiHD^S;jc zvhS`vtlbFiuZ2uNd!_0wFQ*zJE~r4Q%f|=)Kcl#2sw>E=~ls)4=K%*Fy4Fy8txYD#78OcCHdKkMKzh z-hKnS=T8Zwytu;)Zx4gbnOq9JuSURuA-|CY)L#ILJLf{`mmd=Fb`&^#A~PWM<^e`{ zy9+GtnG31+l?9;nIJCb0ljg7vbPR)>B={Upcst}mhC{#~iQ?-*KkPy4o8axnm~;m% zaDzp{0oD!#yFVw@0d)M=%vGZB_7B+J$OH%QdJ^s@;PHP@I|>|b&!QZ7ALve4@Iw&Z z4gssb83R7I$mqyZ@O~UnI~-iU9EgG5KO+imAA#DX;BeR+09`L32B}BFO(Ef&76=`; z7l*WqmqGKpWdL;jp#*rI6x8koyZ=ovbp8u+U*fzFXg}h!547L?9x^}mVFuLv0OidkwT*@hlKp{)v!&h(Fw*?Yd%bNc(o1D8yaUVf!1sAoWDSS@8JDVp#iG%?sKdfb4&-g0)+WJt6zt zgCrpS$b;5Xo86)H2rp#b5Z<15hRky<6@auO3T8p_Z=^dkJRgAPWn7L;hK3LH+yfO6 z$apsVURDR_I?tUDcRnhDs<(xf^IY(H77}i@ko6v(FTnTz31 zPI8B>>lOu%qrlr^XH3EKH}hvnK*Bp@7Ni_AwuFY~PkScNLY#k{5PwOULfTiw;*feC z)(+Wh42hQnMu~( zZErLfLg$yCf$x0p;pG_qX;*pas(!uzLY?AnhfM zCy@0majYlD?rnc2qe7Cr$g$mGjfploC(>#_H4rvsJIj~++gF%&~a8{ zSx7(VkOV{@{GMdUxzPQGpyTQvCqmMXz;g%thi|SKc?!boaZvf@_VTWSp~E6hkwSK8 zJr1e&H?Td1q+4*LLI`lV_i6>SzxlzwxFMkrH2wol|87eij(=%Ul?&j8ngb2DprsBE z<_Ip`n<(s181-QhXgmjGZ`zYt4wmnx@Lk(4fLf1#DR(%WvMM1&NZi5Y*W1?z%%SHb z{3vs{%9){*V<7=PuMaf71a{Soa%el}h5aiQ6G70p1lWABQU}nncs*Wx;Byxni=pEo z&czPk;@t2Vc)s}k(M(7<`(!(aZ@PC06v#Pzc(5Z@0-IQ_4uZb_TXg@ zuyL5p!I1R~JwlND^dFl3C4->-N=8Vy!p6rgheG=!EYR|#8Df614|Kmj2ef>E-9PUE z$&W{Vf%nA}g%m^5lY=j`+<0aGXXVFBzK=2>;m-rzM|RPe$o!(MI3%1tK-Y~(8bZS9i~wYOqIUr#JQ)n3^%V3z^Ac!%ou&(w zhwfJmfsO+hYeUy5{XwhOw4nR8Sm6B~aDJZ&J9kA8UcW=c^&s`~rKk4b{z?J#{3Ql8 z$bOc6g7Eqp9R6ptA^o>=;?VR1yKhzr+8$tp_?s7c9_dU)NcaXq?}-~rVK5Ie?#UCw!_**u=Nj+d9H{5I-%xELc{F=r2JnAZGXb= zZ-<^wa%?g*{fI){1MNqLR6^qkcCP<7NdIspOg&_t8#M0&-Zu$rpUf15rUy~Tx&>Ih zY%B;Z|DpRUk3q+U&Oq*g`l=xc@h`kS<%fpb7f8BV*#&neq(0|`j6**{cMoKL3aC8> zPPYt@^%mC`L+_V{*N?1F|3T(+tE8tx&1Z$yn~;0e(q==)X^o-dMrjO?@O6W=2RNYd z^&UK*vg2PmG~8LB=0N7(8DQf}Ga=`Kf$psW`=hrF?heTOBQM0?=F_3(K;0+u4>GO< z8z)R-f}}HB4v4ys(ECCe7@+QvfS9uqG7h{sb*DpuO>^77lPnH*t~VCDmB>K!8BKL~ z>)v%@L)TaMxyN94W!FO8#SB#s8UJSxr~;2q?fJq99#??ZgM4KUTSY+~Id3x~GDv>@a8{w(nRAUGV1H6iUt0ZC}R2CaXM z6`}S*(-Cyu=M21j;D*=}0v)eQgQ@=m8IPR;>jz0e&4H|&5`ouWuyq~K^9L+Spy39& zXYH#7^nT@|_0W7L3N0VlA^Z^N{0;-God_*I;QbMPsJ+m0P~iO<=z5MA=)LLx+o0jY z1r1N=c?pktq2jRn;2`HF9fH+UGg+bW2`hh~?SV5a(DDs>z6iWNVuq9p#?bjz^LB_o zX0k%UQA7k%9+-DQ?fnOxFNUs*aD&drr7=O>30bdF1+R~OK-%SpeuC>|IoP-{!w={> z1P+M1dKbXW2dyWt>1<-PR zHmp8<2B|M?c_8H|teO`0(-{THo73*DXNHe`Djv zP=7H&>Uj(3x!LgZ5cnYJ7v8VD2@Pj+=3c~9nNV%;DUH=AM&jP>4 zQUsDN&wK%ohsVI?6B%IbC1}0B3RZs!Le04c$!FoFQ2o&Qn}GuoZbxD5F35dob2K?Z3s)^J!r7)M@`9`HD*r62Ff!An|GZ8!irRUmVMXrq6FsaZyM*hxg+? zL)Xth*8%+thvc)FAEEYsfyiHh&Ktt-UxKWMnF*WkJM#t-AGXkQ=gh;P{)L^(0b5rF zYyZ4~_|q72f6L63ko6Uy@&QthLC%R<2VHjo5(oE>(|91|Ds;R(E$tc9ozQ&H8x3{; zP3U?g=)ES7is0hkK*wc$h1?4i_z1GT0u=6$^aWYZRuxhVR}XQ|V@N#+FaIw?^EEUa zj@CoNAGZDnaxSq3Y+l|NcAp75#Qh&&?aa&2^JfGh^#*Kw()cp8oWBPtC*ke<%aC^Y znLm*5hL7_g&RqeWD+Q`AAnm1-5O<4wf}~qFSb2LAT7E+AFExgj11F*74>u&=ew+vm zhm(+W@bDibTw&`LX2Q;Of!z1C12#W<#sjj?lwB0kek_5lW7dbXqZlFMhn6Ke&~Ouk z)LT_8koxKvWITs~;Rm!_`Ur6sJpaPVb8$#J>OU-BKZE4A>#rgHlZKT`FQM^;Smy?b zZ)m!)eFd3+g6H4Mkb1WjdS7lYxIDc1*w4|?>4i$mopK%r*g7RpI9uNQx3hpd-?=HHK1(DS8P z;Nx##_1{Xt>v9|mh2ZlVVDV#d4$5BD&H87!z~f=?buR~EAmL>s;&9#My#;K2S6W+w zgVNt`r4M9;;qx+J_uq_kc)1<4;DrgkJ_jr=84JC4`kOs$eGXWBW+Zsuud*d4>bjuM zkMF@Pd^4>k#uS zU~^`|_Kn`O4*(s+0bBQSz#p1VA@=~Y{D+QH-SmL=n~sC;I{?jRfx|P+1KQ8xfy^(! z$1!Xm`Lq8Ar2OfH_Opy_A^o?VqVRqh$Q-+6td7czk#>#e#Gv^Iny+nEI;=}M?xr9o z4j-olhmX(-hx9sAc8+JF@O%UocVFo6IGCX){euvE{1z-;F$96UiM0v|^Ot8dGIxO=Yzcpe0lkHF!4A<4lBbnR;vKRo|J)W<;j zb-A@_b$x2Vko7Bb zq3dd4^=4%dG(CvH+d1I+>@zIB_~GNFVD~%tLFR)_ibDI3(0-7Q6J$K`6k^;Jte(Lg zdOq_*@V*|<_$}C9J+OQB{@H`?)hmFFcR4}YwFMIJ@id4z4v>0avoL(#5F&009S4K% zUxwG4=8$o{6ll8wR?lv>fYdwf{Lpsb0!X;|K<9(zh{4k**!%_q=)57+oD$eLrvY?6 z39=szp6_PrL)MqxfJd=&jv+a3zr*D$k2}ek-%-bx zjN2VR%f#NyduP8MyiN>SFK2dw*SGyg%8%f1_)y_+^xvlHPX_GpaVN09l1m+gKnq&c zzT3xZo)!SD`vtqdG6*s+z;g>yj=}P;q&s9D_c~;J12nz_PMI55E5qtp1D{q;q&YwkaQ&nwf{e?eGa)-_p62wB;H~3GRDwx0o!ko@eFu5&joEKLdR7~VeL9@ z==jDhNPEm2HXg+eO;-$%a_$&(o`r!08V-%4l#!T>R*0{d*S;QnV|LKbx6CK7Zz^N@n2(pXt{+L&jF_w12 zW8>e@cKbI-dl^1o&jcAa(SVMZz}C;4`2+0-LEEwL`tdiUo&A~-;x5>@L~*_Y_}(lY zZfN-i?dRsiIe?a(Cf{X+wAVtQ`76=`TE0QPb19#)^GJ%hIYq2v9fu<{euKfMZxuPcagAxJ-w z3B3RAI&A&6@ndNJ0=iEPo{yeE-T4C|{~x-Z89tuF3kgryyfDK9NPcj?2(J5aIhdRKu<|r~y&_0_+28jL z-`6?DSG^X8?wf#&^DisDO7upnWJH@i&LAI`G8EWxE{{K-uSVIqAB?xno{uHcz^UvVX^? z)0LSbTS5T&mj|ZP3To-__{=pIK!mf4s90Kj^>sy zLc;;Np8V%_2hcW@Rz67w*!~nyI+0A>>d^Dqe4)TXF$dVb60kY3(ECrtAKAn9r+~uw znZ^dlc~Zw&;rmL!>b*8NfOa$7Q(%CvhXjjvEOyA04fPc;6>``yNmd%P4iGF}v;?xR zM}z^qKLE6j4&Xp1c}Jy}h#ye7@V&=lt+}8KCe_t7?JV zvl+|=zMmPi&jM`DnofrjmFfQ{)cu5x8$kD2q%}j=+X%zgNrKfEv_SgRyxgec0|}iD z2Q8Jost=1h!1jHB-9Moby8dJfe7_0UzaJZ*>tQaz_mzO%Ij;tC-kQe&d)Ph{u((;X z!%f@Dh!v(x;C3;5--k^#WPQ;k7WleWu=$Mj4%VQAB`4+p+y4S~e?l$9{k?3E`B>gL zkb3$;HS|8&L-6r-u)TUk4hw&P4g%u`udf8HivyeQS?Ev(y4GEn1+sqA6}rFJun;_+ zvit=*d_M@-oVX&;VE$$8R0jCGB-lL$MUea96(k%$%Ys4sQ^4V-QtHsr8g+S3G8?qr z0x1s}Bnlww8apK%>|Wel^J^Kj{`yc1X*W;&Y7e@{6|`>xY;RaG_I{!E6ka}EE(&5&cUomfC`yhnVAp3OYvVij!Xnj7|JpRf8 zeQlnAkVoCYEI(N@x5$_e|h2{<7so) z;p@=A>4YH)9F79V8R7eqz~P@00tttQoZ$H%(0WL)dW9H=dxc$nPl|-W=d~J|zaVVsn@tOfLPYzpenG*`>k8fcDpOYv01A0%8a3FNO0T+1RiBKVI zzBLeBp0b2-K++3r|44Blbex0}b^l9RAf(-9dkVfk0_^?(0##2^ugU83L zlc4*a4!A)35j>FfS-sG766ppt|0ksVcm%eu#|^rESQwnH5c_Mq9O8C)@-S(ChOV1! zhl~>$yFuei5Yqpi3tKM%8((4viyt(H?q@vU0v%ty0=cKM7uwz{b_IuH*}nOZc6%Lk zzLLQmx;~8sG9LC6wobzZ5>Jx_A?MkAmops=)5`fZngdyBuOKgDp6HXvF-5ti$P<3lVRy0lF`uP|3LZAZ)!9c0k^5e$w;_ zBs@S)fMRgDt$f^}s!K*G&yN|tpB-er@$-WYTm6qGvvCPS*L^|zQ|DJWH1K_X${N82 z-`@nX_YB)g2R?x_7aw0o+lM}VmBXIORnB?GxZva7VCw^xfaj&ugn6OsgrW1%Hx@bk zwr~IWsp-2tY@ayTJ#Useta8q4lm5U9ZzqGrUoLSlO}$W;!UDALjjGBMRR?4mM}$Ooy7;|K7N-LhSnnhfn$hhne#>9AWn2g!d!B z>X|1vOz6;@=#tL@bw4znXtX;-f)-xKF@pUE>c4>18+StTX*Mf-oF6Q%-U=Bf|Bu)w z4z92LY9aGw*M#8vgTU%fS3B@?Z(UY-{3d+<2;#3s@O|M0enRkhD6l#IDjl{b)!($O z6ot2|!RC0^LH8>$!}leD{VQ4O(5QB(ZFx8+yxj{{FJ0*XZop+D_K$_rJ%Bg3lob?I!}8)0_?2_Y^0Ly5Bqv8vkix@OC>`{pCCdlZNdMO-cOl zb}u-7KcqQ4X`Xj>6~7?7-3wOVoaRskJ}6fZ-aZ72FV1k-H(yHs?h;;b`xLZ~32aV7 z2BbY9#0M#F9%VqvE4ECBp4%A=`3D8z?N6|O-BKa-Xp%6zeG3jZ&m;#C`(t;uwn%{6 zU7&sq*!&F%(E9GHJ#60`*gee&kanCn-ecnInlA`% zCxgwo90R#G_nshp-Vki>0@%K3#QX@@{m;Un<7`6k{WxIpWzo>`ffroPf!fJna}=QG z=oTaP1%uT;3x?J&tdRPoU>3Cf773Xz{v!fT@1S!S!2YTXhLndcVqkrsegxS4#i5Y- zKFcleeL!II+d?4qK^Y&oe4Kf-9uhChydm{R`!&cpU9f#XYF?1_>Xc^KIGu4mrR z`AT7Udkmakd^{oN-Q@^F+F9^@J+6@Tl*fd@^%tl;33k7vD`cF1>Sue%xpvTX$Tyv! z^X7u^eh}DSn?1nuRbhMrkp4<uuoe`7@5-cB-1;AMich9K3U&>YX6r zdWH|RUFu^Csdrb3K<6F!A@z|l?3{l=NH|%;+I1GtdYl!${|Fqv4AzkOh-3+f{0G>& z4l`&ycmmqKg5KZPU;^1kA0P-0A9(%#%osXuECjCK;O(mhV`w;wfZK`r#~|w;($b8e z>5vb#z46QlGB08#0SHh`?J-HzDT434jvdeHF%cGUJK zgDxZ-1$ZI(co}ToSr@u*UkpO`wn4%_O&gMa8igV1*Ff7>4KVjhK<0;6mO%55HZ;FO z*HxNA=c&{5A?dGx9X$RCYQI7Jr3nr%#{@{b7u0`*xL*U3E?KxC;dCF`&YYQ1&4R(lqFE}6`$= zxU--g>MuoT|4SG$-!u!hPEQeRE@++$JZ}(g3XNZ7NO}!~uFKM#11XhAHC4?JN;CNj*7izB*)ScfT^A%aJaFd42 zAGkx-uRhaU1XmBLt7x@44HqS=0M#e zJlDZup#Wq11$JorK?dR;r7p-hHm3#P>vq8AsPsYFA+JT@>tVp+8I_RzgHC+l{0`dJ z2F^z-t03`lk>>D~iwL3q0n?9P)V4sNQY zOtUz$;rrvj;yZI3%s|&iOoZ)Ag|4@e%!JHq_i(`5hhX(TGob6K1mWwc!2T5}fRx)8 z-r1w2!y83AJBR>3z9B{Vdqh!t*e*x zftEAx!0Q7+?QMwpevo}%=@Q`d4BEd24*zA)^QfPQ!rOab^*o-C_Q?@e)O~HAJt6(} zFfmAdQUG12{mdCU4kHd}FZ>IKjm_paR z`~$Bi1hpr@>2szbw7i7vXNR_@Cl!w`Zkaoc_=sr6iQ^@}MjEAWE z-=7&n%l{4F^Rz+pBM|o+Li{iG5aQn?*uH5^NcuA7hqoKS?l;zgln(_jQP(e>QHSI^ zo?Gz!*AREAL(;)9#QtuGy&8~q)fGl~I}l>NGNiuYg0AaW30ps)0XTe`G$c78s4z^ ze;G)5eh9ID0h~|IK=+vkvO&TLwy!o#1j4@#y_Xnve%DOsI_#M%A@jfH(0nct!wPFW-W+E7m~ImpdZ>b^lL@ zz4u|_(ETLqSRwIm(FiF&(_rgl9zw<&d137e*!t%$5PKg@gR6(E1N;nG|8sOMG<|SF z?S<~&w1BlMp!SKn41AM;*bbq-qB<_3yG!WG`m{0(&{bYEI8bUtY2Pe^>PyAF2$nFiSUw4cy@PtfzS zroi^6L(cpDssX)Uq!ytblAgsO>w`jKq3P!*)LzIr!0V)8?OO(DIRo9FQU+U>$N=@< z2S|8df!;Tf2Hl_V`Xi)#3xS0vY<&?M#9mG4xp`+`>svU$@dP@*0$hL9t#(k2HU61q zE#aWt;w}w3j})9Qj!bayDGa??e)JdWI{djk(D|%ysOuXeOQG|^58&$+!RFk_hs@Wi zd@b$wRvZ3R6?@-T$a0`UYqo_gl3BuPg=7d4|t4gr)lz{=9uAcco+70u+!PjYn z{dLm^T2DOy-;)S$C--n7ueXHMUv`jjjds|*NYL{%4md#l z``Z5WLf37d;rn?_py%qaK-xjD^CTH`q5H7jLH3cr&aq+8a=2Ona?lTO`hm9_)6}8$ z6SVw>o!c-|1KRInfwU9h>$~(I?Y8DO;Q2Dpxe(y+Pg8@IKY!ruVTgZKA^l+)Nyz*> zeE$)wogfLx*GD6v`2yA+;D(69&KEr+1&y!2(E0+lzX?_^e}Uw0b6EdZ2I{Z3kbD7a z-=;y&EfRtDH(}>&7)wL#=Z54z*!gv7LQsD}&g}>7pM}I1WSl}H26}Ee>^vo7eu%rj z!uD@M*OQ;&fw~7;e}zEPn=w1oeCR%9_-;CKY>dxC^N zqWrW46*%zmDCmAjuI-TW5Wa4Z5$c|w;Q8*>UTFK-m>C-H;*fCAgsr27tt0&ismI~_ z`xxN;8gM>`tp{L$oa>R6b`4TK!}o_WKE zGeYVm>1wz*IDgM%h147H_SkQT`>qQ@;uGHf{0B(~BG7Phn+nlq{2N-%|A)}9{U8jm zeaHJC>tk2K&dp$e&c{K^AK1A)aC2B8?G5Ps*UXvF`_e@2LClA(w>SO_iB}EidR}Sh zys+_asQ4WSy#_Yk0!?TApCI-AZ0LC-Ge1K3X|Q%Cti2802fpJIq`tC%jXQmSlnbzM zvxbf1eS@|OpF+|JeE;kRh`ZN8?;mf2odfw160dR}A?_^5f!0rNpysec(iglx@)Fv9 z5QgMqY1p_QY~Lkx-{?t_ss+;w|Zy6)r0QU)`@FChI> z_l>_1q*!haazoF#} z8>ByS40>+ZnLm(r{23NV{KC$&g6%7|{Ri#uL)%>pKOlVfuaI;E--q=Z5{}@=MkZk8 zBy?Wj5%k585CNuYW&4^R*~6KW0P155A5a+OG+Tg_lbZUqbf{!`l^z zb0om)#Np?YJcEWabl(F~c?hYmq34Pe!1CiuNd0OHJ)a3aZtx7!&N~F#M*wRN!1fV9 z&(X4Ifu^&^(ER%vl0M<{Ru3Tc85i_?OV~Nm#<21eat=>b2rQjHfZ8hvZ=XQ&7p$E8 z2@P-9I08)kFT8w!g%{-B>K~AJhOM`O->-cRQeML5bJNtI?Rn_FGx$CQK}b4Y2R%nC z1X`Y)fwhaE_kT&l>T&2fO2*K8wcz_uVEuGnNWF}--vqMn1A3m#Dn!2(lx*Z$1t9fx zFLYkR_%k%V_#pYO6gsZX@Btdm(EEkJ`vn*nzB4c|2r)7+lrk_da5FM6L^3ik>|tPF z5MX3rsAXhecmb8~V`O0X00}sTNsJ5(U!d%%j1V(G+-Zy;5`ojw(oSnVUxIBvg2S3R zPsfD~la>dr6>=z9^*jr7-ybObo#cGzV0-=hLxn~mhxDr;@e`2rvw4+6kErR4wuNjC z#e(-cBlUS8;z6q&vQrP~fBnqr@aRchJ80c3IRDnKfb@%5c^&NDeh8QO`3aI=UMz8l zDY~O6yGGE#b)HIW_LhARao?w}UTx_FY+Mo4?~V4=gxC7^>*{z32a?SQx^G7qwjR`8lVXtgltUPVwm z&b(L*S^t?T?(o$svMqr9IHW%RP~eaXzR3BCJ?NTTy!0smn`)f@m zWZm1#zxJSYwJJxqLhSX-beP2Q&@&I)IDY$*rmH<6xh8r4R%OLiqML^f(K857h++>KjTPSpXd2g3 z&~R{qthdpW0H3$8UoUih%Q6RWeBb{0$X;6iu1Z<_MW{QSp!0yg z!Rv2#Cqnxj#V*kGKg{6u6^9KjL)F_s>Xp~5V1Jj3L+@uvvxDY~JNDN1{d>A3*>zE(p6{Z?gqd{b_Kz3f#d14F^j| zzdaCfUn)3$&zM2h5j}>Shp;I14;i! z1t8{y=Rv~F*Z?{YD-L$g+dt5H#8?kn4nX=T#|w5q?SsvG@`1~b0QT!pcN#f>@8|A@ z%olz3VseCpzYbX4fm6JY{tB}*RJ|dzU%&{Sul^%_3hEvWX!>D+xcd&Q9jFG)kH;YM z<}Mqc=|l(Y|M{~Z<2i`?%e0~4{0}^z{_(){A5|I3)wiBvf15&>Vd;pg-p#6*x^Hrhc*cIsb zE%aQAGq8QfLf~)_?!EyvM+I`Og{%ZPeYqCF$`jbUCl|OLIOVhls$K!=PU!jA#WqlJ zRY*C;^A5ajLBabt)ZKEBcH39zJ$-I_pyEnUaTc)thK6lmcNrVQ&Rc-=zu0SF>0b#N zzxN>R;SlJ0d-%EBB4BsjyL$_gu4c-E%>~_q30l9S$Bi%_Hg5|KFWCKA3`)>(Hpset z?N2+P?oou~pLLM?>}F2d4HcJ!^ba2jfz#izEwJ)U4q6WLgY{i0g{6OaFkfUHKc5(?wBvd4z1U=K*Sk*Aoip|&n3=H zhM2S24O-9MgtsTb_8L2Z^?$r{7qb4rrUPn@EqGlZpDruvc#EVlWPL;DU$FZ@?N3O( zU;-Jpi4}#W)Ax{mc?0ZzaA8QkUkP33V{8B&|5*TT?=67cW9wrGQTLV|Tuy`9W8i!+ zQy-e1A?ICy+ItZ9>w@#uI`_}^plfG9?OTX@)S=}M7kE7{=sr+zd@(@p=bgy_o_7MZ zGr{e~G-YUhhn_nv4m)>I1$yrE7w~)*s2v3{2X+oWDSbe92k?1J%`YJ3whwImfE*+~jUnR$dtvPgW9T?( z;2+4i2z(zsbp3}hD9WssrYL`ON3H1Dwuh8?C*6fD54_be?L&6DEKSIJ2vJN<=p9z{Tp#38T zXn)!mvM!>h9af&RL*4%k9G;;14wC+%^E$@DX!RZBK63Ym5@7#=%6XW2@Ho_=w~+8} zfbMUd$q9`I$T=<_F6;&COG|@}Q!_yP1!~7a!WnuF(K>!``*bO+J$wc>Zv`E{daw;{ z4*1;3bzal)&M&~>2dcjy;Q%}L2@+1A@f?s_85m?B+BT zbt&u|6#=NduyI*f`+x^(4kW#$J%WyJz|*G$IR1KI^&JBTWSp7{I`0Q>&%@3Uk^raA z)?V1SA0M>c!VMnZQ-+OW%wz@UAJF+Qpm0xn1g&S`^T?2K&JF3X`jiC{Ubak-c9Tyd z*j;DN!0x$*oj?5^GTv+qUC(sp4J2Lfh0T-xfQ|=3=VioU^G%<@>9zk5WZoNe&pX&% zX|VZ6=y+!UY#kbOeb^yhh&xuo=A*wr#!+UngVPtNyoJQq2Z%dh^FFX~fHSc9K4EbD zfa*s`xdEG(gsxLtnFUQhA0gw&fsl0tpm7G6ddR#Lq}&Cy2VnMs@+asVV$irRs2+i& zE7-U_B;KE`fwfm*=Pg6dyPo#|eSQ#nK1~>`-a(wh11hIM^*$urVB_Qxko+EmP!B1W z{zJl>uM-?j3=FXG@bBPxFi`mkaX;+58YW121iyD4cAqt5-vOwchlB&{Jeeinc~?Y# zmq4&;f!0I8`{3djsB|Hz}@3d#obPbsw0hJFh z|3dDSM!S!`Ee2yZ@sAp#F^nmlumS zh{DHp!RAYbK+7L~aC;dvJ`7H8&s-fK_bT#&_alJDc_8BU(0CAljLR;CwnH|XLF;#Z z@P5!ganNz3Gy`b(@PPOAfX2-r_8LLvN8bxW;}<&aaYhF+jx(PZ>>ki~9a#NL9kBjg zp4{;9E3kXg)S&yyg~8<*XdDj`o~qz>u)+og@VaQkIG8e6UH>6OzJsV&0qb*!NJ5u#oJ+O8G`hc76d^I zXD2k>Lhk)ObA|_A&O^+HwTH#P`gF=zAmg75O3-!=KUhDg9)YNb)YBsCeuL8$sGNs{ z4|M+Ks|YxrLG5aYI2$w^m?8DmQrLQoKj3zQ`@>t1^&s6a_y2~bw_o6L7nH8RnH7HC z7o@$)5D%U|njCjyI@G-oRUi@+KH7DbjxwpUY?hzofX~-}y2|@UL z2iQH8Sq{b^hbF_u38C{omg(SgTXMui9ANVx;PSRO8hSsMhy!ds1uQ-}0@^=)1084H z4$038LZRtF44mJyx158dv*J*2eqagvVxKYbZ4Ib?1e;R~Jx90kEx5l7>hFWoVUG`V zoSXqXeh+Hjg57T!0PUw=1ec5OasJI7VE-Tb$_dV|p#Cyg{Y`K1xcRy7BH(dEP(KbF z&JM1S@kwq8ct08}-rx=`H&`J3by$DD!5Ol@w@?&pKB!*|Hb2r0at^bq7-~6l(-EAn z&YbyW4?3O$F;8I+S=ZQm96oOX_U{>c=(x%s==ehgwA^q2mpdue=fUHIp!o=}y^_w5 zecUR{;C>`%egWcs8|Z$J&-Q*v0ueL&pz{a^VB_^S^92r$ z;PI5VHGjeDVBh|Mo^#@31)Yx*0{a)#KLxvIrUhi*uQwk!yyul2fV$rtGQVSf5$dlF zXt==6wfG0VzZf*%0ZzBi%pv>f!oNV+rrZ@=Y4**?(x5hQ$!!ShDi?T~xlK=lz=oWTg1u1><|JHYAF*box_y9MF( z1w`BcIu0WO-fs%;5BeB7oCn=cJX-=%FNIxzhJ!XVUxh&@+yS}g2sGXc z(#OC6+aC(Kuh}&GGB|!$s{M2*Yg#1dz5~%e1-tXfEC=^cVVAq?F!2*$^)o-VVzdLn z?pK4I$MV7czJKp@PFD$sco$i1$hegP!?!0x-e2(Gt5{S>f!(qQ*}K+m&nhNTloJHVC;vVIEG zKLXp!027Dq=YsdAAoKl)zKX-!Cy?+LgvRd!@Hh;pT!pxYA5xz%K=unG`a68k@k~hn z2-GizxKjWs4!t)g?+{c!4>Z3_0r&qv^$5g#Zb-Wz?H#!N4yqR*?%{;GM*>WP`kOHI zka0Qa_$_RGf-yV9Kd&L{+Cb$YBpg_v>E|4{-vsJML(FG{mVc0St)THhm^iFG53&bT zK0y4%22G#b;QR+_cR|tv3$#59**6C2&qCDy1Gn1>Y$5#-P&o{7Kct=r+yNcuf%p5M z_vbDC0dAKe#`j?Rk9fi11ZtN;>}7z4C!~KT0`GVK0r%^;u5*I@2O6(~_zQNw5~N=P z8t;OMYl1t*Vqo(S{og;}@?wYFU$8&m`I>zr;I zbo>XsAEXElM_Vq)eR-g98;HN4_gK9C3vO3~#zP?C3A-l?5}u&^2#Mbx;PJ=S*MboL z!pC7gK>M?7;Py7C{R}bx4LD!9KjeV7lOf^o5!{Xm+`$HJ@59?g#<2b-dU}K2vm$~R zH-@<90i>P14l?fvs`nx0--NEOdjpOiP=1GrLugKL_#^T!Y`q*J-eKnVANr~h(~p?X z1*a?FBbab4#Hr)y9+gUvVQ2fOcK z6$^O0R0Q6SxC|Y)gsjg;n7h~jx=9(;g-yL zOC)}Seb2vd82u8&ai zpVX^QpB)((Jo;-AxttgnK9pTP%;Chqz|rJ%kq@L#udRazM8kDL7#T5Zxr1A~Tg@H$>6u5Yf~UUL^CrHd1f-hUH1#K3Uo z-zHZTCkBR8QywmZLktWbJ_PlBJIKJGl)Zk1;voix3GLY>oQKp8EUnYAUxlRqMJa=$%FXTB1v3_7#RM@#`h~YF)&1kJf*ry8qf+1E=GS`le@I zZ$i>Pfj4TWpc4Z_N>HV|$RP%X9OXUS>P`#{(`?R7(?7((5YzjlS<{JuVV$bqO~XU? zC!Cp7ICCpf{8`Lq$!2n5VCb;){s;>13tum!$vQDG+>6^{qUglHP*nAFHOT#k=1a*d zgTfgc?1=bdNURh6a*%;xg`@9(22gxSl`Z5v#K3T)JNGpxz846cP31nsz#wr};f*w0 zKiCimA+R@Qk|P6y!E}Ys;B-1Eb>^{y3=A%2tc^mT_;eG}KjX;2@Z%H1Dq*MXI}e|E zbYmxy{~1cJ#P2-Fz~JE8lm6f!14F}yWoFL~GB5-%EO-71N{6P>M_+*GYfJw9IXLN; zla7V$J|zDuT>NtG0VsdCwL7c@nWI(h1+%DXKKuE0T|NkLG6MsW z|BW?Pg3g^j@J!Y4f+GWi!(Klpka-KTcCC8`;+y6+KXPPXI8gj22TgQSP^9ar2*%gUO31lj#BK2|h=)Ge5zod}{8l-bfjbi*-52avu6UO#g|`~%T5 z>JHxJZ);uOc??;9!-rFjAaxGEwZcK_8a6))0r3Mu9g9GGhucqsLHvd*&x;-ZhY4R# z3qFCYpMjq{9;A+8Rlh4(ofd;Tn4Y>Y5=1j}@`BAvXcfplnAG?+H01S3Wc>zwn+rku z4}9&(2dOvs{iz(ppWx(C1)>vJWwJr^gHz1Kjxm09*VThhBkN~aI?EO$&rlI=4ARfA z?}sUv_6)QG(G9Deox$|JMBjtD`>YBd@tj4DKL!;ii2gn%E08*epGSj0<{j9u3+(O# ze0C5%GhYNq9u{wKT0~M4EFNd12&P58yMSrGN!lQ~p|{QhL^A{xs~)`ngW*)+fpaMC zcT3O(*~f4}@Y4a1p|zQYV1CJBc`$vh79!tp@`6K{M*9*G;|nPI1Ns@j<~Ot-0PDZO zDgovP%!aI=%!!f)^E3Pe9M>F3t0{kts(*q557?fJ35;NM7aCc?e1@KBVDlDi{|0WK zH{AGjAoTmn!;g+$M6sWtU^!SF!-708?Qs4Um|oBb(Z^8m5X@iU!QgoP(rLz<{g+Vm zF9?4PHh+QAAF#Rw8=ivcg!E@%dVw>9uMqY8Km%KtNqxa(6#WchXTjaM__IOo z4Vd5H3^i{nM4o~7lEcIBitOHkYpD94Yyhig(1-Y+;RN*DUThs43Rc&UbOfR}89r}=&`j$gv@Ud=;S;F*1K9i}O8vvYP;nTdz65&y%(Z0@ zehqZ}$03M682Vu66M%9l65a(>cK~{yjWaYHwrm2M)3EOVm}W5Abl}FHq~a&7cToJ_ zu;nn=-wl~icNDFGsF#GTdxYM1x}nM8kL$IYf&O<<^fS~z&qHr$h3IpKu3J=S2Aj)J z0(DpAmIIoH8D6Q|-b2-YU=>8&ZD>EdVKc;>`h5`Eq6tD9Om&!}azb#H=6zKC0yPl* z9CIKvEWCsEK=^WtAav871IEX6BU zHvM*1TU3Ce|H9P9W>7lW5VgMwRDK!Ed0GMDdjy|p1kn!?(vm^6!-=c;j#Hl4%>MA{ z0ZRH&nDGScz5_0I!1RN6k0ADPT?X?RZr=g(87wzJ_zY<2$87~f{?J_reP#zloeOk* zVHd<-40E9I1otOYDQ(!)W`8hD%a1IhL2mEgxXe!Lpw2ps>8vcq~ z!0H(GpNG&(p!>(RK+k{v3dxTRUk*9c>FVDU+y4;7{|uWT>6F2FJ4FAF9+9iZ#~R`f&pArO5W-45voB3;>H9-+E_4|MU6U^axdSOB3FvJaf#`{2{|<1vbU2g8S8^BXqY1k(q$T?eaoD7y#dGkk%RPYn9U z9W)MKJ9IDm39A27AoU!B0n{G?(0nrkI)65qC(1@IOHP2elSXZGe_9E2coyAArWggl-7`Ljia@o5#OJ8? zZzzVy3qb1)31~Sh(G9V;p#>t}0QDc-Vkl!4q@H9r3rVL8cIzPejzPn95tN^h?!a~Y z#qpinq4%3YwKLQ}(rrUHG@spohQA=xybh?pB-R};(%@M5 z&}Ptj0G6I_!OrbQ%l`r85cSY@1jC0}5dML5h`(3#LiiT_5I)S^FnSuaep&!Mr)LH< zJ?vQt(Pz*Hq0dY`aI)5O=2Go9DCwWU4Z4o@1vLH5fTkY?Xn7?9%})Un4%{{0FI@Kp zP5&Wid9Sw=V$Tm~{4ZMr;d?;CBO&oX&mV@lj@uyX@Lg~49S_fq6uSKB1FHM4Lh3DsfBPWrV}i8T9Lz33_*~F*;By4RM=!s0q2YEP zTHl93^UXbIIO;&-(Eysi;U0%D8q^{6RRc4mo$U|_Y5z0$?1$L57}7px(BI*pZQ8S4 zUG5`_`yF(k_3RgD`uhTHue^Y?ix{e*>4{+@#5{<#2vVRB5`Q_+a|14vLev#N^W_X^ z_UPdxrhB1 z6!$Yc$b^_*08PIPP<=1jAmRsL>$xirEd07a_$w1+JQ`{_1H%WX`3|KJ`x2@k`WT!b zdrA%o?p?B0O1!v>nXU$ zp^O{Q_-=rv?+ws!uz=Ph45kqM8)_YjPc%!v6GT5Jzz$;X8Cd%lS`I9L+Q$OzS1>d< zY@N&V_V_2*dP}JNZ=vn43$+k)CR9M|V}s;lh6QC1zQFY&;gj3M>k z0rtCKbq9>0{Y_O!zG*lJi64e9vku4_ODwpjDCvM0e+C&M0yWPUte=5F0>W>A#(RS^ zgwFuGj~S!~2|vh&=v$BkQFj2kpT8jz!hethp&hCm8Z-QBj6W(s_%I`^p#AIycZfOA z`ln$Fr2WfK0NuwibN7L>2NaGQ=c=H(e?bb=JZL+J!5LzX1GL@55CfG@gwkmBHv?=P zyE{}Krrr)>&Vg8{xC)eJVEF$Z=6H(fZ7Z6efXjWTN&gmdg2wxyJO&0;b7jnNL!|gq zV4l;7tpC7zGw?Vd%z%cyjltmh115k*H+;+v0m(NstLB4fhSzJ7LFOsQ#T9~Rhp8n2 zAo>84PTWBc)zcZ1Qzjwje}T{1MIiaTi|Sc+iyN>WNo- zq4z#Q0&>z5_oX0vI%aiufarp#*>gek8m=odL9~ZZTsw$v=!0! z$(^8a^M<2*wg*Au%&yU!&V%d=-MV-;h?Xedz5_&G*mYo;BW(Tx;&d=M^@R6vkUc6T zaeF}O#N?z;fcRp`UaLWLTK9uZAe!N1*R+HDd{PNb{@al4zrp*s3#8A&O`sX1Zimyd zJ`lfQc2q2gez0B_+#hf7Z1Zs3d9?k0$m^ZR<-dfl0a*Qs`-@vZ>KWE&l!E9Fzc2QK zXoprdaC#1~60ZdD!Hz~E8YXXa0f{>lu4@F@e__H)uzd?QPAUQM7exL`2Fp)$NjO+t zKTUG~vpvY}XPC@r3YOoN5DlUkelnSX^f9chh47C!$%6SYo^Fl~E7m(pz21+a|4Su! ze3^lf2{O+6Ax{Ua{(4Fvm}dD4(O8^!1lNO0JjGl z;ukuC`6qsffoTH{ZAY8nvs^WwQ1#z9%?Gw;Lp)^sw&2w-aJltB;02gYxCj|Xb#S?J zpm0J&(Y5s`^9KwU*71VPe-QHxtp3BlpWt$?q4WZnUZ4sYpKX|Rz+qDGsj$*LDDwvl z-H*>_^m%4DKHqpRUUeDj{Do7b5=g#* zv(pD`@7z6>U|P}H0!-`Z$b)IFUX6njJ=HBGs?VULzlJo(`3x4${2+4}8lFJL?;B#F z?ft9o!STqj{j7uiwhfESZBgeR5~e}Mn+?>zfaCuFA7s2+A@vPdp9AX^uy{lAS%=k? z$;>75&!gDS;Jgbg&rk~4|KG3@G7i(=4Oze6PzD*lVtBE};eb-&-+5VR^9O&R{fh!< zKeQX#k35hMwx8hvw11V5;jm8ozR*2o)cFI3z7r7ppF_vp%%S7JYUd#OEuih&!YvN( z1+#gMo<-BY?+jSK#VZbQ_?>8i%$qncJ%i}~2noN2X-6GYkNojB{en9G;GhLiU%w#X$qrv6%3vK@41k_#&sJi3O zaq|-B{da4i5%e+;SRK4=XAh9KU_k# z&I)b*AP(yPCTM^45v0GcKih$PJhYvC3et{daDeuoen7@$874scQF5ye7$)s>zyA(Z zzsCh|dClO}@^iy?NccXmeSDxV?qG!L zmfI-tcOV2B?l&OucfbxBZ(5fi_IfOZ(D_Fkj^(6!y-`7(zhGDa8NX@>I0SYt!xLzE z@BwTSvpyNBc7CQt_&UW!!gEs%c z3fc_@MC$-2OT6 z=sbA-LqWF~(*9Anp6@6Ut{d|YZT_QSBBXpjPyv~zbzpEDe>6bn8*V`3`71O(&sq(MhdWe5Cu9G|aeMVr46fconIbR0(k+V3xb`u{)_#2pI~4n!Y6;c_Jw zO+SMN*uM-0Q1v^SAnFq;A>s?5{pSa12MoWoIhgpO&VMi*fR6V!xI)xB1VHEu&~(S( z1mQPiI#fCC=A3f~RlmbuXg+_l7;JAt*A0mJStlXen-Gs_BFT%Mqm9}NMg z!0H@cL(8cjkZ~-B572Vt!X$`!mv=aL2LFBeIR$P0g#kLxV0#dvP6sl7*>DRwE_VXr zE{0HOc>qo|NW=>0c;P%~y{7^l2h@R%qbWe^MTJs_jF>Ejq{FE0XOMu-f9`>nL#fd6 zD+QV!ek_5wD`bj;$ssvUaowjV{%1G=9oKh&j^9^6?b`qyw?6=#|CvyA;Q8;Vjv8st zklUXO3=FQ|@MBvzrL8^BAR{%ONcrKXgX(zg76if z<8BOI5PpNxfdu=d2GXyf=aqsT4X370~d#P~@<8i^4%Go7bq}uK*oi4uFn(2Eg0_b$0?R z90L!WY|`4V{R2(E1GKz30iE|*03AOxfR39gK368%4{J9vK<5z@pzX*9$q;?8`BjGC13UOqLZ|pb&x3(E!vT7(tN^tAya8Gt zBtZ2ah=H0De&BE5f<_Tz)cGHV3DEY=0Z2Q8AqUc)VhDkXH$dkvH#8r(HGSF@-T*ZH zC!p#50(5@L0D6wP0(AbBAr%rX4+;;Qc==F^u?u# zG6`rurwm$t$3W}d3DEiE6Rps2L>s?_rE>vjIJ|(3+h;-i)d0N*lEDDNhs7I=7J-Iy z2(+Ex0G%g?h3f*S{~hWN2#fs-X^=ymKVooz&hs9CrdL?J!{>$kpzi))AJ15H|8g9f zeg<2pJhb1@5CnB6wA^GcgYqp7hr%)fp{2O%MfdM*ibpYy*1Zcc8cthOd z0GpqKxd%!=ftLRakoAiUKVbD8G#_n%)&mV`4)t~#yM>m2LM=Z6pz}5dpylrkSi2wE z|5=a=@fSme18;&%=1e=Z`8x$@d2s+b|MdXsjt?aecOQVxA1+8bu>PLE?Uw&vQSJAE z-nSS4?LYmP1hEg+e*FOT2Sdk!`xpAv4*&j!*8YIa$H3Bu1jJqjdngU#>p=O?aD!0^ zuyrlad6EWbzGEQ91|NvM4S5cE zYftiJE=JRzkOh^8mfH-_boc<;?qPt=D>XPB&5}34_qE zdWivMzmJ2w`<&^sOn;(=e*$#=askX7=z6CFXnsc29}ZK?r2hqzA@ipR zS0MAJ4Cf*Js)p5&@eqbfTOC9t{}#!k&z~L$hPa;rcF#QQ-i=s@KN_Iz%LZ6E1oJqQ z?ts=?3!w9#uzC=-4y7RiV*Z6<2l-4kl^^KypRoRo12i6B<-h@GyTc&};tqzO18;Kt zg*M*&hZ=qkaS-_&=sJ}KXuB2Ge!Kx)55pjHV7l3b@DsS^PY*!De*&!jg7yPp>lQlZ zJ7ky6F$B$@BF&#MfX*$1goGu;p9}&J_rT^s89wZX$fM2MLIoM>A^rabbLjl*8Av;d zffKT>qQMRlzo7bj-}~j@`B#`$Fb$hGWq`KtVdbs@v|Yqt0dbc@phL?op6_)#r67E; zW)J~AryF*z3Tz$~)~|$@-$n;sN@ULj&A(#zKg^%d@|yuxkHBbHxPa_L;08$_vVMj| z?=(Q_KFo22%vXG#0omtpVwMa@A4AX=KQL`AX?8H>3sL4@88)4O%u|>wNClZw zFmF{cSp9}JTk$_F1lM~=LxJfkUVknCS6Br?^`iJ_t2a*wlv69dEEWB=#b z9%5iv=kP+q#)*MpLZRVBtwRh95v5-as5`B8{@G)zx*56t+T!wdGRU5aUcnBKy&EPP zf%lU*oD_u2$Nv5To;SR(xT+SU4jk}E`;QW)odk#Xjc2>S^G6-8O2P9u5zEE9LFx^r z_=Ce$p~0sZ#0Tp~A{x#_f#-(~T#^Ir^I`aK%ol9m0xo{=ywnA=>tKBc7L|n^Ec#Lt zE^&4%lK&YTzODj~-~Ic@2R`rK;HchQkU#dkbeImJ1!OJ3^QsQ*8^RpJW{9mY>)DO0 z|AngNF{SxW@c-4|4cDIMgx~ zVoHHo|bsT@YJ|Cd=WNS;CGi8+X#kgrk>vVX;#Ef9CH9rXqA6B3IH z9Zx>8eADp&Rsa8v(?_t@ v!1g7SO3VP6lcFm-2_&AtaWMfzGkkpO z0}=-(Iwayp?PhSk@mS3SUjNZ|;p1|UdWjl!i2VW+YC!xA@iqkqX9OE^oQOP&9DY;s zS?7V|CtUDu1<^8xmBH&(DiXJV%LN8j2k`iL!*=xu$2IfW{Fa%Z&Yw=%3NG&(F4Z`L z+-K1B2a;c_?t{}Y!)IRbzBmTfI;VqszC8Z;P#$&ubmnQW{~Fd6x`OmKG^QtjXogwA zko_-LG9mrwbM`8Z%$tgDJ+(sJzxAEp7_9zBl@rMQ4J*^Y`H124FC(zH!KKgO_RNV+ z-h=E8+f}^lFCzP&AwU_tPwRjf6J(#=Ef=u;2d;3(gUn+%wil9rE6G|AbkuuzfC~qF}ymU1m-W$dFZfA%A5IhHtPJX*j-3G zySNB~)yrr@#!HfnRKfZ<)@-koo!qHpsq6 zh9=0q9EW?a4kSx!-rD;Jb^i8&$!oB^4pxwPz=mIt{euUlLFV%v-a+T#Gxj^IV6|pq z?z)8%|7Q+B(v^cYG~8c6+;K+}60ZzVi@@$X!Yt@`PIUf;Mt{`#*9Gq&^M41_--F#@ zpb1&W!@vZYH&2j%2^ME4-*G^2XKU25&v%gX4@1KR$UK=tA#5EuWIk^}6l6aUL+vrJ z{sVf@`58po2eTBUAmRRig#jGzD^44r0q@n40@ufXnah&$zQOziEE<>9FFuL-G; z@OEh7g2Xp7CzyT^0Wr7W2P9k$l-@jWz2)k1^+jm&uMCj!wFC*MJ?kLz(F)~|{eTDb zA@hR_?~WdLIZbBf;ab%B*8`KN$KT=~1BQgTwU%9vcHK zl=)MJj$p`o`w9Pkfc<$#2eN)?!c@pU;su?M^mw61;vl!QQFc)Us{Z%>;C;gk6U2Xm z^?zxCl!xsP!1V!xM>8AP9VQYQj$W!i7I!X2(Qm-r1aAL1cq)SDZzu3A1h*eKvaW*L zZ42CAg6p3L62J2ur><#Z;`ofZf9=3&Ncq^-0V(e{pRxkmmyiYB4}BRT|KqO^IGn(d zjzkzfgRDQ}PcZ#_s`n5j{Wl!s0PAbffvk@@ z@>~{d|AoVl^++$aL()}1$q$E1N&VTpxoG-jAp5i$S|RCQ;oeVhdQFgi1f~~cL*}I$ zLM|To-&FN<*C|x}4AAkL11*qw%mvJle9RC78BcCl1)0ZWc#wKv=@#|1YXs2dUsplY zF~mT}fvce7@TZ~cU__wv84IR69J$4r(RBn(|A8`ayfd&s$~lHKh`s}f(0;K3bbrj# zy$2?Fui5p;4R!vNp%~(ChV794a>FjjdZYy%kaCD&H)LM&z`m;v`Y*PgT(=2L|9{B7 zZ-%4Ldm}2Kbq4g7}CbYEyV)SfBObi@LkkIjLuYmw+UuwkhU80!43LkMKu#)40fbw>xVbUa)II{$wIy1$Ge z-Qj6)Vt?ixRQEG5K=b{4s6R`f`{|xQ*R_d3_b0YYanL^eKJ9}I>io08R5oz=C-4%| z{xaAKX)n!q0y)3cAp_EmVEFOTVNYId!r>jSQ2oCEy1z7M1;qUk(Di2Ud!nG@swbfP zQ6Zj2kO!dQ6fqAH-(Mi}X$`^9^%OsPAm&P}Igqz?`KdBqwE5$Pe2Bgi&~;NYp!?-= zp!2l~(D{fBH4ZsO&atAgX!>FMpBF;+!TUne4+8^q9m5Q0KAg~V;KRDkPfl5A`wv?n z>pd90L+WXU3TQg6hps2P1Kr2hwB|tM-PwQhX1zfTzk87O6~kO;`ZxkrZw*}!DhG|< zXV7v95podL8fbYBTjy{NS{^w;%Y{peA>r4**&$**-w73N)cJD;3urj~hn8248zJiV zK-ZJO#1tePQuEH2p%5 zeCi;44Qy}263Du-1}A9vZG@IfPq!WrsZ&bZ(So-B@d$KZa}RW#%LC~86%**Za{+W6 z5eIaA3Htnf26SF_8C1UkG#@rV>mdc``Xt!;3P`9UNEvASWI@_(3^$5Ypw3@2yn*g} zoB}y#g24!yek!2pwgbAJqh+zfwG^pZi_56`oxCCQ-^VsW=D+P4A@ko(@sNIdO&6p; z$HFP(xIW%(%?0%NZx84^_cUm_^MbBp+5p`@m;v<%19W`|BIF>fFVOm70W{r&K+8)H zXgoC8h@Xl;h+JfC7|oG5+*t*&qzG*cMF>PPeRK{G3ff=+0b>vXCUig z8El~Kk+O9Te)}^zS_(g-mOrrhq6tucSU~q-J3!0L3()y%*t|5tyM(A9hm$%_?^pgwE6QKXgZC7v||`@pz8!% zp!N3;=z5YBlN@HPUHs|p^{=SzhwUpp0Bv_1fVv;H?#Kb^e%Lw*^zyF(x_+wwnm-eu z>$YI?b_~$?V^D&|2g2)MRtU7*Isu*k4uGzg;((T88=(0wVakEyFSkw(WJ8<(mVlPa z0gVvzKS1|CCp1C$3D9}i2YC(_4pKdytI+f(K=YLVbiLn$TuAz3P=e47kr2AU@c?^; z;K|K)sPoqi<&gTtVIp+?dK;ua(NF|w2Q<_`=datgIiww#@TnMm{(1s*pEiRH#2(nX zFW9~f2H3ncw4H(x{xJ8!)_K9g8@gT$z77X!J~+^kh$GN;Hf-M60$Lv)f!4bU(D0p5 z?I5?=q~gT(U#R&n11i4(y8em*Iv>x`4hetQ`W=B1hwU@}#do34pNBxxZ3blCl)(X7 zZo}3g2SCe@keLTg`0?n5zCzo7`~W(C-vPC+0=oVQ)}APUu76UfJ|Ny=_2-cc^qz58 z5FCK67w&+rdtrdCJ9z+ISJMDZ{|w;{JF@P&)cd2&-^13YPJq_e2GIF?*got6==^wj&sz{lEqvNcb&)rsoC+hdW-nhd0b%gowl3e+0IF8rn{I z0L_Poq4oC%Xuj53;E=Vec?-t;e*gCrw%~#4}%&+-391+Qio(nep~?EN8R9aAU~gHp&t7F z?E}#EMg+8;{{c;pEYS7@19W|4LH&Vk{H_%zQ(^0zp)R-v8Q)-VfUX}FfUbuMfUfJk z0PWv(EI+W)yMxCx3vK`R4`_dB0kj|40$soV09uYdfu_qD(DkKIYhhG_B=nq#7HGbI z0BMgkkk+trSi6d$IBq@5!ldm;}^I;3E>}bkMIPY z#|h!VNTl@hfiWLE?*fxr(CM9rWF7-U(JAo!EleJrj!0S92eMCLr3rW+`Gdc|7J&30 zNZip55@&E)3!Vp0SZh;`ZT&&P+~YMM^%oqxAoD%xijaBmoKxU^yauzLgZEQE=&4P2 zJP@umH_>D^a{YT?TNrqr$>E+Ac%4MU(y}s;y(?l(!SneKN<7m+e1~o}@IG^N_cKWT zfSlj>PZm55e}Ly9WZ&)W`QUkDhUE&7{ggtxbR5@h3t_JFScz;uLqjxpo}l4V4`lwS zUIM)T{lLqm;CZ$6XGQjg84b{`!!Tb$} zAoCarE;^39al#FpUy#qQWnl1lp#WCbR0W>LZP>oZ4dh>jt~|)Pif?S-`7j0#Ho=2f z_HQ#hofZhvuORRP9DX0<%E9Xn7z#ze=T|oDtjYq(AK1|qcu>cD8q=TKJCW#M(rDq=AY}}me={hk0I#zsP)G&u!*?*B2;O)9 zAk!Bd{|tB5%N_hw_*wGEL)87(GYrA|cMDiogVV>1u$f@{7ZmIUiyz201>5hi%01#B z@4q&cr}I(P4@}W~1)gu7bCC`88cs}-k!8EWrVEstM4@Qk1kh%ljiQxUx6Pjbe`S^nNjfo&}hEP55 z`K|&V>?<9Y3x55mum)xQ!G~5y@O-;Xkp+0&z`L>o;PnJvo*O{t=Q0?aOXvoLgT@x8 z$p`NVe-&kFM_zw$=h4|-9VZ3`?+Yz|LFYzaam{@WI=6XO{KA)@bC)}|sXY~UVqoxL zyc#Is#9tX@cgY`R|8~GkQLy_9R6D@uEtG6wnhCP6qA+Lz$o&(hB{YEe7bedEr(>|! zk-~3D*%RAG z;P_jy@OJ~q-h?a3;P`qVfavy^^CpaH7EVvD6 zKRT&tp5b#pxV&>nF#)gpV)%9iync*f z`c!cKTJU~3IDV0w4q)k|2Ey-_C>AF);W{Gy|E(uqYI=zu)36vtw-4k<&4UQP&?>r9#w& zKLeM44684K%M%8LrQm)44c*7V=NL2OY*BH1(^=1PW*5r(1C6FIaQ)@b_6VHr7i?Y* zJ`cI)i88qS3h)g8$B#i^Q`Nz1(rabIZLc7QU&AqT@cJHxmN@V_iUirE;Bay{DGs40 zOa-sYY0&!(US9zYG^F&yFj*N=|5T)b{n2p40G!_(T33O?oxyt=xIAwV^7R9U2iO24 zV(B-Cx~fy&pzv#G(*)b6kPrjT&kPPV;B^5F>XGS=?fHN8-!G)eFWD- z4t8ANbq^DCK7!Z19Jts6mT!2Qlzq_f{>S;74N&Iq9qu2B0lDje;!kirEwREKydG@I zLw#`m7x@drgqk2Jb(8z~l%n4;!K` zgV!f6cnRmH7J%u7$by1{46gfwZKYAy4+Kwy#H->~aDBgn z=KwhWHrQVUyPJV+YXK;H7-GCM4oaL!s91OiMSnw_JS1Mr&w}&Og717_cREb{3|`m8 zkX!&c2iv6D-!a@~p-JE#l=TNU+TVcFF9ZK{Ly)@_l-GgluRr@Xf!9ARc;o@L-(gjB z0Ld3}jG2yp?C)kJ$f4~2Za5qPUSHZU{T1ZA4IX81 z`|ZIOBXIrQU}z0KPuzh`HRRyaWM_-Q=cxLfH~ND7*)aVicpa@nyJsedukgDu14J{d z(Ez9K12x(qj;;PvrLFg&u3yk8gPhl`dIp?-4lHhjlz*bvAnno%k0JiH)$lxcd*+JR z()xSI>7U_+gD2SEE8HOMOzj`w{Cr@)3piXEHtcc&xufCzdPunj3O3~QFSHvnKi|6m zyl(42{!j3EB@B1;A>~S`6(n4CtcHvygY+ZgS(6pO_9wWpgY01lXn?F^xSiUVcG;q6_;lTRG;QrqN0mynHg$BsFBZZK+X|3@By;^g@NVdfmc&^uaIX)T|aO@<_6flhD}$&G=nr` z-sZr8ix7SlbUx|oR)-rrx?Zw6sPq4SR)OmWh7Ic==a(2{{{Z(_4=i~L*5A+qnU`fq zndo4?Bso82>tmGk>kte{9~M54b9x@Uhnzpra0NDQ0X<)#47!d2Iq*QcCmxxAf+VhRlZq$V1LiY6*hOe?(Zx9E^GSe%2W=l==S!Qmx>2>Wz#J@H*TdrDwW8=EZml zgV%LG@ZAQkmm2uL*Er6X$yicQgSvm5gU1%6p5cW*r2SB42$_eO{|VgxV0e)W?vF8C z=~M@+134c#{an}xF0U9GoFL~Hc{D=e@1F|zTpor4l92dYuo{vdK>CsKoLP|cxv3S> zkGpXga^C*7Px|0=Z19~OZ0`|MNk{Vq$@xuJQT)%KkP1DYX*cxzhgpzy3<}#I>oysV zLB_Eir0*XHwEXeSM;&eb!a?Z#RSt9>^c8fx{ws7n1`Bi^FJZoeLVXCk^b4Pub= z!q5)Q|GOdU1_N}zfzwe#8RR^N2frU3ICS`2oq8AA`hyJU{KW$3dWU}y_cH`Q$8nBA z*26H^Ogiw1GtGO!cU1i?v4Y_6$z%femmBs$*3mNbT$cxjpTHYPI3_T^aA0Nfl~~h^ zdj4=jGo;*0m5WL+41AMqW?`bOlq1F?(RAon(u^g+szj;GRKd!s5K z;s$D5V17m-@4@v+4>o@}g=#;;6UaQ(fxVD*N(zPl8?52;Sl8fRR$5rx|4=<=z5(_sChQf z^(4Go4sgx>)_m+4n*Ki6{0MaX^#OFg@eOqR+W|T+<&f!c$b3riUZh zvmod8FzovPj;{r!ko9KhS_hce8DuIECDJO&1%E^z*DcyJ4H&f@nlaQmG> zK~W3ruJfnu!RdQK`EQ5vm5=s^`n*Ode;eLH>X{8;ka9;L7_wfFp%IdfH!OwJM-AyG z!TAx*dWHsT=z1jsNcwm956Qm_2GDuU8pyf;2Awqr#5c|Vx_%?t`V9u?{BH~Nydzm? zdi(;N*V_Xre;62?4j50EUb%`Fef-m?a(9(Mjh19Ti1c8-KVt3!{Yz|q`tH2v?P z>#Q80~mY=e~h2LvGH-+^dIdU)XhIae=%0kZz~LjTtTA0w8k{j^6t|DfR| zG`%uF*9{aw^WzifdYnm+^*9VGp!pbm{;C|h?u-MvUg8dPAFnjz93X}_&~-V&(0D;h z01cCFg40EV2&8?akN|D3v_sFqPlC219vnEpcQIe;;99ixBfFsW`w?h5@PW?5>p|Un z1RB2^<~Yo|etqry|7iL@K-X6^Ks+d<7&K{g?@g*KInS42I%}%6RbRgmY=YBJe~;-`?p;; zTak>qeuLp4WZh`PYsfkphDDJ1fQHM^{PP3a{_0zHpxtAl!{UBa{RP30b;<&hAm=7J zG(*OFAN+vCgF`8FeQVnx2j+l&6{~Hi`VA&1!h$o_*rvNB-4jtHb&ys;KiKknGf=$N*8>bFP#QO^(G z0ySU48KO>M7o^_2Uq>%qie3RH>2t2fSP{;x?aW% zS`IvbuKzdyU01cE-$B#NTJOSgH2n$Cc2fm(-cwXsOwJ-yoIdSa+n02KYR#Tzu+(nTJJDH z+D{GBPaHVMzhukN7*zcYR*?FlKn+rkaacp*vEdPP{qD~D;Ce0L-h%`DOIA6|u18&e zhAhxA7dNI?4|525SY!Xe_I_(yI(GpIu1zu_UI-NA4Hx(*~6vW}Qx zGBh0YAnSBN`cZHwblphw|6&A)e`>EH)+9mI}B4$gmjF7+Hj^*@6ObiK_dX!!^` zufqabFT8-RXDjGBU~qy-rsoZs{sYkS9sWS;p9QdU7@+g7u=5QblsdGX4qQrRJ@7{rl%yILa^wHMOJcX{`;((O5 z2ZW&Oz)wK>#SA{s^*LEb51iwio^F?js=pxy+Ab=A#+wAR+=SiRq5@q9WHIkR-OB%W z`ufoPZvma}FMy_>pU`!j&o_eWHTZgn7tnQnX#QuI0uA2;*!fS;^)h>)>+T;w*S`eR zIlTWeWxM8nRQEGHfUfuHf#&-g(EgGFG#w~F&+%x8b0~O!rzo%n?fi|2koK;_G)Oz{ zz0gTs)DY&o&a6Hwgu|XCD8ETfYyuipy>q7{|fw& z^~XO7A>%d;J0NsGGvplD15S`~+d=2G!|$Mog6oe_?LQz0ss9*Sq3hjTAoKYL;vnsD z2H1HX8PNNj(AzIFpyB@$(*I!C1I-Vxb!a`%^4kN_PeOA(1A_&$y|4h<|6tI7#QO~B zx<=UgDUH?x4eJ-^^lPKtU%&uuKSV&!Us(aIH_kxqgROsNNOD-lykobl725iz15ouB zpy3|?UAJftiB|?M*t&vA2ln^fXEKOI)&D>gQr|Cl1PSL4uONH}S4g|7Ardl<#h`HH zfbkYPCie;7QQH3ulc4A8H9*_;DX(=Wi%L!_5cUj=ljcM;!tWxK@TN-*+0-{|o_; za)W^Zx_$<>p3Vch-l74zexo7ffa1fzBQJiU>DPg-`=11@ha;f&^Fhz$bAXo5BGV5f ztkSM5ROf5z|&Iu5r8(vNGXgVv`l(0c6Cu>-d|Z#JdW#J?;i+4=_xb?qIX_<@rf1kb3Li**W@rdK zVC*gS?Z8?z{STn!4eZ>$4rqDf0nL{Opyy9EG&(RG<>Z}s9BuuZEM$DF!3CP`r$WR3 zKV%0bl3?h(4)^&h0Y!@vXWhirg~!}c|yhkpUIp8-4n ztRWCmeh5IXcmnBvA6N@%_cLfg#@`yWq5Zhl4F{&IHJV>E{|~DFS)lC~2k3qU1!%g_gpTVu zK-*J`pz8$D{SVtG5Equzt2`!mq- z8<|NC@^#hIQ!b&oKLEPlW&!k^DH&*c%>detv4F0_Ist88gX~1Y4I+^Id0;n$c9;Tf zXC8s}qn|?ebIsdz;GorARkq-NsNo0Or|pS^zehN+x`J9 z$6BEIK?8b@RseMU;R77urvWWjVdusZr=hLeiNYS;Q@620E5MW>t6f3tA3*CPldRz;V+~e*KiS1 ze=tZv^AS6wUSZH#c)*2I^HTgqM%4IIfR?uvO_1=1wLcd?!?ggKuaNc+pw#~c(0;ZB zblju^s_z4|{8NCf=Z2n#hm`jq%m_%jH~>xO4$$&50d}trbU(s@5Qn9g>UQg%L0x~_ zPz^mlbQ3hZjUeq02X9DvX2^k#=c(*==nC5SO}~=~)&H>bSz-5ht$?;WVCTTW&Tn*p zp7V^JegmNG9@zbg4bXEKVe8l7>+WIagF<`_C$~V_nGJisM;*}pS`EA>l^1}y`?iiGy<9=LF`U|u_m(b~uXcp-2`ivD4&k)@V z3>TpCu>F6qd)PKW{SP}&x1s64#L3s@NB%(5-vEub576-+H)ucp542sj1)826(j4Tu zz1^=LU_*$bm#_bYsXw!>7QH0&PL576>4A=klc`-x?h9-L_QD?rkv1N7Xu z1<>>iTSpIDR}MeV4`wlxHh{Jt8KC7R?Ecp!(E1;CuAxJN1E;rG^BD!S``6N-^%U&< zYS?+~>!IZbZ2y7C0*9Lnxwae8?{ABM?u&W=-M;{9r^4<%gPs4LP~@<6W%BedU(xIr zfR_8Pc@6>SdVAP8+6~Zh|3Rw5>D+f^iWj(12W+9^PY0mq$TL9NV-3;J`NIv+@qxlU2drh94eikHkAv+m zbb#(df$y7uo=3|7J4Y9Go+-p$1PR;E0Nt+w+YbiYcLci+k3r`^-nFs^kww(pKX71% zjN@zY`~lQG;^so9k@;CCpMvjYgGxgvr2PX7ZyLbs)*uoL3=YScA?vMS0?BRQb>uKE zI_fAY=6Ni$oh?MGr{g? zc=-*y4wB(S19&|bLzE$8{d?wo$T}@_2ORhfSwGd__70rBp6xIK`(NG$a{kha7|8ml zcj1bTKH}G3hlV5HKgYoE!W6vzpTS@jxAuQPB!_KO^Fy9aj1jvbJ5bQnA!{g?-=9~=sGk6!&#gK~cy14A67fAxR| zGSAp>528<`39@cxf)u1bZD7dk_=VZ%ShLSol>U##QOLPVE1V$X{t&(vl8R-|#jPygu^)J6nk3feQD6<6BVoA1vDhneTr;2fWUZL4UU$$o&nr zzL4~C;ffZB&%nS4Nf&7LGdLtc(#?Zp$o|E1&~*bpk|Fb78FrBK`wHIwbU2W~Huv5F z)cpqu#~|yqA234taS1Wd@pu-9c??#N@py;+3kN1IJ(nS|3T6KR1H&80`UZv$$h`A` zD#*D_3v40t(GC8P^7sJDC5P3sj{0yeLD_%6z;FP1zHS}lypIFRA?Iy0oQAf`nW6I$ zbM_vX6xy`s?|PK;2N@EaA>$PbmO%WGUyYzL6RIKiD7|>c0rnS2KQgvh z0=X}2!E4C+A_05IdM1zGko9x{%#icf9teCqFl`f0=38@=_5Tb9>>=k{HB5r6Blw^L z$?pvBpyNPtka-1$hE|6;zq+HcXQQ4!$S@V!&iD&iFVWBqId_FY0J>hU5i&o=uyLzH z#<~9`VY5)z?=xgT#xENTp!;;ML)z^RdLikVApv@Rjnc&f$?o@MUhhX;zu&MH(mps) z2$=_8;0IYR+Hnc8-V%1MPy_cnht0uivzmHQ*6%Yg=s@NT4!nb`vwFh-Ij>Tp4U+FZ zbo~aGrx$Gg9&nndQFU1X_58h>Pmpz6KCNQl_}S79DQ8UXLdwsQHVFOVI-6s0uc(jl zT2%cHav||0@E&~rC&Sb4koAlqrjYn&+6Acx6m+-`-cFtTY0Ev7{R0dSF1`h~r+$?2 zg6*$34Ox#FuoqH(1bl{+zXnSG!0JG02RZ$D><5>73<~EU>4+ic57@sM^`fBikKw=t z=(<#GNIeA7kBlYcAmQBb43d5x6#fC*v*QdTJRf93%8>0+ufwXUX*RkZG ztiNYqcn&!yj6o2x-nQWaG{0A9EVrof5X$;{hLUE;`sbVRkagUw zp^$Z>cQPUMN!JbVd8!Ou?Fx<)*{5om9zj`uf1u9`Tz*}cWd>fSf1o-9d>`b2rdIHJ za)yuf;C(a<5}R!tJ9OQSNT#9Q|29Jjynlhg>lS3aSa=Zl+_r}N1K@ol3=Q?t;B=J~ z0!f$1aSviQ@IvxOjx!|P?KuQFH)5^xTDPASOCDEC(s z+=G-8YyOLa!zo4%(tca95|V!{x*`5ym6E z{hg_fS)X@WZfrx=f8coRcV#CA1`dUi2x-tc*MC;lNIEevyozSAR05q#zP0N)vl9cu z6vo4z0!}x>MPB|wyT9#{T^`8aA8x0C_sIk(`#{cVj(Q5-x8|U{8GN3rg5WdoeoC;< zk;)&31hYtxdmlU$0q>hwV7~-h4>NG3fcG&t{CEf6x6rU56|xTjYyg5#n6LtTPxONe zr@{U`kn#b14)lk{X9Xa4ImCPg@2hdJn-G7H>7kK^Y!T}E`6ZU%^-c?p9*2Y<%Tus> z89sO0f!x*bx621aGX(53bUbozRo(9AsQM3bgZCQ*9H<2ELl($b2VO7EaMcC8FQp+L zx_`93JJ`{n&Z;P|`w?>cRUz&cxcxcd@qe&C65MLR`xPE6Jp*Zf9xL$&+23&01)R^p zK1T|_hSnhPeX$MZ@4)*;5_X&ew_6&Hm_qt7Nr%Dl&mg-SyuSymABiX^<_EiX!`@u* zxzh!Q8^Qag4_GUK+vN@%o5ANlGMKQ09Bi2uZ*b}riu)VVE`axEI(%aV@0Vd<-UU9# z_5dpnSe)U}eaQZkfDe#xM6w&qe02a)UL<^lv|9tBA@zsLcgTLefG9}0>=Dm)Fl|2z zt0L<8g9ieRf!*hjG#gAm2up#)_m%hHdz%}kaDn@O4Lrdpo?4W#1k9YcfRQr#-fRsN!zChMdZ4igF^9;oQg3CpQr;v5<2Sgz4V5cr3X79?a+dTj}D5tE1Fz@ZAbO?7il+kb*Qoltkfs7*@SO5u!fd7zo)PpYQ`h?W`2b@$(PUf(p zuD?(C4e5V1ynw8`YG{Y<1DOnI_cT;O!!2&NgGzVq|Ep2@Vp!=>~ zLHp%u(DjhebOWOrEFk+u8u}pfpA6EF{usk7=)Mgn=(>}ZSqD}{x9UwTMq9rR8y_!$ zu9J8G9mn1cEmt1ogYy$Z$SjAHBaUqG-_Z1{K-b;C?&4()5E z>CIV(x_-aG3mQIapzBZn=l%M-J43$yW-!n)+%e{K&`iBkB zdCMH=y3+@RkaRR*se@KdDv$R*NJL$~|G^G2?#HqRlD|*vgNzd-q(jzoFla;e$1Ruu*^dE=H>CQX!65_EKZ;O> zoZG$OB&40HkPcZ-t6&U`Ukm6uFOUI9c!4jZefr`dq@22t4_QYx;R<9wU&DV$y>lVr zn*+n!L;gxfP}kodmO&cR*c#uaE^P zzY@$L{Y(aH$hsYd(_5MK>7;~dm#Oo52=v){6an?A3orKh9}391D_}7Cm&El zUBAu%-FM+)2PwB7e1-IT7A%F-=L<|B^_s#m$hoXYK@Vn5P=)jhF6@S+0|sNrdJ6*` zh`V9yzZOh-f50@+?Wkrdiu(`zVF$PG8n!)l1Jz>KV9p zsDSIeXHJlI*`5WEc!FCEWxQJk=^rQZfzMB1VBiP$Um5uJLHctY>X7rpON50Ep5vKf zZljC3e!jsTQvMp8fsCIBq(b74K^d|hvY{9f{|w(2JLq+$+iXZf)&JoKB)!i`f%N+r z_CV6jhHH@cT;L2ThZ1Hzba=&U`TOra)cX@H_#pN(*g)p%AB4RDmp2DaL&hH*WT55x zM##7-$lJ*Ie*!P0e|+K}B>x7Sgzy(^gY27dcnaxXJDkE^{wJ71#(QV{fs{WDhalr{ z4$~p|fuRkO9vvJW9$;N8`ReFbRR1$q~iP;vIY z>!*OW{(TZ;{N}<+NPFc#9>kpw;vwZuLkDC%_kp%c4nDI@y4QuH=wA@OEESwyUU)*r ze|OY^_gx>j%?R#CF*NLg(}o< z<{=*xJUH;eB1z)MVbuK#3?z--E7aDS_^9;+XF6NV|S%10&k{e-)_tAE5Q_3+TFY*uAb3p!4Y&y$9wTHc(h) zgr4rFPdSsAjIH0nu$uM^-n*Idnx~DVH_SXaG`IF0_>y}~X z`>D)yNEY|q{O}c;eon~zFGB%zz4uw@`Vl8+c&&l7gBV06A9!E8Mt-Bj7nJ@>g(GDD z(Sogz{9dpD((b-v3=yC39Fm_e1hG5TH8|Vx*`u!iKd=O9?@LI#wIK#F4$p7{+U~mu zjo%m0@I{V01_lO)z0iF!Vvu<>2Guj*@H$Wj9TzNyjAt{vK6l`&*0pcBg{by3K+mUb zm;iA{11Dr1e8XDkdLSq0__rct9|fBA3=9%bdtvKHA3*mDoPfrA0kr*MP~c!Jl9?y8 z4mJE3VE3ONXoj@YDxkCjeSAlu>xo>T z?Oz$_z6XJ+2PW<}oG)vDw*LRZB1pIuK=Yjzblr;vbp6T$D9upi(8c)kLU|~f{sibc z=L+b0$p+|tG1z&e0?_qk4bBeE_q6hZn^5&1xC==)46t)3H$(d24H}SpOc=gE)^{_c z?msYnFYDU{9BAv`KS0+lz}DL+K-bG1fUe(yr6Y$FhdDRnb3YlP>Hh=We=iOVzj@Gg z|FHWzZJ_1Zf))qYYBs6;X{h=mPC?EUaZrWKgU#3~2ab2P&5-%K6Fb1|0|o;He#ZmH zzv_msLfgNv92#HZ(EZ;Wkb2vJ1JW*L=z#QJ8uB3X;GpP7u0I*{q5BuOq2=%cXn&v? z(hp>St)okW_Gdu`Amak)I@1K`daVrTx}5{ibFT|v>zA?)9DjI6aXlm2{jacfpE1z> zMgYXU46t)oFG17ShvEYk=`D|^TcYVtfcAf3=SyyYuD^kup9#Bvo5A$}!z&T>rG;qv zUqJh9H=yg5L!jl}6G*?9VFNThN_0CEZai2fco9{9!*6If!OjnV0|~!|Bv`o#%@@3z z5ByD04?Kyse_}x;WPYl_2Rcu38Ipbu+=R5}8O}iJ2Z!sg9K8NL-sfYCvVY(K(=qV) z=?*I{@cn5A_#?pg*)VAR0=Ekm{DGcdwE0t*W8voKM`X~>|1D65^cNC(A?>&Wb&&B! zi%dwmThIk*hb(vkkq1RRa{Bop329#(V1vv%GB`ozKMS~FCsK0SU;y zd!2uf_B979Zgg=n^--gd$4t$UE<#(Qm;(rDP7D&70fi^_l0Ut;|(IFZ# zZ{E-dsgD>O&N*<|`ro>K2yOof17v*wgA%m9NrL2`hO^N4*aMxv-2h$RiR^d~TLjil zfaZ@3*nUUoy3h&Gb!8W791f@LSvZ#!ZT|-B+-MKz`N0X$`o;me9vF6h^n%0##a8W4 z?5$AsH}pZ;#|^U3^#&5_z~ym+4|H6L1)6`BEI&}-pRZK;5>@}UE0BH9HZ73$FGCPy zzQ;=rGOl-FAtZfXXb^Vva_xGfE%+OG{GNe<19I+w0}o^!*Z~$udz&E;+TWfG-QUOx zS(OmMq{;SV$) z^FV3Xxy%#V96}`7dV;di^uz8;Zh+pO{Q_Daz}68uK--545)OQ@z1a~J@du^;W{7~U zZ)1Xn^8;wR?FO{|P=K6g%TQ43P^BWAv#thJ|AR8f_{IU@>)?1}_y%c*eRv4%cTIrY zJFHm56nAI;A8P-|2s7I!}ibY zfR1~*K<2R-9H8y~9nf{r2cYX)(X5A$&p&{Ulm39V-!!1>`42$baRP-7sg?R&F>siH|!c3iYDdzZsfe45950 z9ccSS6Y35Hs5=Cp^BL&&KY*^6FMzIlJ^;NB9De__DFY zp!V#5uBTl9jX&7^3l+@=s(+U%@ihKN%RkU^@&I)GX9IMdwF5LhVf#@PvJVKwtv{Q7 z3041v-p`PH58H422I#%$4KI#6 z>{fA(oOB&6{2QSDe*o>Dq(JM79_TniDP&y?11w#kg`dC^$o-k&yCCaWV|^g!*F}gy z=7Tuuq2qY12M&ZP{?gd@3C;eqkns+NB4|98K+;3Q18BZvfVK~>Lfgsc@jnHc&Obu; zJ=sFb;}1}OB|z(;2Ix5|Xzpit0Ij#?K;yd$T93fm%?F_Q=|HT*mx(jXCHPSH|1iML zi~j;GXDXoQz}$nTCkALf`Z2+Qxw=s+a0ROV2TqXj>jgU@^NkBsAnmCGt03d%4A6Ga zf!miHJYOz#op1zg{}e+cBwr{%=S?3#=P#B){QlhLpzPq@V z_{X5{pMu^Kb^yAM1~z`e0Np=w0J^W^0JMDswH8hpLDShGNWNjX2JP>DfVM+;p!q{* znuCw2?Vj>{X4LR6sDk(p*8b&y=9?YRdVB-4J^Y~ffLg^YC!HoV{Rg1svH^6y{SMT= z8PM`}0@Pm%H_W?OT%M)n3oPogu622eW9T+Q(mzGGP?f-(clP*B#{XC%irVOC{cG$S= z0@!{;sJo%mfoG6;Hioy*{+A@AK7Q~9GX9Wo5z-%Pczxo){Z{o0h5Bgww?v@jE9@SN z1<>(a25A4M0GbXMI1c#jTm9+fD>VIYApH*p*gW+*XnuGDO_vhT@uh}|4v!XB*nazq z=Klv!`wC#?4fLKG4w$_%knn@;=ZE?mPQmtV?SPiM4A6F}2{arRK-0yACWn&RtGzo< zqwPOi0NY;%&G)eVLK@I?%K+Us2`gXF%MaN77!7HVbPeC93AGn?51>N`#2;{nLm4s9 z@LvG!=QKd?&vA%_suzLM<_CDshgsjA&yKqP>j3oL5ZFHG2lWtlEP$Q|^8i|oFhK7~ zfm#cv1fc32p!4Jlp!H+`wBBlf?wfv)bzo|lLq=r=Y@ZX(pB)nq+;X~ct~(n|zX7zo zfR&dFPEhlqQjBiCuyZ67VD*hJB>oO09^l#S?f3Kxn*9dQ`V-bpY>0=bZ-Ay3*!%^9)`1@` z840>q(e|&&L;CLrJRtK14tJsLzHZ34bb}vceLBOF1qWu<>F)*YUxNibm~Mc&4`v@M zJ;U}7!rK1~Mh+jvw7oySN85j90U38-fbCm70U57raD~jDGn|0--|Y7su-dBcAfF4{ zF9x=qfgu4JPX}V4@dmwbrU6=h!|vr_h&|xO?NYzFkUIOv4ov?Gw(r0u$hbX22ekbQ zr5oNt-LC@KzW{YDm@;{Uyn_oYL=s^Q)!zuENz%-~z~Bhg*8rtS)$a|}R}ZC0)gJ`a z7XhV7)gKMj7YU_F)t>;>mj5BuZpWO5%0M$=!`jUX^CpUe`L-muJzQFO51w9uUMnmI^LFL~8r5BL! z1*;>2(1PkGH-2=X`pJzS6R3W2=JSHZ7#LW=V*md`_{(49pBa{)0$}8b$_)c_4FOY>+HM4XV8$^Z$a) zXMwx<-+x{PMh0#M1_qEA#5_g@CWil5-N(f64=fJxGj_eq4F92az}$^652TNW0p?a% zSV6)LVK*o|L177U6T%Fbxezmu#X;fy7w!*G=pyW30Ea0ken9@@V_;xlWBB(U#zzlR zkX|lucth-GLy0%kuw?5CfS6iDQs^L1seI2gp6Jv;oo!;X~Z>_dh5e zSW(=E2s=o+`v0GY0okw23|tJLc!0PUT`w%m5PCu322u+$7o-=PolFd{ct+?0#Ti5` zGXo0)7uXFTb3kzf3jcrqLH>iqAw&(xE{Gn8Ie(GVfcy z1jP|3U4haNvL28e3poG4>;jbukUYT50C5u}TtHz3Qv&I&%mV3yr6W+7g6s#m z6OvAl)xq*7hz7X}G|mSy5mfH*GC;xyp&k^Uu(SwDd&p)&@*2orFgJqy12Pj7rl4{L z5_h2Rgt!mnSBPEzz~vokcyKTV_>lpbN?pfV2@ zPRMxP*rCn%HQ6OAY~{d|AY95vXcj#XF=ftat|mDK=}*g7G!%sa$V`2~^ZAm)R_Kp_T6ix4qbdIZUV$^?+xL4JVc0|*~AeS*Y5 z=0NffEPO%k1H~hP|L;E=1I$c_TR>?SRL_C@1&V8!`$49G!UH4*3SXESkT@&D@BeHJ zj9|zIE=NH2gVNcT{~)^{=^Pe+A`DCnuaVL@BwRpdGBZHxUXUJ;{U93TK1iJb^1l=V z6T@S$UXWk789;VG@)AM~EX{*TLRcJwTn-9Th#R>XKqVYV4rC@m4q^r<%^}PHxdGW8 zCUCm|WHxfT0ktB2LH!DfTaceXW`n{M;wMBHfXqjP0myuqUqNvLN=u+L1WG3$Qz3O1 zNDs&?NSs6TfMkDy!vYo;ptynMGl&{c3WTI*)U*UL50oaE7!YM4$lV|}gH$4?8xa3D z*dBqYX&WR83s(>yRL;QC6C_+AZiKKwbvCH%gV+snH7G42(hsDp1DOxJm6+8`ivK<2{Kz``Ha<^Y8=$bYOT?Ilo7 z0i{pWbON#qmY+d-Ky?AcY=}Q0cEREhLBKW@+v4rK>PuR-=e>S>S~SQ!OsuOrl;wi!U~M3w`o1-TpM59GE3$nPMvu&_Xw53v)Z2hpAZ z`3JR~4ax_gd;@YDEDk{a2k8Tefx;Zbhxrkd{t#?Xc@8Q6K<2>02;?4^9*`K!43L?S z{DBBZL|lP#KPY{G!VFYSfXY-zeasB+461ust zat#zdkhBg9Gf>(EnE`S$Y8b=J1EmQ_zZGN;sv1z(ax);z0)-7P10w7(-2q7}sN#rp z1u_qmhaqJWDBMBe3i2l?{6TI6g&oMfurLL&VdAj#4~hrm@B^6v5(DL7kRL#44HS3C z;fXK@x)o$ED8E763ek^H1L+4K z@(w7cfy{-J)gZl~@B`@uxfhb|AaMfn1G1Yze2^ND8$kXCxfv98$Yy}lfcT*N!~!pC zKz;$a3*;9T__zSVjWBsoe1pm*kXl6k2ZayFeIRoY^#Vv8#2@HxfaDR7Ss-&kc?@JP z$i*NrP##0gQy@2k{0TB2mmVh)TC zQ3J9IxoiWe0fhr7Y+?3;;sB%$BnGk%6jq?T2x7zB2hsy`A4m+Q2PB3ZrU<)0VG4>z zkb6M!gv^J;7sL)wnF--T%;aT&m!udLG1vwo?u}LN`WA^g4}{gg9x)h`e1H@mL;U(1I_3+C8&Em` zg)zk4EZ{aQh>wV4Ca4(5en@;n;updP=|`wVq$7~~AZ9}JfXsxs2^7}|c}RGI%mj%+ z)PPDpP#i(*0I3Jr0r3MwJ;*$SdPKPj(GRf`65bFqAaTe84PQt&Aj%5}A7LISAH(7T z5{Afm5>yT$!WiNnkX^|7L1shT0x}C0KcG?*;vSHCgc?M+gVHTTAEZA4iaS_1g2Eah zj|gj!8kinXSfTSldeFlT+5Hebp!5z)XOQqfsDbc7=0ePYq)&*Qkn{-?2e}a<4v7Oq zm_W=x`1${Tq)8Vf=HLGi@CQQu2aS(_q!0Xn2!PlioGlL`85q7pg#RD=4P`*7Q~#h0 zDD@3$@HVJ;_%DdWYN$m9LJ;%zL4^OaL%0l3?*E3a8DJ5ZJZPK*Bp?nV7#J9~LunYb z7RG?mC!hvFxeP`y29$mebq8$r$rvgQqmDrJ!{nXyU@{PTpCv>AgvY?31@!<-z0^Zg zc^4N5A0}@B(+H(Qp$>qk`v0Fv1;T<#GrZ-5uppxU|Cd95Ywj9ygdG04C?29ahcg7Trp{@?Q&!h%XOWNN`!5LyEw{T~`k|68Ga zh%5ucK?w*8YAnM82$vxPsxDv&gz*?c{a-S0_8)K z9fJXy|3snjy$h-z8l3-+L-|Tj{V=KtnqFaibEvxQP#R_rOnwej92U>e;s_q!FneI? z4Wa6x*8C5EN?eAD!_qUX*h+)SABD=lgwiHZ@sm*c0#y7Zln>38|J|W{NGLKe{6b4V zwVLr@6^EhvZ-IFX46t~0hVr4=o&jbbx_b(s`gcR~n>jRsu7WBy1_lP0|6s}IBUHU7 z)O=XHghR!l!VK+D#sR4KPbdu)X6S}W!1(K-^4p;FHz*C0-v>*GPyuUb`hap7{=a}| zfF+||s01wE)~P}ScpwzR>oN!froK-d>T!rM|JOiinCLrghG>j5<2Pu<53?7RKVjw4Mu@impSD04N1zq;HE6gOWR536t zha~{0zd6L9;t+~q88qOeA=>^2L&aU72^MM$!%;{wV5oq~!|J_9P<=4U^c#2xh+#KW z-2$lja!>_oDxn6EnD7q5{||Z(v5*(CBzy3pF_g|%KZ;(Pq=^#VPIhBg4z$| zG8}^1%MTS;1l0)TGQi>;#(xQQ0E{mJRWA*7j|x-*D*XQxl)(#?hekKN{#Xl@hiYRu zgT}uF4Ih~NacIJa@pWMt6DnW|O+QfU7@*0V0qX4kTp|#KF!_Aw&OE5K|CcgDSP)eV z3>zTa|IttZXz)UL3=HR?;nxZkfm#pu-!G^*G<(DAE2uDoKmx>rK~RCOQ2U@~n>dKQMV%K7jGhqWKrSy>}ZDJTT=9KhV?YhK2;)06 z!XP{bhF{Q(0yEDQCIO|LK0zD|K2F(kqypaRhD5Inw3 zq2e&g7s{9ir8}V&fHIWd45i`u9Lk4Lt_5;nCafHR)d#S0q82O*8e@ep(EDS&P>(}o z85pKO!v{+JuYpy#Pz87ILo`6S3?a4<7DV*_f03UMov>hlm9G$03=Cd+5S1|bPtbsc z@!O#V6iodNh;n%Nq4S~E!;~`|K@(UCm4TJ_3!vuNK`pd}L^p#nG{K}m(<`*w0om}$ zz`#%lt?yvJLb4Ffc%ik^hU7XMtUSF7E*~Paf(X9jJK`Q1hVO>i;vL z;!tJ(Ss}p-508gv{LRpM6l^I2149&aJOgSBJpIDVn~auz19D+HA@m`rLI{t6fgOzx ztJh)jJD}#l?1QCusJ9qWU=1IrhF$}Rflw|3w7CTLA9{Uh3afCS8g@Yg8p>t3jaD9+ z!Yqa=KrinLpyDvf2 z@p%R6fPm)^2CV$O3vCdCH8U_UJb`8mSg^zTr!e`i&;}cfe*w+DE3gJ9R6!KPI(T@& z+F_AUd10u21t`A=O2hi)|DYa)QVbnW1i>nx*@6L9UqY?fmme!BDyYnz5l=2K4qLtYU-7qmOrKpc>Dx56wLE_AGk&gPvX& z%!b(np)(*9oYaH%7hwXeXyJq2zJ%p>n0naw6pRn+$HMseXz8a7CIO{G(EJPS?m%T3 z7{Xu!`cRR_Xy$o9#bH!0tYZ%qI0%h6D3{?UT7HGi8^Gj$p{1AkX!_G(3ZZliT7?sh z*1ktKAHDyu7tKBoXg?ilJVPq9{($k(tYbjW?|v|aP#V_1hH~NK6EMChT6p@R)u-t0 zuYqZV(y;bFl*^C|%|9?cdi}H!CIO|p(86~TR2)XZ`t2}2to(y&gHxbcQ_$QNV&4mB zUK%tb23nH~qW}K~t#F0R--2c)e}cz|K=X(YF_0RN9u@{xhHv2Yz>qma&>SZp12eSjL2(0Hmkl!;WItq`BWOJy zXk8v?O&!SXpt*I(+5=GBfYOyHe2q9LWSAI0?grTf;(^itD7}K*0*VVz4gl!^#Wf`E zL2Cq<8NPzu1W^gn3rfL|umFVsGsAbVJi>1vyCHrDxfGOVAZwIBCVu!_Pau2$L-m2g(bFNw1jxEqNLWGQ z4OD$V>;a`QP#A#b@Imw2ptVjQ_kiLaw9gI12H641hah#J_yDN|mS+3rHO( z3_#+b@B)Q3NIxh-9f@ z^AyN0AX8y`2bdXP?ggzqBz{5aAZdUJJQxisrI;CDaSU?TUvRvETnma1kO;_J z$hugN-y!K05N^ z5PyJN3rY*HFapVd_^@yV#XM*o2c%p8nFDeOB%G1;g4_%WcSJr1tpNe8aRIppR1QP( z1Vj&LZ4M;ug6chxA7S<(%R~Il&H$;iK;a2W_n@_zAiW@SLG=}+{9t0>WME?W4o;UK zRZI-uz-)+lf1rEvKxTm41+pJh*MPzY#0RbY0hK?XbOurbG67@{NDNfAg2Ee8AAsTr zlolZF2I+&DgRBM;wxE&#daD>DiEX+Z10P-`;Y?vO1A3$yfxd#-} zFuOo$2z3o7$P7@LMA!q;4M~p(F_1o3dIk9(-47snh#x@y1*J*QIv!B|fcOdIZ;&5A z;e{MNAU{FU2FL_Rx(CG*X#E>VEr<=u6Cl69!X8vcfcyoK2c=O++W}$@j1O`LB-}xM z2enx~g5wudB0$nBC=_933@i>o?gW_)N|_*iAU7kIQK0qmFmX^y2dM+Kxj=3Mr2$Yn z1KIT+Y!@Q@Kx!f7Awmq~>7Vjy=x%1uy;f}{yZoI%up>;$dT z0<}kw{R2u9p!5f_8?>$!q7Gyl$P7?=1*LhAYa#InvK!`qP#l2NgKR|9wIFq%JOxV| zu>F0YGy*aclvY7ujxZAxHjuc1=mFUQ2~UI?NSzEScOhy(=>$@zBAW{;uR-!4dq6bA z9$4Ig$|F#l31S}?()xeM`e#u31NjA1he6ul2>W4a4^;QT{0*wtVQCr?ejvZ|GJw>= z>_k-qi3^ZDAT^-0jBFmV-Jm!E*#k@Cpna>LybKZpg*mccK<#9ZUPyWZ`5U=y4dH{r z6gmAN+P)y25O>4c>@c?@!W`jlNZ5heTFCl9;f$PSF!K>4eIU#Mxd)PtK=mdlO(2(F zpfE(F8<77%;R`E|LH-BD48%-`J3#pj(uM%ZK>P!;1Cmc*VE}70BGe$vg@}RjE+~E= zc?XoXc){reQl5d@Kag@0WH!hhpzwf|HL$n=i9ymY%wCW=kT65&0fiaFPLLQV^dR8@ zYU_Zy>JYsk-yz2?bP)WF;Xawo{2AbUaTKx||`gT&Fp1tbP4 zE0D{5kZrJb14JIy4hOaCAaM#&4^jz<6Oj8MaRRa#R)-?wK`dCjg6blKJ0Rf!as#Bi z0)-5u4*`mMM4bY$7sLno31kZ-Tp?}(>4KQg#DM4nf#g7C2B^FP=?A$2;$Db;)VKom z$G(B<5?I;=$%D)Q>4n8L#0-$zKxV+g9^xmE8iXELK7;rbWCo}lgXjl^D=e=f=YNoy zp!^JqSCASG24;qjU^gM_V`6}`zYz5>C|!eiuy_Nx2NWlWFaoWEhO|{d_JQO<=7Zb_ zYTJOq6;vi6k1>GcVdW7_9#k)b$}Er`kUS{dVdW}F4J2-0eG^c>jThx?5l}7wsR7lf zApNN2C@d|Y>PNMM37l_1ZUBW5$Sjx}L1_r#evsXuxQC6^fbuCQgdk#=;l;}U3u{pL zfbtS7jzRGO@f%1l$c>;l29+6@af)1jfx;LRpUC+Y6yBh^8fFJ53_xl?bq1_%fQdoU z7R1dku|M!J5Rf}S_Jh(K$geQ>fZT>iE1>X&qydB&C_F)V4Q3y#eEujTdc6ZO1Cj!NL{d50H7F@IXyhAou(MpLYY22bDjNau3;j^!_c#4Ul*T#R$YcgnCFAAnfD? zk9$J=j|dY`IRq(}K|Tb9DQr9gp$5@k29g6SQXxG@TBS1NGNH;R32Z zK>INu{d$NT$h{EvK=gt7&7kms^!Xs}1%)rD&4)+}$a-OA2dG{^#2si~7$_WIdOq>ZUDI#6nY3dL1ivXAE@krqydl{LGA~|Gsw*l^@w&Mhz~Ib zq#jh$fWi_KMhLSY`2m#QLFEc^8xu6918aZ4)PvN4+zbi{ka~nX$Pb{r0r3aOw~+J% zE2lwe0OTH!TS0Xnq`e4H2Qm%TPXOg3NZJJ14`~mB>H>s3L=VgyNZ%IXK2R7y@;rnO z@jD{yAo7r~fP@_)EI=s@IetKHf|Sh=vp{+wwS3vT}aR!Q4ka-~cA!!BT7f>Dr^%c?M71Ex7#2d&Bpt2Rz zR|Kg8nGLE(VQ~p+!+^vI7R(Mrng+GYKyiWW2as+=od+=oRt|#v zf`}K8>p*z`R%Sx@p!y0{_Jj0+$_hk0gVHLbO$$j+pgIXL?+BU`0@(qQ1BESedIH4( zNDMZv0OEu43$pnjd2H^3r5R8-fm{iTLy-SLaRf346n7wbP@IFd;{D1Uf{E|4+;#Da{ufWi%wHX!ndxB>A& zc7W15LO*J{1?``OgdZpkA;JKX_8@5!<`0lt5P1>eZcyAH@(CzKLc$I;pM%VXh=b}p zm|IZQK;jQ!7Q}pzACT@&R|% z(4KQhxdgHwWDiIW$UmTP0qw;H*$-la!UW`37$0Ol#7sy&0_77>ngHcjP+WoXBSv@Wkn{mE7vyJ{Jje|oeIR#$@;fL@V15F*0~Gflb0F$Kbpxb50tyd^Igm6D zG6Q5L#0*e+g!l)f7db9Le3(9v`H*rJ6gQwY4YD3co&?zsQU`K3%)g*?3UVjJ97uiw zse$l8r2xbnh&o7|gZu_FiSqCx2fq8{RBkRL(r0LjC`93l@1KZqQR4Y3#GR**hengHno z`46HNQvQMDL4255AU!bkAU38P$ZXK84#dwOwFtckKZE=LG8+{3urvc>gWLfNZx9L7B+XFXhc1zAeB1G>K46x1;TomC6!XfrS{!1gVALl@#fg&9Eg zF-S-Ux{h%dlTH!NU(%h(MQB|A%gm!%z>i7v}%zP=jFh?1Xw4D$D?LA1wSp46t$uCJ(EZVDd2cLW7CnHdFv6 z57Q47{tr8s2Uf1ml80<$hq(hZb^y`~Q-2G}fXNp_`5-kQoD7RV5C;jv>JwOaz@&Pi z;RVyS54xcpD*WFcdhP)<82-b~Yk|ezzw0oQAT-Pzm^^I18$_0Y0k%I5#{Ua77{-U~ z^MIKHOP8?l_J>wfkWgY^;Dc^JhRK&*f|&%NVfhfkV_;Z~7GAJ@doX#}c`q>jIcUO# z@ehC+gfI>Rrhk&r%!jqlU|J@jnWu+V(1xIe$3mD!C=F}pLAea*`&5Ks5>OhJ-=SOv zSbBo-pP{)Ix(yy)zh$GzqwiyTj^-a&`hv9sgwXUukJW&;mtgw~VeWyY8`!xe{xAtB z?Fv-@HsJO4PN+uOJ!I_f*J_b4zK57?G;$QwS{IR zsB#9_J}Fo^08>67C=w~a-j(w=3ZH-I;b=QtUm$cN219?kBNXu!^>G% zeFUpNVf$2J`2@CK99DmU))#;biT?v485m&a2hCG}=z#5?`q~ev(V)(Tmv2yK{fDJD zSUm(wZ?JR=+lCEO{~BT)ydCHbv5o<{ee*vrtRW9o2hINf_e1%x^aCqbVCSaHhsxJL zErN2v{W%aDR(`<31tbQ-PoM=Khz-K%`4@VO5(DhG4On{*mhbYzK)MhZb}kAm9$rAD zVC5(*`?EpQp@}F&0W=sGHbDy{s5JaMDu^lu2H1Ht=b`?Dof`xb?}PdWrau!_F+mLw zfkq@OnZn`&S`GZ42sIbBf1C~KFqnByp&DV$WLS8?!WXKX0e1ck>|7zJw*Rp6H5{P! z!1h^pK;8Els!#wLfNfCs!p=Q}ZUg@hJC6&N?_ljM*gj=rsQIvC8erLQ2Q++O^@0~v z-Bqag7ih+W?bl0y7Ld?r`M+WYIn*Dp`V(4B!Y`bMRbv&<@P(CouyzP^yEwex z591$)+6UcU{vUR3Um{do4Qemcng1_B#bFf8eXwi|>%VJ26+nZD0d}4ftXxWinhPtp zpvoDb&i@Z9U#39S!Q^56ybn-uSU!X4gPpGfQ;)vy66PLQe)oX3cVOkrp4AW)&}xXm zI2}?!!0G{5{J_kIwcnt}c>RZkCp0=4mP3qVfF?8exoNQcc>6J=#DS@Y`3qJaLXWS4 z=QlB^zoEu5z|tGcJ+N~U7DEM2T!(0YmD8UZAbePQS^f)RGsG1P46C3OFH}2&G&JI2 zeDre)VBrW$mx@q@uyhYAo}kCgF~HIpR2lrdCm0_VE|Z}GuzCv0WsrwBm*E=38}M-p zO{h35Kf=_*@*zw;EZxJ-=i3c62R7~lE7xH9BcTZkO8x%~^(a&u{QO2(Jqb%Eu=Wz{ z*bG>?VGY&D2Bl%?9O`@qSbGYVUtFOPJrAlr9Gamar4*uH4h!GcP=~_y$3u^`{0}>~ zFB}@5bD;%!H?&}FfI0v+UImMXI;c48+$&gk!usv7auXJ>kD&I$(i_woh8<9GSbqRk z@59m^te-s%>d*Di2-paXFh^*(e}FnH23im-hbCk@Xgd87?m+!{1}fhV6`u+X??upr!4AzIJkSE-B$WRh>fS93!BCe#EKr2TUpmxWL#REq zP;nb5?F9|k6sSDxd>L3c!j5y81g$s1pczaK(tP_L0SzBFXaa(TqYTtsHK@5UPnt55xH1q3Hyc2wsLm42B*P`JZ7iBq2b(^&fU_1k~B^ zaer7p33@EWf9P>8|6%0`#8d``T`&fe4us|lD3`$ndQK(G{U0IL|A*yYSiHP~iYr2C z*tw-l&CrAeH4v6xd!XS1%^v?@<3+G?09Ky1!U6`We-$iZp?qzqIZ!S`J2aod_=0W8DQsfz=F{T7J*O& z=;NiZ_6oF^`k$){(+SbA0YbsYjbZa!Fjdgx1RpPtqg$DDe z8th`T1A2QCnmwSp z85q#IdknDl3`_y6UWV}(qWK3lJ`a=MgXUgX{}CpC5SlPxeAqcJu<%cZ*3U3`Sh)b> z!@Ljc&sf6>I;a9aXaNG{GC-Sy|Dn}$%op17^V;!u92_?6;vM94}+y=Sbm0i+uRyr08}{x zZ2lG2K7)l9>^wSHe+Q<%8e0Cq%5T{DhcNjZ7z0Yf+LaJn|HJ2DVd)lDZbOFw7}SCx zAqx#AhL6UO8WA?`7wiVf@DNoD@N;dT&SHR#zrxN#gq;%v4X*#jP>rx+!4qOU1FT%r zg`S%Ubv^^EoQ9o$3OhFm)}Dl&e+xVR`8w32F#TVl=EL~QU<@dog_izd`5V^W_=pz2 zuyS1i>W_FR4Yl^aI+}Sf_ruQDf}P6<8!v&ib70})i&h`O>OrV;8DPWBu<(PO%hL%p z06o9J=HFoBuCVj~^A_y9cF64v3=FVw4n=4JyAF+5SiKALKP*4N?uCGjzrp4|Uqi#; zG1Nce&~ok#G-ISe#bclc+QY^JRz>oGeFF0@4^$njy|)u80UJkxHZvJu{d+HHd|Zdx zrw7fzu=X=-+$Ixj%m4rEQ1fB>VeLbxH4M;WuHonB`9bwTtMUI*FojSW*58LZgP|AN zuz^Z5z|NV6jkm!31*@N7^Vcx-F!>y)y~Z#Br~=qI|4=S`90SH*0&PgZ%Aa@80t4!8 zhQeHk!7%l(ehzGW4>tY?QS~1_zYJ?f`L)1wLTKnQm;Yh@hxK=1{PWO^0L$h}Vj(8O z${!hMgAAJN7?_~(2Qi(20a{(a%XjqgRvCzKaCz9c2~0n19uYQ<0Xx?Z7Oc?b0es#K zR&OnXW^mZJ2kg8~Sp5U7cHs3EEPb5GfVDg!4uiD^q0ztqO9wD<*!=-CXfgAD1xx|dAu+HD18M*) zeM7kn=<^{*VG>Y!6Er}eTn6-eNW5VY162U)A3(YA@gW%h2`r$Y0S*g3#3zCSd>z{a7i`?C}};Q&()JI4{4E&uyK8}u-F9jJ3) z?vsUe{GbZZ=bvHiBB(TcTm#03jibZ(u<-&IAH6(*ttWv7+ke=(sjz++v^(%0md}774KF`o=@aHbn7d&5p~C@i^)PW4@^BY zy5a7DwPRuO=>CNk2QX;{^zjuN9!N~V6`(QD`_~F+^}8)}d=;i`A)5csqw(cn9Ra8Y zi0z2=PiVy_R272CSB2<+iNNl;fbr4k6=(v`<|jP->e1xCqq(;T&A$-a5$=UXAKX0H zI4jK91<-;D#)tLKV0>tE9j+fHj*CWjFVwkk{pk4})*OME2krjA)x+i|VDhke6&Rlp zt^S2BpMXg-9E5rRCIIUv!}w^y$AI46utBSDVB?c8{pjb`pN2``p#MTUhA?UL@PLWK zX!P-8m^h3^k8gDTQD_9f)T5VoFmYTo)cf%GfVJ~s>P-lk-v@ONOg%a+hF0F7#|Nx` z4bum!2Vs14S{ThfLjHvo4{-mXn}^Pa^^;)Yuz6${AH97G6Nl00`eEWQ8tQzwdyLmX zYM80a5T7(c7k0qLEh3>Eg2@nRh7-_+6bm$q(EPIuTCT&^ z$J~d;E9@L;O^7oXVC^y3eF(7f4OT8TLOn7E+8~0pN0vi9CIpS(DNy!Ies+HD^o&R~Gu3ksF~51W6gg8BotUJyFW0N)1!o8N<#AFzAHVC@;$ zxIgTicUV0RYrn09TKEuZk1NzYu=N&>Q1^2|3w%$g{2EBG{fFI039J7;Lc`}B)I69u z(C+GgSiM{etq)V7=5avN!3}7^1v}RsHjc9r8lF8+bs|uEVCm#1)IQjL71+8X$SCUn z|FHB1J8vC2>;}K@>K-In{Qm+?*FT^G<5xu>7Q@1ABebF62~F2mp$W7L8b0|@dDwh` zCp7%_Ld}Pr-wkW0!}=?*dvsvyf}q}HI0t2TLH#QXaSr_cuq3GYF#kwF^C>hq7{s6h zUQlfed!X?K8$U9IhQB0KfekcX9z)%`11b)?ClhwQ{C=ptP-nr{U%=+WVC_TL_%v)B z5H_v^YmdYH4_hw{OE0kUa}zXQ!Te(l_1`?GJ7MX!1?rCn&ahMCY&;7Z zod2JowR>Ul4O>qK_5Oe8HM;*{{VbR@>d=Y}<{opXL!rxk{=@opC!h*WLBp*PT3-7? z`QM=FqzY=VIh6he4R=jwf`g@FnE(Dk7wW^xm-o>60v4~Z`B13#|1+TZ2x=@t8`K_H zxWMK)VDo7WPN+fVZm8qiR0|98%YxC~a`!t}xHgWXpGQ*Q_{ z4j#U+emFGS!1qnU#>-&$iNfmpVCX^=Sh<-9U7!lHPb&cGK&ZeqsC`iC|9fb@h4DF| z2@k3q-j0Hq(hN-yF!@Vp1DCLQD40AfUBLLT`^jK@SUCaX*Fn=Cj1MdCVf@)p_rmz8 z(13*TVdWQ$KNU?L7T+*==(Gkr{L$~@gRL8asfX34P-Fi;g{DWC{4!{QhqW_c`3fe_ z1kI?h^{UY70&YL7odUZz2fd$X0ks%r-T`QM!P@Inp#=i8c>4bVnjxXZ)Biuvg^sZO zC$Mw_GjA0%{voNDfdRH&5?1~-L*-%WW1$;Mq1D9y5UBfL^ZGDs?^;lCbsU(B>d~KCTk#Zdm;UyZ#6^ zerp4Z2&g(eXhTQ^nqgu6D_FSzyFUolj(!8x2cw|PPX^dLA;k4CS;RUOSg_uQmY*;_ ztX~BSUs$^XHhvA8kA<1I4Z0u|mJXoXK;ie{Dns)#Z2b*vUJX`mFhMIKX!QNx2)&RP zWX`xBUHSj-`fjkxG@qXZDC-j zgPK1H8h)^KQ-`4D+d<8P^?PCEF)Sa#$~RbfTLmrOVEGkRuEE+{Q18R*#rsfu6`=OO z)_cOz?-!^%G@2QLq3(j^+k;RE*nA$WeFvRxg3o6!g6cybhlHtvt$#)@&tdy$VC@Ci zJQpPKtd2^K6KeC zLkv_uY@Y`-TK~h+8*CldEQoOouznV-JcT(s^DU%7k^>DN*m@*rv-dx2+#PBR!(WJV zp|=JzFu?AwT>;e(8|Q|t_v3*Ua4`26i9rm2m2(?cK|&nnzqQcx1LOaLCIlEi0O}A} z_`urHu<{C4UO=s7fcWk|d>$XxPKB9w0vd4o5NE;no5AGUpy3P)cQ0tbErRNUc5C77 z4_NsFZASiw<;!TOIk0IlSUb z{@4&`#)sX%#s$q6O3(@m+AU>(HfR1Xhr0V0)B;$40ai}J>I2yNkR+&j*nRMsQ1?QU z&wp5d5;pz_>-WR@1#_VRq6PJL1hk=Z8yX=;p#{NGNOt_c0$LDGhjzGO<4dsqNeR@y z9ngq`wcAfa!{-Rp|FC@nuzh#=Q2FoBgt7oy5xs*B)LnwsV=tibr~z$&L7o5qa$6nP zWfoBLgP`{Rgw`LKQ1fe{?rVX{!~6{!--3lJY@ALH>i>d@&Dn;1@a__Ww3? zyg3kR&wZ#p&!7&34*SB>9i(^90AD`|s~2JGOQ6yJ{|i+AYA6khS6DuRM)!X&XgYw! z>rAKw^cr#axY#SGy7^G^pux!i8$X8icPpXke>v2gOlbOtF0W;Pod*N!kB31W1Wncq z&}d|cfm#5gVe=`QpyIIn3fp%9%f}|r^azb6h8xg=9O|t9u=*VqPG_J6H*6hNpg+U_ zSa@aag+vT&ToAVZGXbLPKWyDKw3+xH)}Dt-|3|;?9AX;c+=&=yI)S;relA2OtUo6Y z)o>Xap0M&0)}P>m%0r`vfr|r@z{MfP{D<|^VC#)x1Txo6pViY8c@(+ zXGny`KTQ4+#5(x=G^~DuM(cmreWtMWwy#+5m>QH~f#+_jC2pcxAhptXCBnSRa1>?{)Sc~6{jm5)U)Pq&3~>Qe+5b&Y2F!d|I)GUK8~20pVf#{G z;kySKuux3{4~6le)ek&=VEg@G^62Ye`Jnj$n`Zcii z;xP4sP=&Dm#~SEF5UkxWI}xG)mMojBASnx)EdE1AAO8Q3fGC5XM+D{mmw*KX)WUDj z@PH0WF~G(#pv{B-+h7(!4Pb;$kU+D|f9N)(|FCgsSiJ-_o&i>lK&y2ITWI?hCJ&oW zgz;h0Fl%A)2b+I~cJtut6Jh%uVCOV=GC^_*tiAMc9i&8odHb~zq(+9B4{OJ!Kpg-J zN0@q;zhL?OEF`!YVD0jJwDh+Oy70IY;*9^$>6QPm`72nux&oC)KUc~H+OB~*hk*lH zfx!4m(0G9H<)I#d%|pP>DS*klLnpQZq4vT0KQRBzN3*XKnt)*A_ONyztY0|+YB1Cp z|7D=z0TpKOL@PgF{S;XESwq#s*4xAGBZip=GauIOxCM0|Ed9X34>mtG398WtnlOZ* z{)Dyj4nY$XY~KeoJHhwC@j=ap%|F8Ced3@U8$+mnBB1JQq3u0bJ4_cgumcT%r1_a( zAHwpr5LDk2XgtBphc>I>>+HC+X{6*tbIKh>R(uRPKQM#)PC4}JgnTA3l)cz zvs_@;K?NBY;PnAaxDBm*-2`N`!}v3y4u|m(whtT1 zWq^&(!tyt4+!;204C~iJyDRX0Tba;wR|vHawm#w!)MK#lg?48cVB@Z^em5+f9*0AA z5G;k711k?;BL`V&@vU4fQgu>MpBH2+3H?Ma0WG((%Q82exajUY8Rx;!)+GQidqz}yS# zcft6u^b6y|#s^@0ScMGp4{ZGijK3P%Fot@IK@FPTVEW%*g``&)e;G6&VSMy+vg{zq z5uV;v(Hb<+`u^|15{<3E6S z5AI&rI0j4}c1{zFzZb@U(i33;3FX^C3l1okfghGppaQUQ7buqjHjWPCqqo=7(aeYW z7bYAEU2p=^e|;5<1)-0ig$Hb&1tQD9kb@@w6WZ{D$;ZGZ9-snqpamB+8NmC?&|v(} zd>58-AsS%)eh7~Np6_AqhmC8(#>sy`8${4({+|vjP@ophF^4z+X3IpF!BF}cSFGvKy=80kBAh3BQSbGjy?EHuI<6-WB9U}+h!`eB}X#Woz zuYo%I|82DJl7>n^lf{2ndkAKp`Xorq!}yXgheHK!L)Qa9xeSKThCD2O+M(lJFnLXA z!y6{=40R|>{y40lh6=og6~s{fR!H)I@ADUIM)eSEpE6WA!zO6_L%sPQHs7-gDli@9 z5U2)UIY|2+%4I;`7XTZdg2}_y-NE>f9VFPzi4SZ<%M+ml27Aju}4Ob|a z0e#;kY`q^$9(~>V3aEdf#{9n_2Ni&7fUS#!av9BqshbOd13k&pviZjwFhA5Ey2{^fG*sC@%KQS3wK{OTKx}QjtrOIhnBx! z>*!$S!RE_geAxUPjDHW!y>Nq}3NoPe0hG&7h?br?(aIB8e+Q->b`BYgkKR78g*B+4 z3Y4MkK`57DA6okOj%GhM8b1lPpc!gFFti~HhW`D`ec;SXAP!`Ab|j-B8=O2z4 z93~tW*mKx9*q5+5u-##;V69*kVco#8fyIZ#hvfw`2(~cehafem7^D|J2HAj)MOcv` z$R!AThZPw*uwlX_Y=j_856C2t$x*B}ta7YetlwDPusp&FZ?K$WIl{7mWfDsXOBjm^ z%OBw{ zbc^W;(>tagOiav7%sk9I%p%Nu%%7NcGBq$oG08H`VpL(=#;}lqi(%IPhX0@c?fEz5 zpVdFje~ka0{C)KI$KQK@@BQ8T_w3&@fA{=7^>^#v<$tIC&G=jMxAO1&zX$&6{pS=352Uv!S>InjTjW@5Es$HgSX^ThXw3rmDa%#=7S@m_*c zQchA|(o)h@GE}lya+2gG$@7vgAcN4b%)!9G5RyD4=0hk)P=c45^C}w#^KXU~x*?hk zss|Jq=35E&=P6l^pXDbDb(4^A5l2QdrJ!3rs zT|@IyFxRlo$Ux7)L=z&6WEUo32>=k2>z$z}zpnz3ef7I+z)x865c0I;dd(!ba;6ib1|%VfYAdhrnb&(applzz~2Io}ghqkaz={ zIB5J5Bz^!*95jx@$RN#-Apmg?$UcxAp!PK*17`T-GJx)Y5~)~ z<{PltE6WI~)1?>`pz#80)`8Bq1lijFwHGFC1XeH2P=F>5n$H2LuRs$A?XzHHkYaFv zn(qMhSRmA#4m9;qQ1J<9;>l3)8EE1;jG(*HFw;XBSiKZO2ee-YbAKyTya7#o3Rqm4 zVFjA`i=pBR(8M?3uy-d8@q;+TPva232)0*>VFH>v?}5do84jSi=M7YR2bwr&9Rny{ zHlT@v_B~=t4}wgf^dQdg0D8bUY@d@XRJ;LA98@fT(yhZKNW{X_gPe`ce0wJB@#Tp_ zJP2&B5QD;HRP&>7sL#M54q9&pa_56<5OYA~1t_algUv^jZy!K{3=9kt!Q#>kAJD=L zw66pdo)4hnux|7+uzGO@1uaOq2kSq9Ryl*x{|o4XX;?Zu305z~@BmHxI#^tq;R4ir znEIzU{Ph~D-b4^mUctI`KcM0UXyUBQp!k($(141=%m>X+g8Zd`CJwr;0VFPgCaw!L zM*u1gv)2kL&H)vNnePr27lDey)Q2!b%1;I8#5-)x6;d`L%jzv&&8XiE*fz8XU28&BGEP%Qv10v0^6D%&o z-~c^v6a%Z5Vqoxq^dDjFQ38ugGf1GhM<0hd z7EtvHXzCrH;to)83+Mp42UL84IwTxm>!AIh;teVgaZtJh#asvud*fIj>FNP=px*}? z&S_9_1Ly$36=?gh8f?B4g96mQ4p8;=P;m~ZI4m4m!Q#>k47w2az{Go@;y-jy#iv2V zKcI=v$Kn2!PjXi@v<8%F3li-=AOe~aVdrbH1+4f;?fKp zXzH)ya1T5@p$oBK>yPh)&5>egfSM0G#~l`K1yFHV_`t$V0?l5~ej04~^feCme1wM2 z1!xBCf@CL#-%#;{MUZeygvKLiOa`0zJgks(asYbqS3g7>gE&+?0D53|3Dg|Wz93Nh z>H>5DD=7Vev}i)r8$c(1dZ6WrAyoVT^c-SGs5>oLvFAHS9O6Dua~y7gY-3<3hnf@2 z3dz?K(84ncD&Bx54jO&}mFFF3;w4b^1!&?mQ1J>h@ouPi2AcS6sCWXJ_)4gF1e*8` zsCWRH_%W!s2b%aLsJH`~_&uoj3N-O&Q1Jz5;_sp2Gtk8UfW@U4I6wi;z`y`Yw>)g1 zaF$|VKoeI2i%Tu|hq>n~L>#t1d@9&{DFy|o zdtmKN?aLxV4* zT!jsI!rYkv6-RgH4K#ZVag}T#Ck3n?Vm2~a1{N1!STF(NA=vuKTBx`{DnvDGUwA7g1A_pA z6oUlXIBE}6y#Z+8k%5816zbm@Q1OIxh&iz3ehZ=E3?2}Bp~H3zE1=>I(1nel@lcS? z4bX5{AP6zo0Xh-AAEq99pb_kx<#&9bB!xK+dKL?G7@Wg^C~84RKEe#2SXn zU~!NOQ1MH!dl2K~(C#?H53qUxh6~VzSdfWM28MrNaa1!vJRvSndXEpgC6t z1_m*x_yQ}CDh7tlkmzTS=YpgMg%pU5u=Jq8g?XndNT&*U`-#TB3d^AQ?u-=O9kfR?KQQ1PE&^$;_WNnUP{ z`;kQ;Y#tu$;tJdh41!Ej3>>h83{lRY3lazA-~A8^Pe2odDcF1gh6d>VzCuWIfx#9m z4%LiAMS#Tx7z&^Z?4ipb8RDSg37~;x1_t=OO6gE>0qB0VInef14p0b0Mq&Z)cywKw4*B;XyO{j4`2aVE_6!w;xAAD|~;WJBYT z6`D>QKoeUG3=BV^;ll$KM{*#PDUU|o-DQNzarY>oiK0_cW> zQfPenK*bxN6EERV@i3S;G(2JJv*V!VGeGMdSUn5c7Xpe$2dH{jJ0uUR9x+c1sz*Uy zYXyr-F*HEy5m>tFg^5Gk0|L-_=4oK}fOMkbRbX)e1_S5?Hxf|y?}Um6Ko81#3>7~B z7DqJ$#JdExSDGOKZGPk#SiJy41N2~BSUK>957KT#pO;_E0TP#HSP%d$utA1{;u&hr zg(VOHQ2!0YV&aG7cL8Yrg(i0fE~t0`^xz$6HNYSM6`ugT&;gd;rNQDL6H&1)SX_W% z0<`@JYxkOf#ZlFQcz#fKJ^)QLGcYjdK*MbZxV{iz5P;TSu>0gZz~%@r6hJqeLw4^m zFa+>J!U4Tq9m5Yvw+V|O>9zr~9e^PlY!1i;sCWVn@kL;90fr6Gb}wvM$x5iW19Za~ zZ2j>jsJH-heF(H#VmJg7?}OO;7n)DcfyE(W$mBz?xBx=~)cgWy{(S)zp8#zSL5GtV z-b2M1pyeC1Tf^`L8V(AKkZ@ptUT6loxE+*_8m>ZY-2;_o1+^;}1Q-OM8!j@SOFVeN z;t;jSq=o<_oF5#37|;L>ATu25J)r6xpdLB_JuovEtX_aY0K5W{fdRBW0Ax=zSRBMc z#d%!wjgn19Tt( zcF@}busEt)K)ekCpnemGg^JJMP=5z3F2K+LO()Rg!0-m@&If!Dcf$6!e1NJCfcgt| zPt|{@_yOoV6zqJ}#W?DHc0o`%fa*pNPYs8-l^}M1d4kmoFbF{V^|135t-$R@X@&## z5ck8{OCezOAe&HeHV*S!aj2h(L!2SGsHC{0G%ZapnIR>$C^bE^xFoeGz9ct3IVV3a zwU{A3J|#asJtsdYF(*EyB)_OQKC!fdAvr&{ASbmXHAT|Jz+)9S{cqCqYW?p6qiqewQ;*y-qq{QNqqI|t%hWM!95+6g$ zg3Q$9)bh;Y)cEB5yyB9g(&Q3|ltp}eW`v0gGmPGWIMZkC>j zshK%LMRA^;&T%V^h`k7%kp4sQ-(wXkeC@%VSGwrNupjdLt+Mq+`b zDM$#U(82;L08^NoS)8nw%#fCtT#{d;XKHL>!H|@hmsnI8pPZ9eTnx6y)Y#mBAt^Jz zK+n|J!i*uWxVQwQ)WVb@Ewdsu1x2NqCBy@{St)v^#+JqqUQS**hzIw035aLP08#{r z&G_6rJrfgiXrNXWfjH0rPpJfP5Rsv0VuG*)6!_2p1Z%RefLI9DWC0CKu-O*oAnW2Q zQxl8y3P2G9H&M^T)ClTMkQt^%CJZSBxq2q12IdTTrJw|x4~jrI6RJBUH7Bt&FR_v# zB{e5GF*zd@jKV z;xLE!8pJj=Fk?uBI3qtPC$kWmh;p;^j7GIL5mjA9t0v?Mt`y%?0b({qbUAVCRnm^nj<0my-nhyaTj znLxyhOc_dH4#-VmNGym?1m%>ZlpIjLNli>~%S_ElVJJ#XObJR&W=PH~N-oXSOJ+#T z$$t4W=Nm=pW#0OFpUyxr6ri-&HK_y@+$X%(4MI{-)hDrp0ZixTrGpucIVG7Tr75Wl{y8aNiNq2;QwviA7~eG~wG8YckfTvsfl@rQrEF4 zy_mr#AU?IQG&3*1f}y}M9$MOF=I1dK7bhn(fb_;~Atke@q!Pq5WJpXdNdy&7iKP{ppja*_ zN=++fNJ&jC0Jj`+O2AnF9^+<~44^vH#Kg>kp(G=Gn6Fe zWuU50OakQ4BoQtO8oyKXciTsdo3qF9Z88LI9($N=$SGUr3vFW~Dwo`>l=zGya0S8; zALSREpHu7_;1(2|9~|$BYG_$SJR}o?GEOcuzDhEavvU)RvWsD@Wd>Nm%}|`5Q8X&unn`kgDJ)??;{x2zC@Kaea!6^Do0yZ64~sCU zQ=s)Ps225cab(CykIzj^XGqJ%Na!UgsYPgI8o2TT^->c{5qt;pU0Rd}iO96{)DpA;Ca<&vq`kN_57c^1EXhv+1v51IA+1<&D;HEe z#>c1OD$k&Pfu`=n;!L!JQdR-4^g!Lw;(`o@w48kON~kKeC_g?oHJ1U_2!f=LL`XwB zCAB!YD6;_Eq6KxqK@Kj+FGmUvONMyQ5Z`#jKt+hJGiaD1Brz!`l_9kPxe~HO4k^%3 z1Ve6oF>+hX$HRpI+P{D)1vf0fV*p5&>X|a6VXIK%({n+68cl1*SCkKSU}A1&GJ_sS zltC}4xR^mNIX@RPD1$n3Mjj6|T?HEAgv{D7Fu?Ya!f5DlFWhjDS~!ORa!)X5iVvnA zw%-&+Lx+FiTENST;5-Hf(6l15e%QWL7!6(i2-g7_RfcmJK*ypW>xb=Mh0*Btqw5Dv ze}DV`AGF;FY$$A>D~yItw=qCQFA?jD!HO9e7(mx%fyUNh{)g>{h0zhvfn1OqL172; zKXlp*d=D6CC?BRDwr>_jqu=)pG6QBehz8vY@*m0lu>G|#8aA&3b3e=;7!8`o`G=$* zwhtFZLzn9_fZPvqC(QjIyFnNH!h&^{4l{jhz5V4()U%!AROX&Gew zu>Hv}I&}d^7OI&6VLwb{KlF?USop#AF~exsJPJ%bdia6XiGgf@I}^Ge7Pjx%0J?q! zrXLzDFfPMcsQobguzk@m8g@<~Oar?8pk;o@_QUp1!{`lY`@~`C2WH+=1_lN`@ZM#J z2yERWha|*BuyBURBJw}XoR16)44|bUuw(+;k1YY!4^xLr|6i#8VftbFwiRIdVG>XS z(8CXOE+{DOV9GS0`@1z{pzeoI;QR|R0_Gl=zd*~tK;Z||58DTB0X+{2dJPCjD;UG{ z!)VaGgUI^f^U?|sizQ$aZeZP*b4Q^2Btd4u?1$|um-r7UI1?P98le<)niI-nV2}gv zqh(-#mD4Z@n0~ZlUZJZZKx>jADnV|CxD>*NkseU{4WR4pK*yPa;u_>ukQ!L|#fg-5 rK;kf5p$3W-28MmG1qo0IkbO`lm;y<|{0 +#include + +#include "astro.h" + +static void aaha_aux (double lt, double x, double y, double *p, double *q); + +/* given geographical latitude (n+, radians), lt, altitude (up+, radians), + * alt, and azimuth (angle round to the east from north+, radians), + * return hour angle (radians), ha, and declination (radians), dec. + */ +void +aa_hadec ( +double lt, +double alt, double az, +double *ha, double *dec) +{ + aaha_aux (lt, az, alt, ha, dec); + if (*ha > PI) + *ha -= 2*PI; +} + +/* given geographical (n+, radians), lt, hour angle (radians), ha, and + * declination (radians), dec, return altitude (up+, radians), alt, and + * azimuth (angle round to the east from north+, radians), + */ +void +hadec_aa ( +double lt, +double ha, double dec, +double *alt, double *az) +{ + aaha_aux (lt, ha, dec, az, alt); +} + +#ifdef NEED_GEOC +/* given a geographic (surface-normal) latitude, phi, return the geocentric + * latitude, psi. + */ +double +geoc_lat ( +double phi) +{ +#define MAXLAT degrad(89.9999) /* avoid tan() greater than this */ + return (fabs(phi)>MAXLAT ? phi : atan(tan(phi)/1.00674)); +} +#endif + +/* the actual formula is the same for both transformation directions so + * do it here once for each way. + * N.B. all arguments are in radians. + */ +static void +aaha_aux ( +double lt, +double x, double y, +double *p, double *q) +{ + static double last_lt = -3434, slt, clt; + double cap, B; + + if (lt != last_lt) { + slt = sin(lt); + clt = cos(lt); + last_lt = lt; + } + + solve_sphere (-x, PI/2-y, slt, clt, &cap, &B); + *p = B; + *q = PI/2 - acos(cap); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: aa_hadec.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/aberration.c b/Common/Libraries/XEphemAstroLib/src/aberration.c new file mode 100644 index 000000000..af55df382 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/aberration.c @@ -0,0 +1,161 @@ +/* aberration, Jean Meeus, "Astronomical Algorithms", Willman-Bell, 1995; + * based on secular unperturbed Kepler orbit + * + * the corrections should be applied to ra/dec and lam/beta at the + * epoch of date. + */ + +#include +#include +#include + +#include "astro.h" + +#define ABERR_CONST (20.49552/3600./180.*PI) /* aberr const in rad */ +#define AB_ECL_EOD 0 +#define AB_EQ_EOD 1 + +static void ab_aux (double mj, double *x, double *y, double lsn, int mode); + +/* apply aberration correction to ecliptical coordinates *lam and *bet + * (in radians) for a given time m and handily supplied longitude of sun, + * lsn (in radians) + */ +void +ab_ecl (double mj, double lsn, double *lam, double *bet) +{ + ab_aux(mj, lam, bet, lsn, AB_ECL_EOD); +} + +/* apply aberration correction to equatoreal coordinates *ra and *dec + * (in radians) for a given time m and handily supplied longitude of sun, + * lsn (in radians) + */ +void +ab_eq (double mj, double lsn, double *ra, double *dec) +{ +#if defined(USE_MEEUS_AB_EQ) + + /* this claims to account for earth orbit excentricity and is also + * smooth clear to dec=90 but it does not work well backwards with + * ap_as() + */ + ab_aux(mj, ra, dec, lsn, AB_EQ_EOD); + +#else /* use Montenbruck */ + + /* this agrees with Meeus to within 0.2 arcsec until dec gets larger + * than about 89.9, then grows to 1as at 89.97. but it works very + * smoothly with ap_as + */ + double x, y, z; /* equatorial rectangular coords */ + double vx, vy, vz; /* aberration velocity in rectangular coords */ + double L; /* helio long of earth */ + double cL; + double r; + + + sphcart (*ra, *dec, 1.0, &x, &y, &z); + + L = 2*PI*(0.27908 + 100.00214*(mj-J2000)/36525.0); + cL = cos(L); + vx = -0.994e-4*sin(L); + vy = 0.912e-4*cL; + vz = 0.395e-4*cL; + x += vx; + y += vy; + z += vz; + + cartsph (x, y, z, ra, dec, &r); + +#endif +} + +/* because the e-terms are secular, keep the real transformation for both + * coordinate systems in here with the secular variables cached. + * mode == AB_ECL_EOD: x = lam, y = bet (ecliptical) + * mode == AB_EQ_EOD: x = ra, y = dec (equatoreal) + */ +static void +ab_aux (double mj, double *x, double *y, double lsn, int mode) +{ + static double lastmj = -10000; + static double eexc; /* earth orbit excentricity */ + static double leperi; /* ... and longitude of perihelion */ + static char dirty = 1; /* flag for cached trig terms */ + + if (mj != lastmj) { + double T; /* centuries since J2000 */ + + T = (mj - J2000)/36525.; + eexc = 0.016708617 - (42.037e-6 + 0.1236e-6 * T) * T; + leperi = degrad(102.93735 + (0.71953 + 0.00046 * T) * T); + lastmj = mj; + dirty = 1; + } + + switch (mode) { + case AB_ECL_EOD: /* ecliptical coords */ + { + double *lam = x, *bet = y; + double dlsun, dlperi; + + dlsun = lsn - *lam; + dlperi = leperi - *lam; + + /* valid only for *bet != +-PI/2 */ + *lam -= ABERR_CONST/cos(*bet) * (cos(dlsun) - + eexc*cos(dlperi)); + *bet -= ABERR_CONST*sin(*bet) * (sin(dlsun) - + eexc*sin(dlperi)); + } + break; + + case AB_EQ_EOD: /* equatoreal coords */ + { + double *ra = x, *dec = y; + double sr, cr, sd, cd, sls, cls;/* trig values coords */ + static double cp, sp, ce, se; /* .. and perihel/eclipic */ + double dra, ddec; /* changes in ra and dec */ + + if (dirty) { + double eps; + + cp = cos(leperi); + sp = sin(leperi); + obliquity(mj, &eps); + se = sin(eps); + ce = cos(eps); + dirty = 0; + } + + sr = sin(*ra); + cr = cos(*ra); + sd = sin(*dec); + cd = cos(*dec); + sls = sin(lsn); + cls = cos(lsn); + + dra = ABERR_CONST/cd * ( -(cr * cls * ce + sr * sls) + + eexc * (cr * cp * ce + sr * sp)); + + ddec = se/ce * cd - sr * sd; /* tmp use */ + ddec = ABERR_CONST * ( -(cls * ce * ddec + cr * sd * sls) + + eexc * (cp * ce * ddec + cr * sd * sp) ); + + *ra += dra; + *dec += ddec; + radecrange (ra, dec); + } + break; + + default: + printf ("ab_aux: bad mode: %d\n", mode); + abort(); + break; + + } /* switch (mode) */ +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: aberration.c,v $ $Date: 2006/08/28 00:22:26 $ $Revision: 1.6 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/actan.c b/Common/Libraries/XEphemAstroLib/src/actan.c new file mode 100644 index 000000000..a04725ba1 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/actan.c @@ -0,0 +1,67 @@ +#include + +/* @(#) $Id: actan.c,v 1.3 2001/01/10 16:32:21 ecdowney Exp $ */ + +/* commonly in math.h, but not in strict ANSI C */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#endif + +double +actan(double sinx, double cosx) +{ + double ret; + + ret = 0.0; + if(cosx < 0.0) { + ret = M_PI; + } else if(cosx == 0.0) { + if(sinx < 0.0) { + return 3.0 * M_PI_2; + } else if(sinx == 0.0) { + return ret; + } else /* sinx > 0.0 */ { + return M_PI_2; + } + } else /* cosx > 0.0 */ { + if(sinx < 0.0) { + ret = 2.0 * M_PI; + } else if(sinx == 0.0) { + return ret; + } + } + + return ret + atan(sinx / cosx); +} + + +#if 0 + +#define D(X) (180.0 * (X) / M_PI) + +void main() { + double a, b; + + a = 0.0; b = 2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 1.0; b = 2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 2.0; b = 2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 2.0; b = 1.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 2.0; b = 0.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 2.0; b = -1.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 2.0; b = -2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 1.0; b = -2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = 0.0; b = -2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -1.0; b = -2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -2.0; b = -2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -2.0; b = -1.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -2.0; b = 0.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -2.0; b = 1.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -2.0; b = 2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); + a = -1.0; b = 2.0; printf("actan(%f, %f) = %f\n", a, b, D(actan(a, b))); +} + +#endif /* 0 */ + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: actan.c,v $ $Date: 2001/01/10 16:32:21 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/airmass.c b/Common/Libraries/XEphemAstroLib/src/airmass.c new file mode 100644 index 000000000..a5d046fe6 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/airmass.c @@ -0,0 +1,26 @@ +#include + +#include "astro.h" + +/* given apparent altitude find airmass. + * R.H. Hardie, 1962, `Photoelectric Reductions', Chapter 8 of Astronomical + * Techniques, W.A. Hiltner (Ed), Stars and Stellar Systems, II (University + * of Chicago Press: Chicago), pp178-208. + */ +void +airmass ( +double aa, /* apparent altitude, rads */ +double *Xp) /* airmasses */ +{ + double sm1; /* secant zenith angle, minus 1 */ + + /* degenerate near or below horizon */ + if (aa < degrad(3.0)) + aa = degrad(3.0); + + sm1 = 1.0/sin(aa) - 1.0; + *Xp = 1.0 + sm1*(0.9981833 - sm1*(0.002875 + 0.0008083*sm1)); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: airmass.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/anomaly.c b/Common/Libraries/XEphemAstroLib/src/anomaly.c new file mode 100644 index 000000000..c6bc8ebe5 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/anomaly.c @@ -0,0 +1,63 @@ +/* improved by rclark@lpl.arizona.edu (Richard Clark) */ + +#include +#include + +#include "astro.h" + + +#define TWOPI (2*PI) +#define STOPERR (1e-8) + +/* given the mean anomaly, ma, and the eccentricity, s, of elliptical motion, + * find the true anomaly, *nu, and the eccentric anomaly, *ea. + * all angles in radians. + */ +void +anomaly (double ma, double s, double *nu, double *ea) +{ + double m, fea, corr; + + if (s < 1.0) { + /* elliptical */ + double dla; + + m = ma-TWOPI*(long)(ma/TWOPI); + if (m > PI) m -= TWOPI; + if (m < -PI) m += TWOPI; + fea = m; + + for (;;) { + dla = fea-(s*sin(fea))-m; + if (fabs(dla).97 and M near 0*/ + corr = 1-(s*cos(fea)); + if (corr < .1) corr = .1; + dla /= corr; + fea -= dla; + } + *nu = 2*atan(sqrt((1+s)/(1-s))*tan(fea/2)); + } else { + /* hyperbolic */ + double fea1; + + m = fabs(ma); + fea = m / (s-1.); + fea1 = pow(6*m/(s*s),1./3.); + /* whichever is smaller is the better initial guess */ + if (fea1 < fea) fea = fea1; + + corr = 1; + while (fabs(corr) > STOPERR) { + corr = (m - s * sinh(fea) + fea) / (s*cosh(fea) - 1); + fea += corr; + } + if (ma < 0.) fea = -fea; + *nu = 2*atan(sqrt((s+1)/(s-1))*tanh(fea/2)); + } + *ea = fea; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: anomaly.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/ap_as.c b/Common/Libraries/XEphemAstroLib/src/ap_as.c new file mode 100644 index 000000000..64619fec9 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/ap_as.c @@ -0,0 +1,68 @@ +#include +#include + +#include "astro.h" + +/* convert the given apparent RA/Dec to astrometric precessed to Mjd IN PLACE. + * we have no un-abberation etc so to find the correction: assume + * *rap and *decp are astrometric@EOD, convert to apparent and back out + * the difference; then precess to Mjd. + */ +void +ap_as (Now *np, double Mjd, double *rap, double *decp) +{ + double r0 = *rap, d0 = *decp; + Obj o; + Now n; + + /* as -> ap */ + zero_mem ((void *)&o, sizeof(o)); + o.o_type = FIXED; + o.f_RA = (float)*rap; + o.f_dec = (float)*decp; + o.f_epoch = (float)mjd; + memcpy ((void *)&n, (void *)np, sizeof(Now)); + n.n_epoch = EOD; + obj_cir (&n, &o); + *rap -= o.s_ra - *rap; + *decp -= o.s_dec - *decp; + + /* then back to start for second order correction */ + o.o_type = FIXED; + o.f_RA = (float)*rap; + o.f_dec = (float)*decp; + o.f_epoch = (float)mjd; + memcpy ((void *)&n, (void *)np, sizeof(Now)); + n.n_epoch = EOD; + obj_cir (&n, &o); + *rap -= o.s_ra - r0; + *decp -= o.s_dec - d0; + + radecrange (rap, decp); + precess (mjd, Mjd, rap, decp); + radecrange (rap, decp); +} + +/* convert the given astrometric RA/Dec which are precessed to Mjd into + * apparent @ EOD IN PLACE. + */ +void +as_ap (Now *np, double Mjd, double *rap, double *decp) +{ + Obj o; + Now n; + + zero_mem ((void *)&o, sizeof(o)); + o.o_type = FIXED; + o.f_RA = (float)*rap; + o.f_dec = (float)*decp; + o.f_epoch = (float)Mjd; + memcpy ((void *)&n, (void *)np, sizeof(Now)); + n.n_epoch = EOD; + obj_cir (&n, &o); + *rap = o.s_ra; + *decp = o.s_dec; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: ap_as.c,v $ $Date: 2006/08/28 00:20:58 $ $Revision: 1.8 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/astro.h b/Common/Libraries/XEphemAstroLib/src/astro.h new file mode 100644 index 000000000..a060b683e --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/astro.h @@ -0,0 +1,824 @@ +#ifndef _ASTRO_H +#define _ASTRO_H + +#include + +#ifndef PI +#define PI 3.141592653589793 +#endif + +/* conversions among hours (of ra), degrees and radians. */ +#define degrad(x) ((x)*PI/180.) +#define raddeg(x) ((x)*180./PI) +#define hrdeg(x) ((x)*15.) +#define deghr(x) ((x)/15.) +#define hrrad(x) degrad(hrdeg(x)) +#define radhr(x) deghr(raddeg(x)) + +/* ratio of from synodic (solar) to sidereal (stellar) rate */ +#define SIDRATE .9972695677 + +/* manifest names for planets. + * N.B. must coincide with usage in pelement.c and plans.c. + * N.B. only the first 8 are valid for use with plans(). + */ + +#ifdef __cplusplus +extern "C" { +#endif + +// all of your legacy C code here + + + + +typedef enum { + MERCURY, + VENUS, + MARS, + JUPITER, + SATURN, + URANUS, + NEPTUNE, + PLUTO, + SUN, + MOON, + NOBJ /* total number of basic objects */ +} PLCode; + +/* moon constants for pl_moon */ +typedef enum { + X_PLANET = 0, /* use to mean planet itself */ + PHOBOS = NOBJ, DEIMOS, + IO, EUROPA, GANYMEDE, CALLISTO, + MIMAS, ENCELADUS, TETHYS, DIONE, RHEA, TITAN, HYPERION, IAPETUS, + ARIEL, UMBRIEL, TITANIA, OBERON, MIRANDA, + NBUILTIN +} MCode; + +/* starting point for MJD calculations + */ +#define MJD0 2415020.0 +#define J2000 (2451545.0 - MJD0) /* yes, 2000 January 1 at 12h */ + +/* the Now and Obj typedefs. + * also, a few miscellaneous constants and declarations. + */ + +#define SPD (24.0*3600.0) /* seconds per day */ +#define MAU (1.4959787e11) /* m / au */ +#define LTAU 499.005 /* seconds light takes to travel 1 AU */ +#define ERAD (6.37816e6) /* earth equitorial radius, m */ +#define MRAD (1.740e6) /* moon equitorial radius, m */ +#define SRAD (6.95e8) /* sun equitorial radius, m */ +#define FTPM 3.28084 /* ft per m */ +#define ESAT_MAG 2 /* default satellite magnitude */ +#define FAST_SAT_RPD 0.25 /* max earth sat rev/day considered "fast" */ + +#define EOD (-9786) /* special epoch flag: use epoch of date */ + +/* info about the local observing circumstances and misc preferences */ +typedef struct { + double n_mjd; /* modified Julian date, ie, days since + * Jan 0.5 1900 (== 12 noon, Dec 30, 1899), utc. + * enough precision to get well better than 1 second. + * N.B. if not first member, must move NOMJD inits. + */ + double n_lat; /* geographic (surface-normal) lt, >0 north, rads */ + double n_lng; /* longitude, >0 east, rads */ + double n_tz; /* time zone, hrs behind UTC */ + double n_temp; /* atmospheric temp, degrees C */ + double n_pressure; /* atmospheric pressure, mBar */ + double n_elev; /* elevation above sea level, earth radii */ + double n_dip; /* dip of sun below hzn at twilight, >0 below, rads */ + double n_epoch; /* desired precession display ep as an mjd, or EOD */ + char n_tznm[8]; /* time zone name; 7 chars or less, always 0 at end */ +} Now; + +/* handy shorthands for fields in a Now pointer, np */ +#define mjd np->n_mjd +#define lat np->n_lat +#define lng np->n_lng +#define tz np->n_tz +#define temp np->n_temp +#define pressure np->n_pressure +#define elev np->n_elev +#define dip np->n_dip +#define epoch np->n_epoch +#define tznm np->n_tznm +#define mjed mm_mjed(np) + +/* structures to describe objects of various types. + */ + +/* magnitude values in two different systems */ +typedef struct { + float m1, m2; /* either g/k or H/G, depending on... */ + int whichm; /* one of MAG_gk or MAG_HG */ +} Mag; + +/* whichm */ +#define MAG_HG 0 /* using 0 makes HG the initial default */ +#define MAG_gk 1 + +/* we actually store magnitudes times this scale factor in a short int */ +#define MAGSCALE 100.0 +#define set_smag(op,m) ((op)->s_mag = (short)floor((m)*MAGSCALE + 0.5)) +#define set_fmag(op,m) ((op)->f_mag = (short)floor((m)*MAGSCALE + 0.5)) +#define get_mag(op) ((op)->s_mag / MAGSCALE) +#define get_fmag(op) ((op)->f_mag / MAGSCALE) + +/* longest object name, including trailing '\0' */ +#define MAXNM 21 + +typedef unsigned char ObjType_t; +typedef unsigned char ObjAge_t; +typedef unsigned char byte; + +/* Obj is a massive union. + * many fields are in common so we use macros to make things a little easier. + */ + +/* fields common to *all* structs in the Obj union */ +#define OBJ_COMMON_FLDS \ + ObjType_t co_type; /* current object type; see flags, below */ \ + byte co_flags; /* FUSER*... used by others */ \ + ObjAge_t co_age; /* update aging code; see db.c */ \ + char co_name[MAXNM];/* name, including \0 */ \ + float co_ra; /* geo/topo app/mean ra, rads */ \ + float co_dec; /* geo/topo app/mean dec, rads */ \ + float co_gaera; /* geo apparent ra, rads */ \ + float co_gaedec; /* geo apparent dec, rads */ \ + float co_az; /* azimuth, >0 e of n, rads */ \ + float co_alt; /* altitude above topocentric horizon, rads */ \ + float co_elong; /* angular sep btwen obj and sun, >0 E, degs */ \ + float co_size; /* angular size, arc secs */ \ + short co_mag /* visual magnitude * MAGSCALE */ + +/* fields common to all solar system objects in the Obj union */ +#define OBJ_SOLSYS_FLDS \ + OBJ_COMMON_FLDS; /* all the fixed ones plus ... */ \ + float so_sdist; /* dist from object to sun, au */ \ + float so_edist; /* dist from object to earth, au */ \ + float so_hlong; /* heliocentric longitude, rads */ \ + float so_hlat; /* heliocentric latitude, rads */ \ + float so_phase /* phase, % */ + +/* fields common to all fixed objects in the Obj union */ +#define OBJ_FIXED_FLDS \ + char fo_spect[2]; /* spectral codes, if appropriate */ \ + float fo_epoch; /* eq of ra/dec and time when pm=0; mjd */ \ + float fo_ra; /* ra, rads, in epoch frame */ \ + float fo_dec; /* dec, rads, in epoch frame */ \ + float fo_pmra; /* ra proper motion, rads/day/cos(dec) */ \ + float fo_pmdec; /* dec proper motion, rads/day */ \ + char fo_class /* object class */ + +/* a generic object */ +typedef struct { + OBJ_COMMON_FLDS; +} ObjAny; + +/* a generic sol system object */ +typedef struct { + OBJ_SOLSYS_FLDS; +} ObjSS; + +/* basic Fixed object info. + */ +typedef struct { + OBJ_COMMON_FLDS; + OBJ_FIXED_FLDS; + + /* following are for galaxies */ + byte fo_ratio; /* minor/major diameter ratio. use s/get_ratio() */ + byte fo_pa; /* position angle, E of N, rads. use s/get_pa() */ +} ObjF; + +/* true-orbit parameters of binary-star object type */ +typedef struct { + float bo_T; /* epoch of periastron, years */ + float bo_e; /* eccentricity */ + float bo_o; /* argument of periastron, degress */ + float bo_O; /* longitude of node, degrees */ + float bo_i; /* inclination to plane of sky, degrees */ + float bo_a; /* semi major axis, arc secs */ + float bo_P; /* period, years */ + + /* companion position, computed by obj_cir() iff b_2compute */ + float bo_pa; /* position angle @ ep, rads E of N */ + float bo_sep; /* separation @ ep, arc secs */ + float bo_ra; /* geo/topo app/mean ra, rads */ + float bo_dec; /* geo/topo app/mean dec, rads */ +} BinOrbit; +typedef struct { + float bp_ep; /* epoch of pa/sep, year */ + float bp_pa; /* position angle @ ep, rads E of N */ + float bp_sep; /* separation @ ep, arc secs */ + + /* companion position, computed by obj_cir() iff b_2compute */ + float bp_ra; /* geo/topo app/mean ra, rads */ + float bp_dec; /* geo/topo app/mean dec, rads */ +} BinPos; +#define MAXBINPOS 2 /* max discrete epochs to store when no elements */ +typedef struct { + OBJ_COMMON_FLDS; + OBJ_FIXED_FLDS; + + byte b_2compute; /* whether to compute secondary positions */ + byte b_nbp; /* number of b_bp[] or 0 to use b_bo */ + short b_2mag; /* secondary's magnitude * MAGSCALE */ + char b_2spect[2]; /* secondary's spectrum */ + + /* either a real orbit or a set of discrete pa/sep */ + union { + BinOrbit b_bo; /* orbital elements */ + BinPos b_bp[MAXBINPOS]; /* table of discrete positions */ + } u; +} ObjB; + +#define fo_mag co_mag /* pseudonym for so_mag since it is not computed */ +#define fo_size co_size /* pseudonym for so_size since it is not computed */ + +/* macros to pack/unpack some fields */ +#define SRSCALE 255.0 /* galaxy size ratio scale */ +#define PASCALE (255.0/(2*PI)) /* pos angle scale factor */ +#define get_ratio(op) (((int)(op)->f_ratio)/SRSCALE) +#define set_ratio(op,maj,min) ((op)->f_ratio = (byte)(((maj) > 0) \ + ? ((min)*SRSCALE/(double)(maj)+0.5) \ + : 0)) +#define get_pa(op) ((double)(op)->f_pa/PASCALE) +#define set_pa(op,s) ((op)->f_pa = (byte)((s)*PASCALE + 0.5)) + +#define NCLASSES 128 /* n potential fo_classes -- allow for all ASCII */ + +/* basic planet object info */ +typedef struct { + OBJ_SOLSYS_FLDS; + PLCode plo_code; /* which planet */ + MCode plo_moon; /* which moon, or X_PLANET if planet */ + char plo_evis, plo_svis; /* if moon: whether visible from earth, sun */ + double plo_x, plo_y, plo_z; /* if moon: eq dist from center, planet radii */ + double plo_aux1, plo_aux2; /* various values, depending on type */ +} ObjPl; + +/* basic info about an object in elliptical heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + float eo_inc; /* inclination, degrees */ + float eo_Om; /* longitude of ascending node, degrees */ + float eo_om; /* argument of perihelion, degress */ + float eo_a; /* mean distance, aka,semi-maj axis,AU */ + float eo_M; /* mean anomaly, ie, degrees from perihelion at cepoch*/ + float eo_size; /* angular size, in arc seconds at 1 AU */ + float eo_startok; /* nominal first mjd this set is ok, else 0 */ + float eo_endok; /* nominal last mjd this set is ok, else 0 */ + double eo_e; /* eccentricity (double for when near 1 computing q) */ + double eo_cepoch; /* epoch date (M reference), as an mjd */ + double eo_epoch; /* equinox year (inc/Om/om reference), as an mjd. */ + Mag eo_mag; /* magnitude */ +} ObjE; + +/* basic info about an object in hyperbolic heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + double ho_epoch; /* equinox year (inc/Om/om reference), as an mjd */ + double ho_ep; /* epoch of perihelion, as an mjd */ + float ho_startok; /* nominal first mjd this set is ok, else 0 */ + float ho_endok; /* nominal last mjd this set is ok, else 0 */ + float ho_inc; /* inclination, degs */ + float ho_Om; /* longitude of ascending node, degs */ + float ho_om; /* argument of perihelion, degs. */ + float ho_e; /* eccentricity */ + float ho_qp; /* perihelion distance, AU */ + float ho_g, ho_k; /* magnitude model coefficients */ + float ho_size; /* angular size, in arc seconds at 1 AU */ +} ObjH; + +/* basic info about an object in parabolic heliocentric orbit */ +typedef struct { + OBJ_SOLSYS_FLDS; + double po_epoch; /* reference epoch, as an mjd */ + double po_ep; /* epoch of perihelion, as an mjd */ + float po_startok; /* nominal first mjd this set is ok, else 0 */ + float po_endok; /* nominal last mjd this set is ok, else 0 */ + float po_inc; /* inclination, degs */ + float po_qp; /* perihelion distance, AU */ + float po_om; /* argument of perihelion, degs. */ + float po_Om; /* longitude of ascending node, degs */ + float po_g, po_k; /* magnitude model coefficients */ + float po_size; /* angular size, in arc seconds at 1 AU */ +} ObjP; + +/* basic earth satellite object info */ +typedef struct { + OBJ_COMMON_FLDS; + double eso_epoch; /* reference epoch, as an mjd */ + double eso_n; /* mean motion, rev/day + * N.B. we need double due to a sensitive differencing + * operation used to compute MeanAnomaly in + * esat_main()/satellite.c. + */ + float eso_startok; /* nominal first mjd this set is ok, else 0 */ + float eso_endok; /* nominal last mjd this set is ok, else 0 */ + float eso_inc; /* inclination, degs */ + float eso_raan; /* RA of ascending node, degs */ + float eso_e; /* eccentricity */ + float eso_ap; /* argument of perigee at epoch, degs */ + float eso_M; /* mean anomaly, ie, degrees from perigee at epoch */ + float eso_decay; /* orbit decay rate, rev/day^2 */ + float eso_drag; /* object drag coefficient, (earth radii)^-1 */ + int eso_orbit; /* integer orbit number of epoch */ + + /* computed "sky" results unique to earth satellites */ + float ess_elev; /* height of satellite above sea level, m */ + float ess_range; /* line-of-site distance from observer to satellite, m*/ + float ess_rangev; /* rate-of-change of range, m/s */ + float ess_sublat; /* latitude below satellite, >0 north, rads */ + float ess_sublng; /* longitude below satellite, >0 east, rads */ + int ess_eclipsed;/* 1 if satellite is in earth's shadow, else 0 */ +} ObjES; + +typedef union { + ObjAny any; /* these fields valid for all types */ + ObjSS anyss; /* these fields valid for all solar system types */ + ObjPl pl; /* planet */ + ObjF f; /* fixed object, plus proper motion */ + ObjB b; /* bona fide binary stars (doubles are stored in f) */ + ObjE e; /* object in heliocentric elliptical orbit */ + ObjH h; /* object in heliocentric hyperbolic trajectory */ + ObjP p; /* object in heliocentric parabolic trajectory */ + ObjES es; /* earth satellite */ +} Obj; + + +/* for o_flags -- everybody must agree */ +#define FUSER0 0x01 +#define FUSER1 0x02 +#define FUSER2 0x04 +#define FUSER3 0x08 +#define FUSER4 0x10 +#define FUSER5 0x20 +#define FUSER6 0x40 +#define FUSER7 0x80 + +/* mark an object as being a "field star" */ +#define FLDSTAR FUSER3 +/* mark an object as circum calculation failed */ +#define NOCIRCUM FUSER7 + +/* Obj shorthands: */ +#define o_type any.co_type +#define o_name any.co_name +#define o_flags any.co_flags +#define o_age any.co_age +#define s_ra any.co_ra +#define s_dec any.co_dec +#define s_gaera any.co_gaera +#define s_gaedec any.co_gaedec +#define s_az any.co_az +#define s_alt any.co_alt +#define s_elong any.co_elong +#define s_size any.co_size +#define s_mag any.co_mag + +#define s_sdist anyss.so_sdist +#define s_edist anyss.so_edist +#define s_hlong anyss.so_hlong +#define s_hlat anyss.so_hlat +#define s_phase anyss.so_phase + +#define s_elev es.ess_elev +#define s_range es.ess_range +#define s_rangev es.ess_rangev +#define s_sublat es.ess_sublat +#define s_sublng es.ess_sublng +#define s_eclipsed es.ess_eclipsed + +#define f_class f.fo_class +#define f_spect f.fo_spect +#define f_ratio f.fo_ratio +#define f_pa f.fo_pa +#define f_epoch f.fo_epoch +#define f_RA f.fo_ra +#define f_pmRA f.fo_pmra +#define f_dec f.fo_dec +#define f_pmdec f.fo_pmdec +#define f_mag f.fo_mag +#define f_size f.fo_size + +#define e_cepoch e.eo_cepoch +#define e_epoch e.eo_epoch +#define e_startok e.eo_startok +#define e_endok e.eo_endok +#define e_inc e.eo_inc +#define e_Om e.eo_Om +#define e_om e.eo_om +#define e_a e.eo_a +#define e_e e.eo_e +#define e_M e.eo_M +#define e_size e.eo_size +#define e_mag e.eo_mag + +#define h_epoch h.ho_epoch +#define h_startok h.ho_startok +#define h_endok h.ho_endok +#define h_ep h.ho_ep +#define h_inc h.ho_inc +#define h_Om h.ho_Om +#define h_om h.ho_om +#define h_e h.ho_e +#define h_qp h.ho_qp +#define h_g h.ho_g +#define h_k h.ho_k +#define h_size h.ho_size + +#define p_epoch p.po_epoch +#define p_startok p.po_startok +#define p_endok p.po_endok +#define p_ep p.po_ep +#define p_inc p.po_inc +#define p_qp p.po_qp +#define p_om p.po_om +#define p_Om p.po_Om +#define p_g p.po_g +#define p_k p.po_k +#define p_size p.po_size + +#define es_epoch es.eso_epoch +#define es_startok es.eso_startok +#define es_endok es.eso_endok +#define es_inc es.eso_inc +#define es_raan es.eso_raan +#define es_e es.eso_e +#define es_ap es.eso_ap +#define es_M es.eso_M +#define es_n es.eso_n +#define es_decay es.eso_decay +#define es_drag es.eso_drag +#define es_orbit es.eso_orbit + +#define pl_code pl.plo_code +#define pl_moon pl.plo_moon +#define pl_evis pl.plo_evis +#define pl_svis pl.plo_svis +#define pl_x pl.plo_x +#define pl_y pl.plo_y +#define pl_z pl.plo_z +#define pl_aux1 pl.plo_aux1 +#define pl_aux2 pl.plo_aux2 + +#define b_2compute b.b_2compute +#define b_2spect b.b_2spect +#define b_2mag b.b_2mag +#define b_bo b.u.b_bo +#define b_bp b.u.b_bp +#define b_nbp b.b_nbp + +/* insure we always refer to the fields and no monkey business */ +#undef OBJ_COMMON_FLDS +#undef OBJ_SOLSYS_FLDS + +/* o_type code. + * N.B. names are assigned in order in objmenu.c + * N.B. if add one add switch in obj_cir(). + * N.B. UNDEFOBJ must be zero so new objects are undefinied by being zeroed. + * N.B. maintain the bitmasks too. + */ +enum ObjType { + UNDEFOBJ=0, + FIXED, BINARYSTAR, ELLIPTICAL, HYPERBOLIC, PARABOLIC, EARTHSAT, PLANET, + NOBJTYPES +}; + +/* types as handy bitmasks too */ +#define OBJTYPE2MASK(t) (1<<(t)) +#define FIXEDM OBJTYPE2MASK(FIXED) +#define BINARYSTARM OBJTYPE2MASK(BINARYSTAR) +#define ELLIPTICALM OBJTYPE2MASK(ELLIPTICAL) +#define HYPERBOLICM OBJTYPE2MASK(HYPERBOLIC) +#define PARABOLICM OBJTYPE2MASK(PARABOLIC) +#define EARTHSATM OBJTYPE2MASK(EARTHSAT) +#define PLANETM OBJTYPE2MASK(PLANET) +#define ALLM (~0) + +/* rise, set and transit information. + */ +typedef struct { + int rs_flags; /* info about what has been computed and any + * special conditions; see flags, below. + */ + double rs_risetm; /* mjd time of rise today */ + double rs_riseaz; /* azimuth of rise, rads E of N */ + double rs_trantm; /* mjd time of transit today */ + double rs_tranalt; /* altitude of transit, rads up from horizon */ + double rs_tranaz; /* azimuth of transit, rads E of N */ + double rs_settm; /* mjd time of set today */ + double rs_setaz; /* azimuth of set, rads E of N */ +} RiseSet; + +/* RiseSet flags */ +#define RS_NORISE 0x0001 /* object does not rise as such today */ +#define RS_NOSET 0x0002 /* object does not set as such today */ +#define RS_NOTRANS 0x0004 /* object does not transit as such today */ +#define RS_CIRCUMPOLAR 0x0010 /* object stays up all day today */ +#define RS_NEVERUP 0x0020 /* object never up at all today */ +#define RS_ERROR 0x1000 /* can't figure out anything! */ +#define RS_RISERR (0x0100|RS_ERROR) /* error computing rise */ +#define RS_SETERR (0x0200|RS_ERROR) /* error computing set */ +#define RS_TRANSERR (0x0400|RS_ERROR) /* error computing transit */ + +#define is_type(op,m) (OBJTYPE2MASK((op)->o_type) & (m)) + +/* any planet or its moons */ +#define is_planet(op,p) (is_type(op,PLANETM) && op->pl_code == (p)) + +/* any solar system object */ +#define is_ssobj(op) is_type(op,PLANETM|HYPERBOLICM|PARABOLICM|ELLIPTICALM) + + +/* natural satellite support */ + +typedef struct { + char *full; /* full name */ + char *tag; /* Roman numeral tag */ + float x, y, z; /* sky loc in planet radii: +x:east +y:south +z:front */ + float ra, dec; /* sky location in ra/dec */ + float mag; /* magnitude */ + int evis; /* whether geometrically visible from earth */ + int svis; /* whether in sun light */ + int pshad; /* whether moon is casting shadow on planet */ + int trans; /* whether moon is transiting */ + float sx, sy; /* shadow sky loc in planet radii: +x:east +y:south */ +} MoonData; + +/* separate set for each planet -- use in pl_moon */ + + +enum _marsmoons { + M_MARS = 0, /* == X_PLANET */ + M_PHOBOS, M_DEIMOS, + M_NMOONS /* including planet at 0 */ +}; + +enum _jupmoons { + J_JUPITER = 0, /* == X_PLANET */ + J_IO, J_EUROPA, J_GANYMEDE, J_CALLISTO, + J_NMOONS /* including planet */ +}; + +enum _satmoons { + S_SATURN = 0, /* == X_PLANET */ + S_MIMAS, S_ENCELADUS, S_TETHYS, S_DIONE, + S_RHEA, S_TITAN, S_HYPERION, S_IAPETUS, + S_NMOONS /* including planet */ +}; + +enum _uramoons { + U_URANUS = 0, /* == X_PLANET */ + U_ARIEL, U_UMBRIEL, U_TITANIA, U_OBERON, U_MIRANDA, + U_NMOONS /* including planet */ +}; + +#define X_MAXNMOONS S_NMOONS /* N.B. chosen by hand */ + + +/* global function declarations */ + + +/* aa_hadec.c */ +extern void aa_hadec (double lt, double alt, double az, double *ha, + double *dec); +extern void hadec_aa (double lt, double ha, double dec, double *alt, + double *az); + +/* aberration.c */ +extern void ab_ecl (double m, double lsn, double *lam, double *bet); +extern void ab_eq (double m, double lsn, double *ra, double *dec); + +/* airmass.c */ +extern void airmass (double aa, double *Xp); + +/* anomaly.c */ +extern void anomaly (double ma, double s, double *nu, double *ea); + +/* ap_as.c */ +extern void ap_as ( Now *np, double Mjd, double *rap, double *decp); +extern void as_ap ( Now *np, double Mjd, double *rap, double *decp); + +/* atlas.c */ +extern char *um_atlas (double ra, double dec); +extern char *u2k_atlas (double ra, double dec); +extern char *msa_atlas (double ra, double dec); + +/* aux.c */ +extern double mm_mjed (Now *np); + +/* chap95.c */ +extern int chap95 (double m, int obj, double prec, double *ret); + +/* chap95_data.c */ + +/* circum.c */ +extern int obj_cir (Now *np, Obj *op); + +/* comet.c */ +extern void comet (double m, double ep, double inc, double ap, double qp, + double om, double *lpd, double *psi, double *rp, double *rho, double *lam, + double *bet); + +/* constel.c */ +#define NCNS 89 +extern int cns_pick (double r, double d, double e); +extern int cns_id (char *abbrev); +extern char *cns_name (int id); +extern int cns_edges (double e, double **ra0p, double **dec0p, double **ra1p, + double **dec1p); +extern int cns_list (double ra, double dec, double e, double rad, int ids[]); +extern int cns_figure (int id, double e, double ra[],double dec[],int dcodes[]); +extern int cns_loadfigs (FILE *fp, char msg[]); + +/* dbfmt.c */ +extern int db_crack_line (char s[], Obj *op, char nm[][MAXNM], int nnm, + char whynot[]); +extern void db_write_line (Obj *op, char *lp); +extern int dbline_candidate (char line[]); +extern int get_fields (char *s, int delim, char *fields[]); +extern int db_tle (char *name, char *l1, char *l2, Obj *op); +extern int dateRangeOK (Now *np, Obj *op); + +/* deltat.c */ +extern double deltat (double m); + +/* earthsat.c */ +extern int obj_earthsat (Now *np, Obj *op); + +/* eq_ecl.c */ +extern void eq_ecl (double m, double ra, double dec, double *lt,double *lg); +extern void ecl_eq (double m, double lt, double lg, double *ra,double *dec); + +/* eq_gal.c */ +extern void eq_gal (double m, double ra, double dec, double *lt,double *lg); +extern void gal_eq (double m, double lt, double lg, double *ra,double *dec); + +/* formats.c */ +extern int fs_sexa (char *out, double a, int w, int fracbase); +extern int fs_date (char out[], int format, double jd); +extern int f_scansexa (const char *str, double *dp); +extern void f_sscandate (char *bp, int pref, int *m, double *d, int *y); + +/* helio.c */ +extern void heliocorr (double jd, double ra, double dec, double *hcp); + +/* jupmoon.c */ +extern void jupiter_data (double Mjd, char dir[], Obj *sop, Obj *jop, + double *jupsize, double *cmlI, double *cmlII, double *polera, + double *poledec, MoonData md[J_NMOONS]); + +/* libration.c */ +extern void llibration (double JD, double *llatp, double *llonp); + +/* magdecl.c */ +extern int magdecl (double l, double L, double e, double y, char *dir, + double *dp, char *err); + +/* marsmoon.c */ +extern void marsm_data (double Mjd, char dir[], Obj *sop, Obj *mop, + double *marssize, double *polera, double *poledec, MoonData md[M_NMOONS]); + +/* misc.c */ +extern void zero_mem (void *loc, unsigned len); +extern int tickmarks (double min, double max, int numdiv, double ticks[]); +extern int lc (int cx, int cy, int cw, int x1, int y1, int x2, int y2, + int *sx1, int *sy1, int *sx2, int *sy2); +extern void hg_mag (double h, double g, double rp, double rho, double rsn, + double *mp); +extern int magdiam (int fmag, int magstp, double scale, double mag, + double size); +extern void gk_mag (double g, double k, double rp, double rho, double *mp); +extern double atod (char *buf); +extern void solve_sphere (double A, double b, double cc, double sc, + double *cap, double *Bp); +extern double delra (double dra); +extern void now_lst (Now *np, double *lstp); +extern void radec2ha (Now *np, double ra, double dec, double *hap); +extern void gha (Now *np, Obj *op, double *ghap); +extern char *obj_description (Obj *op); +extern int is_deepsky (Obj *op); + +/* mjd.c */ +extern void cal_mjd (int mn, double dy, int yr, double *m); +extern void mjd_cal (double m, int *mn, double *dy, int *yr); +extern int mjd_dow (double m, int *dow); +extern int isleapyear (int year); +extern void mjd_dpm (double m, int *ndays); +extern void mjd_year (double m, double *yr); +extern void year_mjd (double y, double *m); +extern void rnd_second (double *t); +extern void mjd_dayno (double jd, int *yr, double *dy); +extern double mjd_day (double jd); +extern double mjd_hr (double jd); +extern void range (double *v, double r); +extern void radecrange (double *ra, double *dec); + +/* moon.c */ +extern void moon (double m, double *lam, double *bet, double *rho, + double *msp, double *mdp); + +/* mooncolong.c */ +extern void moon_colong (double jd, double lt, double lg, double *cp, + double *kp, double *ap, double *sp); + +/* moonnf.c */ +extern void moonnf (double mj, double *mjn, double *mjf); + +/* nutation.c */ +extern void nutation (double m, double *deps, double *dpsi); +extern void nut_eq (double m, double *ra, double *dec); + +/* obliq.c */ +extern void obliquity (double m, double *eps); + +/* parallax.c */ +extern void ta_par (double tha, double tdec, double phi, double ht, + double *rho, double *aha, double *adec); + +/* parallactic.c */ +extern double parallacticLDA (double lt, double dec, double alt); +extern double parallacticLHD (double lt, double ha, double dec); + +/* plans.c */ +extern void plans (double m, PLCode p, double *lpd0, double *psi0, + double *rp0, double *rho0, double *lam, double *bet, double *dia, + double *mag); + +/* plshadow.c */ +extern int plshadow (Obj *op, Obj *sop, double polera, + double poledec, double x, double y, double z, float *sxp, float *syp); + +/* plmoon_cir.c */ +extern int plmoon_cir (Now *np, Obj *moonop); +extern int getBuiltInObjs (Obj **opp); +extern void setMoonDir (char *dir); + +/* precess.c */ +extern void precess (double mjd1, double mjd2, double *ra, double *dec); + +/* reduce.c */ +extern void reduce_elements (double mjd0, double m, double inc0, + double ap0, double om0, double *inc, double *ap, double *om); + +/* refract.c */ +extern void unrefract (double pr, double tr, double aa, double *ta); +extern void refract (double pr, double tr, double ta, double *aa); + +/* rings.c */ +extern void satrings (double sb, double sl, double sr, double el, double er, + double JD, double *etiltp, double *stiltp); + +/* riset.c */ +extern void riset (double ra, double dec, double lt, double dis, + double *lstr, double *lsts, double *azr, double *azs, int *status); + +/* riset_cir.c */ +extern void riset_cir (Now *np, Obj *op, double dis, RiseSet *rp); +extern void twilight_cir (Now *np, double dis, double *dawn, double *dusk, + int *status); + +/* satmoon.c */ +extern void saturn_data (double Mjd, char dir[], Obj *eop, Obj *sop, + double *satsize, double *etilt, double *stlit, double *polera, + double *poledec, MoonData md[S_NMOONS]); + +/* sphcart.c */ +extern void sphcart (double l, double b, double r, double *x, double *y, + double *z); +extern void cartsph (double x, double y, double z, double *l, double *b, + double *r); + +/* sun.c */ +extern void sunpos (double m, double *lsn, double *rsn, double *bsn); + +/* twobody.c */ +extern int vrc (double *v, double *r, double tp, double e, double q); + +/* umoon.c */ +extern void uranus_data (double Mjd, char dir[], Obj *sop, Obj *uop, + double *usize, double *polera, double *poledec, MoonData md[U_NMOONS]); + +/* utc_gst.c */ +extern void utc_gst (double m, double utc, double *gst); +extern void gst_utc (double m, double gst, double *utc); + +/* vsop87.c */ +extern int vsop87 (double m, int obj, double prec, double *ret); + +#ifdef __cplusplus +} +#endif + +#endif /* _ASTRO_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: astro.h,v $ $Date: 2013/01/06 01:12:57 $ $Revision: 1.33 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/atlas.c b/Common/Libraries/XEphemAstroLib/src/atlas.c new file mode 100644 index 000000000..236153741 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/atlas.c @@ -0,0 +1,196 @@ +/* look up which star atlas an ra/dec is in. + * Urano and Mill contributed by Atsuo Ohki + * U2K by Robert Lane + * + * N.B. skylist.c assumes a certain max length for any returned string. + */ + +#include +#include + +#include "astro.h" + +/* for Millennium Star Atlas */ +static int msa_charts[] = { + /* 90*/ 2, /* 84*/ 4, /* 78*/ 8, /* 72*/ 10, /* 66*/ 12, + /* 60*/ 14, /* 54*/ 16, /* 48*/ 20, /* 42*/ 20, /* 36*/ 22, + /* 30*/ 22, /* 24*/ 24, /* 18*/ 24, /* 12*/ 24, /* 6*/ 24, + /* 0*/ 24, + /* -6*/ 24, /*-12*/ 24, /*-18*/ 24, /*-24*/ 24, /*-30*/ 22, + /*-36*/ 22, /*-42*/ 20, /*-48*/ 20, /*-54*/ 16, /*-60*/ 14, + /*-66*/ 12, /*-72*/ 10, /*-78*/ 8, /*-84*/ 4, /*-90*/ 2 +}; + +/* + * find the chart number of Millennium Star Atlas and return pointer to static + * string describing location. + * 0 <= ra < 24; -90 <= dec <= 90 + */ +char * +msa_atlas(double ra, double dec) +{ + static char buf[512]; + int zone, band; + int i, p; + + ra = radhr(ra); + dec = raddeg(dec); + buf[0] = 0; + if (ra < 0.0 || 24.0 <= ra || dec < -90.0 || 90.0 < dec) + return (buf); + zone = (int)(ra/8.0); + band = -((int)(dec+((dec>=0)?3:-3))/6 - 15); + for (p=0, i=0; i <= band; i++) + p += msa_charts[i]; + i = (int)((ra - 8.0*zone) / (8.0/msa_charts[band])); + sprintf(buf, "V%d - P%3d", zone+1, p-i+zone*516); + return (buf); +} + +/* for original Uranometria */ +static struct { + double l; + int n; +} um_zones[] = { + /* 84 - 90 */ { 84.5, 2}, + /* 72 - 85 */ { 72.5, 12}, + /* 60 - 73 */ { 61.0, 20}, + /* 49 - 62 */ { 50.0, 24}, + /* 38 - 51 */ { 39.0, 30}, + /* 27 - 40 */ { 28.0, 36}, + /* 16 - 29 */ { 17.0, 45}, + /* 5 - 18 */ { 5.5, 45}, + /* 0 - 6 */ { 0.0, 45}, + { 0.0, 0} +}; + +/* + * find the chart number of Uranometria first edition and return pointer to + * static string describing location. + * 0 <= ra < 24; -90 <= dec <= 90 + */ +char * +um_atlas(double ra, double dec) +{ + static char buf[512]; + int band, south; + int p; + double w; + + ra = radhr(ra); + dec = raddeg(dec); + buf[0] = 0; + if (ra < 0.0 || 24.0 <= ra || dec < -90.0 || 90.0 < dec) + return (buf); + p = 0; + if (dec < 0.0) { + dec = -dec; + south = 1; + } else + south = 0; + p = 1; + for (band=0; um_zones[band].n; band++) { + if (um_zones[band].l <= dec) + break; + p += um_zones[band].n; + } + if (!um_zones[band].n) + return (buf); + w = 24.0 / um_zones[band].n; + if (band) { + ra += w/2.0; + if (ra >= 24.0) + ra -= 24.0; + } + if (south && um_zones[band+1].n) + p = 475 - p - um_zones[band].n; + if (south && band == 0) { + /* south pole part is mis-ordered! */ + ra = 24.0 - ra; + } + sprintf(buf, "V%d - P%3d", south+1, p+(int)(ra/w)); + return (buf); +} + +/* for Uranometria 2000.0 */ +static struct { + double lowDec; /* lower dec cutoff */ + int numZones; /* number of panels (aka zones) */ + +} u2k_zones[] = { /* array of book layout info */ + /* 84 - 90 */ { 84.5, 1}, /* lower dec cutoff, # of panels in band */ + /* 73 - 85 */ { 73.5, 6}, + /* 62 - 74 */ { 62.0, 10}, + /* 51 - 63 */ { 51.0, 12}, + /* 40 - 52 */ { 40.0, 15}, + /* 29 - 41 */ { 29.0, 18}, + /* 17 - 30 */ { 17.0, 18}, + /* 5 - 18 */ { 5.5, 20}, + /* 0 - 6 */ { 0.0, 20}, + { 0.0, 0} /*numZones value in this line is a stopper.*/ +}; + +/* find the chart number of Uranometria 2000.0 and return pointer to static + * string describing location. + * 0 <= ra < 24; -90 <= dec <= 90 + */ +char * +u2k_atlas(double ra, double dec) +{ + static char buf[512]; + static char err[] = "???"; + int band; /* index to array */ + int south; /* flag for volume 2*/ + int panel; /* panel number */ + + ra = radhr(ra); + dec = raddeg(dec); + buf[0] = 0; + if (ra < 0.0 || 24.0 <= ra || dec < -90.0 || 90.0 < dec) { + strcpy (buf, err); + return (buf); /* range checking */ + } + + if (dec < 0.0) { + dec = -dec; + south = 1; /* South is mirror of North */ + } else + south = 0; + + panel = 1; + band = 0; + + /* scan u2k_zones for the correct band: */ + while (u2k_zones[band].numZones != 0 && dec <= u2k_zones[band].lowDec ){ + panel += u2k_zones[band].numZones; /*accumulate total panels */ + band++ ; + } + + if (!u2k_zones[band].numZones) { /* hit end of array with no match. */ + strcpy (buf, err); + return (buf); + } + + ra -= 12.0 / u2k_zones[band].numZones; /*offset by half-width of panel*/ + if (ra >= 24.0) /* reality check. shouldn't happen. */ + ra -= 24.0; + + if (ra < 0.0) /* offset could give negative ra */ + ra += 24.0; + + if (south && u2k_zones[band+1].numZones) + panel = 222 - panel - u2k_zones[band].numZones; + + /* resultant panel number is accumulated panels in prior bands plus + * ra's fraction of panels in dec's band. panel # goes up as ra goes + * down. + */ + sprintf(buf, "V%d - P%3d", south+1, + panel+(int)(u2k_zones[band].numZones*(24.0 - ra)/24.0)); + + return (buf); +} + + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: atlas.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.8 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/auxil.c b/Common/Libraries/XEphemAstroLib/src/auxil.c new file mode 100644 index 000000000..0fa712f36 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/auxil.c @@ -0,0 +1,42 @@ +/* aux functions so programs besides XEphem can use this library. + */ + +#include +#include + +#include "astro.h" +#include "preferences.h" + +/* default preferences */ +static int prefs[NPREFS] = { + PREF_TOPO, PREF_METRIC, PREF_MDY, PREF_UTCTZ, PREF_HIPREC, PREF_NOMSGBELL, + PREF_PREFILL, PREF_TIPSON, PREF_CONFIRMON, PREF_SUN +}; + +/* called anytime we want to know a preference. + */ +int +pref_get(Preferences pref) +{ + return (prefs[pref]); +} + +/* call to force a certain preference, return the old setting. + */ +int +pref_set (Preferences pref, int newp) +{ + int prior = pref_get(pref); + prefs[pref] = newp; + return (prior); +} + +/* given an mjd, return it modified for terrestial dynamical time */ +double +mm_mjed (Now *np) +{ + return (mjd + deltat(mjd)/86400.0); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: auxil.c,v $ $Date: 2003/05/04 04:41:57 $ $Revision: 1.8 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/bdl.c b/Common/Libraries/XEphemAstroLib/src/bdl.c new file mode 100644 index 000000000..048640518 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/bdl.c @@ -0,0 +1,238 @@ +/* crack natural satellite files from BDL */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "bdl.h" + +typedef enum {I, F, NL} ScanType; +#define SCANFLD(f,w,vp) if(readField(fp,f,w,(void *)vp,ynot)<0) return (-1) + +static int readField (FILE *fp, ScanType f, int w, void *ptr, char ynot[]); +static int readRec (FILE *fp, double *t0, double cmx[], double cfx[], + double cmy[], double cfy[], double cmz[], double cfz[], char ynot[]); + +/* given a sequencial text file in BDL natural satellite ephemeris format and a + * JD, find the x/y/z positions of each satellite. store in the given arrays, + * assumed to have one entry per moon. values are planetocentric, +x east, +y + * north, +z away from earth, all in au. corrected for light time. + * return the number of satellites or -1 and reason in ymot[]. + * files obtained from ftp://ftp.bdl.fr/pub/misc/satxyz. + */ +int +read_bdl (FILE *fp, double jd, double *xp, double *yp, double *zp, char ynot[]) +{ + int npla; + int nsat; + int idn[8]; + double freq[8]; + double delt[8]; + double djj; + double cmx[6], cfx[4], cmy[6], cfy[4], cmz[6], cfz[4]; + int ienrf; + int jan; + int reclen; + long os0; + double t0; + int i; + + /* read header line */ + SCANFLD (I, 2, &npla); + SCANFLD (I, 2, &nsat); + for (i = 0; i < nsat; i++) + SCANFLD (I, 5, &idn[i]); + for (i = 0; i < nsat; i++) + SCANFLD (F, 8, &freq[i]); + for (i = 0; i < nsat; i++) + SCANFLD (F, 5, &delt[i]); + SCANFLD (I, 5, &ienrf); + SCANFLD (F, 15, &djj); + SCANFLD (I, 5, &jan); + SCANFLD (NL, 0, NULL); + + /* record position of first record */ + os0 = ftell (fp); + + /* read first record to get length */ + reclen = readRec (fp, &t0, cmx, cfx, cmy, cfy, cmz, cfz, ynot); + if (reclen < 0) + return (-1); + + /* compute location of each satellite */ + for (i = 0; i < nsat; i++) { + int id = (int)floor((jd-djj)/delt[i]) + idn[i] - 2; + long os = os0 + id*reclen; + double t1, anu, tau, tau2, at; + double tbx, tby, tbz; + + if (fseek (fp, os, SEEK_SET) < 0) { + sprintf (ynot, "Seek error to %ld for rec %d", os, id); + return (-1); + } + + if (readRec (fp, &t0, cmx, cfx, cmy, cfy, cmz, cfz, ynot) < 0) + return (-1); + + t1 = floor(t0) + 0.5; + anu = freq[i]; + tau = jd - t1; + tau2 = tau * tau; + at = tau*anu; + + tbx = cmx[0]+cmx[1]*tau+cmx[2]*sin(at+cfx[0]) + +cmx[3]*tau*sin(at+cfx[1]) + +cmx[4]*tau2*sin(at+cfx[2]) + +cmx[5]*sin(2*at+cfx[3]); + tby = cmy[0]+cmy[1]*tau+cmy[2]*sin(at+cfy[0]) + +cmy[3]*tau*sin(at+cfy[1]) + +cmy[4]*tau2*sin(at+cfy[2]) + +cmy[5]*sin(2*at+cfy[3]); + tbz = cmz[0]+cmz[1]*tau+cmz[2]*sin(at+cfz[0]) + +cmz[3]*tau*sin(at+cfz[1]) + +cmz[4]*tau2*sin(at+cfz[2]) + +cmz[5]*sin(2*at+cfz[3]); + + xp[i] = tbx*1000./149597870.; + yp[i] = tby*1000./149597870.; + zp[i] = tbz*1000./149597870.; + } + + return (nsat); +} + +/* read one field. + * return 0 if ok else -1 + * N.B. this is enforce width, without skipping leading blanks. + */ +static int +readField (FILE *fp, ScanType f, int width, void *ptr, char ynot[]) +{ + char buf[128]; + char *bp; + + if (width > sizeof(buf)-1) { + sprintf (ynot, "BDL Field width %d > %d", width, (int)sizeof(buf)); + return (-1); + } + if (width != (int)fread (buf, 1, width, fp)) { + if (ferror(fp)) strcpy (ynot, "BDL IO error"); + else if (feof(fp)) strcpy (ynot, "BDL unexpected EOF"); + else strcpy (ynot, "BDL short file"); + return (-1); + } + + buf[width] = '\0'; + switch (f) { + case I: + *(int *)ptr = atoi (buf); + break; + case F: + bp = strchr (buf, 'D'); + if (bp) + *bp = 'e'; + *(double *)ptr = atof (buf); + break; + case NL: + fgets (buf, sizeof(buf), fp); + break; + default: + sprintf (ynot, "Bug! format = %d", f); + return (-1); + } + return (0); +} + +/* read one satellite record. + * return number of chars read else -1. + */ +static int +readRec (FILE *fp, double *t0, double cmx[], double cfx[], double cmy[], +double cfy[], double cmz[], double cfz[], char ynot[]) +{ + + long pos0, pos1; + int isat, idx; + int ldat1, ldat2; + int i; + + pos0 = ftell (fp); + + SCANFLD (I, 1, &isat); + SCANFLD (I, 5, &idx); + SCANFLD (I, 8, &ldat1); + SCANFLD (I, 8, &ldat2); + SCANFLD (F, 9, t0); + for (i = 0; i < 6; i++) + SCANFLD (F, 17, &cmx[i]); + for (i = 0; i < 4; i++) + SCANFLD (F, 17, &cfx[i]); + for (i = 0; i < 6; i++) + SCANFLD (F, 17, &cmy[i]); + for (i = 0; i < 4; i++) + SCANFLD (F, 17, &cfy[i]); + for (i = 0; i < 6; i++) + SCANFLD (F, 17, &cmz[i]); + for (i = 0; i < 4; i++) + SCANFLD (F, 17, &cfz[i]); + SCANFLD (NL, 0, NULL); + + pos1 = ftell (fp); + + return (pos1 - pos0); +} + + +#ifdef TEST_IT +/* stand-alone test program. + * for example, compare + * a.out jupiter.9910 2451910.50000 + * with + * satxyz2 + * jup.dir.9910 + * 2001 1 1 0 0 0 + * 1 0 0 0 + * 1 + */ +int +main (int ac, char *av[]) +{ + double x[10], y[10], z[10]; + char ynot[1024]; + double jd; + char *fn; + FILE *fp; + int nm; + int i; + + if (ac != 3) { + fprintf (stderr, "Usage: %s \n", av[0]); + abort(); + } + fn = av[1]; + jd = atof (av[2]); + + fp = fopen (fn, "r"); + if (!fp) { + perror (fn); + abort(); + } + + nm = read_bdl (fp, jd, x, y, z, ynot); + if (nm < 0) { + fprintf (stderr, "%s\n", ynot); + abort(); + } + + for (i = 0; i < nm; i++) + printf (" X= %19.11E Y= %19.11E Z= %19.11E\n", x[i], y[i], z[i]); + + return (0); +} +#endif + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: bdl.c,v $ $Date: 2008/04/20 08:11:35 $ $Revision: 1.6 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/bdl.h b/Common/Libraries/XEphemAstroLib/src/bdl.h new file mode 100644 index 000000000..3b4d0ea33 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/bdl.h @@ -0,0 +1,6 @@ +extern int read_bdl (FILE *fp, double jd, double *xp, double *yp, double *zp, + char ynot[]); + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: bdl.h,v $ $Date: 2003/03/20 08:56:31 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/chap95.c b/Common/Libraries/XEphemAstroLib/src/chap95.c new file mode 100644 index 000000000..bde4384f9 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/chap95.c @@ -0,0 +1,174 @@ +/* heliocentric rectangular equatorial coordinates of Jupiter to Pluto; + * from Chapront's expansion of DE200/extension of DE200; mean equator J2000.0 + * + * calculation time (milliseconds) on an HP 715/75, Jupiter to Pluto: + * (each coordinate component counted as 1 term, + * secular terms included for JD 2448908.5 = 1992 Oct 13.0) + * + * prec terms rates no rates + * 0.0 2256 5.1 4.6 + * + * 1e-7 792 2.6 2.4 --> nominal precision rel. to DE200 + * 1e-6 535 2.1 2.0 + * 1e-5 350 1.8 1.6 + * 1e-4 199 1.5 1.4 + * 1e-3 96 1.2 1.1 + * + * no drop 2256 4.5 3.9 (code without test criterion) + */ + +#include + +#include "astro.h" +#include "chap95.h" + +#define CHAP_MAXTPOW 2 /* NB: valid for all 5 outer planets */ + +/* chap95() + * + * input: + * m modified JD; days from J1900.0 = 2415020.0 + * + * prec precision level, in radians. + * if (prec = 0.0), you get the full precision, namely + * a deviation of not more than 0.02 arc seconds (1e-7 rad) + * from the JPL DE200 integration, on which this expansion + * is based. + * + * obj object number as in astro.h (jupiter=3, saturn=4, ...) + * + * output: + * ret[6] cartesian components of position and velocity + * + * return: + * 0 Ok + * 1 time out of range [CHAP_BEGIN .. CHAP_END] + * 2 object out of range [JUPITER .. PLUTO] + * 3 precision out of range [0.0 .. 1e-3] + */ +int +chap95 (double m, int obj, double prec, double *ret) +{ + static double a0[] = { /* semimajor axes for precision ctrl */ + 0.39, 0.72, 1.5, 5.2, 9.6, 19.2, 30.1, 39.5, 1.0 + }; + double sum[CHAP_MAXTPOW+1][6]; /* [T^0, ..][X,Y,Z,X',Y',Z'] */ + double T, t; /* time in centuries and years */ + double ca, sa, Nu; /* aux vars for terms */ + double precT[CHAP_MAXTPOW+1]; /* T-augmented precision threshold */ + chap95_rec *rec; /* term coeffs */ + int cooidx; + + /* check parameters */ + if (m < CHAP_BEGIN || m > CHAP_END) + return (1); + + if (obj < JUPITER || obj > PLUTO) + return (2); + + if (prec < 0.0 || prec > 1e-3) + return (3); + + /* init the sums */ + zero_mem ((void *)sum, sizeof(sum)); + + T = (m - J2000)/36525.0; /* centuries since J2000.0 */ + + /* modify precision treshold for + * a) term storing scale + * b) convert radians to au + * c) account for skipped terms (more terms needed for better prec) + * threshold empirically established similar to VSOP; stern + * d) augment for secular terms + */ + precT[0] = prec * CHAP_SCALE /* a) */ + * a0[obj] /* b) */ + / (10. * (-log10(prec + 1e-35) - 2)); /* c) */ + t = 1./(fabs(T) + 1e-35); /* d) */ + precT[1] = precT[0]*t; + precT[2] = precT[1]*t; + + t = T * 100.0; /* YEARS since J2000.0 */ + + ca = sa = Nu = 0.; /* shut up compiler warning 'uninitialised' */ + + switch (obj) { /* set initial term record pointer */ + case JUPITER: rec = chap95_jupiter; break; + case SATURN: rec = chap95_saturn; break; + case URANUS: rec = chap95_uranus; break; + case NEPTUNE: rec = chap95_neptune; break; + case PLUTO: rec = chap95_pluto; break; + default: + return (2); /* wrong object: severe internal trouble */ + } + + /* do the term summation into sum[T^n] slots */ + for (; rec->n >= 0; ++rec) { + double *amp; + + /* NOTE: The formula + * X = SUM[i=1,Records] T**n_i*(CX_i*cos(Nu_k*t)+SX_i*sin(Nu_k*t)) + * could be rewritten as SUM( ... A sin (B + C*t) ) + * "saving" trigonometric calls. However, e.g. for Pluto, + * there are only 65 distinct angles NU_k (130 trig calls). + * With that manipulation, EVERY arg_i would be different for X, + * Y and Z, which is 3*96 terms. Hence, the formulation as + * given is good (optimal?). + */ + + for (cooidx = 0, amp = rec->amp; cooidx < 3; ++cooidx) { + double C, S, term, termdot; + short n; /* fast access */ + + C = *amp++; + S = *amp++; + n = rec->n; + + /* drop term if too small + * this is quite expensive: 17% of loop time + */ + if (fabs(C) + fabs(S) < precT[n]) + continue; + + if (n == 0 && cooidx == 0) { /* new Nu only here */ + double arg; + + Nu = rec->Nu; + arg = Nu * t; + arg -= floor(arg/(2.*PI))*(2.*PI); + ca = cos(arg); /* blast it - even for Nu = 0.0 */ + sa = sin(arg); + } + + term = C * ca + S * sa; + sum[n][cooidx] += term; +#if CHAP_GETRATE + termdot = (-C * sa + S * ca) * Nu; + sum[n][cooidx+3] += termdot; + if (n > 0) sum[n - 1][cooidx+3] += n/100.0 * term; +#endif + } /* cooidx */ + } /* records */ + + /* apply powers of time and sum up */ + for (cooidx = 0; cooidx < 6; ++cooidx) { + ret[cooidx] = (sum[0][cooidx] + + T * (sum[1][cooidx] + + T * (sum[2][cooidx] )) )/CHAP_SCALE; + } + + /* TEST: if the MAIN terms are dropped, get angular residue + ret[0] = sqrt(ret[0]*ret[0] + ret[1]*ret[1] + ret[2]*ret[2])/a0[obj]; + */ + +#if CHAP_GETRATE + for (cooidx = 3; cooidx < 6; ++cooidx) { + ret[cooidx] /= 365.25; /* yearly to daily rate */ + } +#endif + + return (0); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: chap95.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/chap95.h b/Common/Libraries/XEphemAstroLib/src/chap95.h new file mode 100644 index 000000000..fff8acdd7 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/chap95.h @@ -0,0 +1,68 @@ +/* Position of outer planets; straightforward from: +ftp://adc.gsfc.nasa.gov/pub/adc/archives/journal_tables/A+AS/109/181: + +J/A+AS/109/181 Planetary ephemerides (Chapront, 1995) +=============================================================================== +Representation of planetary ephemerides by frequency analysis. Application to +the five outer planets. + CHAPRONT J. + + =1995A&AS..109..181C (SIMBAD/NED Reference) +=============================================================================== + +Keywords: ephemerides - planets and satellites: general - methods: numerical + +Contents: + Heliocentric equatorial rectangular coordinates of the five outer planets + (X, Y and Z). The source is based on DE200 (tables 4 to 7) or a reconstruction + of DE200 by numerical integration (tables 9 to 13). The reference frame is + the mean equator and equinox J2000 of DE200. + + The general formulation of the series X is: + X = SUM[i=1,Records] T**n_i*(CX_i*cos(Nu_k*t)+SX_i*sin(Nu_k*t)) + The formulation is identical for Y and Z. + T is the time (TDB) in Julian centuries from J2000: + T = (JulianDate - 2451545.0)/36525 + t is the time (TDB) in Julian years from J2000: + t = (JulianDate - 2451545.0)/365.25 + Nu is the frequency. Frequencies are identical for all terms of rank k: + Nu_k = Nu_i when n_i = 0 + For purely secular terms k = 0 and Nu_0 = 0 + +=============================================================================== +(End) Patricia Bauer [CDS] 03-Oct-1994 +*/ + +#define CHAP_SCALE 1e10 + +/* JDs of validity period */ +#define CHAP_BEGIN (2338032.5 - MJD0) /* 1689/3/19 */ +#define CHAP_END (2542032.5 - MJD0) /* 2247/10/1 */ + +/* coding flags */ +/* calculating rates increases time by about 10% + * + * On an HP715/75, for pluto the times per step are 0.00049 s and 0.00057 s + * This method is quite fast. + */ +#define CHAP_GETRATE 1 + +typedef struct { + short n; /* order of time; "-1" marks end of list */ + double amp[6]; /* amplitudes of cosine and sine terms for x,y,z */ + /* in original order [CX,SX,CY,SY,CZ,SZ] */ + double Nu; /* Frequency Nu_k; given only at n=0 */ +} chap95_rec; + +extern chap95_rec chap95_jupiter[]; +extern chap95_rec chap95_saturn[]; +extern chap95_rec chap95_uranus[]; +extern chap95_rec chap95_neptune[]; +extern chap95_rec chap95_pluto[]; + +extern int chap95 (double m, int obj, double prec, double *ret); + + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: chap95.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.2 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/chap95_data.c b/Common/Libraries/XEphemAstroLib/src/chap95_data.c new file mode 100644 index 000000000..2c177355b --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/chap95_data.c @@ -0,0 +1,783 @@ +/* data tables for Chapront95 expansion of DE200 for outer planets + * + * created by automatic conversion from original distribution files at + * ftp://adc.gsfc.nasa.gov/pub/adc/archives/journal_tables/A+AS/109/181 + */ + +#include "chap95.h" + +chap95_rec chap95_jupiter[] = { + { 0, { -3658015942., 0., -908357166., 0., -300271978., 0. }, 0. }, + { 1, { 3211736., 0., -12066362., 0., -5380492., 0. }, }, + { 0, { 4891337., 5430776., -9059458., 4045908., -3979137., 1598300. }, 0.0168745727060282 }, + { 1, { -1952368., 3224556., -3665363., -6161184., -1519962., -2703058. }, }, + { 0, { 589280., -62004., -1226982., 1326111., -536148., 568311. }, 0.0319163179770344 }, + { 0, { -132797., 113059., 332715., -538044., 144358., -232591. }, 0.0404897860926306 }, + { 0, { 19390., -8208., -31003., 153367., -13456., 65630. }, 0.0595473299932462 }, + { 0, { -2479., -51303., 154576., 368773., 65961., 157222. }, 0.0831987723231718 }, + { 1, { -170149., 190549., 249291., -236183., 108588., -106146. }, }, + { 0, { -14177274., -32784827., -28623327., 13932421., -12074567., 6670491. }, 0.1015656301267251 }, + { 1, { -3789129., 1413684., 2551178., 1957155., 1164465., 819456. }, }, + { 0, { 12762505., 226609., -4837955., 12330917., -2405339., 5249055. }, 0.1121334694975955 }, + { 1, { 547155., 1481967., -2013999., -2660987., -879208., -1179904. }, }, + { 0, { -62226., -41759., -601831., 240767., -255949., 106231. }, 0.1235484250413803 }, + { 0, { 38451., -38927., 103878., -40998., 43472., -16957. }, 0.1380033981088614 }, + { 0, { 6892., -67712., 62422., 39405., 26942., 18451. }, 0.1534434914458037 }, + { 0, { -75., 8062., -21151., -17198., -9222., -7580. }, 0.1694333239035300 }, + { 0, { 35355., 38181., 70566., -4376., 30386., -2939. }, 0.1895181584594278 }, + { 0, { -743715., -251198., -403257., 598432., -166123., 265466. }, 0.2002642151969322 }, + { 0, { 5834437., -10339387., 9606367., 9534188., 3806370., 4385708. }, 0.2140513638608579 }, + { 1, { 1033031., -590411., -1874404., 575478., -835406., 235620. }, }, + { 2, { 514744., -29792., -180518., -472533., -83894., -204253. }, }, + { 0, { 160903., -61277., -282564., -163689., -122933., -69902. }, 0.2282692683160305 }, + { 0, { -27903., 23114., 66255., 2167., 28792., 688. }, 0.2391180221674930 }, + { 0, { 4501., -5373., -15639., 12832., -6785., 5553. }, 0.2594200270243392 }, + { 0, { -7016., 15969., 7639., -40047., 3504., -17544. }, 0.2773387700991547 }, + { 0, { 12123., -71452., 49781., 137809., 20807., 61532. }, 0.2898870950096423 }, + { 0, { 9304., 220632., -262203., -258243., -112815., -119757. }, 0.2988785450891279 }, + { 0, { -326815., -368979., 836570., 374605., 369053., 187133. }, 0.3074463122377075 }, + { 0, { -285560., 1568528., -1374181., -462165., -548097., -222596. }, 0.3260929459480317 }, + { 1, { 61071., -241375., 291550., 243626., 110389., 123427. }, }, + { 2, { 227305., 162244., -116416., 352218., -65158., 140646. }, }, + { 0, { 132035., 23450., 116510., 219543., 39775., 92330. }, 0.3428930094327709 }, + { 0, { -45107., 4887., -87029., -68971., -33182., -29857. }, 0.3524288275557115 }, + { 0, { 11180., 1421., 46242., 3234., 18448., 1726. }, 0.3676619945918164 }, + { 0, { 55636., 74415., 46443., -53844., 16908., -25824. }, 0.3817149836030239 }, + { 0, { -38712., -7953., 29506., -14698., 13883., -4384. }, 0.4024967272931009 }, + { 0, { 737722., -3325874., -1725701., 1468892., -912453., 541637. }, 0.4182255664674069 }, + { 0, { 5843515., 17000877., -16425950., 5641739., -7208900., 1880856. }, 0.4281067291965077 }, + { 1, { -2114864., 879909., -1266263., -2982111., -450528., -1332322. }, }, + { 0, { -110808., 282843., -713054., 221824., -319044., 77631. }, 0.4373541005020147 }, + { 0, { 27829., -71864., 150036., -117804., 67370., -49093. }, 0.4560888031675395 }, + { 0, { 539822., 432225., -319385., 741980., -155058., 309230. }, 0.4797023746036813 }, + { 1, { 353284., -620503., 706907., 178082., 295983., 93413. }, }, + { 2, { -261070., -393195., 329623., -469610., 151911., -193312. }, }, + { 0, { -2161367., -547925., 176106., -2360409., 138737., -1001848. }, 0.5007107300722267 }, + { 0, { 27247697., -10878578., 11956310., 25892704., 4272604., 11389311. }, 0.5164419295757459 }, + { 0, { 42877248480., -29362030594., 27366424342., 39132999157., 10686125728., 17489248357. }, 0.5296606590588865 }, + { 1, { -15857296., -20344255., 19186229., -13052624., 8755482., -9908361. }, }, + { 2, { 6609281., 13149967., -10297853., 6131752., -4439009., 2280289. }, }, + { 0, { -18516226., 26000654., -21956172., -17721375., -8891106., -8274169. }, 0.5451799187785868 }, + { 0, { 924882., -10894893., 8857638., 2001907., 3741179., 1161552. }, 0.5595376466726170 }, + { 0, { 27311120., 29858821., -26928769., 14296744., -12217212., 5123580. }, 0.5795066100144535 }, + { 1, { 13030129., -18873913., 10742323., 12477743., 4123021., 5837654. }, }, + { 2, { -7424534., -11497916., 9860547., -3566473., 4394376., -1162013. }, }, + { 0, { -26277687., -24566747., 22551607., -14225886., 10328130., -5247184. }, 0.5911608643334181 }, + { 1, { 8339866., -11546546., 6481932., 8138775., 2473924., 3793057. }, }, + { 0, { -712821., 106326., 116149., -425425., 75173., -183273. }, 0.6154942605989902 }, + { 0, { 10367622., 10279698., -8594103., 9404066., -3937577., 3712537. }, 0.6326027345940838 }, + { 1, { 897045., 857895., -751707., 469816., -332572., 171768. }, }, + { 0, { 189069., -432469., 40216., 165708., -8464., 80857. }, 0.6444812066531010 }, + { 1, { 358961., 188063., -197366., 119155., -93776., 37030. }, }, + { 0, { 2801., -42321., 23044., 13212., 9231., 7153. }, 0.6631203366491857 }, + { 0, { 4336., 3618., -871., -1752., -434., -1180. }, 0.6824152589010221 }, + { 0, { -14481., -6624., 4573., -1496., 2554., -8. }, 0.7002707215510490 }, + { 0, { -223890., 106356., -2013., -41001., 13805., -21357. }, 0.7195602591163895 }, + { 1, { 28954., 129738., -23285., -9336., -9672., -11954. }, }, + { 0, { 500290., -303873., -27592., 125875., -40399., 71687. }, 0.7280600120460897 }, + { 0, { 729018., -876869., -461257., 537352., -184892., 325523. }, 0.7385877731868745 }, + { 1, { -549774., 403499., -445388., -787700., -178960., -329235. }, }, + { 0, { -154224., -136331., 129548., -90101., 64599., -32148. }, 0.7506622252123309 }, + { 0, { 36827., 21410., -22046., 16972., -12019., 7006. }, 0.7602186192346818 }, + { 0, { -9432., -929., 4761., -3712., 2630., -1835. }, 0.7714697369886172 }, + { 0, { 2272., -244., -1058., 1139., -553., 579. }, 0.7851226034217180 }, + { 0, { 236., 2440., 694., 90., 191., -135. }, 0.8150362349770407 }, + { 0, { 2171., -25731., -8199., 18101., -2071., 8952. }, 0.8291920856012017 }, + { 0, { -6488604., 1912961., -2051708., -5704251., -640826., -2468602. }, 0.8459901559232306 }, + { 1, { 133871., -10089., -90464., 3174., -43566., 7399. }, }, + { 2, { 3748., 19859., 25943., -57668., 8170., -24731. }, }, + { 0, { 41412., 22074., -6939., -4045., -5698., -1697. }, 0.8578592213260567 }, + { 0, { 574., 1501., -732., 4283., -255., 1685. }, 0.8738246080594192 }, + { 0, { 2322., -1798., 335., 937., 88., 501. }, 0.8963147077496537 }, + { 0, { -43604., -1899., 4040., -39896., 2661., -17151. }, 0.9105458422489332 }, + { 0, { 3596., -6271., 379., 5996., 286., 2760. }, 0.9259391061890530 }, + { 0, { -999582., 6287537., -5679601., -791405., -2413314., -507432. }, 0.9494173054851961 }, + { 1, { 111599., -339713., 235481., 52027., 98992., 33925. }, }, + { 2, { -33602., -140395., 93339., -35641., 41369., -10865. }, }, + { 0, { 149940., -187453., 95997., 203410., 38908., 91533. }, 0.9614421422806174 }, + { 0, { 46262., 123227., -97700., -14018., -43879., -8187. }, 0.9766842863215204 }, + { 0, { -150852., -63931., 82864., -16270., 39997., -7673. }, 0.9902969827486889 }, + { 0, { 580431., 130968., -306415., 215177., -145258., 96440. }, 1.0007147457558208 }, + { 0, { -315446., -113604., 191678., -91901., 90254., -41025. }, 1.0094608196461621 }, + { 1, { -3456., -446353., 229052., 185524., 103258., 88674. }, }, + { 0, { -189618., 113597., 8806., -140678., 6615., -64661. }, 1.0246980386783211 }, + { 0, { 4202483., 3000173., -2459447., 3363962., -1179328., 1385544. }, 1.0482030530764612 }, + { 1, { 1203874., -292900., 70065., 779465., 3811., 351179. }, }, + { 0, { 735702407., -1021641460., 944902088., 667150510., 387126729., 310854521. }, 1.0592824949737543 }, + { 1, { -225227., -2656169., 2070353., -678917., 860531., -321583. }, }, + { 0, { -906103., 1248865., -1249024., -614151., -510434., -296157. }, 1.0735437556293621 }, + { 0, { 133104., -244102., 224418., -12870., 91960., 2555. }, 1.0875704154537504 }, + { 0, { -98191., 334119., -93120., 114027., -39453., 36051. }, 1.1091289342301658 }, + { 1, { 131527., 1551., 58039., -54878., 19569., -21191. }, }, + { 2, { 65753., -188377., 68757., -76650., 28565., -25385. }, }, + { 0, { 61867., -343846., 16261., -113012., 8972., -35330. }, 1.1225031990563263 }, + { 0, { -7347., 137455., 17960., 22121., 5845., 4618. }, 1.1328877109810458 }, + { 0, { 11044., -88733., -25019., 37631., -8977., 18971. }, 1.1464066922869334 }, + { 0, { 11350781., -248125., 270190., 10489566., -145232., 4511204. }, 1.1622993228682923 }, + { 0, { -52127., 35850., -14691., -77957., -5084., -33671. }, 1.1728440239417584 }, + { 1, { -12008., 23292., -2942., -7282., -1291., -3563. }, }, + { 0, { 4294., 460., -3058., 3439., -1373., 1474. }, 1.1878668274609869 }, + { 0, { -1289., -734., 1786., -2248., 786., -941. }, 1.1998692758026896 }, + { 0, { 361., -793., 308., -1262., 122., -515. }, 1.2317935880659059 }, + { 0, { -195., 2534., -191., 3923., -67., 1609. }, 1.2448441509199817 }, + { 0, { -5385., -19904., 6349., -3489., 3158., -1221. }, 1.2560282933480911 }, + { 0, { 413790., -613072., 546872., 412919., 228594., 191066. }, 1.2653944427657104 }, + { 1, { -20115., 4841., -30066., -2156., -12194., -733. }, }, + { 0, { -56810., -2443., 14410., -37878., 7539., -15830. }, 1.2776927606634534 }, + { 1, { -883., -20034., 8211., 10587., 3489., 5153. }, }, + { 0, { -2444., 1465., 414., 793., 279., 259. }, 1.2924980461987274 }, + { 0, { 864., -632., -623., -218., -312., -55. }, 1.3014788911147197 }, + { 0, { 26233., -115536., 1588., -54448., 260., -17749. }, 1.3673745438817879 }, + { 0, { -366768., 241272., -241508., -348534., -93295., -154126. }, 1.3764442873088090 }, + { 1, { -4898., -22923., 39935., -25211., 16711., -10168. }, }, + { 0, { 7481., -4670., -7877., -4002., -3598., -1348. }, 1.3867469996002664 }, + { 0, { -2408., 1756., 2965., 1290., 1336., 416. }, 1.3958662188525488 }, + { 0, { 972., -751., -912., -28., -417., 39. }, 1.4068178503492994 }, + { 0, { -20343., 4804., -6579., -18594., -2298., -8037. }, 1.4396065958679622 }, + { 0, { 894., 1313., 1992., 632., 793., 162. }, 1.4496940872610145 }, + { 0, { -1983., -4631., -7582., 723., -2974., 660. }, 1.4625845924962999 }, + { 0, { 648492., 510288., -503142., 612739., -227097., 254982. }, 1.4790870471301645 }, + { 1, { -7847., 5399., -12816., -32834., -5768., -13533. }, }, + { 2, { -5935., 4107., 3696., -8454., 1585., -3763. }, }, + { 0, { 471., -326., 1178., -492., 455., -210. }, 1.5004111597792062 }, + { 0, { -1102., 5980., -5712., -389., -2409., -319. }, 1.5140608680143952 }, + { 0, { 235., -531., 427., -154., 168., -42. }, 1.5277453924778683 }, + { 0, { 1530., 1846., -2090., 2162., -918., 867. }, 1.5510420454912401 }, + { 0, { -8695., -5270., 3702., -11973., 1786., -4877. }, 1.5653775377343770 }, + { 0, { 108442., 13977., -7635., 130460., -5580., 54970. }, 1.5750243622459430 }, + { 0, { 12988439., -44123991., 40567288., 11522384., 17076170., 6015693. }, 1.5888946239094504 }, + { 1, { -297436., -96470., 75756., -224551., 37973., -97866. }, }, + { 2, { -140095., 49206., -15492., -114871., -4072., -51280. }, }, + { 0, { -213784., 360331., -204961., -174648., -85958., -85816. }, 1.5999174688094493 }, + { 0, { 34848., -82622., 33382., 30061., 14595., 15488. }, 1.6100691344943834 }, + { 1, { 43010., 10308., -12996., 14235., -6844., 6576. }, }, + { 0, { -1221., -3776., 845., 910., 489., 461. }, 1.6263710325060152 }, + { 0, { 554., 745., -310., -340., -171., -141. }, 1.6392210890659527 }, + { 0, { 20026., -16502., -3852., -9369., -2306., -3026. }, 1.6820002884969334 }, + { 0, { 813659., -336143., 300160., 724773., 109085., 319540. }, 1.6916922798012188 }, + { 1, { 1602., -17457., 27667., -10914., 11558., -4357. }, }, + { 0, { -5880., 742., -5245., -7508., -2092., -3141. }, 1.7051957386154943 }, + { 0, { 1260., 203., 1855., 1795., 753., 722. }, 1.7137017697983383 }, + { 0, { -181., 118., 893., -230., 356., -133. }, 1.7715707154892435 }, + { 0, { 715., -2305., -3568., 635., -1416., 471. }, 1.7804397794409668 }, + { 0, { 100206., -23631., 4854., 93727., 818., 43069. }, 1.7946296659726320 }, + { 1, { 4224., -2685., 2729., -6839., 1031., -2737. }, }, + { 2, { 84., 2460., 356., -441., 163., -287. }, }, + { 0, { -3928., 2396., -1944., -4367., -655., -1968. }, 1.8082885005321963 }, + { 1, { -1281., -1070., 1425., -1360., 663., -508. }, }, + { 0, { -434., -572., -639., 581., -222., 273. }, 1.8824124715680111 }, + { 0, { 5875., -12921., -96., 9965., 681., 4780. }, 1.8981641851181350 }, + { 1, { 3309., -927., -4565., 1029., -1995., 584. }, }, + { 0, { -14234., 16692., -15551., -9091., -6255., -4365. }, 1.9094415371356366 }, + { 1, { -5299., -4657., 1995., -4393., 1032., -1732. }, }, + { 0, { -215., 526., -123., -7., -42., -32. }, 1.9243893317056575 }, + { 0, { -1607., 1027., -1015., -1384., -397., -623. }, 1.9690057130935361 }, + { 0, { 907., -182., 55., -552., -12., -217. }, 1.9888685259410335 }, + { 0, { 80093., 1775., -15336., 49616., -8505., 21779. }, 2.0075896690458515 }, + { 1, { 3675., 886., 9437., 1003., 3841., 302. }, }, + { 2, { -2718., 2441., 1312., 2111., 647., 750. }, }, + { 0, { -749., 2213., 3067., 2387., 1321., 864. }, 2.0177406604319246 }, + { 0, { 82., 445., -97., 12., -47., -15. }, 2.0452450030168667 }, + { 0, { 939., 145., -364., 1452., -175., 622. }, 2.0918668035808388 }, + { 0, { 29763., -11270., 1340., 26747., 35., 12241. }, 2.1052596067061962 }, + { 1, { -752., -10176., 11464., -2886., 4981., -1015. }, }, + { 0, { -122433., -1948247., 1789021., -131787., 769924., -8458. }, 2.1185267640432053 }, + { 1, { -14746., -2745., 3642., -14273., 1472., -6101. }, }, + { 2, { -1381., -4337., 4157., -766., 1816., -296. }, }, + { 0, { 207., 2382., -2373., 455., -1016., 119. }, 2.1318821280894955 }, + { 0, { 317., -2045., -1566., 2287., -544., 1086. }, 2.2071860619320218 }, + { 0, { 45591., -42445., 35109., 42326., 14234., 19311. }, 2.2209783021218397 }, + { 1, { 100., -868., 334., -2387., 63., -853. }, }, + { 2, { -274., 556., 48., -449., -11., -223. }, }, + { 0, { 347., -11., -113., -232., -65., -97. }, 2.3082627901909945 }, + { 0, { 16054., -5418., 3307., 5345., 1043., 2606. }, 2.3219886353180517 }, + { 1, { -19., -205., 4127., -783., 1741., -387. }, }, + { 2, { -647., 309., -95., 84., -24., 13. }, }, + { 0, { 2409., -2117., -2607., -228., -1170., 136. }, 2.4200734218253461 }, + { 1, { 19., -536., 414., 216., 214., 119. }, }, + { 0, { 2201., 3681., -3051., 2808., -1347., 1419. }, 2.4294275957278497 }, + { 0, { -423., 745., -737., -631., -315., -318. }, 2.4385609820738123 }, + { 0, { 300., -1484., -1399., 755., -530., 425. }, 2.5260130486716892 }, + { 0, { 5490., -1919., 480., 4689., 156., 2132. }, 2.5361042359568997 }, + { 1, { 215., -174., 275., -263., 81., -64. }, }, + { 0, { 308., -156., 185., 292., 82., 121. }, 2.5459330159552604 }, + { 0, { 5463., 46., 202., 1602., -48., 766. }, 2.6374295145352566 }, + { 1, { 581., 381., 1106., 451., 460., 165. }, }, + { 0, { -36662., -85712., 78236., -34663., 34443., -12759. }, 2.6481663000165407 }, + { 0, { 1477., -1072., -1320., -336., -622., -3. }, 2.7397040327703399 }, + { 0, { 1659., -2071., 2391., 2294., 963., 1120. }, 2.7490048220101793 }, + { 1, { -1336., -455., -28., -609., -7., -260. }, }, + { 0, { 1366., -1582., -496., 1101., -173., 602. }, 2.8494750099923127 }, + { 1, { 141., -92., 188., -517., 50., -205. }, }, + { 2, { -23., 180., 65., -168., 19., -81. }, }, + { 0, { 1495., 362., 78., -117., -5., -23. }, 2.9530548702113095 }, + { 1, { 107., 70., 510., 245., 223., 92. }, }, + { 0, { 497., -250., -298., -554., -148., -215. }, 3.0510128159210788 }, + { 0, { 602., -271., -371., 232., -153., 154. }, 3.1654820818460752 }, + { 0, { -3037., -3424., 3284., -2814., 1483., -1134. }, 3.1775127563235914 }, + { 0, { 483., 216., 36., -224., 1., -77. }, 3.2694305438716178 }, + { 0, { 4935., 381., -381., 4408., -298., 2013. }, 3.3406022698986924 }, + { 0, { 235., -159., -104., -386., -58., -142. }, 3.3695779911862527 }, + { 0, { 339., -47., -126., -82., -67., -13. }, 3.4790904552288531 }, + { 0, { -5663., -29987., 27509., -5003., 11933., -2162. }, 6.2830762443769794 }, + { 0, { -59., -82., -23., 24., -12., 18. }, 8.4686530580615642 }, + { 0, { -17635., 511., -921., -16011., 697., -7231. }, 10.2131290491330340 }, + { 0, { -227., 115., -23., -264., 11., -116. }, 10.2220725794374050 }, + { /* end jupiter */ -1, }, +}; + +chap95_rec chap95_saturn[] = { + { 0, { 359537177., 0., -7206382337., 0., -2991243838., 0. }, 0. }, + { 1, { -20377631., 0., 15883341., 0., 8071624., 0. }, }, + { 0, { -64236683., -52860196., 142442224., -49744952., 58042432., -24365782. }, 0.0168745727060282 }, + { 0, { 30177751., 18129933., -67656128., 22849231., -27163043., 12315751. }, 0.0265670063186787 }, + { 1, { -8215259., 21212644., -23554648., -50768821., -12209063., -18901172. }, }, + { 0, { 1964057., 724735., -4686899., 1417179., -1646759., 941321. }, 0.0493811968866401 }, + { 1, { -134000., 3348965., -10011640., -8728398., -4234207., -2535628. }, }, + { 0, { 5686743., 3475773., -334368., 3091703., 72747., 926256. }, 0.0662237107929899 }, + { 0, { 554020., 1079938., -2966895., -1601162., -1509110., -278930. }, 0.0843726142307477 }, + { 0, { 4610964., 21987586., 31945199., -5263812., 13882828., -4598499. }, 0.1010129457774524 }, + { 0, { -66034588., -94070401., 111667599., -68387008., 47456033., -25071683. }, 0.1128014605528121 }, + { 1, { -4294328., -12886739., 37728596., -1754644., 11349347., 1748900. }, }, + { 0, { 6081642., 23561987., -38577166., -9734586., -12217167., -502775. }, 0.1245386660916166 }, + { 0, { -11635904., -19574871., 36907731., -11918213., 11119486., -6364841. }, 0.1376921108585382 }, + { 0, { 104499813., 75674727., -132241710., 152846005., -35848667., 59734045. }, 0.1532223867622918 }, + { 0, { -119336309., -65929841., 110429555., -174948245., 28176754., -66225503. }, 0.1635156403544941 }, + { 1, { 52564319., -48818442., 77555859., 94135021., 31177405., 26437148. }, }, + { 2, { 56660530., 23619473., -35687037., 84928050., -8020678., 31023884. }, }, + { 0, { 59047999., -9112158., 18208825., 74844916., 8173908., 26476289. }, 0.1849404508049137 }, + { 0, { -195085048., 130948239., -157301623., -207103141., -57416134., -80784650. }, 0.1994326216901347 }, + { 0, { 61319082350., -72972816459., 68513342186., 55646924765., 25657191842., 26113032275. }, 0.2133734516582497 }, + { 1, { 58897194., 107088220., -104901917., 68459614., -34345682., 47420026. }, }, + { 2, { -100212137., 21822222., -43604349., -89401596., -12674282., -32150723. }, }, + { 0, { 18845535., -49223999., 35615797., 26623302., 16402647., 15391365. }, 0.2335002178020494 }, + { 0, { -4180907., 4465884., 38621., -479609., 814285., -1219056. }, 0.2510310507212479 }, + { 1, { -18966213., 1413107., 11641634., -15116208., 6182492., -9256829. }, }, + { 0, { 3257184., 9509868., -11066286., -7321147., -6968557., -3079573. }, 0.2622227446243415 }, + { 0, { -1404116., -417364., 2858988., 1478988., 1856930., 162727. }, 0.2775489797512927 }, + { 0, { 1467706., 1107543., -4409004., 226468., -2199319., 678454. }, 0.2926511843672006 }, + { 0, { -63623237., -37507272., 39122548., -67696931., 18154709., -27796755. }, 0.3162439145857524 }, + { 1, { -3829645., 1269380., -9251051., -8961610., -4871745., -2487901. }, }, + { 2, { 1909651., 1468024., -7914338., 6203925., -2960534., 3971621. }, }, + { 0, { 6281876., -3642612., -4761114., 23447042., 286480., 12241212. }, 0.3340526064764550 }, + { 0, { -5802348., 5752123., -4991225., -30347977., -5911367., -14358380. }, 0.3467225133858732 }, + { 0, { 7539581., -27234846., 89254406., 72087653., 50683522., 25464083. }, 0.3654342931118227 }, + { 1, { -16970597., 906805., 25342361., -65544284., 5459306., -34110644. }, }, + { 2, { -5198192., 11224087., -33200716., -38195205., -20121188., -14873633. }, }, + { 0, { -2145161., 31156404., -111624554., -59422928., -60033284., -17237400. }, 0.3766625707476834 }, + { 0, { -2433702., -8759560., 35127703., 5461246., 17518688., -795950. }, 0.3868793178145906 }, + { 0, { 3948221., 3250926., -14710717., 6016597., -6668684., 4126312. }, 0.4021189702952532 }, + { 0, { -64852219., -1152783., 37078116., -78426047., 17075754., -36402504. }, 0.4173317886569649 }, + { 0, { 2598837096., -322512661., 333925850., 2403155625., 25718615., 1008149551. }, 0.4268085445169599 }, + { 1, { -8046615., 50513333., -65775281., -14855286., -30373245., -5862741. }, }, + { 0, { 14632122., -1627420., 391595., 27967394., 1503248., 13109492. }, 0.4393540871607130 }, + { 0, { -3977607., 2348335., -4492336., -11638695., -3044963., -5280793. }, 0.4516261147924168 }, + { 0, { 3891847., -6235742., 13257786., 12849113., 7381680., 5287411. }, 0.4647357720725654 }, + { 0, { -2681944., 5714068., -11275550., -8345687., -6000449., -3297402. }, 0.4765294470438712 }, + { 1, { -3310032., -1656488., 6283436., -7934719., 2454880., -4374462. }, }, + { 2, { 581001., -2310426., 4449727., 1912796., 2258154., 644572. }, }, + { 0, { -543181., 190668., 100357., -477814., 102237., -296580. }, 0.4992649823773071 }, + { 0, { 734019., 40318., 205332., 241668., 50065., 172083. }, 0.5130863461740709 }, + { 0, { 34991657., -27811324., 27384011., 28671165., 10659597., 13066000. }, 0.5295353231453532 }, + { 1, { -995667., 165111., 1788489., 16637., 818086., -43110. }, }, + { 2, { -317358., -198759., -6708., 263693., 27631., 133736. }, }, + { 0, { -31862., -65198., 73955., 29129., 36339., 15797. }, 0.5497097571860546 }, + { 0, { -4929., 225052., -215444., -8168., -89868., -12808. }, 0.5633695884286543 }, + { 0, { 24691., 22218., -9270., 18179., -4474., 5589. }, 0.5991350601911121 }, + { 0, { 289471., 202198., -100019., 60710., -58404., 1113. }, 0.6158926177569189 }, + { 1, { 99636., -158087., 49023., 12201., 5200., 13036. }, }, + { 0, { -1368816., -1646305., 699872., -1449808., 365729., -462486. }, 0.6277831102482128 }, + { 0, { 86066856., 61934875., -56200895., 80007767., -26961118., 30372088. }, 0.6401904307430363 }, + { 1, { -1903624., 1069032., -956603., -1766047., -334714., -771306. }, }, + { 2, { 388212., 231504., -217129., 594559., -86428., 243060. }, }, + { 0, { 806222., 541401., -454902., 1046875., -196326., 413041. }, 0.6510631728715514 }, + { 0, { -45865., -22253., 10036., -80738., 2915., -31853. }, 0.6610474418282967 }, + { 0, { 7873., 2358., 3189., 5877., 1281., 2008. }, 0.6837277548947647 }, + { 0, { -98664., 39992., -40413., -90837., -12525., -38879. }, 0.7043645359718698 }, + { 0, { -1946., 3664., 10236., -357., 4293., -1167. }, 0.7177278015736290 }, + { 0, { -284513., 3015890., 2554237., 521699., 1046024., 49179. }, 0.7348232721925007 }, + { 1, { 192624., 52403., 33461., -150025., -105., -61152. }, }, + { 0, { -574265., -320413., 457058., -572461., 214214., -240685. }, 0.7435248864377025 }, + { 1, { 1145., -36334., 41717., 108651., 15647., 49114. }, }, + { 0, { 4558., -12170., 12006., 2809., 4790., 1802. }, 0.7636282240814432 }, + { 0, { -13700., 9256., -10447., -12051., -3998., -5133. }, 0.7781708314331308 }, + { 0, { 2247., -693., 1592., 1083., 680., 202. }, 0.7950594399751412 }, + { 0, { -1275., 5493., -6655., 924., -2492., 1116. }, 0.8129117802019118 }, + { 0, { -1223., -19571., 23014., -16306., 6735., -10155. }, 0.8251778324059539 }, + { 0, { 303076., 327040., 524629., -601728., 145475., -284414. }, 0.8382097667143232 }, + { 1, { -68015., 68576., -104282., -95123., -56039., -18028. }, }, + { 0, { 804121., 5204866., -4807644., 856208., -2083791., 112505. }, 0.8530682323228537 }, + { 1, { 29622., -215766., 182882., 33800., 76379., -13007. }, }, + { 0, { -13943., 51584., -40954., -8800., -23024., -3606. }, 0.8654403493251860 }, + { 0, { 3328., -7556., 4381., 1661., 2910., -36. }, 0.8766682028622256 }, + { 0, { -1505., 1631., -856., 784., -507., 674. }, 0.8895787094971168 }, + { 0, { -7919., -1616., 1989., -5290., 1264., -2147. }, 0.9133756947048002 }, + { 0, { -719., -2923., 1034., -5631., 504., -2040. }, 0.9236279354499169 }, + { 0, { 235224., 39046., -67004., -248093., -51203., -88317. }, 0.9453092341234691 }, + { 1, { 23462., -3456., -13540., 1977., -2121., 4776. }, }, + { 2, { -14574., -833., 1399., 12342., 2166., 4371. }, }, + { 0, { -26186., -43172., 35585., -24094., 17801., -8640. }, 0.9587102428763801 }, + { 0, { 5306., 3426., -2598., 4654., -1521., 1836. }, 0.9687040706037242 }, + { 0, { -1404., -1568., 973., -1250., 478., -476. }, 0.9844044794489883 }, + { 0, { 710., 549., -640., -936., -297., -397. }, 1.0125530865194814 }, + { 0, { -4798., 528., 2241., 2772., 1073., 1027. }, 1.0243303434648821 }, + { 0, { 19204., -11735., -10052., -9127., -4600., -2887. }, 1.0350677988213037 }, + { 0, { -70967., 104737., 71732., 36807., 31189., 9485. }, 1.0444890430562743 }, + { 0, { -225798., 798684., 944928., 428637., 404105., 131989. }, 1.0535670598935039 }, + { 0, { 421437., -821624., 460671., 296203., 193979., 145015. }, 1.0624723083698995 }, + { 1, { 404141., 190563., -153412., 239290., -77801., 95534. }, }, + { 0, { -6822., -2424., -12141., -503., -4568., -254. }, 1.0799687683920178 }, + { 0, { 5231., 2124., 4765., -2411., 1681., -1002. }, 1.0944898935961935 }, + { 0, { -4360., -571., -2843., 2544., -920., 1015. }, 1.1034700208578079 }, + { 0, { 2352., -783., 1220., -2044., 355., -732. }, 1.1190075299813413 }, + { 0, { -5735., 3169., 186., 5121., 420., 1436. }, 1.1356439922218147 }, + { 0, { 26551., -30281., 5089., -56530., 4098., -12591. }, 1.1476494842799982 }, + { 0, { 182096., 230606., 190305., 20362., 32484., -34547. }, 1.1561539197957733 }, + { 1, { -46354., -35766., 25278., 21603., 6113., 24924. }, }, + { 2, { -6693., -10691., -762., -24972., 5267., -3607. }, }, + { 0, { 7509., -14080., 2266., 4828., -2812., 2396. }, 1.1724975800169239 }, + { 0, { -1097., 4594., -221., -711., 861., -846. }, 1.1827508062529084 }, + { 0, { 268., -1663., 197., 151., -139., 350. }, 1.1922546935063294 }, + { 0, { 3821., -6929., -9691., -9738., -1997., -3976. }, 1.2526642649376578 }, + { 1, { -3679., 2852., -872., 4458., -151., 647. }, }, + { 0, { 103288., 30887., 44394., -80994., 5313., -31354. }, 1.2615381418438327 }, + { 0, { 11722., -929., 20555., -32545., 6476., -10964. }, 1.2737411543354145 }, + { 0, { -17778., 2234., -8752., -2076., -2194., -1934. }, 1.2848042137871682 }, + { 1, { -807., -10464., -4345., -4583., -776., -1210. }, }, + { 0, { -2021., 243., -476., 1775., -175., 485. }, 1.2966706439177036 }, + { 0, { -414., 1251., 1334., 193., 402., 122. }, 1.3428511130177547 }, + { 0, { -6545., 29273., 20095., -2836., 7521., 1278. }, 1.3563973340863262 }, + { 1, { 13556., 3272., -1197., -10568., 545., -3663. }, }, + { 0, { -180708., 208447., 210704., 176234., 95276., 55650. }, 1.3681253803708262 }, + { 1, { 18503., 8458., -1041., -19835., 212., -7272. }, }, + { 2, { -2022., 9714., 3806., 25., 1699., 1106. }, }, + { 0, { 967., -692., -12., -1766., -76., -677. }, 1.3856345885533017 }, + { 0, { 704., -587., -2388., 1139., -927., 144. }, 1.4516885121122214 }, + { 0, { -2400., 3304., 8864., -6463., 3877., -1185. }, 1.4602508651959594 }, + { 0, { 69982., 97834., 73391., 17685., 16742., -10304. }, 1.4727239692395073 }, + { 1, { -11044., -13056., 19308., 14020., 3724., 10827. }, }, + { 2, { -6082., -426., 3637., -7457., 3010., -854. }, }, + { 0, { 2590., -1868., 1096., 1043., -731., -69. }, 1.4872423683478513 }, + { 0, { -938., 62., 121., -521., 280., -164. }, 1.4985129994148070 }, + { 0, { 1803., 2377., 1110., -3335., 260., -1477. }, 1.5652937634682971 }, + { 0, { 64498., -5114., 68142., -30202., 22032., -11748. }, 1.5815555196973523 }, + { 1, { -22825., 4620., 14325., -12393., 6615., -5873. }, }, + { 2, { -7166., 4559., -5012., 2048., -1874., 652. }, }, + { 0, { -2200., -10219., 11039., 3346., 4934., 1509. }, 1.5955514308541998 }, + { 0, { 1099., 1374., -2363., -260., -1043., -86. }, 1.6049203503395801 }, + { 0, { -1208., -104., 561., 969., 230., 560. }, 1.6737223157218182 }, + { 0, { -86480., 70728., 67924., 86008., 31534., 31153. }, 1.6843589552967209 }, + { 1, { 933., 1492., 4350., -2566., 1516., -847. }, }, + { 2, { -1244., -445., -70., 369., 72., 345. }, }, + { 0, { 1465., -2624., 397., -65., -76., -7. }, 1.6977622139834585 }, + { 0, { 14992., 53026., 36206., 5674., 12375., -4229. }, 1.7889276713056903 }, + { 1, { -1089., -6208., 2064., 7721., -744., 4049. }, }, + { 2, { -1281., -2343., -210., 276., 49., 532. }, }, + { 0, { 3295., -4264., -3112., 6622., -2534., 1159. }, 1.8013654629975304 }, + { 1, { 1876., 442., -2702., -870., -615., -793. }, }, + { 0, { 21586., 22255., 25169., -13704., 7397., -6814. }, 1.8952695349759525 }, + { 1, { 1293., 636., 1855., -2161., 651., -493. }, }, + { 2, { -1508., -959., -1185., 1162., -341., 540. }, }, + { 0, { -837., -468., -77., 639., 49., 332. }, 1.9082748451618770 }, + { 0, { -39181., 17943., 18554., 39996., 9033., 15315. }, 2.0006786235742782 }, + { 1, { 70., 479., 1963., -746., 664., -147. }, }, + { 2, { -729., 4., -323., -76., -29., 30. }, }, + { 0, { -726., 389., 1661., 467., 647., 367. }, 2.0949703642270960 }, + { 0, { -2813., 21512., 16741., 5023., 6930., 302. }, 2.1045989992211052 }, + { 0, { 6314., -196., -4305., 3407., -2614., -923. }, 2.1133294411524268 }, + { 0, { -1183., -1102., 1934., -946., 1020., -24. }, 2.1218152921149840 }, + { 0, { 7013., 13819., 14243., -3085., 4615., -2198. }, 2.2116085451863530 }, + { 1, { 548., 591., 1334., -724., 439., -127. }, }, + { 2, { -499., -647., -721., 383., -233., 184. }, }, + { 0, { -96., -348., -69., 163., -3., 83. }, 2.2246966026380783 }, + { 0, { -16878., 3417., 3609., 17709., 2011., 6948. }, 2.3169860146393306 }, + { 1, { -184., 273., 1066., -86., 376., 65. }, }, + { 2, { -421., -143., -106., -9., 9., 50. }, }, + { 0, { -1773., 10467., 5877., 4502., 2612., 236. }, 2.4212184393363345 }, + { 1, { 100., -1698., -212., 1585., -581., 698. }, }, + { 2, { -416., -532., 192., 38., 49., 218. }, }, + { 0, { 922., 6585., 6161., 638., 2178., -274. }, 2.5279051498015881 }, + { 1, { 305., 668., 969., -324., 338., -92. }, }, + { 0, { -7788., -691., -557., 7570., 62., 3142. }, 2.6333307376329276 }, + { 1, { -16., 174., 511., 158., 148., 85. }, }, + { 0, { -2797., 3622., 2705., 2693., 1341., 812. }, 2.7374368855151237 }, + { 0, { 1332., 523., -1008., -331., -394., -592. }, 2.7462646949156313 }, + { 0, { -528., 3192., 2851., 1151., 1069., 178. }, 2.8441606111313287 }, + { 1, { 54., 266., 527., 58., 138., 54. }, }, + { 0, { -3128., -1136., -1090., 3069., -358., 1285. }, 2.9496547906250985 }, + { 0, { -1332., 1366., 789., 1313., 449., 356. }, 3.0553439327040071 }, + { 1, { 46., -504., -405., 221., -232., 58. }, }, + { 0, { -722., 1469., 1417., 916., 574., 235. }, 3.1603882818225530 }, + { 1, { -8., 210., 314., 24., 105., 6. }, }, + { 0, { -1228., -704., -610., 1193., -210., 520. }, 3.2660150757959667 }, + { 0, { 4966., 349., -230., 4527., -271., 2058. }, 3.3406700896158381 }, + { 0, { -1003., 494., 345., 782., 229., 294. }, 3.3700954272546491 }, + { 0, { -642., 504., 417., 592., 188., 175. }, 3.4766263286125869 }, + { 0, { -5495., -30050., 27370., -5109., 11883., -2182. }, 6.2830758491321381 }, + { 1, { 12., 3., -21., -32., -16., -11. }, }, + { 0, { -127., 83., -47., -145., -13., -74. }, 8.4563910900857575 }, + { 0, { -17655., 888., -832., -16055., 726., -7281. }, 10.2133651230379790 }, + { 1, { -15., -178., 73., 27., 40., 18. }, }, + { 0, { 10., 56., 204., -33., 91., -14. }, 10.2233419556680150 }, + { /* end saturn */ -1, }, +}; + +chap95_rec chap95_uranus[] = { + { 0, { 13442911073., 0., -1930919457., 0., -1035250405., 0. }, 0. }, + { 1, { 54660667., 0., 47196247., 0., 21339801., 0. }, }, + { 0, { -6259970., -59715827., 56026092., -14879299., 23598892., -7731463. }, 0.0168745727060282 }, + { 0, { 5314993., 24095734., -17644181., 11961180., -6018215., 6587969. }, 0.0271621114651946 }, + { 0, { 816977., 27548111., -6448076., -468658., -4057252., -1448251. }, 0.0379771556339559 }, + { 0, { -1624242., 11338144., -20621799., 1496992., -5688694., 248222. }, 0.0558181533535525 }, + { 0, { 131350139561., 139711771423., -127221614269., 120945393838., -57589414088., 51010747052. }, 0.0747869939016385 }, + { 1, { 83579181., -50475439., 18032923., 50477352., 27217847., 30911037. }, }, + { 2, { 56177356., -62348507., 45006161., 56816875., 23394627., 20236290. }, }, + { 0, { -3192217., -67613872., 26532975., 31518890., 20804461., -5888651. }, 0.0851607526391989 }, + { 0, { 41246376., 168261887., -122401100., -97532527., -40313762., 5947933. }, 0.1076082382556661 }, + { 0, { -36235133., -140754409., 98201785., 64357246., 36255198., -9379330. }, 0.1131136321134916 }, + { 1, { 90255544., -46394994., -47508423., 75649120., 8064423., 19668708. }, }, + { 0, { -32042356., -21687295., 28029568., 15213468., 1662570., -3156568. }, 0.1256919464048962 }, + { 0, { 44969984., -2310664., -13084603., 20841905., 1428192., 12115421. }, 0.1384460864609660 }, + { 0, { -524718966., -4511367463., 4156633821., -484927968., 1817662129., -148236372. }, 0.1495664992280332 }, + { 0, { 61267776., 1565740., -24266489., 45519765., -3901964., 18298390. }, 0.1552897599647365 }, + { 0, { -7222268., 4911333., 3283374., -6377102., -254066., -1537379. }, 0.1694039594031046 }, + { 0, { 5873930., -4900474., -1827803., 7852582., -31798., 1819946. }, 0.1845250832150644 }, + { 0, { 1077339., 18380396., -901066., -10767827., -265560., 162663. }, 0.2002468734837309 }, + { 0, { -154311950., -219502970., 131091842., 178959446., 20655458., 5719299. }, 0.2141097583453364 }, + { 0, { -5528333., 212500368., -111109179., -139612191., -43337512., -21342579. }, 0.2193685795401007 }, + { 1, { -104517351., 177302072., 101064024., -75975513., -8816707., 3791842. }, }, + { 0, { 173653756., 151082404., -200861767., -135511564., -29950212., -17024507. }, 0.2293024101260499 }, + { 0, { -125918181., -44661266., 113832135., 56003631., 10092584., 6332126. }, 0.2359817391381943 }, + { 0, { 47624832., 2554277., -41914694., -13040594., -2759654., -2423818. }, 0.2431604796510437 }, + { 0, { -8805576., 2810717., 8600588., 666061., 636138., 663527. }, 0.2535948403663328 }, + { 0, { 1249271., -2422256., -2280787., 1243851., -81187., -241977. }, 0.2733943804314553 }, + { 0, { 90677., 14160054., 8529623., -8138579., 1686982., 1494393. }, 0.2885148535115661 }, + { 0, { 1004449., -20392040., -8104371., 18545176., -2778508., 705194. }, 0.2992461358046305 }, + { 1, { 5543727., 3362260., -1567031., -3163455., 585366., 471498. }, }, + { 2, { 2655788., 6883407., 3736665., -5070470., 1464904., 724248. }, }, + { 0, { 6192631., 6484479., 3731891., -6957619., 2642135., 445342. }, 0.3105692746147310 }, + { 0, { -1442546., -845134., -640944., 1375084., -614517., 35173. }, 0.3190867931520337 }, + { 0, { 683659., 282897., 363207., -694577., 243073., -261582. }, 0.3384589317094125 }, + { 0, { 210243., 95767., -88268., -40253., -126237., -71385. }, 0.3483018025771290 }, + { 0, { -122260., -61161., 139582., -75155., 89557., -59104. }, 0.3543646679104152 }, + { 0, { -341621., -166635., -6649., -236115., -4011., -98828. }, 0.3749354720310226 }, + { 0, { -34509., -47428., -33958., 69865., -15389., 28074. }, 0.3881544744399507 }, + { 0, { 127606., 82441., 63875., -131276., 30216., -55026. }, 0.4044642096018178 }, + { 0, { -55719., 35282., 53204., 42166., 20409., 8040. }, 0.4146735688956036 }, + { 0, { 745574., -86708., 85642., 660718., 2349., 278769. }, 0.4267276978319757 }, + { 0, { 46965., -63806., -140582., -2689., -51451., -6263. }, 0.4523712047583937 }, + { 1, { -44676., -29125., -21496., 62165., -11514., 20667. }, }, + { 0, { -47313., 131228., 153909., 13721., 54937., 13501. }, 0.4584750578982092 }, + { 0, { 64299., -217224., -204896., -47815., -89991., -26071. }, 0.4786471499447322 }, + { 0, { -216., 53443., -19130., -71538., -27839., -11228. }, 0.4920510287505367 }, + { 0, { -151224., -75735., -3305., 268854., -6542., 67361. }, 0.5051499531573665 }, + { 0, { 928196., 102377., -314167., -1414544., -33869., -402228. }, 0.5147029966036326 }, + { 0, { -1724399., 110969., 999802., 2605327., 184425., 789530. }, 0.5199630930448305 }, + { 0, { 40911206., -27399316., 26874089., 37399873., 10439229., 16767175. }, 0.5296669053399393 }, + { 1, { 583136., 1214598., 1755827., -1272416., 584159., -311166. }, }, + { 0, { 1173041., -1074191., -1886355., -1719260., -508991., -616258. }, 0.5369668320738028 }, + { 0, { -202800., 314145., 489969., 260218., 136957., 100165. }, 0.5445620632918582 }, + { 0, { 30834., -64556., -105954., -37083., -35677., -17746. }, 0.5559973222735549 }, + { 0, { 388., 18963., 34845., -2990., 13141., -175. }, 0.5645354635177183 }, + { 0, { -3029., -2222., -3901., 4299., -1477., 1512. }, 0.5864917785646289 }, + { 0, { 364., -3970., 4198., -17799., 1736., -7653. }, 0.6024030347783642 }, + { 0, { -64408., -16238., -14709., 52293., -7099., 22267. }, 0.6155618610057497 }, + { 0, { -8702., 7365., -847., 28860., 2496., 17960. }, 0.6266278765065182 }, + { 0, { 37681., 20807., -24633., 19631., -10642., 8265. }, 0.6366292306281224 }, + { 0, { 3191., 5638., -2365., 9854., -1386., 3658. }, 0.6449290790303238 }, + { 0, { -5177., -823., -2003., 5908., -949., 2341. }, 0.6763170666119763 }, + { 0, { -3638., 10059., 7207., 4377., 3151., 2651. }, 0.6862778987939261 }, + { 0, { 11748., -14352., -13920., -7897., -5625., -2944. }, 0.6979445752019332 }, + { 0, { -8438., 12018., 9236., 3586., 3477., 1505. }, 0.7048114577856822 }, + { 0, { 1834., -5463., -4042., -1281., -1755., -771. }, 0.7111948880743650 }, + { 0, { -4692., -8326., -4750., 8084., -2967., 3594. }, 0.7473196860221153 }, + { 0, { 4040., 13701., 10942., -11503., 6915., -5226. }, 0.7526899558709467 }, + { 0, { 22865., -59285., -48182., -15767., -20987., -6907. }, 0.7617757396112786 }, + { 1, { 3873., 1796., -260., -5778., -1031., -4126. }, }, + { 0, { 272., -668., 1897., 1033., 987., 184. }, 0.7769058037180200 }, + { 0, { -2176., 7071., 5492., 2930., 2571., 1313. }, 0.8199388514022748 }, + { 0, { -184998., 97937., 88915., 171155., 41794., 73600. }, 0.8350541004724259 }, + { 1, { -197., -3126., -715., 1748., -208., 825. }, }, + { 0, { -5824., 1942., -2170., -8871., -927., -3596. }, 0.8453935583217296 }, + { 0, { 252., 2148., -787., 1499., -241., 459. }, 0.8551127263577434 }, + { 0, { 3107., 6817., 10906., 19., 4504., -914. }, 0.8879713761393457 }, + { 0, { 6532., -6647., -8432., -9470., -3566., -3649. }, 0.8938517525956896 }, + { 1, { 2415., -4253., -3554., -6203., -2191., -2419. }, }, + { 0, { -3926., 523., -5326., 11396., -2537., 5007. }, 0.9076103122110721 }, + { 0, { 1486., 6143., -4417., -1583., -1883., -794. }, 0.9528977392964432 }, + { 0, { 1226., -908., 2507., -1706., 1029., -874. }, 0.9646777216958613 }, + { 0, { -11300., -22605., 26258., -9349., 12130., -5605. }, 0.9849512095278805 }, + { 1, { 1457., -2630., 860., 1293., 487., 641. }, }, + { 2, { -685., -2643., -646., -848., -225., -318. }, }, + { 0, { -2190., -3253., -891., -1611., -317., -665. }, 0.9964090016851210 }, + { 0, { -1179., -3116., -2763., 1595., -1346., 737. }, 1.0352639155374268 }, + { 0, { 7916., 3274., -3481., 4472., -1826., 2498. }, 1.0515675436820877 }, + { 0, { 697761., -973027., 901279., 634785., 369311., 295489. }, 1.0592810372818169 }, + { 1, { -1426., -5270., 2981., -566., 1562., -288. }, }, + { 0, { -1789., 2512., -1045., -777., -493., -461. }, 1.0720350844573199 }, + { 0, { 3343., -1231., -1017., -2862., -464., -1223. }, 1.1429483332496098 }, + { 0, { 11373., -2498., -1580., 8748., -883., 3741. }, 1.1609636069979286 }, + { 1, { -1522., -2635., 28., 1104., -15., 464. }, }, + { 0, { -1975., 3205., 2553., 2452., 995., 1112. }, 1.1691873087779718 }, + { 0, { -9107., -5910., -5019., 8600., -1999., 3899. }, 1.2152142837985198 }, + { 1, { -4., -1508., -1102., -242., -397., -127. }, }, + { 0, { -1971., 699., -3., 1482., -78., 551. }, 1.2226982614159414 }, + { 0, { -31., -206., 25., 63., 54., 23. }, 1.2355263592688024 }, + { 0, { 2581., 7563., 7150., -2433., 3120., -1128. }, 1.2857063346850945 }, + { 1, { 1638., -740., -410., -2267., -163., -1002. }, }, + { 0, { 6494., 16800., 14424., -5912., 6217., -2861. }, 1.2908372220692612 }, + { 0, { -2870., 4014., 4972., 2882., 2300., 1194. }, 1.3652019003010083 }, + { 1, { 121., -268., -412., 87., -162., 47. }, }, + { 2, { 204., -295., -187., 24., -76., 9. }, }, + { 0, { -3114., 953., -618., -2692., -475., -1304. }, 1.4390426416344881 }, + { 0, { 643., 554., -351., 588., -171., 247. }, 1.4790740463977397 }, + { 0, { 470., -497., -239., -9., -101., -35. }, 1.5778081754901920 }, + { 0, { 12015., -42122., 38323., 10981., 16121., 5766. }, 1.5889777636732787 }, + { 1, { -377., -28., -105., 615., -60., 248. }, }, + { 2, { -102., -86., -77., -32., -33., -28. }, }, + { 0, { -1329., 1696., 1422., 1073., 644., 441. }, 1.6698689170399983 }, + { 0, { 653., -443., 76., 737., 22., 321. }, 1.6917823552881666 }, + { 0, { 4010., -973., -776., -3727., -389., -1621. }, 1.7447101363840591 }, + { 0, { 796., 753., 911., -908., 375., -434. }, 1.8195524075201825 }, + { 0, { -67., 529., -320., 151., -164., 92. }, 1.8944084825549634 }, + { 0, { 10., -1636., 1676., -13., 718., 43. }, 2.1173586606692205 }, + { 0, { -176., -699., -800., 57., -346., 33. }, 2.1995558975407743 }, + { 0, { 4804., 493., -302., 4547., -271., 2069. }, 3.3406137564373255 }, + { 1, { -37., 63., -60., 6., -25., 5. }, }, + { 0, { -6127., -30327., 27236., -5550., 11893., -2472. }, 6.2830758108542479 }, + { 1, { 13., 96., 24., 144., -4., 74. }, }, + { 2, { 94., 86., 39., 73., 3., 45. }, }, + { 0, { -103., 11., 317., -154., 157., -57. }, 8.4710588767699999 }, + { 0, { -1072., -875., 799., -1217., 416., -503. }, 10.1988027176192690 }, + { 0, { -7126., 105., -353., -6736., 285., -3012. }, 10.2074359814049150 }, + { 1, { -735., 3920., -3778., -636., -1657., -531. }, }, + { 0, { -9779., 1441., -1464., -8409., -23., -3858. }, 10.2156685960931930 }, + { /* end uranus */ -1, }, +}; + +chap95_rec chap95_neptune[] = { + { 0, { -2753381808., 0., -2555187184., 0., -977694282., 0. }, 0. }, + { 1, { -53706852., 0., 9024894., 0., 5113590., 0. }, }, + { 0, { 5353414., 16329756., -10315608., -18211298., -4313685., -7909387. }, 0.0179617912970447 }, + { 0, { -19054385., -287482557., 282900211., 40600685., 114409567., 24195009. }, 0.0323644369574163 }, + { 0, { 171759338654., 246707191188., -226959547603., 161070501549., -97171931583., 59786666580. }, 0.0381185507042915 }, + { 0, { 269128284., 157897034., -86709918., 293605458., -39838078., 115245563. }, 0.0449423189622218 }, + { 0, { -93736103., -37825790., -26561507., -91732038., -9592733., -35920288. }, 0.0600427026897851 }, + { 0, { 178516553., 51475281., 124180124., 108331691., 49005129., 40587728. }, 0.0705779080356058 }, + { 0, { -1684231243., 681665499., -958998993., -1353650791., -355010040., -565296249. }, 0.0772675784146183 }, + { 0, { 1122264068., -578428299., 1063564939., 463713621., 414676760., 190864744. }, 0.0843726142307477 }, + { 0, { -781685034., 475952164., -808860716., -228929931., -316705638., -94548544. }, 0.0871507153151969 }, + { 0, { 56385979., -39979207., 64276567., 7694958., 25352958., 3214483. }, 0.1012471242645664 }, + { 1, { 63310243., 43285497., 22448880., 66731902., 8926250., 26309541. }, }, + { 0, { 2712359., -37080616., 26122509., -21572378., 10482381., -8529034. }, 0.1128959119291703 }, + { 0, { 1376659., 7176921., -1442553., 7206580., -479409., 2921144. }, 0.1246811309098641 }, + { 0, { -2552808., -3146754., -931704., -4559708., -491329., -1812338. }, 0.1349961443322037 }, + { 0, { 1162812., 462968., 719939., 2310847., 376498., 885784. }, 0.1402125408882514 }, + { 0, { -252283., -142326., -110247., -49287., -46731., -28945. }, 0.1616161402063230 }, + { 0, { 243162., -91598., 106479., 16854., 55597., 8501. }, 0.1776262925892778 }, + { 0, { -672251., 231673., -319786., 386301., -155882., 135214. }, 0.1904084544956719 }, + { 0, { 1867133., -1866896., 239943., -1803069., 228227., -732880. }, 0.2026926199831023 }, + { 0, { 32066276., -61274160., 6958960., -9094869., 4399306., -3854675. }, 0.2132050927412489 }, + { 1, { -11587231., -5526999., -7458452., 2330330., -3274130., 322813. }, }, + { 0, { -16700375., 45567407., 14051147., 28126677., 3238872., 12733553. }, 0.2160078733553654 }, + { 0, { 601249., -3740179., -1686685., -1590049., -510731., -804485. }, 0.2225065497464809 }, + { 0, { 71272., 256103., 179344., -10427., 65192., 15214. }, 0.2362432045351159 }, + { 0, { -58547., -82547., -51318., 58153., -20501., 15047. }, 0.2470536247773912 }, + { 0, { -6723., 19924., 26278., 12439., 9453., 3700. }, 0.2721326326759872 }, + { 0, { -3710., 4976., -7051., 254., -1464., 195. }, 0.2834391769690069 }, + { 0, { -12572., -6375., 5687., 15436., 615., 5233. }, 0.2938091870567225 }, + { 0, { -14716., 204103., 159833., 45074., 65416., 11053. }, 0.3117802888037338 }, + { 0, { -17577., 42568., 85327., -50768., 36610., -17999. }, 0.3148973170728874 }, + { 0, { -12308., -4224., -5418., 20456., -3011., 7048. }, 0.3237199721077774 }, + { 0, { -453., 863., 3006., -1602., 798., -820. }, 0.3434014414974197 }, + { 0, { -4296., 775., 4295., 2013., 1131., 245. }, 0.3679427772208049 }, + { 0, { 2844., 8238., -10394., 16799., -2798., 8324. }, 0.3785701069003719 }, + { 0, { -12477., -18952., 16324., -32949., 3954., -15266. }, 0.3833769854125967 }, + { 0, { -22365., 128., 5047., -4988., 1724., -1653. }, 0.3921552738853996 }, + { 0, { 4383., -6090., 178., -7672., -722., -3343. }, 0.4052046013289639 }, + { 0, { 714788., -68799., 122150., 736324., 10410., 310430. }, 0.4266933782608374 }, + { 1, { 12121., 14734., 49080., -28648., 20910., -8012. }, }, + { 0, { 46510., -21693., -58299., -84149., -12783., -39407. }, 0.4328778616668182 }, + { 0, { -18771., 8624., 16635., 18600., 2724., 10462. }, 0.4397536016965201 }, + { 0, { 3796., -9377., -6884., 415., -1798., -1014. }, 0.4503999814583104 }, + { 0, { -7089., 1370., -2220., 4940., -839., 2525. }, 0.4636405151525668 }, + { 0, { 5125., -1762., 2170., -4527., 631., -2166. }, 0.4745702135817129 }, + { 0, { 36688., -1584., -8174., -32426., -3946., -13037. }, 0.4886034832877044 }, + { 0, { -5607., 1955., 1641., 547., 484., -201. }, 0.5046352473687760 }, + { 0, { 45109., -21568., 12616., 26255., 6182., 12720. }, 0.5178003462986053 }, + { 0, { 40893658., -28000813., 26124943., 37354584., 10197353., 16693506. }, 0.5296623039564303 }, + { 1, { -21062., -35782., 31769., -20330., 15353., -11834. }, }, + { 2, { 10720., 5927., -12424., -538., -3613., -359. }, }, + { 0, { -28607., 23386., -38172., -43627., -12236., -20256. }, 0.5403804874893231 }, + { 0, { 66., 635., 4597., 3533., 1279., 1843. }, 0.5486365851140401 }, + { 0, { -1646., 2776., -3727., -1793., -1436., -354. }, 0.5631942288095021 }, + { 0, { -353., 460., 306., -526., 107., -133. }, 0.5739537566607668 }, + { 0, { -48., -518., 599., -406., 229., -183. }, 0.6031743297859348 }, + { 0, { -230., -43., -65., 493., -36., 204. }, 0.6175060453479511 }, + { 0, { 19445., 2550., -25130., 13108., -10967., 5418. }, 0.6333639350967218 }, + { 0, { 13473., 21421., -1023., 17345., -1204., 6355. }, 0.6373233385189475 }, + { 1, { 864., -8826., 6444., 11189., 2532., 4949. }, }, + { 0, { 1578., 3023., 2194., 1035., 836., 338. }, 0.6488504417528818 }, + { 0, { -3340., -7100., -6757., 2738., -2684., 1301. }, 0.6617542675140329 }, + { 0, { 1017., 744., 847., -982., 332., -425. }, 0.6999703675245400 }, + { 1, { 42., 10., 19., -41., 10., -16. }, }, + { 0, { 1891., 647., -479., 1705., -149., 715. }, 0.7361514522905745 }, + { 0, { -747., -1284., 1091., -507., 523., -190. }, 0.7442630004913908 }, + { 0, { -25., 104., -104., -129., -52., -37. }, 0.7785774183375729 }, + { 0, { -512., 349., 592., 506., 250., 205. }, 0.8337771392669406 }, + { 0, { -6683., 244., -856., -5864., -184., -2467. }, 0.8456021851592702 }, + { 1, { -1203., -318., -1016., 257., -373., 120. }, }, + { 0, { -24., 3933., -1820., 1132., -757., 301. }, 0.8511022350336571 }, + { 0, { 201., -293., -309., -190., -131., -68. }, 0.8740442975723336 }, + { 0, { 308., -601., -394., -483., -169., -197. }, 0.9077766553319553 }, + { 0, { -16598., 27372., 14431., 13730., 6210., 4914. }, 0.9458755575816939 }, + { 1, { -126., -1380., -1472., 3523., -609., 1504. }, }, + { 2, { 143., -540., 222., -105., 87., -32. }, }, + { 0, { 329., 51., -160., 190., -86., 81. }, 0.9622835434242619 }, + { 0, { 128., 272., 129., -159., 60., -76. }, 0.9782201450147658 }, + { 0, { 420., 770., -363., -155., -115., -92. }, 1.0124707282567436 }, + { 0, { -2248., -3936., 3766., -2218., 1312., -630. }, 1.0195444397190756 }, + { 0, { -857., -445., 435., -868., 168., -286. }, 1.0327159571739788 }, + { 0, { 3376., 287., -315., 3751., -219., 1451. }, 1.0465646752474935 }, + { 0, { 703800., -971644., 898780., 636713., 368186., 296800. }, 1.0592831516596322 }, + { 1, { -2151., -2956., 2235., -1431., 946., -697. }, }, + { 2, { -483., -834., 925., 208., 376., 16. }, }, + { 0, { -2186., 1237., -468., -857., -221., -500. }, 1.0699466056843263 }, + { 0, { 186., -107., -155., -33., -60., 1. }, 1.0856512764294945 }, + { 0, { -29., 176., 74., -52., 22., -24. }, 1.1079517768853906 }, + { 1, { 68., -82., -7., 40., -2., 17. }, }, + { 2, { 47., -125., -59., 70., -19., 30. }, }, + { 0, { -79., -181., -17., 75., 0., 31. }, 1.1242912886086618 }, + { 0, { 11970., 27., -219., 9608., -385., 4137. }, 1.1622448658047415 }, + { 1, { 148., -416., -127., 187., -55., 93. }, }, + { 0, { -1209., -240., 543., 444., 267., 180. }, 1.1657893477276102 }, + { 0, { 469., -600., 571., 404., 237., 192. }, 1.2652830224888050 }, + { 0, { -354., 198., -247., -335., -95., -149. }, 1.3749277491569207 }, + { 0, { 1875., 1364., 1214., -1793., 447., -768. }, 1.4364654070205274 }, + { 1, { 8., 17., -6., -31., -6., -14. }, }, + { 0, { -139., 116., 212., 18., 88., 1. }, 1.4674691182537039 }, + { 0, { 498., 950., -86., 629., -57., 244. }, 1.4773951127670801 }, + { 0, { -211., 132., -176., -151., -46., -37. }, 1.5126367782986652 }, + { 0, { 388., -45., -90., 143., -56., 57. }, 1.5755868837627032 }, + { 0, { -262., 394., 82., 179., 60., 76. }, 1.5824073222387700 }, + { 0, { 12274., -42141., 38563., 10654., 16215., 5586. }, 1.5888971797699629 }, + { 1, { 79., 26., 108., -116., 43., -61. }, }, + { 0, { 785., -282., 272., 723., 98., 317. }, 1.6918870360592064 }, + { 0, { 107., -210., -181., -174., -73., -72. }, 1.9281473841900221 }, + { 0, { -121., -1883., 1696., -129., 731., -7. }, 2.1185461864868773 }, + { 0, { 4845., 396., -313., 4430., -275., 2018. }, 3.3406127811310191 }, + { 1, { 1., 25., -4., 6., -1., 2. }, }, + { 0, { -5503., -29918., 27443., -5129., 11901., -2218. }, 6.2830758192539502 }, + { 0, { 149., -16., 70., 137., 24., 69. }, 6.6811483956904603 }, + { 0, { 14., 35., -47., -48., -19., -18. }, 8.4710967963441863 }, + { 1, { 1., -1., -17., -7., -7., -4. }, }, + { 0, { -17638., 555., -991., -16049., 673., -7250. }, 10.2132840866995910 }, + { 0, { -44., -259., 211., -59., 89., -24. }, 12.5662764645159580 }, + { /* end neptune */ -1, }, +}; + +chap95_rec chap95_pluto[] = { + { 0, { 101045891905., 0., 110312086224., 0., 6172492792., 0. }, 0. }, + { 1, { 2736962357., 0., 7289921703., 0., 8356828229., 0. }, }, + { 0, { -197631754827., 306850452168., -363706825084., -174047739469., -83742488844., -166197114948. }, 0.0255535185296511 }, + { 1, { -10339882709., 3627560682., -1704596538., 16082008148., -2615797675., 26582875457. }, }, + { 2, { 4555881844., 5354987944., 14163087849., 13295578846., 16544976961., 15318697408. }, }, + { 0, { 12877551757., 9141005248., 38823958976., 14074786713., 47081142550., 15934841957. }, 0.0383093966256461 }, + { 0, { -20363081906., 43534352230., -68888048997., -6054817551., -37922256273., -13665923314. }, 0.0512632279013590 }, + { 0, { 11372859069., -7331041505., 34135169446., -14164330338., 35562426110., -15256543947. }, 0.0629625800045217 }, + { 0, { -25223811753., 30334977886., -76993608077., 67207355885., -78022096909., 72709750549. }, 0.0739104871604531 }, + { 0, { 19031032676., -21606847641., 49490563510., -67837042251., 54793488046., -76660221358. }, 0.0843726142307477 }, + { 1, { 9888109415., 13390931761., 31569755508., 36949340015., 35801709881., 41063108577. }, }, + { 2, { -5391246864., 9125341237., -13760381761., 26757260022., -14709006932., 29981422406. }, }, + { 0, { 77016900., 8576436595., -758303524., 19868503441., 945693837., 21114141886. }, 0.1009656667626818 }, + { 0, { -425710709., -2201772586., -2981443460., -6781825029., -3324565933., -7783206250. }, 0.1181216342983851 }, + { 1, { 2255988361., -245384099., 5983679140., -939391729., 6514267045., -1323842110. }, }, + { 2, { 531179571., 1086625691., 2182247914., 3044397909., 2484824490., 3408389022. }, }, + { 0, { 670122662., 438458646., 1753307958., 718209879., 2047795531., 636335929. }, 0.1384952768343311 }, + { 0, { -179746215., -90394676., -766063009., -205567765., -854408253., -261725146. }, 0.1499201895782055 }, + { 1, { 110140865., -359336510., 28912500., -843378659., -67920831., -973289319. }, }, + { 0, { -118071179., 1819649., -265130729., 91955370., -298913452., 133716152. }, 0.1607487697162686 }, + { 0, { 38739517., 9002149., 12071193., -2098061., 15714901., -32081340. }, 0.1760768320056049 }, + { 0, { -2332129., 6073325., -5475022., 19141973., -5216109., 20872520. }, 0.1900452184842649 }, + { 0, { 8137788., -2826068., -3014741., -6719062., -5256740., -14189611. }, 0.2024941844674784 }, + { 0, { 18559203., -16541614., 25112499., 27558953., 14213163., 19938478. }, 0.2134752084935937 }, + { 0, { 1940133., -1267576., -1439934., -1986889., -2525015., -3851133. }, 0.2269557049635166 }, + { 1, { 1917476., -1704590., 4921317., -5434051., 4782139., -6305807. }, }, + { 0, { -822410., -563503., -2747944., -903463., -3210523., -702889. }, 0.2402479397150676 }, + { 0, { 962595., -74013., 1141117., 518365., 966375., 17190. }, 0.2531177145689346 }, + { 0, { -135658., -8463., -393590., 160618., -448155., 267162. }, 0.2643717493874742 }, + { 0, { 231442., -143885., 176186., -1443., 93050., -109960. }, 0.2777029906063622 }, + { 0, { -3000., -245., -27453., 92186., -35712., 133397. }, 0.2900297658482435 }, + { 0, { 55997., -115242., -44421., -45883., -43549., -47825. }, 0.3037412654012783 }, + { 0, { -14892., 15253., 52487., 23252., 43486., 48497. }, 0.3142803959054077 }, + { 0, { -2949., -95938., -94512., -17869., -51976., 3765. }, 0.3264027536592037 }, + { 0, { 8894., 9213., 33696., 2580., 28347., 6790. }, 0.3373713684595000 }, + { 0, { -16468., -43883., -57588., 8839., -17108., 18484. }, 0.3506196546089751 }, + { 0, { -4324., 14942., 537., 2320., 8817., -1258. }, 0.3768935755307548 }, + { 0, { -2257., -145., -272., -4909., 4559., -6184. }, 0.3901294315026133 }, + { 0, { -10889., 10437., -5474., 6213., 16279., -4595. }, 0.4045287784128869 }, + { 0, { 719443., -70760., 86542., 684112., 3209., 279550. }, 0.4267968486470127 }, + { 1, { 3728., 5875., 3969., 4141., 3826., 956. }, }, + { 2, { 9968., 1181., 2923., 6780., 6338., 2119. }, }, + { 0, { 6842., 1584., 10374., 4788., 8573., -4658. }, 0.4456721426794963 }, + { 0, { -10089., 9939., 3641., 7449., 544., 598. }, 0.4579662921251779 }, + { 0, { 1823., 688., 6471., -612., 1565., -5241. }, 0.4724826607880908 }, + { 0, { -3424., 9654., 4992., 7807., 583., 1356. }, 0.4869141744280314 }, + { 0, { -449., -1794., 3826., -7250., -2319., -7298. }, 0.5001714317315645 }, + { 0, { 15872., 9071., 15995., 31749., 10331., 14516. }, 0.5137491938947873 }, + { 0, { 40907450., -28046763., 26106307., 37325417., 10171143., 16690754. }, 0.5296557456960209 }, + { 1, { -42177., -28947., 38775., -19498., 29548., -4665. }, }, + { 2, { 3107., 30472., -6348., 11400., 8980., 1831. }, }, + { 0, { -7558., 61741., -13579., -15470., 9629., -26943. }, 0.5428748902518665 }, + { 0, { -5153., -16254., 1129., 1453., -5621., 9705. }, 0.5545763246422408 }, + { 1, { 4786., -5955., 927., 2343., -4914., 1978. }, }, + { 0, { -472., -1295., 65., -1013., 81., 865. }, 0.5737334589484931 }, + { 0, { 1071., -818., -1860., -1756., -2076., -217. }, 0.6240874769868805 }, + { 0, { 35210., 26306., -24283., 31193., -11240., 11870. }, 0.6381677442023816 }, + { 1, { -1433., -467., -610., 819., -193., 1466. }, }, + { 2, { -2302., -1111., 916., -1272., 326., -143. }, }, + { 0, { 713., -751., -578., -1512., 156., -696. }, 0.6775366989691358 }, + { 1, { 60., 611., -229., 120., -170., -479. }, }, + { 0, { 566., 1322., -824., 882., 271., -163. }, 0.7307010456855323 }, + { 1, { 315., -273., 931., -867., 656., -752. }, }, + { 0, { 2637., -5581., -3871., -2275., -3921., 187. }, 0.8349274544218315 }, + { 0, { -6012., 8879., 923., -5393., 1314., -3852. }, 0.8466308769723183 }, + { 1, { -2430., -2929., -1564., 2843., 65., 3053. }, }, + { 2, { -373., -2949., -1724., 190., -949., 999. }, }, + { 0, { 3787., 756., 723., -3294., -966., -1395. }, 0.8803279870880313 }, + { 0, { 5446., -1146., -595., -4608., -1861., -1044. }, 0.9048452745134871 }, + { 0, { 5058., -2711., -831., -3667., -1554., -139. }, 0.9284980837327494 }, + { 0, { 1760., -6922., -4114., -3639., -1717., 694. }, 0.9630502889662660 }, + { 1, { 963., 1525., 703., -3798., -966., -2055. }, }, + { 0, { -854., -5315., -3964., -3549., -797., 142. }, 0.9850575449612223 }, + { 1, { 453., 513., -533., -1316., -1407., -442. }, }, + { 0, { -1452., 2161., -2167., -2392., 843., -1017. }, 1.0358203937225836 }, + { 0, { 717822., -1016247., 926007., 647088., 383619., 291083. }, 1.0592833248900753 }, + { 1, { -29524., -7934., 4354., -18649., -4618., -10392. }, }, + { 2, { -5165., 7903., -5462., -3951., -3606., -275. }, }, + { 0, { -13391., 43036., -26981., -8012., -15174., 6191. }, 1.0698620958167548 }, + { 1, { -19633., -2810., 1597., -10192., -4219., -4352. }, }, + { 0, { 273., 2230., -349., -375., 851., 287. }, 1.0830212781676249 }, + { 0, { 10855., -624., 671., 9748., 207., 3846. }, 1.1622398168028405 }, + { 1, { -33., 92., -124., -554., -92., -612. }, }, + { 0, { 448., -1008., 1081., 183., 623., -187. }, 1.2654499680761597 }, + { 0, { -207., 526., 176., -733., 246., -400. }, 1.3757220045803040 }, + { 0, { 638., 340., -422., 36., 44., 18. }, 1.4777197679290477 }, + { 0, { 12128., -41950., 38517., 10211., 16357., 5050. }, 1.5888963534561586 }, + { 1, { -267., 195., -296., 12., -482., 121. }, }, + { 2, { -41., 86., -13., 298., -132., 311. }, }, + { 0, { 667., -280., 347., 903., -21., 475. }, 1.6918774676128379 }, + { 0, { 30., -1843., 2162., 314., 1153., 512. }, 2.1185453910327063 }, + { 0, { 4845., 477., -393., 4358., -362., 2072. }, 3.3406128168607023 }, + { 0, { -5939., -29727., 27855., -4133., 12163., -1725. }, 6.2830758108873654 }, + { 1, { 5., -58., 6., 45., 39., 54. }, }, + { 0, { -223., 149., 91., 102., 231., 420. }, 8.4710959288534031 }, + { 0, { -17640., -47., -831., -15721., 782., -7065. }, 10.2132856585962150 }, + { 1, { 165., 60., -38., 154., 112., 136. }, }, + { 2, { 20., 46., 112., -30., 119., 10. }, }, + { /* end pluto */ -1, }, +}; + + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: chap95_data.c,v $ $Date: 1997/05/19 18:21:12 $ $Revision: 1.1 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/circum.c b/Common/Libraries/XEphemAstroLib/src/circum.c new file mode 100644 index 000000000..31dbc4bbb --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/circum.c @@ -0,0 +1,861 @@ +/* given a Now and an Obj with the object definition portion filled in, + * fill in the sky position (s_*) portions. + * calculation of positional coordinates reworked by + * Michael Sternberg + * 3/11/98: deflect was using op->s_hlong before being set in cir_pos(). + * 4/19/98: just edit a comment + */ + +#include +#include +#include + +#include "astro.h" +#include "preferences.h" + + +static int obj_planet (Now *np, Obj *op); +static int obj_binary (Now *np, Obj *op); +static int obj_2binary (Now *np, Obj *op); +static int obj_fixed (Now *np, Obj *op); +static int obj_elliptical (Now *np, Obj *op); +static int obj_hyperbolic (Now *np, Obj *op); +static int obj_parabolic (Now *np, Obj *op); +static int sun_cir (Now *np, Obj *op); +static int moon_cir (Now *np, Obj *op); +static double solveKepler (double M, double e); +static void binaryStarOrbit (double t, double T, double e, double o, double O, + double i, double a, double P, double *thetap, double *rhop); +static void cir_sky (Now *np, double lpd, double psi, double rp, double *rho, + double lam, double bet, double lsn, double rsn, Obj *op); +static void cir_pos (Now *np, double bet, double lam, double *rho, Obj *op); +static void elongation (double lam, double bet, double lsn, double *el); +static void deflect (double mjd1, double lpd, double psi, double rsn, + double lsn, double rho, double *ra, double *dec); +static double h_albsize (double H); + +/* given a Now and an Obj, fill in the approprirate s_* fields within Obj. + * return 0 if all ok, else -1. + */ +int +obj_cir (Now *np, Obj *op) +{ + op->o_flags &= ~NOCIRCUM; + switch (op->o_type) { + case BINARYSTAR: return (obj_binary (np, op)); + case FIXED: return (obj_fixed (np, op)); + case ELLIPTICAL: return (obj_elliptical (np, op)); + case HYPERBOLIC: return (obj_hyperbolic (np, op)); + case PARABOLIC: return (obj_parabolic (np, op)); + case EARTHSAT: return (obj_earthsat (np, op)); + case PLANET: return (obj_planet (np, op)); + default: + printf ("obj_cir() called with type %d %s\n", op->o_type, op->o_name); + abort(); + return (-1); /* just for lint */ + } +} + +static int +obj_planet (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double lpd, psi; /* heliocentric ecliptic long and lat */ + double rp; /* dist from sun */ + double rho; /* dist from earth */ + double lam, bet; /* geocentric ecliptic long and lat */ + double dia, mag; /* angular diameter at 1 AU and magnitude */ + PLCode p; + + /* validate code and check for a few special cases */ + p = op->pl_code; + if (p == SUN) + return (sun_cir (np, op)); + if (p == MOON) + return (moon_cir (np, op)); + if (op->pl_moon != X_PLANET) + return (plmoon_cir (np, op)); + if (p < 0 || p > MOON) { + printf ("unknown planet code: %d\n", p); + abort(); + } + + /* planet itself */ + + /* find solar ecliptical longitude and distance to sun from earth */ + sunpos (mjed, &lsn, &rsn, 0); + + /* find helio long/lat; sun/planet and earth/planet dist; ecliptic + * long/lat; diameter and mag. + */ + plans(mjed, p, &lpd, &psi, &rp, &rho, &lam, &bet, &dia, &mag); + + /* fill in all of op->s_* stuff except s_size and s_mag */ + cir_sky (np, lpd, psi, rp, &rho, lam, bet, lsn, rsn, op); + + /* set magnitude and angular size */ + set_smag (op, mag); + op->s_size = (float)(dia/rho); + + return (0); +} + +static int +obj_binary (Now *np, Obj *op) +{ + /* always compute circumstances of primary */ + if (obj_fixed (np, op) < 0) + return (0); + + /* compute secondary only if requested, and always reset request flag */ + if (!op->b_2compute) + return (0); + op->b_2compute = 0; + return (obj_2binary (np, op)); +} + +/* compute position of secondary component of a BINARYSTAR */ +static int +obj_2binary (Now *np, Obj *op) +{ + if (op->b_nbp > 0) { + /* we just have discrete pa/sep, project each from primary */ + int i; + for (i = 0; i < op->b_nbp; i++) { + BinPos *bp = &op->b_bp[i]; + bp->bp_dec = op->s_dec + bp->bp_sep*cos(bp->bp_pa); + bp->bp_ra = op->s_ra + bp->bp_sep*sin(bp->bp_pa)/cos(op->s_dec); + } + } else { + BinOrbit *bp = &op->b_bo; + double t, theta, rho; + + mjd_year (mjd, &t); + binaryStarOrbit (t, bp->bo_T, bp->bo_e, bp->bo_o, bp->bo_O, + bp->bo_i, bp->bo_a, bp->bo_P, &theta, &rho); + bp->bo_pa = (float)theta; + bp->bo_sep = (float)rho; + rho = degrad(rho/3600.); /* arc secs to rads */ + bp->bo_dec = op->s_dec + rho*cos(theta); + bp->bo_ra = op->s_ra + rho*sin(theta)/cos(op->s_dec); + } + + return (0); +} + +/* from W. M. Smart */ +static void +binaryStarOrbit ( +double t, /* desired ephemeris epoch, year */ +double T, /* epoch of periastron, year */ +double e, /* eccentricity */ +double o, /* argument of periastron, degrees */ +double O, /* ascending node, degrees */ +double i, /* inclination, degrees */ +double a, /* semi major axis, arcsecs */ +double P, /* period, years */ +double *thetap, /* position angle, rads E of N */ +double *rhop) /* separation, arcsecs */ +{ + double M, E, cosE, nu, cosnu, r, rho, theta; + + /* find mean anomaly, insure 0..2*PI */ + M = 2*PI/P*(t-T); + range (&M, 2*PI); + + /* solve for eccentric anomaly */ + E = solveKepler (M, e); + cosE = cos(E); + + /* find true anomaly and separation */ + cosnu = (cosE - e)/(1.0 - e*cosE); + r = a*(1.0 - e*e)/(1.0 + e*cosnu); + nu = acos(cosnu); + if (E > PI) + nu = -nu; + + /* project onto sky */ + theta = atan(tan(nu+degrad(o))*cos(degrad(i))) + degrad(O); + rho = r*cos(nu+degrad(o))/cos(theta-degrad(O)); + if (rho < 0) { + theta += PI; + rho = -rho; + } + range (&theta, 2*PI); + + *thetap = theta; + *rhop = rho; +} + +/* solve kepler equation using Newton-Raphson search. + * Charles and Tatum have shown it always converges starting with PI. + */ +static double +solveKepler (double M, double e) +{ + double E, Eprime = PI; + + do { + double cosE = cos(Eprime); + E = Eprime; + Eprime = (M - e*(E*cosE - sin(E)))/(1.0 - e*cosE); + } while (fabs(E-Eprime) > 1e-7); + + return (Eprime); +} + +static int +obj_fixed (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun, dist from sn to earth*/ + double lam, bet; /* geocentric ecliptic long and lat */ + double ha; /* local hour angle */ + double el; /* elongation */ + double alt, az; /* current alt, az */ + double ra, dec; /* ra and dec at equinox of date */ + double rpm, dpm; /* astrometric ra and dec with PM to now */ + double lst; + + /* on the assumption that the user will stick with their chosen display + * epoch for a while, we move the defining values to match and avoid + * precession for every call until it is changed again. + * N.B. only compare and store jd's to lowest precission (f_epoch). + * N.B. maintaining J2k ref (which is arbitrary) helps avoid accum err + */ + if (epoch != EOD && (float)epoch != (float)op->f_epoch) { + double pr = op->f_RA, pd = op->f_dec, fe = (float)epoch; + /* first bring back to 2k */ + precess (op->f_epoch, J2000, &pr, &pd); + pr += op->f_pmRA*(J2000-op->f_epoch); + pd += op->f_pmdec*(J2000-op->f_epoch); + /* then to epoch */ + pr += op->f_pmRA*(fe-J2000); + pd += op->f_pmdec*(fe-J2000); + precess (J2000, fe, &pr, &pd); + op->f_RA = (float)pr; + op->f_dec = (float)pd; + op->f_epoch = (float)fe; + } + + /* apply proper motion .. assume pm epoch reference equals equinox */ + rpm = op->f_RA + op->f_pmRA*(mjd-op->f_epoch); + dpm = op->f_dec + op->f_pmdec*(mjd-op->f_epoch); + + /* set ra/dec to astrometric @ equinox of date */ + ra = rpm; + dec = dpm; + precess (op->f_epoch, mjed, &ra, &dec); + + /* convert equatoreal ra/dec to mean geocentric ecliptic lat/long */ + eq_ecl (mjed, ra, dec, &bet, &lam); + + /* find solar ecliptical long.(mean equinox) and distance from earth */ + sunpos (mjed, &lsn, &rsn, NULL); + + /* allow for relativistic light bending near the sun */ + deflect (mjed, lam, bet, lsn, rsn, 1e10, &ra, &dec); + + /* TODO: correction for annual parallax would go here */ + + /* correct EOD equatoreal for nutation/aberation to form apparent + * geocentric + */ + nut_eq(mjed, &ra, &dec); + ab_eq(mjed, lsn, &ra, &dec); + op->s_gaera = (float)ra; + op->s_gaedec = (float)dec; + + /* set s_ra/dec -- apparent if EOD else astrometric */ + if (epoch == EOD) { + op->s_ra = (float)ra; + op->s_dec = (float)dec; + } else { + /* annual parallax at time mjd is to be added here, too, but + * technically in the frame of equinox (usually different from mjd) + */ + op->s_ra = rpm; + op->s_dec = dpm; + } + + /* compute elongation from ecliptic long/lat and sun geocentric long */ + elongation (lam, bet, lsn, &el); + el = raddeg(el); + op->s_elong = (float)el; + + /* these are really the same fields ... + op->s_mag = op->f_mag; + op->s_size = op->f_size; + */ + + /* alt, az: correct for refraction; use eod ra/dec. */ + now_lst (np, &lst); + ha = hrrad(lst) - ra; + hadec_aa (lat, ha, dec, &alt, &az); + refract (pressure, temp, alt, &alt); + op->s_alt = alt; + op->s_az = az; + + return (0); +} + +/* compute sky circumstances of an object in heliocentric elliptic orbit at *np. + */ +static int +obj_elliptical (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double dt; /* light travel time to object */ + double lg; /* helio long of earth */ + double nu; /* true anomaly */ + double rp=0; /* distance from the sun */ + double lo, slo, clo; /* angle from ascending node */ + double inc; /* inclination */ + double psi=0; /* heliocentric latitude */ + double spsi=0, cpsi=0; /* trig of heliocentric latitude */ + double lpd; /* heliocentric longitude */ + double rho=0; /* distance from the Earth */ + double om; /* arg of perihelion */ + double Om; /* long of ascending node. */ + double lam; /* geocentric ecliptic longitude */ + double bet; /* geocentric ecliptic latitude */ + double ll=0, sll, cll; /* helio angle between object and earth */ + double mag; /* magnitude */ + double e_n; /* mean daily motion */ + double tp; /* time from perihelion (days) */ + double rpd=0; + double y; + int pass; + + /* find location of earth from sun now */ + sunpos (mjed, &lsn, &rsn, 0); + lg = lsn + PI; + + /* mean daily motion is derived fro mean distance */ + e_n = 0.9856076686/pow((double)op->e_a, 1.5); + + /* correct for light time by computing position at time mjd, then + * again at mjd-dt, where + * dt = time it takes light to travel earth-object distance. + */ + dt = 0; + for (pass = 0; pass < 2; pass++) { + + reduce_elements (op->e_epoch, mjd-dt, degrad(op->e_inc), + degrad (op->e_om), degrad (op->e_Om), + &inc, &om, &Om); + + tp = mjed - dt - (op->e_cepoch - op->e_M/e_n); + if (vrc (&nu, &rp, tp, op->e_e, op->e_a*(1-op->e_e)) < 0) + op->o_flags |= NOCIRCUM; + nu = degrad(nu); + lo = nu + om; + slo = sin(lo); + clo = cos(lo); + spsi = slo*sin(inc); + y = slo*cos(inc); + psi = asin(spsi); + lpd = atan(y/clo)+Om; + if (clo<0) lpd += PI; + range (&lpd, 2*PI); + cpsi = cos(psi); + rpd = rp*cpsi; + ll = lpd-lg; + rho = sqrt(rsn*rsn+rp*rp-2*rsn*rp*cpsi*cos(ll)); + + dt = rho*LTAU/3600.0/24.0; /* light travel time, in days / AU */ + } + + /* compute sin and cos of ll */ + sll = sin(ll); + cll = cos(ll); + + /* find geocentric ecliptic longitude and latitude */ + if (rpd < rsn) + lam = atan(-1*rpd*sll/(rsn-rpd*cll))+lg+PI; + else + lam = atan(rsn*sll/(rpd-rsn*cll))+lpd; + range (&lam, 2*PI); + bet = atan(rpd*spsi*sin(lam-lpd)/(cpsi*rsn*sll)); + + /* fill in all of op->s_* stuff except s_size and s_mag */ + cir_sky (np, lpd, psi, rp, &rho, lam, bet, lsn, rsn, op); + + /* compute magnitude and size */ + if (op->e_mag.whichm == MAG_HG) { + /* the H and G parameters from the Astro. Almanac. + */ + hg_mag (op->e_mag.m1, op->e_mag.m2, rp, rho, rsn, &mag); + if (op->e_size) + op->s_size = (float)(op->e_size / rho); + else + op->s_size = (float)(h_albsize (op->e_mag.m1)/rho); + } else { + /* the g/k model of comets */ + gk_mag (op->e_mag.m1, op->e_mag.m2, rp, rho, &mag); + op->s_size = (float)(op->e_size / rho); + } + set_smag (op, mag); + + return (0); +} + +/* compute sky circumstances of an object in heliocentric hyperbolic orbit. + */ +static int +obj_hyperbolic (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double dt; /* light travel time to object */ + double lg; /* helio long of earth */ + double nu; /* true anomaly and eccentric anomaly */ + double rp=0; /* distance from the sun */ + double lo, slo, clo; /* angle from ascending node */ + double inc; /* inclination */ + double psi=0; /* heliocentric latitude */ + double spsi=0, cpsi=0; /* trig of heliocentric latitude */ + double lpd; /* heliocentric longitude */ + double rho=0; /* distance from the Earth */ + double om; /* arg of perihelion */ + double Om; /* long of ascending node. */ + double lam; /* geocentric ecliptic longitude */ + double bet; /* geocentric ecliptic latitude */ + double e; /* fast eccentricity */ + double ll=0, sll, cll; /* helio angle between object and earth */ + double mag; /* magnitude */ + double a; /* mean distance */ + double tp; /* time from perihelion (days) */ + double rpd=0; + double y; + int pass; + + /* find solar ecliptical longitude and distance to sun from earth */ + sunpos (mjed, &lsn, &rsn, 0); + + lg = lsn + PI; + e = op->h_e; + a = op->h_qp/(e - 1.0); + + /* correct for light time by computing position at time mjd, then + * again at mjd-dt, where + * dt = time it takes light to travel earth-object distance. + */ + dt = 0; + for (pass = 0; pass < 2; pass++) { + + reduce_elements (op->h_epoch, mjd-dt, degrad(op->h_inc), + degrad (op->h_om), degrad (op->h_Om), + &inc, &om, &Om); + + tp = mjed - dt - op->h_ep; + if (vrc (&nu, &rp, tp, op->h_e, op->h_qp) < 0) + op->o_flags |= NOCIRCUM; + nu = degrad(nu); + lo = nu + om; + slo = sin(lo); + clo = cos(lo); + spsi = slo*sin(inc); + y = slo*cos(inc); + psi = asin(spsi); + lpd = atan(y/clo)+Om; + if (clo<0) lpd += PI; + range (&lpd, 2*PI); + cpsi = cos(psi); + rpd = rp*cpsi; + ll = lpd-lg; + rho = sqrt(rsn*rsn+rp*rp-2*rsn*rp*cpsi*cos(ll)); + + dt = rho*5.775518e-3; /* light travel time, in days */ + } + + /* compute sin and cos of ll */ + sll = sin(ll); + cll = cos(ll); + + /* find geocentric ecliptic longitude and latitude */ + if (rpd < rsn) + lam = atan(-1*rpd*sll/(rsn-rpd*cll))+lg+PI; + else + lam = atan(rsn*sll/(rpd-rsn*cll))+lpd; + range (&lam, 2*PI); + bet = atan(rpd*spsi*sin(lam-lpd)/(cpsi*rsn*sll)); + + /* fill in all of op->s_* stuff except s_size and s_mag */ + cir_sky (np, lpd, psi, rp, &rho, lam, bet, lsn, rsn, op); + + /* compute magnitude and size */ + gk_mag (op->h_g, op->h_k, rp, rho, &mag); + set_smag (op, mag); + op->s_size = (float)(op->h_size / rho); + + return (0); +} + +/* compute sky circumstances of an object in heliocentric hyperbolic orbit. + */ +static int +obj_parabolic (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double lam; /* geocentric ecliptic longitude */ + double bet; /* geocentric ecliptic latitude */ + double mag; /* magnitude */ + double inc, om, Om; + double lpd, psi, rp, rho; + double dt; + int pass; + + /* find solar ecliptical longitude and distance to sun from earth */ + sunpos (mjed, &lsn, &rsn, 0); + + /* two passes to correct lam and bet for light travel time. */ + dt = 0.0; + for (pass = 0; pass < 2; pass++) { + reduce_elements (op->p_epoch, mjd-dt, degrad(op->p_inc), + degrad(op->p_om), degrad(op->p_Om), &inc, &om, &Om); + comet (mjed-dt, op->p_ep, inc, om, op->p_qp, Om, + &lpd, &psi, &rp, &rho, &lam, &bet); + dt = rho*LTAU/3600.0/24.0; /* light travel time, in days / AU */ + } + + /* fill in all of op->s_* stuff except s_size and s_mag */ + cir_sky (np, lpd, psi, rp, &rho, lam, bet, lsn, rsn, op); + + /* compute magnitude and size */ + gk_mag (op->p_g, op->p_k, rp, rho, &mag); + set_smag (op, mag); + op->s_size = (float)(op->p_size / rho); + + return (0); +} + +/* find sun's circumstances now. + */ +static int +sun_cir (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double bsn; /* true latitude beta of sun */ + double dhlong; + + sunpos (mjed, &lsn, &rsn, &bsn);/* sun's true coordinates; mean ecl. */ + + op->s_sdist = 0.0; + op->s_elong = 0.0; + op->s_phase = 100.0; + set_smag (op, -26.8); /* TODO */ + dhlong = lsn-PI; /* geo- to helio- centric */ + range (&dhlong, 2*PI); + op->s_hlong = (float)dhlong; + op->s_hlat = (float)(-bsn); + + /* fill sun's ra/dec, alt/az in op */ + cir_pos (np, bsn, lsn, &rsn, op); + op->s_edist = (float)rsn; + op->s_size = (float)(raddeg(4.65242e-3/rsn)*3600*2); + + return (0); +} + +/* find moon's circumstances now. + */ +static int +moon_cir (Now *np, Obj *op) +{ + double lsn, rsn; /* true geoc lng of sun; dist from sn to earth*/ + double lam; /* geocentric ecliptic longitude */ + double bet; /* geocentric ecliptic latitude */ + double edistau; /* earth-moon dist, in au */ + double el; /* elongation, rads east */ + double ms; /* sun's mean anomaly */ + double md; /* moon's mean anomaly */ + double i; + + moon (mjed, &lam, &bet, &edistau, &ms, &md); /* mean ecliptic & EOD*/ + sunpos (mjed, &lsn, &rsn, NULL); /* mean ecliptic & EOD*/ + + op->s_hlong = (float)lam; /* save geo in helio fields */ + op->s_hlat = (float)bet; + + /* find angular separation from sun */ + elongation (lam, bet, lsn, &el); + op->s_elong = (float)raddeg(el); /* want degrees */ + + /* solve triangle of earth, sun, and elongation for moon-sun dist */ + op->s_sdist = (float) sqrt (edistau*edistau + rsn*rsn + - 2.0*edistau*rsn*cos(el)); + + /* TODO: improve mag; this is based on a flat moon model. */ + i = -12.7 + 2.5*(log10(PI) - log10(PI/2*(1+1.e-6-cos(el)))) + + 5*log10(edistau/.0025) /* dist */; + set_smag (op, i); + + /* find phase -- allow for projection effects */ + i = 0.1468*sin(el)*(1 - 0.0549*sin(md))/(1 - 0.0167*sin(ms)); + op->s_phase = (float)((1+cos(PI-el-degrad(i)))/2*100); + + /* fill moon's ra/dec, alt/az in op and update for topo dist */ + cir_pos (np, bet, lam, &edistau, op); + + op->s_edist = (float)edistau; + op->s_size = (float)(3600*2.0*raddeg(asin(MRAD/MAU/edistau))); + /* moon angular dia, seconds */ + + return (0); +} + +/* fill in all of op->s_* stuff except s_size and s_mag. + * this is used for sol system objects (except sun and moon); never FIXED. + */ +static void +cir_sky ( +Now *np, +double lpd, /* heliocentric ecliptic longitude */ +double psi, /* heliocentric ecliptic lat */ +double rp, /* dist from sun */ +double *rho, /* dist from earth: in as geo, back as geo or topo */ +double lam, /* true geocentric ecliptic long */ +double bet, /* true geocentric ecliptic lat */ +double lsn, /* true geoc lng of sun */ +double rsn, /* dist from sn to earth*/ +Obj *op) +{ + double el; /* elongation */ + double f; /* fractional phase from earth */ + + /* compute elongation and phase */ + elongation (lam, bet, lsn, &el); + el = raddeg(el); + op->s_elong = (float)el; + f = 0.25 * ((rp+ *rho)*(rp+ *rho) - rsn*rsn)/(rp* *rho); + op->s_phase = (float)(f*100.0); /* percent */ + + /* set heliocentric long/lat; mean ecliptic and EOD */ + op->s_hlong = (float)lpd; + op->s_hlat = (float)psi; + + /* fill solar sys body's ra/dec, alt/az in op */ + cir_pos (np, bet, lam, rho, op); /* updates rho */ + + /* set earth/planet and sun/planet distance */ + op->s_edist = (float)(*rho); + op->s_sdist = (float)rp; +} + +/* fill equatoreal and horizontal op-> fields; stern + * + * input: lam/bet/rho geocentric mean ecliptic and equinox of day + * + * algorithm at EOD: + * ecl_eq --> ra/dec geocentric mean equatoreal EOD (via mean obliq) + * deflect --> ra/dec relativistic deflection + * nut_eq --> ra/dec geocentric true equatoreal EOD + * ab_eq --> ra/dec geocentric apparent equatoreal EOD + * if (PREF_GEO) --> output + * ta_par --> ra/dec topocentric apparent equatoreal EOD + * if (!PREF_GEO) --> output + * hadec_aa --> alt/az topocentric horizontal + * refract --> alt/az observed --> output + * + * algorithm at fixed equinox: + * ecl_eq --> ra/dec geocentric mean equatoreal EOD (via mean obliq) + * deflect --> ra/dec relativistic deflection [for alt/az only] + * nut_eq --> ra/dec geocentric true equatoreal EOD [for aa only] + * ab_eq --> ra/dec geocentric apparent equatoreal EOD [for aa only] + * ta_par --> ra/dec topocentric apparent equatoreal EOD + * precess --> ra/dec topocentric equatoreal fixed equinox [eq only] + * --> output + * hadec_aa --> alt/az topocentric horizontal + * refract --> alt/az observed --> output + */ +static void +cir_pos ( +Now *np, +double bet, /* geo lat (mean ecliptic of date) */ +double lam, /* geo long (mean ecliptic of date) */ +double *rho, /* in: geocentric dist in AU; out: geo- or topocentic dist */ +Obj *op) /* object to set s_ra/dec as per equinox */ +{ + double ra, dec; /* apparent ra/dec, corrected for nut/ab */ + double tra, tdec; /* astrometric ra/dec, no nut/ab */ + double lsn, rsn; /* solar geocentric (mean ecliptic of date) */ + double ha_in, ha_out; /* local hour angle before/after parallax */ + double dec_out; /* declination after parallax */ + double dra, ddec; /* parallax correction */ + double alt, az; /* current alt, az */ + double lst; /* local sidereal time */ + double rho_topo; /* topocentric distance in earth radii */ + + /* convert to equatoreal [mean equator, with mean obliquity] */ + ecl_eq (mjed, bet, lam, &ra, &dec); + tra = ra; /* keep mean coordinates */ + tdec = dec; + + /* get sun position */ + sunpos(mjed, &lsn, &rsn, NULL); + + /* allow for relativistic light bending near the sun. + * (avoid calling deflect() for the sun itself). + */ + if (!is_planet(op,SUN) && !is_planet(op,MOON)) + deflect (mjed, op->s_hlong, op->s_hlat, lsn, rsn, *rho, &ra, &dec); + + /* correct ra/dec to form geocentric apparent */ + nut_eq (mjed, &ra, &dec); + if (!is_planet(op,MOON)) + ab_eq (mjed, lsn, &ra, &dec); + op->s_gaera = (float)ra; + op->s_gaedec = (float)dec; + + /* find parallax correction for equatoreal coords */ + now_lst (np, &lst); + ha_in = hrrad(lst) - ra; + rho_topo = *rho * MAU/ERAD; /* convert to earth radii */ + ta_par (ha_in, dec, lat, elev, &rho_topo, &ha_out, &dec_out); + + /* transform into alt/az and apply refraction */ + hadec_aa (lat, ha_out, dec_out, &alt, &az); + refract (pressure, temp, alt, &alt); + op->s_alt = alt; + op->s_az = az; + + /* Get parallax differences and apply to apparent or astrometric place + * as needed. For the astrometric place, rotating the CORRECTIONS + * back from the nutated equator to the mean equator will be + * neglected. This is an effect of about 0.1" at moon distance. + * We currently don't have an inverse nutation rotation. + */ + if (pref_get(PREF_EQUATORIAL) == PREF_GEO) { + /* no topo corrections to eq. coords */ + dra = ddec = 0.0; + } else { + dra = ha_in - ha_out; /* ra sign is opposite of ha */ + ddec = dec_out - dec; + *rho = rho_topo * ERAD/MAU; /* return topocentric distance in AU */ + } + + /* fill in ra/dec fields */ + if (epoch == EOD) { /* apparent geo/topocentric */ + ra = ra + dra; + dec = dec + ddec; + } else { /* astrometric geo/topocent */ + ra = tra + dra; + dec = tdec + ddec; + precess (mjed, epoch, &ra, &dec); + } + range(&ra, 2*PI); + op->s_ra = (float)ra; + op->s_dec = (float)dec; +} + +/* given geocentric ecliptic longitude and latitude, lam and bet, of some object + * and the longitude of the sun, lsn, find the elongation, el. this is the + * actual angular separation of the object from the sun, not just the difference + * in the longitude. the sign, however, IS set simply as a test on longitude + * such that el will be >0 for an evening object <0 for a morning object. + * to understand the test for el sign, draw a graph with lam going from 0-2*PI + * down the vertical axis, lsn going from 0-2*PI across the hor axis. then + * define the diagonal regions bounded by the lines lam=lsn+PI, lam=lsn and + * lam=lsn-PI. the "morning" regions are any values to the lower left of the + * first line and bounded within the second pair of lines. + * all angles in radians. + */ +static void +elongation (double lam, double bet, double lsn, double *el) +{ + *el = acos(cos(bet)*cos(lam-lsn)); + if (lam>lsn+PI || (lam>lsn-PI && lamdegrad(179.75) || rho + +#include "astro.h" + +/* given a modified Julian date, mj, and a set of heliocentric parabolic + * orbital elements referred to the epoch of date (mj): + * ep: epoch of perihelion, + * inc: inclination, + * ap: argument of perihelion (equals the longitude of perihelion minus the + * longitude of ascending node) + * qp: perihelion distance, + * om: longitude of ascending node; + * find: + * lpd: heliocentric longitude, + * psi: heliocentric latitude, + * rp: distance from the sun to the planet, + * rho: distance from the Earth to the planet, + * lam: geocentric ecliptic longitude, + * bet: geocentric ecliptic latitude, + * none are corrected for light time, ie, they are the true values for + * the given instant. + * + * all angles are in radians, all distances in AU. + * mutual perturbation corrections with other solar system objects are not + * applied. corrections for nutation and abberation must be made by the caller. + * The RA and DEC calculated from the fully-corrected ecliptic coordinates are + * then the apparent geocentric coordinates. Further corrections can be made, + * if required, for atmospheric refraction and geocentric parallax. + */ +void +comet (double mj, double ep, double inc, double ap, double qp, double om, +double *lpd, double *psi, double *rp, double *rho, double *lam, double *bet) +{ + double w, s, s2; + double l, sl, cl, y; + double spsi, cpsi; + double rd, lsn, rsn; + double lg, re, ll; + double cll, sll; + double nu; + +#define ERRLMT 0.0001 + w = ((mj-ep)*3.649116e-02)/(qp*sqrt(qp)); + s = w/3; + for (;;) { + double d; + s2 = s*s; + d = (s2+3)*s-w; + if (fabs(d) <= ERRLMT) + break; + s = ((2*s*s2)+w)/(3*(s2+1)); + } + + nu = 2*atan(s); + *rp = qp*(1+s2); + l = nu+ap; + sl = sin(l); + cl = cos(l); + spsi = sl*sin(inc); + *psi = asin(spsi); + y = sl*cos(inc); + *lpd = atan(y/cl)+om; + cpsi = cos(*psi); + if (cl<0) *lpd += PI; + range (lpd, 2*PI); + rd = *rp * cpsi; + sunpos (mj, &lsn, &rsn, 0); + lg = lsn+PI; + re = rsn; + ll = *lpd - lg; + cll = cos(ll); + sll = sin(ll); + *rho = sqrt((re * re)+(*rp * *rp)-(2*re*rd*cll)); + if (rd +#include +#include +#include +#include + +#include "astro.h" + +/* +====================================================================== +Ernie Wright 2 Mar 94 + +Find the constellation for a given position. + +First C version by Craig Counterman and Elwood Downey. Based on a +FORTRAN program by Nancy G. Roman (Roman, N.G. 1987, Publ. Astron. +Soc. Pacific 99, 695). IAU constellation boundaries transcribed into +machine-readable form by Barry N. Rappaport, New Mexico State Univ. +====================================================================== +*/ + +#define NBOUNDS 357 + +/* constellation ids */ +#define And 0 +#define Ant 1 +#define Aps 2 +#define Aql 3 +#define Aqr 4 +#define Ara 5 +#define Ari 6 +#define Aur 7 +#define Boo 8 +#define CMa 9 +#define CMi 10 +#define CVn 11 +#define Cae 12 +#define Cam 13 +#define Cap 14 +#define Car 15 +#define Cas 16 +#define Cen 17 +#define Cep 18 +#define Cet 19 +#define Cha 20 +#define Cir 21 +#define Cnc 22 +#define Col 23 +#define Com 24 +#define CrA 25 +#define CrB 26 +#define Crt 27 +#define Cru 28 +#define Crv 29 +#define Cyg 30 +#define Del 31 +#define Dor 32 +#define Dra 33 +#define Equ 34 +#define Eri 35 +#define For 36 +#define Gem 37 +#define Gru 38 +#define Her 39 +#define Hor 40 +#define Hya 41 +#define Hyi 42 +#define Ind 43 +#define LMi 44 +#define Lac 45 +#define Leo 46 +#define Lep 47 +#define Lib 48 +#define Lup 49 +#define Lyn 50 +#define Lyr 51 +#define Men 52 +#define Mic 53 +#define Mon 54 +#define Mus 55 +#define Nor 56 +#define Oct 57 +#define Oph 58 +#define Ori 59 +#define Pav 60 +#define Peg 61 +#define Per 62 +#define Phe 63 +#define Pic 64 +#define PsA 65 +#define Psc 66 +#define Pup 67 +#define Pyx 68 +#define Ret 69 +#define Scl 70 +#define Sco 71 +#define Sct 72 +#define Se1 73 +#define Sex 74 +#define Sge 75 +#define Sgr 76 +#define Tau 77 +#define Tel 78 +#define TrA 79 +#define Tri 80 +#define Tuc 81 +#define UMa 82 +#define UMi 83 +#define Vel 84 +#define Vir 85 +#define Vol 86 +#define Vul 87 +#define Se2 88 + +static char *cns_namemap[ NCNS ] = { + /* 0 */ "And: Andromeda", + /* 1 */ "Ant: Antlia", + /* 2 */ "Aps: Apus", + /* 3 */ "Aql: Aquila", + /* 4 */ "Aqr: Aquarius", + /* 5 */ "Ara: Ara", + /* 6 */ "Ari: Aries", + /* 7 */ "Aur: Auriga", + /* 8 */ "Boo: Bootes", + /* 9 */ "CMa: Canis Major", + /* 10 */ "CMi: Canis Minor", + /* 11 */ "CVn: Canes Venatici", + /* 12 */ "Cae: Caelum", + /* 13 */ "Cam: Camelopardalis", + /* 14 */ "Cap: Capricornus", + /* 15 */ "Car: Carina", + /* 16 */ "Cas: Cassiopeia", + /* 17 */ "Cen: Centaurus", + /* 18 */ "Cep: Cepheus", + /* 19 */ "Cet: Cetus", + /* 20 */ "Cha: Chamaeleon", + /* 21 */ "Cir: Circinus", + /* 22 */ "Cnc: Cancer", + /* 23 */ "Col: Columba", + /* 24 */ "Com: Coma Berenices", + /* 25 */ "CrA: Corona Australis", + /* 26 */ "CrB: Corona Borealis", + /* 27 */ "Crt: Crater", + /* 28 */ "Cru: Crux", + /* 29 */ "Crv: Corvus", + /* 30 */ "Cyg: Cygnus", + /* 31 */ "Del: Delphinus", + /* 32 */ "Dor: Dorado", + /* 33 */ "Dra: Draco", + /* 34 */ "Equ: Equuleus", + /* 35 */ "Eri: Eridanus", + /* 36 */ "For: Fornax", + /* 37 */ "Gem: Gemini", + /* 38 */ "Gru: Grus", + /* 39 */ "Her: Hercules", + /* 40 */ "Hor: Horologium", + /* 41 */ "Hya: Hydra", + /* 42 */ "Hyi: Hydrus", + /* 43 */ "Ind: Indus", + /* 44 */ "LMi: Leo Minor", + /* 45 */ "Lac: Lacerta", + /* 46 */ "Leo: Leo", + /* 47 */ "Lep: Lepus", + /* 48 */ "Lib: Libra", + /* 49 */ "Lup: Lupus", + /* 50 */ "Lyn: Lynx", + /* 51 */ "Lyr: Lyra", + /* 52 */ "Men: Mensa", + /* 53 */ "Mic: Microscopium", + /* 54 */ "Mon: Monoceros", + /* 55 */ "Mus: Musca", + /* 56 */ "Nor: Norma", + /* 57 */ "Oct: Octans", + /* 58 */ "Oph: Ophiuchus", + /* 59 */ "Ori: Orion", + /* 60 */ "Pav: Pavo", + /* 61 */ "Peg: Pegasus", + /* 62 */ "Per: Perseus", + /* 63 */ "Phe: Phoenix", + /* 64 */ "Pic: Pictor", + /* 65 */ "PsA: Piscis Austrinus", + /* 66 */ "Psc: Pisces", + /* 67 */ "Pup: Puppis", + /* 68 */ "Pyx: Pyxis", + /* 69 */ "Ret: Reticulum", + /* 70 */ "Scl: Sculptor", + /* 71 */ "Sco: Scorpius", + /* 72 */ "Sct: Scutum", + /* 73 */ "Se1: Serpens Caput", + /* 74 */ "Sex: Sextans", + /* 75 */ "Sge: Sagitta", + /* 76 */ "Sgr: Sagittarius", + /* 77 */ "Tau: Taurus", + /* 78 */ "Tel: Telescopium", + /* 79 */ "TrA: Triangulum Australe", + /* 80 */ "Tri: Triangulum", + /* 81 */ "Tuc: Tucana", + /* 82 */ "UMa: Ursa Major", + /* 83 */ "UMi: Ursa Minor", + /* 84 */ "Vel: Vela", + /* 85 */ "Vir: Virgo", + /* 86 */ "Vol: Volans", + /* 87 */ "Vul: Vulpecula", + /* 88 */ "Se2: Serpens Cauda", +}; + +static struct { + unsigned short lower_ra; /* hours * 1800 */ + unsigned short upper_ra; /* hours * 1800 */ + short lower_dec; /* degrees * 60 */ + short index; +} cbound[ NBOUNDS ] = { + { 0, 43200, 5280, UMi }, + { 14400, 26100, 5190, UMi }, + { 37800, 41400, 5170, UMi }, + { 32400, 37800, 5160, UMi }, + { 0, 14400, 5100, Cep }, + { 16500, 19200, 4920, Cam }, + { 0, 9000, 4800, Cep }, + { 19200, 26100, 4800, Cam }, + { 31500, 32400, 4800, UMi }, + { 36300, 37800, 4800, Dra }, + { 0, 6315, 4620, Cep }, + { 20700, 24450, 4620, Cam }, + { 29760, 31500, 4500, UMi }, + { 36300, 37200, 4500, Cep }, + { 14340, 16500, 4410, Cam }, + { 16500, 20400, 4410, Dra }, + { 23400, 29760, 4200, UMi }, + { 5580, 6150, 4080, Cas }, + { 36750, 37200, 4020, Dra }, + { 20400, 21600, 3990, Dra }, + { 0, 600, 3960, Cep }, + { 25200, 28200, 3960, UMi }, + { 42450, 43200, 3960, Cep }, + { 21600, 24300, 3840, Dra }, + { 24300, 25950, 3780, Dra }, + { 41700, 42450, 3780, Cep }, + { 10980, 12600, 3720, Cam }, + { 36000, 36750, 3690, Dra }, + { 36966, 37080, 3655, Cep }, + { 12600, 14340, 3600, Cam }, + { 14340, 15150, 3600, UMa }, + { 35580, 36000, 3570, Dra }, + { 36000, 36966, 3570, Cep }, + { 41160, 41700, 3545, Cep }, + { 0, 4380, 3510, Cas }, + { 34950, 35580, 3480, Dra }, + { 3060, 3435, 3450, Cas }, + { 4380, 5580, 3420, Cas }, + { 5580, 5700, 3420, Cam }, + { 40170, 41160, 3375, Cep }, + { 9000, 10980, 3360, Cam }, + { 25260, 25950, 3330, UMa }, + { 25950, 34950, 3330, Dra }, + { 5700, 6000, 3300, Cam }, + { 39840, 40170, 3300, Cep }, + { 37080, 39540, 3290, Cep }, + { 0, 3060, 3240, Cas }, + { 10980, 11700, 3240, Lyn }, + { 21750, 24300, 3180, UMa }, + { 27450, 28350, 3180, Dra }, + { 39540, 39840, 3165, Cep }, + { 6000, 9000, 3150, Cam }, + { 41160, 42000, 3150, Cas }, + { 28350, 30600, 3090, Dra }, + { 3675, 4530, 3030, Per }, + { 30600, 32820, 3030, Dra }, + { 0, 2460, 3000, Cas }, + { 2460, 3000, 3000, Per }, + { 11700, 12240, 3000, Lyn }, + { 42000, 43200, 3000, Cas }, + { 24300, 25260, 2910, UMa }, + { 0, 2010, 2880, Cas }, + { 42450, 43200, 2880, Cas }, + { 32715, 32820, 2850, Her }, + { 32820, 34350, 2850, Dra }, + { 34350, 34500, 2850, Cyg }, + { 3000, 3675, 2820, Per }, + { 15150, 16500, 2820, UMa }, + { 300, 1560, 2760, Cas }, + { 21600, 21750, 2700, UMa }, + { 12240, 13260, 2670, Lyn }, + { 39435, 39540, 2640, Cyg }, + { 39375, 39435, 2625, Cyg }, + { 34500, 34920, 2610, Cyg }, + { 16500, 18300, 2520, UMa }, + { 18300, 19410, 2400, UMa }, + { 27780, 28350, 2400, Boo }, + { 28350, 29400, 2400, Her }, + { 16650, 17250, 2385, Lyn }, + { 0, 4530, 2205, And }, + { 4530, 4620, 2205, Per }, + { 34845, 34920, 2190, Lyr }, + { 8100, 8445, 2160, Per }, + { 39120, 39375, 2160, Cyg }, + { 39375, 39600, 2160, Lac }, + { 11760, 13260, 2130, Aur }, + { 13260, 13950, 2130, Lyn }, + { 0, 3600, 2100, And }, + { 39600, 41070, 2100, Lac }, + { 41070, 41160, 2070, Lac }, + { 41160, 42300, 2070, And }, + { 4620, 4890, 2040, Per }, + { 19410, 19800, 2040, UMa }, + { 21600, 22200, 2040, CVn }, + { 13950, 16650, 2010, Lyn }, + { 16650, 17790, 2010, LMi }, + { 1290, 2535, 1980, And }, + { 27330, 27780, 1980, Boo }, + { 42300, 42750, 1925, And }, + { 22200, 23850, 1920, CVn }, + { 42750, 43200, 1880, And }, + { 25125, 25260, 1845, CVn }, + { 4350, 4890, 1840, Tri }, + { 4890, 8100, 1840, Per }, + { 8100, 8550, 1800, Aur }, + { 32715, 34845, 1800, Lyr }, + { 19800, 21600, 1740, UMa }, + { 35400, 37650, 1740, Cyg }, + { 8550, 10590, 1710, Aur }, + { 17790, 18900, 1710, LMi }, + { 23850, 25125, 1710, CVn }, + { 0, 120, 1680, And }, + { 2535, 3000, 1680, Tri }, + { 10590, 11760, 1680, Aur }, + { 14190, 14400, 1680, Gem }, + { 37650, 39120, 1680, Cyg }, + { 34665, 35400, 1650, Cyg }, + { 3450, 4350, 1635, Tri }, + { 29100, 29400, 1620, CrB }, + { 27150, 27330, 1560, Boo }, + { 27330, 29100, 1560, CrB }, + { 33060, 33960, 1560, Lyr }, + { 19350, 19800, 1530, LMi }, + { 33960, 34665, 1530, Lyr }, + { 3000, 3450, 1500, Tri }, + { 1290, 1530, 1425, Psc }, + { 18900, 19350, 1410, LMi }, + { 38250, 38550, 1410, Vul }, + { 10260, 10590, 1370, Tau }, + { 120, 255, 1320, And }, + { 28650, 28860, 1320, Se1 }, + { 10590, 11190, 1290, Gem }, + { 35700, 36450, 1275, Vul }, + { 33960, 34650, 1265, Vul }, + { 255, 1530, 1260, And }, + { 36450, 37020, 1230, Vul }, + { 14055, 14190, 1200, Gem }, + { 37020, 38250, 1170, Vul }, + { 34650, 35700, 1150, Vul }, + { 5910, 6060, 1140, Ari }, + { 33960, 34200, 1110, Sge }, + { 10260, 10380, 1080, Ori }, + { 11190, 11355, 1050, Gem }, + { 34200, 35700, 970, Sge }, + { 8940, 9600, 960, Tau }, + { 28650, 28950, 960, Her }, + { 35700, 36450, 945, Sge }, + { 8310, 8940, 930, Tau }, + { 9600, 10080, 930, Tau }, + { 23100, 24300, 900, Com }, + { 31050, 32850, 860, Her }, + { 21360, 23100, 840, Com }, + { 13500, 14055, 810, Gem }, + { 30150, 31050, 770, Her }, + { 0, 255, 750, Peg }, + { 10080, 10380, 750, Tau }, + { 12600, 13500, 750, Gem }, + { 38010, 38400, 750, Peg }, + { 11355, 12480, 720, Gem }, + { 32850, 33960, 720, Her }, + { 37575, 37890, 710, Del }, + { 37890, 38010, 710, Peg }, + { 20730, 21360, 660, Leo }, + { 11235, 11355, 600, Ori }, + { 12480, 12600, 600, Gem }, + { 14055, 14265, 600, Cnc }, + { 42900, 43200, 600, Peg }, + { 3000, 5910, 595, Ari }, + { 36255, 36540, 510, Del }, + { 24300, 27150, 480, Boo }, + { 40950, 42900, 450, Peg }, + { 14265, 16650, 420, Cnc }, + { 16650, 19350, 420, Leo }, + { 32850, 33592, 375, Oph }, + { 33592, 33960, 375, Aql }, + { 37500, 37575, 360, Del }, + { 12600, 12630, 330, CMi }, + { 32850, 33165, 270, Se2 }, + { 28950, 30150, 240, Her }, + { 32850, 33165, 180, Oph }, + { 38640, 39000, 165, Peg }, + { 0, 3600, 120, Psc }, + { 33450, 33960, 120, Se2 }, + { 36540, 37500, 120, Del }, + { 37500, 38400, 120, Equ }, + { 38400, 38640, 120, Peg }, + { 39600, 40950, 120, Peg }, + { 39000, 39600, 105, Peg }, + { 12630, 12960, 90, CMi }, + { 6450, 8310, 0, Tau }, + { 8310, 8400, 0, Ori }, + { 12960, 14550, 0, CMi }, + { 26400, 27150, 0, Vir }, + { 32100, 32850, 0, Oph }, + { 4770, 5910, -105, Cet }, + { 5910, 6450, -105, Tau }, + { 27150, 29280, -195, Se1 }, + { 8400, 9150, -240, Ori }, + { 10500, 11235, -240, Ori }, + { 32100, 32340, -240, Se2 }, + { 32850, 33450, -240, Se2 }, + { 33450, 33960, -240, Aql }, + { 40950, 42900, -240, Psc }, + { 19350, 20730, -360, Leo }, + { 20730, 21300, -360, Vir }, + { 0, 600, -420, Psc }, + { 42900, 43200, -420, Psc }, + { 25650, 26400, -480, Vir }, + { 28650, 29280, -480, Oph }, + { 36000, 36960, -540, Aql }, + { 38400, 39360, -540, Aqr }, + { 30900, 32340, -600, Oph }, + { 10500, 14550, -660, Mon }, + { 8850, 9150, -660, Eri }, + { 9150, 10500, -660, Ori }, + { 14550, 15060, -660, Hya }, + { 17250, 19350, -660, Sex }, + { 21300, 23100, -660, Vir }, + { 31650, 31800, -700, Oph }, + { 33960, 36000, -722, Aql }, + { 8700, 8850, -870, Eri }, + { 36960, 38400, -900, Aqr }, + { 30900, 32850, -960, Se2 }, + { 32850, 33960, -960, Sct }, + { 15060, 15450, -1020, Hya }, + { 29280, 29475, -1095, Oph }, + { 15450, 16350, -1140, Hya }, + { 19350, 19500, -1140, Crt }, + { 29280, 29475, -1155, Sco }, + { 28200, 28650, -1200, Lib }, + { 22650, 23100, -1320, Crv }, + { 23100, 25650, -1320, Vir }, + { 16350, 17550, -1440, Hya }, + { 3000, 4770, -1463, Cet }, + { 4770, 6750, -1463, Eri }, + { 19500, 21300, -1470, Crt }, + { 21300, 22650, -1470, Crv }, + { 25650, 26850, -1470, Lib }, + { 29280, 30150, -1475, Oph }, + { 0, 3000, -1530, Cet }, + { 38400, 39360, -1530, Cap }, + { 39360, 42900, -1530, Aqr }, + { 42900, 43200, -1530, Cet }, + { 17550, 18450, -1590, Hya }, + { 8460, 8700, -1635, Eri }, + { 8700, 11010, -1635, Lep }, + { 36000, 38400, -1680, Cap }, + { 18450, 19050, -1750, Hya }, + { 22650, 26850, -1770, Hya }, + { 26850, 28200, -1770, Lib }, + { 28200, 28800, -1770, Sco }, + { 8250, 8460, -1800, Eri }, + { 30150, 31680, -1800, Oph }, + { 31680, 32100, -1800, Sgr }, + { 19050, 19500, -1870, Hya }, + { 11010, 13260, -1980, CMa }, + { 22050, 22650, -1980, Hya }, + { 19500, 22050, -2100, Hya }, + { 6300, 6750, -2160, For }, + { 15060, 16860, -2205, Pyx }, + { 7680, 8250, -2220, Eri }, + { 32100, 34500, -2220, Sgr }, + { 38400, 41400, -2220, PsA }, + { 41400, 42000, -2220, Scl }, + { 5400, 6300, -2375, For }, + { 16860, 19800, -2385, Ant }, + { 0, 3000, -2400, Scl }, + { 3000, 5400, -2400, For }, + { 6960, 7680, -2400, Eri }, + { 42000, 43200, -2400, Scl }, + { 25500, 26850, -2520, Cen }, + { 28200, 28800, -2520, Lup }, + { 28800, 29557, -2520, Sco }, + { 8700, 9000, -2580, Cae }, + { 9000, 11850, -2580, Col }, + { 14400, 15060, -2580, Pup }, + { 6150, 6960, -2640, Eri }, + { 29557, 32100, -2730, Sco }, + { 32100, 34500, -2730, CrA }, + { 34500, 36600, -2730, Sgr }, + { 36600, 38400, -2730, Mic }, + { 5400, 6150, -2760, Eri }, + { 8100, 8700, -2790, Cae }, + { 27600, 28200, -2880, Lup }, + { 0, 4200, -2890, Phe }, + { 4800, 5400, -2940, Eri }, + { 7350, 7680, -2940, Hor }, + { 7680, 8100, -2940, Cae }, + { 38400, 39600, -3000, Gru }, + { 10800, 14400, -3045, Pup }, + { 14400, 14700, -3045, Vel }, + { 4350, 4800, -3060, Eri }, + { 6900, 7350, -3060, Hor }, + { 0, 3300, -3090, Phe }, + { 10800, 11100, -3150, Car }, + { 14700, 15210, -3180, Vel }, + { 6300, 6900, -3190, Hor }, + { 6900, 7200, -3190, Dor }, + { 0, 2850, -3210, Phe }, + { 3900, 4350, -3240, Eri }, + { 8100, 9000, -3240, Pic }, + { 27090, 27600, -3240, Lup }, + { 15210, 15900, -3270, Vel }, + { 11100, 11700, -3300, Car }, + { 21300, 23100, -3300, Cen }, + { 25500, 27090, -3300, Lup }, + { 27090, 27600, -3300, Nor }, + { 7200, 7800, -3390, Dor }, + { 15900, 19800, -3390, Vel }, + { 19800, 20250, -3390, Cen }, + { 31500, 32400, -3420, Ara }, + { 32400, 36600, -3420, Tel }, + { 39600, 42000, -3420, Gru }, + { 5760, 6300, -3450, Hor }, + { 9000, 9900, -3450, Pic }, + { 11700, 12300, -3480, Car }, + { 0, 2400, -3510, Phe }, + { 2400, 3900, -3510, Eri }, + { 42000, 43200, -3510, Phe }, + { 7800, 8250, -3540, Dor }, + { 27600, 29557, -3600, Nor }, + { 36600, 38400, -3600, Ind }, + { 9900, 10800, -3660, Pic }, + { 27300, 27600, -3660, Cir }, + { 29557, 29850, -3660, Ara }, + { 26850, 27300, -3815, Cir }, + { 29850, 30150, -3815, Ara }, + { 10800, 12300, -3840, Pic }, + { 12300, 16260, -3840, Car }, + { 20250, 21300, -3840, Cen }, + { 21300, 23100, -3840, Cru }, + { 23100, 26160, -3840, Cen }, + { 24300, 24600, -3900, Cir }, + { 30150, 30300, -3900, Ara }, + { 3900, 5760, -4050, Hor }, + { 5760, 8250, -4050, Ret }, + { 26550, 26850, -4050, Cir }, + { 30300, 31500, -4050, Ara }, + { 31500, 32400, -4050, Pav }, + { 39600, 42000, -4050, Tuc }, + { 8250, 11850, -4200, Dor }, + { 24600, 26550, -4200, Cir }, + { 26550, 30600, -4200, TrA }, + { 0, 2400, -4500, Tuc }, + { 6300, 8250, -4500, Hyi }, + { 11850, 16260, -4500, Vol }, + { 16260, 20250, -4500, Car }, + { 20250, 24600, -4500, Mus }, + { 32400, 38400, -4500, Pav }, + { 38400, 42000, -4500, Ind }, + { 42000, 43200, -4500, Tuc }, + { 1350, 2400, -4560, Tuc }, + { 0, 6300, -4950, Hyi }, + { 13800, 24600, -4950, Cha }, + { 24600, 32400, -4950, Aps }, + { 6300, 13800, -5100, Men }, + { 0, 43200, -5400, Oct } +}; + +static short start[] = { + 355, 352, 343, 340, 332, 320, + 303, 288, 277, 266, 257, 251, + 239, 229, 221, 211, 203, 189, + 177, 163, 149, 136, 124, 104, + 87, 75, 69, 54, 43, 29, + 23, 16, 12, 6, 4, 0, 0 +}; + + +/* +====================================================================== +constellation_pick() + +Do a constellation pick from RA and Dec. + +INPUTS + r right ascension, radians + d declination, radians + e epoch to which r and d precessed, as an mjd + +RESULTS + Returns an index for the constellation region that the coordinates + belong to, or -1 if no constellation pick can be found. + +The constellation is identified by linear search. We look for a +member of cbound[] whose lower_dec is less than the declination of the +pick point and whose lower_ra and upper_ra bracket the pick point's +right ascension. The data for that cbound[] member describes a sub- +region belonging to the picked constellation. + +In geometric terms, the search amounts to starting at the north pole +and traveling south on a line of constant right ascension through the +pick point. At every declination where a cbound[] member lives, we +wake up, and if (1) the pick point is now behind us, and (2) the +cbound[] segment is crossing our path, we know we've hit the edge of +a constellation subregion that the pick point belongs to. + +The cbound[] right ascension and declination values are scaled into +integers; this conserves storage and makes comparisons faster. The +start[] array, which gives starting points in cbound[] for different +declinations in 5-degree increments, further speeds the search by +skipping early parts of the list for which we know the search can't +succeed--geometrically, we start no more than 5 degrees north of the +pick point, rather than at the north pole. + +The data in cbound[] are for epoch 1875. +====================================================================== +*/ + +int +cns_pick(double r, double d, double e) +{ + double Mjd; + unsigned short ra; + short de, i; + + cal_mjd( 1, 1.0, 1875, &Mjd ); + precess( e, Mjd, &r, &d ); + ra = ( unsigned short )( radhr( r ) * 1800 ); + de = ( short )( raddeg( d ) * 60 ); + if (d < 0.0) --de; + + i = ( de + 5400 ) / 300; + if ( i < 0 || i > 36 ) return -1; + i = start[ i ]; + + for ( ; i < NBOUNDS; i++ ) + if ( cbound[ i ].lower_dec <= de && + cbound[ i ].upper_ra > ra && + cbound[ i ].lower_ra <= ra ) break; + + return ( i == NBOUNDS ) ? -1 : ( int ) cbound[ i ].index; +} + +/* given a constellation id (as from cns_pick()), return pointer to static + * storage containg its name in the form "AAA: Name". + * return "???: ???" if id is invalid. + */ +char * +cns_name (int id) +{ + if (id < 0 || id >= NCNS) + return ("???: ???"); + return (cns_namemap[id]); +} + +/* return cns_namemap index matching first three chars in abbrev[], else -1. + */ +int +cns_id (char *abbrev) +{ + int i; + + for (i = 0; i < NCNS; i++) + if (strncmp (abbrev, cns_namemap[i], 3) == 0) + return (i); + return (-1); +} + +/* edges of constant ra */ +static struct { + unsigned short ra; /* hours * 1800 */ + short dec0, dec1; /* degrees * 60 */ +} ra_edges[] = { + { 0, -4950, -4500 }, + { 0, 600, 750 }, + { 0, 1680, 1879 }, + { 120, 1320, 1680 }, + { 255, 750, 1260 }, + { 255, 1260, 1320 }, + { 300, 2760, 2880 }, + { 599, -420, 0 }, + { 599, 0, 120 }, + { 599, 3960, 4620 }, + { 1290, 1425, 1980 }, + { 1350, -4500, -4560 }, + { 1530, 1260, 1425 }, + { 1560, 2760, 2880 }, + { 2010, 2880, 3000 }, + { 2399, -4560, -3510 }, + { 2399, -3510, -3210 }, + { 2460, 3000, 3240 }, + { 2534, 1680, 1980 }, + { 2534, 1980, 2100 }, + { 2849, -3210, -3090 }, + { 3000, -2400, -1530 }, + { 3000, -1530, -1462 }, + { 3000, 595, 1500 }, + { 3000, 1500, 1680 }, + { 3000, 2820, 3000 }, + { 3060, 3240, 3450 }, + { 3299, -3090, -2890 }, + { 3434, 3450, 3510 }, + { 3450, 1500, 1635 }, + { 3600, 120, 595 }, + { 3600, 2100, 2205 }, + { 3675, 2820, 3030 }, + { 3900, -4050, -3510 }, + { 3900, -3510, -3240 }, + { 4199, -2890, -2400 }, + { 4350, -3240, -3060 }, + { 4350, 1635, 1840 }, + { 4379, 3420, 3510 }, + { 4530, 2205, 3030 }, + { 4620, 2040, 2205 }, + { 4770, -1462, -105 }, + { 4800, -3060, -2940 }, + { 4890, 1840, 2040 }, + { 5400, -2940, -2760 }, + { 5400, -2400, -2374 }, + { 5580, 3420, 4080 }, + { 5700, 3300, 3420 }, + { 5760, -3450, -4050 }, + { 5909, -105, 0 }, + { 5909, 0, 595 }, + { 5909, 595, 1140 }, + { 5999, 3150, 3300 }, + { 6060, 1140, 1840 }, + { 6150, -2760, -2640 }, + { 6150, 4080, 4620 }, + { 6300, -5100, -4950 }, + { 6300, -4950, -4500 }, + { 6300, -3190, -3450 }, + { 6300, -2374, -2160 }, + { 6314, 4620, 4800 }, + { 6449, -105, 0 }, + { 6750, -2160, -1462 }, + { 6899, -3060, -3190 }, + { 6960, -2640, -2400 }, + { 7200, -3390, -3190 }, + { 7349, -2940, -3060 }, + { 7680, -2400, -2940 }, + { 7680, -2220, -2400 }, + { 7799, -3540, -3390 }, + { 8100, -3240, -2940 }, + { 8100, -2940, -2790 }, + { 8100, 1800, 1840 }, + { 8100, 1840, 2160 }, + { 8249, -4500, -4200 }, + { 8249, -4050, -4200 }, + { 8249, -4050, -3540 }, + { 8249, -1800, -2220 }, + { 8310, 0, 930 }, + { 8400, -240, 0 }, + { 8445, 2160, 3150 }, + { 8460, -1635, -1800 }, + { 8550, 1710, 1800 }, + { 8699, -2790, -2580 }, + { 8699, -870, -1635 }, + { 8850, -660, -870 }, + { 8940, 930, 960 }, + { 9000, -3450, -3240 }, + { 9000, -2580, -1635 }, + { 9000, 3150, 3360 }, + { 9000, 4800, 5100 }, + { 9149, -660, -240 }, + { 9599, 930, 960 }, + { 9900, -3660, -3450 }, + { 10080, 750, 930 }, + { 10260, 1080, 1369 }, + { 10380, 750, 1080 }, + { 10499, -660, -240 }, + { 10589, 1290, 1369 }, + { 10589, 1369, 1680 }, + { 10589, 1680, 1710 }, + { 10800, -3840, -3660 }, + { 10800, -3150, -3045 }, + { 10800, -3045, -2580 }, + { 10980, 3240, 3360 }, + { 10980, 3360, 3720 }, + { 11010, -1980, -1635 }, + { 11010, -1635, -660 }, + { 11100, -3300, -3150 }, + { 11190, 1050, 1290 }, + { 11235, -240, 0 }, + { 11235, 0, 600 }, + { 11354, 600, 720 }, + { 11354, 720, 1050 }, + { 11700, -3480, -3300 }, + { 11700, 3000, 3240 }, + { 11759, 1680, 2130 }, + { 11849, -4200, -4500 }, + { 11849, -4200, -3840 }, + { 11849, -1980, -2580 }, + { 12240, 2670, 3000 }, + { 12299, -3840, -3480 }, + { 12479, 600, 720 }, + { 12600, 330, 600 }, + { 12600, 600, 750 }, + { 12600, 3600, 3720 }, + { 12630, 90, 330 }, + { 12960, 0, 90 }, + { 13260, -660, -1980 }, + { 13260, 2130, 2670 }, + { 13500, 750, 810 }, + { 13800, -5100, -4950 }, + { 13800, -4500, -4950 }, + { 13950, 2010, 2130 }, + { 14054, 600, 810 }, + { 14054, 810, 1200 }, + { 14189, 1200, 1680 }, + { 14265, 420, 600 }, + { 14340, 3600, 4410 }, + { 14400, -3045, -2580 }, + { 14400, 1680, 2010 }, + { 14400, 5100, 5190 }, + { 14400, 5280, 5190 }, + { 14549, -660, 0 }, + { 14549, 0, 420 }, + { 14700, -3180, -3045 }, + { 15060, -2580, -2205 }, + { 15060, -2205, -1020 }, + { 15060, -1020, -660 }, + { 15150, 2820, 3600 }, + { 15209, -3270, -3180 }, + { 15449, -1140, -1020 }, + { 15899, -3390, -3270 }, + { 16259, -4500, -3840 }, + { 16349, -1440, -1140 }, + { 16500, 2520, 2820 }, + { 16500, 4410, 4920 }, + { 16650, 420, 2010 }, + { 16650, 2010, 2385 }, + { 16860, -2385, -2205 }, + { 16860, -1440, -2205 }, + { 17249, -660, 0 }, + { 17249, 0, 420 }, + { 17249, 2385, 2520 }, + { 17550, -1590, -1440 }, + { 17789, 1710, 2010 }, + { 18300, 2400, 2520 }, + { 18450, -1750, -1590 }, + { 18900, 1410, 1710 }, + { 19049, -1870, -1750 }, + { 19200, 4800, 4920 }, + { 19350, -660, -1140 }, + { 19350, -360, -660 }, + { 19350, -360, 0 }, + { 19350, 0, 420 }, + { 19350, 1410, 1530 }, + { 19409, 2040, 2400 }, + { 19499, -2100, -1870 }, + { 19499, -1140, -1470 }, + { 19800, -3390, -2385 }, + { 19800, -2385, -2100 }, + { 19800, 1530, 1740 }, + { 19800, 1740, 2040 }, + { 20250, -4500, -3840 }, + { 20250, -3840, -3390 }, + { 20399, 3990, 4410 }, + { 20700, 4620, 4800 }, + { 20730, -360, 0 }, + { 20730, 0, 660 }, + { 21299, -3840, -3300 }, + { 21299, -1470, -660 }, + { 21299, -660, -360 }, + { 21360, 660, 840 }, + { 21360, 840, 1740 }, + { 21600, 1740, 2040 }, + { 21600, 2040, 2700 }, + { 21600, 3840, 3990 }, + { 21749, 2700, 3180 }, + { 22050, -1980, -2100 }, + { 22199, 1920, 2040 }, + { 22649, -1770, -1980 }, + { 22649, -1470, -1320 }, + { 23099, -3840, -3300 }, + { 23099, -1320, -660 }, + { 23099, 840, 900 }, + { 23400, 4620, 4200 }, + { 23850, 1710, 1920 }, + { 24300, -3900, -3840 }, + { 24300, 480, 900 }, + { 24300, 900, 1710 }, + { 24300, 2910, 3180 }, + { 24300, 3780, 3840 }, + { 24449, 4800, 4620 }, + { 24600, -4950, -4500 }, + { 24600, -4500, -4200 }, + { 24600, -4200, -3900 }, + { 25124, 1710, 1845 }, + { 25200, 4200, 3960 }, + { 25259, 1845, 2910 }, + { 25259, 2910, 3330 }, + { 25500, -3300, -2520 }, + { 25650, -1320, -1470 }, + { 25650, -480, -1320 }, + { 25950, 3330, 3780 }, + { 26100, 5190, 4800 }, + { 26159, -3840, -3300 }, + { 26400, 0, -480 }, + { 26550, -4200, -4050 }, + { 26850, -4050, -3814 }, + { 26850, -2520, -1770 }, + { 26850, -1470, -1770 }, + { 27090, -3300, -3240 }, + { 27149, -195, 0 }, + { 27149, 0, 480 }, + { 27149, 480, 1560 }, + { 27300, -3814, -3660 }, + { 27329, 1560, 1980 }, + { 27450, 3180, 3330 }, + { 27599, -3660, -3600 }, + { 27599, -3600, -3300 }, + { 27599, -3240, -2880 }, + { 27779, 1980, 2400 }, + { 28200, -2880, -2520 }, + { 28200, -1770, -1200 }, + { 28200, 3960, 4200 }, + { 28350, 2400, 3090 }, + { 28350, 3090, 3180 }, + { 28650, -1200, -480 }, + { 28650, -480, -195 }, + { 28650, 960, 1320 }, + { 28800, -2520, -1770 }, + { 28859, 1320, 1560 }, + { 28949, 240, 960 }, + { 29100, 1560, 1620 }, + { 29280, -1474, -1155 }, + { 29280, -1095, -480 }, + { 29280, -195, 0 }, + { 29280, 0, 240 }, + { 29399, 1620, 2400 }, + { 29475, -1155, -1095 }, + { 29557, -3660, -3600 }, + { 29557, -3600, -2730 }, + { 29557, -2730, -2520 }, + { 29759, 4200, 4500 }, + { 29849, -3814, -3660 }, + { 30150, -3900, -3814 }, + { 30150, -1800, -1474 }, + { 30150, 240, 769 }, + { 30299, -4050, -3900 }, + { 30600, -4050, -4200 }, + { 30600, 3030, 3090 }, + { 30900, -960, -600 }, + { 31050, 769, 859 }, + { 31500, -3420, -4050 }, + { 31500, 4500, 4800 }, + { 31649, -700, -600 }, + { 31680, -960, -1800 }, + { 31800, -700, -600 }, + { 32099, -2730, -2220 }, + { 32099, -1800, -2220 }, + { 32099, -240, 0 }, + { 32340, -600, -240 }, + { 32400, -4950, -4500 }, + { 32400, -4500, -4050 }, + { 32400, -2730, -3420 }, + { 32400, 4800, 5160 }, + { 32715, 1800, 2850 }, + { 32819, 2850, 3030 }, + { 32850, -240, -960 }, + { 32850, 0, 180 }, + { 32850, 270, 375 }, + { 32850, 720, 859 }, + { 33060, 1560, 1800 }, + { 33165, 180, 270 }, + { 33449, -240, 0 }, + { 33449, 0, 120 }, + { 33591, 375, 720 }, + { 33960, -960, -721 }, + { 33960, -721, -240 }, + { 33960, 120, 375 }, + { 33960, 720, 1110 }, + { 33960, 1110, 1264 }, + { 33960, 1264, 1530 }, + { 33960, 1530, 1560 }, + { 34200, 970, 1110 }, + { 34349, 2850, 3330 }, + { 34500, -2220, -2730 }, + { 34500, 2610, 2850 }, + { 34650, 1150, 1264 }, + { 34664, 1530, 1650 }, + { 34664, 1650, 1800 }, + { 34844, 1800, 2190 }, + { 34920, 2190, 2610 }, + { 34950, 3330, 3480 }, + { 35400, 1650, 1740 }, + { 35580, 3480, 3570 }, + { 35699, 945, 970 }, + { 35699, 1150, 1275 }, + { 36000, -1680, -721 }, + { 36000, -540, -721 }, + { 36000, 3570, 3690 }, + { 36255, 510, 945 }, + { 36300, 4500, 4800 }, + { 36450, 945, 1230 }, + { 36450, 1230, 1275 }, + { 36540, 120, 510 }, + { 36599, -3600, -3420 }, + { 36599, -3420, -2730 }, + { 36599, -2730, -1680 }, + { 36750, 3690, 4020 }, + { 36959, -900, -540 }, + { 36959, -540, 0 }, + { 36959, 0, 120 }, + { 36966, 3570, 3655 }, + { 37020, 1170, 1230 }, + { 37080, 3289, 3655 }, + { 37200, 4020, 4500 }, + { 37499, 120, 360 }, + { 37575, 360, 709 }, + { 37650, 1680, 1740 }, + { 37800, 4800, 5160 }, + { 37800, 5160, 5169 }, + { 37890, 709, 1170 }, + { 38010, 709, 750 }, + { 38250, 1170, 1410 }, + { 38399, -4500, -3600 }, + { 38399, -3000, -2730 }, + { 38399, -2220, -2730 }, + { 38399, -1680, -2220 }, + { 38399, -1680, -1530 }, + { 38399, -540, -900 }, + { 38399, 120, 750 }, + { 38550, 1410, 1680 }, + { 38640, 120, 165 }, + { 39000, 105, 165 }, + { 39119, 1680, 2160 }, + { 39360, -1530, -540 }, + { 39375, 2160, 2625 }, + { 39434, 2625, 2640 }, + { 39540, 2640, 3165 }, + { 39540, 3165, 3289 }, + { 39600, -4050, -3420 }, + { 39600, -3420, -3000 }, + { 39600, 105, 120 }, + { 39600, 2100, 2160 }, + { 39839, 3165, 3300 }, + { 40170, 3300, 3375 }, + { 40950, -240, 0 }, + { 40950, 0, 120 }, + { 40950, 120, 450 }, + { 41070, 2070, 2100 }, + { 41160, 2070, 3150 }, + { 41160, 3150, 3375 }, + { 41160, 3375, 3544 }, + { 41400, -2220, -1530 }, + { 41400, 5169, 5280 }, + { 41700, 3544, 3780 }, + { 41999, -4500, -4050 }, + { 41999, -3510, -3420 }, + { 41999, -3420, -2400 }, + { 41999, -2400, -2220 }, + { 41999, 3000, 3150 }, + { 42300, 1924, 2070 }, + { 42449, 2880, 3000 }, + { 42449, 3780, 3960 }, + { 42750, 1879, 1924 }, + { 42899, -1530, -420 }, + { 42899, -420, -240 }, + { 42899, 450, 600 }, +}; + +#define NRA ((int)(sizeof(ra_edges)/sizeof(ra_edges[0]))) + +/* edges of constant dec */ +static struct { + short dec; /* degrees * 60 */ + unsigned short ra0, ra1; /* hours * 1800 */ +} dec_edges[] = { + { -5100, 6300, 13800 }, + { -4950, 0, 6300 }, + { -4950, 13800, 24600 }, + { -4950, 24600, 32400 }, + { -4560, 1350, 2399 }, + { -4500, 0, 1350 }, + { -4500, 6300, 8249 }, + { -4500, 11849, 13800 }, + { -4500, 13800, 16259 }, + { -4500, 16259, 20250 }, + { -4500, 20250, 24600 }, + { -4500, 32400, 38399 }, + { -4500, 38399, 41999 }, + { -4500, 41999, 0 }, + { -4200, 8249, 11849 }, + { -4200, 24600, 26550 }, + { -4200, 30600, 26550 }, + { -4050, 3900, 5760 }, + { -4050, 5760, 8249 }, + { -4050, 26550, 26850 }, + { -4050, 30299, 30600 }, + { -4050, 31500, 30600 }, + { -4050, 31500, 32400 }, + { -4050, 39600, 41999 }, + { -3900, 24300, 24600 }, + { -3900, 30150, 30299 }, + { -3840, 10800, 11849 }, + { -3840, 11849, 12299 }, + { -3840, 12299, 16259 }, + { -3840, 20250, 21299 }, + { -3840, 21299, 23099 }, + { -3840, 23099, 24300 }, + { -3840, 24300, 26159 }, + { -3814, 26850, 27300 }, + { -3814, 29849, 30150 }, + { -3660, 9900, 10800 }, + { -3660, 27300, 27599 }, + { -3660, 29557, 29849 }, + { -3600, 27599, 29557 }, + { -3600, 36599, 38399 }, + { -3540, 7799, 8249 }, + { -3510, 2399, 3900 }, + { -3510, 2399, 41999 }, + { -3510, 3900, 2399 }, + { -3510, 41999, 2399 }, + { -3480, 11700, 12299 }, + { -3450, 6300, 5760 }, + { -3450, 9000, 9900 }, + { -3420, 32400, 31500 }, + { -3420, 32400, 36599 }, + { -3420, 39600, 41999 }, + { -3390, 7200, 7799 }, + { -3390, 15899, 19800 }, + { -3390, 19800, 20250 }, + { -3300, 11100, 11700 }, + { -3300, 21299, 23099 }, + { -3300, 25500, 26159 }, + { -3300, 26159, 27090 }, + { -3300, 27090, 27599 }, + { -3270, 15209, 15899 }, + { -3240, 3900, 4350 }, + { -3240, 8100, 9000 }, + { -3240, 27090, 27599 }, + { -3210, 2399, 2849 }, + { -3190, 6899, 6300 }, + { -3190, 6899, 7200 }, + { -3180, 14700, 15209 }, + { -3150, 10800, 11100 }, + { -3090, 2849, 3299 }, + { -3060, 4350, 4800 }, + { -3060, 7349, 6899 }, + { -3045, 10800, 14400 }, + { -3045, 14400, 14700 }, + { -3000, 38399, 39600 }, + { -2940, 4800, 5400 }, + { -2940, 7680, 7349 }, + { -2940, 7680, 8100 }, + { -2890, 3299, 4199 }, + { -2880, 27599, 28200 }, + { -2790, 8100, 8699 }, + { -2760, 5400, 6150 }, + { -2730, 29557, 32099 }, + { -2730, 32099, 32400 }, + { -2730, 34500, 32400 }, + { -2730, 34500, 36599 }, + { -2730, 38399, 36599 }, + { -2640, 6150, 6960 }, + { -2580, 8699, 9000 }, + { -2580, 10800, 9000 }, + { -2580, 11849, 10800 }, + { -2580, 14400, 15060 }, + { -2520, 25500, 26850 }, + { -2520, 28200, 28800 }, + { -2520, 29557, 28800 }, + { -2400, 3000, 41999 }, + { -2400, 4199, 3000 }, + { -2400, 4199, 5400 }, + { -2400, 6960, 7680 }, + { -2385, 16860, 19800 }, + { -2374, 5400, 6300 }, + { -2220, 8249, 7680 }, + { -2220, 32099, 34500 }, + { -2220, 38399, 41400 }, + { -2220, 41999, 41400 }, + { -2205, 16860, 15060 }, + { -2160, 6300, 6750 }, + { -2100, 19800, 19499 }, + { -2100, 22050, 19800 }, + { -1980, 11010, 11849 }, + { -1980, 13260, 11849 }, + { -1980, 22649, 22050 }, + { -1870, 19499, 19049 }, + { -1800, 8460, 8249 }, + { -1800, 30150, 31680 }, + { -1800, 31680, 32099 }, + { -1770, 26850, 22649 }, + { -1770, 26850, 28200 }, + { -1770, 28800, 28200 }, + { -1750, 19049, 18450 }, + { -1680, 36000, 36599 }, + { -1680, 36599, 38399 }, + { -1635, 8699, 8460 }, + { -1635, 8699, 9000 }, + { -1635, 9000, 11010 }, + { -1590, 18450, 17550 }, + { -1530, 3000, 42899 }, + { -1530, 38399, 39360 }, + { -1530, 41400, 39360 }, + { -1530, 41400, 42899 }, + { -1530, 42899, 3000 }, + { -1530, 42899, 41400 }, + { -1474, 29280, 30150 }, + { -1470, 19499, 21299 }, + { -1470, 21299, 22649 }, + { -1470, 25650, 26850 }, + { -1462, 3000, 4770 }, + { -1462, 4770, 6750 }, + { -1440, 16349, 16860 }, + { -1440, 17550, 16860 }, + { -1320, 22649, 23099 }, + { -1320, 23099, 25650 }, + { -1200, 28200, 28650 }, + { -1155, 29280, 29475 }, + { -1140, 15449, 16349 }, + { -1140, 19350, 19499 }, + { -1095, 29280, 29475 }, + { -1020, 15060, 15449 }, + { -960, 30900, 31680 }, + { -960, 32850, 31680 }, + { -960, 32850, 33960 }, + { -900, 38399, 36959 }, + { -870, 8850, 8699 }, + { -721, 36000, 33960 }, + { -700, 31649, 31800 }, + { -660, 9149, 8850 }, + { -660, 10499, 9149 }, + { -660, 11010, 10499 }, + { -660, 11010, 13260 }, + { -660, 14549, 13260 }, + { -660, 15060, 14549 }, + { -660, 17249, 19350 }, + { -660, 23099, 21299 }, + { -600, 30900, 31649 }, + { -600, 31800, 32340 }, + { -540, 36959, 36000 }, + { -540, 39360, 38399 }, + { -480, 26400, 25650 }, + { -480, 28650, 29280 }, + { -420, 599, 42899 }, + { -360, 20730, 19350 }, + { -360, 21299, 20730 }, + { -240, 8400, 9149 }, + { -240, 10499, 11235 }, + { -240, 32099, 32340 }, + { -240, 33449, 32850 }, + { -240, 33960, 33449 }, + { -240, 40950, 42899 }, + { -195, 28650, 27149 }, + { -195, 28650, 29280 }, + { -105, 4770, 5909 }, + { -105, 5909, 6449 }, + { 0, 6449, 8310 }, + { 0, 8310, 8400 }, + { 0, 12960, 14549 }, + { 0, 27149, 26400 }, + { 0, 32099, 32850 }, + { 90, 12630, 12960 }, + { 105, 39000, 39600 }, + { 120, 599, 3600 }, + { 120, 33449, 33960 }, + { 120, 36540, 36959 }, + { 120, 36959, 37499 }, + { 120, 37499, 38399 }, + { 120, 38399, 38640 }, + { 120, 39600, 40950 }, + { 165, 38640, 39000 }, + { 180, 32850, 33165 }, + { 240, 28949, 29280 }, + { 240, 29280, 30150 }, + { 270, 33165, 32850 }, + { 330, 12600, 12630 }, + { 360, 37499, 37575 }, + { 375, 32850, 33591 }, + { 375, 33591, 33960 }, + { 420, 14265, 14549 }, + { 420, 14549, 16650 }, + { 420, 16650, 17249 }, + { 420, 17249, 19350 }, + { 450, 40950, 42899 }, + { 480, 24300, 27149 }, + { 510, 36255, 36540 }, + { 595, 3000, 3600 }, + { 595, 3600, 5909 }, + { 600, 0, 42899 }, + { 600, 11235, 11354 }, + { 600, 12479, 12600 }, + { 600, 14054, 14265 }, + { 600, 42899, 0 }, + { 660, 20730, 21360 }, + { 709, 37575, 37890 }, + { 709, 37890, 38010 }, + { 720, 11354, 12479 }, + { 720, 32850, 33591 }, + { 720, 33591, 33960 }, + { 750, 0, 255 }, + { 750, 10080, 10380 }, + { 750, 12600, 13500 }, + { 750, 38010, 38399 }, + { 769, 30150, 31050 }, + { 810, 13500, 14054 }, + { 840, 21360, 23099 }, + { 859, 31050, 32850 }, + { 900, 23099, 24300 }, + { 930, 8310, 8940 }, + { 930, 9599, 10080 }, + { 945, 35699, 36255 }, + { 945, 36255, 36450 }, + { 960, 8940, 9599 }, + { 960, 28650, 28949 }, + { 970, 34200, 35699 }, + { 1050, 11190, 11354 }, + { 1080, 10260, 10380 }, + { 1110, 33960, 34200 }, + { 1140, 5909, 6060 }, + { 1150, 34650, 35699 }, + { 1170, 37020, 37890 }, + { 1170, 37890, 38250 }, + { 1200, 14054, 14189 }, + { 1230, 36450, 37020 }, + { 1260, 255, 1530 }, + { 1264, 33960, 34650 }, + { 1275, 35699, 36450 }, + { 1290, 10589, 11190 }, + { 1320, 120, 255 }, + { 1320, 28650, 28859 }, + { 1369, 10260, 10589 }, + { 1410, 18900, 19350 }, + { 1410, 38250, 38550 }, + { 1425, 1290, 1530 }, + { 1500, 3000, 3450 }, + { 1530, 19350, 19800 }, + { 1530, 33960, 34664 }, + { 1560, 27149, 27329 }, + { 1560, 27329, 28859 }, + { 1560, 28859, 29100 }, + { 1560, 33060, 33960 }, + { 1620, 29100, 29399 }, + { 1635, 3450, 4350 }, + { 1650, 34664, 35400 }, + { 1680, 0, 120 }, + { 1680, 2534, 3000 }, + { 1680, 10589, 11759 }, + { 1680, 14189, 14400 }, + { 1680, 37650, 38550 }, + { 1680, 38550, 39119 }, + { 1710, 8550, 10589 }, + { 1710, 17789, 18900 }, + { 1710, 23850, 24300 }, + { 1710, 24300, 25124 }, + { 1740, 19800, 21360 }, + { 1740, 21360, 21600 }, + { 1740, 35400, 37650 }, + { 1800, 8100, 8550 }, + { 1800, 32715, 33060 }, + { 1800, 34664, 34844 }, + { 1840, 4350, 4890 }, + { 1840, 4890, 6060 }, + { 1840, 6060, 8100 }, + { 1845, 25124, 25259 }, + { 1879, 0, 42750 }, + { 1920, 22199, 23850 }, + { 1924, 42300, 42750 }, + { 1980, 1290, 2534 }, + { 1980, 27329, 27779 }, + { 2010, 13950, 14400 }, + { 2010, 14400, 16650 }, + { 2010, 16650, 17789 }, + { 2040, 4620, 4890 }, + { 2040, 19409, 19800 }, + { 2040, 21600, 22199 }, + { 2070, 41070, 41160 }, + { 2070, 41160, 42300 }, + { 2100, 2534, 3600 }, + { 2100, 39600, 41070 }, + { 2130, 11759, 13260 }, + { 2130, 13260, 13950 }, + { 2160, 8100, 8445 }, + { 2160, 39119, 39375 }, + { 2160, 39375, 39600 }, + { 2190, 34844, 34920 }, + { 2205, 3600, 4530 }, + { 2205, 4530, 4620 }, + { 2385, 16650, 17249 }, + { 2400, 18300, 19409 }, + { 2400, 27779, 28350 }, + { 2400, 28350, 29399 }, + { 2520, 16500, 17249 }, + { 2520, 17249, 18300 }, + { 2610, 34500, 34920 }, + { 2625, 39375, 39434 }, + { 2640, 39434, 39540 }, + { 2670, 12240, 13260 }, + { 2700, 21600, 21749 }, + { 2760, 300, 1560 }, + { 2820, 3000, 3675 }, + { 2820, 15150, 16500 }, + { 2850, 32715, 32819 }, + { 2850, 32819, 34349 }, + { 2850, 34349, 34500 }, + { 2880, 300, 42449 }, + { 2880, 1560, 2010 }, + { 2880, 42449, 300 }, + { 2910, 24300, 25259 }, + { 3000, 2010, 2460 }, + { 3000, 2460, 3000 }, + { 3000, 11700, 12240 }, + { 3000, 41999, 42449 }, + { 3030, 3675, 4530 }, + { 3030, 30600, 32819 }, + { 3090, 28350, 30600 }, + { 3150, 5999, 8445 }, + { 3150, 8445, 9000 }, + { 3150, 41160, 41999 }, + { 3165, 39540, 39839 }, + { 3180, 21749, 24300 }, + { 3180, 27450, 28350 }, + { 3240, 2460, 3060 }, + { 3240, 10980, 11700 }, + { 3289, 37080, 39540 }, + { 3300, 5700, 5999 }, + { 3300, 39839, 40170 }, + { 3330, 25259, 25950 }, + { 3330, 25950, 27450 }, + { 3330, 34349, 34950 }, + { 3360, 9000, 10980 }, + { 3375, 40170, 41160 }, + { 3420, 4379, 5580 }, + { 3420, 5580, 5700 }, + { 3450, 3060, 3434 }, + { 3480, 34950, 35580 }, + { 3510, 3434, 4379 }, + { 3544, 41160, 41700 }, + { 3570, 35580, 36000 }, + { 3570, 36000, 36966 }, + { 3600, 12600, 14340 }, + { 3600, 14340, 15150 }, + { 3655, 36966, 37080 }, + { 3690, 36000, 36750 }, + { 3720, 10980, 12600 }, + { 3780, 24300, 25950 }, + { 3780, 41700, 42449 }, + { 3840, 21600, 24300 }, + { 3960, 599, 42449 }, + { 3960, 25200, 28200 }, + { 3960, 42449, 599 }, + { 3990, 20399, 21600 }, + { 4020, 36750, 37200 }, + { 4080, 5580, 6150 }, + { 4200, 23400, 25200 }, + { 4200, 28200, 29759 }, + { 4410, 14340, 16500 }, + { 4410, 16500, 20399 }, + { 4500, 29759, 31500 }, + { 4500, 36300, 37200 }, + { 4620, 599, 6150 }, + { 4620, 6150, 6314 }, + { 4620, 20700, 23400 }, + { 4620, 24449, 23400 }, + { 4800, 6314, 9000 }, + { 4800, 19200, 20700 }, + { 4800, 26100, 24449 }, + { 4800, 31500, 32400 }, + { 4800, 36300, 37800 }, + { 4920, 16500, 19200 }, + { 5100, 9000, 14400 }, + { 5160, 32400, 37800 }, + { 5169, 37800, 41400 }, + { 5190, 14400, 26100 }, + { 5280, 6300, 14400 }, + { 5280, 41400, 6300 }, +}; + +#define NDEC ((int)(sizeof(dec_edges)/sizeof(dec_edges[0]))) + +/* given an epoch, give caller a list of all constellation edges. + * return count if ok, else -1. + * N.B. caller should *not* free what we return because we cache it here. + */ +int +cns_edges (double e, double **ra0p, double **dec0p, double **ra1p, +double **dec1p) +{ +#define NEDGES (NRA+NDEC) + static double *ra0, *dec0, *ra1, *dec1; + static double laste = -12345.6; /* any bogus value */ + double mjd0; + int i, n; + + /* if same epoch just return the same list */ + if (e == laste) { + *ra0p = ra0; + *dec0p = dec0; + *ra1p = ra1; + *dec1p = dec1; + return (NEDGES); + } + + /* get space for arrays, first time only */ + if (!ra0) { + ra0 = (double *)malloc (NEDGES * sizeof(double)); + if (!ra0) + return (-1); + dec0 = (double *)malloc (NEDGES * sizeof(double)); + if (!dec0) { + free ((void *)ra0); + return (-1); + } + ra1 = (double *)malloc (NEDGES * sizeof(double)); + if (!ra1) { + free ((void *)ra0); + free ((void *)dec0); + return (-1); + } + dec1 = (double *)malloc (NEDGES * sizeof(double)); + if (!dec1) { + free ((void *)ra0); + free ((void *)dec0); + free ((void *)ra1); + return (-1); + } + } + + /* prepare for precession from 1875 */ + cal_mjd (1, 1.0, 1875, &mjd0); + + /* build the constant-ra edge lists */ + n = 0; + for (i = 0; i < NRA; i++) { + ra0[n] = ra1[n] = hrrad((double)ra_edges[i].ra/1800.0); + dec0[n] = degrad((double)ra_edges[i].dec0/60.0); + dec1[n] = degrad((double)ra_edges[i].dec1/60.0); + precess (mjd0, e, &ra0[n], &dec0[n]); + precess (mjd0, e, &ra1[n], &dec1[n]); + n++; + } + + /* add the constant-dec edge lists */ + for (i = 0; i < NDEC; i++) { + ra0[n] = hrrad((double)dec_edges[i].ra0/1800.0); + ra1[n] = hrrad((double)dec_edges[i].ra1/1800.0); + dec0[n] = dec1[n] = degrad((double)dec_edges[i].dec/60.0); + precess (mjd0, e, &ra0[n], &dec0[n]); + precess (mjd0, e, &ra1[n], &dec1[n]); + n++; + } + + /* sanity check the count */ + if (n != NEDGES) { + printf ("cns_edges(): n=%d NEDGES=%ld\n", n, (long)NEDGES); + abort(); + } + + /* ok */ + *ra0p = ra0; + *dec0p = dec0; + *ra1p = ra1; + *dec1p = dec1; + laste = e; + return (NEDGES); +} + +/* given an ra, dec and epoch return the list of constellation ids which + * *may* fall within the given radius of said location. + * return the number of ids. + * ids[] need be no larger than 89. + */ +/* ARGSUSED */ +int +cns_list (double ra, double dec, double e, double rad, int ids[]) +{ + int i; + + /* TODO: this! */ + for (i = 0; i < NCNS; i++) + ids[i] = i; + return (NCNS); +} + +/* epoch 2000 RA/Dec of constellation figure end-points. + * drawcodes: 0=move to; 1=draw to; 2=draw to dashed; -1=end + */ +typedef struct { + int drawcode; /* draw code */ + float ra; /* rads */ + float dec; /* rads */ +} ConFig; + +/* array of malloced lists of ConFigs, same order as cns_namemap[] + */ +static ConFig *figmap[NCNS]; + +/* add one entry to the drawing code lists */ +static void +addFigList (ConFig **new, int *nused, int c, int drawcode, double ra, double dec) +{ + ConFig *cp; + + new[c]= (ConFig*) realloc (new[c], (nused[c]+1)*sizeof(ConFig)); + cp = &new[c][nused[c]++]; + cp->drawcode = drawcode; + cp->ra = (float)hrrad(ra); + cp->dec = (float)degrad(dec); +} + +/* load the given constellation definition file. + * return 0 if ok else reason why not in msg[] and -1. + */ +int +cns_loadfigs (FILE *fp, char *msg) +{ + char line[1024]; /* one line from the file */ + char cname[1024]; /* constellation name */ + ConFig **new; /* array of ConFig[] for each cnstn */ + int *nused; /* number of ConFig[] for each cnstn */ + int c = -1; /* index, same as cns_namemap[] */ + int s = 0; /* status */ + + /* init the temp lists */ + new = (ConFig **) calloc (NCNS, sizeof(ConFig*)); + nused = (int *) calloc (NCNS, sizeof(int)); + + /* read the file */ + while (fgets (line, sizeof(line), fp)) { + char rastr[64], decstr[64]; + char *lp; + int code; + + /* skip leading/trailing whitespace, blank lines and # lines */ + for (lp = line+strlen(line)-1; lp>=line && isspace(*lp); --lp) + *lp = '\0'; + for (lp = line; isspace(*lp); lp++) + continue; + if (*lp == '#' || *lp == '\0') + continue; + + /* ok, line looks interesting, look more carefully */ + if (sscanf (lp, "%d %s %s", &code, rastr, decstr) == 3) { + /* looks like a drawing line */ + double ra, dec; + + /* must be working on a current constellation */ + if (c < 0) { + sprintf (msg,"Found coord line before first constellation"); + s = -1; + break; + } + + /* check draw code */ + if (code < 0 || code > 2) { + sprintf (msg, "Bad draw code in %s: %d", cname, code); + s = -1; + break; + } + + /* crack ra dec */ + if (f_scansexa (rastr, &ra) < 0 || ra < 0 || ra >= 24) { + sprintf (msg, "Bad RA format in %s: %s", cname, rastr); + s = -1; + break; + } + if (f_scansexa (decstr, &dec) < 0 || dec < -90 || dec > 90) { + sprintf (msg, "Bad Dec format in %s: %s", cname, decstr); + s = -1; + break; + } + + /* add to list */ + addFigList (new, nused, c, code, ra, dec); + + } else { + /* finish previous list, if any */ + if (c >= 0) + addFigList (new, nused, c, -1, 0.0, 0.0); + + /* see if it's a recognized constellation name */ + for (c = 0; c < NCNS; c++) + if (strcmp (lp, cns_namemap[c]+5) == 0) + break; + if (c == NCNS) { + sprintf (msg, "Unknown constellation: %s", lp); + s = -1; + break; + } + if (new[c]) { + sprintf (msg, "Duplicate definition for %s", lp); + s = -1; + break; + } + + /* init its list */ + strcpy (cname, lp); + new[c] = (ConFig *) malloc (1); /* realloc seed */ + } + } + + /* even if ok check we found all definitions */ + if (s == 0) { + int l = 0; + + /* finish last list */ + addFigList (new, nused, c, -1, 0.0, 0.0); + + for (c = 0; c < NCNS; c++) + if (!new[c]) + l += sprintf (msg+l, "%s ", cns_namemap[c]+5); + if (l > 0) { + strcat (msg, ": no definition found"); + s = -1; + } + } + + /* handle ok or error */ + if (s < 0) { + /* trouble: free temp lists */ + for (c = 0; c < NCNS; c++) + if (new[c]) + free (new[c]); + } else { + /* make temp lists persistent */ + for (c = 0; c < NCNS; c++) { + if (figmap[c]) + free (figmap[c]); + figmap[c] = new[c]; + } + } + + /* done with lists themselves regardless */ + free (new); + free (nused); + + /* done */ + return (s); +} + +/* given a constellation id and epoch, return arrays of ra[] and dec[] + * end-points precessed to the desired epoch that, if connected, will form the + * given constellation figure. + * dcodes is 0 if the coord is a "move-to", 1 if a "draw-to" or 2 if a "draw-to + * as dotted-line". + * return the total number of tripples or -1 if id is bogus. + * the arrays need be no larger than 35 entries. + */ +int +cns_figure (int id, double e, double ra[], double dec[], int dcodes[]) +{ + ConFig *cfp; + + if (id < 0 || id >= NCNS) + return (-1); + + for (cfp = figmap[id]; cfp->drawcode >= 0; cfp++) { + *ra = (double)cfp->ra; + *dec = (double)cfp->dec; + precess (J2000, e, ra, dec); + ra++; + dec++; + *dcodes++ = cfp->drawcode; + } + + return (cfp - figmap[id]); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: constel.c,v $ $Date: 2005/03/05 06:55:22 $ $Revision: 1.13 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/dbfmt.c b/Common/Libraries/XEphemAstroLib/src/dbfmt.c new file mode 100644 index 000000000..a562493fb --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/dbfmt.c @@ -0,0 +1,1029 @@ +/* code to convert between .edb format and an Obj */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "preferences.h" + + +int get_fields (char *s, int delim, char *fields[]); + +#define MAXDBLINE 512 /* longest allowed db line */ + +#define FLDSEP ',' /* major field separator */ +#define SUBFLD '|' /* subfield separator */ +#define MAXFLDS 20 /* must be more than on any expected line */ +#define MAXESGOOD 100 /* max earth satellite good, days */ + +static char *enm (char *flds[MAXFLDS]); +static int crack_f (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_e (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_h (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_p (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_E (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_P (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_B (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]); +static int crack_name (Obj *op, char *flds[MAXFLDS], int nf, + char nm[][MAXNM], int nnm); +static void crack_year (char *bp, double *p); +static void crack_okdates (char *fld, float *startok, float *endok); +static int get_okdates (char *lp, float *sp, float *ep); +static int tle_sum (char *l); +static double tle_fld (char *l, int from, int thru); +static double tle_expfld (char *l, int start); +static void write_f (Obj *op, char lp[]); +static void write_e (Obj *op, char lp[]); +static void write_h (Obj *op, char lp[]); +static void write_p (Obj *op, char lp[]); +static void write_E (Obj *op, char lp[]); +static void write_P (Obj *op, char lp[]); +static void write_B (Obj *op, char lp[]); + +/* crack the given .edb database line into op. + * if ok + * return number of names in nm[], or 1 if nm == NULL + * else + * if whynot + * if not even a candidate + * set whynot[0] = '\0' + * else + * fill whynot with reason message. + * return -1 + * only the first name is stored in op, all names (up to nnm) are in nm[], or + * ignored if nm == NULL. + */ +int +db_crack_line (char s[], Obj *op, char nm[][MAXNM], int nnm, char whynot[]) +{ + char copy[MAXDBLINE]; /* work copy; leave s untouched */ + char *flds[MAXFLDS]; /* point to each field for easy reference */ + int nf; + int i; + + /* init no response */ + if (whynot) + whynot[0] = '\0'; + + /* basic initial check */ + if (dbline_candidate (s) < 0) + return (-1); + + /* do all the parsing on a copy */ + (void) strncpy (copy, s, MAXDBLINE-1); + copy[MAXDBLINE-1] = '\0'; + i = strlen(copy); + if (copy[i-1] == '\n') + copy[i-1] = '\0'; + + /* parse into main fields */ + nf = get_fields (copy, FLDSEP, flds); + + /* need at least 2: name and type */ + if (nf < 2) { + if (whynot) + sprintf (whynot, "Bogus: %s", s); + return (-1); + } + + /* switch out on type of object - the second field */ + switch (flds[1][0]) { + + case 'f': + if (crack_f (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'e': + if (crack_e (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'h': + if (crack_h (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'p': + if (crack_p (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'B': + if (crack_B (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'E': + if (crack_E (op, flds, nf, whynot) < 0) + return (-1); + break; + + case 'P': + if (crack_P (op, flds, nf, whynot) < 0) + return (-1); + break; + + default: + if (whynot) + sprintf (whynot, "%s: Unknown type %c for %s", enm(flds), + flds[1][0], flds[0]); + return (-1); + } + + return (crack_name (op, flds, nf, nm, nnm)); +} + +/* write the given Obj in .edb format to lp[]. + * we do _not_ include a trailing '\n'. + */ +void +db_write_line (Obj *op, char lp[]) +{ + switch (op->o_type) { + case FIXED: + write_f (op, lp); + break; + + case BINARYSTAR: + write_B (op, lp); + break; + + case ELLIPTICAL: + write_e (op, lp); + break; + + case HYPERBOLIC: + write_h (op, lp); + break; + + case PARABOLIC: + write_p (op, lp); + break; + + case EARTHSAT: + write_E (op, lp); + break; + + case PLANET: + write_P (op, lp); + break; + + default: + printf ("Unknown type for %s: %d\n", op->o_name, op->o_type); + abort(); + } +} + +/* given 3 lines, first of which is name and next 2 are TLE, fill op. + * we skip leading whitespace on all lines. + * we do /not/ assume the 2 TLE lines are 0 terminated, but we do reach out into + * each as far as 69 chars. + * we detect nonconformance as efficiently as possible. + * name ends at first '\0', '\r' or '\n'. + * set startok/endok. + * if ok return 0 else return -1 + */ +int +db_tle (char *name, char *l1, char *l2, Obj *op) +{ + double ep; + int i; + + /* check for correct line numbers, macthing satellite numbers and + * correct checksums. + */ + while (isspace(*l1)) + l1++; + if (*l1 != '1') + return (-1); + while (isspace(*l2)) + l2++; + if (*l2 != '2') + return (-1); + if (strncmp (l1+2, l2+2, 5)) + return (-1); + if (tle_sum (l1) < 0) + return (-1); + if (tle_sum (l2) < 0) + return (-1); + + /* assume it's ok from here out */ + + /* fresh */ + zero_mem ((void *)op, sizeof(ObjES)); + op->o_type = EARTHSAT; + + /* name, sans leading and trailing whitespace */ + while (isspace(*name)) + name++; + i = strcspn (name, "\r\n"); + while (i > 0 && name[i-1] == ' ') + --i; + if (i == 0) + return (-1); + if (i > MAXNM-1) + i = MAXNM-1; + sprintf (op->o_name, "%.*s", i, name); + + /* goodies from "line 1" */ + op->es_drag = (float) tle_expfld (l1, 54); + op->es_decay = (float) tle_fld (l1, 34, 43); + i = (int) tle_fld (l1, 19, 20); + if (i < 57) + i += 100; + cal_mjd (1, tle_fld(l1, 21, 32), i+1900, &ep); + op->es_epoch = ep; + + /* goodies from "line 2" */ + op->es_n = tle_fld (l2, 53, 63); + op->es_inc = (float)tle_fld (l2, 9, 16); + op->es_raan = (float)tle_fld (l2, 18, 25); + op->es_e = (float)(tle_fld (l2, 27, 33) * 1e-7); + op->es_ap = (float)tle_fld (l2, 35, 42); + op->es_M = (float)tle_fld (l2, 44, 51); + op->es_orbit = (int)tle_fld (l2, 64, 68); + + /* limit date range to decay period that changes period by 1% but + * never more than MAXESGOOD. + * es_n is rev/day, es_decay is (rev/day)/day + */ + if (fabs(op->es_decay) > 0) { + double dt = 0.01*op->es_n/fabs(op->es_decay); + if (dt > MAXESGOOD) + dt = MAXESGOOD; + op->es_startok = op->es_epoch - dt; + op->es_endok = op->es_epoch + dt; + } + + /* yes! */ + return (0); +} + +/* return 0 if op has no date range information or what it does have brackets + * now, else -1 + */ +int +dateRangeOK (Now *np, Obj *op) +{ + float *sp, *ep; + + switch (op->o_type) { + case ELLIPTICAL: + sp = &op->e_startok; + ep = &op->e_endok; + break; + case HYPERBOLIC: + sp = &op->h_startok; + ep = &op->h_endok; + break; + case PARABOLIC: + sp = &op->p_startok; + ep = &op->p_endok; + break; + case EARTHSAT: + sp = &op->es_startok; + ep = &op->es_endok; + break; + default: + return (0); + } + + if (*sp <= mjd && (!*ep || mjd <= *ep)) + return (0); + return (-1); +} + +/* given a null-terminated string, fill in fields[] with the starting addresses + * of each field delimited by delim or '\0'. + * N.B. each character matching delim is REPLACED BY '\0' IN PLACE. + * N.B. 0-length fields count, so even if *s=='\0' we return 1. + * return the number of fields. + */ +int +get_fields (char *s, int delim, char *fields[]) +{ + int n; + char c; + + *fields = s; + n = 0; + do { + c = *s++; + if (c == delim || c == '\0') { + s[-1] = '\0'; + *++fields = s; + n++; + } + } while (c); + + return (n); +} + +/* return 0 if buf qualifies as a database line worthy of a cracking + * attempt, else -1. + */ +int +dbline_candidate (char *buf) +{ + char c = buf[0]; + + return (c == '#' || c == '!' || isspace(c) ? -1 : 0); +} + +/* return 0 if TLE checksum is ok, else -1 */ +static int +tle_sum (char *l) +{ + char *lastl = l + 68; + int sum; + + for (sum = 0; l < lastl; ) { + char c = *l++; + if (c == '\0') + return (-1); + if (isdigit(c)) + sum += c - '0'; + else if (c == '-') + sum++; + } + + return (*l - '0' == (sum%10) ? 0 : -1); +} + +/* extract the given columns and return value. + * N.B. from and to are 1-based within l + */ +static double +tle_fld (char *l, int from, int thru) +{ + char buf[32]; + + sprintf (buf, "%.*s", thru-from+1, l+from-1); + return (atod (buf)); +} + +/* extract the exponential value starting at the given column. + * N.B. start is 1-based within l + */ +static double +tle_expfld (char *l, int start) +{ + char buf[32]; + double v; + + sprintf (buf, ".%.*s", 5, l+start); + v = atod (buf) * pow (10.0, tle_fld(l, start+6, start+7)); + if (l[start-1] == '-') + v = -v; + return (v); +} + +static int +crack_f (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + char *sflds[MAXFLDS]; + double tmp; + int nsf; + + if (nf < 5 || nf > 7) { + if (whynot) + sprintf (whynot, "%s: type f needs 5-7 fields, not %d", + enm(flds),nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjF)); + op->o_type = FIXED; + + nsf = get_fields(flds[1], SUBFLD, sflds); + if (nsf > 1) { + switch (sflds[1][0]) { + case 'A': case 'B': case 'C': case 'D': case 'F': case 'G': + case 'H': case 'K': case 'J': case 'L': case 'M': case 'N': + case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'Y': + op->f_class = sflds[1][0]; + if (op->f_class == 'B') + op->f_class = 'D'; /* merge B and D since BINARYSTAR */ + break; + default: + if (whynot) + sprintf (whynot, "%s: Bad f class: %c", enm(flds), + sflds[1][0]); + return (-1); + } + } else + op->f_class = 'T'; /* default to star-like */ + if (nsf > 2) { + /* fill f_spect all the way */ + char buf[sizeof(op->f_spect)+1]; + memset (buf, 0, sizeof(buf)); + sprintf (buf, "%.*s", (int)sizeof(op->f_spect), sflds[2]); + memcpy (op->f_spect, buf, (int)sizeof(op->f_spect)); + } + + nsf = get_fields(flds[2], SUBFLD, sflds); + f_scansexa (sflds[0], &tmp); + op->f_RA = (float) hrrad(tmp); + if (nsf > 1) + op->f_pmRA = (float) 1.327e-11*atod(sflds[1]);/*mas/yr->rad/dy*/ + + nsf = get_fields(flds[3], SUBFLD, sflds); + f_scansexa (sflds[0], &tmp); + op->f_dec = (float) degrad(tmp); + if (nsf > 1) + op->f_pmdec = (float)1.327e-11*atod(sflds[1]);/*mas/yr->rad/dy*/ + if (fabs(op->f_dec) < PI/2) + op->f_pmRA /= cos (op->f_dec); + + set_fmag (op, atod(flds[4])); + + if (nf > 5 && flds[5][0]) { + tmp = op->f_epoch; + crack_year (flds[5], &tmp); + op->f_epoch = (float) tmp; + } else + op->f_epoch = J2000; /* default */ + + if (nf > 6) { + op->f_size = (float) atod(flds[6]); + + /* optional minor axis and position angle subfields */ + nsf = get_fields(flds[6], SUBFLD, sflds); + if (nsf == 3) { + set_ratio(op, op->s_size, atod(sflds[1])); + set_pa(op,degrad(atod(sflds[2]))); + } else { + set_ratio(op,1,1); /* round */ + set_pa(op,0.0); + } + } + + return (0); +} + +static int +crack_e (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + if (nf != 13 && nf != 14) { + if (whynot) + sprintf (whynot, "%s: type e needs 13 or 14 fields, not %d", + enm(flds), nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjE)); + op->o_type = ELLIPTICAL; + + op->e_inc = (float) atod (flds[2]); + op->e_Om = (float) atod (flds[3]); + op->e_om = (float) atod (flds[4]); + op->e_a = (float) atod (flds[5]); + /* retired op->e_n = (float) atod (flds[6]); */ + op->e_e = atod (flds[7]); + op->e_M = (float) atod (flds[8]); + crack_year (flds[9], &op->e_cepoch); + crack_okdates (flds[9], &op->e_startok, &op->e_endok); + crack_year (flds[10], &op->e_epoch); + + /* magnitude model gk or HG(default). allow prefixes in either field */ + op->e_mag.whichm = flds[11][0] == 'g' ? MAG_gk : MAG_HG; + if (isdigit(flds[11][0])) + op->e_mag.m1 = (float) atod(&flds[11][0]); + else + op->e_mag.m1 = (float) atod(&flds[11][1]); + if (isdigit(flds[12][0])) + op->e_mag.m2 = (float) atod(&flds[12][0]); + else + op->e_mag.m2 = (float) atod(&flds[12][1]); + + if (nf == 14) + op->e_size = (float) atod (flds[13]); + + return (0); +} + +static int +crack_h (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + if (nf != 11 && nf != 12) { + if (whynot) + sprintf (whynot, "%s: type h needs 11 or 12 fields, not %d", + enm(flds), nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjH)); + op->o_type = HYPERBOLIC; + + crack_year (flds[2], &op->h_ep); + crack_okdates (flds[2], &op->h_startok, &op->h_endok); + op->h_inc = (float) atod (flds[3]); + op->h_Om = (float) atod (flds[4]); + op->h_om = (float) atod (flds[5]); + op->h_e = (float) atod (flds[6]); + op->h_qp = (float) atod (flds[7]); + crack_year (flds[8], &op->h_epoch); + op->h_g = (float) atod (flds[9]); + op->h_k = (float) atod (flds[10]); + + if (nf == 12) + op->h_size = (float) atod (flds[11]); + + return (0); +} + +static int +crack_p (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + if (nf != 10 && nf != 11) { + if (whynot) + sprintf (whynot, "%s: type p needs 10 or 11 fields, not %d", + enm(flds), nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjP)); + op->o_type = PARABOLIC; + + crack_year (flds[2], &op->p_ep); + crack_okdates (flds[2], &op->p_startok, &op->p_endok); + op->p_inc = (float) atod (flds[3]); + op->p_om = (float) atod (flds[4]); + op->p_qp = (float) atod (flds[5]); + op->p_Om = (float) atod (flds[6]); + crack_year (flds[7], &op->p_epoch); + op->p_g = (float) atod (flds[8]); + op->p_k = (float) atod (flds[9]); + + if (nf == 11) + op->p_size = (float) atod (flds[10]); + + return (0); +} + +static int +crack_E (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + if (nf != 11 && nf != 12) { + if (whynot) + sprintf (whynot, "%s: type E needs 11 or 12 fields, not %d", + enm(flds), nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjES)); + op->o_type = EARTHSAT; + crack_year (flds[2], &op->es_epoch); + crack_okdates (flds[2], &op->es_startok, &op->es_endok); + op->es_inc = (float) atod (flds[3]); + op->es_raan = (float) atod (flds[4]); + op->es_e = (float) atod (flds[5]); + op->es_ap = (float) atod (flds[6]); + op->es_M = (float) atod (flds[7]); + op->es_n = atod (flds[8]); + op->es_decay = (float) atod (flds[9]); + op->es_orbit = atoi (flds[10]); + if (nf == 12) + op->es_drag = (float) atod (flds[11]); + + /* if not already specified, limit date range to decay period that + * changes period by 1% but never longer than MAXESGOOD. + * es_n is rev/day, es_decay is (rev/day)/day + */ + if (op->es_startok == 0 && op->es_endok == 0 && fabs(op->es_decay) > 0){ + double dt = 0.01*op->es_n/fabs(op->es_decay); + if (dt > MAXESGOOD) + dt = MAXESGOOD; + op->es_startok = op->es_epoch - dt; + op->es_endok = op->es_epoch + dt; + } + + return (0); +} + +static int +crack_P (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + Obj *bi; + int nbi; + int i; + + nbi = getBuiltInObjs (&bi); + + for (i = 0; i < nbi; i++) { + Obj *bop = bi + i; + if (is_type(bop,PLANETM) && !strcmp (flds[0], bop->o_name)) { + memcpy ((void *)op, bop, sizeof(ObjPl)); + return (0); + } + } + + if (whynot) + sprintf (whynot, "%s: Unknown planet or moon", enm(flds)); + return (-1); +} + +static int +crack_B (Obj *op, char *flds[MAXFLDS], int nf, char whynot[]) +{ + char *sflds[MAXFLDS]; + double tmp; + int nsf; + + if (nf != 7) { + if (whynot) + sprintf (whynot, "%s: B need 7 fields, not %d", enm(flds), nf); + return (-1); + } + + zero_mem ((void *)op, sizeof(ObjB)); + op->o_type = BINARYSTAR; + + nsf = get_fields(flds[1], SUBFLD, sflds); + if (nsf > 1) { + switch (sflds[1][0]) { + case 'a': case 'c': case 'e': case 'x': case 'y': case 'o': + case 's': case 't': case 'u': case 'v': case 'b': case 'd': + case 'q': case 'r': case 'p': case 'U': case 'V': case 'Y': + op->f_class = sflds[1][0]; + break; + default: + if (whynot) + sprintf (whynot, "%s: Bad B class: %c", enm(flds), + sflds[1][0]); + return (-1); + } + } + if (nsf > 2) { + /* fill f_spect all the way */ + char buf[sizeof(op->f_spect)+1]; + memset (buf, 0, sizeof(buf)); + sprintf (buf, "%.*s", (int)sizeof(op->f_spect), sflds[2]); + memcpy (op->f_spect, buf, (int)sizeof(op->f_spect)); + } + if (nsf > 3) { + /* fill b_2spect all the way */ + char buf[sizeof(op->b_2spect)+1]; + memset (buf, 0, sizeof(buf)); + sprintf (buf, "%.*s", (int)sizeof(op->b_2spect), sflds[3]); + memcpy (op->b_2spect, buf, (int)sizeof(op->b_2spect)); + } + + nsf = get_fields(flds[2], SUBFLD, sflds); + f_scansexa (sflds[0], &tmp); + op->f_RA = (float) hrrad(tmp); + if (nsf > 1) + op->f_pmRA = (float) 1.327e-11*atod(sflds[1]);/*mas/yr->rad/dy*/ + + nsf = get_fields(flds[3], SUBFLD, sflds); + f_scansexa (sflds[0], &tmp); + op->f_dec = (float) degrad(tmp); + if (nsf > 1) + op->f_pmdec = (float)1.327e-11*atod(sflds[1]);/*mas/yr->rad/dy*/ + if (fabs(op->f_dec) < PI/2) + op->f_pmRA /= cos (op->f_dec); + + nsf = get_fields(flds[4], SUBFLD, sflds); + if (nsf > 0) + set_fmag (op, atod(sflds[0])); + if (nsf > 1) + op->b_2mag = (short)floor((atod(sflds[1]))*MAGSCALE + 0.5); + + if (flds[5][0]) { + tmp = op->f_epoch; + crack_year (flds[5], &tmp); + op->f_epoch = (float) tmp; + } else + op->f_epoch = J2000; /* default */ + + nsf = get_fields(flds[6], SUBFLD, sflds); + if (nsf == 7) { + int l; + char c; + + op->b_bo.bo_a = atod(sflds[0]); + op->b_bo.bo_i = atod(sflds[1]); + op->b_bo.bo_O = atod(sflds[2]); + op->b_bo.bo_e = atod(sflds[3]); + op->b_bo.bo_T = atod(sflds[4]); + op->b_bo.bo_o = atod(sflds[5]); + op->b_bo.bo_P = atod(sflds[6]); + + /* reject some weird entries actually seen in real lists */ + if (op->b_bo.bo_a <= 0) { + if (whynot) + sprintf (whynot, "%s: Bogus B semi major axis: %g", + enm(flds), op->b_bo.bo_a); + return (-1); + } + if (op->b_bo.bo_P <= 0) { + if (whynot) + sprintf (whynot, "%s: Bogus B period: %g", enm(flds), + op->b_bo.bo_P); + return (-1); + } + + /* scale period */ + l = strlen (sflds[6]); + c = sflds[6][l-1]; + switch (c) { + case 'y': case 'Y': + break; + case 'h': case 'H': + op->b_bo.bo_P /= (24.0*365.25); + break; + case 'd': case 'D': + op->b_bo.bo_P /= 365.25; + break; + default: + if (c != ' ' && !isdigit(c)) { + if (whynot) + sprintf (whynot,"%s: B period suffix not Y, D or H: %c", + enm(flds), c); + return (-1); + } + } + + } else if (nsf==3 || nsf==6 || nsf==9) { + double yr; + int i; + + op->b_nbp = nsf/3; + for (i = 0; i < nsf; i += 3) { + tmp = 0; + crack_year (sflds[i+0], &tmp); + mjd_year (tmp, &yr); + op->b_bp[i/3].bp_ep = (float)yr; + op->b_bp[i/3].bp_sep = atod(sflds[i+1]); + op->b_bp[i/3].bp_pa = degrad(atod(sflds[i+2])); + } + } else { + if (whynot) + sprintf (whynot, + "%s: type B needs 3,6 or 7 subfields in field 7, not %d", + enm(flds), nsf); + return (-1); + } + + return (0); +} + +/* put all names in nm but load only the first into o_name */ +static int +crack_name (Obj *op, char *flds[MAXFLDS], int nf, char nm[][MAXNM], int nnm) +{ + char *sflds[MAXFLDS]; + int nsf; + int i; + + nsf = get_fields (flds[0], SUBFLD, sflds); + for (i = 0; nm && i < nsf && i < nnm; i++) { + strncpy (nm[i], sflds[i], MAXNM); + nm[i][MAXNM-1] = '\0'; + } + strncpy (op->o_name, sflds[0], MAXNM-1); + return (nsf); +} + +/* simple name cracker just for error messages */ +static char * +enm (char *flds[MAXFLDS]) +{ + char *sflds[MAXFLDS]; + int nsf = get_fields (flds[0], SUBFLD, sflds); + return (nsf > 0 ? sflds[0] : "Unknown"); +} + +/* given either a decimal year (xxxx[.xxx]) or a calendar (x/x/x) date + * convert it to an mjd and store it at *p. + */ +static void +crack_year (char *bp, double *p) +{ + int m, y; + double d; + + mjd_cal (*p, &m, &d, &y); /* init with current */ + f_sscandate (bp, PREF_MDY, &m, &d, &y); + cal_mjd (m, d, y, p); +} + +/* crack the startok and endok date fields found in several Obj types. + * set to 0 if blank or any problems. + */ +static void +crack_okdates (char *fld, float *startok, float *endok) +{ + char *sflds[MAXFLDS]; + double tmp; + int m, y; + double d; + int nsf; + + *startok = *endok = 0; + nsf = get_fields(fld, SUBFLD, sflds); + if (nsf > 1) { + d = m = y = 0; + f_sscandate (sflds[1], PREF_MDY, &m, &d, &y); + cal_mjd (m, d, y, &tmp); + *startok = (float)tmp; + if (nsf > 2) { + d = m = y = 0; + f_sscandate (sflds[2], PREF_MDY, &m, &d, &y); + cal_mjd (m, d, y, &tmp); + *endok = (float)tmp; + } + } +} + +/* add startok and endok to string at lp if non-zero. + * return number of characters added. + */ +static int +get_okdates (char *lp, float *sp, float *ep) +{ + char *lp0 = lp; + + if (*sp || *ep) { + *lp++ = '|'; + if (*sp) + lp += fs_date (lp, PREF_MDY, *sp); + if (*ep) { + *lp++ = '|'; + lp += fs_date (lp, PREF_MDY, *ep); + } + } + + return (lp - lp0); +} + +static void +write_f (Obj *op, char lp[]) +{ + double tmp; + + lp += sprintf (lp, "%s,f", op->o_name); + if (op->f_class) + lp += sprintf (lp, "|%c", op->f_class); + if (op->f_spect[0]) + lp += sprintf (lp, "|%.*s", (int)sizeof(op->f_spect), op->f_spect); + *lp++ = ','; + lp += fs_sexa (lp, radhr(op->f_RA), 2, 36000); + if (op->f_pmRA) + lp += sprintf (lp, "|%.6g",cos(op->f_dec)*op->f_pmRA/1.327e-11); + *lp++ = ','; + lp += fs_sexa (lp, raddeg(op->f_dec), 3, 3600); + if (op->f_pmdec) + lp += sprintf (lp, "|%.6g", op->f_pmdec/1.327e-11); + lp += sprintf (lp, ",%.2f", get_mag(op)); + mjd_year (op->f_epoch, &tmp); + lp += sprintf (lp, ",%.6g", tmp); /* %.7g gives 2000.001 */ + lp += sprintf (lp, ",%.7g", op->f_size); + if (op->f_size && (op->f_ratio || op->f_pa)) + lp += sprintf (lp,"|%g|%g", op->f_size*get_ratio(op), + raddeg(get_pa(op))); +} + +static void +write_e (Obj *op, char lp[]) +{ + lp += sprintf (lp, "%s,e", op->o_name); + lp += sprintf (lp, ",%.7g", op->e_inc); + lp += sprintf (lp, ",%.7g", op->e_Om); + lp += sprintf (lp, ",%.7g", op->e_om); + lp += sprintf (lp, ",%.7g", op->e_a); + lp += sprintf (lp, ",%.7g", 0.0); /* retired op->e_n */ + lp += sprintf (lp, ",%.7g", op->e_e); + lp += sprintf (lp, ",%.7g", op->e_M); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->e_cepoch); + lp += get_okdates (lp, &op->e_startok, &op->e_endok); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->e_epoch); + if (op->e_mag.whichm == MAG_gk) + lp += sprintf (lp, ",g%.7g", op->e_mag.m1); + else if (op->e_mag.whichm == MAG_HG) + lp += sprintf (lp, ",H%.7g", op->e_mag.m1); + else + lp += sprintf (lp, ",%.7g", op->e_mag.m1); + lp += sprintf (lp, ",%.7g", op->e_mag.m2); + lp += sprintf (lp, ",%.7g", op->e_size); +} + +static void +write_h (Obj *op, char lp[]) +{ + lp += sprintf (lp, "%s,h", op->o_name); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->h_ep); + lp += get_okdates (lp, &op->h_startok, &op->h_endok); + lp += sprintf (lp, ",%.7g", op->h_inc); + lp += sprintf (lp, ",%.7g", op->h_Om); + lp += sprintf (lp, ",%.7g", op->h_om); + lp += sprintf (lp, ",%.7g", op->h_e); + lp += sprintf (lp, ",%.7g", op->h_qp); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->h_epoch); + lp += sprintf (lp, ",%.7g", op->h_g); + lp += sprintf (lp, ",%.7g", op->h_k); + lp += sprintf (lp, ",%.7g", op->h_size); +} + +static void +write_p (Obj *op, char lp[]) +{ + lp += sprintf (lp, "%s,p", op->o_name); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->p_ep); + lp += get_okdates (lp, &op->p_startok, &op->p_endok); + lp += sprintf (lp, ",%.7g", op->p_inc); + lp += sprintf (lp, ",%.7g", op->p_om); + lp += sprintf (lp, ",%.7g", op->p_qp); + lp += sprintf (lp, ",%.7g", op->p_Om); + *lp++ = ','; + lp += fs_date (lp, PREF_MDY, op->p_epoch); + lp += sprintf (lp, ",%.7g", op->p_g); + lp += sprintf (lp, ",%.7g", op->p_k); + lp += sprintf (lp, ",%.7g", op->p_size); +} + +static void +write_E (Obj *op, char lp[]) +{ + double d; + int m, y; + + lp += sprintf (lp, "%s,E", op->o_name); + *lp++ = ','; + mjd_cal (op->es_epoch, &m, &d, &y); /* need more day prec than fs_date*/ + lp += sprintf (lp, "%d/%.12g/%d", m, d, y); + lp += get_okdates (lp, &op->es_startok, &op->es_endok); + lp += sprintf (lp, ",%.8g", op->es_inc); + lp += sprintf (lp, ",%.8g", op->es_raan); + lp += sprintf (lp, ",%.8g", op->es_e); + lp += sprintf (lp, ",%.8g", op->es_ap); + lp += sprintf (lp, ",%.8g", op->es_M); + lp += sprintf (lp, ",%.12g", op->es_n); /* double */ + lp += sprintf (lp, ",%.8g", op->es_decay); + lp += sprintf (lp, ",%d", op->es_orbit); + lp += sprintf (lp, ",%.8g", op->es_drag); +} + +static void +write_B (Obj *op, char lp[]) +{ + double tmp; + + lp += sprintf (lp, "%s,B", op->o_name); + if (op->f_class) + lp += sprintf (lp, "|%c", op->f_class); + if (op->f_spect[0]) + lp += sprintf (lp, "|%.*s", (int)sizeof(op->f_spect), op->f_spect); + if (op->b_2spect[0]) + lp += sprintf (lp, "|%.*s", (int)sizeof(op->b_2spect),op->b_2spect); + *lp++ = ','; + lp += fs_sexa (lp, radhr(op->f_RA), 2, 36000); + if (op->f_pmRA) + lp += sprintf (lp, "|%.6g",cos(op->f_dec)*op->f_pmRA/1.327e-11); + *lp++ = ','; + lp += fs_sexa (lp, raddeg(op->f_dec), 3, 3600); + if (op->f_pmdec) + lp += sprintf (lp, "|%.6g", op->f_pmdec/1.327e-11); + lp += sprintf (lp, ",%.2f", get_mag(op)); + lp += sprintf (lp, "|%.2f", op->b_2mag/MAGSCALE); + mjd_year (op->f_epoch, &tmp); + lp += sprintf (lp, ",%.6g", tmp); /* %.7g gives 2000.001 */ + if (op->b_nbp == 0) { + lp += sprintf (lp, ",%.6g", op->b_bo.bo_a); + lp += sprintf (lp, "|%.6g", op->b_bo.bo_i); + lp += sprintf (lp, "|%.6g", op->b_bo.bo_O); + lp += sprintf (lp, "|%.6g", op->b_bo.bo_e); + lp += sprintf (lp, "|%.6g", op->b_bo.bo_T); + lp += sprintf (lp, "|%.6g", op->b_bo.bo_o); + lp += sprintf (lp, "|%.6gy", op->b_bo.bo_P); + } else { + int i; + + for (i = 0; i < op->b_nbp; i++) { + BinPos *bp = &op->b_bp[i]; + lp += sprintf (lp, "%c%.6g", i==0?',':'|', bp->bp_ep); + lp += sprintf (lp, "|%.6g", bp->bp_sep); + lp += sprintf (lp, "|%.6g", raddeg(bp->bp_pa)); + } + } +} + +static void +write_P (Obj *op, char lp[]) +{ + + lp += sprintf (lp, "%s,P", op->o_name); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: dbfmt.c,v $ $Date: 2009/10/09 21:28:11 $ $Revision: 1.45 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/deep.c b/Common/Libraries/XEphemAstroLib/src/deep.c new file mode 100644 index 000000000..fcb13f5a4 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/deep.c @@ -0,0 +1,790 @@ +#include +#include + +#include "deepconst.h" +#include "satspec.h" + +/* * DEEP SPACE 31 OCT 80 */ +/* SUBROUTINE DEEP */ +/* COMMON/E1/XMO,XNODEO,OMEGAO,EO,XINCL,XNO,XNDT2O, */ +/* 1 XNDD6O,BSTAR,X,Y,Z,XDOT,YDOT,ZDOT,EPOCH,DS50 */ +/* COMMON/C1/CK2,CK4,E6A,QOMS2T,S,TOTHRD, */ +/* 1 XJ3,XKE,XKMPER,XMNPDA,AE */ +/* COMMON/C2/DE2RA,PI,PIO2,TWOPI,X3PIO2 */ +/* DOUBLE PRECISION EPOCH, DS50 */ +/* DOUBLE PRECISION */ +/* * DAY,PREEP,XNODCE,ATIME,DELT,SAVTSN,STEP2,STEPN,STEPP */ +/* DATA ZNS, C1SS, ZES/ */ +/* A 1.19459E-5, 2.9864797E-6, .01675/ */ +/* DATA ZNL, C1L, ZEL/ */ +/* A 1.5835218E-4, 4.7968065E-7, .05490/ */ +/* DATA ZCOSIS, ZSINIS, ZSINGS/ */ +/* A .91744867, .39785416, -.98088458/ */ +/* DATA ZCOSGS, ZCOSHS, ZSINHS/ */ +/* A .1945905, 1.0, 0.0/ */ +/* DATA Q22,Q31,Q33/1.7891679E-6,2.1460748E-6,2.2123015E-7/ */ +/* DATA G22,G32/5.7686396,0.95240898/ */ +/* DATA G44,G52/1.8014998,1.0508330/ */ +/* DATA G54/4.4108898/ */ +/* DATA ROOT22,ROOT32/1.7891679E-6,3.7393792E-7/ */ +/* DATA ROOT44,ROOT52/7.3636953E-9,1.1428639E-7/ */ +/* DATA ROOT54/2.1765803E-9/ */ +/* DATA THDT/4.3752691E-3/ */ + +#define XMO (sat->elem->se_XMO) +#define XNODEO (sat->elem->se_XNODEO) +#define OMEGAO (sat->elem->se_OMEGAO) +#define EO (sat->elem->se_EO) +#define XINCL (sat->elem->se_XINCL) +#define XNO (sat->elem->se_XNO) +#define XNDT20 (sat->elem->se_XNDT20) +#define XNDD60 (sat->elem->se_XNDD60) +#define BSTAR (sat->elem->se_BSTAR) +#define EPOCH (sat->elem->se_EPOCH) + +#define ZNS (1.19459E-5) +#define C1SS (2.9864797E-6) +#define ZES (.01675) +#define ZNL (1.5835218E-4) +#define C1L (4.7968065E-7) +#define ZEL (.05490) +#define ZCOSIS (.91744867) +#define ZSINIS (.39785416) +#define ZSINGS (-.98088458) +#define ZCOSGS (.1945905) +#define ZCOSHS (1.0) +#define ZSINHS (0.0) + +#define Q22 (1.7891679E-6) +#define Q31 (2.1460748E-6) +#define Q33 (2.2123015E-7) +#define G22 (5.7686396) +#define G32 (0.95240898) +#define G44 (1.8014998) +#define G52 (1.0508330) +#define G54 (4.4108898) +#define ROOT22 (1.7891679E-6) +#define ROOT32 (3.7393792E-7) +#define ROOT44 (7.3636953E-9) +#define ROOT52 (1.1428639E-7) +#define ROOT54 (2.1765803E-9) +#define THDT (4.3752691E-3) + +#define IRESFL (sat->deep->deep_flags.IRESFL) +#define ISYNFL (sat->deep->deep_flags.ISYNFL) + +#define s_SINIQ (sat->deep->deep_s_SINIQ) +#define s_COSIQ (sat->deep->deep_s_COSIQ) +#define s_OMGDT (sat->deep->deep_s_OMGDT) +#define ATIME (sat->deep->deep_ATIME) +#define D2201 (sat->deep->deep_D2201) +#define D2211 (sat->deep->deep_D2211) +#define D3210 (sat->deep->deep_D3210) +#define D3222 (sat->deep->deep_D3222) +#define D4410 (sat->deep->deep_D4410) +#define D4422 (sat->deep->deep_D4422) +#define D5220 (sat->deep->deep_D5220) +#define D5232 (sat->deep->deep_D5232) +#define D5421 (sat->deep->deep_D5421) +#define D5433 (sat->deep->deep_D5433) +#define DEL1 (sat->deep->deep_DEL1) +#define DEL2 (sat->deep->deep_DEL2) +#define DEL3 (sat->deep->deep_DEL3) +#define E3 (sat->deep->deep_E3) +#define EE2 (sat->deep->deep_EE2) +#define FASX2 (sat->deep->deep_FASX2) +#define FASX4 (sat->deep->deep_FASX4) +#define FASX6 (sat->deep->deep_FASX6) +#define OMEGAQ (sat->deep->deep_OMEGAQ) +#define PE (sat->deep->deep_PE) +#define PINC (sat->deep->deep_PINC) +#define PL (sat->deep->deep_PL) +#define SAVTSN (sat->deep->deep_SAVTSN) +#define SE2 (sat->deep->deep_SE2) +#define SE3 (sat->deep->deep_SE3) +#define SGH2 (sat->deep->deep_SGH2) +#define SGH3 (sat->deep->deep_SGH3) +#define SGH4 (sat->deep->deep_SGH4) +#define SGHL (sat->deep->deep_SGHL) +#define SGHS (sat->deep->deep_SGHS) +#define SH2 (sat->deep->deep_SH2) +#define SH3 (sat->deep->deep_SH3) +#define SHS (sat->deep->deep_SHS) +#define SHL (sat->deep->deep_SHL) +#define SI2 (sat->deep->deep_SI2) +#define SI3 (sat->deep->deep_SI3) +#define SL2 (sat->deep->deep_SL2) +#define SL3 (sat->deep->deep_SL3) +#define SL4 (sat->deep->deep_SL4) +#define SSE (sat->deep->deep_SSE) +#define SSG (sat->deep->deep_SSG) +#define SSH (sat->deep->deep_SSH) +#define SSI (sat->deep->deep_SSI) +#define SSL (sat->deep->deep_SSL) +#define STEP2 (sat->deep->deep_STEP2) +#define STEPN (sat->deep->deep_STEPN) +#define STEPP (sat->deep->deep_STEPP) +#define THGR (sat->deep->deep_THGR) +#define XFACT (sat->deep->deep_XFACT) +#define XGH2 (sat->deep->deep_XGH2) +#define XGH3 (sat->deep->deep_XGH3) +#define XGH4 (sat->deep->deep_XGH4) +#define XH2 (sat->deep->deep_XH2) +#define XH3 (sat->deep->deep_XH3) +#define XI2 (sat->deep->deep_XI2) +#define XI3 (sat->deep->deep_XI3) +#define XL2 (sat->deep->deep_XL2) +#define XL3 (sat->deep->deep_XL3) +#define XL4 (sat->deep->deep_XL4) +#define XLAMO (sat->deep->deep_XLAMO) +#define XLI (sat->deep->deep_XLI) +#define XNI (sat->deep->deep_XNI) +#define XNQ (sat->deep->deep_XNQ) +#define XQNCL (sat->deep->deep_XQNCL) +#define ZMOL (sat->deep->deep_ZMOL) +#define ZMOS (sat->deep->deep_ZMOS) + +/* * ENTRANCE FOR DEEP SPACE INITIALIZATION */ + +/* ENTRY DPINIT(EQSQ,SINIQ,COSIQ,RTEQSQ,AO,COSQ2,SINOMO,COSOMO, */ +/* 1 BSQ,XLLDOT,OMGDT,XNODOT,XNODP) */ + +void +dpinit(SatData *sat, double EQSQ, double SINIQ, double COSIQ, + double RTEQSQ, double AO, double COSQ2, double SINOMO, + double COSOMO, double BSQ, double XLLDOT, double OMGDT, + double XNODOT, double XNODP) +{ + double A1, A10, A2, A3, A4, A5, A6, A7, A8, A9, AINV2, AQNV, BFACT, + C, CC, COSQ, CTEM, DAY, DS50, EOC, EQ, F220, F221, F311, F321, F322, + F330, F441, F442, F522, F523, F542, F543, G200, G201, G211, G300, + G310, G322, G410, G422, G520, G521, G532, G533, GAM, PREEP, S1, S2, + S3, S4, S5, S6, S7, SE, SGH, SH, SI, SINI2, SINQ, SL, STEM, TEMP, + TEMP1, X1, X2, X3, X4, X5, X6, X7, X8, XMAO, XNO2, XNODCE, XNOI, + XPIDOT, Z1, Z11, Z12, Z13, Z2, Z21, Z22, Z23, Z3, Z31, Z32, Z33, + ZCOSG, ZCOSGL, ZCOSH, ZCOSHL, ZCOSI, ZCOSIL, ZE, ZMO, ZN, ZSING, + ZSINGL, ZSINH, ZSINHL, ZSINI, ZSINIL, ZX, ZY; + + int c; +#if 0 + A1=A10=A2=A3=A4=A5=A6=A7=A8=A9=AINV2=AQNV=BFACT = signaling_nan(); + C=CC=COSQ=CTEM=DAY=DS50=EOC=EQ=F220=F221=F311=F321=F322 = signaling_nan(); + F330=F441=F442=F522=F523=F542=F543=G200=G201=G211=G300 = signaling_nan(); + G310=G322=G410=G422=G520=G521=G532=G533=GAM=PREEP=S1=S2 = signaling_nan(); + S3=S4=S5=S6=S7=SE=SGH=SH=SI=SINI2=SINQ=SL=STEM=TEMP = signaling_nan(); + TEMP1=X1=X2=X3=X4=X5=X6=X7=X8=XMAO=XNO2=XNODCE=XNOI = signaling_nan(); + XPIDOT=Z1=Z11=Z12=Z13=Z2=Z21=Z22=Z23=Z3=Z31=Z32=Z33 = signaling_nan(); + ZCOSG=ZCOSGL=ZCOSH=ZCOSHL=ZCOSI=ZCOSIL=ZE=ZMO=ZN=ZSING = signaling_nan(); + ZSINGL=ZSINH=ZSINHL=ZSINI=ZSINIL=ZX=ZY = signaling_nan(); +#endif + if(!sat->deep) + sat->deep = (struct deep_data *) malloc(sizeof(struct deep_data)); + else + return; + + /* init_deep(sat->deep); */ + PREEP = 0.0; + + ZCOSGL = ZCOSHL = ZCOSIL = ZSINGL = ZSINHL = ZSINIL = 0.0; + + /* Save some of the arguments, for use by dpsec() and dpper() */ + s_SINIQ = SINIQ; + s_COSIQ = COSIQ; + s_OMGDT = OMGDT; + + THGR = thetag(EPOCH, &DS50); + + EQ = EO; + XNQ = XNODP; + AQNV = 1.0/AO; + XQNCL = XINCL; + XMAO = XMO; + XPIDOT = OMGDT + XNODOT; + SINQ = sin(XNODEO); + COSQ = cos(XNODEO); + OMEGAQ = OMEGAO; + + /* INITIALIZE LUNAR SOLAR TERMS */ + + DAY = DS50 + 18261.5; + + if(DAY != PREEP) { + PREEP = DAY; + XNODCE = 4.5236020 - 9.2422029E-4 * DAY; + STEM = sin(XNODCE); + CTEM = cos(XNODCE); + ZCOSIL = .91375164 - .03568096 * CTEM; + ZSINIL = sqrt(1.0 - ZCOSIL * ZCOSIL); + ZSINHL = .089683511 * STEM / ZSINIL; + ZCOSHL = sqrt(1.0 - ZSINHL * ZSINHL); + C = 4.7199672 + .22997150 * DAY; + GAM = 5.8351514 + .0019443680 * DAY; + ZMOL = fmod(C-GAM, TWOPI); + ZX = .39785416 * STEM / ZSINIL; + ZY = ZCOSHL * CTEM + 0.91744867 * ZSINHL * STEM; + ZX = actan(ZX, ZY); + ZX = GAM + ZX - XNODCE; + ZCOSGL = cos(ZX); + ZSINGL = sin(ZX); + ZMOS = 6.2565837 + .017201977 * DAY; + ZMOS = fmod(ZMOS, TWOPI); + } + + /* DO SOLAR TERMS */ + + SAVTSN = 1.0E20; + ZCOSG = ZCOSGS; + ZSING = ZSINGS; + ZCOSI = ZCOSIS; + ZSINI = ZSINIS; + ZCOSH = COSQ; + ZSINH = SINQ; + CC = C1SS; + ZN = ZNS; + ZE = ZES; + ZMO = ZMOS; + XNOI = 1.0 / XNQ; + + for(c = 0; c < 2; c++) { + A1 = ZCOSG * ZCOSH + ZSING * ZCOSI * ZSINH; + A3 = -ZSING * ZCOSH + ZCOSG * ZCOSI * ZSINH; + A7 = -ZCOSG * ZSINH + ZSING * ZCOSI * ZCOSH; + A8 = ZSING * ZSINI; + A9 = ZSING * ZSINH + ZCOSG * ZCOSI * ZCOSH; + A10 = ZCOSG * ZSINI; + A2 = COSIQ * A7 + SINIQ * A8; + A4 = COSIQ * A9 + SINIQ * A10; + A5 = - SINIQ * A7 + COSIQ * A8; + A6 = - SINIQ * A9 + COSIQ * A10; + + X1 = A1 * COSOMO + A2 * SINOMO; + X2 = A3 * COSOMO + A4 * SINOMO; + X3 = - A1 * SINOMO + A2 * COSOMO; + X4 = - A3 * SINOMO + A4 * COSOMO; + X5 = A5 * SINOMO; + X6 = A6 * SINOMO; + X7 = A5 * COSOMO; + X8 = A6 * COSOMO; + + Z31 = 12.0 * X1 * X1 -3.0 * X3 * X3; + Z32 = 24.0 * X1 * X2 -6.0 * X3 * X4; + Z33 = 12.0 * X2 * X2 -3.0 * X4 * X4; + Z1 = 3.0 * (A1 * A1 + A2 * A2) + Z31 * EQSQ; + Z2 = 6.0 * (A1 * A3 + A2 * A4) + Z32 * EQSQ; + Z3 = 3.0 * (A3 * A3 + A4 * A4) + Z33 * EQSQ; + Z11 = -6.0 * A1 * A5 + EQSQ * (-24.0 * X1 * X7 - 6.0 * X3 * X5); + + Z12 = -6.0 * (A1 * A6 + A3 * A5) + + EQSQ * (-24.0 * (X2 * X7 + X1 * X8) - 6.0 * (X3 * X6 + X4 * X5)); + + Z13 = -6.0 * A3 * A6 + EQSQ * (-24.0 * X2 * X8 - 6.0 * X4 * X6); + Z21 = 6.0 * A2 * A5 + EQSQ * (24.0 * X1 * X5 - 6.0 * X3 * X7); + + Z22 = 6.0 * (A4 * A5 + A2 * A6) + + EQSQ * (24.0 * (X2 * X5 + X1 * X6) - 6.0 * (X4 * X7 + X3 * X8)); + + Z23 = 6.0 * A4 * A6 + EQSQ * (24.0 * X2 * X6 - 6.0 * X4 * X8); + Z1 = Z1 + Z1 + BSQ * Z31; + Z2 = Z2 + Z2 + BSQ * Z32; + Z3 = Z3 + Z3 + BSQ * Z33; + S3 = CC * XNOI; + S2 = -.5 * S3 / RTEQSQ; + S4 = S3 * RTEQSQ; + S1 = -15.0 * EQ * S4; + S5 = X1 * X3 + X2 * X4; + S6 = X2 * X3 + X1 * X4; + S7 = X2 * X4 - X1 * X3; + SE = S1 * ZN * S5; + SI = S2 * ZN * (Z11 + Z13); + SL = -ZN * S3 * (Z1 + Z3 - 14.0 - 6.0 * EQSQ); + SGH = S4 * ZN * (Z31 + Z33 - 6.0); + SH = -ZN * S2 * (Z21 + Z23); + + if(XQNCL < 5.2359877E-2) + SH = 0.0; + + EE2 = 2.0 * S1 * S6; + E3 = 2.0 * S1 * S7; + XI2 = 2.0 * S2 * Z12; + XI3 = 2.0 * S2 * (Z13 - Z11); + XL2 = -2.0 * S3 * Z2; + XL3 = -2.0 * S3 * (Z3 - Z1); + XL4 = -2.0 * S3 * (-21.0 - 9.0 * EQSQ) * ZE; + XGH2 = 2.0 * S4 * Z32; + XGH3 = 2.0 * S4 * (Z33 - Z31); + XGH4 = -18.0 * S4 * ZE; + XH2 = -2.0 * S2 * Z22; + XH3 = -2.0 * S2 * (Z23 - Z21); + + if(c == 0) { + /* DO LUNAR TERMS */ + SSE = SE; + SSI = SI; + SSL = SL; + SSH = SH / SINIQ; + SSG = SGH - COSIQ * SSH; + SE2 = EE2; + SI2 = XI2; + SL2 = XL2; + SGH2 = XGH2; + SH2 = XH2; + SE3 = E3; + SI3 = XI3; + SL3 = XL3; + SGH3 = XGH3; + SH3 = XH3; + SL4 = XL4; + SGH4 = XGH4; + + ZCOSG = ZCOSGL; + ZSING = ZSINGL; + ZCOSI = ZCOSIL; + ZSINI = ZSINIL; + ZCOSH = ZCOSHL * COSQ + ZSINHL * SINQ; + ZSINH = SINQ * ZCOSHL - COSQ * ZSINHL; + ZN = ZNL; + CC = C1L; + ZE = ZEL; + ZMO = ZMOL; + } + } + + SSE = SSE + SE; + SSI = SSI + SI; + SSL = SSL + SL; + SSG = SSG + SGH - COSIQ / SINIQ * SH; + SSH = SSH + SH / SINIQ; + + /* GEOPOTENTIAL RESONANCE INITIALIZATION FOR 12 HOUR ORBITS */ + + IRESFL = 0; + ISYNFL = 0; + + if(XNQ <= .0034906585 || XNQ >= .0052359877) { + + if(XNQ < (8.26E-3) || XNQ > (9.24E-3)) + return; + + if(EQ < 0.5) + return; + + IRESFL = 1; + EOC = EQ * EQSQ; + G201 = -.306 - (EQ - .64) * .440; + + if(EQ <= (.65)) { + G211 = 3.616 - 13.247 * EQ + 16.290 * EQSQ; + G310 = -19.302 + 117.390 * EQ - 228.419 * EQSQ + 156.591 * EOC; + G322 = -18.9068 + 109.7927 * EQ - 214.6334 * EQSQ + 146.5816 * EOC; + G410 = -41.122 + 242.694 * EQ - 471.094 * EQSQ + 313.953 * EOC; + G422 = -146.407 + 841.880 * EQ - 1629.014 * EQSQ + 1083.435 * EOC; + G520 = -532.114 + 3017.977 * EQ - 5740 * EQSQ + 3708.276 * EOC; + } else { + G211 = -72.099 + 331.819 * EQ - 508.738 * EQSQ + 266.724 * EOC; + G310 = -346.844 + 1582.851 * EQ - 2415.925 * EQSQ + 1246.113 * EOC; + G322 = -342.585 + 1554.908 * EQ - 2366.899 * EQSQ + 1215.972 * EOC; + G410 = -1052.797 + 4758.686 * EQ - 7193.992 * EQSQ + + 3651.957 * EOC; + G422 = -3581.69 + 16178.11 * EQ - 24462.77 * EQSQ + 12422.52 * EOC; + + if(EQ > (.715)) + G520 = -5149.66 + 29936.92 * EQ - 54087.36 * EQSQ + + 31324.56 * EOC; + + G520 = 1464.74 - 4664.75 * EQ + 3763.64 * EQSQ; + } + + if(EQ < (.7)) { + G533 = -919.2277 + 4988.61 * EQ - 9064.77 * EQSQ + 5542.21 * EOC; + + G521 = -822.71072 + 4568.6173 * EQ - 8491.4146 * EQSQ + + 5337.524 * EOC; + + G532 = -853.666 + 4690.25 * EQ - 8624.77 * EQSQ + 5341.4 * EOC; + } else { + G533 = -37995.78 + 161616.52 * EQ - 229838.2 * EQSQ + + 109377.94 * EOC; + + G521 = -51752.104 + 218913.95 * EQ - 309468.16 * EQSQ + + 146349.42 * EOC; + + G532 = -40023.88 + 170470.89 * EQ - 242699.48 * EQSQ + + 115605.82 * EOC; + } + + SINI2 = SINIQ * SINIQ; + F220 = .75 * (1.0 + 2.0 * COSIQ + COSQ2); + F221 = 1.5 * SINI2; + F321 = 1.875 * SINIQ * (1.0 - 2.0 * COSIQ - 3.0 * COSQ2); + F322 = -1.875 * SINIQ * (1.0 + 2.0 * COSIQ - 3.0 * COSQ2); + F441 = 35.0 * SINI2 * F220; + F442 = 39.3750 * SINI2 * SINI2; + + F522 = 9.84375 * SINIQ * (SINI2 * (1.0 - 2.0 * COSIQ - 5.0 * COSQ2) + + .33333333 * (-2.0 + 4.0 * COSIQ + + 6.0 * COSQ2)); + + F523 = SINIQ * (4.92187512 * SINI2 * (-2.0 - 4.0 * COSIQ + + 10.0 * COSQ2) + + 6.56250012 * (1.0 + + 2.0 * COSIQ - + 3.0 * COSQ2)); + + F542 = 29.53125 * SINIQ * (2.0 - 8.0 * COSIQ + + COSQ2 * (-12.0 + 8.0 * COSIQ + + 10.0 * COSQ2)); + + F543 = 29.53125 * SINIQ * (-2.0 - 8.0 * COSIQ + + COSQ2 * (12.0 + 8.0 * COSIQ - + 10.0 * COSQ2)); + + XNO2 = XNQ * XNQ; + AINV2 = AQNV * AQNV; + TEMP1 = 3.0 * XNO2 * AINV2; + TEMP = TEMP1 * ROOT22; + D2201 = TEMP * F220 * G201; + D2211 = TEMP * F221 * G211; + TEMP1 = TEMP1 * AQNV; + TEMP = TEMP1 * ROOT32; + D3210 = TEMP * F321 * G310; + D3222 = TEMP * F322 * G322; + TEMP1 = TEMP1 * AQNV; + TEMP = 2.0 * TEMP1 * ROOT44; + D4410 = TEMP * F441 * G410; + D4422 = TEMP * F442 * G422; + TEMP1 = TEMP1 * AQNV; + TEMP = TEMP1 * ROOT52; + D5220 = TEMP * F522 * G520; + D5232 = TEMP * F523 * G532; + TEMP = 2.0 * TEMP1 * ROOT54; + D5421 = TEMP * F542* G521; + D5433 = TEMP * F543* G533; + XLAMO = XMAO + XNODEO + XNODEO - THGR - THGR; + BFACT = XLLDOT + XNODOT + XNODOT - THDT - THDT; + BFACT = BFACT + SSL + SSH + SSH; + } else { + /* SYNCHRONOUS RESONANCE TERMS INITIALIZATION */ + + IRESFL = 1; + ISYNFL = 1; + G200 = 1.0 + EQSQ * (-2.5 + .8125 * EQSQ); + G310 = 1.0 + 2.0 * EQSQ; + G300 = 1.0 + EQSQ * (-6.0 + 6.60937 * EQSQ); + F220 = .75 * (1.0 + COSIQ) * (1.0 + COSIQ); + F311 = .9375 * SINIQ * SINIQ * (1.0 + 3.0 * COSIQ) - + .75 * (1.0 + COSIQ); + F330 = 1.0 + COSIQ; + F330 = 1.875 * F330 * F330 * F330; + DEL1 = 3.0 * XNQ * XNQ * AQNV * AQNV; + DEL2 = 2.0 * DEL1 * F220 * G200 * Q22; + DEL3 = 3.0 * DEL1 * F330 * G300 * Q33 * AQNV; + DEL1 = DEL1 * F311 * G310 * Q31 * AQNV; + FASX2 = .13130908; + FASX4 = 2.8843198; + FASX6 = .37448087; + XLAMO = XMAO + XNODEO + OMEGAO - THGR; + BFACT = XLLDOT + XPIDOT - THDT; + BFACT = BFACT + SSL + SSG + SSH; + + } + + XFACT = BFACT - XNQ; + + XLI = XLAMO; + XNI = XNQ; + ATIME = 0.0; + STEPP = 720.0; + STEPN = -720.0; + STEP2 = 259200.0; +} + +/* ENTRANCE FOR DEEP SPACE SECULAR EFFECTS */ + +void +dpsec(SatData *sat, double *XLL, double *OMGASM, double *XNODES, + double *EM, double *XINC, double *XN, double T) +{ + double DELT, XL, TEMP, XOMI, X2OMI, X2LI, XLDOT; + double XNDOT, XNDDT, FT; + int state, iret, iretn, done; + + DELT = XLDOT = XNDOT = XNDDT = FT = 0.0; + iret = iretn = 0; + +#if 0 + DELT = XL = TEMP = XOMI = X2OMI = X2LI = XLDOT = signaling_nan(); + XNDOT = XNDDT = FT = signaling_nan(); +#endif + + *XLL = *XLL + SSL * T; + *OMGASM = *OMGASM + SSG * T; + *XNODES = *XNODES + SSH * T; + *EM = EO + SSE * T; + *XINC = XINCL + SSI * T; + + if(*XINC < 0.0) { + *XINC = -*XINC; + *XNODES = *XNODES + PI; + *OMGASM = *OMGASM - PI; + } + + if(IRESFL == 0) + return; + + state = 1; + done = 0; + while(!done) { + /* printf("state = %d\n", state); */ + switch(state) { + case 1: + /* + * Chunk #1 + */ + if(ATIME == 0.0 || (T >= 0.0 && ATIME < 0.0) || + (T < 0.0 && ATIME >= 0.0)) { + /* + * Chunk #10 + */ + if(T >= 0.0) + DELT = STEPP; + else + DELT = STEPN; + + ATIME = 0.0; + XNI = XNQ; + XLI = XLAMO; + state = 4; + break; + } + + /* Fall through */ + case 2: + /* + * Chunk #2 + */ + if(fabs(T) < fabs(ATIME)) { + /* + * Chunk #2 + */ + if(T >= 0.0) + DELT = STEPN; + else + DELT = STEPP; + + iret = 1; + state = 8; + break; + } + + /* + * Chunk #3 + */ + if(T > 0.0) + DELT = STEPP; + else + DELT = STEPN; + + /* fall through */ + case 4: + /* + * Chunk #4 + */ + if(fabs(T - ATIME) >= STEPP) { + iret = 4; + state = 8; + } else { + /* + * Chunk #5 + */ + FT = T - ATIME; + iretn = 6; + state = 7; + } + + break; + + case 6: + /* + * Chunk #6 + */ + *XN = XNI + XNDOT * FT + XNDDT * FT * FT * 0.5; + XL = XLI + XLDOT * FT + XNDOT * FT * FT * 0.5; + TEMP = -*XNODES + THGR + T * THDT; + + if(ISYNFL == 0) + *XLL = XL + 2.0 * TEMP; + else + *XLL = XL - *OMGASM + TEMP; + + done = 1; + break; + + case 7: + /* DOT TERMS CALCULATED */ + + /* + * Chunk #7 + */ + if(ISYNFL != 0) { + XNDOT = + DEL1 * sin(XLI - FASX2) + + DEL2 * sin(2.0 * (XLI - FASX4)) + + DEL3 * sin(3.0 * (XLI - FASX6)); + + XNDDT = + DEL1 * cos(XLI - FASX2) + + 2.0 * DEL2 * cos(2.0 * (XLI - FASX4)) + + 3.0 * DEL3 * cos(3.0 * (XLI - FASX6)); + } else { + XOMI = OMEGAQ + s_OMGDT * ATIME; + X2OMI = XOMI + XOMI; + X2LI = XLI + XLI; + XNDOT = D2201 * sin(X2OMI + XLI - G22) + + D2211 * sin(XLI - G22) + + D3210 * sin(XOMI + XLI - G32) + + D3222 * sin(- XOMI + XLI - G32) + + D4410 * sin(X2OMI + X2LI - G44) + + D4422 * sin(X2LI - G44) + + D5220 * sin(XOMI + XLI - G52) + + D5232 * sin(- XOMI + XLI - G52) + + D5421 * sin(XOMI + X2LI - G54) + + D5433 * sin(- XOMI + X2LI - G54); + + XNDDT = D2201 * cos(X2OMI + XLI - G22) + + D2211 * cos(XLI - G22) + + D3210 * cos(XOMI + XLI - G32) + + D3222 * cos(- XOMI + XLI - G32) + + D5220 * cos(XOMI + XLI - G52) + + D5232 * cos(- XOMI + XLI - G52) + + 2.*(D4410 * cos(X2OMI + X2LI - G44) + + D4422 * cos(X2LI - G44) + + D5421 * cos(XOMI + X2LI - G54) + + D5433 * cos(- XOMI + X2LI - G54)); + } + + XLDOT = XNI + XFACT; + XNDDT = XNDDT * XLDOT; + + state = iretn; + break; + + case 8: + /* + * Chunk #8 + */ + + /* INTEGRATOR */ + iretn = 9; + state = 7; + break; + + case 9: + XLI = XLI + XLDOT * DELT + XNDOT * STEP2; + XNI = XNI + XNDOT * DELT + XNDDT * STEP2; + ATIME = ATIME + DELT; + + state = iret; + break; + } + } +} + +/* local */ + +/* C */ +/* C ENTRANCES FOR LUNAR-SOLAR PERIODICS */ +/* C */ +/* C */ +/* ENTRY DPPER(EM,XINC,OMGASM,XNODES,XLL) */ +void +dpper(SatData *sat, double *EM, double *XINC, double *OMGASM, + double *XNODES, double *XLL, double T) +{ + double SINIS, COSIS, ZM, ZF, SINZF, F2, F3, SES, SIS, SLS, SEL, SIL, SLL, PGH, PH, SINOK, COSOK, ALFDP, BETDP, DALF, DBET, XLS, DLS; + +#if 0 + SINIS = COSIS = ZM = ZF = SINZF = F2 = F3 = SES = SIS = signaling_nan(); + SLS = SEL = SIL = SLL = PGH = signaling_nan(); + PH = SINOK = COSOK = ALFDP = BETDP = DALF = DBET = XLS = signaling_nan(); + DLS = signaling_nan();; +#endif + SINIS = sin(*XINC); + COSIS = cos(*XINC); + + +/* IF (DABS(SAVTSN-T).LT.(30.D0)) GO TO 210 */ + if(fabs(SAVTSN - T) >= (30.0)) { + SAVTSN = T; + ZM = ZMOS + ZNS * T; +/* 205 ZF = ZM + 2.0 * ZES * sin(ZM) */ + ZF = ZM + 2.0 * ZES * sin(ZM); + SINZF = sin(ZF); + F2 = .5 * SINZF * SINZF - .25; + F3 = -.5 * SINZF * cos(ZF); + SES = SE2 * F2 + SE3 * F3; + SIS = SI2 * F2 + SI3 * F3; + SLS = SL2 * F2 + SL3 * F3 + SL4 * SINZF; + SGHS = SGH2 * F2 + SGH3 * F3 + SGH4 * SINZF; + SHS = SH2 * F2 + SH3 * F3; + ZM = ZMOL + ZNL * T; + ZF = ZM + 2.0 * ZEL * sin(ZM); + SINZF = sin(ZF); + F2 = .5 * SINZF * SINZF -.25; + F3 = -.5 * SINZF * cos(ZF); + SEL = EE2 * F2 + E3 * F3; + SIL = XI2 * F2 + XI3 * F3; + SLL = XL2 * F2 + XL3 * F3 + XL4 * SINZF; + SGHL = XGH2 * F2 + XGH3 * F3 + XGH4 * SINZF; + SHL = XH2 * F2 + XH3 * F3; + PE = SES + SEL; + PINC = SIS + SIL; + PL = SLS + SLL; + } + +/* 210 PGH=SGHS+SGHL */ + PGH = SGHS + SGHL; + PH = SHS + SHL; + *XINC = *XINC + PINC; + *EM = *EM + PE; + +/* IF(XQNCL.LT.(.2)) GO TO 220 */ + if(XQNCL >= (.2)) { +/* GO TO 218 */ +/* C */ +/* C APPLY PERIODICS DIRECTLY */ +/* C */ +/* 218 PH=PH/SINIQ */ + PH = PH / s_SINIQ; + PGH = PGH - s_COSIQ * PH; + *OMGASM = *OMGASM + PGH; + *XNODES = *XNODES + PH; + *XLL = *XLL + PL; +/* GO TO 230 */ + } else { +/* C */ +/* C APPLY PERIODICS WITH LYDDANE MODIFICATION */ +/* C */ +/* 220 SINOK=sin(XNODES) */ + SINOK = sin(*XNODES); + COSOK = cos(*XNODES); + ALFDP = SINIS * SINOK; + BETDP = SINIS * COSOK; + DALF = PH * COSOK + PINC * COSIS * SINOK; + DBET = -PH * SINOK + PINC * COSIS * COSOK; + ALFDP = ALFDP + DALF; + BETDP = BETDP + DBET; + XLS = *XLL + *OMGASM + COSIS * *XNODES; + DLS = PL + PGH - PINC * *XNODES * SINIS; + XLS = XLS + DLS; + *XNODES = actan(ALFDP, BETDP); + *XLL = *XLL + PL; + *OMGASM = XLS - *XLL - cos(*XINC) * *XNODES; + } +/* 230 CONTINUE */ +/* RETURN */ + +} +/* END */ + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: deep.c,v $ $Date: 2000/09/25 19:43:03 $ $Revision: 1.2 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/deepconst.h b/Common/Libraries/XEphemAstroLib/src/deepconst.h new file mode 100644 index 000000000..8c715676a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/deepconst.h @@ -0,0 +1,34 @@ +#ifndef _CONST_H +#define _CONST_H + +/* $Id: deepconst.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + + +#define GE (3.986005E14) + +#define PI (3.1415926535897932385) + +#define XKE (7.43669161E-2) +#define CK2 (5.413080E-4) +#define CK4 (6.2098875E-7) +#define E6A (10E6) +#define QOMS2T (1.88027916E-9) +#define S (1.01222928) +#define TOTHRD (2.0/3.0) /* 6.6666666666666666667E-1 */ +#define XJ3 (-2.53881E-6) +/* #define XKE KE */ +#define XKMPER (6378.135) +#define XMNPDA (1440.0) +#define AE (1.0) +#define DE2RA (1.7453292519943295769E-2) +#define PIO2 (1.57079632679489661925) /* PI/2 */ +#define TWOPI (6.2831853071795864770) +#define X3PIO2 (4.7123889803846898578) /* 3*PI/2 */ + +#define RHO (0.15696590235) + +#endif /* _CONST_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: deepconst.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/deltat.c b/Common/Libraries/XEphemAstroLib/src/deltat.c new file mode 100644 index 000000000..fb92df726 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/deltat.c @@ -0,0 +1,334 @@ +/* DeltaT = Ephemeris Time - Universal Time + * + * Adapted 2011/4/14 from Stephen Moshier , + * cosmetic changes only. + * + * Compile as follows to create stand-alone test program: + * cc -DTEST_MAIN deltat.c libastro.a + * + * Tabulated values of deltaT, in hundredths of a second, are + * from The Astronomical Almanac and current IERS reports. + * A table of values for the pre-telescopic period was taken from + * Morrison and Stephenson (2004). The overall tabulated range is + * -1000.0 through 2011.0. Values at intermediate times are interpolated + * from the tables. + * + * For dates earlier and later than the tabulated range, the program + * calculates a polynomial extrapolation formula. + * + * Updated deltaT predictions can be obtained from this network archive, + * http://maia.usno.navy.mil + * then appended to the dt[] table and update TABEND. + * + * Input is XEphem's MJD, output is ET-UT in seconds. + * + * + * References: + * + * Morrison, L. V., and F. R. Stephenson, Historical values of the Earth's + * clock error deltat T and the calculation of eclipses. Journal for the + * History of Astronomy 35, 327-336 (2004) + * + * Stephenson, F. R., and L. V. Morrison, "Long-term changes + * in the rotation of the Earth: 700 B.C. to A.D. 1980," + * Philosophical Transactions of the Royal Society of London + * Series A 313, 47-70 (1984) + * + * Chapront-Touze, Michelle, and Jean Chapront, _Lunar Tables + * and Programs from 4000 B.C. to A.D. 8000_, Willmann-Bell 1991 + * + * Stephenson, F. R., and M. A. Houlden, _Atlas of Historical + * Eclipse Maps_, Cambridge U. Press (1986) + * + */ + +#include + +#include "astro.h" + +#define TABSTART 1620 +#define TABEND 2011 +#define TABSIZ (TABEND - TABSTART + 1) + +/* Morrison and Stephenson (2004) + * This table covers -1000 through 1700 in 100-year steps. + * Values are in whole seconds. + * Estimated standard error at -1000 is 640 seconds; at 1600, 20 seconds. + * The first value in the table has been adjusted 28 sec for + * continuity with their long-term quadratic extrapolation formula. + * The last value in this table agrees with the AA table at 1700, + * so there is no discontinuity at either endpoint. + */ +#define MS_SIZ 28 +short m_s[MS_SIZ] = { + /* -1000 to -100 */ + 25428, 23700, 22000, 21000, 19040, 17190, 15530, 14080, 12790, 11640, + + /* 0 to 900 */ + 10580, 9600, 8640, 7680, 6700, 5710, 4740, 3810, 2960, 2200, + + /* 1000 to 1700 */ + 1570, 1090, 740, 490, 320, 200, 120, 9, +}; + + +/* Entries prior to 1955 in the following table are from + * the 1984 Astronomical Almanac and assume ndot = -26.0. + * For dates prior to 1700, the above table is used instead of this one. + */ +short dt[TABSIZ] = { + /* 1620.0 thru 1659.0 */ + 12400, 11900, 11500, 11000, 10600, 10200, 9800, 9500, 9100, 8800, + 8500, 8200, 7900, 7700, 7400, 7200, 7000, 6700, 6500, 6300, + 6200, 6000, 5800, 5700, 5500, 5400, 5300, 5100, 5000, 4900, + 4800, 4700, 4600, 4500, 4400, 4300, 4200, 4100, 4000, 3800, + + /* 1660.0 thru 1699.0 */ + 3700, 3600, 3500, 3400, 3300, 3200, 3100, 3000, 2800, 2700, + 2600, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700, + 1600, 1500, 1400, 1400, 1300, 1200, 1200, 1100, 1100, 1000, + 1000, 1000, 900, 900, 900, 900, 900, 900, 900, 900, + + /* 1700.0 thru 1739.0 */ + 900, 900, 900, 900, 900, 900, 900, 900, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1100, 1100, 1100, + 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, + 1100, 1100, 1100, 1100, 1200, 1200, 1200, 1200, 1200, 1200, + + /* 1740.0 thru 1779.0 */ + 1200, 1200, 1200, 1200, 1300, 1300, 1300, 1300, 1300, 1300, + 1300, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1500, 1500, + 1500, 1500, 1500, 1500, 1500, 1600, 1600, 1600, 1600, 1600, + 1600, 1600, 1600, 1600, 1600, 1700, 1700, 1700, 1700, 1700, + + /* 1780.0 thru 1799.0 */ + 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, + 1700, 1700, 1600, 1600, 1600, 1600, 1500, 1500, 1400, 1400, + + /* 1800.0 thru 1819.0 */ + 1370, 1340, 1310, 1290, 1270, 1260, 1250, 1250, 1250, 1250, + 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1240, 1230, 1220, + + /* 1820.0 thru 1859.0 */ + 1200, 1170, 1140, 1110, 1060, 1020, 960, 910, 860, 800, + 750, 700, 660, 630, 600, 580, 570, 560, 560, 560, + 570, 580, 590, 610, 620, 630, 650, 660, 680, 690, + 710, 720, 730, 740, 750, 760, 770, 770, 780, 780, + + /* 1860.0 thru 1899.0 */ + 788, 782, 754, 697, 640, 602, 541, 410, 292, 182, + 161, 10, -102, -128, -269, -324, -364, -454, -471, -511, + -540, -542, -520, -546, -546, -579, -563, -564, -580, -566, + -587, -601, -619, -664, -644, -647, -609, -576, -466, -374, + + /* 1900.0 thru 1939.0 */ + -272, -154, -2, 124, 264, 386, 537, 614, 775, 913, + 1046, 1153, 1336, 1465, 1601, 1720, 1824, 1906, 2025, 2095, + 2116, 2225, 2241, 2303, 2349, 2362, 2386, 2449, 2434, 2408, + 2402, 2400, 2387, 2395, 2386, 2393, 2373, 2392, 2396, 2402, + + /* 1940.0 thru 1979.0 */ + 2433, 2483, 2530, 2570, 2624, 2677, 2728, 2778, 2825, 2871, + 2915, 2957, 2997, 3036, 3072, 3107, 3135, 3168, 3218, 3268, + 3315, 3359, 3400, 3447, 3503, 3573, 3654, 3743, 3829, 3920, + 4018, 4117, 4223, 4337, 4449, 4548, 4646, 4752, 4853, 4959, + + /* 1980.0 thru 2011.0 */ + 5054, 5138, 5217, 5296, 5379, 5434, 5487, 5532, 5582, 5630, + 5686, 5757, 5831, 5912, 5998, 6078, 6163, 6230, 6297, 6347, + 6383, 6409, 6430, 6447, 6457, 6469, 6485, 6515, 6546, 6578, + 6607, 6632, +}; + + +/* Given MJD return DeltaT = ET - UT1 in seconds. Describes the irregularities + * of the Earth rotation rate in the ET time scale. + */ +double +deltat(double mj) +{ + static double ans, lastmj; + double Y, p, B; + int d[6]; + int i, iy, k; + + if (mj == lastmj) + return (ans); + lastmj = mj; + + mjd_year (mj, &Y); + + if( Y > TABEND ) { + /* Extrapolate future values beyond the lookup table. */ + if (Y > (TABEND + 100.0)) { + /* Morrison & Stephenson (2004) long-term curve fit. */ + B = 0.01 * (Y - 1820.0); + ans = 32.0 * B * B - 20.0; + + } else { + + double a, b, c, d, m0, m1; + + /* Cubic interpolation between last tabulated value + * and long-term curve evaluated at 100 years later. + */ + + /* Last tabulated delta T value. */ + a = 0.01 * dt[TABSIZ-1]; + /* Approximate slope in past 10 years. */ + b = 0.001 * (dt[TABSIZ-1] - dt[TABSIZ - 11]); + + /* Long-term curve 100 years hence. */ + B = 0.01 * (TABEND + 100.0 - 1820.0); + m0 = 32.0 * B*B - 20.0; + /* Its slope. */ + m1 = 0.64 * B; + + /* Solve for remaining coefficients of an interpolation polynomial + * that agrees in value and slope at both ends of the 100-year + * interval. + */ + d = 2.0e-6 * (50.0 * (m1 + b) - m0 + a); + c = 1.0e-4 * (m0 - a - 100.0 * b - 1.0e6 * d); + + /* Note, the polynomial coefficients do not depend on Y. + * A given tabulation and long-term formula + * determine the polynomial. + * Thus, for the IERS table ending at 2011.0, the coefficients are + * a = 66.32 + * b = 0.223 + * c = 0.03231376 + * d = -0.0001607784 + */ + + /* Compute polynomial value at desired time. */ + p = Y - TABEND; + ans = a + p * (b + p * (c + p * d)); + } + + return (ans); + } + + + /* Use Morrison and Stephenson (2004) prior to the year 1700. */ + if( Y < 1700.0 ) { + if (Y <= -1000.0) { + /* Morrison and Stephenson long-term fit. */ + B = 0.01 * (Y - 1820.0); + ans = 32.0 * B * B - 20.0; + + } else { + + /* Morrison and Stephenson recommend linear interpolation + * between tabulations. + */ + iy = Y; + iy = (iy + 1000) / 100; /* Integer index into the table. */ + B = -1000 + 100 * iy; /* Starting year of tabulated interval. */ + p = m_s[iy]; + ans = p + 0.01 * (Y - B) * (m_s[iy + 1] - p); + } + + return (ans); + } + + /* Besselian interpolation between tabulated values + * in the telescopic era. + * See AA page K11. + */ + + /* Index into the table. */ + p = floor(Y); + iy = (int) (p - TABSTART); + /* Zeroth order estimate is value at start of year */ + ans = dt[iy]; + k = iy + 1; + if( k >= TABSIZ ) + goto done; /* No data, can't go on. */ + + /* The fraction of tabulation interval */ + p = Y - p; + + /* First order interpolated value */ + ans += p*(dt[k] - dt[iy]); + if( (iy-1 < 0) || (iy+2 >= TABSIZ) ) + goto done; /* can't do second differences */ + + /* Make table of first differences */ + k = iy - 2; + for (i=0; i<5; i++) { + if( (k < 0) || (k+1 >= TABSIZ) ) + d[i] = 0; + else + d[i] = dt[k+1] - dt[k]; + k += 1; + } + + /* Compute second differences */ + for( i=0; i<4; i++ ) + d[i] = d[i+1] - d[i]; + B = 0.25*p*(p-1.0); + ans += B*(d[1] + d[2]); + if (iy+2 >= TABSIZ) + goto done; + + /* Compute third differences */ + for( i=0; i<3; i++ ) + d[i] = d[i+1] - d[i]; + B = 2.0*B/3.0; + ans += (p-0.5)*B*d[1]; + if ((iy-2 < 0) || (iy+3 > TABSIZ) ) + goto done; + + /* Compute fourth differences */ + for( i=0; i<2; i++ ) + d[i] = d[i+1] - d[i]; + B = 0.125*B*(p+1.0)*(p-2.0); + ans += B*(d[0] + d[1]); + + done: + + ans *= 0.01; + +#if 0 /* ndot = -26.0 assumed; no correction. */ + + /* Astronomical Almanac table is corrected by adding the expression + * -0.000091 (ndot + 26)(year-1955)^2 seconds + * to entries prior to 1955 (AA page K8), where ndot is the secular + * tidal term in the mean motion of the Moon. + * + * Entries after 1955 are referred to atomic time standards and + * are not affected by errors in Lunar or planetary theory. + */ + if( Y < 1955.0 ) + { + B = (Y - 1955.0); + #if 1 + ans += -0.000091 * (-25.8 + 26.0) * B * B; + #else + ans += -0.000091 * (-23.8946 + 26.0) * B * B; + #endif + } + +#endif /* 0 */ + + return( ans ); +} + + +#ifdef TEST_MAIN + +/* Exercise program. + */ +#include +#include + +int main(int ac, char *av[]) +{ + double ans, mj, y = atof(av[1]); + year_mjd (y, &mj); + ans = deltat(mj); + printf( "%.4lf\n", ans ); + return (0); +} +#endif diff --git a/Common/Libraries/XEphemAstroLib/src/descrip.mms b/Common/Libraries/XEphemAstroLib/src/descrip.mms new file mode 100644 index 000000000..89be3eb38 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/descrip.mms @@ -0,0 +1,92 @@ +# Makefile for the basic astronomy routines. +# The idea is to compile and archive them into libastro.a + +# compiler and flags + +# gcc +CC = cc +#CFLAGS= -O2 -ffast-math -Wall + +# solaris +# CC = cc +# CFLAGS= -O + +# AIX +# CC = xlc +# CFLAGS= -O2 -qlanglvl=ansi -qarch=com -qmaxmem=16384 + +# HP-UX +# CC = cc +# CFLAGS= -Aa -fast + +HS = astro.h bdl.h chap95.h deepconst.h preferences.h satlib.h satspec.h \ + sattypes.h vector.h vsop87.h + +OBJS = \ + aa_hadec.obj, \ + aberration.obj, \ + actan.obj, \ + airmass.obj, \ + anomaly.obj, \ + ap_as.obj, \ + atlas.obj, \ + auxil.obj, \ + bdl.obj, \ + chap95.obj, \ + chap95_data.obj, \ + circum.obj, \ + comet.obj, \ + constel.obj, \ + dbfmt.obj, \ + deep.obj, \ + deltat.obj, \ + earthsat.obj, \ + eq_ecl.obj, \ + eq_gal.obj, \ + formats.obj, \ + helio.obj, \ + jupmoon.obj, \ + libration.obj, \ + magdecl.obj, \ + marsmoon.obj, \ + misc.obj, \ + mjd.obj, \ + moon.obj, \ + mooncolong.obj, \ + moonnf.obj, \ + nutation.obj, \ + obliq.obj, \ + parallax.obj, \ + parallactic.obj, \ + plans.obj, \ + plmoon.obj, \ + plshadow.obj, \ + precess.obj, \ + reduce.obj, \ + refract.obj, \ + rings.obj, \ + riset.obj, \ + riset_cir.obj, \ + satmoon.obj, \ + sdp4.obj, \ + sgp4.obj, \ + sphcart.obj, \ + sun.obj, \ + thetag.obj, \ + utc_gst.obj, \ + umoon.obj, \ + twobody.obj, \ + vsop87.obj, \ + vsop87_data.obj + +libastro.olb : $(OBJS) + lib/crea $@ $(OBJS) + +#libastro.so: $(HS) $(OBJS) +# $(CC) -shared -o $@ $(OBJS) + +clean : + del *.o;* + +# For RCS Only -- Do Not Edit +# @(#) $RCSfile: descrip.mms,v $ $Date: 2005/07/27 21:28:40 $ $Revision: 1.1 $ $Name: $ diff --git a/Common/Libraries/XEphemAstroLib/src/earthsat.c b/Common/Libraries/XEphemAstroLib/src/earthsat.c new file mode 100644 index 000000000..c86bea39a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/earthsat.c @@ -0,0 +1,792 @@ +/* this file contains routines to support Earth satellites. + * + * Orbit propagation is based on the NORAD SGP4/SDP4 code, as converted from + * the original FORTRAN to C by Magnus Backstrom. The paper "Spacetrack + * Report Number 3: Models for Propagation of NORAD Element Sets" describes + * the calculations. + * See http://www.celestrak.com/NORAD/documentation/spacetrk.pdf. + * + * A few topocentric routines are also used from the 'orbit' program which is + * Copyright (c) 1986,1987,1988,1989,1990 Robert W. Berger N3EMO + * + */ + +/* define this to use orbit's propagator +#define USE_ORBIT_PROPAGATOR + */ + +/* define this to print some stuff +#define ESAT_TRACE + */ + +#include +#include +#include +#include + +#include "astro.h" +#include "preferences.h" + +#include "vector.h" +#include "sattypes.h" +#include "satlib.h" + + +#define ESAT_MAG 2 /* fake satellite magnitude */ + +typedef double MAT3x3[3][3]; + +static int crazyOp (Now *np, Obj *op); +static void esat_prop (Now *np, Obj *op, double *SatX, double *SatY, double + *SatZ, double *SatVX, double *SatVY, double *SatVZ); +static void GetSatelliteParams (Obj *op); +static void GetSiteParams (Now *np); +static double Kepler (double MeanAnomaly, double Eccentricity); +static void GetSubSatPoint (double SatX, double SatY, double SatZ, + double T, double *Latitude, double *Longitude, double *Height); +static void GetSatPosition (double EpochTime, double EpochRAAN, + double EpochArgPerigee, double SemiMajorAxis, double Inclination, + double Eccentricity, double RAANPrecession, double PerigeePrecession, + double T, double TrueAnomaly, double *X, double *Y, double *Z, + double *Radius, double *VX, double *VY, double *VZ); +static void GetSitPosition (double SiteLat, double SiteLong, + double SiteElevation, double CrntTime, double *SiteX, double *SiteY, + double *SiteZ, double *SiteVX, double *SiteVY, MAT3x3 SiteMatrix); +static void GetRange (double SiteX, double SiteY, double SiteZ, + double SiteVX, double SiteVY, double SatX, double SatY, double SatZ, + double SatVX, double SatVY, double SatVZ, double *Range, + double *RangeRate); +static void GetTopocentric (double SatX, double SatY, double SatZ, + double SiteX, double SiteY, double SiteZ, MAT3x3 SiteMatrix, double *X, + double *Y, double *Z); +static void GetBearings (double SatX, double SatY, double SatZ, + double SiteX, double SiteY, double SiteZ, MAT3x3 SiteMatrix, + double *Azimuth, double *Elevation); +static int Eclipsed (double SatX, double SatY, double SatZ, + double SatRadius, double CrntTime); +static void InitOrbitRoutines (double EpochDay, int AtEod); + +#ifdef USE_ORBIT_PROPAGATOR +static void GetPrecession (double SemiMajorAxis, double Eccentricity, + double Inclination, double *RAANPrecession, double *PerigeePrecession); +#endif /* USE_ORBIT_PROPAGATOR */ + +/* stuff from orbit */ +/* char VersionStr[] = "N3EMO Orbit Simulator v3.9"; */ + +#ifdef PI2 +#undef PI2 +#endif + +#define PI2 (PI*2) + +#define MinutesPerDay (24*60.0) +#define SecondsPerDay (60*MinutesPerDay) +#define HalfSecond (0.5/SecondsPerDay) +#define EarthRadius 6378.16 /* Kilometers */ +#define C 2.997925e5 /* Kilometers/Second */ +#define RadiansPerDegree (PI/180) +#define ABS(x) ((x) < 0 ? (-(x)) : (x)) +#define SQR(x) ((x)*(x)) + +#define EarthFlat (1/298.25) /* Earth Flattening Coeff. */ +#define SiderealSolar 1.0027379093 +#define SidRate (PI2*SiderealSolar/SecondsPerDay) /* radians/second */ +#define GM 398600 /* Kilometers^3/seconds^2 */ + +#define Epsilon (RadiansPerDegree/3600) /* 1 arc second */ +#define SunRadius 695000 +#define SunSemiMajorAxis 149598845.0 /* Kilometers */ + +/* Keplerian Elements and misc. data for the satellite */ +static double EpochDay; /* time of epoch */ +static double EpochMeanAnomaly; /* Mean Anomaly at epoch */ +static long EpochOrbitNum; /* Integer orbit # of epoch */ +static double EpochRAAN; /* RAAN at epoch */ +static double epochMeanMotion; /* Revolutions/day */ +static double OrbitalDecay; /* Revolutions/day^2 */ +static double EpochArgPerigee; /* argument of perigee at epoch */ +static double Eccentricity; +static double Inclination; + +/* Site Parameters */ +static double SiteLat,SiteLong,SiteAltitude; + + +static double SidDay,SidReference; /* Date and sidereal time */ + +/* Keplerian elements for the sun */ +static double SunEpochTime,SunInclination,SunRAAN,SunEccentricity, + SunArgPerigee,SunMeanAnomaly,SunMeanMotion; + +/* values for shadow geometry */ +static double SinPenumbra,CosPenumbra; + + +/* given a Now and an Obj with info about an earth satellite in the es_* fields + * fill in the s_* sky fields describing the satellite. + * as usual, we compute the geocentric ra/dec precessed to np->n_epoch and + * compute topocentric altitude accounting for refraction. + * return 0 if all ok, else -1. + */ +int +obj_earthsat (Now *np, Obj *op) +{ + double Radius; /* From geocenter */ + double SatX,SatY,SatZ; /* In Right Ascension based system */ + double SatVX,SatVY,SatVZ; /* Kilometers/second */ + double SiteX,SiteY,SiteZ; + double SiteVX,SiteVY; + double SiteMatrix[3][3]; + double Height; + double SSPLat,SSPLong; + double Azimuth,Elevation,Range; + double RangeRate; + double dtmp; + double CrntTime; + double ra, dec; + +#ifdef ESAT_TRACE + printf ("\n"); + printf ("Name = %s\n", op->o_name); + printf ("current jd = %13.5f\n", mjd+MJD0); + printf ("current mjd = %g\n", mjd); + printf ("satellite jd = %13.5f\n", op->es_epoch+MJD0); + printf ("satellite mjd = %g\n", op->es_epoch); +#endif /* ESAT_TRACE */ + + /* xephem uses noon 12/31/1899 as 0; orbit uses midnight 1/1/1900. + * thus, xephem runs 12 hours, or 1/2 day, behind of what orbit wants. + */ + CrntTime = mjd + 0.5; + + /* extract the XEphem data forms into those used by orbit. + * (we still use some functions and names from orbit, thank you). + */ + InitOrbitRoutines(CrntTime, 1); + GetSatelliteParams(op); + GetSiteParams(np); + + /* propagate to np->n_mjd */ + esat_prop (np, op, &SatX, &SatY, &SatZ, &SatVX, &SatVY, &SatVZ); + Radius = sqrt (SatX*SatX + SatY*SatY + SatZ*SatZ); + + /* find geocentric EOD equatorial directly from xyz vector */ + dtmp = atan2 (SatY, SatX); + range (&dtmp, 2*PI); + op->s_gaera = (float) dtmp; + op->s_gaedec = (float) atan2 (SatZ, sqrt(SatX*SatX + SatY*SatY)); + + /* find topocentric from site location */ + GetSitPosition(SiteLat,SiteLong,SiteAltitude,CrntTime, + &SiteX,&SiteY,&SiteZ,&SiteVX,&SiteVY,SiteMatrix); + GetBearings(SatX,SatY,SatZ,SiteX,SiteY,SiteZ,SiteMatrix, + &Azimuth,&Elevation); + + op->s_az = Azimuth; + refract (pressure, temp, Elevation, &dtmp); + op->s_alt = dtmp; + + /* Range: line-of-site distance to satellite, m + * RangeRate: m/s + */ + GetRange(SiteX,SiteY,SiteZ,SiteVX,SiteVY, + SatX,SatY,SatZ,SatVX,SatVY,SatVZ,&Range,&RangeRate); + + op->s_range = (float)(Range*1000); /* we want m */ + op->s_rangev = (float)(RangeRate*1000); /* we want m/s */ + + /* SSPLat: sub-satellite latitude, rads + * SSPLong: sub-satellite longitude, >0 west, rads + * Height: height of satellite above ground, m + */ + GetSubSatPoint(SatX,SatY,SatZ,CrntTime, + &SSPLat,&SSPLong,&Height); + + op->s_elev = (float)(Height*1000); /* we want m */ + op->s_sublat = (float)SSPLat; + op->s_sublng = (float)(-SSPLong); /* we want +E */ + + op->s_eclipsed = Eclipsed(SatX,SatY,SatZ,Radius,CrntTime); + +#ifdef ESAT_TRACE + printf ("CrntTime = %g\n", CrntTime); + printf ("SatX = %g\n", SatX); + printf ("SatY = %g\n", SatY); + printf ("SatZ = %g\n", SatZ); + printf ("Radius = %g\n", Radius); + printf ("SatVX = %g\n", SatVX); + printf ("SatVY = %g\n", SatVY); + printf ("SatVZ = %g\n", SatVZ); + printf ("SiteX = %g\n", SiteX); + printf ("SiteY = %g\n", SiteY); + printf ("SiteZ = %g\n", SiteZ); + printf ("SiteVX = %g\n", SiteVX); + printf ("SiteVY = %g\n", SiteVY); + printf ("Height = %g\n", Height); + printf ("SSPLat = %g\n", SSPLat); + printf ("SSPLong = %g\n", SSPLong); + printf ("Azimuth = %g\n", Azimuth); + printf ("Elevation = %g\n", Elevation); + printf ("Range = %g\n", Range); + printf ("RangeRate = %g\n", RangeRate); + fflush (stdout); +#endif /* ESAT_TRACE */ + + /* find s_ra/dec, depending on current options. */ + if (pref_get(PREF_EQUATORIAL) == PREF_TOPO) { + double ha, lst; + aa_hadec (lat, Elevation, (double)op->s_az, &ha, &dec); + now_lst (np, &lst); + ra = hrrad(lst) - ha; + range (&ra, 2*PI); + } else { + ra = op->s_gaera; + dec = op->s_gaedec; + } + if (epoch != EOD) + precess (mjd, epoch, &ra, &dec); + op->s_ra = (float)ra; + op->s_dec = (float)dec; + + /* just make up a size and brightness */ + set_smag (op, ESAT_MAG); + op->s_size = (float)0; + + return (0); +} + +/* find position and velocity vector for given Obj at the given time. + * set USE_ORBIT_PROPAGATOR depending on desired propagator to use. + */ +static void +esat_prop (Now *np, Obj *op, double *SatX, double *SatY, double *SatZ, +double *SatVX, double *SatVY, double *SatVZ) +{ +#ifdef USE_ORBIT_PROPAGATOR + double ReferenceOrbit; /* Floating point orbit # at epoch */ + double CurrentOrbit; + long OrbitNum; + double RAANPrecession,PerigeePrecession; + double MeanAnomaly,TrueAnomaly; + double SemiMajorAxis; + double AverageMotion, /* Corrected for drag */ + CurrentMotion; + double Radius; + double CrntTime; + + if (crazyOp (np, op)) { + *SatX = *SatY = *SatZ = *SatVX = *SatVY = *SatVZ = 0; + return; + } + + SemiMajorAxis = 331.25 * exp(2*log(MinutesPerDay/epochMeanMotion)/3); + GetPrecession(SemiMajorAxis,Eccentricity,Inclination,&RAANPrecession, + &PerigeePrecession); + + ReferenceOrbit = EpochMeanAnomaly/PI2 + EpochOrbitNum; + + CrntTime = mjd + 0.5; + AverageMotion = epochMeanMotion + (CrntTime-EpochDay)*OrbitalDecay/2; + CurrentMotion = epochMeanMotion + (CrntTime-EpochDay)*OrbitalDecay; + + SemiMajorAxis = 331.25 * exp(2*log(MinutesPerDay/CurrentMotion)/3); + + CurrentOrbit = ReferenceOrbit + (CrntTime-EpochDay)*AverageMotion; + + OrbitNum = CurrentOrbit; + + MeanAnomaly = (CurrentOrbit-OrbitNum)*PI2; + + TrueAnomaly = Kepler(MeanAnomaly,Eccentricity); + + GetSatPosition(EpochDay,EpochRAAN,EpochArgPerigee,SemiMajorAxis, + Inclination,Eccentricity,RAANPrecession,PerigeePrecession, + CrntTime,TrueAnomaly,SatX,SatY,SatZ,&Radius,SatVX,SatVY,SatVZ); + +#ifdef ESAT_TRACE + printf ("O Radius = %g\n", Radius); + printf ("ReferenceOrbit = %g\n", ReferenceOrbit); + printf ("CurrentOrbit = %g\n", CurrentOrbit); + printf ("RAANPrecession = %g\n", RAANPrecession); + printf ("PerigeePrecession = %g\n", PerigeePrecession); + printf ("MeanAnomaly = %g\n", MeanAnomaly); + printf ("TrueAnomaly = %g\n", TrueAnomaly); + printf ("SemiMajorAxis = %g\n", SemiMajorAxis); + printf ("AverageMotion = %g\n", AverageMotion); + printf ("CurrentMotion = %g\n", CurrentMotion); +#endif /* ESAT_TRACE */ + +#else /* ! USE_ORBIT_PROPAGATOR */ +#define MPD 1440.0 /* minutes per day */ + + SatElem se; + SatData sd; + Vec3 posvec, velvec; + double dy; + double dt; + int yr; + + if (crazyOp (np, op)) { + *SatX = *SatY = *SatZ = *SatVX = *SatVY = *SatVZ = 0; + return; + } + + /* init */ + memset ((void *)&se, 0, sizeof(se)); + memset ((void *)&sd, 0, sizeof(sd)); + sd.elem = &se; + + /* se_EPOCH is packed as yr*1000 + dy, where yr is years since 1900 + * and dy is day of year, Jan 1 being 1 + */ + mjd_dayno (op->es_epoch, &yr, &dy); + yr -= 1900; + dy += 1; + se.se_EPOCH = yr*1000 + dy; + + /* others carry over with some change in units */ + se.se_XNO = op->es_n * (2*PI/MPD); /* revs/day to rads/min */ + se.se_XINCL = (float)degrad(op->es_inc); + se.se_XNODEO = (float)degrad(op->es_raan); + se.se_EO = op->es_e; + se.se_OMEGAO = (float)degrad(op->es_ap); + se.se_XMO = (float)degrad(op->es_M); + se.se_BSTAR = op->es_drag; + se.se_XNDT20 = op->es_decay*(2*PI/MPD/MPD); /*rv/dy^^2 to rad/min^^2*/ + + se.se_id.orbit = op->es_orbit; + + dt = (mjd-op->es_epoch)*MPD; + +#ifdef ESAT_TRACE + printf ("se_EPOCH : %30.20f\n", se.se_EPOCH); + printf ("se_XNO : %30.20f\n", se.se_XNO); + printf ("se_XINCL : %30.20f\n", se.se_XINCL); + printf ("se_XNODEO : %30.20f\n", se.se_XNODEO); + printf ("se_EO : %30.20f\n", se.se_EO); + printf ("se_OMEGAO : %30.20f\n", se.se_OMEGAO); + printf ("se_XMO : %30.20f\n", se.se_XMO); + printf ("se_BSTAR : %30.20f\n", se.se_BSTAR); + printf ("se_XNDT20 : %30.20f\n", se.se_XNDT20); + printf ("se_orbit : %30d\n", se.se_id.orbit); + printf ("dt : %30.20f\n", dt); +#endif /* ESAT_TRACE */ + + /* compute the state vectors */ + if (se.se_XNO >= (1.0/225.0)) + sgp4(&sd, &posvec, &velvec, dt); /* NEO */ + else + sdp4(&sd, &posvec, &velvec, dt); /* GEO */ + if (sd.prop.sgp4) + free (sd.prop.sgp4); /* sd.prop.sdp4 is in same union */ + if (sd.deep) + free (sd.deep); + + /* earth radii to km */ + *SatX = (ERAD/1000)*posvec.x; + *SatY = (ERAD/1000)*posvec.y; + *SatZ = (ERAD/1000)*posvec.z; + /* Minutes per day/Seconds by day = Minutes/Second = 1/60 */ + *SatVX = (ERAD*velvec.x)/(1000*60); + *SatVY =(ERAD*velvec.y)/(1000*60); + *SatVZ = (ERAD*velvec.z)/(1000*60); + +#endif +} + +/* return 1 if op is crazy @ np */ +static int +crazyOp (Now *np, Obj *op) +{ + /* toss if more than a year old */ + return (fabs(op->es_epoch - mjd) > 365); +} + +/* grab the xephem stuff from op and copy into orbit's globals. + */ +static void +GetSatelliteParams(Obj *op) +{ + /* the following are for the orbit functions */ + /* xephem uses noon 12/31/1899 as 0; orbit uses midnight 1/1/1900 as 1. + * thus, xephem runs 12 hours, or 1/2 day, behind of what orbit wants. + */ + EpochDay = op->es_epoch + 0.5; + + /* xephem stores inc in degrees; orbit wants rads */ + Inclination = degrad(op->es_inc); + + /* xephem stores RAAN in degrees; orbit wants rads */ + EpochRAAN = degrad(op->es_raan); + + Eccentricity = op->es_e; + + /* xephem stores arg of perigee in degrees; orbit wants rads */ + EpochArgPerigee = degrad(op->es_ap); + + /* xephem stores mean anomaly in degrees; orbit wants rads */ + EpochMeanAnomaly = degrad (op->es_M); + + epochMeanMotion = op->es_n; + + OrbitalDecay = op->es_decay; + + EpochOrbitNum = op->es_orbit; +} + + + +static void +GetSiteParams(Now *np) +{ + SiteLat = lat; + + /* xephem stores longitude as >0 east; orbit wants >0 west */ + SiteLong = 2.0*PI - lng; + + /* what orbit calls altitude xephem calls elevation and stores it from + * sea level in earth radii; orbit wants km + */ + SiteAltitude = elev*ERAD/1000.0; + + /* we don't implement a minimum horizon altitude cutoff + SiteMinElev = 0; + */ + +#ifdef ESAT_TRACE + printf ("SiteLat = %g\n", SiteLat); + printf ("SiteLong = %g\n", SiteLong); + printf ("SiteAltitude = %g\n", SiteAltitude); + fflush (stdout); +#endif +} + + +/* Solve Kepler's equation */ +/* Inputs: */ +/* MeanAnomaly Time Since last perigee, in radians. */ +/* PI2 = one complete orbit. */ +/* Eccentricity Eccentricity of orbit's ellipse. */ +/* Output: */ +/* TrueAnomaly Angle between perigee, geocenter, and */ +/* current position. */ + +static +double Kepler(double MeanAnomaly, double Eccentricity) +{ +register double E; /* Eccentric Anomaly */ +register double Error; +register double TrueAnomaly; + + E = MeanAnomaly ;/*+ Eccentricity*sin(MeanAnomaly); -- Initial guess */ + do + { + Error = (E - Eccentricity*sin(E) - MeanAnomaly) + / (1 - Eccentricity*cos(E)); + E -= Error; + } + while (ABS(Error) >= Epsilon); + + if (ABS(E-PI) < Epsilon) + TrueAnomaly = PI; + else + TrueAnomaly = 2*atan(sqrt((1+Eccentricity)/(1-Eccentricity)) + *tan(E/2)); + if (TrueAnomaly < 0) + TrueAnomaly += PI2; + + return TrueAnomaly; +} + +static void +GetSubSatPoint(double SatX, double SatY, double SatZ, double T, +double *Latitude, double *Longitude, double *Height) +{ + double r; + /* ECD: long i; */ + + r = sqrt(SQR(SatX) + SQR(SatY) + SQR(SatZ)); + + *Longitude = PI2*((T-SidDay)*SiderealSolar + SidReference) + - atan2(SatY,SatX); + + /* ECD: + * want Longitude in range -PI to PI , +W + */ + range (Longitude, 2*PI); + if (*Longitude > PI) + *Longitude -= 2*PI; + + *Latitude = atan(SatZ/sqrt(SQR(SatX) + SQR(SatY))); + +#define SSPELLIPSE +#ifdef SSPELLIPSE + /* ECD */ + *Height = r - EarthRadius*(sqrt(1-(2*EarthFlat-SQR(EarthFlat))*SQR(sin(*Latitude)))); +#else + *Height = r - EarthRadius; +#endif +} + + +#ifdef USE_ORBIT_PROPAGATOR +static void +GetPrecession(double SemiMajorAxis, double Eccentricity, double Inclination, +double *RAANPrecession, double *PerigeePrecession) +{ + *RAANPrecession = 9.95*pow(EarthRadius/SemiMajorAxis,3.5) * cos(Inclination) + / SQR(1-SQR(Eccentricity)) * RadiansPerDegree; + + *PerigeePrecession = 4.97*pow(EarthRadius/SemiMajorAxis,3.5) + * (5*SQR(cos(Inclination))-1) + / SQR(1-SQR(Eccentricity)) * RadiansPerDegree; +} +#endif /* USE_ORBIT_PROPAGATOR */ + +/* Compute the satellite postion and velocity in the RA based coordinate + * system. + * ECD: take care not to let Radius get below EarthRadius. + */ + +static void +GetSatPosition(double EpochTime, double EpochRAAN, double EpochArgPerigee, +double SemiMajorAxis, double Inclination, double Eccentricity, +double RAANPrecession, double PerigeePrecession, double T, +double TrueAnomaly, double *X, double *Y, double *Z, double *Radius, +double *VX, double *VY, double *VZ) + +{ + double RAAN,ArgPerigee; + + + double Xw,Yw,VXw,VYw; /* In orbital plane */ + double Tmp; + double Px,Qx,Py,Qy,Pz,Qz; /* Escobal transformation 31 */ + double CosArgPerigee,SinArgPerigee; + double CosRAAN,SinRAAN,CoSinclination,SinInclination; + + *Radius = SemiMajorAxis*(1-SQR(Eccentricity)) + / (1+Eccentricity*cos(TrueAnomaly)); + + if (*Radius <= EarthRadius) + *Radius = EarthRadius; + + + Xw = *Radius * cos(TrueAnomaly); + Yw = *Radius * sin(TrueAnomaly); + + Tmp = sqrt(GM/(SemiMajorAxis*(1-SQR(Eccentricity)))); + + VXw = -Tmp*sin(TrueAnomaly); + VYw = Tmp*(cos(TrueAnomaly) + Eccentricity); + + ArgPerigee = EpochArgPerigee + (T-EpochTime)*PerigeePrecession; + RAAN = EpochRAAN - (T-EpochTime)*RAANPrecession; + + CosRAAN = cos(RAAN); SinRAAN = sin(RAAN); + CosArgPerigee = cos(ArgPerigee); SinArgPerigee = sin(ArgPerigee); + CoSinclination = cos(Inclination); SinInclination = sin(Inclination); + + Px = CosArgPerigee*CosRAAN - SinArgPerigee*SinRAAN*CoSinclination; + Py = CosArgPerigee*SinRAAN + SinArgPerigee*CosRAAN*CoSinclination; + Pz = SinArgPerigee*SinInclination; + Qx = -SinArgPerigee*CosRAAN - CosArgPerigee*SinRAAN*CoSinclination; + Qy = -SinArgPerigee*SinRAAN + CosArgPerigee*CosRAAN*CoSinclination; + Qz = CosArgPerigee*SinInclination; + + *X = Px*Xw + Qx*Yw; /* Escobal, transformation #31 */ + *Y = Py*Xw + Qy*Yw; + *Z = Pz*Xw + Qz*Yw; + + *VX = Px*VXw + Qx*VYw; + *VY = Py*VXw + Qy*VYw; + *VZ = Pz*VXw + Qz*VYw; +} + +/* Compute the site postion and velocity in the RA based coordinate + system. SiteMatrix is set to a matrix which is used by GetTopoCentric + to convert geocentric coordinates to topocentric (observer-centered) + coordinates. */ + +static void +GetSitPosition(double SiteLat, double SiteLong, double SiteElevation, +double CrntTime, double *SiteX, double *SiteY, double *SiteZ, double *SiteVX, +double *SiteVY, MAT3x3 SiteMatrix) +{ + static double G1,G2; /* Used to correct for flattening of the Earth */ + static double CosLat,SinLat; + static double OldSiteLat = -100000; /* Used to avoid unneccesary recomputation */ + static double OldSiteElevation = -100000; + double Lat; + double SiteRA; /* Right Ascension of site */ + double CosRA,SinRA; + + if ((SiteLat != OldSiteLat) || (SiteElevation != OldSiteElevation)) + { + OldSiteLat = SiteLat; + OldSiteElevation = SiteElevation; + Lat = atan(1/(1-SQR(EarthFlat))*tan(SiteLat)); + + CosLat = cos(Lat); + SinLat = sin(Lat); + + G1 = EarthRadius/(sqrt(1-(2*EarthFlat-SQR(EarthFlat))*SQR(SinLat))); + G2 = G1*SQR(1-EarthFlat); + G1 += SiteElevation; + G2 += SiteElevation; + } + + + SiteRA = PI2*((CrntTime-SidDay)*SiderealSolar + SidReference) + - SiteLong; + CosRA = cos(SiteRA); + SinRA = sin(SiteRA); + + + *SiteX = G1*CosLat*CosRA; + *SiteY = G1*CosLat*SinRA; + *SiteZ = G2*SinLat; + *SiteVX = -SidRate * *SiteY; + *SiteVY = SidRate * *SiteX; + + SiteMatrix[0][0] = SinLat*CosRA; + SiteMatrix[0][1] = SinLat*SinRA; + SiteMatrix[0][2] = -CosLat; + SiteMatrix[1][0] = -SinRA; + SiteMatrix[1][1] = CosRA; + SiteMatrix[1][2] = 0.0; + SiteMatrix[2][0] = CosRA*CosLat; + SiteMatrix[2][1] = SinRA*CosLat; + SiteMatrix[2][2] = SinLat; +} + +static void +GetRange(double SiteX, double SiteY, double SiteZ, double SiteVX, +double SiteVY, double SatX, double SatY, double SatZ, double SatVX, +double SatVY, double SatVZ, double *Range, double *RangeRate) +{ + double DX,DY,DZ; + + DX = SatX - SiteX; DY = SatY - SiteY; DZ = SatZ - SiteZ; + + *Range = sqrt(SQR(DX)+SQR(DY)+SQR(DZ)); + + *RangeRate = ((SatVX-SiteVX)*DX + (SatVY-SiteVY)*DY + SatVZ*DZ) + / *Range; +} + +/* Convert from geocentric RA based coordinates to topocentric + (observer centered) coordinates */ + +static void +GetTopocentric(double SatX, double SatY, double SatZ, double SiteX, +double SiteY, double SiteZ, MAT3x3 SiteMatrix, double *X, double *Y, +double *Z) +{ + SatX -= SiteX; + SatY -= SiteY; + SatZ -= SiteZ; + + *X = SiteMatrix[0][0]*SatX + SiteMatrix[0][1]*SatY + + SiteMatrix[0][2]*SatZ; + *Y = SiteMatrix[1][0]*SatX + SiteMatrix[1][1]*SatY + + SiteMatrix[1][2]*SatZ; + *Z = SiteMatrix[2][0]*SatX + SiteMatrix[2][1]*SatY + + SiteMatrix[2][2]*SatZ; +} + +static void +GetBearings(double SatX, double SatY, double SatZ, double SiteX, +double SiteY, double SiteZ, MAT3x3 SiteMatrix, double *Azimuth, +double *Elevation) +{ + double x,y,z; + + GetTopocentric(SatX,SatY,SatZ,SiteX,SiteY,SiteZ,SiteMatrix,&x,&y,&z); + + *Elevation = atan(z/sqrt(SQR(x) + SQR(y))); + + *Azimuth = PI - atan2(y,x); + + if (*Azimuth < 0) + *Azimuth += PI; +} + +static int +Eclipsed(double SatX, double SatY, double SatZ, double SatRadius, +double CrntTime) +{ + double MeanAnomaly,TrueAnomaly; + double SunX,SunY,SunZ,SunRad; + double vx,vy,vz; + double CosTheta; + + MeanAnomaly = SunMeanAnomaly+ (CrntTime-SunEpochTime)*SunMeanMotion*PI2; + TrueAnomaly = Kepler(MeanAnomaly,SunEccentricity); + + GetSatPosition(SunEpochTime,SunRAAN,SunArgPerigee,SunSemiMajorAxis, + SunInclination,SunEccentricity,0.0,0.0,CrntTime, + TrueAnomaly,&SunX,&SunY,&SunZ,&SunRad,&vx,&vy,&vz); + + CosTheta = (SunX*SatX + SunY*SatY + SunZ*SatZ)/(SunRad*SatRadius) + *CosPenumbra + (SatRadius/EarthRadius)*SinPenumbra; + + if (CosTheta < 0) + if (CosTheta < -sqrt(SQR(SatRadius)-SQR(EarthRadius))/SatRadius + *CosPenumbra + (SatRadius/EarthRadius)*SinPenumbra) + + return 1; + return 0; +} + +/* Initialize the Sun's keplerian elements for a given epoch. + Formulas are from "Explanatory Supplement to the Astronomical Ephemeris". + Also init the sidereal reference */ + +static void +InitOrbitRoutines(double EpochDay, int AtEod) +{ + double T,T2,T3,Omega; + int n; + double SunTrueAnomaly,SunDistance; + + T = (floor(EpochDay)-0.5)/36525; + T2 = T*T; + T3 = T2*T; + + SidDay = floor(EpochDay); + + SidReference = (6.6460656 + 2400.051262*T + 0.00002581*T2)/24; + SidReference -= floor(SidReference); + + /* Omega is used to correct for the nutation and the abberation */ + Omega = AtEod ? (259.18 - 1934.142*T) * RadiansPerDegree : 0.0; + n = (int)(Omega / PI2); + Omega -= n*PI2; + + SunEpochTime = EpochDay; + SunRAAN = 0; + + SunInclination = (23.452294 - 0.0130125*T - 0.00000164*T2 + + 0.000000503*T3 +0.00256*cos(Omega)) * RadiansPerDegree; + SunEccentricity = (0.01675104 - 0.00004180*T - 0.000000126*T2); + SunArgPerigee = (281.220833 + 1.719175*T + 0.0004527*T2 + + 0.0000033*T3) * RadiansPerDegree; + SunMeanAnomaly = (358.475845 + 35999.04975*T - 0.00015*T2 + - 0.00000333333*T3) * RadiansPerDegree; + n = (int)(SunMeanAnomaly / PI2); + SunMeanAnomaly -= n*PI2; + + SunMeanMotion = 1/(365.24219879 - 0.00000614*T); + + SunTrueAnomaly = Kepler(SunMeanAnomaly,SunEccentricity); + SunDistance = SunSemiMajorAxis*(1-SQR(SunEccentricity)) + / (1+SunEccentricity*cos(SunTrueAnomaly)); + + SinPenumbra = (SunRadius-EarthRadius)/SunDistance; + CosPenumbra = sqrt(1-SQR(SinPenumbra)); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: earthsat.c,v $ $Date: 2015/04/08 23:36:35 $ $Revision: 1.14 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/eq_ecl.c b/Common/Libraries/XEphemAstroLib/src/eq_ecl.c new file mode 100644 index 000000000..14abc5e26 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/eq_ecl.c @@ -0,0 +1,72 @@ +#include +#include + +#include "astro.h" + +static void ecleq_aux (int sw, double mj, double x, double y, + double *p, double *q); + +#define EQtoECL 1 +#define ECLtoEQ (-1) + + +/* given the modified Julian date, mj, and an equitorial ra and dec, each in + * radians, find the corresponding geocentric ecliptic latitude, *lt, and + * longititude, *lg, also each in radians. + * correction for the effect on the angle of the obliquity due to nutation is + * not included. + */ +void +eq_ecl (double mj, double ra, double dec, double *lt, double *lg) +{ + ecleq_aux (EQtoECL, mj, ra, dec, lg, lt); +} + +/* given the modified Julian date, mj, and a geocentric ecliptic latitude, + * *lt, and longititude, *lg, each in radians, find the corresponding + * equitorial ra and dec, also each in radians. + * correction for the effect on the angle of the obliquity due to nutation is + * not included. + */ +void +ecl_eq (double mj, double lt, double lg, double *ra, double *dec) +{ + ecleq_aux (ECLtoEQ, mj, lg, lt, ra, dec); +} + +static void +ecleq_aux ( +int sw, /* +1 for eq to ecliptic, -1 for vv. */ +double mj, +double x, double y, /* sw==1: x==ra, y==dec. sw==-1: x==lg, y==lt. */ +double *p, double *q) /* sw==1: p==lg, q==lt. sw==-1: p==ra, q==dec. */ +{ + static double lastmj = -10000; /* last mj calculated */ + static double seps, ceps; /* sin and cos of mean obliquity */ + double sx, cx, sy, cy, ty, sq; + + if (mj != lastmj) { + double eps; + obliquity (mj, &eps); /* mean obliquity for date */ + seps = sin(eps); + ceps = cos(eps); + lastmj = mj; + } + + sy = sin(y); + cy = cos(y); /* always non-negative */ + if (fabs(cy)<1e-20) cy = 1e-20; /* insure > 0 */ + ty = sy/cy; + cx = cos(x); + sx = sin(x); + sq = (sy*ceps)-(cy*seps*sx*sw); + if (sq < -1) sq = -1; + if (sq > 1) sq = 1; + *q = asin(sq); + *p = atan(((sx*ceps)+(ty*seps*sw))/cx); + if (cx<0) *p += PI; /* account for atan quad ambiguity */ + range (p, 2*PI); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: eq_ecl.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/eq_gal.c b/Common/Libraries/XEphemAstroLib/src/eq_gal.c new file mode 100644 index 000000000..d4a5fafcf --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/eq_gal.c @@ -0,0 +1,99 @@ +/* code to convert between equitorial and galactic coordinates */ + +#include +#include + +#include "astro.h" + +static void galeq_aux (int sw, double x, double y, double *p, double *q); +static void galeq_init (void); + +#define EQtoGAL 1 +#define GALtoEQ (-1) +#define SMALL (1e-20) + +static double an = degrad(32.93192); /* G lng of asc node on equator */ +static double gpr = degrad(192.85948); /* RA of North Gal Pole, 2000 */ +static double gpd = degrad(27.12825); /* Dec of " */ +static double cgpd, sgpd; /* cos() and sin() of gpd */ +static double mj2000; /* mj of 2000 */ +static int before; /* whether these have been set yet */ + +/* given ra and dec, each in radians, for the given epoch, find the + * corresponding galactic latitude, *lt, and longititude, *lg, also each in + * radians. + */ +void +eq_gal (double mj, double ra, double dec, double *lt, double *lg) +{ + galeq_init(); + precess (mj, mj2000, &ra, &dec); + galeq_aux (EQtoGAL, ra, dec, lg, lt); +} + +/* given galactic latitude, lt, and longititude, lg, each in radians, find + * the corresponding equitorial ra and dec, also each in radians, at the + * given epoch. + */ +void +gal_eq (double mj, double lt, double lg, double *ra, double *dec) +{ + galeq_init(); + galeq_aux (GALtoEQ, lg, lt, ra, dec); + precess (mj2000, mj, ra, dec); +} + +static void +galeq_aux ( +int sw, /* +1 for eq to gal, -1 for vv. */ +double x, double y, /* sw==1: x==ra, y==dec. sw==-1: x==lg, y==lt. */ +double *p, double *q) /* sw==1: p==lg, q==lt. sw==-1: p==ra, q==dec. */ +{ + double sy, cy, a, ca, sa, b, sq, c, d; + + cy = cos(y); + sy = sin(y); + a = x - an; + if (sw == EQtoGAL) + a = x - gpr; + ca = cos(a); + sa = sin(a); + b = sa; + if (sw == EQtoGAL) + b = ca; + sq = (cy*cgpd*b) + (sy*sgpd); + *q = asin (sq); + + if (sw == GALtoEQ) { + c = cy*ca; + d = (sy*cgpd) - (cy*sgpd*sa); + if (fabs(d) < SMALL) + d = SMALL; + *p = atan (c/d) + gpr; + } else { + c = sy - (sq*sgpd); + d = cy*sa*cgpd; + if (fabs(d) < SMALL) + d = SMALL; + *p = atan (c/d) + an; + } + + if (d < 0) *p += PI; + if (*p < 0) *p += 2*PI; + if (*p > 2*PI) *p -= 2*PI; +} + +/* set up the definitions */ +static void +galeq_init() +{ + if (!before) { + cgpd = cos (gpd); + sgpd = sin (gpd); + mj2000 = J2000; + before = 1; + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: eq_gal.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/formats.c b/Common/Libraries/XEphemAstroLib/src/formats.c new file mode 100644 index 000000000..f6c10538e --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/formats.c @@ -0,0 +1,212 @@ +#include +#include +#include +#include +#include + +#include "astro.h" +#include "preferences.h" + +/* sprint the variable a in sexagesimal format into out[]. + * w is the number of spaces for the whole part. + * fracbase is the number of pieces a whole is to broken into; valid options: + * 360000: :mm:ss.ss + * 36000: :mm:ss.s + * 3600: :mm:ss + * 600: :mm.m + * 60: :mm + * return number of characters written to out, not counting final '\0'. + */ +int +fs_sexa (char *out, double a, int w, int fracbase) +{ + char *out0 = out; + unsigned long n; + int d; + int f; + int m; + int s; + int isneg; + + /* save whether it's negative but do all the rest with a positive */ + isneg = (a < 0); + if (isneg) + a = -a; + + /* convert to an integral number of whole portions */ + n = (unsigned long)(a * fracbase + 0.5); + d = n/fracbase; + f = n%fracbase; + + /* form the whole part; "negative 0" is a special case */ + if (isneg && d == 0) + out += sprintf (out, "%*s-0", w-2, ""); + else + out += sprintf (out, "%*d", w, isneg ? -d : d); + + /* do the rest */ + switch (fracbase) { + case 60: /* dd:mm */ + m = f/(fracbase/60); + out += sprintf (out, ":%02d", m); + break; + case 600: /* dd:mm.m */ + out += sprintf (out, ":%02d.%1d", f/10, f%10); + break; + case 3600: /* dd:mm:ss */ + m = f/(fracbase/60); + s = f%(fracbase/60); + out += sprintf (out, ":%02d:%02d", m, s); + break; + case 36000: /* dd:mm:ss.s*/ + m = f/(fracbase/60); + s = f%(fracbase/60); + out += sprintf (out, ":%02d:%02d.%1d", m, s/10, s%10); + break; + case 360000: /* dd:mm:ss.ss */ + m = f/(fracbase/60); + s = f%(fracbase/60); + out += sprintf (out, ":%02d:%02d.%02d", m, s/100, s%100); + break; + default: + printf ("fs_sexa: unknown fracbase: %d\n", fracbase); + abort(); + } + + return (out - out0); +} + +/* put the given modified Julian date, jd, in out[] according to the given + * preference format. + * return number of characters written to out, not counting final '\0'. + */ +int +fs_date (char out[], int format, double jd) +{ + char *out0 = out; + int m, y; + double d; + + mjd_cal (jd, &m, &d, &y); + /* beware of %g rounding day up */ + if ((d < 1.0 && d - floor(d) >= .9999995) + || (d < 10.0 && d - floor(d) >= .999995) + || (d >= 10.0 && d - floor(d) >= .99995)) + mjd_cal (mjd_day(jd+0.5), &m, &d, &y); + + switch (format) { + case PREF_YMD: + out += sprintf (out, "%4d/%02d/%02.6g", y, m, d); + break; + case PREF_DMY: + out += sprintf (out, "%2.6g/%02d/%-4d", d, m, y); + break; + case PREF_MDY: + out += sprintf (out, "%2d/%02.6g/%-4d", m, d, y); + break; + default: + printf ("fs_date: bad date pref: %d\n", format); + abort(); + } + + return (out - out0); +} + + +/* convert sexagesimal string str AxBxC to double. + * x can be anything non-numeric. Any missing A, B or C will be assumed 0. + * optional - and + can be anywhere. + * return 0 if ok, -1 if can't find a thing. + */ +int +f_scansexa ( +const char *str0, /* input string */ +double *dp) /* cracked value, if return 0 */ +{ + double a, b, c; + char str[256]; + char *neg; + int isneg, r; + + /* copy str0 so we can play with it */ + strncpy (str, str0, sizeof(str)-1); + str[sizeof(str)-1] = '\0'; + + /* note first negative (but not fooled by neg exponent) */ + isneg = 0; + neg = strchr(str, '-'); + if (neg && (neg == str || (neg[-1] != 'E' && neg[-1] != 'e'))) { + *neg = ' '; + isneg = 1; + } + + /* crack up to three components */ + a = b = c = 0.0; + r = sscanf (str, "%lf%*[^0-9]%lf%*[^0-9]%lf", &a, &b, &c); + if (r < 1) + return (-1); + + /* back to one value, restoring neg */ + *dp = (c/60.0 + b)/60.0 + a; + if (isneg) + *dp *= -1; + return (0); +} + +/* crack a floating date string, bp, of the form X/Y/Z determined by the + * PREF_DATE_FORMAT preference into its components. allow the day to be a + * floating point number, + * the slashes may also be spaces or colons. + * a lone component with a decimal point is considered a year. + */ +void +f_sscandate ( +char *bp, +int pref, /* one of PREF_X for PREF_DATE_FORMAT */ +int *m, +double *d, +int *y) +{ + double X,Y,Z; /* the three components */ + int n; + + X = Y = Z = 0.0; + n = sscanf (bp, "%lf%*[/: ]%lf%*[/: ]%lf", &X, &Y, &Z); + if (n == 1 && (strchr(bp, '.') + || (pref == PREF_MDY && (X < 1 || X > 12)) + || (pref == PREF_DMY && (X < 1 || X > 31)))) { + double Mjd; + year_mjd (X, &Mjd); + mjd_cal (Mjd, m, d, y); + } else { + switch (pref) { + case PREF_MDY: + if (n > 0 && X != 0) + *m = (int)X; + if (n > 1 && Y != 0) + *d = Y; + if (n > 2 && Z != 0) + *y = (int)Z; + break; + case PREF_YMD: + if (n > 0 && X != 0) + *y = (int)X; + if (n > 1 && Y != 0) + *m = (int)Y; + if (n > 2 && Z != 0) + *d = Z; + break; + case PREF_DMY: + if (n > 0 && X != 0) + *d = X; + if (n > 1 && Y != 0) + *m = (int)Y; + if (n > 2 && Z != 0) + *y = (int)Z; + break; + } + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: formats.c,v $ $Date: 2006/04/10 09:00:06 $ $Revision: 1.17 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/helio.c b/Common/Libraries/XEphemAstroLib/src/helio.c new file mode 100644 index 000000000..d0dceae1d --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/helio.c @@ -0,0 +1,51 @@ +#include +#include +#include + +#include "astro.h" + +/* given geocentric time jd and coords of a distant object at ra/dec (J2000), + * find the difference in time between light arriving at earth vs the sun. + * *hcp must be subtracted from geocentric jd to get heliocentric jd. + * From RLM Oct 12, 1995. + */ +void +heliocorr (double jd, double ra, double dec, double *hcp) +{ + double e; /* obliquity of ecliptic */ + double n; /* day number */ + double g; /* solar mean anomaly */ + double L; /* solar ecliptic longitude */ + double l; /* mean solar ecliptic longitude */ + double R; /* sun distance, AU */ + double X, Y; /* equatorial rectangular solar coords */ + double cdec, sdec; + double cra, sra; + + /* following algorithm really wants EOD */ + precess (J2000, jd - MJD0, &ra, &dec); + + cdec = cos(dec); + sdec = sin(dec); + cra = cos(ra); + sra = sin(ra); + + n = jd - 2451545.0; /* use epoch 2000 */ + e = degrad(23.439 - 0.0000004*n); + g = degrad(357.528) + degrad(0.9856003)*n; + L = degrad(280.461) + degrad(0.9856474)*n; + l = L + degrad(1.915)*sin(g) + degrad(0.02)*sin(2.0*g); + R = 1.00014 - 0.01671*cos(g) - 0.00014*cos(2.0*g); + X = R*cos(l); + Y = R*cos(e)*sin(l); + +#if 0 + printf ("n=%g g=%g L=%g l=%g R=%g X=%g Y=%g\n", + n, raddeg(g), raddeg(L), raddeg(l), R, X, Y); +#endif + + *hcp = 0.0057755 * (cdec*cra*X + (cdec*sra + tan(e)*sdec)*Y); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: helio.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/jupmoon.c b/Common/Libraries/XEphemAstroLib/src/jupmoon.c new file mode 100644 index 000000000..40cb4ada9 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/jupmoon.c @@ -0,0 +1,391 @@ +/* jupiter moon info */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "bdl.h" + +static int use_bdl (double jd, char *dir, MoonData md[J_NMOONS]); +static void meeus_jupiter (double d, double *cmlI, double *cmlII, + MoonData md[J_NMOONS]); +static void moonradec (double jupsize, MoonData md[J_NMOONS]); +static void moonSVis (Obj *sop, Obj *jop, MoonData md[J_NMOONS]); +static void moonEVis (MoonData md[J_NMOONS]); +static void moonPShad (Obj *sop, Obj *jop, MoonData md[J_NMOONS]); +static void moonTrans (MoonData md[J_NMOONS]); + +/* moon table and a few other goodies and when it was last computed */ +static double mdmjd = -123456; +static MoonData jmd[J_NMOONS] = { + {"Jupiter", NULL}, + {"Io", "I"}, + {"Europa", "II"}, + {"Ganymede", "III"}, + {"Callisto", "IV"} +}; +static double sizemjd; /* size at last mjd */ +static double cmlImjd; /* central meridian long sys I, at last mjd */ +static double cmlIImjd; /* " II " */ + +/* These values are from the Explanatory Supplement. + * Precession degrades them gradually over time. + */ +#define POLE_RA degrad(268.05) /* RA of Jupiter's north pole */ +#define POLE_DEC degrad(64.50) /* Dec of Jupiter's north pole */ + + +/* get jupiter info in md[0], moon info in md[1..J_NMOONS-1]. + * if !dir always use meeus model. + * if !jop caller just wants md[] for names + * N.B. we assume sop and jop are updated. + */ +void +jupiter_data ( +double Mjd, /* mjd */ +char dir[], /* dir in which to look for helper files */ +Obj *sop, /* Sun */ +Obj *jop, /* jupiter */ +double *sizep, /* jup angular diam, rads */ +double *cmlI, double *cmlII, /* central meridian longitude, rads */ +double *polera, double *poledec, /* pole location */ +MoonData md[J_NMOONS]) /* return info */ +{ + double JD; + + /* always copy back at least for name */ + memcpy (md, jmd, sizeof(jmd)); + + /* pole */ + if (polera) *polera = POLE_RA; + if (poledec) *poledec = POLE_DEC; + + /* nothing else if repeat call or just want names */ + if (Mjd == mdmjd || !jop) { + if (jop) { + *sizep = sizemjd; + *cmlI = cmlImjd; + *cmlII = cmlIImjd; + } + return; + } + JD = Mjd + MJD0; + + /* planet in [0] */ + md[0].ra = jop->s_ra; + md[0].dec = jop->s_dec; + md[0].mag = get_mag(jop); + md[0].x = 0; + md[0].y = 0; + md[0].z = 0; + md[0].evis = 1; + md[0].svis = 1; + + /* size is straight from jop */ + *sizep = degrad(jop->s_size/3600.0); + + /* mags from JPL ephemeris */ + md[1].mag = 5.7; + md[2].mag = 5.8; + md[3].mag = 5.3; + md[4].mag = 6.7; + + /* get moon data from BDL if possible, else Meeus' model. + * always use Meeus for cml + */ + if (dir && use_bdl (JD, dir, md) == 0) + meeus_jupiter (Mjd, cmlI, cmlII, NULL); + else + meeus_jupiter (Mjd, cmlI, cmlII, md); + + /* set visibilities */ + moonSVis (sop, jop, md); + moonPShad (sop, jop, md); + moonEVis (md); + moonTrans (md); + + /* fill in moon ra and dec */ + moonradec (*sizep, md); + + /* save */ + mdmjd = Mjd; + sizemjd = *sizep; + cmlImjd = *cmlI; + cmlIImjd = *cmlII; + memcpy (jmd, md, sizeof(jmd)); +} + +/* hunt for BDL file in dir[] and use if possible + * return 0 if ok, else -1 + */ +static int +use_bdl ( +double JD, /* julian date */ +char dir[], /* directory */ +MoonData md[J_NMOONS]) /* fill md[1..NM-1].x/y/z for each moon */ +{ +#define JUPRAU .0004769108 /* jupiter radius, AU */ + double x[J_NMOONS], y[J_NMOONS], z[J_NMOONS]; + char buf[1024]; + FILE *fp; + char *fn; + int i; + + /* check ranges and appropriate data file */ + if (JD < 2451179.50000) /* Jan 1 1999 UTC */ + return (-1); + if (JD < 2455562.5) /* Jan 1 2011 UTC */ + fn = "jupiter.9910"; + else if (JD < 2459215.5) /* Jan 1 2021 UTC */ + fn = "jupiter.1020"; + else + return (-1); + + /* open */ + (void) sprintf (buf, "%s/%s", dir, fn); + fp = fopen (buf, "r"); + if (!fp) { + fprintf (stderr, "%s: %s\n", fn, strerror(errno)); + return (-1); + } + + /* use it */ + if ((i = read_bdl (fp, JD, x, y, z, buf)) < 0) { + fprintf (stderr, "%s: %s\n", fn, buf); + fclose (fp); + return (-1); + } + if (i != J_NMOONS-1) { + fprintf (stderr, "%s: BDL says %d moons, code expects %d", fn, + i, J_NMOONS-1); + fclose (fp); + return (-1); + } + + /* copy into md[1..NM-1] with our scale and sign conventions */ + for (i = 1; i < J_NMOONS; i++) { + md[i].x = x[i-1]/JUPRAU; /* we want jup radii +E */ + md[i].y = -y[i-1]/JUPRAU; /* we want jup radii +S */ + md[i].z = -z[i-1]/JUPRAU; /* we want jup radii +front */ + } + + /* ok */ + fclose (fp); + return (0); +} + +/* compute location of GRS and Galilean moons. + * if md == NULL, just to cml. + * from "Astronomical Formulae for Calculators", 2nd ed, by Jean Meeus, + * Willmann-Bell, Richmond, Va., U.S.A. (c) 1982, chapters 35 and 36. + */ +static void +meeus_jupiter( +double d, +double *cmlI, double *cmlII, /* central meridian longitude, rads */ +MoonData md[J_NMOONS]) /* fill in md[1..NM-1].x/y/z for each moon. + * N.B. md[0].ra/dec must already be set + */ +{ +#define dsin(x) sin(degrad(x)) +#define dcos(x) cos(degrad(x)) + double A, B, Del, J, K, M, N, R, V; + double cor_u1, cor_u2, cor_u3, cor_u4; + double solc, tmp, G, H, psi, r, r1, r2, r3, r4; + double u1, u2, u3, u4; + double lam, Ds; + double z1, z2, z3, z4; + double De, dsinDe; + double theta, phi; + double tvc, pvc; + double salpha, calpha; + int i; + + V = 134.63 + 0.00111587 * d; + + M = (358.47583 + 0.98560003*d); + N = (225.32833 + 0.0830853*d) + 0.33 * dsin (V); + + J = 221.647 + 0.9025179*d - 0.33 * dsin(V); + + A = 1.916*dsin(M) + 0.02*dsin(2*M); + B = 5.552*dsin(N) + 0.167*dsin(2*N); + K = (J+A-B); + R = 1.00014 - 0.01672 * dcos(M) - 0.00014 * dcos(2*M); + r = 5.20867 - 0.25192 * dcos(N) - 0.00610 * dcos(2*N); + Del = sqrt (R*R + r*r - 2*R*r*dcos(K)); + psi = raddeg (asin (R/Del*dsin(K))); + + *cmlI = degrad(268.28 + 877.8169088*(d - Del/173) + psi - B); + range (cmlI, 2*PI); + *cmlII = degrad(290.28 + 870.1869088*(d - Del/173) + psi - B); + range (cmlII, 2*PI); + + /* that's it if don't want moon info too */ + if (!md) + return; + + solc = (d - Del/173.); /* speed of light correction */ + tmp = psi - B; + + u1 = 84.5506 + 203.4058630 * solc + tmp; + u2 = 41.5015 + 101.2916323 * solc + tmp; + u3 = 109.9770 + 50.2345169 * solc + tmp; + u4 = 176.3586 + 21.4879802 * solc + tmp; + + G = 187.3 + 50.310674 * solc; + H = 311.1 + 21.569229 * solc; + + cor_u1 = 0.472 * dsin (2*(u1-u2)); + cor_u2 = 1.073 * dsin (2*(u2-u3)); + cor_u3 = 0.174 * dsin (G); + cor_u4 = 0.845 * dsin (H); + + r1 = 5.9061 - 0.0244 * dcos (2*(u1-u2)); + r2 = 9.3972 - 0.0889 * dcos (2*(u2-u3)); + r3 = 14.9894 - 0.0227 * dcos (G); + r4 = 26.3649 - 0.1944 * dcos (H); + + md[1].x = -r1 * dsin (u1+cor_u1); + md[2].x = -r2 * dsin (u2+cor_u2); + md[3].x = -r3 * dsin (u3+cor_u3); + md[4].x = -r4 * dsin (u4+cor_u4); + + lam = 238.05 + 0.083091*d + 0.33*dsin(V) + B; + Ds = 3.07*dsin(lam + 44.5); + De = Ds - 2.15*dsin(psi)*dcos(lam+24.) + - 1.31*(r-Del)/Del*dsin(lam-99.4); + dsinDe = dsin(De); + + z1 = r1 * dcos(u1+cor_u1); + z2 = r2 * dcos(u2+cor_u2); + z3 = r3 * dcos(u3+cor_u3); + z4 = r4 * dcos(u4+cor_u4); + + md[1].y = z1*dsinDe; + md[2].y = z2*dsinDe; + md[3].y = z3*dsinDe; + md[4].y = z4*dsinDe; + + /* compute sky transformation angle as triple vector product */ + tvc = PI/2.0 - md[0].dec; + pvc = md[0].ra; + theta = PI/2.0 - POLE_DEC; + phi = POLE_RA; + salpha = -sin(tvc)*sin(theta)*(cos(pvc)*sin(phi) - sin(pvc)*cos(phi)); + calpha = sqrt (1.0 - salpha*salpha); + + for (i = 0; i < J_NMOONS; i++) { + double tx = md[i].x*calpha + md[i].y*salpha; + double ty = -md[i].x*salpha + md[i].y*calpha; + md[i].x = tx; + md[i].y = ty; + } + + md[1].z = z1; + md[2].z = z2; + md[3].z = z3; + md[4].z = z4; +} + + +/* given jupiter loc in md[0].ra/dec and size, and location of each moon in + * md[1..NM-1].x/y in jup radii, find ra/dec of each moon in md[1..NM-1].ra/dec. + */ +static void +moonradec ( +double jupsize, /* jup diameter, rads */ +MoonData md[J_NMOONS]) /* fill in RA and Dec */ +{ + double juprad = jupsize/2; + double jupra = md[0].ra; + double jupdec = md[0].dec; + int i; + + for (i = 1; i < J_NMOONS; i++) { + double dra = juprad * md[i].x; + double ddec = juprad * md[i].y; + md[i].ra = jupra + dra; + md[i].dec = jupdec - ddec; + } +} + +/* set svis according to whether moon is in sun light */ +static void +moonSVis( +Obj *sop, /* SUN */ +Obj *jop, /* jupiter */ +MoonData md[J_NMOONS]) +{ + double esd = sop->s_edist; + double eod = jop->s_edist; + double sod = jop->s_sdist; + double soa = degrad(jop->s_elong); + double esa = asin(esd*sin(soa)/sod); + double h = sod*jop->s_hlat; + double nod = h*(1./eod - 1./sod); + double sca = cos(esa), ssa = sin(esa); + int i; + + for (i = 1; i < J_NMOONS; i++) { + MoonData *mdp = &md[i]; + double xp = sca*mdp->x + ssa*mdp->z; + double yp = mdp->y; + double zp = -ssa*mdp->x + sca*mdp->z; + double ca = cos(nod), sa = sin(nod); + double xpp = xp; + double ypp = ca*yp - sa*zp; + double zpp = sa*yp + ca*zp; + int outside = xpp*xpp + ypp*ypp > 1.0; + int infront = zpp > 0.0; + mdp->svis = outside || infront; + } +} + +/* set evis according to whether moon is geometrically visible from earth */ +static void +moonEVis (MoonData md[J_NMOONS]) +{ + int i; + + for (i = 1; i < J_NMOONS; i++) { + MoonData *mdp = &md[i]; + int outside = mdp->x*mdp->x + mdp->y*mdp->y > 1.0; + int infront = mdp->z > 0.0; + mdp->evis = outside || infront; + } +} + +/* set pshad and sx,sy shadow info */ +static void +moonPShad( +Obj *sop, /* SUN */ +Obj *jop, /* jupiter */ +MoonData md[J_NMOONS]) +{ + int i; + + for (i = 1; i < J_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->pshad = !plshadow (jop, sop, POLE_RA, POLE_DEC, mdp->x, + mdp->y, mdp->z, &mdp->sx, &mdp->sy); + } +} + +/* set whether moons are transiting */ +static void +moonTrans (MoonData md[J_NMOONS]) +{ + int i; + + for (i = 1; i < J_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->trans = mdp->z > 0 && mdp->x*mdp->x + mdp->y*mdp->y < 1; + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: jupmoon.c,v $ $Date: 2006/08/29 03:16:47 $ $Revision: 1.7 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/libration.c b/Common/Libraries/XEphemAstroLib/src/libration.c new file mode 100644 index 000000000..59b5598fc --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/libration.c @@ -0,0 +1,2213 @@ +/* This file contains code to calculate the libration in Lunar lat and long. + * It is based entirely on code supplied to me 2 Oct 1996 by Stephen L. Moshier, + * , which implements a trigonometric expansion to + * approximate the librations according to JPL DE403. The following doc file + * was also supplied therewith: + +This program calculates a trigonometric series adjusted for a best fit +to the lunar librations from the Jet Propulsion Laboratory's DE403 +ephemeris. + +lblon403.c and lblat403.c are series for the selenographic longitude +and latitude of the earth. The longitude series matches DE403 +with a maximum discrepancy of 2.6" (0.4" rms). The latitude has a +maximum discrepancy of 1.9" (0.2" rms). The two series are valid in +the Julian year interval 1600 to 2200. + +In both Eckhardt and DE403 the moon's principal moment of inertia axes +form the lunar body coordinate system. The estimated geographic +locations of these axes vary as measurements and theories gradually +become more refined. There is a significant difference between +Eckhardt and DE403 in the constant term of the longitude. Almanac and +cartography coordinates drop the constant term (which is -64" for +DE403). That practice gives librations relative to the mean +selenographic longitude of the earth, for which the discrepancy from +one theory to the next is small. + +Steve Moshier +October, 1996 + + * Any errors in adapting this code to xephem are strictly my own. + * Elwood Downey. +*/ + +#include +#include + +#include "astro.h" + +#define CHAR short + + +/* plantbl.h */ + +struct plantbl { + /* char max_harmonic[9]; */ + char max_harmonic[14]; + char max_power_of_t; + CHAR *arg_tbl; + int *lon_tbl; + int *lat_tbl; + int *rad_tbl; + double distance; + double timescale; + double trunclvl; +}; + + +/* libra403.c */ + +static double JD2000 = 2451545.0; +/* Conversion factors between degrees and radians */ +static double STR = 4.8481368110953599359e-6; /* radians per arc second */ + +static double ss[14][24]; +static double cc[14][24]; + +/* Reduce arc seconds modulo 360 degrees, + answer in arc seconds. */ +static double +mods3600 (double x) +{ + double y; + y = x - 1.296e6 * floor (x / 1.296e6); + return y; +} + +/* Prepare lookup table of sin and cos ( i * L_k ) + for required multiple angles. + K is the array offset corresponding to the planet. + ARG is in radians. + n is the highest harmonic to compute. */ +static int +sscc (int k, double arg, int n) +{ + double cu, su, cv, sv, s; + int i; + + if (n <= 0) + return 0; + + su = sin (arg); + cu = cos (arg); + ss[k][0] = su; /* sin(L) */ + cc[k][0] = cu; /* cos(L) */ + sv = 2.0 * su * cu; + cv = cu * cu - su * su; + ss[k][1] = sv; /* sin(2L) */ + cc[k][1] = cv; + for (i = 2; i < n; i++) + { + s = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = s; + ss[k][i] = sv; /* sin( i+1 L ) */ + cc[k][i] = cv; + } + return (0); +} + + +/* Mean elements. + Copied from cmoon.c, DE404 version. */ + +static double Jlast = -1.0e38; +static double T; + +static int +dargs (double J, struct plantbl *plan) +{ + double T2, w; + + if (J == Jlast) + return 0; + + T = (J - JD2000) / 36525.0; + T2 = T * T; + + /* Mean anomaly of sun = l' (J. Laskar) */ + w = mods3600 (129596581.038354 * T + 1287104.76154); + w += (((((((( + 1.62e-20 * T + - 1.0390e-17) * T + - 3.83508e-15) * T + + 4.237343e-13) * T + + 8.8555011e-11) * T + - 4.77258489e-8) * T + - 1.1297037031e-5) * T + + 1.4732069041e-4) * T + - 0.552891801772) * T2; + sscc (10, STR * w, plan->max_harmonic[10]); + + /* Mean distance of moon from its ascending node = F */ + w = mods3600 ((1739527263.0983 - 2.079419901760e-01) * T + 335779.55755); + w = w + ((-9.646018347184e-06 * T2 /* F, t^4 */ + - 1.138215912580e-03) * T /* F, t^3 */ + - 1.312045233711e+01) * T; /* F, t^2 */ + sscc (11, STR * w, plan->max_harmonic[11]); + + /* Mean anomaly of moon = l */ + w = mods3600 ((1717915923.4728 - 2.035946368532e-01) * T + 485868.28096); + w = w + ((-3.421689790404e-04 * T2 /* l, t^4 */ + + 4.768357585780e-02) * T /* l, t^3 */ + + 3.146734198839e+01) * T; /* l, t^2 */ + sscc (9, STR * w, plan->max_harmonic[9]); + + /* Mean elongation of moon = D */ + w = mods3600 ((1602961601.4603 + 3.962893294503e-01) * T + 1072260.73512); + w = w + ((-2.905334122698e-04 * T2 /* D, t^4 */ + - 5.834100476561e-03) * T /* D, t^3 */ + - 6.847070905410e+00) * T; /* D, t^2 */ + sscc (12, STR * w, plan->max_harmonic[12]); + + /* Mean longitude of moon, re mean ecliptic and equinox of date */ + w = mods3600 ((1732564372.83264 - 6.784914260953e-01) * T + 785939.95571); + w = w + ((-8.466472828815e-05 * T2 /* L, t^4 */ + + 5.722859298199e-03) * T /* L, t^3 */ + - 5.663161722088e+00) * T; /* L, t^2 */ + sscc (13, STR * w, plan->max_harmonic[13]); + + /* Mean longitudes of planets (Laskar, Bretagnon) */ + + /* Venus. */ + w = mods3600 (210664136.4335482 * T + 655127.283046); + w += (((((((( + -9.36e-023 * T + - 1.95e-20) * T + + 6.097e-18) * T + + 4.43201e-15) * T + + 2.509418e-13) * T + - 3.0622898e-10) * T + - 2.26602516e-9) * T + - 1.4244812531e-5) * T + + 0.005871373088) * T2; + sscc (1, STR * w, plan->max_harmonic[1]); + + /* Earth. */ + w = mods3600 (129597742.26669231 * T + 361679.214649); + w += ((((((((-1.16e-22 * T + + 2.976e-19) * T + + 2.8460e-17) * T + - 1.08402e-14) * T + - 1.226182e-12) * T + + 1.7228268e-10) * T + + 1.515912254e-7) * T + + 8.863982531e-6) * T + - 2.0199859001e-2) * T2; + sscc (2, STR * w, plan->max_harmonic[2]); + + /* Mars. */ + w = mods3600 (68905077.59284 * T + 1279559.78866); + w += (-1.043e-5 * T + 9.38012e-3) * T2; + sscc (3, STR * w, plan->max_harmonic[3]); + + /* Jupiter. */ + w = mods3600 (10925660.428608 * T + 123665.342120); + w += (1.543273e-5 * T - 3.06037836351e-1) * T2; + sscc (4, STR * w, plan->max_harmonic[4]); + + /* Saturn. */ + w = mods3600 (4399609.65932 * T + 180278.89694); + w += ((4.475946e-8 * T - 6.874806E-5) * T + 7.56161437443E-1) * T2; + sscc (5, STR * w, plan->max_harmonic[5]); + return 0; +} + + + +/* Evaluate series PLAN at Julian date J. + Result in arcseconds, usually. */ + +static double +gplan (double J, struct plantbl *plan) +{ + double su, cu, sv, cv; + double t, sl; + int j, k, m, k1, ip, np, nt; + CHAR *p; + int *pl; + + dargs (J, plan); + /* Point to start of table of arguments. */ + p = plan->arg_tbl; + /* Point to tabulated cosine and sine amplitudes. */ + pl = plan->lon_tbl; + sl = 0.0; + + for (;;) + { + /* Find sine and cosine of argument for this term in the series. + The argument has the form J_1 L_1 + J_2 L_2 + ... + where J_i are integers and L_i are mean elements. */ + + /* Number of periodic arguments. */ + np = *p++; + if (np < 0) + break; + if (np == 0) + { + /* If no periodic arguments, it is a polynomial term. + Evaluate A_n T^n + A_n-1 T^n-1 + ... + A_0. */ + nt = *p++; + cu = *pl++; + for (ip = 0; ip < nt; ip++) + cu = cu * T + *pl++; + sl += cu; + continue; + } + k1 = 0; + cv = 0.0; + sv = 0.0; + for (ip = 0; ip < np; ip++) + { + /* What harmonic. */ + j = *p++; + /* Which planet. */ + m = *p++ - 1; + if (j) + { + k = j; + if (j < 0) + k = -k; + k -= 1; + /* sin(k*angle) for planet m. */ + su = ss[m][k]; + if (j < 0) + su = -su; + /* cos(k*angle) for planet m. */ + cu = cc[m][k]; + if (k1 == 0) + { + /* Set sine and cosine of first angle. */ + sv = su; + cv = cu; + k1 = 1; + } + else + { + /* Combine angles by trigonometry. */ + t = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = t; + } + } + } + /* Now cv = cos(arg), sv = sin(arg). + Evaluate + cu = (C_n T^n + C_n-1 T^n-1 + ... + C_0) cos(arg) + su = (S_n T^n + S_n-1 T^n-1 + ... + S_0) sin(arg). */ + + /* Highest power of T. */ + nt = *p++; + /* Coefficients C_i, S_i. */ + cu = *pl++; + su = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + su = su * T + *pl++; + } + sl += cu * cv + su * sv; + } + return (plan->trunclvl * sl); +} + + +/* lblat403.c */ + +static int lattabr[] = {-1}; +static int lattabb[] = {-1}; +static int lattabl[] = { + 785710, + + -1958, 780, + + -178, 2850, 2243, 5927, 2714, -2911, + + -174, 5888, -16705, 10828, -15113, -25049, + + -172, 1976, + + 37, -13560, + + -40, -911, + + -300, 691, + + 3779, 722, + + 68, -1048, + + -3092, -4, 3011, -31, 250, -14293664, + + -149, -228, + + -5, -842, + + 62, 57967, + + -7, -11207, + + 15, -66055, + + -79, -71560, + + 8, 2998, + + -1062, -46, + + -2, 711, + + -5, -2, + + 367, -5, -353, 1, -117, 2324027, + + 0, -176, + + 19, -4, + + -3, -1229, + + 7, 4327, + + -2, 112, + + -1, -540, + + 73, 102982, + + 0, -137, + + 2, 239, + + 0, -216, + + 2, 3707, + + -1, -100, + + -2, 124, + + 0, 408, + + 1, 561, + + 0, 594, + + 0, 11866, + + -2, -229, + + 11, 6768, + + 2, 1, + + -2, -788, -24, 314732, + + -5, -3238, + + -2, -1263, + + -1, 94, + + -2, 206, + + -283, 6489836, + + 63, 2562, + + -6, 1220, + + 0, 135, + + 795, -338, + + -406, -101, + + 757, -383, + + -73, -31018, + + -5, -3010, + + 6, 5821, + + 167, 7, + + 2, 122623, + + 41, 138924, + + 2, 253, + + 0, -198, + + 135, 30, + + 2, 934, + + 62, -14, + + -531, -297537, + + -3, -205, + + 1, -393, + + -4, -156, + + -467, 90, + + 9, -346, + + -55, 1368, + + 4414, 2094, + + 480, 510, + + 35, 728, + + 6832, 6429, + + -2099, -3703, + + -9, 579, + + 239, 1738, + + 22, 968, 60260, -8929, + + 26, -64, + + 0, 0, + + -47, -351, 2248, -1175, 3976, 7150, + + 15191, 1, -15535, -143, -2308,-239959618, + + -45, 355, 2252, 1189, 4009, -7131, + + -158, 499, + + 776, -34, + + -389, 4363, + + 30, 28, + + 0, -593, + + 1, -1, + + 58, -66, + + 4, 1552, + + -1, 244, + + 288, 59, + + -276, 62, + + 8, 3309, + + 2, 1249, + + -156, -3, + + 0, -7903, + + -47, 154458, + + -710, 160, + + 0, 288, + + 328, 219514, + + -1, 113, + + -1, 1515, + + -20, 28493, + + 13, 9011, + + -1, 1110, + + -1, -103, + + 0, 312, + + 1, 360, + + 6, 6139, + + -1, 142, + + -1, -709, + + -1, -242, + + 67, 67200, + + 5, 4148, + + 1, 137, + + -15, -17969, + + -2, -3372, + + -2, -1739, + + 154, 116200, + + -1, -640, + + -269, -336274, + + 0, -1557, + + -1, -353, + + 993, 39, + + -1, -294, + + -646, -135, + + 750, -3, -661, 8, -163, 2591179, + + -1, -258, + + 0, 381, + + 6, 8272, + + -44, -92044, + + -29, 70397, + + -25, -17892, + + 1, 67, + + -44, -17118, + + 2743, 349, + + -4, 231, + + 1501, 3099, + + -33, 21, + + -1130, 97, 1263, 164, -226, -13139965, + + 839, -202, + + -1, 660, + + 12, -10482, + + 1, 17, + + -2, -1480, + + -45, -26084, + + 2, 259, + + 0, 258, + + -1, -1560, + + 32, 73046, + + -1, -370, + + -1, -77, + + 46, 20687, + + 1, 742, + + 1, 2399, + + 2, 741, + + 0, 52, + + 0, 112, + + 0, 297, + + 2, 825, + + 0, 161, + + 1, 4228, + + 0, 212, + + -1, -105, + + 6, 2782, + + 9, 37199, + + 3, 5045, + + 105, -1, + + -1, -179, + + 75, 31274, + + -3, -1321, + + -1, 363, + + 0, 1137, + + 58, 104090, + + -2, -2695, + + -1, -392, + + -35, -21763, + + -2, -205, + + 567, 38, + + -7, 117, + + -569, -9, 321, -1522061, + + -4, 276, + + -2, -590, + + 2, 632, + + -14, -10601, + + 4, 8703, + + -10, 16870, + + -4, -995, + + 597, -6, -386, -805403, + + 1025, -474, + + -2, 201, + + -95, 16, + + -127, 135570, + + 0, -173, + + 10, 8565, + + -3, 1812, + + -1, -108, + + -107, -649, + + 0, 151, + + 1, 950, + + 1, 312, + + 1, 403, + + 0, -576, + + 7, 4418, + + -3, -4769, + + -1, -769, + + 63, 38890, + + 0, -101, + + 0, 169, + + -3, -14837, + + 1, 372, + + 0, -674, + + -3, -1488, + + -36, -196300, + + 0, -176, + + -10, -4811, + + -2, -991, + + 1, 831, + + 1, 3138, + + -103, -51819, + + 0, -133, + + -4, 22171, + + 2, 820, + + 1, 149, + + 2227, 1277, + + -502, -3049, + + 1, 122, + + 0, 370, + + 0, 166, + + 2, 772, + + 2, 2057, + + -1, -486, + + 13, -15447, + + -2, -1619, + + 0, 335, + + 0, -206, + + 0, -104, + + -19, -19726, + + 0, 414, + + -8, -3425, + + -19, -1, + + 1, 546, + + 0, -392, + + 0, -2754, + + 0, -158, + + -3, -1790, + + -1, -230, + + 0, -190, + + 0, -366, + + 0, -154, + +}; + +static CHAR latargs[] = { + 0, 0, + 3, 1, 2, 9, 3,-20, 4, 0, + 4, 1, 13, -1, 10, 3, 2, -4, 3, 2, + 4, 1, 13, -1, 10, -5, 2, 9, 3, 2, + 3, 9, 10, -9, 14, 1, 3, 0, + 3, 1, 11, -1, 12, 1, 13, 0, + 4, 1, 10, -2, 11, 1, 12, -2, 13, 0, + 4, 2, 11, -1, 14, 18, 2,-18, 3, 0, + 3, 1, 13, -1, 10, 1, 3, 0, + 2, 1, 10, -1, 14, 0, + 2, 1, 10, -1, 12, 2, + 4, 1, 14,-18, 2, 16, 3, 1, 5, 0, + 3, 2, 10, -1, 12, -1, 13, 0, + 3, 1, 10, 1, 11, -1, 12, 0, + 4, 1, 10, -1, 11, 1, 12, -2, 13, 0, + 2, 1, 12, -1, 13, 0, + 3, 1, 10, -1, 11, -1, 12, 0, + 3, 3, 10, -1, 12, -2, 13, 0, + 2, 2, 10, -2, 13, 0, + 3, 1, 10, 2, 11, -1, 12, 0, + 3, 1, 10, -2, 13, 1, 3, 0, + 3, 1, 10, 1, 12, -2, 13, 2, + 3, 1, 11, 1, 12, -1, 13, 0, + 2, 2, 12, -2, 13, 0, + 3, 1, 10, -2, 11, -1, 12, 0, + 3, 1, 10, -3, 12, 2, 13, 0, + 4, 3, 10, 1, 11, -1, 12, -2, 13, 0, + 3, 2, 10, 1, 12, -3, 13, 0, + 4, 1, 10, 1, 11, 1, 12, -2, 13, 0, + 2, 3, 12, -3, 13, 0, + 4, 1, 10, -1, 11, -3, 12, 2, 13, 0, + 3, 3, 10, 1, 12, -4, 13, 0, + 4, 1, 10, 2, 11, 1, 12, -2, 13, 0, + 3, 1, 10, 3, 12, -4, 13, 0, + 4, 1, 10, 3, 11, 1, 12, -2, 13, 0, + 3, 3, 11, 1, 12, -2, 13, 0, + 4, 2, 10, 1, 11, 1, 12, -4, 13, 0, + 2, 3, 12, -4, 13, 0, + 3, 2, 11, 1, 12, -2, 13, 0, + 4, 1, 10, 1, 11, 1, 12, -3, 13, 0, + 3, 2, 10, 1, 12, -4, 13, 0, + 4, 1, 14, -3, 2,-16, 3, -4, 4, 0, + 3, 1, 11, 1, 12, -2, 13, 1, + 3, 1, 10, 1, 12, -3, 13, 0, + 4, 2, 10, 1, 11, -1, 12, -2, 13, 0, + 3, 2, 10, -3, 12, 2, 13, 0, + 4, 1, 10, -1, 11, -1, 12, 1, 13, 0, + 2, 1, 12, -2, 13, 0, + 2, 2, 13, -1, 14, 0, + 2, 2, 11, -1, 12, 0, + 4, 1, 10, -1, 11, 1, 12, -3, 13, 0, + 3, 2, 10, -3, 14, 4, 4, 0, + 2, 1, 10, -2, 13, 0, + 3, 1, 13, -3, 3, 4, 4, 0, + 3, 2, 10, -1, 12, -2, 13, 0, + 3, 2, 10, -1, 11, -1, 12, 0, + 3, 1, 10, -1, 12, 1, 13, 0, + 2, 1, 10, -1, 11, 0, + 3, 1, 11, -1, 12, 2, 13, 0, + 2, 1, 11, -1, 12, 0, + 3, 1, 10, -1, 12, -1, 13, 0, + 4, 2, 13, -1, 12, 2, 2, -2, 3, 0, + 3, 1, 13, 2, 2, -3, 3, 0, + 4, 2, 10, -1, 11, -1, 12, -2, 13, 0, + 3, 1, 13, -1, 2, 2, 3, 0, + 2, 2, 10, -1, 12, 0, + 4, 2, 13, -1, 12, 2, 3, -2, 5, 0, + 4, 2, 13, -1, 12, 3, 2, -3, 3, 0, + 4, 2, 10, -2, 11, 1, 12, -2, 13, 0, + 3, 1, 13, 1, 3, -2, 5, 0, + 4, 1, 10, 1, 11, -1, 12, 1, 13, 0, + 3, 1, 13, -5, 2, 9, 3, 0, + 3, 1, 14, 2, 3, -4, 4, 0, + 3, 3, 10, 4, 12, -6, 14, 0, + 3, 1, 13, 3, 2, -4, 3, 0, + 1, 1, 10, 0, + 3, 1, 13, -3, 12, 9, 2, 0, + 4, 1, 10, -1, 11, 1, 12, -1, 13, 0, + 3, 2, 11, -1, 12, 2, 13, 0, + 1, 1, 14, 1, + 4, 1, 12, 1, 10, -1, 14, 1, 5, 0, + 4, 9, 13, -9, 10, 7, 2, 10, 3, 0, + 3, 1, 12, -8, 2, 13, 3, 2, + 1, 1, 12, 2, + 3, 1, 12, 8, 2,-13, 3, 2, + 2, 1, 13, 2, 4, 0, + 4, 2, 13, -1, 12, 5, 2, -6, 3, 0, + 3, 1, 13, -2, 12, 1, 3, 0, + 3, 1, 13, -3, 2, 6, 3, 0, + 4, 1, 10, -1, 11, -1, 12, -1, 13, 0, + 2, 1, 14, 2, 5, 0, + 2, 1, 10, -2, 12, 0, + 2, 2, 10, -3, 12, 0, + 4, 2, 13, -1, 12, 4, 2, -4, 3, 0, + 3, 1, 14, 4, 2, -6, 3, 0, + 2, 1, 13, 1, 2, 0, + 3, 2, 10, 1, 11, -1, 12, 0, + 4, 2, 10, -1, 11, 1, 12, -2, 13, 0, + 2, 1, 10, 1, 11, 0, + 3, 1, 10, 1, 12, -1, 13, 0, + 2, 1, 11, 1, 12, 0, + 3, 3, 12, -2, 13, -1, 3, 0, + 3, 4, 10, -1, 12, -2, 13, 0, + 3, 2, 10, 1, 12, -2, 13, 0, + 4, 1, 10, 1, 11, 1, 12, -1, 13, 0, + 2, 2, 11, 1, 12, 0, + 2, 3, 12, -2, 13, 0, + 4, 2, 10, 1, 11, 1, 12, -2, 13, 0, + 3, 1, 11, 3, 12, -2, 13, 0, + 3, 4, 10, 1, 12, -4, 13, 0, + 4, 2, 10, 2, 11, 1, 12, -2, 13, 0, + 4, 1, 10, 2, 11, 1, 12, -4, 13, 0, + 4, 1, 10, 1, 11, 1, 12, -4, 13, 0, + 4, 1, 10, 3, 11, -1, 12, -2, 13, 0, + 4, 1, 10, -2, 11, -1, 12, 2, 13, 0, + 3, 1, 11, 1, 12, -3, 13, 0, + 3, 1, 10, 1, 12, -4, 13, 0, + 4, 1, 10, 2, 11, -1, 12, -2, 13, 0, + 3, 3, 10, -1, 12, -4, 13, 0, + 4, 1, 10, -1, 11, -1, 12, 2, 13, 0, + 2, 1, 12, -3, 13, 0, + 4, 1, 10, -1, 11, 1, 12, -4, 13, 0, + 4, 1, 10, 1, 11, -1, 12, -2, 13, 0, + 3, 2, 10, -1, 12, -3, 13, 0, + 3, 1, 10, -1, 12, 2, 13, 0, + 3, 1, 10, -2, 11, 1, 12, 0, + 3, 1, 11, -1, 12, 3, 13, 0, + 1, 2, 13, 0, + 3, 1, 11, -1, 12, -1, 13, 0, + 3, 1, 10, -3, 13, -1, 3, 0, + 3, 1, 10, -1, 12, -2, 13, 2, + 3, 3, 10, -1, 11, -1, 12, 0, + 3, 2, 10, -1, 12, 1, 13, 0, + 4, 1, 10, 1, 11, -1, 12, 2, 13, 0, + 3, 1, 10, -1, 11, 1, 12, 0, + 2, 1, 12, 1, 13, 0, + 4, 1, 10, -1, 11, -1, 12, -2, 13, 0, + 3, 1, 10, 1, 11, -3, 12, 0, + 2, 3, 10, -1, 12, 0, + 1, 2, 10, 0, + 4, 2, 10, -1, 11, 1, 12, -1, 13, 0, + 3, 1, 13, 1, 10, 1, 11, 0, + 3, 2, 13, 3, 3, -2, 11, 0, + 2, 1, 10, 1, 12, 2, + 3, 1, 10, -3, 14, 2, 5, 0, + 3, 3, 10, -1, 14, 4, 5, 0, + 3, 1, 11, 1, 12, 1, 13, 0, + 1, 2, 12, 0, + 4, 1, 10, -2, 11, -1, 12, -2, 13, 0, + 2, 1, 10, -3, 12, 0, + 3, 3, 10, 1, 11, -1, 12, 0, + 4, 3, 10, -1, 11, 1, 12, -2, 13, 0, + 3, 2, 10, 1, 12, -1, 13, 0, + 3, 1, 10, 1, 11, 1, 12, 0, + 2, 3, 12, -1, 13, 0, + 3, 1, 10, -1, 11, -3, 12, 0, + 3, 3, 10, 1, 12, -2, 13, 0, + 3, 1, 10, 2, 11, 1, 12, 0, + 3, 1, 10, 3, 12, -2, 13, 0, + 4, 3, 10, 1, 11, 1, 12, -2, 13, 0, + 4, 1, 10, 1, 11, 3, 12, -2, 13, 0, + 4, 2, 10, 1, 11, 1, 12, -6, 13, 0, + 3, 2, 11, 1, 12, -4, 13, 0, + 3, 2, 10, 1, 12, -6, 13, 0, + 4, 2, 10, 2, 11, -1, 12, -4, 13, 0, + 3, 1, 11, 1, 12, -4, 13, 0, + 3, 3, 11, -1, 12, -2, 13, 0, + 3, 1, 10, 1, 12, -5, 13, 0, + 4, 2, 10, 1, 11, -1, 12, -4, 13, 0, + 2, 1, 12, -4, 13, 0, + 3, 2, 11, -1, 12, -2, 13, 0, + 2, 1, 10, -4, 13, 0, + 4, 1, 10, 1, 11, -1, 12, -3, 13, 0, + 3, 2, 10, -1, 12, -4, 13, 0, + 4, 2, 10, -1, 11, -1, 12, 2, 13, 0, + 3, 1, 10, -1, 12, 3, 13, 0, + 3, 1, 11, -1, 12, 4, 13, 0, + 3, 1, 11, -1, 12, -2, 13, 0, + 3, 1, 10, -1, 12, -3, 13, 0, + 4, 2, 10, -1, 11, -1, 12, -4, 13, 0, + 3, 2, 10, -1, 12, 2, 13, 0, + 3, 2, 10, -2, 11, 1, 12, 0, + 2, 1, 10, 2, 13, 0, + 4, 1, 10, -1, 11, 1, 12, 1, 13, 0, + 2, 1, 12, 2, 13, 1, + 4, 1, 10, -1, 11, -1, 12, -3, 13, 0, + 3, 2, 10, -3, 12, -2, 13, 0, + 4, 2, 10, 1, 11, -1, 12, 2, 13, 0, + 3, 2, 10, -1, 11, 1, 12, 0, + 3, 1, 10, 1, 12, 1, 13, 0, + 3, 1, 11, 1, 12, 2, 13, 0, + 2, 4, 10, -1, 12, 0, + 2, 2, 10, 1, 12, 1, + 4, 1, 13, 1, 12, 10, 2, -2, 3, 0, + 3, 2, 11, 1, 12, 2, 13, 0, + 2, 2, 12, 1, 14, 0, + 1, 3, 12, 0, + 3, 3, 10, 1, 12, -1, 13, 0, + 3, 2, 10, 1, 11, 1, 12, 0, + 3, 4, 10, 1, 12, -2, 13, 0, + 3, 2, 10, 3, 12, -2, 13, 0, + 3, 4, 10, -9, 3, -1, 4, 0, + 4, 1, 10, 1, 11, 1, 12, -6, 13, 0, + 3, 1, 10, 1, 12, -6, 13, 0, + 4, 1, 10, 2, 11, -1, 12, -4, 13, 0, + 3, 3, 10, -1, 12, -6, 13, 0, + 4, 1, 10, -1, 11, -1, 12, 4, 13, 0, + 4, 1, 10, 1, 11, -1, 12, -4, 13, 0, + 3, 1, 10, -1, 12, 4, 13, 0, + 4, 1, 10, -2, 11, 1, 12, 2, 13, 0, + 3, 1, 10, -1, 12, -4, 13, 0, + 4, 3, 10, -1, 11, -1, 12, 2, 13, 0, + 4, 1, 10, 1, 11, -1, 12, 4, 13, 0, + 4, 1, 10, -1, 11, 1, 12, 2, 13, 0, + 2, 1, 12, 3, 13, 0, + 4, 1, 10, -1, 11, -1, 12, -4, 13, 0, + 3, 3, 10, -1, 12, 2, 13, 0, + 3, 1, 10, 1, 12, 2, 13, 0, + 3, 1, 11, 1, 12, 3, 13, 0, + 3, 1, 10, -3, 12, -2, 13, 0, + 3, 3, 10, -1, 11, 1, 12, 0, + 3, 2, 10, 1, 12, 1, 13, 0, + 4, 1, 10, 1, 11, 1, 12, 2, 13, 0, + 2, 3, 10, 1, 12, 0, + 4, 2, 10, 1, 11, 1, 12, 1, 13, 0, + 2, 1, 10, 3, 12, 0, + 3, 3, 10, 1, 11, 1, 12, 0, + 3, 5, 10, 1, 12, -2, 13, 0, + 3, 4, 14, -4, 2, 8, 3, 0, + 3, 5, 10, -9, 3, -1, 4, 0, + 4, 2, 10, 1, 11, -1, 12, -6, 13, 0, + 2, 1, 12, -6, 13, 0, + 3, 2, 11, -1, 12, -4, 13, 0, + 3, 2, 10, -1, 12, -6, 13, 0, + 3, 1, 11, -1, 12, -4, 13, 0, + 3, 2, 10, -1, 12, 4, 13, 0, + 2, 1, 12, 4, 13, 0, + 4, 2, 10, -1, 11, 1, 12, 2, 13, 0, + 3, 1, 11, 1, 12, 4, 13, 0, + 3, 1, 11, -3, 12, -2, 13, 0, + 3, 4, 10, -1, 12, 2, 13, 0, + 3, 2, 10, 1, 12, 2, 13, 0, + 4, 2, 10, 1, 11, 1, 12, 2, 13, 0, + 2, 4, 10, 1, 12, 0, + 3, 7, 12, -2, 10, -4, 5, 0, + 3, 1, 10, -1, 12, -6, 13, 0, + 4, 1, 10, -1, 11, 1, 12, 4, 13, 0, + 3, 1, 10, 1, 12, 4, 13, 0, + 4, 3, 10, -1, 11, 1, 12, 2, 13, 0, + 3, 3, 10, 1, 12, 2, 13, 0, + 2, 5, 10, 1, 12, 0, + 2, 1, 12, 6, 13, 0, + 3, 2, 10, 1, 12, 4, 13, 0, + 3, 4, 10, 1, 12, 2, 13, 0, + -1 +}; + +/* Total terms = 254, small = 254 */ +static struct plantbl liblat = { + /* { 0, 18, 18, 20, 4, 0, 0, 0, 0, 9, 3, 7, 9, 9,}, */ + /* Use max of liblon, liblat. */ + { 0, 18, 18, 20, 4, 2, 0, 0, 0, 9, 16, 7, 9, 9,}, + 2, + latargs, + lattabl, + lattabb, + lattabr, + 3.850000e+05, + 36525.0, + 1.0e-4, +}; + +/* lblon403.c */ +static int lontabr[] = {-1}; +static int lontabb[] = {-1}; +static int lontabl[] = { + -640001, + + -19, 3, + + -1, 0, + + -3, 17, + + 2, -9, + + 2, 3, + + 141, 1816, + + 2, -76, + + 78, -81, + + 3, 1, + + 50, -13, + + -12, 18, + + -6, 74, + + 19, 10, + + -19, 701, + + -26, 37, + + 36, -122, + + 131, -71, + + -40, 1, + + 61463, 12853, + + 5, -29, + + 354, 201, + + 94, -5, + + 31, 25, + + -73, -22, + + 673, 1435, + + 3844, 44, + + -44, -8, + + 195, -16, + + -827, -171768, + + 7051, -4116, + + 1036, 616, -2034, 6300, -13786, -3808, + + -118, -536, -1246, 771, 2555, 3214, + + 203, 26, + + 2975, -715, + + -743, 1286, + + -232, -50, + + 4, 234, + + -139, 475, + + 0, -98, + + -3, -11848, + + 0, 118, + + -202, 146, + + -33673, 7601, + + -150, 88, + + -1720, 1002, + + -293, 481, + + -2078, 1, + + 199, 220655, + + 137, 7459, + + -127, 28, + + -10, 2259, + + 4, 450, + + -26, 30, -76, 19043, 215, -7577830, + + -65, -45, + + -5, -14189, + + -6, -496, + + 9, 3265, + + 0, -131, + + 48, -90, + + -9, -155, + + -2, 21, + + 151, 19, + + -101, -516, + + -827, 3, 796, 2, 134, -2215850, + + -11, -1908, + + 0, 451, + + -2, 1399, + + 3, 7, + + -163, 5, + + -1582, 61, + + -22, -77215, + + 167, -471084, + + -85, -28, + + 1, -473, + + -1, 444, + + 4, 89, + + 6, -88, + + -157, -87813, + + 3, 274, + + -3, -1036, + + 7, -17005, + + -1, -332, + + 0, 50, + + -1, -228, + + -5, -2986, + + -1, -334, + + 1, -452, + + 0, 4, + + 0, -247, + + -3, -2493, + + -4, -1000, + + 0, -160, + + 0, -3163, + + -75, -74207, + + 13, 829, + + 32, 481, + + -33, -11859, + + -2, -3634, + + 7, -1611, + + 3, 520, + + -1, 2534, + + 5, -446, + + -471, 8, 399, 5160, 201, -2057189, + + 83, -2106, + + 11, 12240, + + 3, -270, + + 248, 1112, + + -63, -61809, + + -183, 594, + + 27, 25844, + + -3, 5594, + + 8, 571, + + -23, -1855, + + 477, -466, + + 0, -1257, + + 247, 1550, + + -10178, -175, 9570, -423, 2610, -45917681, + + -51, 937, + + -1001, 168, + + -168, 882, + + 1260, -2894, 4306, -1515, + + 7, 402, + + 0, 36, + + -280, -373, + + -19, 840, + + -1227, -138, + + 3486, 1478247, + + 1649, -644, + + 840, 377, + + 47, -1464, + + 167, -1251123, + + -194, -713, 133, 284429, + + 0, -191, + + -3, 1534, + + -700, 918, + + -7, -633, + + -221, -559, + + 1, 99, + + -17, -3513, + + -30, 14, + + -602, -5006, + + 908, 4178, + + 542, -379, + + 1568, 782, 528, 2761, + + -38994, -25804, + + 1696398, -324306, + + 47292, 71061, 457883, 52470, 159777, 224906030, + + -13068, -18508, + + -104, 3754, + + 541, 614, -290, 1412, + + -48, 162, + + 42, -50, + + -609, -4969, + + 44, -11435, + + -473, -412, + + 22, -6389, + + -87, 44, + + -39, 180182, + + -4186, -2227, + + -503, -208, + + 976, -512, -1016, -4403, + + 16, 25357, + + 565, -891, + + 28, 38836, + + -659, -855, + + -200, 619, + + 1, -1780, + + 24, 17531, + + 1053, 335, + + 502, 2745, -309, -1094576, + + -1, -263, + + 3, -394, + + 0, 4152, + + -1, -467, + + -339, -132142, + + -14, -11676, + + 29, 63360, + + 0, 129, + + -12, -4802, + + -1, -180, + + 2, 3424, + + 0, 45, + + -1, -155, + + -1, -74, + + 0, -134, + + -4, -1588, + + -1, -3424, + + 2, 119, + + -57, -27417, + + 0, 168, + + 0, 206, + + -21, -80823, + + 8, 2324, + + -4, 835, + + 396, -6, -244, -308040, + + 0, -294, + + -56, -1332, + + 2, -110, + + 306, 4060, -58, -1644587, + + -155, -210, + + 67, -1642, + + 27, 32070, + + 9, 3592, + + -8, -17, + + -1, 2, + + -9, -4580, + + 5, 1940, + + 5, -1217, + + 62, -862, + + -522, -1163, + + 0, 0, + + -1646, 1, 1169, 109, 1395, 23634968, + + 2, 0, + + -512, 1148, + + -9, 32, + + 0, -2749, + + 969, -4, + + 2, 351, + + 1, 105, + + 152, 97075, + + -55, -84524, + + -49, 607, 29, -242117, + + 4, 6518, + + 5, -77, + + 1, -39, + + 9, 1, + + 5, -231, + + 2296, -10, -2453, 3, 138, 7689964, + + 0, -689, + + 1, 12635, + + 5444, 372, + + 9, -1843, + + 3485, -560, + + 909, 3, -742, -1, -66, -6945414, + + 8, -7, + + -3, -181, + + 1, 1282, + + -115, -76497, + + 3, -90, + + 1, -142, + + -5, 10263, + + -33, -9479, + + 0, -657, + + 19, 15040, + + -2, 1084, + + -1, -295, + + -161, 403, + + 0, -175, + + -1, -392, + + -4, -3096, + + -9, -2928, + + 1, 332, + + -56, -43733, + + 1, 572, + + 2, -660, + + 4, 7540, + + 4, -659, + + -505, -382941, + + -3, 256, + + 2, 30, + + 76, 145296, + + -4, 4115, + + 9, 6329, + + 11, 6962, + + 0, -338, + + 1, 153, + + 2, -147, + + -270, 211, + + -519, 97, 385, 1912268, + + -1, 1495, + + -3, 223, + + 254, 152832, + + 15, 6709, + + -8, -5835, + + -12, -29016, + + 0, -5641, + + -2, 4217, + + -2, -1176, + + -496, 4, 331, 360972, + + 1, 918, + + -2, -136, + + -111, -762309, + + 2, -610, + + 1, 96, + + -11, -5468, + + 0, 4856, + + 0, -2, + + -16, -668, + + 20, 1963, + + -1, -95, + + 0, -83, + + 0, -96, + + -2, -902, + + 0, -1523, + + -14, -5691, + + -10, -18650, + + 0, 131, + + 0, 128, + + 0, 243, + + 1, 644, + + -76, 138046, + + -1, 316, + + 8, 2703, + + 15, 11758, + + -1, 16, + + 2, -2867, + + 5, 6504, + + 180, 143085, + + -1, 224, + + 86, -96384, + + 1, 471, + + 0, -407, + + -3, -2886, + + -1, -919, + + 0, 742, + + -2, 1145, + + 59, 19306, + + 0, 67, + + -61, -67569, + + -14, 11725, + + -1, -395, + + 1, 772, + + -1, -49, + + 563, 871, 1951, -22, + + -1, -711, + + 0, 240, + + -6, -3912, + + 1, 2812, + + 0, 106, + + 0, 378, + + 4, 19609, + + 6, 3331, + + 2, 930, + + 0, -37, + + 0, -502, + + 0, -1257, + + 21, 10531, + + 2, -16662, + + 0, -267, + + -1, 22, + + 6, 1104, + + -14, -5544, + + 1, -250, + + -1, 1248, + + 0, 325, + + 2, 2163, + + 2, -1421, + + 0, 73, + + -1, -67, + + 2, 771, + + -1, -2085, + + 0, 67, + + 1, 226, + + 1, 212, + + 0, 56, + +}; + +static CHAR lonargs[] = { + 0, 0, + 4, 1, 10, 3, 11,-18, 2, 13, 3, 0, + 4, -2, 12, 2, 13, 5, 2, -6, 3, 0, + 4, 2, 10, -2, 13, -2, 3, 3, 5, 0, + 3, 1, 10, -1, 14, 1, 5, 0, + 4, -2, 10, 2, 13, -5, 3, -6, 4, 0, + 2, 1, 12, -1, 14, 0, + 4, -2, 10, 2, 13, 2, 3, -2, 5, 0, + 2, 1, 3, -2, 4, 0, + 4, -1, 12, 1, 13, -3, 2, 6, 3, 0, + 1, 1, 5, 0, + 4, -1, 10, 2, 13,-15, 2, 13, 3, 0, + 4, 2, 10, -2, 13, -3, 2, 3, 3, 0, + 2, 2, 12, -2, 14, 0, + 3, 1, 10, -1, 11, -1, 13, 0, + 2, 11, 2,-18, 3, 0, + 2, 3, 2, -5, 3, 0, + 2, 2, 3, -4, 4, 0, + 2, 5, 2, -8, 3, 0, + 2, 1, 10, -1, 12, 0, + 4, -1, 12, 1, 14, 3, 2, -5, 3, 0, + 3, 6, 12, -6, 13, -4, 2, 0, + 2, 3, 3, -6, 4, 0, + 2, 5, 3, -9, 4, 0, + 4, -1, 10, 2, 13,-18, 2, 18, 3, 0, + 3, 2, 10, -2, 3, -2, 13, 0, + 2, 2, 2, -3, 3, 0, + 4, 2, 10, -2, 13, -4, 2, 5, 3, 0, + 2, 4, 3, -7, 4, 0, + 2, 2, 10, -2, 12, 0, + 2, 3, 3, -5, 4, 0, + 3, 3, 2, -4, 3, -1, 4, 2, + 3, 1, 2, -5, 3, 7, 4, 2, + 4, -2, 10, 2, 13, 5, 2, -6, 3, 0, + 2, 1, 2, -2, 3, 0, + 2, 2, 3, -3, 4, 0, + 4, -1, 12, 1, 14, 4, 2, -6, 3, 0, + 2, 1, 3, -1, 4, 0, + 2, 4, 2, -6, 3, 0, + 4, 2, 10, -2, 13, -2, 2, 2, 3, 0, + 2, 1, 2, -1, 3, 0, + 3, 2, 10, 1, 11, -2, 12, 0, + 2, 1, 3, -3, 5, 0, + 3, 2, 10, -1, 3, -2, 13, 0, + 2, 4, 3, -6, 4, 0, + 2, 1, 3, -2, 5, 0, + 2, 3, 3, -4, 4, 0, + 2, 3, 2, -4, 3, 0, + 2, 1, 10, -1, 13, 0, + 2, 1, 3, -1, 5, 0, + 2, 1, 3, -2, 6, 0, + 2, 2, 3, -2, 4, 0, + 2, 1, 3, -1, 6, 0, + 1, 1, 11, 2, + 2, 1, 3, 1, 5, 0, + 3, 1, 11, -2, 12, 2, 13, 0, + 3, 1, 10, -2, 12, 1, 13, 0, + 2, 2, 2, -2, 3, 0, + 3, 2, 10, -1, 11, -2, 12, 0, + 2, 4, 3, -5, 4, 0, + 2, 3, 3, -3, 4, 0, + 3, 4, 10, -2, 12, -2, 13, 0, + 1, 1, 2, 0, + 2, 2, 3, -3, 5, 0, + 2, 2, 10, -2, 13, 2, + 2, 2, 3, -2, 5, 0, + 2, 3, 3, -3, 2, 0, + 3, 1, 10, 1, 11, -1, 13, 0, + 3, 3, 3, -1, 2, 1, 4, 0, + 2, 2, 3, -1, 5, 0, + 3, 1, 10, 1, 12, -2, 13, 0, + 1, 2, 11, 0, + 2, 2, 12, -2, 13, 0, + 2, 2, 2, -1, 3, 0, + 2, 4, 2, -4, 3, 0, + 2, 3, 10, -3, 13, 0, + 4, 2, 10, -2, 13, 1, 3, -1, 5, 0, + 2, 3, 3, -3, 5, 0, + 3, 2, 10, 1, 11, -2, 13, 0, + 3, 1, 10, 2, 12, -3, 13, 0, + 1, 3, 11, 0, + 3, 1, 11, 2, 12, -2, 13, 0, + 2, 5, 2, -5, 3, 0, + 2, 4, 10, -4, 13, 0, + 2, 6, 2, -6, 3, 0, + 3, 2, 10, 2, 11, -2, 13, 0, + 3, 2, 10, 2, 12, -4, 13, 0, + 3, 2, 11, 2, 12, -2, 13, 0, + 3, 4, 10, 1, 11, -4, 13, 0, + 4, 1, 10, 1, 11, 2, 12, -4, 13, 0, + 3, 1, 10, 3, 11, -2, 13, 0, + 3, 3, 10, 1, 11, -4, 13, 0, + 4, 1, 10, -2, 11, -2, 12, 2, 13, 0, + 3, 1, 10, 2, 12, -4, 13, 0, + 3, 1, 10, 2, 11, -2, 13, 0, + 3, 2, 10, 1, 11, -3, 13, 0, + 3, 1, 13, -2, 2, 1, 4, 0, + 2, 3, 10, -4, 13, 0, + 4, 1, 10, -1, 11, -2, 12, 2, 13, 0, + 4, -1, 10, 2, 13, -2, 2, 2, 3, 0, + 2, 1, 10, -3, 11, 0, + 2, 2, 12, -3, 13, 0, + 2, 2, 11, -1, 13, 0, + 3, 1, 10, 1, 11, -2, 13, 2, + 4, -1, 10, 2, 13, -1, 3, 1, 5, 0, + 2, 2, 10, -3, 13, 0, + 3, 3, 10, -1, 11, -4, 13, 0, + 3, 4, 11, 2, 13,-11, 2, 0, + 3, 1, 10, -2, 12, 2, 13, 0, + 3, 1, 12, -2, 13, 1, 5, 0, + 2, 1, 10, -2, 11, 0, + 2, 1, 11, -1, 13, 0, + 3, 1, 10, -2, 13, 1, 5, 0, + 3, 1, 10, -2, 3, 2, 5, 0, + 3, 18, 2,-18, 3, 2, 5, 0, + 3, 1, 10, -3, 2, 3, 3, 0, + 3, 2, 13, 16, 11,-18, 2, 0, + 2, 1, 10, -2, 13, 2, + 3, 1, 13, -2, 10, 5, 4, 0, + 3, 2, 12, -2, 14, 7, 2, 0, + 3, 1, 10, -2, 3, 3, 5, 0, + 3, 1, 12, -1, 3, -2, 5, 1, + 3, 2, 10, -1, 11, -3, 13, 0, + 3, 3, 10, -2, 12, -2, 13, 0, + 2, 8, 2, -1, 3, 0, + 4, 1, 10, 1, 11, -2, 12, 2, 13, 0, + 3, 1, 12, -2, 14, 2, 4, 0, + 2, 1, 10, -1, 11, 0, + 3, 8, 2, -5, 3, 8, 4, 0, + 2, 18, 2,-17, 3, 0, + 3, 1, 10, -1, 3, 1, 5, 0, + 1, 1, 13, 0, + 3, 1, 10, -1, 11, -2, 13, 1, + 3, 1, 10, 1, 11, -2, 12, 0, + 3, 1, 10, -1, 2, 1, 3, 0, + 3, 2, 13, -8, 2, 1, 3, 0, + 2, 3, 10, -2, 12, 0, + 3, 2, 10, -1, 12, -1, 5, 0, + 3, 3, 10, -2, 11, -2, 13, 0, + 3, 2, 10, -1, 11, -1, 13, 0, + 3, 2, 10, 1, 3, -2, 4, 0, + 3, 1, 12, -1, 10, -1, 14, 0, + 4, -1, 10, 2, 13, 2, 3, -3, 5, 0, + 3, 2, 13, -4, 2, -5, 3, 0, + 3, 2, 12, 2, 10, -3, 14, 1, + 2, 1, 12, -2, 5, 0, + 2, 10, 2, -3, 11, 0, + 1, 1, 10, 2, + 3, 1, 12, -2, 10, -2, 5, 0, + 2, 18, 2,-16, 3, 0, + 2, 2, 12, -3, 14, 1, + 3, 1, 13,-17, 2, 2, 11, 0, + 3, 1, 10, 1, 2, -3, 4, 0, + 3, 1, 12, 1, 10, -1, 14, 0, + 4, -1, 10, 2, 13, 2, 3, -2, 5, 0, + 3, 1, 10, -1, 3, 2, 4, 0, + 4, -1, 10, 2, 13, 3, 2, -3, 3, 0, + 4, 1, 10, -2, 11, 2, 12, -2, 13, 0, + 2, 1, 11, 1, 13, 0, + 3, 8, 2, 2, 3, -3, 4, 0, + 1, 1, 12, 0, + 3, 6, 2, 9, 3,-10, 4, 1, + 3, 1, 10, -2, 11, -2, 13, 0, + 2, 8, 2, 1, 4, 0, + 2, 1, 10, -2, 12, 0, + 2, 11, 2, -4, 3, 0, + 3, 3, 11, -2, 14, 6, 2, 0, + 3, 3, 10, -1, 11, -2, 13, 0, + 2, 2, 10, -1, 13, 0, + 3, 1, 12, -2, 2, 4, 3, 0, + 2, 1, 10, 1, 11, 1, + 4, 1, 10, -1, 11, 2, 12, -2, 13, 0, + 2, 2, 11, 1, 13, 0, + 2, 2, 12, -1, 13, 0, + 3, 1, 10, -1, 11, -2, 12, 0, + 2, 3, 10, -2, 13, 0, + 2, 1, 10, 2, 11, 0, + 3, 1, 10, 2, 12, -2, 13, 0, + 3, 1, 11, 2, 12, -1, 13, 0, + 3, 3, 10, 1, 11, -2, 13, 0, + 2, 1, 10, 3, 11, 0, + 4, 1, 10, 1, 11, 2, 12, -2, 13, 0, + 2, 5, 10, -4, 13, 0, + 3, 3, 10, 2, 11, -2, 13, 0, + 3, 3, 10, 2, 12, -4, 13, 0, + 2, 4, 11, -2, 13, 0, + 3, 2, 10, 2, 11, -4, 13, 0, + 2, 3, 11, -2, 13, 0, + 3, 1, 10, 2, 11, -3, 13, 0, + 3, 2, 10, 1, 11, -4, 13, 0, + 2, 3, 10, -5, 13, 0, + 2, 2, 12, -4, 13, 0, + 2, 2, 11, -2, 13, 0, + 3, 1, 10, 1, 11, -3, 13, 0, + 3, 2, 13, -2, 3, 2, 5, 0, + 2, 2, 10, -4, 13, 1, + 4, 2, 10, -1, 11, -2, 12, 2, 13, 0, + 2, 2, 14, -2, 2, 0, + 3, 1, 10, -2, 12, 3, 13, 0, + 2, 1, 11, -2, 13, 1, + 3, 2, 14, -2, 2, 3, 5, 0, + 3, 2, 13, -1, 3, 1, 5, 0, + 2, 1, 10, -3, 13, 0, + 3, 2, 10, -1, 11, -4, 13, 0, + 4, 2, 10, 1, 11, -2, 12, -2, 13, 0, + 3, 2, 13, 1, 14, -8, 2, 0, + 3, 2, 10, -2, 12, 2, 13, 0, + 2, 2, 10, -2, 11, 0, + 3, 1, 10, -1, 11, 1, 13, 0, + 3, 1, 12, -2, 13, -1, 14, 0, + 3, 2, 13, -8, 2, 13, 3, 0, + 3, 3, 10, -5, 13, 5, 4, 0, + 1, 2, 13, 2, + 3, 3, 10, -1, 13, 5, 4, 0, + 3, 2, 13, 8, 2,-13, 3, 0, + 2, 2, 11, -2, 12, 0, + 3, 1, 10, -1, 11, -3, 13, 0, + 3, 1, 10, -1, 12, -2, 13, 0, + 3, 2, 10, -2, 11, -4, 13, 0, + 3, 2, 10, -2, 12, -2, 13, 0, + 2, 2, 10, -1, 11, 0, + 2, 1, 10, 1, 13, 0, + 2, 1, 11, 2, 13, 1, + 2, 1, 11, -2, 12, 0, + 3, 1, 10, -2, 12, -1, 13, 0, + 2, 4, 10, -2, 12, 0, + 2, 3, 10, -1, 12, 0, + 3, 3, 10, -1, 11, -1, 13, 0, + 1, 2, 10, 2, + 2, 2, 14, -2, 5, 0, + 3, 1, 10, 1, 11, 1, 13, 0, + 2, 1, 10, 1, 12, 0, + 2, 2, 11, 2, 13, 0, + 2, 1, 12, 1, 14, 0, + 1, 2, 12, 2, + 2, 1, 10, -3, 12, 0, + 3, 4, 10, -1, 11, -2, 13, 0, + 2, 3, 10, -1, 13, 0, + 2, 2, 10, 1, 11, 0, + 3, 1, 10, 2, 11, 1, 13, 0, + 3, 1, 10, 2, 12, -1, 13, 0, + 2, 1, 11, 2, 12, 0, + 2, 4, 10, -2, 13, 0, + 2, 2, 10, 2, 11, 0, + 3, 2, 10, 2, 12, -2, 13, 0, + 2, 4, 12, -2, 13, 0, + 3, 4, 10, 1, 11, -2, 13, 0, + 3, 2, 13, 11, 2,-13, 3, 0, + 3, 1, 10, 3, 11, -4, 13, 0, + 3, 3, 10, 1, 11, -6, 13, 0, + 3, 1, 10, 2, 11, -4, 13, 0, + 2, 3, 10, -6, 13, 0, + 3, 1, 10, -3, 11, 2, 13, 0, + 3, 1, 10, 1, 11, -4, 13, 0, + 2, 2, 10, -5, 13, 0, + 3, 1, 10, -2, 12, 4, 13, 0, + 3, 1, 10, -2, 11, 2, 13, 0, + 2, 1, 11, -3, 13, 0, + 2, 1, 10, -4, 13, 0, + 4, 1, 10, 2, 11, -2, 12, -2, 13, 0, + 3, 3, 10, -2, 12, -4, 13, 0, + 3, 1, 10, -1, 11, 2, 13, 0, + 1, 3, 13, 0, + 3, 1, 10, -1, 11, -4, 13, 0, + 4, 1, 10, 1, 11, -2, 12, -2, 13, 0, + 3, 3, 10, -2, 12, 2, 13, 0, + 2, 3, 10, -2, 11, 0, + 3, 2, 10, -1, 11, 1, 13, 0, + 3, 1, 12, 2, 13, -2, 5, 0, + 2, 1, 10, 2, 13, 1, + 2, 1, 11, 3, 13, 0, + 3, 1, 10, -2, 11, -4, 13, 0, + 3, 1, 10, -2, 12, -2, 13, 0, + 2, 3, 10, -1, 11, 0, + 2, 2, 10, 1, 13, 0, + 3, 1, 10, 1, 11, 2, 13, 0, + 3, 1, 10, -1, 11, 2, 12, 0, + 2, 2, 12, 1, 13, 0, + 4, 1, 10, -1, 11, -2, 12, -2, 13, 0, + 1, 3, 10, 1, + 3, 2, 10, 1, 11, 1, 13, 0, + 3, 1, 10, 2, 11, 2, 13, 0, + 2, 1, 10, 2, 12, 0, + 3, 1, 11, 2, 12, 1, 13, 0, + 2, 4, 10, -1, 13, 0, + 2, 3, 10, 1, 11, 0, + 3, 1, 10, 1, 11, 2, 12, 0, + 4, 1, 10, -1, 11, 4, 12, -2, 13, 0, + 2, 5, 10, -2, 13, 0, + 3, 3, 10, 2, 12, -2, 13, 0, + 3, 1, 10, 4, 12, -2, 13, 0, + 3, 2, 10, 2, 11, -6, 13, 0, + 2, 3, 11, -4, 13, 0, + 3, 2, 10, 1, 11, -6, 13, 0, + 2, 2, 11, -4, 13, 0, + 2, 2, 10, -6, 13, 0, + 2, 1, 11, -4, 13, 0, + 2, 1, 10, -5, 13, 0, + 3, 2, 10, -1, 11, -6, 13, 0, + 4, 2, 10, 1, 11, -2, 12, -4, 13, 0, + 3, 2, 10, -2, 11, 2, 13, 0, + 1, 4, 13, 0, + 3, 2, 11, -2, 12, -2, 13, 0, + 3, 2, 10, -2, 12, -4, 13, 0, + 3, 2, 10, -1, 11, 2, 13, 0, + 2, 1, 10, 3, 13, 0, + 2, 1, 11, 4, 13, 0, + 3, 1, 11, -2, 12, -2, 13, 0, + 2, 2, 10, 2, 13, 0, + 3, 1, 10, 1, 11, 3, 13, 0, + 2, 2, 12, 2, 13, 0, + 2, 4, 10, -1, 11, 0, + 2, 3, 10, 1, 13, 0, + 3, 2, 10, 1, 11, 2, 13, 0, + 3, 2, 10, -1, 11, 2, 12, 0, + 3, 1, 10, 2, 12, 1, 13, 0, + 3, 1, 11, 2, 12, 2, 13, 0, + 1, 4, 10, 0, + 3, 3, 10, 1, 11, 1, 13, 0, + 2, 2, 10, 2, 12, 0, + 1, 4, 12, 0, + 2, 4, 10, 1, 11, 0, + 3, 2, 10, 1, 11, 2, 12, 0, + 2, 6, 10, -2, 13, 0, + 3, 5, 12, -1, 14, 2, 4, 1, + 3, 1, 10, 1, 11, -6, 13, 0, + 3, 1, 10, -2, 11, 4, 13, 0, + 2, 1, 10, -6, 13, 0, + 3, 1, 10, -1, 11, 4, 13, 0, + 3, 1, 10, -1, 11, -6, 13, 0, + 4, 1, 10, 1, 11, -2, 12, -4, 13, 0, + 2, 1, 10, 4, 13, 0, + 3, 1, 10, -2, 12, -4, 13, 0, + 3, 3, 10, -1, 11, 2, 13, 0, + 2, 2, 10, 3, 13, 0, + 3, 1, 10, 1, 11, 4, 13, 0, + 4, 1, 10, -1, 11, 2, 12, 2, 13, 0, + 2, 3, 10, 2, 13, 0, + 3, 1, 10, 2, 12, 2, 13, 0, + 3, 3, 10, 1, 11, 2, 13, 0, + 3, 1, 10, -1, 11, 4, 12, 0, + 1, 5, 10, 0, + 2, 3, 10, 2, 12, 0, + 2, 1, 11, -6, 13, 0, + 1, 6, 13, 0, + 3, 2, 10, -1, 11, 4, 13, 0, + 2, 2, 10, 4, 13, 0, + 2, 2, 12, 4, 13, 0, + 3, 4, 10, -1, 11, 2, 13, 0, + 3, 2, 10, 1, 11, 4, 13, 0, + 2, 4, 10, 2, 13, 0, + 3, 2, 10, 2, 12, 2, 13, 0, + 1, 6, 10, 0, + 2, 1, 10, 6, 13, 0, + 2, 3, 10, 4, 13, 0, + 2, 5, 10, 2, 13, 0, + -1 +}; + +/* Total terms = 356, small = 356 */ +static struct plantbl liblon = { + /* { 0, 18, 18, 10, 3, 2, 0, 0, 0, 6, 16, 6, 6, 3,}, */ + /* Use max of liblon, liblat. */ + { 0, 18, 18, 20, 4, 2, 0, 0, 0, 9, 16, 7, 9, 9,}, + 2, + lonargs, + lontabl, + lontabb, + lontabr, + 3.850000e+05, + 36525.0, + 1.0e-4, +}; + + +/* given a Julian date, return the lunar libration in lat and long, in rads. + */ +void +llibration (double JD, double *llatp, double *llonp) +{ + double lg, lt; /* arc seconds */ + + lg = gplan (JD, &liblon); + lt = gplan (JD, &liblat); + + *llonp = degrad (lg/3600.0); + *llatp = degrad (lt/3600.0); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: libration.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/magdecl.c b/Common/Libraries/XEphemAstroLib/src/magdecl.c new file mode 100644 index 000000000..f3efa98fb --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/magdecl.c @@ -0,0 +1,381 @@ +/* DoD NIMA World Magnetic Model. + * from http://www.ngdc.noaa.gov + * +#define TEST_MAIN + */ + + +#include +#include +#include +#include + +#include "astro.h" + +static char mfn[] = "wmm.cof"; /* file with model coefficients */ + +static int geomag(FILE *wmmdat, int *maxdeg); +static int geomg1(FILE *wmmdat, float alt, float glat, float glon, + float t, float *dec, float *mdp, float *ti, float *gv); + +/* compute magnetic declination for given location, elevation and time. + * sign is such that mag bearing = true az + mag deviation. + * return 0 if ok, -1 if no model file, -2 if time outside model range. + * fill err[] with excuse if return < 0. + */ +int +magdecl ( +double l, double L, /* geodesic lat, +N, long, +E, rads */ +double e, /* elevation, m */ +double y, /* time, decimal year */ +char *dir, /* dir for model file */ +double *mdp, /* magnetic deviation, rads E of N */ +char *err) /* err message if return < 0 */ +{ + float dlat = raddeg(l); + float dlon = raddeg(L); + float alt = e/1000.; + int maxdeg = 12; + float dec, dp, ti, gv; + char mfile[1024]; + FILE *wmmdat; + int s; + + /* open model file */ + sprintf (mfile, "%s/%s", dir, mfn); + wmmdat = fopen (mfile, "r"); + if (!wmmdat) { + sprintf (err, "%s: %s", mfile, strerror(errno)); + return (-1); + } + + /* compute deviation */ + geomag(wmmdat, &maxdeg); + s = geomg1(wmmdat,alt,dlat,dlon,y,&dec,&dp,&ti,&gv); + fclose(wmmdat); + if (s < 0) { + sprintf (err, "%s: Magnetic model only available for %g .. %g. See http://www.ngdc.noaa.gov", mfile, ti, ti+5); + return (-2); + } + *mdp = degrad(dec); + return (0); +} + +#if defined(TEST_MAIN) + +int +main(int ac, char *av[]) +{ + char err[1024]; + float altm, dlat, dlon; + float t; + double dec; + + S1: + printf("\n\n\n ENTER LATITUDE IN DECIMAL DEGREES (+25.0)\n"); + scanf("%f", &dlat); + + printf(" ENTER LONGITUDE IN DECIMAL DEGREES (-100.0)\n"); + scanf("%f", &dlon); + + printf(" ENTER ALTITUDE IN METERS\n"); + scanf("%f", &altm); + + printf(" ENTER TIME IN DECIMAL YEAR\n"); + scanf("%f",&t); + + if (magdecl (degrad(dlat), degrad(dlon), altm, t, "auxil", &dec, + err) < 0) { + printf ("%s\n", err); + return(1); + } + + printf("\n LATITUDE: = %-7.2f DEG",dlat); + printf("\n LONGITUDE: = %-7.2f DEG\n",dlon); + printf("\n ALTITUDE = %.2f METERS",altm); + printf("\n DATE = %-5.1f\n",t); + + printf("\n\t\t\t OUTPUT\n\t\t\t ------"); + + printf("\n DEC = %-7.2f DEG", raddeg(dec)); + + printf("\n\n\n DO YOU NEED MORE POINT DATA? (y or n)\n"); + scanf("%s", err); + if ((err[0] =='y')||(err[0] == 'Y')) goto S1; + + return(0); +} +#endif /* defined(TEST_MAIN) */ + +/************************************************************************* + * return 0 if ok, -1 if time is out of range with base epoc in *ti + */ + +static int E0000(FILE *wmmdat, int IENTRY, int *maxdeg, float alt, +float glat, float glon, float t, float *dec, float *mdp, float *ti, +float *gv) +{ + static int maxord,i,icomp,n,m,j,D1,D2,D3,D4; + static float c[13][13],cd[13][13],tc[13][13],dp[13][13],snorm[169], + sp[13],cp[13],fn[13],fm[13],pp[13],k[13][13],pi,dtr,a,b,re, + a2,b2,c2,a4,b4,c4,epoc,gnm,hnm,dgnm,dhnm,flnmj,otime,oalt, + olat,olon,dt,rlon,rlat,srlon,srlat,crlon,crlat,srlat2, + crlat2,q,q1,q2,ct,st,r2,r,d,ca,sa,aor,ar,br,bt,bp,bpp, + par,temp1,temp2,parp,bx,by,bz,bh; + static char model[20], c_str[81], c_new[5]; + static float *p = snorm; + + switch(IENTRY){case 0: goto GEOMAG; case 1: goto GEOMG1;} + +GEOMAG: + +/* INITIALIZE CONSTANTS */ + maxord = *maxdeg; + sp[0] = 0.0; + cp[0] = *p = pp[0] = 1.0; + dp[0][0] = 0.0; + a = 6378.137; + b = 6356.7523142; + re = 6371.2; + a2 = a*a; + b2 = b*b; + c2 = a2-b2; + a4 = a2*a2; + b4 = b2*b2; + c4 = a4 - b4; + +/* READ WORLD MAGNETIC MODEL SPHERICAL HARMONIC COEFFICIENTS */ + c[0][0] = 0.0; + cd[0][0] = 0.0; + fgets(c_str, 80, wmmdat); + sscanf(c_str,"%f%s",&epoc,model); +S3: + fgets(c_str, 80, wmmdat); +/* CHECK FOR LAST LINE IN FILE */ + for (i=0; i<4 && (c_str[i] != '\0'); i++) + { + c_new[i] = c_str[i]; + c_new[i+1] = '\0'; + } + icomp = strcmp("9999", c_new); + if (icomp == 0) goto S4; +/* END OF FILE NOT ENCOUNTERED, GET VALUES */ + sscanf(c_str,"%d%d%f%f%f%f",&n,&m,&gnm,&hnm,&dgnm,&dhnm); + if (m <= n) + { + c[m][n] = gnm; + cd[m][n] = dgnm; + if (m != 0) + { + c[n][m-1] = hnm; + cd[n][m-1] = dhnm; + } + } + goto S3; + +/* CONVERT SCHMIDT NORMALIZED GAUSS COEFFICIENTS TO UNNORMALIZED */ +S4: + *snorm = 1.0; + for (n=1; n<=maxord; n++) + { + *(snorm+n) = *(snorm+n-1)*(float)(2*n-1)/(float)n; + j = 2; + for (m=0,D1=1,D2=(n-m+D1)/D1; D2>0; D2--,m+=D1) + { + k[m][n] = (float)(((n-1)*(n-1))-(m*m))/(float)((2*n-1)*(2*n-3)); + if (m > 0) + { + flnmj = (float)((n-m+1)*j)/(float)(n+m); + *(snorm+n+m*13) = *(snorm+n+(m-1)*13)*sqrt(flnmj); + j = 1; + c[n][m-1] = *(snorm+n+m*13)*c[n][m-1]; + cd[n][m-1] = *(snorm+n+m*13)*cd[n][m-1]; + } + c[m][n] = *(snorm+n+m*13)*c[m][n]; + cd[m][n] = *(snorm+n+m*13)*cd[m][n]; + } + fn[n] = (float)(n+1); + fm[n] = (float)n; + } + k[1][1] = 0.0; + + otime = oalt = olat = olon = -1000.0; + return (0); + +/*************************************************************************/ + +GEOMG1: + + dt = t - epoc; + if (otime < 0.0 && (dt < 0.0 || dt > 5.0)) { + *ti = epoc; /* pass back base time for diag msg */ + return (-1); + } + + pi = 3.14159265359; + dtr = pi/180.0; + rlon = glon*dtr; + rlat = glat*dtr; + srlon = sin(rlon); + srlat = sin(rlat); + crlon = cos(rlon); + crlat = cos(rlat); + srlat2 = srlat*srlat; + crlat2 = crlat*crlat; + sp[1] = srlon; + cp[1] = crlon; + +/* CONVERT FROM GEODETIC COORDS. TO SPHERICAL COORDS. */ + if (alt != oalt || glat != olat) + { + q = sqrt(a2-c2*srlat2); + q1 = alt*q; + q2 = ((q1+a2)/(q1+b2))*((q1+a2)/(q1+b2)); + ct = srlat/sqrt(q2*crlat2+srlat2); + st = sqrt(1.0-(ct*ct)); + r2 = (alt*alt)+2.0*q1+(a4-c4*srlat2)/(q*q); + r = sqrt(r2); + d = sqrt(a2*crlat2+b2*srlat2); + ca = (alt+d)/r; + sa = c2*crlat*srlat/(r*d); + } + if (glon != olon) + { + for (m=2; m<=maxord; m++) + { + sp[m] = sp[1]*cp[m-1]+cp[1]*sp[m-1]; + cp[m] = cp[1]*cp[m-1]-sp[1]*sp[m-1]; + } + } + aor = re/r; + ar = aor*aor; + br = bt = bp = bpp = 0.0; + for (n=1; n<=maxord; n++) + { + ar = ar*aor; + for (m=0,D3=1,D4=(n+m+D3)/D3; D4>0; D4--,m+=D3) + { +/* + COMPUTE UNNORMALIZED ASSOCIATED LEGENDRE POLYNOMIALS + AND DERIVATIVES VIA RECURSION RELATIONS +*/ + if (alt != oalt || glat != olat) + { + if (n == m) + { + *(p+n+m*13) = st**(p+n-1+(m-1)*13); + dp[m][n] = st*dp[m-1][n-1]+ct**(p+n-1+(m-1)*13); + goto S50; + } + if (n == 1 && m == 0) + { + *(p+n+m*13) = ct**(p+n-1+m*13); + dp[m][n] = ct*dp[m][n-1]-st**(p+n-1+m*13); + goto S50; + } + if (n > 1 && n != m) + { + if (m > n-2) *(p+n-2+m*13) = 0.0; + if (m > n-2) dp[m][n-2] = 0.0; + *(p+n+m*13) = ct**(p+n-1+m*13)-k[m][n]**(p+n-2+m*13); + dp[m][n] = ct*dp[m][n-1] - st**(p+n-1+m*13)-k[m][n]*dp[m][n-2]; + } + } +S50: +/* + TIME ADJUST THE GAUSS COEFFICIENTS +*/ + if (t != otime) + { + tc[m][n] = c[m][n]+dt*cd[m][n]; + if (m != 0) tc[n][m-1] = c[n][m-1]+dt*cd[n][m-1]; + } +/* + ACCUMULATE TERMS OF THE SPHERICAL HARMONIC EXPANSIONS +*/ + par = ar**(p+n+m*13); + if (m == 0) + { + temp1 = tc[m][n]*cp[m]; + temp2 = tc[m][n]*sp[m]; + } + else + { + temp1 = tc[m][n]*cp[m]+tc[n][m-1]*sp[m]; + temp2 = tc[m][n]*sp[m]-tc[n][m-1]*cp[m]; + } + bt = bt-ar*temp1*dp[m][n]; + bp += (fm[m]*temp2*par); + br += (fn[n]*temp1*par); +/* + SPECIAL CASE: NORTH/SOUTH GEOGRAPHIC POLES +*/ + if (st == 0.0 && m == 1) + { + if (n == 1) pp[n] = pp[n-1]; + else pp[n] = ct*pp[n-1]-k[m][n]*pp[n-2]; + parp = ar*pp[n]; + bpp += (fm[m]*temp2*parp); + } + } + } + if (st == 0.0) bp = bpp; + else bp /= st; +/* + ROTATE MAGNETIC VECTOR COMPONENTS FROM SPHERICAL TO + GEODETIC COORDINATES +*/ + bx = -bt*ca-br*sa; + by = bp; + bz = bt*sa-br*ca; +/* + COMPUTE DECLINATION (DEC), INCLINATION (DIP) AND + TOTAL INTENSITY (TI) +*/ + bh = sqrt((bx*bx)+(by*by)); + *ti = sqrt((bh*bh)+(bz*bz)); + *dec = atan2(by,bx)/dtr; + *mdp = atan2(bz,bh)/dtr; +/* + COMPUTE MAGNETIC GRID VARIATION IF THE CURRENT + GEODETIC POSITION IS IN THE ARCTIC OR ANTARCTIC + (I.E. GLAT > +55 DEGREES OR GLAT < -55 DEGREES) + + OTHERWISE, SET MAGNETIC GRID VARIATION TO -999.0 +*/ + *gv = -999.0; + if (fabs(glat) >= 55.) + { + if (glat > 0.0 && glon >= 0.0) *gv = *dec-glon; + if (glat > 0.0 && glon < 0.0) *gv = *dec+fabs(glon); + if (glat < 0.0 && glon >= 0.0) *gv = *dec+glon; + if (glat < 0.0 && glon < 0.0) *gv = *dec-fabs(glon); + if (*gv > +180.0) *gv -= 360.0; + if (*gv < -180.0) *gv += 360.0; + } + otime = t; + oalt = alt; + olat = glat; + olon = glon; + return (0); +} + +/*************************************************************************/ + +static int +geomag(FILE *wmmdat, int *maxdeg) +{ + return (E0000(wmmdat,0,maxdeg,0.0,0.0,0.0,0.0,NULL,NULL,NULL,NULL)); +} + +/*************************************************************************/ + +static int +geomg1(FILE *wmmdat, float alt, float glat, float glon, float t, +float *dec, float *mdp, float *ti, float *gv) +{ + return (E0000(wmmdat,1,NULL,alt,glat,glon,t,dec,mdp,ti,gv)); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: magdecl.c,v $ $Date: 2004/10/12 15:21:48 $ $Revision: 1.6 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/marsmoon.c b/Common/Libraries/XEphemAstroLib/src/marsmoon.c new file mode 100644 index 000000000..b09b13526 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/marsmoon.c @@ -0,0 +1,265 @@ +/* mars moon info */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "bdl.h" + +static int use_bdl (double JD, char *dir, MoonData md[M_NMOONS]); +static void moonradec (double msize, MoonData md[M_NMOONS]); +static void moonSVis (Obj *sop, Obj *mop, MoonData md[M_NMOONS]); +static void moonEVis (MoonData md[M_NMOONS]); +static void moonPShad (Obj *sop, Obj *mop, MoonData md[M_NMOONS]); +static void moonTrans (MoonData md[M_NMOONS]); + +/* moon table and a few other goodies and when it was last computed */ +static double mdmjd = -123456; +static MoonData mmd[M_NMOONS] = { + {"Mars", NULL}, + {"Phobos", "I"}, + {"Deimos", "II"}, +}; +static double sizemjd; + +/* These values are from the Explanatory Supplement. + * Precession degrades them gradually over time. + */ +#define POLE_RA degrad(317.61) +#define POLE_DEC degrad(52.85) + + +/* get mars info in md[0], moon info in md[1..M_NMOONS-1]. + * if !dir always use bruton model. + * if !mop caller just wants md[] for names + * N.B. we assume sop and mop are updated. + */ +void +marsm_data ( +double Mjd, /* mjd */ +char dir[], /* dir in which to look for helper files */ +Obj *sop, /* Sun */ +Obj *mop, /* mars */ +double *sizep, /* mars's angular diam, rads */ +double *polera, double *poledec,/* pole location */ +MoonData md[M_NMOONS]) /* return info */ +{ + double JD, dmag; + + /* always copy back at least for name */ + memcpy (md, mmd, sizeof(mmd)); + + /* pole */ + if (polera) *polera = POLE_RA; + if (poledec) *poledec = POLE_DEC; + + /* nothing else if repeat call or just want names */ + if (Mjd == mdmjd || !mop) { + if (mop) { + *sizep = sizemjd; + } + return; + } + JD = Mjd + MJD0; + + /* planet in [0] */ + md[0].ra = mop->s_ra; + md[0].dec = mop->s_dec; + md[0].mag = get_mag(mop); + md[0].x = 0; + md[0].y = 0; + md[0].z = 0; + md[0].evis = 1; + md[0].svis = 1; + + /* size is straight from mop */ + *sizep = degrad(mop->s_size/3600.0); + + /* from Pasachoff/Menzel: brightest @ .6 AU */ + dmag = 5.0*log10(mop->s_edist + 0.4); + md[1].mag = 11.8 + dmag; + md[2].mag = 12.9 + dmag; + + /* get moon x,y,z from BDL if possible */ + if (!dir || use_bdl (JD, dir, md) < 0) { + int i; + for (i = 1; i < M_NMOONS; i++) + md[i].x = md[i].y = md[i].z = 0.0; + fprintf (stderr, "No mars model available\n"); + } + + /* set visibilities */ + moonSVis (sop, mop, md); + moonPShad (sop, mop, md); + moonEVis (md); + moonTrans (md); + + /* fill in moon ra and dec */ + moonradec (*sizep, md); + + /* save */ + mdmjd = Mjd; + sizemjd = *sizep; + memcpy (mmd, md, sizeof(mmd)); +} + +/* hunt for BDL file in dir[] and use if possible. + * return 0 if ok, else -1 + */ +static int +use_bdl ( +double JD, /* julian date */ +char dir[], /* directory */ +MoonData md[M_NMOONS]) /* fill md[1..NM-1].x/y/z for each moon */ +{ +#define MRAU .00002269 /* Mars radius, AU */ + double x[M_NMOONS], y[M_NMOONS], z[M_NMOONS]; + char buf[1024]; + FILE *fp; + char *fn; + int i; + + /* check ranges and appropriate data file */ + if (JD < 2451179.50000) /* Jan 1 1999 UTC */ + return (-1); + if (JD < 2455562.5) /* Jan 1 2011 UTC */ + fn = "mars.9910"; + else if (JD < 2459215.5) /* Jan 1 2021 UTC */ + fn = "mars.1020"; + else + return (-1); + + /* open */ + (void) sprintf (buf, "%s/%s", dir, fn); + fp = fopen (buf, "r"); + if (!fp) { + fprintf (stderr, "%s: %s\n", fn, strerror(errno)); + return (-1); + } + + /* use it */ + if ((i = read_bdl (fp, JD, x, y, z, buf)) < 0) { + fprintf (stderr, "%s: %s\n", fn, buf); + fclose (fp); + return (-1); + } + if (i != M_NMOONS-1) { + fprintf (stderr, "%s: BDL says %d moons, code expects %d", fn, + i, M_NMOONS-1); + fclose (fp); + return (-1); + } + + /* copy into md[1..NM-1] with our scale and sign conventions */ + for (i = 1; i < M_NMOONS; i++) { + md[i].x = x[i-1]/MRAU; /* we want mars radii +E */ + md[i].y = -y[i-1]/MRAU; /* we want mars radii +S */ + md[i].z = -z[i-1]/MRAU; /* we want mars radii +front */ + } + + /* ok */ + fclose (fp); + return (0); +} + +/* given mars loc in md[0].ra/dec and size, and location of each moon in + * md[1..NM-1].x/y in mars radii,find ra/dec of each moon in md[1..NM-1].ra/dec. + */ +static void +moonradec ( +double msize, /* mars diameter, rads */ +MoonData md[M_NMOONS]) /* fill in RA and Dec */ +{ + double mrad = msize/2; + double mra = md[0].ra; + double mdec = md[0].dec; + int i; + + for (i = 1; i < M_NMOONS; i++) { + double dra = mrad * md[i].x; + double ddec = mrad * md[i].y; + md[i].ra = mra + dra; + md[i].dec = mdec - ddec; + } +} + +/* set svis according to whether moon is in sun light */ +static void +moonSVis( +Obj *sop, /* SUN */ +Obj *mop, /* mars */ +MoonData md[M_NMOONS]) +{ + double esd = sop->s_edist; + double eod = mop->s_edist; + double sod = mop->s_sdist; + double soa = degrad(mop->s_elong); + double esa = asin(esd*sin(soa)/sod); + double h = sod*mop->s_hlat; + double nod = h*(1./eod - 1./sod); + double sca = cos(esa), ssa = sin(esa); + int i; + + for (i = 1; i < M_NMOONS; i++) { + MoonData *mdp = &md[i]; + double xp = sca*mdp->x + ssa*mdp->z; + double yp = mdp->y; + double zp = -ssa*mdp->x + sca*mdp->z; + double ca = cos(nod), sa = sin(nod); + double xpp = xp; + double ypp = ca*yp - sa*zp; + double zpp = sa*yp + ca*zp; + int outside = xpp*xpp + ypp*ypp > 1.0; + int infront = zpp > 0.0; + mdp->svis = outside || infront; + } +} + +/* set evis according to whether moon is geometrically visible from earth */ +static void +moonEVis (MoonData md[M_NMOONS]) +{ + int i; + + for (i = 1; i < M_NMOONS; i++) { + MoonData *mdp = &md[i]; + int outside = mdp->x*mdp->x + mdp->y*mdp->y > 1.0; + int infront = mdp->z > 0.0; + mdp->evis = outside || infront; + } +} + +/* set pshad and sx,sy shadow info */ +static void +moonPShad( +Obj *sop, /* SUN */ +Obj *mop, /* mars */ +MoonData md[M_NMOONS]) +{ + int i; + + for (i = 1; i < M_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->pshad = !plshadow (mop, sop, POLE_RA, POLE_DEC, mdp->x, + mdp->y, mdp->z, &mdp->sx, &mdp->sy); + } +} + +/* set whether moons are transiting */ +static void +moonTrans (MoonData md[M_NMOONS]) +{ + int i; + + for (i = 1; i < M_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->trans = mdp->z > 0 && mdp->x*mdp->x + mdp->y*mdp->y < 1; + } +} + + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: marsmoon.c,v $ $Date: 2006/08/29 03:16:47 $ $Revision: 1.8 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/misc.c b/Common/Libraries/XEphemAstroLib/src/misc.c new file mode 100644 index 000000000..504713733 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/misc.c @@ -0,0 +1,503 @@ +/* misc handy functions. + * every system has such, no? + * 4/20/98 now_lst() always just returns apparent time + */ + +#include +#include +#include +#include + +#include "astro.h" + +/* zero from loc for len bytes */ +void +zero_mem (void *loc, unsigned len) +{ + (void) memset (loc, 0, len); +} + +/* given min and max and an approximate number of divisions desired, + * fill in ticks[] with nicely spaced values and return how many. + * N.B. return value, and hence number of entries to ticks[], might be as + * much as 2 more than numdiv. + */ +int +tickmarks (double min, double max, int numdiv, double ticks[]) +{ + static int factor[] = { 1, 2, 5 }; + double minscale; + double delta; + double lo; + double v; + int n; + + minscale = fabs(max - min); + delta = minscale/numdiv; + for (n=0; n < (int)(sizeof(factor)/sizeof(factor[0])); n++) { + double scale; + double x = delta/factor[n]; + if ((scale = (pow(10.0, ceil(log10(x)))*factor[n])) < minscale) + minscale = scale; + } + delta = minscale; + + lo = floor(min/delta); + for (n = 0; (v = delta*(lo+n)) < max+delta; ) + ticks[n++] = v; + + return (n); +} + +/* given an Obj *, return its type as a descriptive string. + * if it's of type fixed then return its class description. + * N.B. we return the address of static storage -- do not free or change. + */ +char * +obj_description (Obj *op) +{ + typedef struct { + char classcode; + char *desc; + } CC; + +#define NFCM ((int)(sizeof(fixed_class_map)/sizeof(fixed_class_map[0]))) + static CC fixed_class_map[] = { + {'A', "Cluster of Galaxies"}, + {'B', "Binary System"}, + {'C', "Globular Cluster"}, + {'D', "Double Star"}, + {'F', "Diffuse Nebula"}, + {'G', "Spiral Galaxy"}, + {'H', "Spherical Galaxy"}, + {'J', "Radio"}, + {'K', "Dark Nebula"}, + {'L', "Pulsar"}, + {'M', "Multiple Star"}, + {'N', "Bright Nebula"}, + {'O', "Open Cluster"}, + {'P', "Planetary Nebula"}, + {'Q', "Quasar"}, + {'R', "Supernova Remnant"}, + {'S', "Star"}, + {'T', "Star-like Object"}, + {'U', "Cluster, with nebulosity"}, + {'V', "Variable Star"}, + {'Y', "Supernova"}, + }; + +#define NBCM ((int)(sizeof(binary_class_map)/sizeof(binary_class_map[0]))) + static CC binary_class_map[] = { + {'a', "Astrometric binary"}, + {'c', "Cataclysmic variable"}, + {'e', "Eclipsing binary"}, + {'x', "High-mass X-ray binary"}, + {'y', "Low-mass X-ray binary"}, + {'o', "Occultation binary"}, + {'s', "Spectroscopic binary"}, + {'t', "1-line spectral binary"}, + {'u', "2-line spectral binary"}, + {'v', "Spectrum binary"}, + {'b', "Visual binary"}, + {'d', "Visual binary, apparent"}, + {'q', "Visual binary, optical"}, + {'r', "Visual binary, physical"}, + {'p', "Exoplanet"}, + }; + + switch (op->o_type) { + case FIXED: + if (op->f_class) { + int i; + for (i = 0; i < NFCM; i++) + if (fixed_class_map[i].classcode == op->f_class) + return (fixed_class_map[i].desc); + } + return ("Fixed"); + case PARABOLIC: + return ("Solar - Parabolic"); + case HYPERBOLIC: + return ("Solar - Hyperbolic"); + case ELLIPTICAL: + return ("Solar - Elliptical"); + case BINARYSTAR: + if (op->f_class) { + int i; + for (i = 0; i < NFCM; i++) + if (binary_class_map[i].classcode == op->f_class) + return (binary_class_map[i].desc); + } + return ("Binary system"); + case PLANET: { + static char nsstr[16]; + static Obj *biop; + + if (op->pl_code == SUN) + return ("Star"); + if (op->pl_code == MOON) + return ("Moon of Earth"); + if (op->pl_moon == X_PLANET) + return ("Planet"); + if (!biop) + getBuiltInObjs (&biop); + sprintf (nsstr, "Moon of %s", biop[op->pl_code].o_name); + return (nsstr); + } + case EARTHSAT: + return ("Earth Sat"); + default: + printf ("obj_description: unknown type: 0x%x\n", op->o_type); + abort(); + return (NULL); /* for lint */ + } +} + +/* given a Now *, find the local apparent sidereal time, in hours. + */ +void +now_lst (Now *np, double *lstp) +{ + static double last_mjd = -23243, last_lng = 121212, last_lst; + double eps, lst, deps, dpsi; + + if (last_mjd == mjd && last_lng == lng) { + *lstp = last_lst; + return; + } + + utc_gst (mjd_day(mjd), mjd_hr(mjd), &lst); + lst += radhr(lng); + + obliquity(mjd, &eps); + nutation(mjd, &deps, &dpsi); + lst += radhr(dpsi*cos(eps+deps)); + + range (&lst, 24.0); + + last_mjd = mjd; + last_lng = lng; + *lstp = last_lst = lst; +} + +/* convert ra to ha, in range 0..2*PI + * need dec too if not already apparent. + */ +void +radec2ha (Now *np, double ra, double dec, double *hap) +{ + double ha, lst; + + if (epoch != EOD) + as_ap (np, epoch, &ra, &dec); + now_lst (np, &lst); + ha = hrrad(lst) - ra; + if (ha < 0) + ha += 2*PI; + *hap = ha; +} + +/* find Greenwich Hour Angle of the given object at the given time, 0..2*PI. + */ +void +gha (Now *np, Obj *op, double *ghap) +{ + Now n = *np; + Obj o = *op; + double tmp; + + n.n_epoch = EOD; + n.n_lng = 0.0; + n.n_lat = 0.0; + obj_cir (&n, &o); + now_lst (&n, &tmp); + tmp = hrrad(tmp) - o.s_ra; + if (tmp < 0) + tmp += 2*PI; + *ghap = tmp; +} + +/* given a circle and a line segment, find a segment of the line inside the + * circle. + * return 0 and the segment end points if one exists, else -1. + * We use a parametric representation of the line: + * x = x1 + (x2-x1)*t and y = y1 + (y2-y1)*t, 0 < t < 1 + * and a centered representation of the circle: + * (x - xc)**2 + (y - yc)**2 = r**2 + * and solve for the t's that work, checking for usual conditions. + */ +int +lc ( +int cx, int cy, int cw, /* circle bbox corner and width */ +int x1, int y1, int x2, int y2, /* line segment endpoints */ +int *sx1, int *sy1, int *sx2, int *sy2) /* segment inside the circle */ +{ + int dx = x2 - x1; + int dy = y2 - y1; + int r = cw/2; + int xc = cx + r; + int yc = cy + r; + int A = x1 - xc; + int B = y1 - yc; + double a = dx*dx + dy*dy; /* O(2 * 2**16 * 2**16) */ + double b = 2*(dx*A + dy*B); /* O(4 * 2**16 * 2**16) */ + double c = A*A + B*B - r*r; /* O(2 * 2**16 * 2**16) */ + double d = b*b - 4*a*c; /* O(2**32 * 2**32) */ + double sqrtd; + double t1, t2; + + if (d <= 0) + return (-1); /* containing line is purely outside circle */ + + sqrtd = sqrt(d); + t1 = (-b - sqrtd)/(2.0*a); + t2 = (-b + sqrtd)/(2.0*a); + + if (t1 >= 1.0 || t2 <= 0.0) + return (-1); /* segment is purely outside circle */ + + /* we know now that some part of the segment is inside, + * ie, t1 < 1 && t2 > 0 + */ + + if (t1 <= 0.0) { + /* (x1,y1) is inside circle */ + *sx1 = x1; + *sy1 = y1; + } else { + *sx1 = (int)(x1 + dx*t1); + *sy1 = (int)(y1 + dy*t1); + } + + if (t2 >= 1.0) { + /* (x2,y2) is inside circle */ + *sx2 = x2; + *sy2 = y2; + } else { + *sx2 = (int)(x1 + dx*t2); + *sy2 = (int)(y1 + dy*t2); + } + + return (0); +} + +/* compute visual magnitude using the H/G parameters used in the Astro Almanac. + * these are commonly used for asteroids. + */ +void +hg_mag ( +double h, double g, +double rp, /* sun-obj dist, AU */ +double rho, /* earth-obj dist, AU */ +double rsn, /* sun-earth dist, AU */ +double *mp) +{ + double psi_t, Psi_1, Psi_2, beta; + double c; + double tb2; + + c = (rp*rp + rho*rho - rsn*rsn)/(2*rp*rho); + if (c <= -1) + beta = PI; + else if (c >= 1) + beta = 0; + else + beta = acos(c);; + tb2 = tan(beta/2.0); + /* psi_t = exp(log(tan(beta/2.0))*0.63); */ + psi_t = pow (tb2, 0.63); + Psi_1 = exp(-3.33*psi_t); + /* psi_t = exp(log(tan(beta/2.0))*1.22); */ + psi_t = pow (tb2, 1.22); + Psi_2 = exp(-1.87*psi_t); + *mp = h + 5.0*log10(rp*rho); + if (Psi_1 || Psi_2) *mp -= 2.5*log10((1-g)*Psi_1 + g*Psi_2); +} + +/* given faintest desired mag, mag step magstp, image scale and object + * magnitude and size, return diameter to draw object, in pixels, or 0 if + * dimmer than fmag. + */ +int +magdiam ( +int fmag, /* faintest mag */ +int magstp, /* mag range per dot size */ +double scale, /* rads per pixel */ +double mag, /* magnitude */ +double size) /* rads, or 0 */ +{ + int diam, sized; + + if (mag > fmag) + return (0); + diam = (int)((fmag - mag)/magstp + 1); + sized = (int)(size/scale + 0.5); + if (sized > diam) + diam = sized; + + return (diam); +} + +/* computer visual magnitude using the g/k parameters commonly used for comets. + */ +void +gk_mag ( +double g, double k, +double rp, /* sun-obj dist, AU */ +double rho, /* earth-obj dist, AU */ +double *mp) +{ + *mp = g + 5.0*log10(rho) + 2.5*k*log10(rp); +} + +/* given a string convert to floating point and return it as a double. + * this is to isolate possible unportabilities associated with declaring atof(). + * it's worth it because atof() is often some 50% faster than sscanf ("%lf"); + */ +double +atod (char *buf) +{ + return (strtod (buf, NULL)); +} + +/* solve a spherical triangle: + * A + * / \ + * / \ + * c / \ b + * / \ + * / \ + * B ____________ C + * a + * + * given A, b, c find B and a in range 0..B..2PI and 0..a..PI, respectively.. + * cap and Bp may be NULL if not interested in either one. + * N.B. we pass in cos(c) and sin(c) because in many problems one of the sides + * remains constant for many values of A and b. + */ +void +solve_sphere (double A, double b, double cc, double sc, double *cap, double *Bp) +{ + double cb = cos(b), sb = sin(b); + double sA, cA = cos(A); + double x, y; + double ca; + double B; + + ca = cb*cc + sb*sc*cA; + if (ca > 1.0) ca = 1.0; + if (ca < -1.0) ca = -1.0; + if (cap) + *cap = ca; + + if (!Bp) + return; + + if (sc < 1e-7) + B = cc < 0 ? A : PI-A; + else { + sA = sin(A); + y = sA*sb*sc; + x = cb - ca*cc; + B = y ? (x ? atan2(y,x) : (y>0 ? PI/2 : -PI/2)) : (x>=0 ? 0 : PI); + } + + *Bp = B; + range (Bp, 2*PI); +} + +/* #define WANT_MATHERR if your system supports it. it gives SGI fits. + */ +#undef WANT_MATHERR +#if defined(WANT_MATHERR) +/* attempt to do *something* reasonable when a math function blows. + */ +matherr (xp) +struct exception *xp; +{ + static char *names[8] = { + "acos", "asin", "atan2", "pow", + "exp", "log", "log10", "sqrt" + }; + int i; + + /* catch-all */ + xp->retval = 0.0; + + for (i = 0; i < sizeof(names)/sizeof(names[0]); i++) + if (strcmp (xp->name, names[i]) == 0) + switch (i) { + case 0: /* acos */ + xp->retval = xp->arg1 >= 1.0 ? 0.0 : -PI; + break; + case 1: /* asin */ + xp->retval = xp->arg1 >= 1.0 ? PI/2 : -PI/2; + break; + case 2: /* atan2 */ + if (xp->arg1 == 0.0) + xp->retval = xp->arg2 < 0.0 ? PI : 0.0; + else if (xp->arg2 == 0.0) + xp->retval = xp->arg1 < 0.0 ? -PI/2 : PI/2; + else + xp->retval = 0.0; + break; + case 3: /* pow */ + /* FALLTHRU */ + case 4: /* exp */ + xp->retval = xp->o_type == OVERFLOW ? 1e308 : 0.0; + break; + case 5: /* log */ + /* FALLTHRU */ + case 6: /* log10 */ + xp->retval = xp->arg1 <= 0.0 ? -1e308 : 0; + break; + case 7: /* sqrt */ + xp->retval = 0.0; + break; + } + + return (1); /* suppress default error handling */ +} +#endif + +/* given the difference in two RA's, in rads, return their difference, + * accounting for wrap at 2*PI. caller need *not* first force it into the + * range 0..2*PI. + */ +double +delra (double dra) +{ + double fdra = fmod(fabs(dra), 2*PI); + + if (fdra > PI) + fdra = 2*PI - fdra; + return (fdra); +} + +/* return 1 if object is considered to be "deep sky", else 0. + * The only things deep-sky are fixed objects other than stars. + */ +int +is_deepsky (Obj *op) +{ + int deepsky = 0; + + if (is_type(op, FIXEDM)) { + switch (op->f_class) { + case 'T': + case 'B': + case 'D': + case 'M': + case 'S': + case 'V': + break; + default: + deepsky = 1; + break; + } + } + + return (deepsky); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: misc.c,v $ $Date: 2005/03/11 16:47:46 $ $Revision: 1.18 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/mjd.c b/Common/Libraries/XEphemAstroLib/src/mjd.c new file mode 100644 index 000000000..b875a7b92 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/mjd.c @@ -0,0 +1,256 @@ +/* functions to manipulate the modified-julian-date used throughout xephem. */ + +#include +#include + +#include "astro.h" + +/* given a date in months, mn, days, dy, years, yr, + * return the modified Julian date (number of days elapsed since 1900 jan 0.5), + * *mjd. + */ +void +cal_mjd (int mn, double dy, int yr, double *mjp) +{ + static double last_mjd, last_dy; + static int last_mn, last_yr; + int b, d, m, y; + long c; + + if (mn == last_mn && yr == last_yr && dy == last_dy) { + *mjp = last_mjd; + return; + } + + m = mn; + y = (yr < 0) ? yr + 1 : yr; + if (mn < 3) { + m += 12; + y -= 1; + } + + if (yr < 1582 || (yr == 1582 && (mn < 10 || (mn == 10 && dy < 15)))) + b = 0; + else { + int a; + a = y/100; + b = 2 - a + a/4; + } + + if (y < 0) + c = (long)((365.25*y) - 0.75) - 694025L; + else + c = (long)(365.25*y) - 694025L; + + d = (int)(30.6001*(m+1)); + + *mjp = b + c + d + dy - 0.5; + + last_mn = mn; + last_dy = dy; + last_yr = yr; + last_mjd = *mjp; +} + +/* given the modified Julian date (number of days elapsed since 1900 jan 0.5,), + * mj, return the calendar date in months, *mn, days, *dy, and years, *yr. + */ +void +mjd_cal (double mj, int *mn, double *dy, int *yr) +{ + static double last_mj, last_dy; + static int last_mn, last_yr; + double d, f; + double i, a, b, ce, g; + + /* we get called with 0 quite a bit from unused epoch fields. + * 0 is noon the last day of 1899. + */ + if (mj == 0.0) { + *mn = 12; + *dy = 31.5; + *yr = 1899; + return; + } + + if (mj == last_mj) { + *mn = last_mn; + *yr = last_yr; + *dy = last_dy; + return; + } + + d = mj + 0.5; + i = floor(d); + f = d-i; + if (f == 1) { + f = 0; + i += 1; + } + + if (i > -115860.0) { + a = floor((i/36524.25)+.99835726)+14; + i += 1 + a - floor(a/4.0); + } + + b = floor((i/365.25)+.802601); + ce = i - floor((365.25*b)+.750001)+416; + g = floor(ce/30.6001); + *mn = (int)(g - 1); + *dy = ce - floor(30.6001*g)+f; + *yr = (int)(b + 1899); + + if (g > 13.5) + *mn = (int)(g - 13); + if (*mn < 2.5) + *yr = (int)(b + 1900); + if (*yr < 1) + *yr -= 1; + + last_mn = *mn; + last_dy = *dy; + last_yr = *yr; + last_mj = mj; +} + +/* given an mjd, set *dow to 0..6 according to which day of the week it falls + * on (0=sunday). + * return 0 if ok else -1 if can't figure it out. + */ +int +mjd_dow (double mj, int *dow) +{ + /* cal_mjd() uses Gregorian dates on or after Oct 15, 1582. + * (Pope Gregory XIII dropped 10 days, Oct 5..14, and improved the leap- + * year algorithm). however, Great Britian and the colonies did not + * adopt it until Sept 14, 1752 (they dropped 11 days, Sept 3-13, + * due to additional accumulated error). leap years before 1752 thus + * can not easily be accounted for from the cal_mjd() number... + */ + if (mj < -53798.5) { + /* pre sept 14, 1752 too hard to correct |:-S */ + return (-1); + } + *dow = ((long)floor(mj-.5) + 1) % 7;/* 1/1/1900 (mj 0.5) is a Monday*/ + if (*dow < 0) + *dow += 7; + return (0); +} + +/* given a year, return whether it is a leap year */ +int +isleapyear (int y) +{ + return ((y%4==0 && y%100!=0) || y%400==0); +} + +/* given a mjd, return the the number of days in the month. */ +void +mjd_dpm (double mj, int *ndays) +{ + static short dpm[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + int m, y; + double d; + + mjd_cal (mj, &m, &d, &y); + *ndays = (m==2 && isleapyear(y)) ? 29 : dpm[m-1]; +} + +/* given a mjd, return the year and number of days since 00:00 Jan 1 */ +void +mjd_dayno (double mj, int *yr, double *dy) +{ + double yrd; + int yri; + int dpy; + + mjd_year (mj, &yrd); + *yr = yri = (int)yrd; + dpy = isleapyear(yri) ? 366 : 365; + *dy = dpy*(yrd-yri); +} + +/* given a mjd, return the year as a double. */ +void +mjd_year (double mj, double *yr) +{ + static double last_mj, last_yr; + int m, y; + double d; + double e0, e1; /* mjd of start of this year, start of next year */ + + if (mj == last_mj) { + *yr = last_yr; + return; + } + + mjd_cal (mj, &m, &d, &y); + if (y == -1) y = -2; + cal_mjd (1, 1.0, y, &e0); + cal_mjd (1, 1.0, y+1, &e1); + *yr = y + (mj - e0)/(e1 - e0); + + last_mj = mj; + last_yr = *yr; +} + +/* given a decimal year, return mjd */ +void +year_mjd (double y, double *mjp) +{ + double e0, e1; /* mjd of start of this year, start of next year */ + int yf = (int)floor (y); + if (yf == -1) yf = -2; + + cal_mjd (1, 1.0, yf, &e0); + cal_mjd (1, 1.0, yf+1, &e1); + *mjp = e0 + (y - yf)*(e1-e0); +} + +/* round a time in days, *t, to the nearest second, IN PLACE. */ +void +rnd_second (double *t) +{ + *t = floor(*t*SPD+0.5)/SPD; +} + +/* given an mjd, truncate it to the beginning of the whole day */ +double +mjd_day(double mj) +{ + return (floor(mj-0.5)+0.5); +} + +/* given an mjd, return the number of hours past midnight of the whole day */ +double +mjd_hr(double mj) +{ + return ((mj-mjd_day(mj))*24.0); +} + +/* insure 0 <= *v < r. + */ +void +range (double *v, double r) +{ + *v -= r*floor(*v/r); +} + +/* insure 0 <= ra < 2PI and -PI/2 <= dec <= PI/2. if dec needs + * complimenting, reflect ra too + */ +void +radecrange (double *ra, double *dec) +{ + if (*dec < -PI/2) { + *dec = -PI - *dec; + *ra += PI; + } else if (*dec > PI/2) { + *dec = PI - *dec; + *ra += PI; + } + range (ra, 2*PI); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: mjd.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.6 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/moon.c b/Common/Libraries/XEphemAstroLib/src/moon.c new file mode 100644 index 000000000..bf5f3768a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/moon.c @@ -0,0 +1,3467 @@ +/* geocentric moon polar coordinates re mean equinox and ecliptic of date + + S. L. Moshier + December, 1996 + +********************************************************************** + Adapted by Michael Sternberg + for xephem with minor modifications from the originals at: + ftp://ftp.std.com/pub/astronomy/selenog.zip + + Precision < 0.05" from -1369 to +2950. + Uses table lookup techniques to limit calls to trigonometric functions. + + NB: Uses International Earth Rotation System (IERS) which is + taken as equivalent to FK5 for the purposes of xephem. + + original files used: + chewtab.c mean.c mlr404.c + mlat404.c selenog.c + + changes: + added prototypes, grouped and cleaned up vars and #defines, + removed _MSC_VER #ifdefs, uniqed names in moonlr and moonlat, + included plantbl.h in .c file, dropped out librations for now. + + in struct plantbl, promoted "char *arg_tbl" to "short *". + reason: - more portable (BTW: this is the only place in xephem + where "signed char" would have been needed) + - using "short" costs a mere 7k memory but avoids core + dumps on a machine which we didn't anticipate. + +********************************************************************** + + + Residuals against JPL ephemeris DE404 (arc seconds) + +First date in file = 1221000.5 +Number of samples = 1053099 +Sampling interval = 1.515625 days + +Peak excursions from these mostly different test points +were consolidated with the above. They added .01" to a few +of the peak readings. +First date in file = 1221000.50 +Number of samples = 524290.0 +Sampling interval = 3.0 days + + + Julian Years Longitude Latitude Distance + 1 = 1.9 km + Peak RMS Ave Peak RMS Ave Peak RMS Ave + -1369.0 to -1000.0: 0.43 0.07 0.00 0.33 0.05 -0.00 0.18 0.03 0.00 + -1000.0 to -500.0: 0.49 0.06 -0.00 0.33 0.04 -0.00 0.18 0.03 0.00 + -500.0 to 0.0: 0.48 0.06 0.00 0.32 0.04 0.00 0.15 0.03 0.00 + 0.0 to 500.0: 0.45 0.05 0.00 0.30 0.04 -0.00 0.17 0.03 -0.00 + 500.0 to 1000.0: 0.48 0.05 -0.00 0.29 0.04 0.00 0.17 0.03 -0.00 + 1000.0 to 1500.0: 0.42 0.05 -0.00 0.28 0.04 -0.00 0.16 0.03 0.00 + 1500.0 to 2000.0: 0.35 0.05 -0.00 0.26 0.04 0.00 0.15 0.03 0.00 + 2000.0 to 2500.0: 0.39 0.06 0.00 0.25 0.04 -0.00 0.15 0.03 -0.00 + 2500.0 to 3000.0: 0.44 0.07 -0.00 0.30 0.05 -0.00 0.19 0.03 -0.00 + 3000.0 to 3000.8: 0.23 0.08 -0.04 0.11 0.04 -0.00 0.08 0.03 -0.00 + */ + +#include +#include +#include + +#include "astro.h" + +#define CHAR short + +#define NARGS 18 + +struct plantbl { + char max_harmonic[NARGS]; + char max_power_of_t; + CHAR *arg_tbl; + long *lon_tbl; + long *lat_tbl; + long *rad_tbl; + double distance; + double timescale; + double trunclvl; +}; + +static double mods3600 (double x); +static void mean_elements (double JED); +static int sscc (int k, double arg, int n); +static int g2plan (double J, struct plantbl *plan, double *pobj, int flag); +static double g1plan (double J, struct plantbl *plan); +static int gecmoon (double J, struct plantbl *lrtab, + struct plantbl *lattab, double *pobj); + +/* time points */ +#define MOSHIER_J2000 (2451545.0) + +#define MOSHIER_BEGIN (1221000.5 - MJD0) /* directly from above */ +#define MOSHIER_END (2798525.5 - MJD0) /* 2950.0; from libration table */ + + +static double Args[NARGS]; +static double LP_equinox; +static double NF_arcsec; +static double Ea_arcsec; +static double pA_precession; + + +/* This storage ought to be allocated dynamically. */ +double ss[NARGS][30]; +double cc[NARGS][30]; + +/* Time, in units of 10,000 Julian years from JED 2451545.0. */ +static double T; + +/* Conversion factors between degrees and radians */ +#define DTR 1.7453292519943295769e-2 +#define RTD 5.7295779513082320877e1 +#define RTS 2.0626480624709635516e5 /* arc seconds per radian */ +#define STR 4.8481368110953599359e-6 /* radians per arc second */ +#define AUKM 1.4959787e8 + + +static long lrtabl[] = { + 175667, 66453, 5249, -42, + 20057, 403, -2360, 6148, + -7644, 24646, -1273, 9127, + -1395, 1958, + 232, -289, + -97, 553, 69, 130, + -80, 6, + 129, -868, 26, -89, + 1042, 1172, 194, -112, + -47433, -241666, 224626, -103752, + 63419, 127606, + 2294, -691, -1827, -1254, + -1, -119, + 1057, 324, + 505, -195, 254, -641, + -36, 1008, -1082, -3, + -87, 122, + 161, 11, + 2, -106, + 29, -123, + -32, 41, + -524, -35, + 133, -595, + 225, 837, -108, -191, + -2294, 841, -340, -394, + -351, -1039, 238, -108, + -66, 21, + 1405, 869, 520, 2776, + -174, 71, + 425, 652, -1260, -80, + 249, 77, + -192, -17, + -97, 134, + -7, -54, + -802, -7436, -2824, 70869, + -35, 2481, + 1865, 1749, -2166, 2415, + 33, -183, + -835, 283, + 27, -45, + 56, 235, + 2, 718, + -1206, 275, -87, -158, + -7, -2534, 0, 10774, + 1, -324, + -208, 821, + 281, 1340, -797, 440, + 224, 72, + -65, -5, + -7, -44, + -48, 66, + -151, -40, + -41, -45, + 76, -108, + -18, 1202, 0, -2501, + 1438, -595, 900, 3040, + -3435, -5, + -100, -26, + 0, -13714, + -183, 68, + 453, -83, + -228, 325, + 97, 13, + 2, 105, + -61, 257, + 0, 57, + 88, -11, + -1, -8220, + 0, 275, + -43, -10, + -199, 105, + 1, -5849, 2, 24887, + -128, 48, + 712, 970, -1407, 845, + -266, 378, + 311, 1526, -1751, 27, + 0, -185858, + 133, 6383, + -108, 25, + -7, 1944, + 5, 390, + -11, 31, + 277, -384, 158, 72, + -81, -41, -13, -111, + -2332, -65804, -698, 505812, + 34, 1676716, -72, -6664384, + 154, -57, 52, 95, + -4, -5, + -7, 37, + -63, -32, + 4, 3349, 1, -14370, + 16, -83, + 0, -401, + 13, 3013, + 48, -20, + 0, 250, + 51, -79, + -7, -146, + 148, 9, + 0, -64, + -17, -59, + -67, -492, + -2, 2116601, + -12, -1848, + 8, -436, + -6, 324, 0, -1363, + -163, 9, + 0, -74, + 63, 8167, -29, 37587, + -22, -74501, + -71, 497, + -1, 551747, + -87, -22, + 0, -51, + -1, -463, + 0, -444, + 3, 89, + 15, -84, + -36, -6829, -5, -21663, + 0, 86058, + 0, -298, + -2, 751, -2, -1015, + 0, 69, + 1, -4989, 0, 21458, + 0, -330, + 0, -7, + 0, -226, + 0, -1407, 0, 2942, + 0, 66, + 0, 667, + 0, -155, + 0, 105, + 0, -107, + 0, -74, + 0, -52, + 0, 91, + 0, 59, + 0, 235, + -1, -1819, 0, 2470, + 71, 13, + 0, 1026, + 14, -54, + 0, -174, + -121, -19, + 0, -200, + 0, 3008, + -16, -8043, -10, -37136, + -3, 73724, + -157, -5, + 0, -854, + 8, 147, + -13, -893, + 0, 11869, + -23, -172, + 89, 14, + -1, 872, 0, -3744, + 11, 1606, + 0, -559, + -1, -2530, + 0, 454, + 0, -193, + -60, -10, + -82, -13, + -75, 6, + 36, 81, + 354, -162836, 148, -516569, + 4, 2054441, + 4, -94, + 39, 38, + 61, -30, + 2, 121, + -11, 590, + 62, 2108, + 0, -12242, + -476, -42, + -84, 113, + -394, 236, + 0, 276, + -49, 31, + 0, 86, + 1, -1313, + 1, 69, + -60, 88, + -46, 18, + 0, -63818, + 14, -93, + 113, 547, -618, 17, + -7, 12290, -1, -25679, + 0, 92, + -115, 50, + -48, 233, + 4, 1311, 1, -5567, + 3, 1251, + 29, 548, + -244, 257, + -2, 1825, + 42, 637, + -46, 68, + -62, 8, + 3, 110, + 445, -100, -316, -202, + 2925, -621, 763, 1495, + -169, -184, 20, -76, + -475, -138, 8, -141, + -197, 1351, -1284, 422, + -129, 1879, -102, 8382, + -9, 45864958, + -215, 1350, -1285, 422, + -481, -136, 8, -140, + 40, -53, + 2622, -543, 700, 1406, + 402, -95, -318, -194, + 122, 13, + -30, 147, + -121, -902, + 61, -23, + -63, 7, + 69, 479, + -224, 228, + -7, 500, + 0, -429, + -42, 193, + -92, 37, + 67, 5, + -350, -31, + 0, 67, + -55, -5, + 0, 47, + -36, 53, + 5, 561, + 0, -126, + 0, 871, + -52, 4, + -201, 116922, -22, 371352, + -12, -1473285, + 0, 87, + -164, 84, + -3, 422, + 30, 1434, + -26, 38, + 2, -1249943, + -404, -34, + -57, 79, + 5, 509, + 1, 131, + -344, 168, + 112, 22540, 30, 71218, + 18, -283983, + 0, -851, + 0, -1538, + 0, 1360, + -12, 51, + -48, 68, + 88, -20, + 1, 63, + 0, -568, + 303, 25, + 0, -122, + 87, 586, -606, -14, + 0, -100, + -85, 8, + -165, 54, + -45, 140, + 0, -54, + 4, -831, 1, 3495, + 31, 116, + -46, -11, + -371, 190, + -507, 399, + -2, 57, + -60, 36, + -198, -1174, -613, 4988, + -87, -4, + 141, 560, -276, 187, + 1876, 1379, 778, 4386, + 24, -15, + 167, -774, + -71, -9, + -62, 90, + 98, 580, -663, -7, + 34, -112, + 57, 15, + -355, -214, + -3240, -13605, 12229, -5723, + 3496, 7063, + 33, -51, + 1908, 1160, -226, 715, + 964, 1170, -1264, 623, + 14071, 5280, 5614, 3026, + 488, 1576, -2, 226395859, + 824, 1106, -1287, 617, + 1917, 1156, -214, 718, + 90, -97, + 12078, -2366, 3282, 6668, + -219, 9179, 593, 2015, + -282, -186, + 57, 25, + 31, -102, + -77, -4, + -268, -341, -7, -45, + -3, 74, + 15, -615, + -88, -7, + 234, -353, + 1, -119, + -163, -1159, -601, 4969, + 22, -58, + -17, -11434, + 17, 54, + 348, 348, -460, 434, + -371, 175, + -11, -204, + 4, -6440, + -5, -53, + -4, -14388, -37, -45231, + -7, 179562, + -44, 136, + -160, 49, + -101, 81, + -1, -188, + 0, 2, + -4, 12124, -11, -25217, + 71, 543, -557, -14, + -75, 526, + 0, 395274, + -233, -16, + 93, -20, + -43, 61, + 0, -1275, + 0, -824, + 1, -415, 0, 1762, + -261, 131, + -45, 64, + -297, -25, + 0, -17533, + -6, -56, + 21, 1100, + 1, 327, + 1, 66, + 23, -217, + -83, -7, + 83, 86847, 49, 275754, + -4, -1093857, + -46, 2, + 0, -24, + 0, -419, + 0, -5833, + 1, 506, + 0, -827, + -1, -377, + -11, -78, + 0, 131945, + -2, -334, + 1, -75, + 0, -72, + 0, -213, + -6, 5564, -2, -11618, + 0, 1790, + 0, -131, + 0, 6, + 0, -76, + 0, -130, + 0, -1115, 0, 4783, + 0, -195, + 0, -627, + 0, -55, + 0, -83, + 0, 163, + 0, -54, + 0, 82, + 0, 149, + 0, -754, 0, 1578, + 0, 138, + 0, 68, + 2, -2506, 0, 3399, + 0, -125, + 86, 16, + 0, -6350, 0, 27316, + 18, -63, + 0, -169, + -1, 46, + -136, -21, + 0, -239, + -30, -8788, -15, -40549, + -4, 80514, + -46, -8, + -168, -6, + -1, 536, 0, -2314, + 9, 148, + -13, -842, + -1, 307713, + -23, -175, + 95, 15, + 0, -297, + 11, 1341, + 0, -106, + 0, 5, + -4, 68, + -114, 10, + 32, 75, + 159, -130487, 98, -413967, + 2, 1647339, + -4, -85, + 100, -46, + 2, 95, + -11, 461, + 51, 1647, + 0, -32090, + -375, -33, + -65, 86, + -300, 180, + 0, 836, 0, -3576, + 0, -222, + 0, -993, + -41, 60, + 0, -4537, + -431, -34, + 2, 927, 0, -1931, + -79, 33, + -31, 144, + -1, 284, 0, -1207, + 0, 88, + -11, 315, + -178, 177, + -1, 144, + -58, 986, + 11, 86, + -228, -110, + 2636, -494, 718, 1474, + 28, -35, + -24, 782, -797, 277, + 2142, -1231, 856, 1853, + 74, 10797, 0, 23699298, + -21, 786, -796, 277, + 27, -34, + 2615, -494, 712, 1461, + -226, -109, + -11, 663, + 0, -123, + -169, 157, + -54, 266, + 0, -76, + 1, -634, 0, 2738, + -25, 106, + -63, 24, + 0, -372, + -221, -24, + 0, -5356, + 0, -219, + 0, 91, + -28, 7684, -6, 24391, + -1, -96795, + -77, 43, + 2, 95, + -47, -3, + 0, -84530, + 2, 310, + 1, 88, + 111, 19331, 32, 61306, + 4, -243595, + 0, 770, + 0, -103, + 0, 160, + 0, 356, + 0, 236, + -41, 354, + 39, 303, + 12, -56, + 873, -143, 238, 482, + -28, 35, + -93, 31, + -3, 7690211, + -91, 33, + -34, 43, + 824, -130, 226, 450, + -39, 341, + -1, -687, + 0, -303, + 11, -2935, 1, 12618, + 121, 924, 9, -1836, + -268, -1144, -678, 3685, + -69, -261, + 0, -4115951, + -69, -261, + 5, -151, + 0, -88, + 0, 91, + 0, 187, + 0, -1281, + 1, 77, + 1, 6059, 3, 19238, + 0, -76305, + 0, -90, + 0, -238, + 0, -962, 0, 4133, + 0, 96, + 0, 9483, + 0, 85, + 0, -688, + 0, -5607, + 0, 55, + 0, -752, + 0, 71, + 0, 303, + 0, -288, + 0, 57, + 0, 45, + 0, 189, + 0, 401, + 0, -1474, 0, 3087, + 0, -71, + 0, 2925, + 0, -75, + 0, 359, + 0, 55, + 1, -10155, 0, 43735, + 0, -572, + 0, -49, + 0, -660, + 0, -3591, 0, 7516, + 0, 668, + -1, -53, + -2, 384259, + 0, -163, + 0, -93, + 1, 112, + -95, -11528, -22, -36505, + -1, 145308, + 5, 145, + 0, 4047, + 1, 1483, 0, -6352, + 0, 991, 0, -4262, + 0, -93, + 0, -334, + 0, -160, + 0, -153, + -10, 127, + 51, 185, + -77, 18, + 56, 1217, 6, 1919574, + -74, 17, + 50, 180, + -5, 93, + 0, -104, + 0, -58, + -3, -353, -1, 1499, + 0, -229, + -15, 86, + 0, -93657, + 0, 1561, 0, -6693, + 0, -5839, + 1, 6791, 0, -29143, + 1, -701, 0, 3015, + 0, 2543, + 0, 693, + -1, 361233, + 0, -50, + 0, 946, + -1, -140, + -70, 407, + 0, -450995, + 0, -368, + 0, 54, + 0, -802, + 0, -96, + 0, 1274, 0, -5459, + 0, -614, 0, 2633, + 0, 685, + 0, -915, + 0, -85, + 0, 88, + 0, 106, + 0, 928, + 0, -726, 0, 1523, + 0, 5715, + 0, -4338, 0, 18706, + 0, -135, + 0, -132, + 0, -158, + 0, -98, + 0, 680, + -1, 138968, + 0, -192, + 0, -1698, + 0, -2734, 0, 11769, + 0, 4, + 0, 673, 0, -2891, + 0, 889, 0, -3821, + 0, 121, + -1, 143783, + 0, 231, + -9, 51, + 0, -57413, + 0, -483, + 0, -407, + 0, 676, 0, -2902, + 0, 531, + 0, 445, + 0, 672, + 0, 19336, + 0, 70, + 0, -39976, + 0, -68, + 0, 4203, + 0, -406, + 0, 446, + 0, -108, + 0, 79, + 0, 84, + 0, 734, + 0, 255, + 0, 3944, + 0, -655, 0, 2825, + 0, -109, + 0, -234, + 0, 57, + 0, 19773, + 0, -2013, + 0, 958, + 0, -521, + 0, -757, + 0, 10594, + 0, -9901, + 0, 199, + 0, -275, + 0, 64, + 0, 54, + 0, 165, + 0, 1110, + 0, -3286, + 0, 909, + 0, 54, + 0, 87, + 0, 258, + 0, 1261, + 0, -51, + 0, 336, + 0, -114, + 0, 2185, + 0, -850, + 0, 75, + 0, -69, + 0, -103, + 0, 776, + 0, -1238, + 0, 137, + 0, 67, + 0, -260, + 0, 130, + 0, 49, + 0, 228, + 0, 215, + 0, -178, + 0, 57, + 0, -133, +}; +static long lrtabb[] = {-1}; +static long lrtabr[] = { + -5422, -2120, 1077, 772, + 39, 75, 3, 10, + -468, -326, -113, -78, + -4, -2, + 1, 3, + 29, 24, 4, 2, + 1, 0, + -9, 7, -2, 0, + -32, -13, -3, -3, + 233, 126, 89, 77, + -33, 16, + 3, -3, 0, -1, + 2, 0, + 0, 1, + 4, 9, 1, 1, + 16, -1, 0, 18, + 3, 2, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, -1, + -22, -5, + 10, 3, 1, 1, + -15, 7, -2, 1, + -8, -11, -1, -2, + -1, 1, + 46, -58, 126, -23, + 4, 8, + 35, 8, 10, -17, + 0, 0, + 0, 0, + -10, -7, + 0, 0, + -23, 3, 151, 10, + -327, 0, + 4, -5, 6, 5, + 1, 0, + -1, -3, + 0, 0, + 0, 1, + -185, 0, + -3, -24, -5, -2, + -1062, 3, 4560, 0, + -3, 0, + 4, 1, + 8, -1, 2, 4, + 0, 1, + 0, -1, + 0, 0, + -1, 0, + 0, 1, + 0, 0, + -1, -1, + 277, 3, -583, 1, + -1, 4, -32, 7, + 0, -34, + 1, -1, + -23685, 0, + -1, -2, + -1, -7, + -5, -4, + 0, 2, + -2, 0, + -5, -1, + 35, 0, + 0, 2, + 202, 0, + 180, 0, + 0, -1, + -3, -6, + -193, 0, 770, -1, + -2, -4, + -32, 23, -28, -46, + -13, -9, + -54, 10, -1, -61, + -44895, 0, + -230, 5, + -1, -4, + -71, 0, + -15, 0, + 1, 0, + 15, 11, -3, 6, + 2, -3, 4, -1, + 2576, -138, -19881, -47, + -65906, -1, 261925, -4, + -2, -7, 4, -2, + 0, 0, + -1, 0, + 1, -3, + 172, -2, -727, 0, + 4, 1, + 324, 0, + -139, 1, + 1, 3, + -276, 0, + 5, 3, + 9, 0, + -1, 10, + -37, 0, + 5, -1, + 76, -10, + 1318810, 1, + 12, -1, + -38, 1, + -141, 0, 611, 0, + 0, -11, + 4, 0, + -627, 2, -2882, -3, + 5711, -2, + -48, -7, + 55294, 0, + 2, -7, + 31, 0, + 34, 0, + -259, 0, + -55, 2, + 6, 3, + -4273, 20, -13554, 3, + 53878, 0, + -46, 0, + -85, 0, 114, 0, + -45, 0, + -818, 0, 3520, 0, + 34, 0, + -157, 0, + 29, 0, + -878, 0, 1838, 0, + -428, 0, + 161, 0, + 24, 0, + 65, 0, + 19, 0, + 15, 0, + 12, 0, + -26, 0, + -14, 0, + -149, 0, + 584, 0, -793, 0, + 4, -23, + -238, 0, + -18, -5, + 45, 0, + -7, 42, + 79, 0, + -1723, 0, + 2895, -6, 13362, -4, + -26525, -1, + -2, 57, + 291, 0, + 52, -3, + -327, 5, + -2755, 0, + -63, 9, + 5, -33, + -261, -1, 1122, 0, + 621, -4, + -227, 0, + 1077, 0, + -167, 0, + 85, 0, + -4, 23, + -5, 32, + 3, 30, + -32, 14, + 64607, 141, 204958, 59, + -815115, 2, + -37, -1, + 15, -15, + 12, 24, + 48, -1, + 235, 4, + 843, -25, + 4621, 0, + -17, 191, + 45, 34, + 95, 159, + -132, 0, + 13, 20, + 32, 0, + -540, 0, + 29, 0, + 37, 25, + 8, 19, + 22127, 0, + -35, -5, + 232, -48, 7, 262, + 5428, 3, -11342, 1, + -45, 0, + -21, -49, + -100, -21, + -626, 1, 2665, 0, + 532, -2, + 235, -12, + -111, -105, + 774, 1, + -283, 17, + 29, 20, + 3, 27, + 47, -2, + -43, -192, -87, 136, + -269, -1264, 646, -330, + -79, 73, -33, -9, + 60, -205, 61, 4, + -584, -85, -182, -555, + -780, -57, -3488, -45, + -19818328, -4, + 583, 93, 182, 555, + -59, 208, -60, -4, + 23, 17, + 235, 1133, -608, 302, + 41, 174, 84, -137, + 6, -53, + 63, 13, + -392, 52, + -10, -27, + -3, -27, + 199, -31, + 99, 97, + -218, -3, + 209, 0, + 84, 18, + 16, 40, + 2, -30, + 14, -154, + 30, 0, + -2, 24, + -108, 0, + -24, -16, + 262, -2, + 55, 0, + -304, 0, + 2, 25, + 55112, 95, 175036, 11, + -694477, 5, + 41, 0, + -38, -76, + 199, 1, + 679, -14, + -17, -12, + 582619, 1, + -16, 191, + 38, 27, + -234, 2, + -60, 0, + 80, 163, + -10296, 48, -32526, 13, + 129703, 8, + -1366, 0, + -741, 0, + -646, 0, + 25, 6, + 33, 23, + 10, 43, + -31, 0, + -6, 0, + -12, 147, + 59, 0, + 287, -42, -7, 297, + -59, 0, + -4, -42, + -27, -81, + -69, -22, + 27, 0, + -423, -2, 1779, -1, + -57, 15, + 5, -23, + 94, 182, + -197, -250, + 24, 1, + -18, -30, + 581, -98, -2473, -303, + -2, 43, + -277, 70, -92, -136, + -681, 925, -2165, 384, + -8, -12, + 382, 82, + -4, 35, + -45, -31, + -286, 48, 3, -328, + -55, -17, + 8, -28, + -106, 175, + -6735, 1601, -2832, -6052, + 3495, -1730, + -25, -17, + -574, 944, -354, -112, + -579, 476, -308, -625, + -2411, 7074, -1529, 2828, + -1335, 247,-112000844, -1, + 545, -409, 305, 637, + 572, -950, 356, 106, + 48, 44, + 1170, 5974, -3298, 1624, + -4538, -106, -996, 294, + 92, -139, + -12, 28, + 50, 16, + 2, -38, + 169, -133, 22, -3, + 38, 1, + 305, 7, + 4, -44, + 175, 116, + 59, 1, + -573, 81, 2453, 297, + 29, 11, + 5674, -8, + -27, 9, + 173, -173, 215, 228, + -87, -184, + 102, -5, + 3206, 2, + -53, 2, + 7159, -7, 22505, -19, + -89344, -3, + 67, 22, + 24, 79, + -40, -50, + 94, 0, + 186, 0, + -6063, 0, 12612, -5, + -271, 35, 7, -278, + -479, -74, + 426754, 0, + 8, -116, + -10, -47, + -31, -22, + 645, 0, + 426, 0, + -213, 0, 903, 0, + -67, -133, + -33, -23, + 13, -152, + -9316, 0, + 29, -3, + -564, 11, + -167, 0, + -34, 0, + 114, 12, + 4, -44, + -44561, 42, -141493, 25, + 561256, -2, + -1, -24, + -261, 0, + 211, 0, + -4263, 0, + -262, 1, + 1842, 0, + 202, 0, + 41, -6, + 77165, 0, + 176, -1, + 39, 1, + -24, 0, + 118, 0, + -2991, -4, 6245, -1, + 46886, 0, + -75, 0, + -100, 0, + 40, 0, + 75, 0, + -618, 0, 2652, 0, + 112, 0, + 1780, 0, + 30, 0, + 49, 0, + 86, 0, + 33, 0, + -30, 0, + -95, 0, + 277, 0, -580, 0, + -35, 0, + -319, 0, + 1622, 1, -2201, 0, + 79, 0, + 10, -57, + 2363, 0, -10162, 0, + -41, -12, + 62, 0, + 30, 1, + -14, 89, + -2721, 0, + 5780, -19, 26674, -10, + -52964, -2, + -5, 30, + -4, 111, + -317, -1, 1369, 0, + 93, -6, + -564, 9, + -115913, 0, + -113, 15, + 10, -62, + 99, 0, + 891, -7, + 36, 0, + 108, 0, + -42, -2, + 7, 75, + -50, 21, + 86822, 104, 275441, 65, + -1096109, 1, + -56, 3, + 31, 66, + 63, -1, + 307, 7, + 1097, -34, + 17453, 0, + -22, 250, + 57, 43, + 120, 200, + -297, 0, 1269, 0, + 166, 0, + -662, 0, + 40, 28, + 1521, 0, + -23, 288, + 351, -2, -729, 0, + -22, -52, + -96, -21, + -139, -1, 589, 0, + 35, 0, + 210, 7, + -118, -119, + 62, 0, + -583, -26, + -42, 5, + -73, 152, + -330, -1759, 983, -479, + -23, -19, + -522, -15, -185, -533, + 739, 1559, -1300, 614, + -7332, 52, -15836758, 0, + 524, 16, 185, 532, + 23, 18, + 330, 1751, -978, 476, + 73, -151, + 519, 18, + 38, 0, + 105, 113, + -178, -37, + 26, 0, + 262, 1, -1139, 0, + 71, 17, + 16, 42, + 151, 0, + 16, -148, + 4147, 0, + 149, 0, + -30, 0, + 2980, 9, 9454, 2, + -37519, 0, + -28, -49, + 37, -1, + 2, -31, + 33870, 0, + -208, 1, + -59, 1, + -13105, 68, -41564, 21, + 165148, 3, + -1022, 0, + -40, 0, + -132, 0, + -228, 0, + 95, 0, + -138, -16, + -126, 16, + 24, 5, + -57, -346, 191, -94, + -14, -11, + -12, -37, + -3053364, -1, + 13, 36, + 17, 13, + 51, 327, -179, 90, + 138, 16, + 233, 0, + 62, 0, + 1164, 0, -5000, 0, + -407, 117, 770, 9, + -4, 1, 21, 2, + 1, 0, + -16869, 0, + -1, 0, + 1, 0, + 35, 0, + -78, 0, + 78, 0, + -533, 0, + -31, 1, + -2448, -6, -7768, -1, + 30812, 0, + 37, 0, + -227, 0, + 197, 0, -846, 0, + -77, 0, + 4171, 0, + -67, 0, + 287, 0, + 2532, 0, + -19, 0, + -40, 0, + -56, 0, + 128, 0, + 83, 0, + -45, 0, + -36, 0, + -92, 0, + -134, 0, + 714, 0, -1495, 0, + 32, 0, + -981, 0, + 15, 0, + -166, 0, + -59, 0, + 4923, 0, -21203, 0, + 246, 0, + 15, 0, + 104, 0, + 1683, 0, -3523, 0, + -865, 0, + -25, 1, + -186329, -1, + 10, 0, + 50, 0, + 53, 0, + 5455, -45, 17271, -10, + -68747, 0, + 69, -2, + -7604, 0, + -724, 1, 3101, 0, + -46, 0, 200, 0, + -44, 0, + 97, 0, + -53, 0, + 62, 0, + -54, -4, + 88, -24, + -9, -36, + -581, 27, -914711, 3, + 8, 35, + -86, 24, + 51, 3, + 48, 0, + 26, 0, + 133, 1, -577, 0, + 105, 0, + -3, -1, + 3194, 0, + 528, 0, -2263, 0, + 2028, 0, + -3266, 1, 14016, 0, + 10, 0, -41, 0, + -100, 0, + -32, 0, + -124348, 0, + 16, 0, + -325, 0, + 50, -1, + 1, 0, + -553, 0, + 0, 0, + 0, 0, + 2, 0, + -34, 0, + -444, 0, 1902, 0, + 9, 0, -37, 0, + 254, 0, + 156, 0, + -2, 0, + -35, 0, + -48, 0, + -368, 0, + 327, 0, -686, 0, + -2263, 0, + 1952, 0, -8418, 0, + -13, 0, + 52, 0, + 9, 0, + 21, 0, + -261, 0, + -62404, 0, + 0, 0, + 79, 0, + 1056, 0, -4547, 0, + -351, 0, + -305, 0, 1310, 0, + -1, 0, 6, 0, + 0, 0, + -55953, 0, + -80, 0, + 0, 0, + 168, 0, + -147, 0, + 127, 0, + -265, 0, 1138, 0, + -1, 0, + -9, 0, + -8, 0, + -5984, 0, + -22, 0, + -5, 0, + 0, 0, + 0, 0, + 127, 0, + -2, 0, + 10, 0, + -31, 0, + -29, 0, + -286, 0, + -98, 0, + -1535, 0, + 252, 0, -1087, 0, + 43, 0, + 4, 0, + -19, 0, + -7620, 0, + 29, 0, + -322, 0, + 203, 0, + 0, 0, + -3587, 0, + 10, 0, + 0, 0, + 94, 0, + 0, 0, + -1, 0, + -1, 0, + -315, 0, + 1, 0, + 0, 0, + 0, 0, + -30, 0, + -94, 0, + -460, 0, + 1, 0, + -114, 0, + 0, 0, + -746, 0, + 4, 0, + -23, 0, + 24, 0, + 0, 0, + -237, 0, + 1, 0, + 0, 0, + -18, 0, + 0, 0, + 0, 0, + -16, 0, + -76, 0, + -67, 0, + 0, 0, + -16, 0, + 0, 0, +}; +static CHAR lrargs[] = { + 0, 3, + 3, 4, 3, -8, 4, 3, 5, 1, + 2, 2, 5, -5, 6, 2, + 5, -1, 10, 2, 13, -1, 11, 3, 3, -7, 4, 0, + 3, 1, 13, -1, 11, 2, 5, 1, + 2, 4, 5,-10, 6, 0, + 4, 2, 10, -2, 13, 14, 3,-23, 4, 1, + 3, 3, 2, -7, 3, 4, 4, 1, + 3, -1, 13, 18, 2,-16, 3, 2, + 2, 8, 2,-13, 3, 1, + 5, 2, 10, -2, 13, 2, 3, -3, 5, 1, 6, 0, + 3, -1, 13, 26, 2,-29, 3, 0, + 3, 1, 10, -1, 11, 2, 4, 1, + 4, 1, 10, -1, 13, 3, 2, -4, 3, 1, + 4, 1, 10, -1, 13, 3, 3, -4, 4, 0, + 3, -1, 10, 15, 2,-12, 3, 0, + 4, 2, 10, -3, 13, 24, 2,-24, 3, 0, + 3, -1, 10, 23, 2,-25, 3, 0, + 4, 1, 10, -1, 11, 1, 3, 1, 6, 0, + 4, 2, 10, -2, 11, 5, 2, -6, 3, 0, + 4, 2, 10, -2, 13, 6, 2, -8, 3, 0, + 4, -2, 10, 1, 13, 12, 2, -8, 3, 1, + 5, -1, 10, 1, 13, -1, 11, 20, 2,-20, 3, 1, + 4, -2, 10, 1, 13, 3, 1, -1, 3, 1, + 5, 2, 10, -2, 13, 2, 3, -5, 5, 5, 6, 0, + 4, 2, 10, -2, 13, 2, 3, -3, 5, 1, + 4, 2, 10, -2, 13, 6, 3, -8, 4, 0, + 4, -2, 10, 1, 13, 20, 2,-21, 3, 1, + 4, 1, 10, -1, 11, 1, 3, 1, 5, 0, + 1, 1, 6, 0, + 4, 2, 10, -2, 13, 5, 3, -6, 4, 0, + 3, 3, 2, -5, 3, 2, 5, 0, + 2, -1, 11, 1, 14, 1, + 4, 2, 10, -2, 13, 2, 3, -2, 5, 0, + 2, 1, 3, -2, 4, 1, + 4, 1, 10, -1, 11, 5, 2, -7, 3, 0, + 1, 1, 5, 0, + 2, 7, 3,-13, 4, 0, + 4, -2, 10, 1, 13, 15, 2,-13, 3, 0, + 4, 2, 10, -2, 13, 3, 2, -3, 3, 0, + 2, -2, 11, 2, 14, 1, + 3, 1, 10, 1, 12, -1, 13, 1, + 3, -1, 13, 21, 2,-21, 3, 0, + 2, 3, 2, -5, 3, 0, + 2, 2, 3, -4, 4, 1, + 2, 5, 2, -8, 3, 0, + 3, -1, 13, 23, 2,-24, 3, 0, + 2, 6, 3,-11, 4, 0, + 1, 2, 5, 0, + 2, 3, 3, -6, 4, 0, + 2, 5, 3, -9, 4, 0, + 4, 1, 10, -1, 11, 1, 3, -2, 5, 0, + 3, 2, 10, 2, 12, -2, 13, 1, + 2, 2, 2, -3, 3, 2, + 2, 4, 3, -7, 4, 0, + 2, 2, 13, -2, 11, 0, + 2, 3, 3, -5, 4, 0, + 2, 1, 2, -2, 3, 0, + 2, 2, 3, -3, 4, 0, + 4, 1, 10, -1, 11, 4, 2, -5, 3, 0, + 2, 1, 3, -1, 4, 0, + 2, 4, 2, -6, 3, 0, + 4, 2, 10, -2, 13, 2, 2, -2, 3, 0, + 3, 1, 10, -1, 11, 1, 2, 0, + 2, 1, 2, -1, 3, 0, + 3, 1, 12, 2, 13, -2, 11, 0, + 2, 5, 3, -8, 4, 0, + 2, 1, 3, -3, 5, 0, + 3, 2, 10, 1, 12, -2, 13, 1, + 2, 4, 3, -6, 4, 0, + 2, 1, 3, -2, 5, 1, + 2, 3, 3, -4, 4, 0, + 2, 3, 2, -4, 3, 1, + 2, 1, 10, -1, 13, 0, + 2, 1, 3, -1, 5, 0, + 2, 1, 3, -2, 6, 0, + 2, 2, 3, -2, 4, 0, + 2, 1, 3, -1, 6, 0, + 2, 8, 2,-14, 3, 0, + 3, 1, 3, 2, 5, -5, 6, 1, + 3, 5, 3, -8, 4, 3, 5, 1, + 1, 1, 12, 3, + 3, 3, 3, -8, 4, 3, 5, 1, + 3, 1, 3, -2, 5, 5, 6, 0, + 2, 8, 2,-12, 3, 0, + 2, 1, 3, 1, 5, 0, + 3, 2, 10, 1, 12, -2, 11, 1, + 2, 5, 2, -7, 3, 0, + 3, 1, 10, 1, 13, -2, 11, 0, + 2, 2, 2, -2, 3, 0, + 2, 5, 3, -7, 4, 0, + 3, 1, 12, -2, 13, 2, 11, 0, + 2, 4, 3, -5, 4, 0, + 2, 3, 3, -3, 4, 0, + 1, 1, 2, 0, + 3, 3, 10, 1, 12, -3, 13, 0, + 2, 2, 3, -4, 5, 0, + 2, 2, 3, -3, 5, 0, + 2, 2, 10, -2, 13, 0, + 2, 2, 3, -2, 5, 0, + 2, 3, 2, -3, 3, 0, + 3, 1, 10, -1, 12, -1, 13, 1, + 2, 2, 3, -1, 5, 0, + 2, 2, 3, -2, 6, 0, + 1, 2, 12, 2, + 3, -2, 10, 1, 11, 1, 14, 0, + 2, 2, 10, -2, 11, 0, + 2, 2, 2, -1, 3, 0, + 4, -2, 10, 2, 13, 1, 2, -1, 3, 0, + 2, 4, 2, -4, 3, 0, + 2, 3, 10, -3, 13, 0, + 4, -2, 10, 2, 13, 1, 3, -1, 5, 0, + 2, 3, 3, -3, 5, 0, + 3, 2, 10, -1, 12, -2, 13, 2, + 3, 3, 10, -1, 13, -2, 11, 0, + 1, 3, 12, 1, + 4, -2, 10, 2, 13, 2, 2, -2, 3, 0, + 3, 2, 10, -1, 12, -2, 11, 1, + 2, 5, 2, -5, 3, 0, + 2, 4, 10, -4, 13, 0, + 2, 6, 2, -6, 3, 0, + 3, 2, 10, -2, 12, -2, 13, 1, + 3, 4, 10, -2, 13, -2, 11, 0, + 3, 2, 10, -2, 12, -2, 11, 0, + 2, 7, 2, -7, 3, 0, + 3, 2, 10, -3, 12, -2, 13, 0, + 2, 8, 2, -8, 3, 0, + 2, 9, 2, -9, 3, 0, + 2, 10, 2,-10, 3, 0, + 3, 2, 10, -4, 12, -1, 13, 0, + 3, 4, 10, -2, 12, -3, 13, 0, + 4, 4, 10, -1, 12, -1, 13, -2, 11, 0, + 3, 2, 10, -3, 12, -1, 13, 1, + 4, -2, 10, 1, 13, 3, 3, -2, 5, 0, + 3, 4, 10, -1, 12, -3, 13, 0, + 4, -2, 10, 1, 13, 3, 3, -3, 5, 0, + 4, 2, 10, -2, 12, 1, 13, -2, 11, 0, + 4, -2, 10, 1, 13, 2, 2, -1, 3, 0, + 3, 3, 10, -1, 12, -2, 11, 0, + 3, 4, 10, -1, 13, -2, 11, 0, + 3, 2, 10, -2, 12, -1, 13, 2, + 4, -2, 10, 1, 13, 2, 3, -1, 5, 0, + 3, 3, 10, -1, 12, -2, 13, 0, + 4, -2, 10, 1, 13, 3, 2, -3, 3, 0, + 4, -2, 10, 1, 13, 2, 3, -2, 5, 0, + 2, 4, 10, -3, 13, 0, + 4, -2, 10, 1, 13, 2, 3, -3, 5, 0, + 3, -2, 10, 1, 13, 1, 2, 0, + 4, 2, 10, -1, 12, 1, 13, -2, 11, 1, + 4, -2, 10, 1, 13, 2, 2, -2, 3, 0, + 2, 3, 12, -1, 13, 0, + 2, 3, 10, -2, 11, 0, + 2, 1, 10, -2, 12, 0, + 4, 4, 10, 1, 12, -1, 13, -2, 11, 0, + 3, -1, 13, 3, 2, -2, 3, 0, + 3, -1, 13, 3, 3, -2, 5, 0, + 3, -2, 10, 18, 2,-15, 3, 0, + 5, 2, 10, -1, 13, 3, 3, -8, 4, 3, 5, 0, + 3, 2, 10, -1, 12, -1, 13, 2, + 5, -2, 10, 1, 13, 5, 3, -8, 4, 3, 5, 0, + 5, -2, 10, 1, 13, 1, 3, 2, 5, -5, 6, 0, + 4, 2, 10, -2, 13, 18, 2,-17, 3, 0, + 4, -2, 10, 1, 13, 1, 3, -1, 6, 0, + 4, -2, 10, 1, 13, 2, 3, -2, 4, 0, + 4, -2, 10, 1, 13, 1, 3, -1, 5, 0, + 2, 3, 10, -2, 13, 0, + 4, -2, 10, 1, 13, 3, 2, -4, 3, 0, + 4, -2, 10, 1, 13, 3, 3, -4, 4, 0, + 4, -2, 10, 1, 13, 1, 3, -2, 5, 0, + 3, 4, 10, 1, 12, -3, 13, 0, + 4, -2, 10, 1, 13, 1, 3, -3, 5, 0, + 3, -1, 13, 4, 2, -4, 3, 0, + 4, -2, 10, 1, 13, 1, 2, -1, 3, 0, + 4, -2, 10, 1, 13, 1, 3, -1, 4, 0, + 4, -2, 10, 1, 13, 2, 3, -3, 4, 0, + 4, -2, 10, 1, 13, 3, 3, -5, 4, 0, + 3, 2, 10, 1, 13, -2, 11, 0, + 4, -2, 10, -1, 13, 1, 11, 1, 14, 0, + 4, -2, 10, 1, 13, 2, 2, -3, 3, 1, + 2, 2, 12, -1, 13, 1, + 3, 3, 10, 1, 12, -2, 11, 0, + 4, 2, 10, -1, 13, 2, 3, -4, 4, 0, + 4, 2, 10, -1, 13, 3, 2, -5, 3, 0, + 2, 1, 10, -1, 12, 1, + 3, -1, 13, 3, 2, -3, 3, 0, + 3, -2, 10, 1, 13, 1, 5, 0, + 4, 2, 10, -1, 13, 1, 3, -2, 4, 0, + 3, -1, 13, 2, 3, -2, 5, 0, + 4, 2, 10, -1, 13, -1, 11, 1, 14, 0, + 3, -1, 13, 5, 3, -6, 4, 0, + 3, -2, 10, 1, 13, 1, 6, 0, + 3, -1, 10, 1, 3, -1, 5, 0, + 4, -2, 10, 1, 13, 8, 2,-13, 3, 1, + 3, -2, 10, 18, 2,-16, 3, 1, + 5, -2, 10, 1, 13, 3, 2, -7, 3, 4, 4, 1, + 4, 2, 10, -1, 13, 2, 5, -5, 6, 1, + 5, 2, 10, -1, 13, 4, 3, -8, 4, 3, 5, 1, + 2, 2, 10, -1, 13, 2, + 5, -2, 10, 1, 13, 4, 3, -8, 4, 3, 5, 1, + 4, -2, 10, 1, 13, 2, 5, -5, 6, 1, + 5, 2, 10, -1, 13, 3, 2, -7, 3, 4, 4, 0, + 4, 2, 10, -2, 13, 18, 2,-16, 3, 1, + 4, 2, 10, -1, 13, 8, 2,-13, 3, 1, + 3, -1, 10, 3, 2, -4, 3, 0, + 3, -1, 13, 6, 2, -8, 3, 0, + 3, -1, 13, 2, 3, -3, 5, 0, + 3, -1, 13, 6, 3, -8, 4, 0, + 3, 2, 10, -1, 13, 1, 6, 0, + 4, -2, 10, 1, 13, -1, 11, 1, 14, 0, + 4, -2, 10, 1, 13, 1, 3, -2, 4, 0, + 3, 2, 10, -1, 13, 1, 5, 0, + 3, 3, 10, 1, 12, -2, 13, 0, + 4, -2, 10, 1, 13, 3, 2, -5, 3, 0, + 4, -2, 10, 1, 13, 2, 3, -4, 4, 0, + 2, -1, 13, 1, 2, 0, + 4, 2, 10, -1, 13, 2, 2, -3, 3, 0, + 3, -1, 10, 1, 2, -1, 3, 0, + 3, -1, 13, 4, 2, -5, 3, 0, + 3, 2, 10, -3, 13, 2, 11, 0, + 4, 2, 10, -1, 13, 2, 3, -3, 4, 0, + 3, -1, 13, 2, 2, -2, 3, 0, + 4, 2, 10, -1, 13, 1, 2, -1, 3, 0, + 4, 2, 10, 1, 12, 1, 13, -2, 11, 0, + 3, -2, 13, 18, 2,-15, 3, 0, + 2, 1, 12, -1, 13, 2, + 3, -1, 13, 1, 3, -1, 6, 0, + 4, 2, 10, -1, 13, 1, 3, -2, 5, 0, + 3, -1, 13, 2, 3, -2, 4, 0, + 3, -1, 13, 1, 3, -1, 5, 0, + 4, 2, 10, -1, 13, 3, 3, -4, 4, 0, + 1, 1, 10, 0, + 3, -1, 13, 3, 2, -4, 3, 0, + 3, -1, 13, 3, 3, -4, 4, 0, + 4, 2, 10, -1, 13, 1, 3, -1, 5, 0, + 4, 2, 10, -1, 13, 2, 3, -2, 4, 0, + 3, -1, 13, 1, 3, -2, 5, 0, + 3, 2, 10, 1, 12, -1, 13, 2, + 3, 1, 12, 1, 13, -2, 11, 0, + 3, -1, 13, 1, 2, -1, 3, 0, + 4, 2, 10, -1, 13, 2, 2, -2, 3, 0, + 3, -1, 13, 4, 2, -6, 3, 0, + 3, -1, 13, 2, 3, -3, 4, 0, + 3, 1, 13, 1, 2, -2, 3, 0, + 4, 2, 10, -1, 13, 3, 3, -3, 4, 0, + 2, 3, 13, -2, 11, 0, + 4, 2, 10, -1, 13, 4, 2, -5, 3, 0, + 3, 1, 10, 1, 2, -1, 3, 0, + 3, -1, 13, 2, 2, -3, 3, 1, + 3, 2, 10, 2, 12, -3, 13, 0, + 3, 2, 10, -1, 13, 1, 2, 0, + 3, 1, 13, 2, 3, -4, 4, 0, + 3, 1, 13, 3, 2, -5, 3, 0, + 2, 21, 2,-21, 3, 0, + 3, 1, 10, 1, 12, -2, 13, 1, + 4, 2, 10, -1, 13, 2, 3, -4, 5, 0, + 4, 2, 10, -1, 13, 7, 3,-10, 4, 0, + 2, -1, 13, 1, 5, 0, + 3, 1, 13, 1, 3, -2, 4, 0, + 4, 2, 10, -3, 13, 2, 3, -2, 5, 0, + 3, 1, 10, 1, 3, -2, 5, 0, + 3, 1, 13, -1, 11, 1, 14, 1, + 2, -1, 13, 1, 6, 0, + 4, 2, 10, -1, 13, 6, 3, -8, 4, 1, + 4, 2, 10, -1, 13, 2, 3, -3, 5, 1, + 3, -1, 13, 8, 3,-15, 4, 0, + 4, 2, 10, -1, 13, 6, 2, -8, 3, 0, + 5, 2, 10, -1, 13, -2, 11, 5, 2, -6, 3, 0, + 3, 1, 10, 3, 3, -4, 4, 0, + 3, 1, 10, 3, 2, -4, 3, 1, + 4, 1, 10, -1, 13, -1, 11, 2, 4, 0, + 3, -2, 13, 26, 2,-29, 3, 0, + 3, -1, 13, 8, 2,-13, 3, 0, + 3, -2, 13, 18, 2,-16, 3, 2, + 4, -1, 13, 3, 2, -7, 3, 4, 4, 0, + 3, 1, 13, 2, 5, -5, 6, 1, + 4, 1, 13, 4, 3, -8, 4, 3, 5, 1, + 1, 1, 13, 3, + 4, -1, 13, 4, 3, -8, 4, 3, 5, 1, + 3, -1, 13, 2, 5, -5, 6, 1, + 4, 1, 13, 3, 2, -7, 3, 4, 4, 0, + 2, 18, 2,-16, 3, 1, + 3, 1, 13, 8, 2,-13, 3, 2, + 2, 26, 2,-29, 3, 0, + 4, 1, 10, 1, 13, -1, 11, 2, 4, 0, + 5, 2, 10, 1, 13, -2, 11, 5, 2, -6, 3, 0, + 3, 1, 13, 8, 3,-15, 4, 1, + 4, 2, 10, -3, 13, 2, 3, -3, 5, 0, + 3, 1, 10, 1, 3, -1, 5, 0, + 2, 1, 13, 1, 6, 0, + 4, 2, 10, -1, 13, 5, 3, -6, 4, 0, + 3, 1, 10, 2, 3, -2, 4, 0, + 3, -1, 13, -1, 11, 1, 14, 1, + 4, 2, 10, -1, 13, 2, 3, -5, 6, 0, + 4, 2, 10, -1, 13, 2, 3, -2, 5, 0, + 5, 2, 10, -1, 13, 2, 3, -4, 5, 5, 6, 0, + 3, -1, 13, 1, 3, -2, 4, 1, + 2, 1, 13, 1, 5, 0, + 4, 2, 10, -1, 13, 4, 3, -4, 4, 0, + 4, 2, 10, -1, 13, 3, 2, -3, 3, 0, + 4, 2, 10, 2, 12, -1, 13, -2, 11, 0, + 2, 1, 10, 1, 12, 2, + 3, -1, 13, 3, 2, -5, 3, 0, + 3, -1, 13, 2, 3, -4, 4, 0, + 4, 2, 10, -1, 13, 2, 3, -1, 5, 0, + 4, 2, 10, -1, 13, 2, 3, -2, 6, 0, + 3, 1, 10, 1, 12, -2, 11, 0, + 3, 2, 10, 2, 12, -1, 13, 1, + 3, 1, 13, 2, 2, -3, 3, 1, + 3, -1, 13, 1, 11, 1, 14, 0, + 2, 1, 13, -2, 11, 0, + 4, 2, 10, -1, 13, 5, 2, -6, 3, 0, + 3, -1, 13, 1, 2, -2, 3, 0, + 3, 1, 13, 2, 3, -3, 4, 0, + 3, 1, 13, 1, 2, -1, 3, 0, + 4, 2, 10, -1, 13, 4, 2, -4, 3, 0, + 3, 2, 10, 1, 12, -3, 13, 1, + 3, 1, 13, 1, 3, -2, 5, 0, + 3, 1, 13, 3, 3, -4, 4, 0, + 3, 1, 13, 3, 2, -4, 3, 0, + 2, 1, 10, -2, 13, 0, + 4, 2, 10, -1, 13, 3, 3, -4, 5, 0, + 3, 1, 13, 1, 3, -1, 5, 0, + 3, 1, 13, 2, 3, -2, 4, 0, + 3, 1, 13, 1, 3, -1, 6, 0, + 4, 2, 10, -1, 13, 3, 3, -3, 5, 0, + 4, 2, 10, -1, 13, 6, 2, -7, 3, 0, + 2, 1, 12, 1, 13, 2, + 4, 2, 10, -1, 13, 3, 3, -2, 5, 0, + 4, 2, 10, 1, 12, -1, 13, -2, 11, 0, + 2, 1, 10, 2, 12, 0, + 2, 1, 10, -2, 11, 0, + 3, 1, 13, 2, 2, -2, 3, 0, + 3, 1, 12, -1, 13, 2, 11, 0, + 4, 2, 10, -1, 13, 5, 2, -5, 3, 0, + 3, 1, 13, 2, 3, -3, 5, 0, + 2, 2, 10, -3, 13, 0, + 3, 1, 13, 2, 3, -2, 5, 0, + 3, 1, 13, 3, 2, -3, 3, 0, + 3, 1, 10, -1, 12, -2, 13, 0, + 4, 2, 10, -1, 13, 6, 2, -6, 3, 0, + 2, 2, 12, 1, 13, 1, + 3, 2, 10, -1, 13, -2, 11, 0, + 3, 1, 10, -1, 12, -2, 11, 0, + 3, 2, 10, 1, 13, -4, 11, 0, + 3, 1, 13, 4, 2, -4, 3, 0, + 4, 2, 10, -1, 13, 7, 2, -7, 3, 0, + 3, 2, 10, -1, 12, -3, 13, 1, + 2, 3, 12, 1, 13, 0, + 4, 2, 10, -1, 12, -1, 13, -2, 11, 0, + 3, 1, 13, 5, 2, -5, 3, 0, + 4, 2, 10, -1, 13, 8, 2, -8, 3, 0, + 3, 2, 10, -2, 12, -3, 13, 0, + 4, 2, 10, -1, 13, 9, 2, -9, 3, 0, + 3, 4, 10, -3, 12, -2, 13, 0, + 2, 2, 10, -4, 12, 0, + 3, 4, 10, -2, 12, -2, 13, 1, + 2, 6, 10, -4, 13, 0, + 3, 4, 10, -1, 12, -2, 11, 0, + 2, 2, 10, -3, 12, 1, + 3, 3, 10, -2, 12, -1, 13, 0, + 3, -2, 10, 3, 3, -2, 5, 0, + 3, 4, 10, -1, 12, -2, 13, 1, + 3, -2, 10, 3, 3, -3, 5, 0, + 2, 5, 10, -3, 13, 0, + 3, -2, 10, 4, 2, -4, 3, 0, + 3, -2, 10, 2, 2, -1, 3, 0, + 2, 4, 10, -2, 11, 0, + 2, 2, 10, -2, 12, 2, + 3, -2, 10, 3, 3, -2, 4, 0, + 3, -2, 10, 2, 3, -1, 5, 0, + 3, 3, 10, -1, 12, -1, 13, 1, + 3, -2, 10, 3, 2, -3, 3, 0, + 3, -2, 10, 2, 3, -2, 5, 0, + 2, 4, 10, -2, 13, 0, + 3, -2, 10, 2, 3, -3, 5, 0, + 2, -2, 10, 1, 2, 0, + 4, 2, 10, -1, 12, 2, 13, -2, 11, 0, + 3, -2, 10, 2, 2, -2, 3, 0, + 3, 3, 10, 1, 13, -2, 11, 0, + 3, 4, 10, 1, 12, -2, 11, 0, + 4, 2, 10, -1, 12, -1, 11, 1, 14, 0, + 4, -2, 10, -1, 13, 18, 2,-15, 3, 0, + 4, 2, 10, 3, 3, -8, 4, 3, 5, 0, + 2, 2, 10, -1, 12, 2, + 4, -2, 10, 5, 3, -8, 4, 3, 5, 0, + 4, 2, 10, -1, 13, 18, 2,-17, 3, 0, + 3, -2, 10, 1, 3, -1, 6, 0, + 3, -2, 10, 2, 3, -2, 4, 0, + 3, -2, 10, 1, 3, -1, 5, 0, + 2, 3, 10, -1, 13, 0, + 3, -2, 10, 3, 2, -4, 3, 0, + 3, -2, 10, 3, 3, -4, 4, 0, + 3, -2, 10, 1, 3, -2, 5, 0, + 3, 4, 10, 1, 12, -2, 13, 1, + 4, 2, 10, -1, 12, -2, 13, 2, 11, 0, + 3, -2, 10, 1, 2, -1, 3, 0, + 3, -2, 10, 2, 3, -3, 4, 0, + 3, 2, 10, 2, 13, -2, 11, 0, + 3, -2, 10, 2, 2, -3, 3, 0, + 2, 2, 12, -2, 13, 1, + 3, 2, 10, 2, 3, -4, 4, 0, + 3, 2, 10, 3, 2, -5, 3, 0, + 3, 1, 10, -1, 12, 1, 13, 1, + 3, -2, 13, 3, 2, -3, 3, 0, + 2, -2, 10, 1, 5, 0, + 3, 2, 10, 1, 3, -2, 4, 0, + 3, -2, 13, 2, 3, -2, 5, 0, + 3, 2, 10, -1, 11, 1, 14, 0, + 4, 4, 10, -2, 13, 2, 3, -3, 5, 0, + 3, -2, 10, 8, 2,-13, 3, 0, + 4, -2, 10, -1, 13, 18, 2,-16, 3, 1, + 4, -2, 10, 3, 2, -7, 3, 4, 4, 0, + 4, 2, 10, 4, 3, -8, 4, 3, 5, 1, + 1, 2, 10, 3, + 4, -2, 10, 4, 3, -8, 4, 3, 5, 1, + 4, 2, 10, 3, 2, -7, 3, 4, 4, 0, + 4, 2, 10, -1, 13, 18, 2,-16, 3, 1, + 3, 2, 10, 8, 2,-13, 3, 0, + 3, -2, 10, -1, 11, 1, 14, 0, + 4, 4, 10, -2, 13, 2, 3, -2, 5, 0, + 3, -2, 10, 1, 3, -2, 4, 0, + 2, 2, 10, 1, 5, 0, + 4, 4, 10, -2, 13, 3, 2, -3, 3, 0, + 3, 3, 10, 1, 12, -1, 13, 1, + 3, -2, 10, 3, 2, -5, 3, 0, + 3, -2, 10, 2, 3, -4, 4, 0, + 3, 4, 10, 2, 12, -2, 13, 0, + 3, 2, 10, 2, 2, -3, 3, 0, + 3, 2, 10, -2, 13, 2, 11, 0, + 3, 2, 10, 1, 2, -1, 3, 0, + 4, 2, 10, 1, 12, 2, 13, -2, 11, 0, + 2, 1, 12, -2, 13, 2, + 3, 2, 10, 1, 3, -2, 5, 0, + 3, -2, 13, 1, 3, -1, 5, 0, + 3, 2, 10, 3, 2, -4, 3, 0, + 2, 1, 10, 1, 13, 0, + 3, 2, 10, 1, 3, -1, 5, 0, + 3, 2, 10, 2, 3, -2, 4, 0, + 2, 2, 10, 1, 12, 2, + 2, 1, 12, -2, 11, 0, + 3, -2, 13, 1, 2, -1, 3, 0, + 3, 1, 10, -1, 13, 2, 11, 0, + 3, 2, 10, 2, 2, -2, 3, 0, + 3, 1, 10, 1, 12, -3, 13, 0, + 3, 2, 13, -1, 11, 1, 14, 0, + 3, 2, 10, 2, 3, -3, 5, 0, + 3, 2, 10, 6, 2, -8, 3, 0, + 3, -3, 13, 18, 2,-16, 3, 1, + 3, 2, 13, 2, 5, -5, 6, 0, + 4, 2, 13, 4, 3, -8, 4, 3, 5, 0, + 1, 2, 13, 0, + 4, -2, 13, 4, 3, -8, 4, 3, 5, 0, + 3, -2, 13, 2, 5, -5, 6, 0, + 3, 1, 13, 18, 2,-16, 3, 1, + 3, -2, 13, -1, 11, 1, 14, 0, + 3, 2, 10, 2, 3, -2, 5, 0, + 3, 2, 10, 3, 2, -3, 3, 0, + 3, 1, 10, 1, 12, 1, 13, 1, + 2, 2, 10, 2, 12, 1, + 2, 1, 11, 1, 14, 1, + 4, -1, 13, -2, 11, 18, 2,-16, 3, 0, + 1, 2, 11, 0, + 4, -1, 13, 2, 11, 18, 2,-16, 3, 0, + 2, -3, 11, 1, 14, 0, + 3, 2, 13, 1, 2, -1, 3, 0, + 3, 2, 10, 4, 2, -4, 3, 0, + 3, 2, 10, 1, 12, -4, 13, 0, + 2, 1, 10, -3, 13, 0, + 3, 2, 13, 1, 3, -1, 5, 0, + 2, 1, 12, 2, 13, 2, + 3, 1, 10, 2, 12, 1, 13, 0, + 3, 1, 10, -1, 13, -2, 11, 0, + 2, 1, 12, 2, 11, 1, + 3, 2, 10, 5, 2, -5, 3, 0, + 2, 2, 10, -4, 13, 0, + 3, 2, 10, 6, 2, -6, 3, 0, + 2, 2, 12, 2, 13, 0, + 3, 2, 10, -2, 13, -2, 11, 0, + 2, 2, 12, 2, 11, 0, + 2, 2, 10, -4, 11, 0, + 3, 2, 10, 7, 2, -7, 3, 0, + 3, 2, 10, -1, 12, -4, 13, 0, + 4, 2, 10, -1, 12, -2, 13, -2, 11, 0, + 3, 2, 10, 8, 2, -8, 3, 0, + 3, 2, 10, 9, 2, -9, 3, 0, + 3, 4, 10, -3, 12, -1, 13, 0, + 3, 6, 10, -1, 12, -3, 13, 0, + 3, 4, 10, -2, 12, -1, 13, 1, + 3, 5, 10, -1, 12, -2, 13, 0, + 2, 6, 10, -3, 13, 0, + 4, 4, 10, -1, 12, 1, 13, -2, 11, 0, + 3, 2, 10, -3, 12, 1, 13, 0, + 2, 3, 10, -2, 12, 0, + 3, 4, 10, -1, 12, -1, 13, 1, + 2, 5, 10, -2, 13, 0, + 3, 6, 10, 1, 12, -3, 13, 0, + 3, 4, 10, 1, 13, -2, 11, 0, + 3, 2, 10, -2, 12, 1, 13, 1, + 2, 3, 10, -1, 12, 0, + 4, -2, 10, -1, 13, 2, 3, -2, 5, 0, + 2, 4, 10, -1, 13, 0, + 4, 2, 10, -2, 12, -1, 13, 2, 11, 0, + 3, 4, 10, -3, 13, 2, 11, 0, + 4, -2, 10, -1, 13, 2, 2, -2, 3, 0, + 3, 2, 10, -1, 12, 1, 13, 2, + 4, -2, 10, -1, 13, 1, 3, -1, 5, 0, + 1, 3, 10, 0, + 3, 4, 10, 1, 12, -1, 13, 1, + 4, 2, 10, -1, 12, -1, 13, 2, 11, 1, + 4, -2, 10, -1, 13, 1, 2, -1, 3, 0, + 3, 2, 10, 3, 13, -2, 11, 0, + 2, 2, 12, -3, 13, 0, + 3, 1, 10, -1, 12, 2, 13, 0, + 4, 2, 10, 1, 13, -1, 11, 1, 14, 0, + 4, -2, 10, -2, 13, 18, 2,-16, 3, 0, + 5, 2, 10, 1, 13, 4, 3, -8, 4, 3, 5, 0, + 2, 2, 10, 1, 13, 1, + 5, -2, 10, -1, 13, 4, 3, -8, 4, 3, 5, 0, + 3, 2, 10, 18, 2,-16, 3, 0, + 4, -2, 10, -1, 13, -1, 11, 1, 14, 0, + 4, 4, 10, -1, 13, 2, 3, -2, 5, 0, + 4, 4, 10, -1, 13, 3, 2, -3, 3, 0, + 2, 3, 10, 1, 12, 1, + 3, 4, 10, 2, 12, -1, 13, 0, + 4, 2, 10, -1, 13, 1, 11, 1, 14, 0, + 3, 2, 10, -1, 13, 2, 11, 0, + 2, 1, 12, -3, 13, 1, + 2, 1, 10, 2, 13, 0, + 3, 2, 10, 1, 12, 1, 13, 1, + 3, 1, 12, -1, 13, -2, 11, 1, + 2, 1, 10, 2, 11, 0, + 4, 2, 10, 1, 12, -1, 13, 2, 11, 0, + 1, 3, 13, 0, + 4, 2, 10, 1, 13, 2, 3, -2, 5, 0, + 3, 1, 10, 1, 12, 2, 13, 0, + 3, 2, 10, 2, 12, 1, 13, 0, + 3, 1, 13, 1, 11, 1, 14, 0, + 2, 1, 13, 2, 11, 0, + 3, 1, 10, 1, 12, 2, 11, 0, + 4, 2, 10, 2, 12, -1, 13, 2, 11, 0, + 2, 1, 13, -4, 11, 0, + 2, 1, 10, -4, 13, 0, + 2, 1, 12, 3, 13, 1, + 3, 1, 12, 1, 13, 2, 11, 1, + 2, 2, 10, -5, 13, 0, + 3, 2, 10, -3, 13, -2, 11, 0, + 3, 2, 10, -1, 13, -4, 11, 0, + 3, 6, 10, -2, 12, -2, 13, 0, + 2, 4, 10, -3, 12, 0, + 3, 6, 10, -1, 12, -2, 13, 0, + 2, 4, 10, -2, 12, 1, + 2, 6, 10, -2, 13, 0, + 2, 4, 10, -1, 12, 1, + 2, 5, 10, -1, 13, 0, + 3, 6, 10, 1, 12, -2, 13, 0, + 4, 4, 10, -1, 12, -2, 13, 2, 11, 0, + 3, 4, 10, 2, 13, -2, 11, 0, + 3, 2, 10, -2, 12, 2, 13, 0, + 1, 4, 10, 0, + 3, 2, 10, -2, 12, 2, 11, 0, + 3, 4, 10, -2, 13, 2, 11, 0, + 3, 2, 10, -1, 12, 2, 13, 1, + 2, 3, 10, 1, 13, 0, + 2, 4, 10, 1, 12, 1, + 3, 2, 10, -1, 12, 2, 11, 1, + 3, 3, 10, -1, 13, 2, 11, 0, + 2, 2, 10, 2, 13, 0, + 3, 3, 10, 1, 12, 1, 13, 0, + 3, 2, 10, 1, 11, 1, 14, 0, + 2, 2, 10, 2, 11, 0, + 2, 1, 12, -4, 13, 0, + 2, 1, 10, 3, 13, 0, + 3, 2, 10, 1, 12, 2, 13, 1, + 3, 1, 12, -2, 13, -2, 11, 0, + 3, 1, 10, 1, 13, 2, 11, 0, + 3, 2, 10, 1, 12, 2, 11, 0, + 1, 4, 13, 0, + 3, 1, 10, 1, 12, 3, 13, 0, + 2, 2, 13, 2, 11, 0, + 4, 1, 10, 1, 12, 1, 13, 2, 11, 0, + 1, 4, 11, 0, + 2, 1, 12, 4, 13, 0, + 3, 1, 12, 2, 13, 2, 11, 0, + 3, 2, 10, -4, 13, -2, 11, 0, + 3, 6, 10, -2, 12, -1, 13, 0, + 2, 8, 10, -3, 13, 0, + 3, 6, 10, -1, 12, -1, 13, 0, + 3, 4, 10, -2, 12, 1, 13, 0, + 2, 6, 10, -1, 13, 0, + 3, 4, 10, -1, 12, 1, 13, 1, + 3, 6, 10, 1, 12, -1, 13, 0, + 4, 4, 10, -1, 12, -1, 13, 2, 11, 0, + 3, 2, 10, -2, 12, 3, 13, 0, + 2, 4, 10, 1, 13, 0, + 3, 4, 10, -1, 13, 2, 11, 0, + 3, 2, 10, -1, 12, 3, 13, 0, + 3, 4, 10, 1, 12, 1, 13, 0, + 4, 2, 10, -1, 12, 1, 13, 2, 11, 0, + 2, 2, 10, 3, 13, 0, + 3, 2, 10, 1, 13, 2, 11, 0, + 3, 2, 10, -1, 13, 4, 11, 0, + 3, 2, 10, 1, 12, 3, 13, 0, + 3, 1, 12, -3, 13, -2, 11, 0, + 3, 1, 10, 2, 13, 2, 11, 0, + 4, 2, 10, 1, 12, 1, 13, 2, 11, 0, + 1, 5, 13, 0, + 2, 3, 13, 2, 11, 0, + 2, 1, 13, 4, 11, 0, + 3, 1, 12, 3, 13, 2, 11, 0, + 2, 8, 10, -2, 13, 0, + 2, 6, 10, -1, 12, 0, + 1, 6, 10, 0, + 3, 6, 10, -2, 13, 2, 11, 0, + 3, 4, 10, -1, 12, 2, 13, 0, + 3, 4, 10, -1, 12, 2, 11, 0, + 2, 4, 10, 2, 13, 0, + 2, 4, 10, 2, 11, 0, + 3, 2, 10, -1, 12, 4, 13, 0, + 3, 4, 10, 1, 12, 2, 13, 0, + 4, 2, 10, -1, 12, 2, 13, 2, 11, 0, + 2, 2, 10, 4, 13, 0, + 3, 2, 10, 2, 13, 2, 11, 0, + 2, 2, 10, 4, 11, 0, + 1, 6, 13, 0, + 2, 4, 13, 2, 11, 0, + 2, 2, 13, 4, 11, 0, + 3, 6, 10, -1, 12, 1, 13, 0, + 2, 6, 10, 1, 13, 0, + 2, 4, 10, 3, 13, 0, + 3, 4, 10, 1, 13, 2, 11, 0, + 2, 2, 10, 5, 13, 0, + 3, 2, 10, 3, 13, 2, 11, 0, + -1 +}; + +static long btabr[] = {-1}; +static long btabb[] = {-1}; +static long btabl[] = { + -3, -4, + 4, -1856, 0, 8043, + -9, -1082, + -1, -310, + -1, -522, + -330, -1449, -853, 4656, + -66, 7, + -1, 9996928, + -66, 6, + 23, 183, + 0, 173, + 0, -56, + 0, 50, + 0, -785, + 1, 51, + 0, -60, + 1, 11843, 0, -50754, + 0, 1834, 1, -7910, + 0, -48060, + 1, 56, + 0, 13141, -1, -56318, + 0, 2541, + -1, -649, + -133, 778, + -46, 8, + 1, 1665737, + -47, 7, + 0, 65, + 0, 45, + 0, -138, + 0, -1005, + 0, -2911, + 0, -47, + 0, 96, + 0, -394, + 2, 76, + 2, -17302, 0, 74337, + 0, -101, + 0, 58, + 0, -171, + 0, -77, + 0, -1283, 0, 2686, + 0, -55, + 0, 99, + 0, 55, + 0, 397, + 0, 540, + 0, 626, + -1, -5188, 0, 10857, + 0, -216, + -2, -123, + 0, 6337, + 2, 224, + -152, -23472, -29, -74336, 0, 295775, + -20, 149, + -2, 84, + 9, 304, + 0, -3051, + -70, -6, + -57, 34, + 0, -638, + 0, -201, + -73, 9, + 0, -100, + -101, -8, + 0, -57, + 0, -207, + -3, 80, + -45, 45, + -5, 102, + -59, -23, + 52, 201, + -48, 233, -220, 71, + 4, 2810, 0, 6236541, + -61, 218, -216, 67, + 51, 201, + -59, -23, + -144, -837, -457, 3029, + -45, 42, + -15, 73, + -6, -169, + 0, 135, + -64, -7, + 0, -16245, + 0, -81, + -74, -10, + 0, 702, 0, -3013, + 0, -5889, + 1, 141, + 58, 9598, 12, 30443, 1, -120946, + -1, -84, + -2, 11246, -1, -48391, + 0, 1393, + 0, 200, + -136, -17, + 0, 558, + -64, -8, + 0, -71, + 0, 317577, + -28, 183, + 1, 219, + 0, 421, + 0, -133, + 501, -139, + 3, 354, + -101, -13, + 74, 7, + 144, -84, + 59, -2, + 1, 64, + -2931, 12559, -4641, 2638, -303, -2058, + -13, -100, -123, -79, + -19214, 6084, 1494, 26993, 15213, -82219, + 42, 52, 48, -101, + -53, -4, + 4, 47, + 58, -131, + 46, 14, + -21, -6, + -1311, -8791, 10198, -4185, 2815, 5640, + 167, 422, -229, 83, + 3140, 39, 1221, 120, 96, -30, + -1, 184612405, + 187, 416, -226, 81, + -1985, -10083, 9983, -4464, 2807, 5643, + -21, -9, + 113, -367, + 120, 580, -667, 27, + 8, 66, + -56, -6, + 337, 95, + -87, 3303, + -1, 65, + 68, -374, + 0, -574, + 15, -94, + 0, -53, + 0, -1303, + 0, -236, + 283, 36, + -1, -54, + 269, -35, + 0, -83, + 0, -52, + 0, 730, 0, -3129, + 0, 813, + 0, -4299, + 1, 59, + -6, 5130, 1, 16239, -1, -64603, + 0, -80, + 91, 12, + 0, -561, + 133, -17, + 0, 250, + -12, 71, + 0, 155664, + 82, -11, + 0, 106, + 0, -604, + 0, 21862, + 55, -7, + 0, -1514, 0, 6501, + 0, 906, + 0, -68, + 0, 241, + 0, 366, + 0, 70, + 0, -1382, 0, 5957, + 0, 113, + 0, -51, + 0, -55, + 0, 731, + 0, -264, + 0, 65788, + 1, -1504, 0, 3147, + 0, 217, + 0, -4105, 0, 17658, + 1, 69, + 0, -3518, + 0, -1767, + -43, -7044, -10, -22304, 0, 88685, + 3, 91, + 0, -485, + 0, -57, + -1, 333548, + -24, 172, + 11, 544, 1, -1132, + 0, 353, + 0, -188, + 0, 53, + 0, 77, + 158, -887, + 35, 131, + -54, 13, + 0, 1994821, + -53, 14, + 36, 125, + 2, 56, + 0, -243, + 0, -364, + -2, 1916, 0, -8227, + 0, 15700, -1, -67308, + 1, 66, + 0, -53686, + 1, 3058, 1, -13177, + 0, -72, + 0, -72, + 0, 61, + 0, 15812, + 0, 165, + 8, -96, + 318, 1341, 803, -4252, + 24, 193, + 1137, -226, 310, 622, + -56, 30, + -3, 10101666, + -56, 30, + 1096, -225, 300, 600, + -31, 409, + -1, -507, + 0, -287, + 0, -1869, 0, 8026, + 1, 544, -1, -1133, + 0, 27984, + 0, -62, + 0, -249, + 0, 187, + 0, -1096, + 1, 53, + 2, 12388, 0, -53107, + 0, -322, + 0, -94, + 0, 15157, + 0, -582, + 0, 3291, + 0, 565, + 0, 106, + 0, 112, + 0, 306, + 0, 809, + 0, 130, + 0, -961, 0, 4149, + 0, 174, + 0, -105, + 0, 2196, + 0, 59, + 0, 36737, + -1, -1832, 0, 3835, + 0, -139, + 0, 24138, + 0, 1325, + 1, 64, + 0, -361, + 0, -1162, + -44, -6320, -10, -20003, 0, 79588, + 2, 80, + 0, -2059, + 0, -304, + 0, 21460, + 0, -166, + 0, -87, + 89, -493, + 32, 114, + 34, 510, 1, 1172616, + 31, 113, + -1, 57, + 0, 214, + 0, -656, + 0, -646, + 0, 1850, 0, -7931, + 0, -6674, + 0, 2944, 0, -12641, + 0, 916, + 45, -255, + 16, 60, + -1, 619116, + 16, 57, + 0, -58, + 0, 1045, + 0, -156, + -15, 88, + 0, -62964, + 0, -126, + 0, 1490, 0, -6387, + 0, 119, + 0, 1338, + 0, -56, + 0, 204, + 0, 153, + 0, 940, + 0, 251, + 0, 312, + 0, 584, + 0, -786, 0, 3388, + 0, -52, + 0, 4733, + 0, 618, + 0, 29982, + 0, 101, + 0, -174, + 0, -2637, 0, 11345, + 0, -284, + 0, -524, + 0, -121, + 0, 1464, + 11, -60, + -1, 151205, + 0, 139, + 0, -2448, + 0, -51, + 0, -768, + 0, -638, + 0, 552, 0, -2370, + 0, 70, + 0, 64, + 0, 57, + 0, 39840, + 0, 104, + 0, -10194, + 0, -635, + 0, 69, + 0, 113, + 0, 67, + 0, 96, + 0, 367, + 0, 134, + 0, 596, + 0, 63, + 0, 1622, + 0, 483, + 0, 72, + 0, 11917, + 0, -63, + 0, 1273, + 0, -66, + 0, -262, + 0, -97, + 0, 103, + 0, 15196, + 0, -1445, + 0, -66, + 0, -55, + 0, -323, + 0, 2632, + 0, -1179, + 0, 59, + 0, -56, + 0, 78, + 0, 65, + 0, 422, + 0, 309, + 0, 2125, + 0, -66, + 0, 124, + 0, -57, + 0, 1379, + 0, -304, + 0, 177, + 0, -118, + 0, 146, + 0, 283, + 0, 119, +}; +static CHAR bargs[] = { + 0, 1, + 3, 1, 10, 1, 12, -1, 11, 1, + 4, 2, 10, 2, 12, -1, 13, -1, 11, 0, + 5, 2, 10, -1, 13, -1, 11, 3, 2, -3, 3, 0, + 5, 2, 10, -1, 13, -1, 11, 2, 3, -2, 5, 0, + 2, -1, 13, 1, 14, 1, + 5, -1, 13, 1, 11, 4, 3, -8, 4, 3, 5, 0, + 2, 1, 13, -1, 11, 0, + 5, 1, 13, -1, 11, 4, 3, -8, 4, 3, 5, 0, + 5, 2, 10, -1, 13, -1, 11, 2, 3, -3, 5, 0, + 4, 1, 10, 1, 12, -2, 13, 1, 11, 0, + 4, 1, 13, -1, 11, 1, 2, -1, 3, 0, + 5, 2, 10, -1, 13, -1, 11, 2, 2, -2, 3, 0, + 3, 1, 10, -2, 13, 1, 11, 0, + 4, 1, 13, -1, 11, 1, 3, -1, 5, 0, + 4, -1, 13, 1, 11, 1, 2, -1, 3, 0, + 3, 1, 12, 1, 13, -1, 11, 1, + 4, 2, 10, 1, 12, -1, 13, -1, 11, 1, + 2, 1, 10, -1, 11, 0, + 4, -1, 13, 1, 11, 1, 3, -1, 5, 0, + 3, 1, 12, -1, 13, 1, 11, 1, + 3, 2, 10, -3, 13, 1, 11, 0, + 3, 2, 12, 1, 13, -1, 11, 0, + 3, -2, 10, 1, 13, 1, 14, 0, + 6, -2, 10, 1, 13, 1, 11, 4, 3, -8, 4, 3, 5, 0, + 3, 2, 10, -1, 13, -1, 11, 0, + 6, 2, 10, -1, 13, -1, 11, 4, 3, -8, 4, 3, 5, 0, + 4, -1, 13, 1, 11, 2, 3, -2, 5, 0, + 4, -1, 13, 1, 11, 3, 2, -3, 3, 0, + 3, 1, 10, -1, 12, -1, 11, 0, + 3, 2, 12, -1, 13, 1, 11, 0, + 3, 2, 10, 1, 13, -3, 11, 0, + 5, -2, 10, 1, 13, 1, 11, 1, 2, -1, 3, 0, + 4, 2, 10, -1, 12, -3, 13, 1, 11, 0, + 3, 3, 10, -2, 13, -1, 11, 0, + 5, -2, 10, 1, 13, 1, 11, 1, 3, -1, 5, 0, + 4, 2, 10, -1, 12, -1, 13, -1, 11, 1, + 2, 3, 10, -3, 11, 0, + 5, -2, 10, 1, 13, 1, 11, 2, 2, -2, 3, 0, + 4, 2, 10, -1, 12, 1, 13, -3, 11, 0, + 3, 4, 10, -3, 13, -1, 11, 0, + 4, 2, 10, -2, 12, -1, 13, -1, 11, 1, + 3, 4, 10, -1, 13, -3, 11, 0, + 4, 2, 10, -3, 12, -1, 13, -1, 11, 0, + 3, 4, 10, -1, 12, -3, 11, 0, + 3, 2, 10, -3, 12, -1, 11, 0, + 4, 4, 10, -1, 12, -2, 13, -1, 11, 0, + 2, 4, 10, -3, 11, 0, + 3, 2, 10, -2, 12, -1, 11, 1, + 4, 3, 10, -1, 12, -1, 13, -1, 11, 0, + 4, -2, 10, 1, 11, 2, 3, -2, 5, 0, + 3, 4, 10, -2, 13, -1, 11, 0, + 4, -2, 10, 1, 11, 2, 2, -2, 3, 0, + 3, 2, 10, -1, 12, -1, 11, 2, + 3, -2, 10, 1, 12, 1, 14, 0, + 4, -2, 10, 1, 11, 2, 3, -2, 4, 0, + 4, -2, 10, 1, 11, 1, 3, -1, 5, 0, + 3, 3, 10, -1, 13, -1, 11, 0, + 4, -2, 10, 1, 11, 3, 2, -4, 3, 0, + 4, -2, 10, 1, 11, 1, 3, -2, 5, 0, + 4, 2, 10, -1, 12, -2, 13, 1, 11, 0, + 4, -2, 10, 1, 11, 1, 2, -1, 3, 0, + 2, -1, 10, 1, 2, 0, + 3, 2, 10, 2, 13, -3, 11, 0, + 4, -2, 10, 1, 11, 2, 2, -3, 3, 0, + 3, 2, 12, -2, 13, 1, 11, 0, + 4, 1, 10, -1, 12, 1, 13, -1, 11, 0, + 3, -2, 10, 1, 11, 1, 5, 0, + 4, 2, 10, -1, 11, 1, 3, -2, 4, 0, + 3, 2, 10, -2, 11, 1, 14, 0, + 4, -2, 10, 1, 11, 8, 2,-13, 3, 0, + 5, -2, 10, -1, 13, 1, 11, 18, 2,-16, 3, 0, + 5, 2, 10, -1, 11, 4, 3, -8, 4, 3, 5, 1, + 2, 2, 10, -1, 11, 1, + 5, -2, 10, 1, 11, 4, 3, -8, 4, 3, 5, 1, + 5, 2, 10, -1, 13, -1, 11, 18, 2,-16, 3, 0, + 4, 2, 10, -1, 11, 8, 2,-13, 3, 0, + 2, -2, 10, 1, 14, 1, + 4, -2, 10, 1, 11, 1, 3, -2, 4, 0, + 3, 2, 10, -1, 11, 1, 5, 0, + 2, 2, 12, -1, 11, 0, + 4, 3, 10, 1, 12, -1, 13, -1, 11, 0, + 4, 2, 10, -1, 11, 2, 2, -3, 3, 0, + 3, 2, 10, -2, 13, 1, 11, 0, + 4, 2, 10, -1, 11, 1, 2, -1, 3, 0, + 3, 1, 10, 1, 2, -2, 3, 0, + 3, 1, 12, -2, 13, 1, 11, 1, + 3, 1, 10, 1, 13, -1, 11, 0, + 4, 2, 10, -1, 11, 1, 3, -1, 5, 0, + 3, 2, 10, 1, 12, -1, 11, 2, + 3, -2, 10, -1, 12, 1, 14, 0, + 2, 1, 12, -1, 11, 1, + 3, 1, 10, -1, 13, 1, 11, 0, + 4, 2, 10, -1, 11, 2, 2, -2, 3, 0, + 3, 1, 10, 2, 2, -3, 3, 0, + 4, 2, 10, 1, 12, -2, 13, 1, 11, 0, + 3, -1, 10, 1, 2, -2, 3, 0, + 3, -1, 11, 1, 2, -1, 3, 0, + 2, 2, 13, -1, 11, 0, + 2, -2, 13, 1, 14, 0, + 4, 2, 10, -1, 11, 2, 3, -2, 5, 0, + 4, 2, 10, -1, 11, 3, 2, -3, 3, 0, + 4, 2, 10, 2, 12, -2, 13, -1, 11, 0, + 3, 1, 10, 1, 3, -2, 5, 0, + 4, 1, 10, 1, 12, 1, 13, -1, 11, 0, + 3, 1, 10, 3, 2, -4, 3, 0, + 3, 1, 10, 1, 3, -1, 5, 0, + 3, 1, 10, 1, 3, -2, 6, 0, + 3, 1, 10, 2, 3, -2, 4, 0, + 4, 1, 10, 1, 12, -1, 13, -1, 11, 0, + 3, 2, 10, 2, 12, -1, 11, 2, + 4, 1, 10, 1, 3, 2, 5, -5, 6, 1, + 1, 1, 14, 2, + 3, 1, 10, 8, 2,-12, 3, 1, + 5, -2, 10, 1, 13, -1, 11, 20, 2,-21, 3, 0, + 5, 2, 10, -2, 13, 1, 11, 2, 3, -3, 5, 0, + 3, 1, 10, 1, 3, 1, 6, 0, + 4, -1, 13, -1, 11, 26, 2,-29, 3, 0, + 3, -1, 11, 8, 2,-13, 3, 0, + 4, -1, 13, -1, 11, 18, 2,-16, 3, 2, + 4, -1, 13, 1, 11, 10, 2, -3, 3, 1, + 1, 1, 11, 3, + 4, -1, 13, -1, 11, 10, 2, -3, 3, 1, + 4, -1, 13, 1, 11, 18, 2,-16, 3, 2, + 3, 1, 11, 8, 2,-13, 3, 0, + 2, 1, 10, 2, 4, 0, + 4, 2, 10, -1, 11, 5, 2, -6, 3, 1, + 5, 2, 10, -2, 13, -1, 11, 2, 3, -3, 5, 0, + 5, -2, 10, 1, 13, 1, 11, 20, 2,-21, 3, 0, + 3, 1, 10, 1, 3, 1, 5, 0, + 2, -2, 11, 1, 14, 0, + 5, 2, 10, -2, 13, 1, 11, 2, 3, -2, 5, 0, + 3, 1, 10, 5, 2, -7, 3, 0, + 4, 1, 10, 1, 12, -1, 13, 1, 11, 0, + 3, 1, 10, 2, 2, -2, 3, 0, + 4, 2, 10, 2, 12, -2, 13, 1, 11, 0, + 2, 2, 13, -3, 11, 0, + 4, 2, 10, -1, 11, 4, 2, -4, 3, 0, + 3, 1, 10, 4, 2, -5, 3, 0, + 3, 1, 10, -3, 13, 1, 11, 0, + 2, 1, 10, 1, 2, 0, + 3, 1, 11, 1, 2, -1, 3, 0, + 4, 2, 10, -1, 11, 3, 3, -3, 5, 0, + 3, 1, 12, 2, 13, -1, 11, 1, + 4, 2, 10, 1, 12, -2, 13, -1, 11, 0, + 3, 1, 10, -1, 13, -1, 11, 0, + 3, 1, 11, 1, 3, -1, 5, 0, + 2, 1, 12, 1, 11, 2, + 4, 2, 10, -1, 11, 5, 2, -5, 3, 0, + 3, 1, 10, 5, 2, -6, 3, 0, + 3, 2, 10, 1, 12, -3, 11, 0, + 3, 1, 10, 2, 2, -1, 3, 0, + 3, 2, 10, -4, 13, 1, 11, 0, + 3, -2, 10, 2, 13, 1, 14, 0, + 3, 2, 10, -2, 13, -1, 11, 0, + 3, 1, 10, 3, 2, -2, 3, 0, + 4, 1, 10, -1, 12, -1, 13, -1, 11, 0, + 2, 2, 12, 1, 11, 0, + 2, 2, 10, -3, 11, 0, + 3, 1, 10, 4, 2, -3, 3, 0, + 4, 2, 10, -1, 12, -2, 13, -1, 11, 1, + 3, 2, 10, -1, 12, -3, 11, 0, + 3, 4, 10, -4, 13, -1, 11, 0, + 4, 2, 10, -2, 12, -2, 13, -1, 11, 0, + 4, 4, 10, -2, 12, -1, 13, -1, 11, 0, + 3, 6, 10, -3, 13, -1, 11, 0, + 4, 4, 10, -1, 12, -1, 13, -1, 11, 1, + 4, 2, 10, -3, 12, -1, 13, 1, 11, 0, + 3, 5, 10, -2, 13, -1, 11, 0, + 3, 4, 10, 1, 13, -3, 11, 0, + 4, 2, 10, -2, 12, 1, 13, -1, 11, 0, + 3, 3, 10, -1, 12, -1, 11, 0, + 3, 4, 10, -1, 13, -1, 11, 0, + 4, 2, 10, -2, 12, -1, 13, 1, 11, 1, + 3, 4, 10, -3, 13, 1, 11, 0, + 4, 2, 10, -1, 12, 1, 13, -1, 11, 1, + 5, -2, 10, 1, 13, -1, 11, 2, 2, -2, 3, 0, + 2, 3, 10, -1, 11, 0, + 4, 4, 10, 1, 12, -1, 13, -1, 11, 0, + 4, 2, 10, -1, 12, -1, 13, 1, 11, 2, + 5, -2, 10, 1, 13, -1, 11, 1, 3, -1, 5, 0, + 3, 3, 10, -2, 13, 1, 11, 0, + 5, -2, 10, 1, 13, -1, 11, 1, 2, -1, 3, 0, + 3, 2, 10, 1, 13, -1, 11, 0, + 3, -2, 10, -1, 13, 1, 14, 0, + 3, 2, 12, -1, 13, -1, 11, 1, + 3, 3, 10, 1, 12, -1, 11, 0, + 3, 1, 10, -1, 12, 1, 11, 0, + 4, -1, 13, -1, 11, 3, 2, -3, 3, 0, + 4, -1, 13, -1, 11, 2, 3, -2, 5, 0, + 3, 2, 10, -1, 13, 1, 14, 0, + 4, -2, 10, -1, 11, 18, 2,-16, 3, 0, + 6, 2, 10, -1, 13, 1, 11, 4, 3, -8, 4, 3, 5, 0, + 3, 2, 10, -1, 13, 1, 11, 0, + 6, -2, 10, 1, 13, -1, 11, 4, 3, -8, 4, 3, 5, 0, + 5, 2, 10, -2, 13, 1, 11, 18, 2,-16, 3, 0, + 4, -2, 10, 1, 13, -2, 11, 1, 14, 0, + 3, 1, 12, -3, 13, 1, 11, 0, + 3, 1, 10, 2, 13, -1, 11, 0, + 4, 2, 10, 1, 12, 1, 13, -1, 11, 1, + 3, 1, 12, -1, 13, -1, 11, 1, + 4, -1, 13, -1, 11, 1, 3, -1, 5, 0, + 2, 1, 10, 1, 11, 0, + 4, 2, 10, 1, 12, -1, 13, 1, 11, 1, + 3, 1, 12, 1, 13, -3, 11, 0, + 4, -1, 13, -1, 11, 1, 2, -1, 3, 0, + 5, 2, 10, -1, 13, 1, 11, 2, 2, -2, 3, 0, + 2, 3, 13, -1, 11, 0, + 4, 1, 10, 1, 12, -2, 13, -1, 11, 0, + 4, 2, 10, 2, 12, 1, 13, -1, 11, 0, + 2, 1, 13, 1, 14, 1, + 5, 2, 10, -1, 13, 1, 11, 2, 3, -3, 5, 0, + 4, -2, 13, -1, 11, 18, 2,-16, 3, 1, + 5, 1, 13, 1, 11, 4, 3, -8, 4, 3, 5, 0, + 2, 1, 13, 1, 11, 0, + 5, -1, 13, -1, 11, 4, 3, -8, 4, 3, 5, 0, + 3, 1, 11, 18, 2,-16, 3, 1, + 3, -1, 13, -2, 11, 1, 14, 0, + 5, 2, 10, -1, 13, 1, 11, 2, 3, -2, 5, 0, + 5, 2, 10, -1, 13, 1, 11, 3, 2, -3, 3, 0, + 3, 1, 10, 1, 12, 1, 11, 1, + 4, 2, 10, 2, 12, -1, 13, 1, 11, 1, + 2, 1, 13, -3, 11, 0, + 4, 1, 13, 1, 11, 1, 2, -1, 3, 0, + 3, 1, 12, 3, 13, -1, 11, 0, + 4, 2, 10, 1, 12, -3, 13, -1, 11, 0, + 3, 1, 10, -2, 13, -1, 11, 0, + 4, 1, 13, 1, 11, 1, 3, -1, 5, 0, + 3, 1, 12, 1, 13, 1, 11, 1, + 2, 1, 10, -3, 11, 0, + 3, 1, 12, -1, 13, 3, 11, 0, + 3, 2, 10, -3, 13, -1, 11, 0, + 3, 2, 12, 1, 13, 1, 11, 0, + 3, 2, 10, -1, 13, -3, 11, 0, + 4, 2, 10, -1, 12, -3, 13, -1, 11, 0, + 4, 2, 10, -1, 12, -1, 13, -3, 11, 0, + 4, 6, 10, -1, 12, -2, 13, -1, 11, 0, + 3, 4, 10, -2, 12, -1, 11, 0, + 3, 6, 10, -2, 13, -1, 11, 0, + 4, 4, 10, -2, 12, -2, 13, 1, 11, 0, + 3, 4, 10, -1, 12, -1, 11, 1, + 3, 2, 10, -3, 12, 1, 11, 0, + 3, 5, 10, -1, 13, -1, 11, 0, + 4, 4, 10, -1, 12, -2, 13, 1, 11, 0, + 4, 2, 10, -2, 12, 2, 13, -1, 11, 0, + 2, 4, 10, -1, 11, 0, + 3, 2, 10, -2, 12, 1, 11, 1, + 4, 3, 10, -1, 12, -1, 13, 1, 11, 0, + 3, 4, 10, -2, 13, 1, 11, 0, + 4, 2, 10, -1, 12, 2, 13, -1, 11, 0, + 4, -2, 10, -1, 11, 2, 2, -2, 3, 0, + 3, 3, 10, 1, 13, -1, 11, 0, + 3, 4, 10, 1, 12, -1, 11, 0, + 3, 2, 10, -1, 12, 1, 11, 2, + 4, -2, 10, -1, 11, 1, 3, -1, 5, 0, + 3, 3, 10, -1, 13, 1, 11, 0, + 4, 4, 10, 1, 12, -2, 13, 1, 11, 0, + 3, 2, 10, 2, 13, -1, 11, 0, + 3, 2, 12, -2, 13, -1, 11, 0, + 4, 1, 10, -1, 12, 1, 13, 1, 11, 0, + 2, 2, 10, 1, 14, 0, + 5, -2, 10, -1, 13, -1, 11, 18, 2,-16, 3, 0, + 2, 2, 10, 1, 11, 1, + 5, 2, 10, -1, 13, 1, 11, 18, 2,-16, 3, 0, + 3, -2, 10, -2, 11, 1, 14, 0, + 4, 3, 10, 1, 12, -1, 13, 1, 11, 0, + 3, 2, 10, -2, 13, 3, 11, 0, + 4, 2, 10, 1, 12, 2, 13, -1, 11, 0, + 3, 1, 12, -2, 13, -1, 11, 1, + 3, 1, 10, 1, 13, 1, 11, 0, + 3, 2, 10, 1, 12, 1, 11, 1, + 2, 4, 13, -1, 11, 0, + 2, 2, 13, 1, 14, 0, + 4, -3, 13, -1, 11, 18, 2,-16, 3, 0, + 2, 2, 13, 1, 11, 0, + 4, 1, 13, 1, 11, 18, 2,-16, 3, 0, + 4, 2, 10, 1, 11, 2, 3, -2, 5, 0, + 4, 1, 10, 1, 12, 1, 13, 1, 11, 0, + 3, 2, 10, 2, 12, 1, 11, 0, + 2, 2, 11, 1, 14, 0, + 1, 3, 11, 0, + 3, 1, 10, -3, 13, -1, 11, 0, + 3, 1, 12, 2, 13, 1, 11, 1, + 2, 1, 12, 3, 11, 0, + 3, 2, 10, -4, 13, -1, 11, 0, + 3, 2, 12, 2, 13, 1, 11, 0, + 3, 2, 10, -2, 13, -3, 11, 0, + 4, 6, 10, -1, 12, -1, 13, -1, 11, 0, + 3, 6, 10, -1, 13, -1, 11, 0, + 4, 4, 10, -2, 12, -1, 13, 1, 11, 0, + 3, 6, 10, -3, 13, 1, 11, 0, + 4, 4, 10, -1, 12, 1, 13, -1, 11, 0, + 4, 4, 10, -1, 12, -1, 13, 1, 11, 1, + 3, 5, 10, -2, 13, 1, 11, 0, + 3, 4, 10, 1, 13, -1, 11, 0, + 4, 2, 10, -2, 12, 1, 13, 1, 11, 0, + 3, 4, 10, -1, 13, 1, 11, 0, + 4, 2, 10, -1, 12, 3, 13, -1, 11, 0, + 4, 4, 10, 1, 12, 1, 13, -1, 11, 0, + 4, 2, 10, -1, 12, 1, 13, 1, 11, 1, + 2, 3, 10, 1, 11, 0, + 4, 4, 10, 1, 12, -1, 13, 1, 11, 0, + 4, 2, 10, -1, 12, -1, 13, 3, 11, 0, + 3, 2, 10, 3, 13, -1, 11, 0, + 3, 2, 10, 1, 13, 1, 14, 0, + 3, 2, 10, 1, 13, 1, 11, 0, + 3, 3, 10, 1, 12, 1, 11, 0, + 3, 2, 10, -1, 13, 3, 11, 0, + 4, 2, 10, 1, 12, 3, 13, -1, 11, 0, + 3, 1, 12, -3, 13, -1, 11, 0, + 3, 1, 10, 2, 13, 1, 11, 0, + 4, 2, 10, 1, 12, 1, 13, 1, 11, 1, + 3, 1, 12, -1, 13, -3, 11, 0, + 2, 1, 10, 3, 11, 0, + 2, 5, 13, -1, 11, 0, + 2, 3, 13, 1, 11, 0, + 4, 1, 10, 1, 12, 2, 13, 1, 11, 0, + 2, 1, 13, 3, 11, 0, + 3, 1, 12, 3, 13, 1, 11, 0, + 3, 1, 12, 1, 13, 3, 11, 0, + 3, 2, 10, -5, 13, -1, 11, 0, + 3, 6, 10, -1, 12, -1, 11, 0, + 4, 6, 10, -1, 12, -2, 13, 1, 11, 0, + 2, 6, 10, -1, 11, 0, + 3, 4, 10, -2, 12, 1, 11, 0, + 3, 6, 10, -2, 13, 1, 11, 0, + 4, 4, 10, -1, 12, 2, 13, -1, 11, 0, + 3, 4, 10, -1, 12, 1, 11, 0, + 3, 4, 10, 2, 13, -1, 11, 0, + 4, 2, 10, -2, 12, 2, 13, 1, 11, 0, + 2, 4, 10, 1, 11, 0, + 3, 4, 10, -2, 13, 3, 11, 0, + 4, 2, 10, -1, 12, 2, 13, 1, 11, 0, + 3, 3, 10, 1, 13, 1, 11, 0, + 3, 4, 10, 1, 12, 1, 11, 0, + 3, 2, 10, -1, 12, 3, 11, 0, + 3, 2, 10, 4, 13, -1, 11, 0, + 3, 2, 10, 2, 13, 1, 11, 0, + 2, 2, 10, 3, 11, 0, + 3, 1, 12, -4, 13, -1, 11, 0, + 3, 1, 10, 3, 13, 1, 11, 0, + 4, 2, 10, 1, 12, 2, 13, 1, 11, 0, + 2, 4, 13, 1, 11, 0, + 2, 2, 13, 3, 11, 0, + 1, 5, 11, 0, + 3, 1, 12, 4, 13, 1, 11, 0, + 4, 6, 10, -1, 12, -1, 13, 1, 11, 0, + 3, 6, 10, 1, 13, -1, 11, 0, + 3, 6, 10, -1, 13, 1, 11, 0, + 4, 4, 10, -1, 12, 1, 13, 1, 11, 0, + 3, 4, 10, 1, 13, 1, 11, 0, + 3, 4, 10, -1, 13, 3, 11, 0, + 4, 2, 10, -1, 12, 3, 13, 1, 11, 0, + 4, 4, 10, 1, 12, 1, 13, 1, 11, 0, + 3, 2, 10, 3, 13, 1, 11, 0, + 3, 2, 10, 1, 13, 3, 11, 0, + 2, 5, 13, 1, 11, 0, + 2, 3, 13, 3, 11, 0, + 2, 6, 10, 1, 11, 0, + 3, 4, 10, 2, 13, 1, 11, 0, + 3, 2, 10, 4, 13, 1, 11, 0, + -1 +}; +struct plantbl moonlr = { + { 3, 26, 29, 23, 5, 10, 0, 0, 0, 8, 4, 4, 6, 2, 0, 0, 0, 0,}, + 3, + lrargs, + lrtabl, + lrtabb, + lrtabr, + 2.5735686895300000e-03, + 3.6525000000000000e+06, + 1.0000000000000000e-04, +}; + +struct plantbl moonlat = { + { 0, 26, 29, 8, 3, 5, 0, 0, 0, 6, 5, 3, 5, 1, 0, 0, 0, 0,}, + 3, + bargs, + btabl, + btabb, + btabr, + 0.0000000000000000e+00, + 3.6525000000000000e+06, + 1.0000000000000000e-04, +}; + + +/* Reduce arc seconds modulo 360 degrees + answer in arc seconds */ +static double +mods3600(double x) +{ + double y; +#if !defined(__STDC__) + double floor(); +#endif + + y = x - 1296000. * floor( x/1296000.); + return(y); +} + + +/* Time argument is Julian ephemeris date. */ + +static void +mean_elements (double JED) +{ + double x, T, T2; + + /* Time variables. T is in Julian centuries. */ + T = (JED - MOSHIER_J2000) / 36525.0; + T2 = T*T; + + /* Mean longitudes of planets (Simon et al, 1994) + .047" subtracted from constant term for offset to DE403 origin. */ + + /* Mercury */ + x = mods3600( 538101628.6889819 * T + 908103.213 ); + x += (6.39e-6 * T + - 0.0192789) * T2; + Args[0] = x; + + /* Venus */ + x = mods3600( 210664136.4335482 * T + 655127.236 ); + x += (-6.27e-6 * T + + 0.0059381) * T2; + Args[1] = x; + + /* Earth */ + x = mods3600( 129597742.283429 * T + 361679.198 ); + x += (-5.23e-6 * T + - 2.04411e-2 ) * T2; + Ea_arcsec = x; + Args[2] = x; + + /* Mars */ + x = mods3600( 68905077.493988 * T + 1279558.751 ); + x += (-1.043e-5 * T + + 0.0094264) * T2; + Args[3] = x; + + /* Jupiter */ + x = mods3600( 10925660.377991 * T + 123665.420 ); + x += ((((-3.4e-10 * T + + 5.91e-8) * T + + 4.667e-6) * T + + 5.706e-5) * T + - 3.060378e-1)*T2; + Args[4] = x; + + /* Saturn */ + x = mods3600( 4399609.855372 * T + 180278.752 ); + x += (((( 8.3e-10 * T + - 1.452e-7) * T + - 1.1484e-5) * T + - 1.6618e-4) * T + + 7.561614E-1)*T2; + Args[5] = x; + + /* Uranus */ + x = mods3600( 1542481.193933 * T + 1130597.971 ) + + (0.00002156*T - 0.0175083)*T2; + Args[6] = x; + + /* Neptune */ + x = mods3600( 786550.320744 * T + 1095655.149 ) + + (-0.00000895*T + 0.0021103)*T2; + Args[7] = x; + + /* Copied from cmoon.c, DE404 version. */ + /* Mean elongation of moon = D */ + x = mods3600( 1.6029616009939659e+09 * T + 1.0722612202445078e+06 ); + x += (((((-3.207663637426e-013 * T + + 2.555243317839e-011) * T + + 2.560078201452e-009) * T + - 3.702060118571e-005) * T + + 6.9492746836058421e-03) * T /* D, t^3 */ + - 6.7352202374457519e+00) * T2; /* D, t^2 */ + Args[9] = x; + + /* Mean distance of moon from its ascending node = F */ + x = mods3600( 1.7395272628437717e+09 * T + 3.3577951412884740e+05 ); + x += ((((( 4.474984866301e-013 * T + + 4.189032191814e-011) * T + - 2.790392351314e-009) * T + - 2.165750777942e-006) * T + - 7.5311878482337989e-04) * T /* F, t^3 */ + - 1.3117809789650071e+01) * T2; /* F, t^2 */ + NF_arcsec = x; + Args[10] = x; + +/* Mean anomaly of sun = l' (J. Laskar) */ + x = mods3600(1.2959658102304320e+08 * T + 1.2871027407441526e+06); + x += (((((((( + 1.62e-20 * T + - 1.0390e-17 ) * T + - 3.83508e-15 ) * T + + 4.237343e-13 ) * T + + 8.8555011e-11 ) * T + - 4.77258489e-8 ) * T + - 1.1297037031e-5 ) * T + + 8.7473717367324703e-05) * T + - 5.5281306421783094e-01) * T2; + Args[11] = x; + + /* Mean anomaly of moon = l */ + x = mods3600( 1.7179159228846793e+09 * T + 4.8586817465825332e+05 ); + x += (((((-1.755312760154e-012) * T + + 3.452144225877e-011 * T + - 2.506365935364e-008) * T + - 2.536291235258e-004) * T + + 5.2099641302735818e-02) * T /* l, t^3 */ + + 3.1501359071894147e+01) * T2; /* l, t^2 */ + Args[12] = x; + + /* Mean longitude of moon, re mean ecliptic and equinox of date = L */ + x = mods3600( 1.7325643720442266e+09 * T + 7.8593980921052420e+05); + x += ((((( 7.200592540556e-014 * T + + 2.235210987108e-010) * T + - 1.024222633731e-008) * T + - 6.073960534117e-005) * T + + 6.9017248528380490e-03) * T /* L, t^3 */ + - 5.6550460027471399e+00) * T2; /* L, t^2 */ + LP_equinox = x; + Args[13] = x; + + /* Precession of the equinox */ + x = ((((((((( -8.66e-20*T - 4.759e-17)*T + + 2.424e-15)*T + + 1.3095e-12)*T + + 1.7451e-10)*T + - 1.8055e-8)*T + - 0.0000235316)*T + + 0.000076)*T + + 1.105414)*T + + 5028.791959)*T; + /* Moon's longitude re fixed J2000 equinox. */ + /* + Args[13] -= x; + */ + pA_precession = x; + + /* OM = LP - NF; */ + + /* Free librations. */ + /* LB 2.891725 years, psi amplitude 1.8" */ + Args[14] = mods3600( 4.48175409e7 * T + 8.060457e5 ); + + /* 24.2 years */ + Args[15] = mods3600( 5.36486787e6 * T - 391702.8 ); + +#if 0 + /* 27.34907 days */ + Args[16] = mods3600( 1.7308227257e9 * T - 4.443583e5 ); +#endif + /* LA 74.7 years. */ +Args[17] = mods3600( 1.73573e6 * T ); +} + + +/* Prepare lookup table of sin and cos ( i*Lj ) + * for required multiple angles + */ +static int +sscc (int k, double arg, int n) +{ + double cu, su, cv, sv, s; + int i; + + s = STR * arg; + su = sin (s); + cu = cos (s); + ss[k][0] = su; /* sin(L) */ + cc[k][0] = cu; /* cos(L) */ + sv = 2.0 * su * cu; + cv = cu * cu - su * su; + ss[k][1] = sv; /* sin(2L) */ + cc[k][1] = cv; + for (i = 2; i < n; i++) + { + s = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = s; + ss[k][i] = sv; /* sin( i+1 L ) */ + cc[k][i] = cv; + } + return (0); +} + +/* Generic program to accumulate sum of trigonometric series + in two variables (e.g., longitude, radius) + of the same list of arguments. */ +static int +g2plan (double J, struct plantbl *plan, double pobj[], int flag) +{ + int i, j, k, m, k1, ip, np, nt; + /* On some systems such as Silicon Graphics, char is unsigned + by default. */ + CHAR *p; + long *pl, *pr; + double su, cu, sv, cv; + double t, sl, sr; + + mean_elements (J); + /* For librations, moon's longitude is sidereal. */ + if (flag) + Args[13] -= pA_precession; + + T = (J - MOSHIER_J2000) / plan->timescale; + /* Calculate sin( i*MM ), etc. for needed multiple angles. */ + for (i = 0; i < NARGS; i++) + { + if ((j = plan->max_harmonic[i]) > 0) + { + sscc (i, Args[i], j); + } + } + + /* Point to start of table of arguments. */ + p = plan->arg_tbl; + /* Point to tabulated cosine and sine amplitudes. */ + pl = plan->lon_tbl; + pr = plan->rad_tbl; + sl = 0.0; + sr = 0.0; + + for (;;) + { + /* argument of sine and cosine */ + /* Number of periodic arguments. */ + np = *p++; + if (np < 0) + break; + if (np == 0) + { /* It is a polynomial term. */ + nt = *p++; + /* Longitude polynomial. */ + cu = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + } + /* sl += mods3600 (cu); */ + sl += cu; + /* Radius polynomial. */ + cu = *pr++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pr++; + } + sr += cu; + continue; + } + k1 = 0; + cv = 0.0; + sv = 0.0; + for (ip = 0; ip < np; ip++) + { + /* What harmonic. */ + j = *p++; + /* Which planet. */ + m = *p++ - 1; + if (j) + { + k = abs (j); + k -= 1; + su = ss[m][k]; /* sin(k*angle) */ + if (j < 0) + su = -su; + cu = cc[m][k]; + if (k1 == 0) + { /* set first angle */ + sv = su; + cv = cu; + k1 = 1; + } + else + { /* combine angles */ + t = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = t; + } + } + } + /* Highest power of T. */ + nt = *p++; + /* Longitude. */ + cu = *pl++; + su = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + su = su * T + *pl++; + } + sl += cu * cv + su * sv; + /* Radius. */ + cu = *pr++; + su = *pr++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pr++; + su = su * T + *pr++; + } + sr += cu * cv + su * sv; + } + t = plan->trunclvl; + pobj[0] = t * sl; + pobj[2] = t * sr; + return (0); +} + + + +/* Generic program to accumulate sum of trigonometric series + in one variable. */ + +static double +g1plan (double J, struct plantbl *plan) +{ + int i, j, k, m, k1, ip, np, nt; + /* On some systems such as Silicon Graphics, char is unsigned + by default. */ + CHAR *p; + long *pl; + double su, cu, sv, cv; + double t, sl; + + T = (J - MOSHIER_J2000) / plan->timescale; + mean_elements (J); + /* Calculate sin( i*MM ), etc. for needed multiple angles. */ + for (i = 0; i < NARGS; i++) + { + if ((j = plan->max_harmonic[i]) > 0) + { + sscc (i, Args[i], j); + } + } + + /* Point to start of table of arguments. */ + p = plan->arg_tbl; + /* Point to tabulated cosine and sine amplitudes. */ + pl = plan->lon_tbl; + sl = 0.0; + + for (;;) + { + /* argument of sine and cosine */ + /* Number of periodic arguments. */ + np = *p++; + if (np < 0) + break; + if (np == 0) + { /* It is a polynomial term. */ + nt = *p++; + cu = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + } + /* sl += mods3600 (cu); */ + sl += cu; + continue; + } + k1 = 0; + cv = 0.0; + sv = 0.0; + for (ip = 0; ip < np; ip++) + { + /* What harmonic. */ + j = *p++; + /* Which planet. */ + m = *p++ - 1; + if (j) + { + k = abs (j); + k -= 1; + su = ss[m][k]; /* sin(k*angle) */ + if (j < 0) + su = -su; + cu = cc[m][k]; + if (k1 == 0) + { /* set first angle */ + sv = su; + cv = cu; + k1 = 1; + } + else + { /* combine angles */ + t = su * cv + cu * sv; + cv = cu * cv - su * sv; + sv = t; + } + } + } + /* Highest power of T. */ + nt = *p++; + /* Cosine and sine coefficients. */ + cu = *pl++; + su = *pl++; + for (ip = 0; ip < nt; ip++) + { + cu = cu * T + *pl++; + su = su * T + *pl++; + } + sl += cu * cv + su * sv; + } + return (plan->trunclvl * sl); +} + + +/* geocentric moon, mean ecliptic and equinox of date + * J is Julian Epemeris Date + * output in pobj[]: + * pobj[0]: l in rad + * pobj[1]: b in rad + * pobj[2]: r in au + */ +static int +gecmoon (double J, struct plantbl *lrtab, struct plantbl *lattab, double pobj[]) +{ + double x; + + g2plan (J, lrtab, pobj, 0); + x = pobj[0]; + x += LP_equinox; + if (x < -6.45e5) + x += 1.296e6; + if (x > 6.45e5) + x -= 1.296e6; + pobj[0] = STR * x; + x = g1plan (J, lattab); + pobj[1] = STR * x; + pobj[2] = (STR * pobj[2] + 1.0) * lrtab->distance; + return 0; +} + +/*********** end stephen moshier's moon code ****************/ + +static void moon_fast (double mj, double *lam, double *bet, + double *hp, double *msp, double *mdp); + +/* previous version (elwood): + * + * given the mjd, find the geocentric ecliptic longitude, lam, and latitude, + * bet, and horizontal parallax, hp for the moon. also return the sun's + * mean anomaly, *msp, and the moon's mean anomaly, *mdp. + * N.B. series for long and lat are good to about 10 and 3 arcseconds. however, + * math errors cause up to 100 and 30 arcseconds error, even if use double. + * why?? suspect highly sensitive nature of difference used to get m1..6. + * N.B. still need to correct for nutation. then for topocentric location + * further correct for parallax and refraction. + */ +static void +moon_fast (double mj, double *lam, double *bet, double *hp, double *msp, +double *mdp) +{ + double t, t2; + double ld; + double ms; + double md; + double de; + double f; + double n; + double a, sa, sn, b, sb, c, sc, e, e2, l, g, w1, w2; + double m1, m2, m3, m4, m5, m6; + + t = mj/36525.; + t2 = t*t; + + m1 = mj/27.32158213; + m1 = 360.0*(m1-(long)m1); + m2 = mj/365.2596407; + m2 = 360.0*(m2-(long)m2); + m3 = mj/27.55455094; + m3 = 360.0*(m3-(long)m3); + m4 = mj/29.53058868; + m4 = 360.0*(m4-(long)m4); + m5 = mj/27.21222039; + m5 = 360.0*(m5-(long)m5); + m6 = mj/6798.363307; + m6 = 360.0*(m6-(long)m6); + + ld = 270.434164+m1-(.001133-.0000019*t)*t2; + ms = 358.475833+m2-(.00015+.0000033*t)*t2; + md = 296.104608+m3+(.009192+.0000144*t)*t2; + de = 350.737486+m4-(.001436-.0000019*t)*t2; + f = 11.250889+m5-(.003211+.0000003*t)*t2; + n = 259.183275-m6+(.002078+.000022*t)*t2; + + a = degrad(51.2+20.2*t); + sa = sin(a); + sn = sin(degrad(n)); + b = 346.56+(132.87-.0091731*t)*t; + sb = .003964*sin(degrad(b)); + c = degrad(n+275.05-2.3*t); + sc = sin(c); + ld = ld+.000233*sa+sb+.001964*sn; + ms = ms-.001778*sa; + md = md+.000817*sa+sb+.002541*sn; + f = f+sb-.024691*sn-.004328*sc; + de = de+.002011*sa+sb+.001964*sn; + e = 1-(.002495+7.52e-06*t)*t; + e2 = e*e; + + ld = degrad(ld); + ms = degrad(ms); + n = degrad(n); + de = degrad(de); + f = degrad(f); + md = degrad(md); + + l = 6.28875*sin(md)+1.27402*sin(2*de-md)+.658309*sin(2*de)+ + .213616*sin(2*md)-e*.185596*sin(ms)-.114336*sin(2*f)+ + .058793*sin(2*(de-md))+.057212*e*sin(2*de-ms-md)+ + .05332*sin(2*de+md)+.045874*e*sin(2*de-ms)+.041024*e*sin(md-ms); + l = l-.034718*sin(de)-e*.030465*sin(ms+md)+.015326*sin(2*(de-f))- + .012528*sin(2*f+md)-.01098*sin(2*f-md)+.010674*sin(4*de-md)+ + .010034*sin(3*md)+.008548*sin(4*de-2*md)-e*.00791*sin(ms-md+2*de)- + e*.006783*sin(2*de+ms); + l = l+.005162*sin(md-de)+e*.005*sin(ms+de)+.003862*sin(4*de)+ + e*.004049*sin(md-ms+2*de)+.003996*sin(2*(md+de))+ + .003665*sin(2*de-3*md)+e*.002695*sin(2*md-ms)+ + .002602*sin(md-2*(f+de))+e*.002396*sin(2*(de-md)-ms)- + .002349*sin(md+de); + l = l+e2*.002249*sin(2*(de-ms))-e*.002125*sin(2*md+ms)- + e2*.002079*sin(2*ms)+e2*.002059*sin(2*(de-ms)-md)- + .001773*sin(md+2*(de-f))-.001595*sin(2*(f+de))+ + e*.00122*sin(4*de-ms-md)-.00111*sin(2*(md+f))+.000892*sin(md-3*de); + l = l-e*.000811*sin(ms+md+2*de)+e*.000761*sin(4*de-ms-2*md)+ + e2*.000704*sin(md-2*(ms+de))+e*.000693*sin(ms-2*(md-de))+ + e*.000598*sin(2*(de-f)-ms)+.00055*sin(md+4*de)+.000538*sin(4*md)+ + e*.000521*sin(4*de-ms)+.000486*sin(2*md-de); + l = l+e2*.000717*sin(md-2*ms); + *lam = ld+degrad(l); + range (lam, 2*PI); + + g = 5.12819*sin(f)+.280606*sin(md+f)+.277693*sin(md-f)+ + .173238*sin(2*de-f)+.055413*sin(2*de+f-md)+.046272*sin(2*de-f-md)+ + .032573*sin(2*de+f)+.017198*sin(2*md+f)+.009267*sin(2*de+md-f)+ + .008823*sin(2*md-f)+e*.008247*sin(2*de-ms-f); + g = g+.004323*sin(2*(de-md)-f)+.0042*sin(2*de+f+md)+ + e*.003372*sin(f-ms-2*de)+e*.002472*sin(2*de+f-ms-md)+ + e*.002222*sin(2*de+f-ms)+e*.002072*sin(2*de-f-ms-md)+ + e*.001877*sin(f-ms+md)+.001828*sin(4*de-f-md)-e*.001803*sin(f+ms)- + .00175*sin(3*f); + g = g+e*.00157*sin(md-ms-f)-.001487*sin(f+de)-e*.001481*sin(f+ms+md)+ + e*.001417*sin(f-ms-md)+e*.00135*sin(f-ms)+.00133*sin(f-de)+ + .001106*sin(f+3*md)+.00102*sin(4*de-f)+.000833*sin(f+4*de-md)+ + .000781*sin(md-3*f)+.00067*sin(f+4*de-2*md); + g = g+.000606*sin(2*de-3*f)+.000597*sin(2*(de+md)-f)+ + e*.000492*sin(2*de+md-ms-f)+.00045*sin(2*(md-de)-f)+ + .000439*sin(3*md-f)+.000423*sin(f+2*(de+md))+ + .000422*sin(2*de-f-3*md)-e*.000367*sin(ms+f+2*de-md)- + e*.000353*sin(ms+f+2*de)+.000331*sin(f+4*de); + g = g+e*.000317*sin(2*de+f-ms+md)+e2*.000306*sin(2*(de-ms)-f)- + .000283*sin(md+3*f); + w1 = .0004664*cos(n); + w2 = .0000754*cos(c); + *bet = degrad(g)*(1-w1-w2); + + *hp = .950724+.051818*cos(md)+.009531*cos(2*de-md)+.007843*cos(2*de)+ + .002824*cos(2*md)+.000857*cos(2*de+md)+e*.000533*cos(2*de-ms)+ + e*.000401*cos(2*de-md-ms)+e*.00032*cos(md-ms)-.000271*cos(de)- + e*.000264*cos(ms+md)-.000198*cos(2*f-md); + *hp = *hp+.000173*cos(3*md)+.000167*cos(4*de-md)-e*.000111*cos(ms)+ + .000103*cos(4*de-2*md)-.000084*cos(2*md-2*de)- + e*.000083*cos(2*de+ms)+.000079*cos(2*de+2*md)+.000072*cos(4*de)+ + e*.000064*cos(2*de-ms+md)-e*.000063*cos(2*de+ms-md)+ + e*.000041*cos(ms+de); + *hp = *hp+e*.000035*cos(2*md-ms)-.000033*cos(3*md-2*de)- + .00003*cos(md+de)-.000029*cos(2*(f-de))-e*.000029*cos(2*md+ms)+ + e2*.000026*cos(2*(de-ms))-.000023*cos(2*(f-de)+md)+ + e*.000019*cos(4*de-ms-md); + *hp = degrad(*hp); + + *msp = ms; + *mdp = md; +} + + +#define EarthRadius 6378.16 /* Kilometers */ + +/* moon() - front end rountine to get moon position; stern + * + * given the mjd, find the geocentric ecliptic longitude, lam, and latitude, + * bet, and geocentric distance, rho in a.u. for the moon. also return + * the sun's mean anomaly, *msp, and the moon's mean anomaly, *mdp. + * + * now uses Stephen Moshier's expansion and code. + * + * TODO: - clarify lunar aberration for apparent places + * + * still need to correct for nutation. then for topocentric location + * further correct for parallax and refraction. + * NB: Do NOT correct for aberration - the geocentric moon frame moves + * along with the earth. + */ +void +moon (double mj, double *lam, double *bet, double *rho, double *msp, +double *mdp) +{ + double pobj[3], dt; + double hp; + + if (mj >= MOSHIER_BEGIN && mj <= MOSHIER_END) { + /* retard for light time */ + moon_fast (mj, lam, bet, &hp, msp, mdp); + *rho = EarthRadius/AUKM/sin(hp); + dt = *rho * 5.7755183e-3; /* speed of light in a.u/day */ + gecmoon(mj + MJD0 - dt, &moonlr, &moonlat, pobj); + + *lam = pobj[0]; + range (lam, 2*PI); + *bet = pobj[1]; + *rho = pobj[2]; + *msp = STR * Args[11]; /* don't need range correction here */ + *mdp = STR * Args[12]; + } else { + moon_fast (mj, lam, bet, &hp, msp, mdp); + *rho = EarthRadius/AUKM/sin(hp); + + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: moon.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/mooncolong.c b/Common/Libraries/XEphemAstroLib/src/mooncolong.c new file mode 100644 index 000000000..14e77b7db --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/mooncolong.c @@ -0,0 +1,236 @@ +/* code to compute lunar sunrise position and local sun angle. + */ + +#include +#include +#include + +#include "astro.h" + +static void Librations (double RAD, double LAMH, double BH, double OM, + double F, double L, double L1, double *L0, double *B0); +static void Moon (double RAD, double T, double T2, double LAM0, double R, + double M, double *F, double *L1, double *OM, double *LAM, double *B, + double *DR, double *LAMH, double *BH); +static void Sun (double RAD, double T, double T2, double *L, double *M, + double *R, double *LAM0); + +/* given a Julian date and a lunar location, find selenographic colongitude of + * rising sun, lunar latitude of subsolar point, illuminated fraction, and alt + * of sun at the given location. Any pointer may be 0 if not interested. + * From Bruning and Talcott, October 1995 _Astronomy_, page 76. + * N.B. lunar coordinates use +E, but selenograhic colongs are +W. + */ +void +moon_colong ( +double jd, /* jd */ +double lt, /* lat of location on moon, rads +N +E */ +double lg, /* long of location on moon, rads +N +E */ +double *cp, /* selenographic colongitude (-lng of rising sun), rads */ +double *kp, /* illuminated fraction of surface from Earth */ +double *ap, /* sun altitude at location, rads */ +double *sp) /* lunar latitude of subsolar point, rads */ +{ + double RAD = .0174533; + double T; + double T2; + double L, M, R, LAM0; + double F, L1, OM, LAM, B, DR, LAMH, BH; + double L0, B0; + double TEMP; + double C0; + double PSI; + double NUM, DEN; + double I, K; + double THETA, ETA; + double H; + + T = (jd - 2451545)/36525.0; + T2 = T * T; + + Sun(RAD, T, T2, &L, &M, &R, &LAM0); + Moon(RAD, T, T2, LAM0, R, M, &F, &L1, &OM, &LAM, &B, &DR, &LAMH, &BH); + Librations(RAD, LAMH, BH, OM, F, L, L1, &L0, &B0); + if (sp) + *sp = B0; + + TEMP = L0 / 360; + L0 = ((TEMP) - (int)(TEMP)) * 360; + if (L0 < 0) L0 = L0 + 360; + if (L0 <= 90) C0 = 90 - L0; else C0 = 450 - L0; + if (cp) { + *cp = degrad(C0); + range (cp, 2*PI); /* prefer 0..360 +W */ + } + + if (kp) { + TEMP = cos(B * RAD) * cos(LAM - LAM0 * RAD); + PSI = acos(TEMP); + NUM = R * sin(PSI); + DEN = DR - R * TEMP; + I = atan(NUM / DEN); + if (NUM * DEN < 0) I = I + 3.14159; + if (NUM < 0) I = I + 3.14159; + K = (1 + cos(I)) / 2; + *kp = K; + } + + if (ap) { + THETA = lt; + ETA = lg; + C0 = C0 * RAD; + TEMP = sin(B0) * sin(THETA) + cos(B0) * cos(THETA) * sin(C0+ETA); + H = asin(TEMP); + *ap = H; + } +} + +static void +Librations (double RAD, double LAMH, double BH, double OM, double F, +double L, double L1, double *L0, double *B0) +{ + double I, PSI, W, NUM, DEN, A, TEMP; + + /* inclination of lunar equator */ + I = 1.54242 * RAD; + + /* nutation in longitude, in arcseconds */ + PSI = -17.2 * sin(OM) - 1.32 * sin(2 * L) - .23 * sin(2 * L1) + + .21 * sin(2 * OM); + PSI = PSI * RAD / 3600; + + /* optical librations */ + W = (LAMH - PSI) - OM; + NUM = sin(W) * cos(BH) * cos(I) - sin(BH) * sin(I); + DEN = cos(W) * cos(BH); + A = atan(NUM / DEN); + if (NUM * DEN < 0) A = A + 3.14159; + if (NUM < 0) A = A + 3.14159; + *L0 = (A - F) / RAD; + TEMP = -sin(W) * cos(BH) * sin(I) - sin(BH) * cos(I); + *B0 = asin(TEMP); +} + +static void +Moon (double RAD, double T, double T2, double LAM0, double R, double M, +double *F, double *L1, double *OM, double *LAM, double *B, double *DR, +double *LAMH, double *BH) +{ + double T3, M1, D2, SUMR, SUML, DIST; + + T3 = T * T2; + + /* argument of the latitude of the Moon */ + *F = (93.2721 + 483202 * T - .003403 * T2 - T3 / 3526000) * RAD; + + /* mean longitude of the Moon */ + *L1 = (218.316 + 481268. * T) * RAD; + + /* longitude of the ascending node of Moon's mean orbit */ + *OM = (125.045 - 1934.14 * T + .002071 * T2 + T3 / 450000) * RAD; + + /* Moon's mean anomaly */ + M1 = (134.963 + 477199 * T + .008997 * T2 + T3 / 69700) * RAD; + + /* mean elongation of the Moon */ + D2 = (297.85 + 445267 * T - .00163 * T2 + T3 / 545900) * 2 * RAD; + + /* Lunar distance */ + SUMR = -20954 * cos(M1) - 3699 * cos(D2 - M1) - 2956 * cos(D2); + *DR = 385000 + SUMR; + + /* geocentric latitude */ + *B = 5.128 * sin(*F) + .2806 * sin(M1 + *F) + .2777 * sin(M1 - *F) + + .1732 * sin(D2 - *F); + SUML = 6.289 * sin(M1) + 1.274 * sin(D2 - M1) + .6583 * sin(D2) + + .2136 * sin(2 * M1) - .1851 * sin(M) - .1143 * sin(2 * *F); + *LAM = *L1 + SUML * RAD; + DIST = *DR / R; + *LAMH = (LAM0 + 180 + DIST * cos(*B) * sin(LAM0 * RAD - *LAM) / RAD) + * RAD; + *BH = DIST * *B * RAD; +} + +static void +Sun (double RAD, double T, double T2, double *L, double *M, double *R, +double *LAM0) +{ + double T3, C, V, E, THETA, OM; + + T3 = T2 * T; + + /* mean longitude of the Sun */ + *L = 280.466 + 36000.8 * T; + + /* mean anomaly of the Sun */ + *M = 357.529 + 35999 * T - .0001536 * T2 + T3 / 24490000; + *M = *M * RAD; + + /* correction for Sun's elliptical orbit */ + C = (1.915 - .004817 * T - .000014 * T2) * sin(*M) + + (.01999 - .000101 * T) * sin(2 * *M) + .00029 * sin(3 * *M); + + /* true anomaly of the Sun */ + V = *M + C * RAD; + + /* eccentricity of Earth's orbit */ + E = .01671 - .00004204 * T - .0000001236 * T2; + + /* Sun-Earth distance */ + *R = .99972 / (1 + E * cos(V)) * 145980000; + + /* true geometric longitude of the Sun */ + THETA = *L + C; + + /* apparent longitude of the Sun */ + OM = 125.04 - 1934.1 * T; + *LAM0 = THETA - .00569 - .00478 * sin(OM * RAD); +} + +#ifdef TESTCOLONG + +/* insure 0 <= *v < r. + */ +void +range (v, r) +double *v, r; +{ + *v -= r*floor(*v/r); +} + +/* To be sure the program is functioning properly, try the test case + * 2449992.5 (1 Oct 1995): the colongitude should be 3.69 degrees. + */ +int +main (int ac, char *av[]) +{ + double jd, lt, lg; + double c, k, a; + + if (ac != 2) { + fprintf (stderr, "%s: JD\n", av[0]); + abort(); + } + + jd = atof(av[1]); + + printf ("Latitude of lunar feature: "); + fscanf (stdin, "%lf", <); + lt = degrad(lt); + printf ("Longitude: "); + fscanf (stdin, "%lf", &lg); + lg = degrad(lg); + + moon_colong (jd, lt, lg, &c, &k, &a); + + printf ("Selenographic colongitude is %g\n", raddeg(c)); + printf ("The illuminated fraction of the Moon is %g\n", k); + printf ("Altitude of Sun above feature is %g\n", raddeg(a)); + + return (0); +} + +#endif + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: mooncolong.c,v $ $Date: 2004/05/05 17:45:49 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/moonnf.c b/Common/Libraries/XEphemAstroLib/src/moonnf.c new file mode 100644 index 000000000..075aee7f8 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/moonnf.c @@ -0,0 +1,69 @@ +#include +#include + +#include "astro.h" + +static void m (double t, double k, double *mj); + +#define unw(w,z) ((w)-floor((w)/(z))*(z)) + +/* given a modified Julian date, mj, return the mjd of the new + * and full moons about then, mjn and mjf. + * TODO: exactly which ones does it find? eg: + * 5/28/1988 yields 5/15 and 5/31 + * 5/29 6/14 6/29 + */ +void +moonnf (double mj, double *mjn, double *mjf) +{ + int mo, yr; + double dy; + double mj0; + double k, tn, tf, t; + + mjd_cal (mj, &mo, &dy, &yr); + cal_mjd (1, 0., yr, &mj0); + k = (yr-1900+((mj-mj0)/365))*12.3685; + k = floor(k+0.5); + tn = k/1236.85; + tf = (k+0.5)/1236.85; + t = tn; + m (t, k, mjn); + t = tf; + k += 0.5; + m (t, k, mjf); +} + +static void +m (double t, double k, double *mj) +{ + double t2, a, a1, b, b1, c, ms, mm, f, ddjd; + + t2 = t*t; + a = 29.53*k; + c = degrad(166.56+(132.87-9.173e-3*t)*t); + b = 5.8868e-4*k+(1.178e-4-1.55e-7*t)*t2+3.3e-4*sin(c)+7.5933E-1; + ms = 359.2242+360*unw(k/1.236886e1,1)-(3.33e-5+3.47e-6*t)*t2; + mm = 306.0253+360*unw(k/9.330851e-1,1)+(1.07306e-2+1.236e-5*t)*t2; + f = 21.2964+360*unw(k/9.214926e-1,1)-(1.6528e-3+2.39e-6*t)*t2; + ms = unw(ms,360); + mm = unw(mm,360); + f = unw(f,360); + ms = degrad(ms); + mm = degrad(mm); + f = degrad(f); + ddjd = (1.734e-1-3.93e-4*t)*sin(ms)+2.1e-3*sin(2*ms) + -4.068e-1*sin(mm)+1.61e-2*sin(2*mm)-4e-4*sin(3*mm) + +1.04e-2*sin(2*f)-5.1e-3*sin(ms+mm)-7.4e-3*sin(ms-mm) + +4e-4*sin(2*f+ms)-4e-4*sin(2*f-ms)-6e-4*sin(2*f+mm) + +1e-3*sin(2*f-mm)+5e-4*sin(ms+2*mm); + a1 = (long)a; + b = b+ddjd+(a-a1); + b1 = (long)b; + a = a1+b1; + b = b-b1; + *mj = a + b; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: moonnf.c,v $ $Date: 2003/03/20 08:50:15 $ $Revision: 1.1 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/nutation.c b/Common/Libraries/XEphemAstroLib/src/nutation.c new file mode 100644 index 000000000..241bf67eb --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/nutation.c @@ -0,0 +1,441 @@ +/* nutation (in IAU (1980) expression) and abberation; stern + * on an HP PA processor, this reproduces the Almanac nutation values + * (given to 0.001") EXACTLY over 750 days (1995 and 1996) + */ +#include +#include + +#include "astro.h" + +#define NUT_SCALE 1e4 +#define NUT_SERIES 106 +#define NUT_MAXMUL 4 +#define SECPERCIRC (3600.*360.) + +/* Delaunay arguments, in arc seconds; they differ slightly from ELP82B */ +static double delaunay[5][4] = { + {485866.733, 1717915922.633, 31.310, 0.064}, /* M', moon mean anom */ + {1287099.804, 129596581.224, -0.577, -0.012}, /* M, sun mean anom */ + {335778.877, 1739527263.137, -13.257, 0.011}, /* F, moon arg lat */ + {1072261.307, 1602961601.328, -6.891, 0.019}, /* D, elong moon sun */ + {450160.280, -6962890.539, 7.455, 0.008}, /* Om, moon l asc node */ +}; + +/* multipliers for Delaunay arguments */ +static short multarg[NUT_SERIES][5] = { + /* bounds: -2..3, -2..2, -2/0/2/4, -4..4, 0..2 */ + {0, 0, 0, 0, 1}, + {0, 0, 0, 0, 2}, + {-2, 0, 2, 0, 1}, + {2, 0, -2, 0, 0}, + {-2, 0, 2, 0, 2}, + {1, -1, 0, -1, 0}, + {0, -2, 2, -2, 1}, + {2, 0, -2, 0, 1}, + {0, 0, 2, -2, 2}, + {0, 1, 0, 0, 0}, + {0, 1, 2, -2, 2}, + {0, -1, 2, -2, 2}, + {0, 0, 2, -2, 1}, + {2, 0, 0, -2, 0}, + {0, 0, 2, -2, 0}, + {0, 2, 0, 0, 0}, + {0, 1, 0, 0, 1}, + {0, 2, 2, -2, 2}, + {0, -1, 0, 0, 1}, + {-2, 0, 0, 2, 1}, + {0, -1, 2, -2, 1}, + {2, 0, 0, -2, 1}, + {0, 1, 2, -2, 1}, + {1, 0, 0, -1, 0}, + {2, 1, 0, -2, 0}, + {0, 0, -2, 2, 1}, + {0, 1, -2, 2, 0}, + {0, 1, 0, 0, 2}, + {-1, 0, 0, 1, 1}, + {0, 1, 2, -2, 0}, + {0, 0, 2, 0, 2}, + {1, 0, 0, 0, 0}, + {0, 0, 2, 0, 1}, + {1, 0, 2, 0, 2}, + {1, 0, 0, -2, 0}, + {-1, 0, 2, 0, 2}, + {0, 0, 0, 2, 0}, + {1, 0, 0, 0, 1}, + {-1, 0, 0, 0, 1}, + {-1, 0, 2, 2, 2}, + {1, 0, 2, 0, 1}, + {0, 0, 2, 2, 2}, + {2, 0, 0, 0, 0}, + {1, 0, 2, -2, 2}, + {2, 0, 2, 0, 2}, + {0, 0, 2, 0, 0}, + {-1, 0, 2, 0, 1}, + {-1, 0, 0, 2, 1}, + {1, 0, 0, -2, 1}, + {-1, 0, 2, 2, 1}, + {1, 1, 0, -2, 0}, + {0, 1, 2, 0, 2}, + {0, -1, 2, 0, 2}, + {1, 0, 2, 2, 2}, + {1, 0, 0, 2, 0}, + {2, 0, 2, -2, 2}, + {0, 0, 0, 2, 1}, + {0, 0, 2, 2, 1}, + {1, 0, 2, -2, 1}, + {0, 0, 0, -2, 1}, + {1, -1, 0, 0, 0}, + {2, 0, 2, 0, 1}, + {0, 1, 0, -2, 0}, + {1, 0, -2, 0, 0}, + {0, 0, 0, 1, 0}, + {1, 1, 0, 0, 0}, + {1, 0, 2, 0, 0}, + {1, -1, 2, 0, 2}, + {-1, -1, 2, 2, 2}, + {-2, 0, 0, 0, 1}, + {3, 0, 2, 0, 2}, + {0, -1, 2, 2, 2}, + {1, 1, 2, 0, 2}, + {-1, 0, 2, -2, 1}, + {2, 0, 0, 0, 1}, + {1, 0, 0, 0, 2}, + {3, 0, 0, 0, 0}, + {0, 0, 2, 1, 2}, + {-1, 0, 0, 0, 2}, + {1, 0, 0, -4, 0}, + {-2, 0, 2, 2, 2}, + {-1, 0, 2, 4, 2}, + {2, 0, 0, -4, 0}, + {1, 1, 2, -2, 2}, + {1, 0, 2, 2, 1}, + {-2, 0, 2, 4, 2}, + {-1, 0, 4, 0, 2}, + {1, -1, 0, -2, 0}, + {2, 0, 2, -2, 1}, + {2, 0, 2, 2, 2}, + {1, 0, 0, 2, 1}, + {0, 0, 4, -2, 2}, + {3, 0, 2, -2, 2}, + {1, 0, 2, -2, 0}, + {0, 1, 2, 0, 1}, + {-1, -1, 0, 2, 1}, + {0, 0, -2, 0, 1}, + {0, 0, 2, -1, 2}, + {0, 1, 0, 2, 0}, + {1, 0, -2, -2, 0}, + {0, -1, 2, 0, 1}, + {1, 1, 0, -2, 1}, + {1, 0, -2, 2, 0}, + {2, 0, 0, 2, 0}, + {0, 0, 2, 4, 2}, + {0, 1, 0, 1, 0} +}; + +/* amplitudes which have secular terms; in 1/NUT_SCALE arc seconds + * {index, constant dPSI, T/10 in dPSI, constant in dEPS, T/10 in dEPS} + */ +static long ampsecul[][5] = { + {0 ,-171996 ,-1742 ,92025 ,89}, + {1 ,2062 ,2 ,-895 ,5}, + {8 ,-13187 ,-16 ,5736 ,-31}, + {9 ,1426 ,-34 ,54 ,-1}, + {10 ,-517 ,12 ,224 ,-6}, + {11 ,217 ,-5 ,-95 ,3}, + {12 ,129 ,1 ,-70 ,0}, + {15 ,17 ,-1 ,0 ,0}, + {17 ,-16 ,1 ,7 ,0}, + {30 ,-2274 ,-2 ,977 ,-5}, + {31 ,712 ,1 ,-7 ,0}, + {32 ,-386 ,-4 ,200 ,0}, + {33 ,-301 ,0 ,129 ,-1}, + {37 ,63 ,1 ,-33 ,0}, + {38 ,-58 ,-1 ,32 ,0}, + /* termination */ { -1, } +}; + +/* amplitudes which only have constant terms; same unit as above + * {dPSI, dEPS} + * indexes which are already in ampsecul[][] are zeroed + */ +static short ampconst[NUT_SERIES][2] = { + {0,0}, + {0,0}, + {46,-24}, + {11,0}, + {-3,1}, + {-3,0}, + {-2,1}, + {1,0}, + {0,0}, + {0,0}, + {0,0}, + {0,0}, + {0,0}, + {48,1}, + {-22,0}, + {0,0}, + {-15,9}, + {0,0}, + {-12,6}, + {-6,3}, + {-5,3}, + {4,-2}, + {4,-2}, + {-4,0}, + {1,0}, + {1,0}, + {-1,0}, + {1,0}, + {1,0}, + {-1,0}, + {0,0}, + {0,0}, + {0,0}, + {0,0}, + {-158,-1}, + {123,-53}, + {63,-2}, + {0,0}, + {0,0}, + {-59,26}, + {-51,27}, + {-38,16}, + {29,-1}, + {29,-12}, + {-31,13}, + {26,-1}, + {21,-10}, + {16,-8}, + {-13,7}, + {-10,5}, + {-7,0}, + {7,-3}, + {-7,3}, + {-8,3}, + {6,0}, + {6,-3}, + {-6,3}, + {-7,3}, + {6,-3}, + {-5,3}, + {5,0}, + {-5,3}, + {-4,0}, + {4,0}, + {-4,0}, + {-3,0}, + {3,0}, + {-3,1}, + {-3,1}, + {-2,1}, + {-3,1}, + {-3,1}, + {2,-1}, + {-2,1}, + {2,-1}, + {-2,1}, + {2,0}, + {2,-1}, + {1,-1}, + {-1,0}, + {1,-1}, + {-2,1}, + {-1,0}, + {1,-1}, + {-1,1}, + {-1,1}, + {1,0}, + {1,0}, + {1,-1}, + {-1,0}, + {-1,0}, + {1,0}, + {1,0}, + {-1,0}, + {1,0}, + {1,0}, + {-1,0}, + {-1,0}, + {-1,0}, + {-1,0}, + {-1,0}, + {-1,0}, + {-1,0}, + {1,0}, + {-1,0}, + {1,0} +}; + +/* given the modified JD, mj, find the nutation in obliquity, *deps, and + * the nutation in longitude, *dpsi, each in radians. + */ +void +nutation ( +double mj, +double *deps, /* on input: precision parameter in arc seconds */ +double *dpsi) +{ + static double lastmj = -10000, lastdeps, lastdpsi; + double T, T2, T3, T10; /* jul cent since J2000 */ + double prec; /* series precis in arc sec */ + int i, isecul; /* index in term table */ + static double delcache[5][2*NUT_MAXMUL+1]; + /* cache for multiples of delaunay args + * [M',M,F,D,Om][-min*x, .. , 0, .., max*x] + * make static to have unfilled fields cleared on init + */ + + if (mj == lastmj) { + *deps = lastdeps; + *dpsi = lastdpsi; + return; + } + + prec = 0.0; + +#if 0 /* this is if deps should contain a precision value */ + prec =* deps; + if (prec < 0.0 || prec > 1.0) /* accept only sane value */ + prec = 1.0; +#endif + + /* augment for abundance of small terms */ + prec *= NUT_SCALE/10; + + T = (mj - J2000)/36525.; + T2 = T * T; + T3 = T2 * T; + T10 = T/10.; + + /* calculate delaunay args and place in cache */ + for (i = 0; i < 5; ++i) { + double x; + short j; + + x = delaunay[i][0] + + delaunay[i][1] * T + + delaunay[i][2] * T2 + + delaunay[i][3] * T3; + + /* convert to radians */ + x /= SECPERCIRC; + x -= floor(x); + x *= 2.*PI; + + /* fill cache table */ + for (j = 0; j <= 2*NUT_MAXMUL; ++j) + delcache[i][j] = (j - NUT_MAXMUL) * x; + } + + /* find dpsi and deps */ + lastdpsi = lastdeps = 0.; + for (i = isecul = 0; i < NUT_SERIES ; ++i) { + double arg = 0., ampsin, ampcos; + short j; + + if (ampconst[i][0] || ampconst[i][1]) { + /* take non-secular terms from simple array */ + ampsin = ampconst[i][0]; + ampcos = ampconst[i][1]; + } else { + /* secular terms from different array */ + ampsin = ampsecul[isecul][1] + ampsecul[isecul][2] * T10; + ampcos = ampsecul[isecul][3] + ampsecul[isecul][4] * T10; + ++isecul; + } + + for (j = 0; j < 5; ++j) + arg += delcache[j][NUT_MAXMUL + multarg[i][j]]; + + if (fabs(ampsin) >= prec) + lastdpsi += ampsin * sin(arg); + + if (fabs(ampcos) >= prec) + lastdeps += ampcos * cos(arg); + + } + + /* convert to radians. + */ + lastdpsi = degrad(lastdpsi/3600./NUT_SCALE); + lastdeps = degrad(lastdeps/3600./NUT_SCALE); + + lastmj = mj; + *deps = lastdeps; + *dpsi = lastdpsi; +} + +/* given the modified JD, mj, correct, IN PLACE, the right ascension *ra + * and declination *dec (both in radians) for nutation. + */ +void +nut_eq (double mj, double *ra, double *dec) +{ + static double lastmj = -10000; + static double a[3][3]; /* rotation matrix */ + double xold, yold, zold, x, y, z; + + if (mj != lastmj) { + double epsilon, dpsi, deps; + double se, ce, sp, cp, sede, cede; + + obliquity(mj, &epsilon); + nutation(mj, &deps, &dpsi); + + /* the rotation matrix a applies the nutation correction to + * a vector of equatoreal coordinates Xeq to Xeq' by 3 subsequent + * rotations: R1 - from equatoreal to ecliptic system by + * rotation of angle epsilon about x, R2 - rotate ecliptic + * system by -dpsi about its z, R3 - from ecliptic to equatoreal + * by rotation of angle -(epsilon + deps) + * + * Xeq' = A * Xeq = R3 * R2 * R1 * Xeq + * + * [ 1 0 0 ] + * R1 = [ 0 cos(eps) sin(eps) ] + * [ 0 - sin(eps) cos(eps) ] + * + * [ cos(dpsi) - sin(dpsi) 0 ] + * R2 = [ sin(dpsi) cos(dpsi) 0 ] + * [ 0 0 1 ] + * + * [ 1 0 0 ] + * R3 = [ 0 cos(eps + deps) - sin(eps + deps) ] + * [ 0 sin(eps + deps) cos(eps + deps) ] + * + * for efficiency, here is a explicitely: + */ + + se = sin(epsilon); + ce = cos(epsilon); + sp = sin(dpsi); + cp = cos(dpsi); + sede = sin(epsilon + deps); + cede = cos(epsilon + deps); + + a[0][0] = cp; + a[0][1] = -sp*ce; + a[0][2] = -sp*se; + + a[1][0] = cede*sp; + a[1][1] = cede*cp*ce+sede*se; + a[1][2] = cede*cp*se-sede*ce; + + a[2][0] = sede*sp; + a[2][1] = sede*cp*ce-cede*se; + a[2][2] = sede*cp*se+cede*ce; + + lastmj = mj; + } + + sphcart(*ra, *dec, 1.0, &xold, &yold, &zold); + x = a[0][0] * xold + a[0][1] * yold + a[0][2] * zold; + y = a[1][0] * xold + a[1][1] * yold + a[1][2] * zold; + z = a[2][0] * xold + a[2][1] * yold + a[2][2] * zold; + cartsph(x, y, z, ra, dec, &zold); /* radius should be 1.0 */ + if (*ra < 0.) *ra += 2.*PI; /* make positive for display */ +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: nutation.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/obliq.c b/Common/Libraries/XEphemAstroLib/src/obliq.c new file mode 100644 index 000000000..e1dfce702 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/obliq.c @@ -0,0 +1,27 @@ +#include + +#include "astro.h" + +/* given the modified Julian date, mj, find the mean obliquity of the + * ecliptic, *eps, in radians. + * + * IAU expression (see e.g. Astron. Almanac 1984); stern + */ +void +obliquity (double mj, double *eps) +{ + static double lastmj = -16347, lasteps; + + if (mj != lastmj) { + double t = (mj - J2000)/36525.; /* centuries from J2000 */ + lasteps = degrad(23.4392911 + /* 23^ 26' 21".448 */ + t * (-46.8150 + + t * ( -0.00059 + + t * ( 0.001813 )))/3600.0); + lastmj = mj; + } + *eps = lasteps; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: obliq.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/parallactic.c b/Common/Libraries/XEphemAstroLib/src/parallactic.c new file mode 100644 index 000000000..327298c12 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/parallactic.c @@ -0,0 +1,54 @@ +/* compure parallactic angle: angle formed by N pole - Object - Zenith + */ + +#include +#include + +#include "astro.h" + +/* compute parallactic angle given latitude, object dec and alt. + * all angles in rads. + * N.B. always return >= 0, caller must determine sign and degenerate cases at + * pole or zenith. + */ +double +parallacticLDA (double lt, double dec, double alt) +{ + double ca = sin(lt); + double cb = sin(dec); + double sb = cos(dec); + double cc = sin(alt); + double sc = cos(alt); + double cpa; + + /* given three sides find an angle */ + if (sb==0 || sc==0) + return (0); + cpa = (ca - cb*cc)/(sb*sc); + if (cpa < -1) cpa = -1; + if (cpa > 1) cpa = 1; + return (acos (cpa)); +} + +/* compute parallactic angle given latitude, object HA and Dec. + * all angles in rads. + * return value is between -PI and PI, sign is like HA, ie +west + */ +double +parallacticLHD (double lt, double ha, double dec) +{ + double A, b, cc, sc, B; + + A = ha; + b = PI/2 - lt; + cc = sin(dec); + sc = cos(dec); + solve_sphere (A, b, cc, sc, NULL, &B); + + if (B > PI) + B -= 2*PI; + return (B); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: parallactic.c,v $ $Date: 2003/06/30 04:23:36 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/parallax.c b/Common/Libraries/XEphemAstroLib/src/parallax.c new file mode 100644 index 000000000..3e1738f24 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/parallax.c @@ -0,0 +1,42 @@ +#include +#include + +#include "astro.h" + + +/* given true ha and dec, tha and tdec, the geographical latitude, phi, the + * height above sea-level (as a fraction of the earths radius, 6378.16km), + * ht, and the geocentric distance rho in Earth radii(!), find the apparent + * ha and dec, aha and adec allowing for parallax. + * all angles in radians. ehp is the angle subtended at the body by the + * earth's equator. + */ +void +ta_par (double tha, double tdec, double phi, double ht, double *rho, +double *aha, double *adec) +{ + static double last_phi = 1000.0, last_ht = -1000.0, xobs, zobs; + double x, y, z; /* obj cartesian coord, in Earth radii */ + + /* avoid calcs involving the same phi and ht */ + if (phi != last_phi || ht != last_ht) { + double cphi, sphi, robs, e2 = (2 - 1/298.257)/298.257; + cphi = cos(phi); + sphi = sin(phi); + robs = 1/sqrt(1 - e2 * sphi * sphi); + + /* observer coordinates: x to meridian, y east, z north */ + xobs = (robs + ht) * cphi; + zobs = (robs*(1-e2) + ht) * sphi; + last_phi = phi; + last_ht = ht; + } + + sphcart(-tha, tdec, *rho, &x, &y, &z); + cartsph(x - xobs, y, z - zobs, aha, adec, rho); + *aha *= -1; + range (aha, 2*PI); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: parallax.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/plans.c b/Common/Libraries/XEphemAstroLib/src/plans.c new file mode 100644 index 000000000..c769f39f1 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/plans.c @@ -0,0 +1,227 @@ +/* rewritten for Bureau des Longitude theories by Bretagnon and Chapront + * Michael Sternberg + */ +#include +#include + +#include "astro.h" +#include "vsop87.h" +#include "chap95.h" + +static void pluto_ell (double mj, double *ret); +static void chap_trans (double mj, double *ret); +//void planpos (double mj, int obj, double prec, double *ret); + +/* coordinate transformation + * from: + * J2000.0 rectangular equatoreal ret[{0,1,2}] = {x,y,z} + * to: + * mean equinox of date spherical ecliptical ret[{0,1,2}] = {l,b,r} + */ +static void +chap_trans ( +double mj, /* destination epoch */ +double *ret) /* vector to be transformed _IN PLACE_ */ +{ + double ra, dec, r, eps; + double sr, cr, sd, cd, se, ce; + + cartsph(ret[0], ret[1], ret[2], &ra, &dec, &r); + precess(J2000, mj, &ra, &dec); + obliquity(mj, &eps); + sr = sin(ra); cr = cos(ra); + sd = sin(dec); cd = cos(dec); + se = sin(eps); ce = cos(eps); + ret[0] = atan2( sr * ce + sd/cd * se, cr); /* long */ + ret[1] = asin( sd * ce - cd * se * sr); /* lat */ + ret[2] = r; /* radius */ +} + +/* low precision ecliptic coordinates of Pluto from mean orbit. + * Only for sake of completeness outside available perturbation theories. + */ +static void +pluto_ell ( +double mj, /* epoch */ +double *ret) /* ecliptic coordinates {l,b,r} at equinox of date */ +{ + /* mean orbital elements of Pluto. + * The origin of these is somewhat obscure. + */ + double a = 39.543, /* semimajor axis, au */ + e = 0.2490, /* excentricity */ + inc0 = 17.140, /* inclination, deg */ + Om0 = 110.307, /* long asc node, deg */ + omeg0 = 113.768, /* arg of perihel, deg */ + mjp = 2448045.539 - MJD0, /* epoch of perihel */ + mjeq = J2000, /* equinox of elements */ + n = 144.9600/36525.; /* daily motion, deg */ + + double inc, Om, omeg; /* orbital elements at epoch of date */ + double ma, ea, nu; /* mean, excentric and true anomaly */ + double lo, slo, clo; /* longitude in orbit from asc node */ + + reduce_elements(mjeq, mj, degrad(inc0), degrad(omeg0), degrad(Om0), + &inc, &omeg, &Om); + ma = degrad((mj - mjp) * n); + anomaly(ma, e, &nu, &ea); + ret[2] = a * (1.0 - e*cos(ea)); /* r */ + lo = omeg + nu; + slo = sin(lo); + clo = cos(lo); + ret[1] = asin(slo * sin(inc)); /* b */ + ret[0] = atan2(slo * cos(inc), clo) + Om; /* l */ +} + +/*************************************************************/ + +/* geometric heliocentric position of planet, mean ecliptic of date + * (not corrected for light-time) + */ +void +planpos (double mj, int obj, double prec, double *ret) +{ + if (mj >= CHAP_BEGIN && mj <= CHAP_END) { + if (obj >= JUPITER) { /* prefer Chapront */ + chap95(mj, obj, prec, ret); + chap_trans (mj, ret); + } else { /* VSOP for inner planets */ + vsop87(mj, obj, prec, ret); + } + } else { /* outside Chapront time: */ + if (obj != PLUTO) { /* VSOP for all but Pluto */ + vsop87(mj, obj, prec, ret); + } else { /* Pluto mean elliptic orbit */ + pluto_ell(mj, ret); + } + } +} + +/*************************************************************/ + +/* visual elements of planets + * [planet][0] = angular size at 1 AU + * [planet][1] = magnitude at 1 AU from sun and earth and 0 deg phase angle + * [planet][2] = A + * [planet][3] = B + * [planet][4] = C + * where mag correction = A*(i/100) + B*(i/100)^2 + C*(i/100)^3 + * i = angle between sun and earth from planet, degrees + * from Explanatory Supplement, 1992 + */ +static double vis_elements[8][5] = { + /* Mercury */ { 6.74, -0.36, 3.8, -2.73, 2.00}, + /* Venus */ { 16.92, -4.29, 0.09, 2.39, -.65}, + /* Mars */ { 9.36, -1.52, 1.60, 0., 0.}, + /* Jupiter */ { 196.74, -9.25, 0.50, 0., 0.}, + /* Saturn */ { 165.6, -8.88, 4.40, 0., 0.}, + /* Uranus */ { 65.8, -7.19, 0.28, 0., 0.}, + /* Neptune */ { 62.2, -6.87, 0., 0., 0.}, + /* Pluto */ { 8.2, -1.01, 4.1, 0., 0.} +}; + +/* given a modified Julian date, mj, and a planet, p, find: + * lpd0: heliocentric longitude, + * psi0: heliocentric latitude, + * rp0: distance from the sun to the planet, + * rho0: distance from the Earth to the planet, + * none corrected for light time, ie, they are the true values for the + * given instant. + * lam: geocentric ecliptic longitude, + * bet: geocentric ecliptic latitude, + * each corrected for light time, ie, they are the apparent values as + * seen from the center of the Earth for the given instant. + * dia: angular diameter in arcsec at 1 AU, + * mag: visual magnitude + * + * all angles are in radians, all distances in AU. + * + * corrections for nutation and abberation must be made by the caller. The RA + * and DEC calculated from the fully-corrected ecliptic coordinates are then + * the apparent geocentric coordinates. Further corrections can be made, if + * required, for atmospheric refraction and geocentric parallax. + */ +void +plans (double mj, PLCode p, double *lpd0, double *psi0, double *rp0, +double *rho0, double *lam, double *bet, double *dia, double *mag) +{ + static double lastmj = -10000; + static double lsn, bsn, rsn; /* geocentric coords of sun */ + static double xsn, ysn, zsn; /* cartesian " */ + double lp, bp, rp; /* heliocentric coords of planet */ + double xp, yp, zp, rho; /* rect. coords and geocentric dist. */ + double dt; /* light time */ + double *vp; /* vis_elements[p] */ + double ci, i; /* sun/earth angle: cos, degrees */ + int pass; + + /* get sun cartesian; needed only once at mj */ + if (mj != lastmj) { + sunpos (mj, &lsn, &rsn, &bsn); + sphcart (lsn, bsn, rsn, &xsn, &ysn, &zsn); + lastmj = mj; + } + + /* first find the true position of the planet at mj. + * then repeat a second time for a slightly different time based + * on the position found in the first pass to account for light-travel + * time. + */ + dt = 0.0; + for (pass = 0; pass < 2; pass++) { + double ret[6]; + + /* get spherical coordinates of planet from precision routines, + * retarded for light time in second pass; + * alternative option: vsop allows calculating rates. + */ + planpos(mj - dt, p, 0.0, ret); + + lp = ret[0]; + bp = ret[1]; + rp = ret[2]; + + sphcart (lp, bp, rp, &xp, &yp, &zp); + cartsph (xp + xsn, yp + ysn, zp + zsn, lam, bet, &rho); + + if (pass == 0) { + /* save heliocentric coordinates at first pass since, being + * true, they are NOT to be corrected for light-travel time. + */ + *lpd0 = lp; + range (lpd0, 2.*PI); + *psi0 = bp; + *rp0 = rp; + *rho0 = rho; + } + + /* when we view a planet we see it in the position it occupied + * dt days ago, where rho is the distance between it and earth, + * in AU. use this as the new time for the next pass. + */ + dt = rho * 5.7755183e-3; + } + + vp = vis_elements[p]; + *dia = vp[0]; + + /* solve plane triangle, assume sun/earth dist == 1 */ + ci = (rp*rp + rho*rho - 1)/(2*rp*rho); + + /* expl supp equation for mag */ + if (ci < -1) ci = -1; + if (ci > 1) ci = 1; + i = raddeg(acos(ci))/100.; + *mag = vp[1] + 5*log10(rho*rp) + i*(vp[2] + i*(vp[3] + i*vp[4])); + + /* rings contribution if SATURN */ + if (p == SATURN) { + double et, st, set; + satrings (bp, lp, rp, lsn+PI, rsn, mj+MJD0, &et, &st); + set = sin(fabs(et)); + *mag += (-2.60 + 1.25*set)*set; + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: plans.c,v $ $Date: 2003/11/15 04:07:36 $ $Revision: 1.5 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/plmoon.c b/Common/Libraries/XEphemAstroLib/src/plmoon.c new file mode 100644 index 000000000..9d5eeca9a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/plmoon.c @@ -0,0 +1,284 @@ +/* compute Obj fields for natural satellites. + */ + +#include +#include +#include + +#include "astro.h" + +/* private cache of planet ephemerides and when they were computed + * N.B. don't use ones in builtin[] -- they are the user's responsibility. + */ +static ObjPl plobj[NOBJ]; +static Now plnow[NOBJ]; + +/* public builtin storage + */ +static Obj builtin[NBUILTIN]; + +static char *moondir; + +static void setMoon (Now *np, Obj *moonop, Obj *planop, MoonData *mdp); +static void init1BI (int idx, int pl, int moon, char *name); +static void initPlobj(void); +static void rotate (double a, double *x, double *y); + +/* directory in which to look for auxil moon data files. + * N.B. caller must supply persistent storage. + */ +void +setMoonDir (char *dir) +{ + moondir = dir; +} + +/* return set of builtin objects. + * caller can use this storage but should never try to free anything. + */ +int +getBuiltInObjs (Obj **opp) +{ + if (!builtin[MERCURY].o_name[0]) { + /* first time only */ + + init1BI (MERCURY, MERCURY, X_PLANET, "Mercury"); + + init1BI (VENUS, VENUS, X_PLANET, "Venus"); + + init1BI (MARS, MARS, X_PLANET, "Mars"); + init1BI (PHOBOS, MARS, M_PHOBOS, "Phobos"); + init1BI (DEIMOS, MARS, M_DEIMOS, "Deimos"); + + init1BI (JUPITER, JUPITER, X_PLANET, "Jupiter"); + init1BI (IO, JUPITER, J_IO, "Io"); + init1BI (EUROPA, JUPITER, J_EUROPA, "Europa"); + init1BI (GANYMEDE, JUPITER, J_GANYMEDE, "Ganymede"); + init1BI (CALLISTO, JUPITER, J_CALLISTO, "Callisto"); + + init1BI (SATURN, SATURN, X_PLANET, "Saturn"); + init1BI (MIMAS, SATURN, S_MIMAS, "Mimas"); + init1BI (ENCELADUS, SATURN, S_ENCELADUS, "Enceladus"); + init1BI (TETHYS, SATURN, S_TETHYS, "Tethys"); + init1BI (DIONE, SATURN, S_DIONE, "Dione"); + init1BI (RHEA, SATURN, S_RHEA, "Rhea"); + init1BI (TITAN, SATURN, S_TITAN, "Titan"); + init1BI (HYPERION, SATURN, S_HYPERION, "Hyperion"); + init1BI (IAPETUS, SATURN, S_IAPETUS, "Iapetus"); + + init1BI (URANUS, URANUS, X_PLANET, "Uranus"); + init1BI (ARIEL, URANUS, U_ARIEL, "Ariel"); + init1BI (UMBRIEL, URANUS, U_UMBRIEL, "Umbriel"); + init1BI (TITANIA, URANUS, U_TITANIA, "Titania"); + init1BI (OBERON, URANUS, U_OBERON, "Oberon"); + init1BI (MIRANDA, URANUS, U_MIRANDA, "Miranda"); + + init1BI (NEPTUNE, NEPTUNE, X_PLANET, "Neptune"); + + init1BI (PLUTO, PLUTO, X_PLANET, "Pluto"); + + init1BI (SUN, SUN, X_PLANET, "Sun"); + + init1BI (MOON, MOON, X_PLANET, "Moon"); + } + + *opp = builtin; + return (NBUILTIN); +} + +static void +init1BI (int idx, int pl, int moon, char *name) +{ + strcpy (builtin[idx].o_name, name); + builtin[idx].o_type = PLANET; + builtin[idx].pl_code = pl; + builtin[idx].pl_moon = moon; +} + +/* find the circumstances for natural satellite object op at np. + * TODO: distances and helio coords just copied from parent planet. + */ +int +plmoon_cir (Now *np, Obj *moonop) +{ + Obj *sunop = (Obj*)&plobj[SUN]; + MoonData md[X_MAXNMOONS]; + double sz, t1, t2; + double pra, pdec; + MoonData *mdp; + Obj *planop; + + /* init plobj[] */ + if (!((Obj *)&plobj[0])->o_type) + initPlobj(); + + /* get sun @ np */ + if (memcmp (&plnow[SUN], np, sizeof(Now))) { + obj_cir (np, (Obj*)&plobj[SUN]); + memcpy (&plnow[SUN], np, sizeof(Now)); + } + + /* get parent planet and moon info @ np */ + switch (moonop->pl_code) { + + case MARS: + case PHOBOS: + case DEIMOS: + + planop = (Obj*)&plobj[MARS]; + + if (memcmp (&plnow[MARS], np, sizeof(Now))) { + obj_cir (np, planop); + memcpy (&plnow[MARS], np, sizeof(Now)); + } + + /* don't worry, this already caches based on same mjd */ + marsm_data (mjd, moondir, sunop, planop, &sz, &pra, &pdec, md); + mdp = &md[moonop->pl_moon]; + break; + + case JUPITER: + case IO: + case EUROPA: + case GANYMEDE: + case CALLISTO: + + planop = (Obj*)&plobj[JUPITER]; + + if (memcmp (&plnow[JUPITER], np, sizeof(Now))) { + obj_cir (np, planop); + memcpy (&plnow[JUPITER], np, sizeof(Now)); + } + + /* don't worry, this already caches based on same mjd */ + jupiter_data (mjd,moondir,sunop,planop,&sz,&t1,&t2,&pra,&pdec,md); + mdp = &md[moonop->pl_moon]; + moonop->pl_aux1 = t1; + moonop->pl_aux2 = t2; + break; + + case SATURN: + case MIMAS: + case ENCELADUS: + case TETHYS: + case DIONE: + case RHEA: + case TITAN: + case HYPERION: + case IAPETUS: + + planop = (Obj*)&plobj[SATURN]; + + if (memcmp (&plnow[SATURN], np, sizeof(Now))) { + obj_cir (np, planop); + memcpy (&plnow[SATURN], np, sizeof(Now)); + } + + /* don't worry, this already caches based on same mjd */ + saturn_data (mjd,moondir,sunop,planop,&sz,&t1,&t2,&pra,&pdec,md); + mdp = &md[moonop->pl_moon]; + moonop->pl_aux1 = t1; + moonop->pl_aux2 = t2; + break; + + case URANUS: + case ARIEL: + case UMBRIEL: + case TITANIA: + case OBERON: + case MIRANDA: + + planop = (Obj*)&plobj[URANUS]; + + if (memcmp (&plnow[URANUS], np, sizeof(Now))) { + obj_cir (np, planop); + memcpy (&plnow[URANUS], np, sizeof(Now)); + } + + /* don't worry, this already caches based on same mjd */ + uranus_data (mjd, moondir, sunop, planop, &sz, &pra, &pdec, md); + mdp = &md[moonop->pl_moon]; + break; + + default: + + printf ("Called plmoon_cir with bad code: %d\n",moonop->pl_code); + return (-1); + + } + + /* set moonop */ + setMoon (np, moonop, planop, mdp); + + return (0); +} + +static void +initPlobj() +{ + int i; + + for (i = 0; i < NOBJ; i++) { + ((Obj*)&plobj[i])->o_type = PLANET; + ((Obj*)&plobj[i])->pl_code = i; + } +} + +/* set moonop->s_* fields. + * np is needed to get local parallactic angle. + */ +static void +setMoon (Now *np, Obj *moonop, Obj *planop, MoonData *mdp) +{ + double pa, dra, ddec; + + /* just copy most fields from planet for now */ + moonop->s_gaera = planop->s_gaera; /* TODO */ + moonop->s_gaedec = planop->s_gaedec; /* TODO */ + moonop->s_elong = planop->s_elong; /* TODO */ + moonop->s_size = 0; /* TODO */ + moonop->s_sdist = planop->s_sdist; /* TODO */ + moonop->s_edist = planop->s_edist; /* TODO */ + moonop->s_hlat = planop->s_hlat; /* TODO */ + moonop->s_hlong = planop->s_hlong; /* TODO */ + moonop->s_phase = planop->s_phase; /* TODO */ + + /* new ra/dec directly from mdp */ + moonop->s_ra = mdp->ra; + moonop->s_dec = mdp->dec; + + /* geoemtry info */ + moonop->pl_x = mdp->x; + moonop->pl_y = mdp->y; + moonop->pl_z = mdp->z; + moonop->pl_evis = mdp->evis; + moonop->pl_svis = mdp->svis; + + /* tweak alt/az by change in ra/dec rotated by pa */ + pa = parallacticLDA (lat, planop->s_dec, planop->s_alt); + if (planop->s_az < PI) + pa = -pa; /* rotation radec to altaz */ + dra = (moonop->s_ra - planop->s_ra)*cos(planop->s_dec); + ddec = moonop->s_dec - planop->s_dec; + rotate (pa, &dra, &ddec); + moonop->s_alt = planop->s_alt + ddec; + moonop->s_az = planop->s_az - dra/cos(planop->s_alt); + + /* new mag directly from mdp */ + set_smag (moonop, mdp->mag); + + /* name */ + strcpy (moonop->o_name, mdp->full); +} + +/* rotate ccw by a */ +static void +rotate (double a, double *x, double *y) +{ + double sa = sin(a); + double ca = cos(a); + double xp = (*x)*ca - (*y)*sa; + double yp = (*x)*sa + (*y)*ca; + *x = xp; + *y = yp; +} diff --git a/Common/Libraries/XEphemAstroLib/src/plshadow.c b/Common/Libraries/XEphemAstroLib/src/plshadow.c new file mode 100644 index 000000000..514adc9b3 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/plshadow.c @@ -0,0 +1,50 @@ +#include + +#include "astro.h" + +#undef sqr +#define sqr(x) ((x)*(x)) + +/* given a planet, the sun, the planet's eq pole position and a + * position of a satellite (as eq x=+e y=+s z=front in planet radii) find x,y + * position of shadow. + * return 0 if ok else -1 if shadow not on planet + */ +int +plshadow (Obj *op, Obj *sop, double polera, double poledec, double x, +double y, double z, float *sxp, float *syp) +{ + /* equatorial to ecliptic sky-plane rotation */ + double sa = cos(op->s_dec) * cos(poledec) * + (cos(op->s_ra)*sin(polera) - sin(op->s_ra)*cos(polera)); + double ca = sqrt (1.0 - sa*sa); + + /* rotate moon from equatorial to ecliptic */ + double ex = x*ca + y*sa; + double ey = -x*sa + y*ca; + + /* find angle subtended by earth-sun from planet */ + double a = asin (sin(op->s_hlong - sop->s_hlong)/op->s_edist); + double b = asin (-sin(op->s_hlat)/op->s_edist); + + /* find displacement in sky plane */ + double x0 = ex - z*tan(a); + double y0 = ey - z*tan(b); + + /* projection onto unit sphere */ + double x1 = x0 + (ex-x0)/sqrt(sqr(ex-x0)+sqr(z)); + double y1 = y0 + (ey-y0)/sqrt(sqr(ey-y0)+sqr(z)); + + /* check behind or off edge */ + if (z < 0 || sqr(x1) + sqr(y1) > 1) + return (-1); + + /* rotate back to equatorial */ + *sxp = x1*ca - y1*sa; + *syp = x1*sa + y1*ca; + + return (0); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: plshadow.c,v $ $Date: 2004/12/17 20:53:43 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/precess.c b/Common/Libraries/XEphemAstroLib/src/precess.c new file mode 100644 index 000000000..33ed4f459 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/precess.c @@ -0,0 +1,146 @@ +#include +#include + +#include "astro.h" + +static void precess_hiprec (double mjd1, double mjd2, double *ra, double *dec); + + +#define DCOS(x) cos(degrad(x)) +#define DSIN(x) sin(degrad(x)) +#define DASIN(x) raddeg(asin(x)) +#define DATAN2(y,x) raddeg(atan2((y),(x))) + +/* corrects ra and dec, both in radians, for precession from epoch 1 to epoch 2. + * the epochs are given by their modified JDs, mjd1 and mjd2, respectively. + * N.B. ra and dec are modifed IN PLACE. + */ +void +precess ( +double mjd1, double mjd2, /* initial and final epoch modified JDs */ +double *ra, double *dec) /* ra/dec for mjd1 in, for mjd2 out */ +{ + precess_hiprec (mjd1, mjd2, ra, dec); +} + +/* + * Copyright (c) 1990 by Craig Counterman. All rights reserved. + * + * This software may be redistributed freely, not sold. + * This copyright notice and disclaimer of warranty must remain + * unchanged. + * + * No representation is made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty, to the extent permitted by applicable law. + * + * Rigorous precession. From Astronomical Ephemeris 1989, p. B18 + * + * 96-06-20 Hayo Hase : theta_a corrected + */ +static void +precess_hiprec ( +double mjd1, double mjd2, /* initial and final epoch modified JDs */ +double *ra, double *dec) /* ra/dec for mjd1 in, for mjd2 out */ +{ + static double last_mjd1 = -213.432, last_from; + static double last_mjd2 = -213.432, last_to; + double zeta_A, z_A, theta_A; + double T; + double A, B, C; + double alpha, delta; + double alpha_in, delta_in; + double from_equinox, to_equinox; + double alpha2000, delta2000; + + /* convert mjds to years; + * avoid the remarkably expensive calls to mjd_year() + */ + if (last_mjd1 == mjd1) + from_equinox = last_from; + else { + mjd_year (mjd1, &from_equinox); + last_mjd1 = mjd1; + last_from = from_equinox; + } + if (last_mjd2 == mjd2) + to_equinox = last_to; + else { + mjd_year (mjd2, &to_equinox); + last_mjd2 = mjd2; + last_to = to_equinox; + } + + /* convert coords in rads to degs */ + alpha_in = raddeg(*ra); + delta_in = raddeg(*dec); + + /* precession progresses about 1 arc second in .047 years */ + /* From from_equinox to 2000.0 */ + if (fabs (from_equinox-2000.0) > .02) { + T = (from_equinox - 2000.0)/100.0; + zeta_A = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T; + z_A = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T; + theta_A = 0.5567530* T - 0.0001185* T*T - 0.0000116* T*T*T; + + A = DSIN(alpha_in - z_A) * DCOS(delta_in); + B = DCOS(alpha_in - z_A) * DCOS(theta_A) * DCOS(delta_in) + + DSIN(theta_A) * DSIN(delta_in); + C = -DCOS(alpha_in - z_A) * DSIN(theta_A) * DCOS(delta_in) + + DCOS(theta_A) * DSIN(delta_in); + + alpha2000 = DATAN2(A,B) - zeta_A; + range (&alpha2000, 360.0); + delta2000 = DASIN(C); + } else { + /* should get the same answer, but this could improve accruacy */ + alpha2000 = alpha_in; + delta2000 = delta_in; + }; + + + /* From 2000.0 to to_equinox */ + if (fabs (to_equinox - 2000.0) > .02) { + T = (to_equinox - 2000.0)/100.0; + zeta_A = 0.6406161* T + 0.0000839* T*T + 0.0000050* T*T*T; + z_A = 0.6406161* T + 0.0003041* T*T + 0.0000051* T*T*T; + theta_A = 0.5567530* T - 0.0001185* T*T - 0.0000116* T*T*T; + + A = DSIN(alpha2000 + zeta_A) * DCOS(delta2000); + B = DCOS(alpha2000 + zeta_A) * DCOS(theta_A) * DCOS(delta2000) + - DSIN(theta_A) * DSIN(delta2000); + C = DCOS(alpha2000 + zeta_A) * DSIN(theta_A) * DCOS(delta2000) + + DCOS(theta_A) * DSIN(delta2000); + + alpha = DATAN2(A,B) + z_A; + range(&alpha, 360.0); + delta = DASIN(C); + } else { + /* should get the same answer, but this could improve accruacy */ + alpha = alpha2000; + delta = delta2000; + }; + + *ra = degrad(alpha); + *dec = degrad(delta); +} + +#if 0 +static void +precess_fast ( +double mjd1, double mjd2, /* initial and final epoch modified JDs */ +double *ra, double *dec) /* ra/dec for mjd1 in, for mjd2 out */ +{ +#define N degrad (20.0468/3600.0) +#define M hrrad (3.07234/3600.0) + double nyrs; + + nyrs = (mjd2 - mjd1)/365.2425; + *dec += N * cos(*ra) * nyrs; + *ra += (M + (N * sin(*ra) * tan(*dec))) * nyrs; + range (ra, 2.0*PI); +} +#endif + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: precess.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/preferences.h b/Common/Libraries/XEphemAstroLib/src/preferences.h new file mode 100644 index 000000000..c5786611f --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/preferences.h @@ -0,0 +1,41 @@ +/* global info for the preferences facility. + * N.B. many of these enums are used as indexes -- don't change without + * checking where they are used! + */ +#ifndef _PREFERENCES_H +#define _PREFERENCES_H + +#ifdef __cplusplus +extern "C" { +#endif + +// all of your legacy C code here + + +typedef enum { + PREF_EQUATORIAL, PREF_UNITS, PREF_DATE_FORMAT, PREF_ZONE, PREF_DPYPREC, + PREF_MSG_BELL, PREF_PRE_FILL, PREF_TIPS, PREF_CONFIRM, PREF_WEEKSTART, + NPREFS +} Preferences; + +typedef enum {PREF_GEO, PREF_TOPO} PrefEquatorial; +typedef enum {PREF_ENGLISH, PREF_METRIC} PrefUnits; +typedef enum {PREF_MDY, PREF_YMD, PREF_DMY} PrefDateFormat; +typedef enum {PREF_LOCALTZ, PREF_UTCTZ} PrefStampZone; +typedef enum {PREF_LOPREC, PREF_HIPREC} PrefDpyPrec; +typedef enum {PREF_NOMSGBELL, PREF_MSGBELL} PrefMsgBell; +typedef enum {PREF_PREFILL, PREF_NOPREFILL} PrefPreFill; +typedef enum {PREF_TIPSON, PREF_NOTIPS} PrefTips; +typedef enum {PREF_CONFIRMON, PREF_NOCONFIRM} PrefConfirm; +typedef enum {PREF_SAT, PREF_SUN, PREF_MON} PrefWeekStart; + +extern int pref_get (Preferences p); +extern int pref_set (Preferences p, int newp); +#ifdef __cplusplus +} +#endif +#endif /* _PREFERENCES_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: preferences.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.6 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/reduce.c b/Common/Libraries/XEphemAstroLib/src/reduce.c new file mode 100644 index 000000000..58ede03a8 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/reduce.c @@ -0,0 +1,78 @@ +#include + +#include + +#include "astro.h" + +/* convert those orbital elements that change from epoch mj0 to epoch mj. + */ +void +reduce_elements ( +double mj0, /* initial epoch */ +double mj, /* desired epoch */ +double inc0, /* initial inclination, rads */ +double ap0, /* initial argument of perihelion, as an mj */ +double om0, /* initial long of ascending node, rads */ +double *inc, /* resultant inclination, rads */ +double *ap, /* resultant arg of perihelion, as an mj */ +double *om) /* resultant long of ascending node, rads */ +{ + double t0, t1; + double tt, tt2, t02, tt3; + double eta, th, th0; + double a, b; + double dap; + double cinc, sinc; + double ot, sot, cot, ot1; + double seta, ceta; + + if (fabs(mj - mj0) < 1e-5) { + /* sin(eta) blows for inc < 10 degrees -- anyway, no need */ + *inc = inc0; + *ap = ap0; + *om = om0; + return; + } + + t0 = mj0/365250.0; + t1 = mj/365250.0; + + tt = t1-t0; + tt2 = tt*tt; + t02 = t0*t0; + tt3 = tt*tt2; + eta = (471.07-6.75*t0+.57*t02)*tt+(.57*t0-3.37)*tt2+.05*tt3; + th0 = 32869.0*t0+56*t02-(8694+55*t0)*tt+3*tt2; + eta = degrad(eta/3600.0); + th0 = degrad((th0/3600.0)+173.950833); + th = (50256.41+222.29*t0+.26*t02)*tt+(111.15+.26*t0)*tt2+.1*tt3; + th = th0+degrad(th/3600.0); + cinc = cos(inc0); + sinc = sin(inc0); + ot = om0-th0; + sot = sin(ot); + cot = cos(ot); + seta = sin(eta); + ceta = cos(eta); + a = sinc*sot; + b = ceta*sinc*cot-seta*cinc; + ot1 = atan(a/b); + if (b<0) ot1 += PI; + b = sinc*ceta-cinc*seta*cot; + a = -1*seta*sot; + dap = atan(a/b); + if (b<0) dap += PI; + + *ap = ap0+dap; + range (ap, 2*PI); + *om = ot1+th; + range (om, 2*PI); + + if (inc0<.175) + *inc = asin(a/sin(dap)); + else + *inc = 1.570796327-asin((cinc*ceta)+(sinc*seta*cot)); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: reduce.c,v $ $Date: 2003/03/28 10:23:35 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/refract.c b/Common/Libraries/XEphemAstroLib/src/refract.c new file mode 100644 index 000000000..4483cc93f --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/refract.c @@ -0,0 +1,96 @@ +#include +#include + +#include "astro.h" + +static void unrefractLT15 (double pr, double tr, double aa, double *ta); +static void unrefractGE15 (double pr, double tr, double aa, double *ta); + +void +unrefract (double pr, double tr, double aa, double *ta) +{ +#define LTLIM 14.5 +#define GELIM 15.5 + + double aadeg = raddeg(aa); + + if (aadeg < LTLIM) + unrefractLT15 (pr, tr, aa, ta); + else if (aadeg >= GELIM) + unrefractGE15 (pr, tr, aa, ta); + else { + /* smooth blend -- important for inverse */ + double taLT, taGE, p; + + unrefractLT15 (pr, tr, aa, &taLT); + unrefractGE15 (pr, tr, aa, &taGE); + p = (aadeg - LTLIM)/(GELIM - LTLIM); + *ta = taLT + (taGE - taLT)*p; + } +} + +static void +unrefractGE15 (double pr, double tr, double aa, double *ta) +{ + double r; + + r = 7.888888e-5*pr/((273+tr)*tan(aa)); + *ta = aa - r; +} + +static void +unrefractLT15 (double pr, double tr, double aa, double *ta) +{ + double aadeg = raddeg(aa); + double r, a, b; + + a = ((2e-5*aadeg+1.96e-2)*aadeg+1.594e-1)*pr; + b = (273+tr)*((8.45e-2*aadeg+5.05e-1)*aadeg+1); + r = degrad(a/b); + + *ta = (aa < 0 && r < 0) ? aa : aa - r; /* 0 below ~5 degs */ +} + +/* correct the true altitude, ta, for refraction to the apparent altitude, aa, + * each in radians, given the local atmospheric pressure, pr, in mbars, and + * the temperature, tr, in degrees C. + */ +void +refract (double pr, double tr, double ta, double *aa) +{ +#define MAXRERR degrad(0.1/3600.) /* desired accuracy, rads */ + + double d, t, t0, a; + + if (isnan (ta)) { + *aa = ta; + return; + } + + /* first guess of error is to go backwards. + * make use that we know delta-apparent is always < delta-true. + */ + unrefract (pr, tr, ta, &t); + d = 0.8*(ta - t); + t0 = t; + a = ta; + + /* use secant method to discover a value that unrefracts to ta. + * max=7 ave=2.4 loops in hundreds of test cases. + */ + while (1) { + a += d; + unrefract (pr, tr, a, &t); + if (fabs(ta-t) <= MAXRERR) + break; + d *= -(ta - t)/(t0 - t); + t0 = t; + } + + *aa = a; + +#undef MAXRERR +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: refract.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.6 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/rings.c b/Common/Libraries/XEphemAstroLib/src/rings.c new file mode 100644 index 000000000..b09b6829b --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/rings.c @@ -0,0 +1,45 @@ +#include +#include +#include + +#include "astro.h" + +/* RINGS OF SATURN by Olson, et al, BASIC Code from Sky & Telescope, May 1995. + * As converted from BASIC to C by pmartz@dsd.es.com (Paul Martz) + * Adapted to xephem by Elwood Charles Downey. + */ +void +satrings ( +double sb, double sl, double sr, /* Saturn hlat, hlong, sun dist */ +double el, double er, /* Earth hlong, sun dist */ +double JD, /* Julian date */ +double *etiltp, double *stiltp) /* tilt from earth and sun, rads south*/ +{ + double t, i, om; + double x, y, z; + double la, be; + double s, b, sp, bp; + + t = (JD-2451545.)/365250.; + i = degrad(28.04922-.13*t+.0004*t*t); + om = degrad(169.53+13.826*t+.04*t*t); + + x = sr*cos(sb)*cos(sl)-er*cos(el); + y = sr*cos(sb)*sin(sl)-er*sin(el); + z = sr*sin(sb); + + la = atan(y/x); + if (x<0) la+=PI; + be = atan(z/sqrt(x*x+y*y)); + + s = sin(i)*cos(be)*sin(la-om)-cos(i)*sin(be); + b = atan(s/sqrt(1.-s*s)); + sp = sin(i)*cos(sb)*sin(sl-om)-cos(i)*sin(sb); + bp = atan(sp/sqrt(1.-sp*sp)); + + *etiltp = b; + *stiltp = bp; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: rings.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/riset.c b/Common/Libraries/XEphemAstroLib/src/riset.c new file mode 100644 index 000000000..1629d9685 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/riset.c @@ -0,0 +1,100 @@ +#include +#include + +#include "astro.h" + +/* given the true geocentric ra and dec of an object, the observer's latitude, + * lt, and a horizon displacement correction, dis, all in radians, find the + * local sidereal times and azimuths of rising and setting, lstr/s + * and azr/s, also all in radians, respectively. + * dis is the vertical displacement from the true position of the horizon. it + * is positive if the apparent position is higher than the true position. + * said another way, it is positive if the shift causes the object to spend + * longer above the horizon. for example, atmospheric refraction is typically + * assumed to produce a vertical shift of 34 arc minutes at the horizon; dis + * would then take on the value +9.89e-3 (radians). On the other hand, if + * your horizon has hills such that your apparent horizon is, say, 1 degree + * above sea level, you would allow for this by setting dis to -1.75e-2 + * (radians). + * + * This version contributed by Konrad Bernloehr, Nov. 1996 + * + * status: 0=normal; 1=never rises; -1=circumpolar. + * In case of non-zero status, all other returned variables are undefined. + */ +void +riset (double ra, double dec, double lt, double dis, double *lstr, +double *lsts, double *azr, double *azs, int *status) +{ +#define EPS (1e-9) /* math rounding fudge - always the way, eh? */ + double h; /* hour angle */ + double cos_h; /* cos h */ + double z; /* zenith angle */ + double zmin, zmax; /* Minimum and maximum zenith angles */ + double xaz, yaz; /* components of az */ + int shemi; /* flag for southern hemisphere reflection */ + + /* reflect lt and dec if in southern hemisphere, then az back later */ + if ((shemi= (lt < 0.)) != 0) { + lt = -lt; + dec = -dec; + } + + /* establish zenith angle, and its extrema */ + z = (PI/2.) + dis; + zmin = fabs (dec - lt); + zmax = PI - fabs(dec + lt); + + /* first consider special cases. + * these also avoid any boundary problems in subsequent computations. + */ + if (zmax <= z + EPS) { + *status = -1; /* never sets */ + return; + } + if (zmin >= z - EPS) { + *status = 1; /* never rises */ + return; + } + + /* compute rising hour angle -- beware found off */ + cos_h = (cos(z)-sin(lt)*sin(dec))/(cos(lt)*cos(dec)); + if (cos_h >= 1.) + h = 0.; + else if (cos_h <= -1.) + h = PI; + else + h = acos (cos_h); + + /* compute setting azimuth -- beware found off */ + xaz = sin(dec)*cos(lt)-cos(dec)*cos(h)*sin(lt); + yaz = -1.*cos(dec)*sin(h); + if (xaz == 0.) { + if (yaz > 0) + *azs = PI/2; + else + *azs = -PI/2; + } else + *azs = atan2 (yaz, xaz); + + /* reflect az back if southern */ + if (shemi) + *azs = PI - *azs; + range(azs, 2.*PI); + + /* rising is just the opposite side */ + *azr = 2.*PI - *azs; + range(azr, 2.*PI); + + /* rise and set are just ha either side of ra */ + *lstr = radhr(ra-h); + range(lstr,24.0); + *lsts = radhr(ra+h); + range(lsts,24.0); + + /* OK */ + *status = 0; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: riset.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/riset_cir.c b/Common/Libraries/XEphemAstroLib/src/riset_cir.c new file mode 100644 index 000000000..66f91c1f4 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/riset_cir.c @@ -0,0 +1,426 @@ +/* find rise and set circumstances, ie, riset_cir() and related functions. */ + +#include +#include +#include +#include + +#include "astro.h" + + +static void e_riset_cir (Now *np, Obj *op, double dis, RiseSet *rp); +static int find_0alt (double dt, double fstep, double dis, Now *np, Obj *op); +static int find_transit (double dt, Now *np, Obj *op); +static int find_maxalt (Now *np, Obj *op, double tr, double ts, double *tp, + double *alp, double *azp); + +/* find where and when an object, op, will rise and set and + * it's transit circumstances. all times are utc mjd, angles rads e of n. + * dis is the angle down from an ideal horizon, in rads (see riset()). + * N.B. dis should NOT include refraction, we do that here. + */ +void +riset_cir (Now *np, Obj *op, double dis, RiseSet *rp) +{ + double mjdn; /* mjd of local noon */ + double lstn; /* lst at local noon */ + double lr, ls; /* lst rise/set times */ + double ar, as; /* az of rise/set */ + double ran; /* RA at noon */ + Now n; /* copy to move time around */ + Obj o; /* copy to get circumstances at n */ + int rss; /* temp status */ + + /* work with local copies so we can move the time around */ + (void) memcpy ((void *)&n, (void *)np, sizeof(n)); + (void) memcpy ((void *)&o, (void *)op, sizeof(o)); + + /* fast Earth satellites need a different approach. + * "fast" here is pretty arbitrary -- just too fast to work with the + * iterative approach based on refining the times for a "fixed" object. + */ + if (op->o_type == EARTHSAT && op->es_n > FAST_SAT_RPD) { + e_riset_cir (&n, &o, dis, rp); + return; + } + + /* assume no problems initially */ + rp->rs_flags = 0; + + /* start the iteration at local noon */ + mjdn = mjd_day(mjd - tz/24.0) + tz/24.0 + 0.5; + n.n_mjd = mjdn; + now_lst (&n, &lstn); + + /* first approximation is to find rise/set times of a fixed object + * at the current epoch in its position at local noon. + * N.B. add typical refraction if dis is above horizon for initial + * go/no-go test. if it passes, real code does refraction rigorously. + */ + n.n_mjd = mjdn; + if (obj_cir (&n, &o) < 0) { + rp->rs_flags = RS_ERROR; + return; + } + ran = o.s_gaera; + riset (o.s_gaera, o.s_gaedec, lat, dis+(dis>.01 ? 0 : .01), &lr, &ls, + &ar, &as, &rss); + switch (rss) { + case 0: break; + case 1: rp->rs_flags = RS_NEVERUP; return; + case -1: rp->rs_flags = RS_CIRCUMPOLAR; goto dotransit; + default: rp->rs_flags = RS_ERROR; return; + } + + /* iterate to find better rise time */ + n.n_mjd = mjdn; + switch (find_0alt ((lr - lstn)/SIDRATE, 60/SPD, dis, &n, &o)) { + case 0: /* ok */ + rp->rs_risetm = n.n_mjd; + rp->rs_riseaz = o.s_az; + break; + case -1: /* obj_cir error */ + rp->rs_flags |= RS_RISERR; + break; + case -2: /* converged but not today, err but give times anyway */ + rp->rs_risetm = n.n_mjd; + rp->rs_riseaz = o.s_az; + rp->rs_flags |= RS_NORISE; + break; + case -3: /* probably never up */ + rp->rs_flags |= RS_NEVERUP; + break; + } + + /* iterate to find better set time */ + n.n_mjd = mjdn; + switch (find_0alt ((ls - lstn)/SIDRATE, 60/SPD, dis, &n, &o)) { + case 0: /* ok */ + rp->rs_settm = n.n_mjd; + rp->rs_setaz = o.s_az; + break; + case -1: /* obj_cir error */ + rp->rs_flags |= RS_SETERR; + break; + case -2: /* converged but not today, err but give times anyway */ + rp->rs_settm = n.n_mjd; + rp->rs_setaz = o.s_az; + rp->rs_flags |= RS_NOSET; + break; + case -3: /* probably circumpolar */ + rp->rs_flags |= RS_CIRCUMPOLAR; + break; + } + + /* can try transit even if rise or set failed */ + dotransit: + n.n_mjd = mjdn; + switch (find_transit ((radhr(ran) - lstn)/SIDRATE, &n, &o)) { + case 0: /* ok */ + rp->rs_trantm = n.n_mjd; + rp->rs_tranalt = o.s_alt; + rp->rs_tranaz = o.s_az; + break; + case -1: /* did not converge */ + rp->rs_flags |= RS_TRANSERR; + break; + case -2: /* converged but not today */ + rp->rs_flags |= RS_NOTRANS; + break; + } +} + +/* find local times when sun is dis rads below horizon. + */ +void +twilight_cir (Now *np, double dis, double *dawn, double *dusk, int *status) +{ + RiseSet rs; + Obj o; + + memset (&o, 0, sizeof(o)); + o.o_type = PLANET; + o.pl_code = SUN; + (void) strcpy (o.o_name, "Sun"); + riset_cir (np, &o, dis, &rs); + *dawn = rs.rs_risetm; + *dusk = rs.rs_settm; + *status = rs.rs_flags; +} + +/* find where and when a fast-moving Earth satellite, op, will rise and set and + * it's transit circumstances. all times are mjd, angles rads e of n. + * dis is the angle down from the local topo horizon, in rads (see riset()). + * idea is to walk forward in time looking for alt+dis==0 crossings. + * initial time step is a few degrees (based on average daily motion). + * we stop as soon as we see both a rise and set. + * N.B. we assume *np and *op are working copies we can mess up. + */ +static void +e_riset_cir (Now *np, Obj *op, double dis, RiseSet *rp) +{ +#define DEGSTEP 2 /* time step is about this many degrees */ + int steps; /* max number of time steps */ + double dt; /* time change per step, days */ + double t0, t1; /* current and next mjd values */ + double a0, a1; /* altitude at t0 and t1 */ + int rise, set; /* flags to check when we find these events */ + int i; + + dt = DEGSTEP * (1.0/360.0/op->es_n); + steps = (int)(1.0/dt); + rise = set = 0; + rp->rs_flags = 0; + + if (obj_cir (np, op) < 0) { + rp->rs_flags |= RS_ERROR; + return; + } + + t0 = mjd; + a0 = op->s_alt + dis; + + for (i = 0; i < steps && (!rise || !set); i++) { + mjd = t1 = t0 + dt; + if (obj_cir (np, op) < 0) { + rp->rs_flags |= RS_ERROR; + return; + } + a1 = op->s_alt + dis; + + if (a0 < 0 && a1 > 0 && !rise) { + /* found a rise event -- interate to refine */ + switch (find_0alt (10./3600., 5./SPD, dis, np, op)) { + case 0: /* ok */ + rp->rs_risetm = np->n_mjd; + rp->rs_riseaz = op->s_az; + rise = 1; + break; + case -1: /* obj_cir error */ + rp->rs_flags |= RS_RISERR; + return; + case -2: /* converged but not today */ /* FALLTHRU */ + case -3: /* probably never up */ + rp->rs_flags |= RS_NORISE; + return; + } + } else if (a0 > 0 && a1 < 0 && !set) { + /* found a setting event -- interate to refine */ + switch (find_0alt (10./3600., 5./SPD, dis, np, op)) { + case 0: /* ok */ + rp->rs_settm = np->n_mjd; + rp->rs_setaz = op->s_az; + set = 1; + break; + case -1: /* obj_cir error */ + rp->rs_flags |= RS_SETERR; + return; + case -2: /* converged but not today */ /* FALLTHRU */ + case -3: /* probably circumpolar */ + rp->rs_flags |= RS_NOSET; + return; + } + } + + t0 = t1; + a0 = a1; + } + + /* instead of transit, for satellites we find time of maximum + * altitude, if we know both the rise and set times. + */ + if (rise && set) { + double tt, al, az; + if (find_maxalt (np, op, rp->rs_risetm, rp->rs_settm, &tt, &al, &az) < 0) { + rp->rs_flags |= RS_TRANSERR; + return; + } + rp->rs_trantm = tt; + rp->rs_tranalt = al; + rp->rs_tranaz = az; + } else + rp->rs_flags |= RS_NOTRANS; + + /* check for some bad conditions */ + if (!rise) { + if (a0 > 0) + rp->rs_flags |= RS_CIRCUMPOLAR; + else + rp->rs_flags |= RS_NORISE; + } + if (!set) { + if (a0 < 0) + rp->rs_flags |= RS_NEVERUP; + else + rp->rs_flags |= RS_NOSET; + } +} + +/* given a Now at noon and a dt from np, in hours, for a first approximation + * to a rise or set event, refine the event by searching for when alt+dis = 0. + * return 0: if find one within 12 hours of noon with np and op set to the + * better time and circumstances; + * return -1: if error from obj_cir; + * return -2: if converges but not today; + * return -3: if does not converge at all (probably circumpolar or never up); + */ +static int +find_0alt ( +double dt, /* hours from initial np to first guess at event */ +double fstep, /* first step size, days */ +double dis, /* horizon displacement, rads */ +Now *np, /* working Now -- starts with mjd is noon, returns as answer */ +Obj *op) /* working object -- returns as answer */ +{ +#define TMACC (0.01/SPD) /* convergence accuracy, days; tight for stable az */ +#define MAXPASSES 20 /* max iterations to try */ +#define MAXSTEP (12.0/24.0) /* max time step,days (to detect flat)*/ + + double a0 = 0; + double mjdn = mjd; + int npasses; + + /* insure initial guess is today -- if not, move by 24 hours */ + if (dt < -12.0 && !find_0alt (dt+24, fstep, dis, np, op)) + return (0); + mjd = mjdn; + if (dt > 12.0 && !find_0alt (dt-24, fstep, dis, np, op)) + return (0); + mjd = mjdn; + + /* convert dt to days for remainder of algorithm */ + dt /= 24.0; + + /* use secant method to look for s_alt + dis == 0 */ + npasses = 0; + do { + double a1; + + mjd += dt; + if (obj_cir (np, op) < 0) + return (-1); + a1 = op->s_alt; + + dt = (npasses == 0) ? fstep : (dis+a1)*dt/(a0-a1); + a0 = a1; + + if (++npasses > MAXPASSES || fabs(dt) >= MAXSTEP) + return (-3); + + } while (fabs(dt)>TMACC); + // fprintf (stderr, "%s 0alt npasses = %d\n", op->o_name, npasses); + + /* return codes */ + return (fabs(mjdn-mjd) < .5 ? 0 : -2); + +#undef MAXPASSES +#undef MAXSTEP +#undef TMACC +} + +/* find when the given object transits. start the search when LST matches the + * object's RA at noon. + * if ok, return 0 with np and op set to the transit conditions; if can't + * converge return -1; if converges ok but not today return -2. + * N.B. we assume np is passed set to local noon. + */ +static int +find_transit (double dt, Now *np, Obj *op) +{ +#define MAXLOOPS 10 +#define MAXERR (1./3600.) /* hours */ + double mjdn = mjd; + double lst; + int i; + + /* insure initial guess is today -- if not, move by 24 hours */ + if (dt < -12.0) + dt += 24.0; + if (dt > 12.0) + dt -= 24.0; + + i = 0; + do { + mjd += dt/24.0; + if (obj_cir (np, op) < 0) + return (-1); + now_lst (np, &lst); + dt = (radhr(op->s_gaera) - lst); + if (dt < -12.0) + dt += 24.0; + if (dt > 12.0) + dt -= 24.0; + } while (++i < MAXLOOPS && fabs(dt) > MAXERR); + + /* fprintf (stderr, "%s find_transit loops = %d, dt = %g seconds\n", op->o_name, i, dt*3600); */ + + /* return codes */ + if (i == MAXLOOPS) + return (-1); + return (fabs(mjd - mjdn) < 0.5 ? 0 : -2); + +#undef MAXLOOPS +#undef MAXERR +} + +/* find the mjd time of max altitude between the given rise and set times. + * N.B. we assume *np and *op are working copies we can modify. + * return 0 if ok, else -1. + */ +static int +find_maxalt ( +Now *np, +Obj *op, +double tr, double ts, /* mjd of rise and set */ +double *tp, /* time of max altitude */ +double *alp, double *azp) /* max altitude and transit az at said time */ +{ +#define MAXLOOPS 100 /* max loops */ +#define MAXERR (1.0/SPD) /* days */ + + double l, r; /* times known to bracket max alt */ + double m1, m2; /* intermediate range points inside l and r */ + double a1, a2; /* alt at m1 and m2 */ + int nloops; /* max loop check */ + + /* want rise before set */ + while (ts < tr) + tr -= 1.0/op->es_n; + + /* init time bracket */ + l = tr; + r = ts; + + /* ternary search for max */ + for (nloops = 0; r - l > MAXERR && nloops < MAXLOOPS; nloops++) { + + mjd = m1 = (2*l + r)/3; + obj_cir (np, op); + a1 = op->s_alt; + + mjd = m2 = (l + 2*r)/3; + obj_cir (np, op); + a2 = op->s_alt; + + if (a1 < a2) + l = m1; + else + r = m2; + } + // fprintf (stderr, "tern nloops = %d\n", nloops); + if (nloops >= MAXLOOPS) + return (-1); + + /* best is between l and r */ + mjd = *tp = (l+r)/2; + obj_cir (np, op); + *alp = op->s_alt; + *azp = op->s_az; + + return (0); +#undef MAXERR +#undef MAXLOOPS +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: riset_cir.c,v $ $Date: 2013/01/06 01:12:57 $ $Revision: 1.18 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/satlib.h b/Common/Libraries/XEphemAstroLib/src/satlib.h new file mode 100644 index 000000000..31c34675c --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/satlib.h @@ -0,0 +1,206 @@ +#ifndef __SATLIB_H +#define __SATLIB_H + +/* $Id: satlib.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +typedef struct _SatElem { + float se_XMO; + float se_XNODEO; + float se_OMEGAO; + float se_EO; + float se_XINCL; + float se_XNDD60; + float se_BSTAR; + float pad1; + double se_XNO; + double se_XNDT20; + double se_EPOCH; + struct { + unsigned int catno : 21; + unsigned int classif : 5; + unsigned int elnum : 10; + unsigned int year : 14; + unsigned int launch : 10; + unsigned int piece : 15; + unsigned int ephtype : 4; + unsigned int orbit : 17; + } se_id; +} SatElem; + +#if 0 +struct sat_loc { + double sl_X; + double sl_XDOT; + double sl_Y; + double sl_YDOT; + double sl_Z; + double sl_ZDOT; +}; +#endif + +struct sgp4_data { + unsigned int sgp4_flags; + unsigned int pad; + double sgp4_AODP; + double sgp4_AYCOF; + double sgp4_C1; + double sgp4_C4; + double sgp4_C5; + double sgp4_COSIO; + double sgp4_D2; + double sgp4_D3; + double sgp4_D4; + double sgp4_DELMO; + double sgp4_ETA; + double sgp4_OMGCOF; + double sgp4_OMGDOT; + double sgp4_SINIO; + double sgp4_SINMO; + double sgp4_T2COF; + double sgp4_T3COF; + double sgp4_T4COF; + double sgp4_T5COF; + double sgp4_X1MTH2; + double sgp4_X3THM1; + double sgp4_X7THM1; + double sgp4_XLCOF; + double sgp4_XMCOF; + double sgp4_XMDOT; + double sgp4_XNODCF; + double sgp4_XNODOT; + double sgp4_XNODP; +}; + +struct deep_data { + struct { + unsigned int IRESFL : 1; + unsigned int ISYNFL : 1; + } deep_flags; + double deep_s_SINIQ; + double deep_s_COSIQ; + double deep_s_OMGDT; + double deep_ATIME; + double deep_D2201; + double deep_D2211; + double deep_D3210; + double deep_D3222; + double deep_D4410; + double deep_D4422; + double deep_D5220; + double deep_D5232; + double deep_D5421; + double deep_D5433; + double deep_DEL1; + double deep_DEL2; + double deep_DEL3; + double deep_E3; + double deep_EE2; + double deep_FASX2; + double deep_FASX4; + double deep_FASX6; + double deep_OMEGAQ; + double deep_PE; + double deep_PINC; + double deep_PL; + double deep_SAVTSN; + double deep_SE2; + double deep_SE3; + double deep_SGH2; + double deep_SGH3; + double deep_SGH4; + double deep_SGHL; + double deep_SGHS; + double deep_SH2; + double deep_SH3; + double deep_SHS; + double deep_SHL; + double deep_SI2; + double deep_SI3; + double deep_SL2; + double deep_SL3; + double deep_SL4; + double deep_SSE; + double deep_SSG; + double deep_SSH; + double deep_SSI; + double deep_SSL; + double deep_STEP2; + double deep_STEPN; + double deep_STEPP; + double deep_THGR; + double deep_XFACT; + double deep_XGH2; + double deep_XGH3; + double deep_XGH4; + double deep_XH2; + double deep_XH3; + double deep_XI2; + double deep_XI3; + double deep_XL2; + double deep_XL3; + double deep_XL4; + double deep_XLAMO; + double deep_XLI; + double deep_XNI; + double deep_XNQ; + double deep_XQNCL; + double deep_ZMOL; + double deep_ZMOS; +}; + +struct sdp4_data { + double sdp4_AODP; /* dpa */ + double sdp4_AYCOF; + double sdp4_BETAO; /* dpa */ + double sdp4_BETAO2; /* dpa */ + double sdp4_C1; + double sdp4_C4; + double sdp4_COSG; /* dpa */ + double sdp4_COSIO; /* dpa */ + double sdp4_EOSQ; /* dpa */ + double sdp4_OMGDOT; /* dpa */ + double sdp4_SING; /* dpa */ + double sdp4_SINIO; /* dpa */ + double sdp4_T2COF; + double sdp4_THETA2; /* dpa */ + double sdp4_X1MTH2; + double sdp4_X3THM1; + double sdp4_X7THM1; + double sdp4_XLCOF; + double sdp4_XMDOT; /* dpa */ + double sdp4_XNODCF; + double sdp4_XNODOT; /* dpa */ + double sdp4_XNODP; /* dpa */ + + double sdp4_XMDF_seco; + double sdp4_OMGADF_seco; + double sdp4_XNODE_seco; + double sdp4_EM_seco; + double sdp4_XINC_seco; + double sdp4_XN_seco; + + double sdp4_E_pero; + double sdp4_XINC_pero; + double sdp4_OMGADF_pero; + double sdp4_XNODE_pero; + double sdp4_XMAM_pero; +}; + +typedef struct _SatData { + struct _SatElem *elem; + union { + struct sgp4_data *sgp4; + struct sdp4_data *sdp4; + } prop; + struct deep_data *deep; +} SatData; + +void sgp4(SatData *sat, Vec3 *pos, Vec3 *dpos, double t); + +void sdp4(SatData *sat, Vec3 *pos, Vec3 *dpos, double TSINCE); + +#endif /* __SATLIB_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: satlib.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/satmoon.c b/Common/Libraries/XEphemAstroLib/src/satmoon.c new file mode 100644 index 000000000..6e401c208 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/satmoon.c @@ -0,0 +1,510 @@ +/* saturn moon info */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "bdl.h" + +static int use_bdl (double JD, char *dir, MoonData md[S_NMOONS]); +static void bruton_saturn (Obj *sop, double JD, MoonData md[S_NMOONS]); +static void moonradec (double satsize, MoonData md[S_NMOONS]); +static void moonSVis (Obj *eop, Obj *sop, MoonData md[S_NMOONS]); +static void moonEVis (MoonData md[S_NMOONS]); +static void moonPShad (Obj *eop, Obj *sop, MoonData md[S_NMOONS]); +static void moonTrans (MoonData md[S_NMOONS]); + +/* moon table and a few other goodies and when it was last computed */ +static double mdmjd = -123456; +static MoonData smd[S_NMOONS] = { + {"Saturn", NULL}, + {"Mimas", "I"}, + {"Enceladus","II"}, + {"Tethys", "III"}, + {"Dione", "IV"}, + {"Rhea", "V"}, + {"Titan", "VI"}, + {"Hyperion","VII"}, + {"Iapetus", "VIII"}, +}; +static double sizemjd; +static double etiltmjd; +static double stiltmjd; + +/* These values are from the Explanatory Supplement. + * Precession degrades them gradually over time. + */ +#define POLE_RA degrad(40.58) /* RA of Saturn's north pole */ +#define POLE_DEC degrad(83.54) /* Dec of Saturn's north pole */ + + +/* get saturn info in md[0], moon info in md[1..S_NMOONS-1]. + * if !dir always use bruton model. + * if !sop caller just wants md[] for names + * N.B. we assume eop and sop are updated. + */ +void +saturn_data ( +double Mjd, /* mjd */ +char dir[], /* dir in which to look for helper files */ +Obj *eop, /* earth == Sun */ +Obj *sop, /* saturn */ +double *sizep, /* saturn's angular diam, rads */ +double *etiltp, double *stiltp, /* earth and sun tilts -- +S */ +double *polera, double *poledec,/* pole location */ +MoonData md[S_NMOONS]) /* return info */ +{ + double JD; + + /* always copy back at least for name */ + memcpy (md, smd, sizeof(smd)); + + /* pole */ + if (polera) *polera = POLE_RA; + if (poledec) *poledec = POLE_DEC; + + /* nothing else if repeat call or just want names */ + if (Mjd == mdmjd || !sop) { + if (sop) { + *sizep = sizemjd; + *etiltp = etiltmjd; + *stiltp = stiltmjd; + } + return; + } + JD = Mjd + MJD0; + + /* planet in [0] */ + md[0].ra = sop->s_ra; + md[0].dec = sop->s_dec; + md[0].mag = get_mag(sop); + md[0].x = 0; + md[0].y = 0; + md[0].z = 0; + md[0].evis = 1; + md[0].svis = 1; + + /* size is straight from sop */ + *sizep = degrad(sop->s_size/3600.0); + + /* Visual Magnitude of the Satellites */ + + md[1].mag = 13; md[2].mag = 11.8; md[3].mag = 10.3; md[4].mag = 10.2; + md[5].mag = 9.8; md[6].mag = 8.4; md[7].mag = 14.3; md[8].mag = 11.2; + + /* get tilts from sky and tel code */ + satrings (sop->s_hlat, sop->s_hlong, sop->s_sdist, eop->s_hlong, + eop->s_edist, JD, etiltp, stiltp); + + /* get moon x,y,z from BDL if possible, else Bruton's model */ + if (!dir || use_bdl (JD, dir, md) < 0) + bruton_saturn (sop, JD, md); + + /* set visibilities */ + moonSVis (eop, sop, md); + moonPShad (eop, sop, md); + moonEVis (md); + moonTrans (md); + + /* fill in moon ra and dec */ + moonradec (*sizep, md); + + /* save */ + mdmjd = Mjd; + etiltmjd = *etiltp; + stiltmjd = *stiltp; + sizemjd = *sizep; + memcpy (smd, md, sizeof(smd)); +} + +/* hunt for BDL file in dir[] and use if possible. + * return 0 if ok, else -1 + */ +static int +use_bdl ( +double JD, /* julian date */ +char dir[], /* directory */ +MoonData md[S_NMOONS]) /* fill md[1..NM-1].x/y/z for each moon */ +{ +#define SATRAU .0004014253 /* saturn radius, AU */ + double x[S_NMOONS], y[S_NMOONS], z[S_NMOONS]; + char buf[1024]; + FILE *fp; + char *fn; + int i; + + /* check ranges and appropriate data file */ + if (JD < 2451179.50000) /* Jan 1 1999 UTC */ + return (-1); + if (JD < 2455562.5) /* Jan 1 2011 UTC */ + fn = "saturne.9910"; + else if (JD < 2459215.5) /* Jan 1 2021 UTC */ + fn = "saturne.1020"; + else + return (-1); + + /* open */ + (void) sprintf (buf, "%s/%s", dir, fn); + fp = fopen (buf, "r"); + if (!fp) { + fprintf (stderr, "%s: %s\n", fn, strerror(errno)); + return (-1); + } + + /* use it */ + if ((i = read_bdl (fp, JD, x, y, z, buf)) < 0) { + fprintf (stderr, "%s: %s\n", fn, buf); + fclose (fp); + return (-1); + } + if (i != S_NMOONS-1) { + fprintf (stderr, "%s: BDL says %d moons, code expects %d", fn, + i, S_NMOONS-1); + fclose (fp); + return (-1); + } + + /* copy into md[1..NM-1] with our scale and sign conventions */ + for (i = 1; i < S_NMOONS; i++) { + md[i].x = x[i-1]/SATRAU; /* we want sat radii +E */ + md[i].y = -y[i-1]/SATRAU; /* we want sat radii +S */ + md[i].z = -z[i-1]/SATRAU; /* we want sat radii +front */ + } + + /* ok */ + fclose (fp); + return (0); +} + +/* */ +/* SS2TXT.BAS Dan Bruton, astro@tamu.edu */ +/* */ +/* This is a text version of SATSAT2.BAS. It is smaller, */ +/* making it easier to convert other languages (250 lines */ +/* compared to 850 lines). */ +/* */ +/* This BASIC program computes and displays the locations */ +/* of Saturn's Satellites for a given date and time. See */ +/* "Practical Astronomy with your Calculator" by Peter */ +/* Duffett-Smith and the Astronomical Almanac for explanations */ +/* of some of the calculations here. The code is included so */ +/* that users can make changes or convert to other languages. */ +/* This code was made using QBASIC (comes with DOS 5.0). */ +/* */ +/* ECD: merged with Sky and Tel, below, for better earth and sun ring tilt */ +/* */ + +/* ECD: BASICeze */ +#define FOR for +#define IF if +#define ELSE else +#define COS cos +#define SIN sin +#define TAN tan +#define ATN atan +#define ABS fabs +#define SQR sqrt + +/* find saturn moon data from Bruton's model */ +/* this originally computed +X:East +Y:North +Z:behind in [1..8] indeces. + * and +tilt:front south, rads + * then we adjust things in md[].x/y/z/mag to fit into our MoonData format. + */ +static void +bruton_saturn ( +Obj *sop, /* saturn */ +double JD, /* julian date */ +MoonData md[S_NMOONS]) /* fill md[1..NM-1].x/y/z for each moon */ +{ + /* ECD: code does not use [0]. + * ECD and why 11 here? seems like 9 would do + */ + double SMA[11], U[11], U0[11], PD[11]; + double X[S_NMOONS], Y[S_NMOONS], Z[S_NMOONS]; + + double P,TP,TE,EP,EE,RE0,RP0,RS; + double JDE,LPE,LPP,LEE,LEP; + double NN,ME,MP,VE,VP; + double LE,LP,RE,RP,DT,II,F,F1; + double RA,DECL; + double TVA,PVA,TVC,PVC,DOT1,INC,TVB,PVB,DOT2,INCI; + double TRIP,GAM,TEMPX,TEMPY,TEMPZ; + int I; + + /* saturn */ + RA = sop->s_ra; + DECL = sop->s_dec; + + /* ******************************************************************** */ + /* * * */ + /* * Constants * */ + /* * * */ + /* ******************************************************************** */ + P = PI / 180; + /* Orbital Rate of Saturn in Radians per Days */ + TP = 2 * PI / (29.45771 * 365.2422); + /* Orbital Rate of Earth in Radians per Day */ + TE = 2 * PI / (1.00004 * 365.2422); + /* Eccentricity of Saturn's Orbit */ + EP = .0556155; + /* Eccentricity of Earth's Orbit */ + EE = .016718; + /* Semimajor axis of Earth's and Saturn's orbit in Astronomical Units */ + RE0 = 1; RP0 = 9.554747; + /* Semimajor Axis of the Satellites' Orbit in Kilometers */ + SMA[1] = 185600; SMA[2] = 238100; SMA[3] = 294700; SMA[4] = 377500; + SMA[5] = 527200; SMA[6] = 1221600; SMA[7] = 1483000; SMA[8] = 3560100; + /* Eccentricity of Satellites' Orbit [Program uses 0] */ + /* Synodic Orbital Period of Moons in Days */ + PD[1] = .9425049; + PD[2] = 1.3703731; + PD[3] = 1.8880926; + PD[4] = 2.7375218; + PD[5] = 4.5191631; + PD[6] = 15.9669028; + PD[7] = 21.3174647; + PD[8] = 79.9190206; /* personal mail 1/14/95 */ + RS = 60330; /* Radius of planet in kilometers */ + + /* ******************************************************************** */ + /* * * */ + /* * Epoch Information * */ + /* * * */ + /* ******************************************************************** */ + JDE = 2444238.5; /* Epoch Jan 0.0 1980 = December 31,1979 0:0:0 UT */ + LPE = 165.322242 * P; /* Longitude of Saturn at Epoch */ + LPP = 92.6653974 * P; /* Longitude of Saturn`s Perihelion */ + LEE = 98.83354 * P; /* Longitude of Earth at Epoch */ + LEP = 102.596403 * P; /* Longitude of Earth's Perihelion */ + /* U0[I] = Angle from inferior geocentric conjuction */ + /* measured westward along the orbit at epoch */ + U0[1] = 18.2919 * P; + U0[2] = 174.2135 * P; + U0[3] = 172.8546 * P; + U0[4] = 76.8438 * P; + U0[5] = 37.2555 * P; + U0[6] = 57.7005 * P; + U0[7] = 266.6977 * P; + U0[8] = 195.3513 * P; /* from personal mail 1/14/1995 */ + + /* ******************************************************************** */ + /* * * */ + /* * Orbit Calculations * */ + /* * * */ + /* ******************************************************************** */ + /* ****************** FIND MOON ORBITAL ANGLES ************************ */ + NN = JD - JDE; /* NN = Number of days since epoch */ + ME = ((TE * NN) + LEE - LEP); /* Mean Anomoly of Earth */ + MP = ((TP * NN) + LPE - LPP); /* Mean Anomoly of Saturn */ + VE = ME; VP = MP; /* True Anomolies - Solve Kepler's Equation */ + FOR (I = 1; I <= 3; I++) { + VE = VE - (VE - (EE * SIN(VE)) - ME) / (1 - (EE * COS(VE))); + VP = VP - (VP - (EP * SIN(VP)) - MP) / (1 - (EP * COS(VP))); + } + VE = 2 * ATN(SQR((1 + EE) / (1 - EE)) * TAN(VE / 2)); + IF (VE < 0) VE = (2 * PI) + VE; + VP = 2 * ATN(SQR((1 + EP) / (1 - EP)) * TAN(VP / 2)); + IF (VP < 0) VP = (2 * PI) + VP; + /* Heliocentric Longitudes of Earth and Saturn */ + LE = VE + LEP; IF (LE > (2 * PI)) LE = LE - (2 * PI); + LP = VP + LPP; IF (LP > (2 * PI)) LP = LP - (2 * PI); + /* Distances of Earth and Saturn from the Sun in AU's */ + RE = RE0 * (1 - EE * EE) / (1 + EE * COS(VE)); + RP = RP0 * (1 - EP * EP) / (1 + EP * COS(VP)); + /* DT = Distance from Saturn to Earth in AU's - Law of Cosines */ + DT = SQR((RE * RE) + (RP * RP) - (2 * RE * RP * COS(LE - LP))); + /* II = Angle between Earth and Sun as seen from Saturn */ + II = RE * SIN(LE - LP) / DT; + II = ATN(II / SQR(1 - II * II)); /* ArcSIN and Law of Sines */ + /* F = NN - (Light Time to Earth in days) */ + F = NN - (DT / 173.83); + F1 = II + MP - VP; + /* U(I) = Angle from inferior geocentric conjuction measured westward */ + FOR (I = 1; I < S_NMOONS; I++) { + U[I] = U0[I] + (F * 2 * PI / PD[I]) + F1; + U[I] = ((U[I] / (2 * PI)) - (int)(U[I] / (2 * PI))) * 2 * PI; + + } + + /* **************** FIND INCLINATION OF RINGS ************************* */ + /* Use dot product of Earth-Saturn vector and Saturn's rotation axis */ + TVA = (90 - 83.51) * P; /* Theta coordinate of Saturn's axis */ + PVA = 40.27 * P; /* Phi coordinate of Saturn's axis */ + TVC = (PI / 2) - DECL; + PVC = RA; + DOT1 = SIN(TVA) * COS(PVA) * SIN(TVC) * COS(PVC); + DOT1 = DOT1 + SIN(TVA) * SIN(PVA) * SIN(TVC) * SIN(PVC); + DOT1 = DOT1 + COS(TVA) * COS(TVC); + INC = ATN(SQR(1 - DOT1 * DOT1) / DOT1); /* ArcCOS */ + IF (INC > 0) INC = (PI / 2) - INC; ELSE INC = -(PI / 2) - INC; + + /* ************* FIND INCLINATION OF IAPETUS' ORBIT ******************* */ + /* Use dot product of Earth-Saturn vector and Iapetus' orbit axis */ + /* Vector B */ + TVB = (90 - 75.6) * P; /* Theta coordinate of Iapetus' orbit axis (estimate) */ + PVB = 21.34 * 2 * PI / 24; /* Phi coordinate of Iapetus' orbit axis (estimate) */ + DOT2 = SIN(TVB) * COS(PVB) * SIN(TVC) * COS(PVC); + DOT2 = DOT2 + SIN(TVB) * SIN(PVB) * SIN(TVC) * SIN(PVC); + DOT2 = DOT2 + COS(TVB) * COS(TVC); + INCI = ATN(SQR(1 - DOT2 * DOT2) / DOT2); /* ArcCOS */ + IF (INCI > 0) INCI = (PI / 2) - INCI; ELSE INCI = -(PI / 2) - INCI; + + /* ************* FIND ROTATION ANGLE OF IAPETUS' ORBIT **************** */ + /* Use inclination of Iapetus' orbit with respect to ring plane */ + /* Triple Product */ + TRIP = SIN(TVC) * COS(PVC) * SIN(TVA) * SIN(PVA) * COS(TVB); + TRIP = TRIP - SIN(TVC) * COS(PVC) * SIN(TVB) * SIN(PVB) * COS(TVA); + TRIP = TRIP + SIN(TVC) * SIN(PVC) * SIN(TVB) * COS(PVB) * COS(TVA); + TRIP = TRIP - SIN(TVC) * SIN(PVC) * SIN(TVA) * COS(PVA) * COS(TVB); + TRIP = TRIP + COS(TVC) * SIN(TVA) * COS(PVA) * SIN(TVB) * SIN(PVB); + TRIP = TRIP - COS(TVC) * SIN(TVB) * COS(PVB) * SIN(TVA) * SIN(PVA); + GAM = -1 * ATN(TRIP / SQR(1 - TRIP * TRIP)); /* ArcSIN */ + + /* ******************************************************************** */ + /* * * */ + /* * Compute Moon Positions * */ + /* * * */ + /* ******************************************************************** */ + FOR (I = 1; I < S_NMOONS - 1; I++) { + X[I] = -1 * SMA[I] * SIN(U[I]) / RS; + Z[I] = -1 * SMA[I] * COS(U[I]) / RS; /* ECD */ + Y[I] = SMA[I] * COS(U[I]) * SIN(INC) / RS; + } + /* ************************* Iapetus' Orbit *************************** */ + TEMPX = -1 * SMA[8] * SIN(U[8]) / RS; + TEMPZ = -1 * SMA[8] * COS(U[8]) / RS; + TEMPY = SMA[8] * COS(U[8]) * SIN(INCI) / RS; + X[8] = TEMPX * COS(GAM) + TEMPY * SIN(GAM); /* Rotation */ + Z[8] = TEMPZ * COS(GAM) + TEMPY * SIN(GAM); + Y[8] = -1 * TEMPX * SIN(GAM) + TEMPY * COS(GAM); + +#ifdef SHOWALL + /* ******************************************************************** */ + /* * * */ + /* * Show Results * */ + /* * * */ + /* ******************************************************************** */ + printf (" Julian Date : %g\n", JD); + printf (" Right Ascension of Saturn : %g Hours\n", RA * 24 / (2 * PI)); + printf (" Declination of Saturn : %g\n", DECL / P); + printf (" Ring Inclination as seen from Earth : %g\n", -1 * INC / P); + printf (" Heliocentric Longitude of Saturn : %g\n", LP / P); + printf (" Heliocentric Longitude of Earth : %g\n", LE / P); + printf (" Sun-Saturn-Earth Angle : %g\n", II / P); + printf (" Distance between Saturn and Earth : %g AU = %g million miles\n", DT, (DT * 93)); + printf (" Light time from Saturn to Earth : %g minutes\n", DT * 8.28); + TEMP = 2 * ATN(TAN(165.6 * P / (2 * 3600)) / DT) * 3600 / P; + printf (" Angular Size of Saturn : %g arcsec\n", TEMP); + printf (" Major Angular Size of Saturn's Rings : %g arcsec\n", RS4 * TEMP / RS); + printf (" Minor Angular Size of Saturn's Rings : %g arcsec\n", ABS(RS4 * TEMP * SIN(INC) / RS)); +#endif + + /* copy into md[1..S_NMOONS-1] with our sign conventions */ + for (I = 1; I < S_NMOONS; I++) { + md[I].x = X[I]; /* we want +E */ + md[I].y = -Y[I]; /* we want +S */ + md[I].z = -Z[I]; /* we want +front */ + } +} + +/* given saturn loc in md[0].ra/dec and size, and location of each moon in + * md[1..NM-1].x/y in sat radii, find ra/dec of each moon in md[1..NM-1].ra/dec. + */ +static void +moonradec ( +double satsize, /* sat diameter, rads */ +MoonData md[S_NMOONS]) /* fill in RA and Dec */ +{ + double satrad = satsize/2; + double satra = md[0].ra; + double satdec = md[0].dec; + int i; + + for (i = 1; i < S_NMOONS; i++) { + double dra = satrad * md[i].x; + double ddec = satrad * md[i].y; + md[i].ra = satra + dra; + md[i].dec = satdec - ddec; + } +} + +/* set svis according to whether moon is in sun light */ +static void +moonSVis( +Obj *eop, /* earth == SUN */ +Obj *sop, /* saturn */ +MoonData md[S_NMOONS]) +{ + double esd = eop->s_edist; + double eod = sop->s_edist; + double sod = sop->s_sdist; + double soa = degrad(sop->s_elong); + double esa = asin(esd*sin(soa)/sod); + double h = sod*sop->s_hlat; + double nod = h*(1./eod - 1./sod); + double sca = cos(esa), ssa = sin(esa); + int i; + + for (i = 1; i < S_NMOONS; i++) { + MoonData *mdp = &md[i]; + double xp = sca*mdp->x + ssa*mdp->z; + double yp = mdp->y; + double zp = -ssa*mdp->x + sca*mdp->z; + double ca = cos(nod), sa = sin(nod); + double xpp = xp; + double ypp = ca*yp - sa*zp; + double zpp = sa*yp + ca*zp; + int outside = xpp*xpp + ypp*ypp > 1.0; + int infront = zpp > 0.0; + mdp->svis = outside || infront; + } +} + +/* set evis according to whether moon is geometrically visible from earth */ +static void +moonEVis (MoonData md[S_NMOONS]) +{ + int i; + + for (i = 1; i < S_NMOONS; i++) { + MoonData *mdp = &md[i]; + int outside = mdp->x*mdp->x + mdp->y*mdp->y > 1.0; + int infront = mdp->z > 0.0; + mdp->evis = outside || infront; + } +} + +/* set pshad and sx,sy shadow info */ +static void +moonPShad( +Obj *eop, /* earth == SUN */ +Obj *sop, /* saturn */ +MoonData md[S_NMOONS]) +{ + int i; + + for (i = 1; i < S_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->pshad = !plshadow (sop, eop, POLE_RA, POLE_DEC, mdp->x, + mdp->y, mdp->z, &mdp->sx, &mdp->sy); + } +} + + +/* set whether moons are transiting */ +static void +moonTrans (MoonData md[S_NMOONS]) +{ + int i; + + for (i = 1; i < S_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->trans = mdp->z > 0 && mdp->x*mdp->x + mdp->y*mdp->y < 1; + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: satmoon.c,v $ $Date: 2007/07/24 18:15:28 $ $Revision: 1.8 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/satspec.h b/Common/Libraries/XEphemAstroLib/src/satspec.h new file mode 100644 index 000000000..0986dd789 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/satspec.h @@ -0,0 +1,43 @@ +#ifndef __SATSPEC_H +#define __SATSPEC_H + +/* $Id: satspec.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +#include "sattypes.h" +#include "satlib.h" + +#define SGP4_SIMPLE 0x00000001 + +extern void init_deep(struct deep_data *deep); +void init_sdp4(struct sdp4_data *sdp); +char *tleerr(int); +int readtle(char *, char *, SatElem *); + +double current_jd(); + +double ut1_to_gha(double); + +void smallsleep(double t); + +double epoch_jd(double); + +double actan(double sinx, double cosx); + +double thetag(double EP, double *DS50); + +void dpinit(SatData *sat, double EQSQ, double SINIQ, double COSIQ, + double RTEQSQ, double AO, double COSQ2, double SINOMO, + double COSOMO, double BSQ, double XLLDOT, double OMGDT, + double XNODOT, double XNODP); + +void dpsec(SatData *sat, double *XLL, double *OMGASM, double *XNODES, + double *EM, double *XINC, double *XN, double T); + +void dpper(SatData *sat, double *EM, double *XINC, double *OMGASM, + double *XNODES, double *XLL, double T); + +#endif /* __SATSPEC_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: satspec.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/sattypes.h b/Common/Libraries/XEphemAstroLib/src/sattypes.h new file mode 100644 index 000000000..61891ff03 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/sattypes.h @@ -0,0 +1,28 @@ +#ifndef __SATTYPES_H +#define __SATTYPES_H + +/* $Id: sattypes.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +typedef struct _Vec3 { + double x, y, z; +} Vec3; + + +typedef struct _LookAngle { + double az; + double el; + double r; +} LookAngle; + + +typedef struct _Geoloc { + double lt; + double ln; + double h; +} GeoLoc; + +#endif /* __SATTYPES_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: sattypes.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/sdp4.c b/Common/Libraries/XEphemAstroLib/src/sdp4.c new file mode 100644 index 000000000..54e575ce3 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/sdp4.c @@ -0,0 +1,430 @@ +#include +#include +#undef SING + +#include "sattypes.h" +#include "vector.h" +#include "satspec.h" + +/* SDP4 3 NOV 80 */ +/* SUBROUTINE SDP4(IFLAG,TSINCE) + COMMON/E1/XMO,XNODEO,OMEGAO,EO,XINCL,XNO,XNDT2O, + 1 XNDD6O,BSTAR,X,Y,Z,XDOT,YDOT,ZDOT,EPOCH,DS50 + COMMON/C1/CK2,CK4,E6A,QOMS2T,S,TOTHRD, + 1 XJ3,XKE,XKMPER,XMNPDA,AE + DOUBLE PRECISION EPOCH, DS50 + */ + +#define XMO (sat->elem->se_XMO) +#define XNODEO (sat->elem->se_XNODEO) +#define OMEGAO (sat->elem->se_OMEGAO) +#define EO (sat->elem->se_EO) +#define XINCL (sat->elem->se_XINCL) +#define XNO (sat->elem->se_XNO) +#define XNDT20 (sat->elem->se_XNDT20) +#define XNDD60 (sat->elem->se_XNDD60) +#define BSTAR (sat->elem->se_BSTAR) +#define EPOCH (sat->elem->se_EPOCH) + +#define CK2 (5.413080e-04) +#define CK4 (6.209887e-07) +#define QOMS2T (1.880279e-09) +#define S (1.012229e+00) + +#define AE (1.0) +#define DE2RA (.174532925E-1) +#define E6A (1.E-6) +#define PI (3.14159265) +#define PIO2 (1.57079633) +#define QO (120.0) +#define SO (78.0) +#define TOTHRD (.66666667) +#define TWOPI (6.2831853) +#define X3PIO2 (4.71238898) +#define XJ2 (1.082616E-3) +#define XJ3 (-.253881E-5) +#define XJ4 (-1.65597E-6) +#define XKE (.743669161E-1) +#define XKMPER (6378.135) +#define XMNPDA (1440.) + +/* int IFLAG; */ + +#define X (pos->sl_X) +#define XDOT (pos->sl_XDOT) +#define Y (pos->sl_Y) +#define YDOT (pos->sl_YDOT) +#define Z (pos->sl_Z) +#define ZDOT (pos->sl_ZDOT) + +/* sat->prop.sdp4-> */ +#define AODP (sat->prop.sdp4->sdp4_AODP) +#define AYCOF (sat->prop.sdp4->sdp4_AYCOF) +#define BETAO (sat->prop.sdp4->sdp4_BETAO) +#define BETAO2 (sat->prop.sdp4->sdp4_BETAO2) +#define C1 (sat->prop.sdp4->sdp4_C1) +#define C4 (sat->prop.sdp4->sdp4_C4) +#define COSG (sat->prop.sdp4->sdp4_COSG) +#define COSIO (sat->prop.sdp4->sdp4_COSIO) +#define EOSQ (sat->prop.sdp4->sdp4_EOSQ) +#define OMGDOT (sat->prop.sdp4->sdp4_OMGDOT) +#define SING (sat->prop.sdp4->sdp4_SING) +#define SINIO (sat->prop.sdp4->sdp4_SINIO) +#define T2COF (sat->prop.sdp4->sdp4_T2COF) +#define THETA2 (sat->prop.sdp4->sdp4_THETA2) +#define X1MTH2 (sat->prop.sdp4->sdp4_X1MTH2) +#define X3THM1 (sat->prop.sdp4->sdp4_X3THM1) +#define X7THM1 (sat->prop.sdp4->sdp4_X7THM1) +#define XLCOF (sat->prop.sdp4->sdp4_XLCOF) +#define XMDOT (sat->prop.sdp4->sdp4_XMDOT) +#define XNODCF (sat->prop.sdp4->sdp4_XNODCF) +#define XNODOT (sat->prop.sdp4->sdp4_XNODOT) +#define XNODP (sat->prop.sdp4->sdp4_XNODP) + +#define XMDF_seco (sat->prop.sdp4->sdp4_XMDF_seco) +#define OMGADF_seco (sat->prop.sdp4->sdp4_OMGADF_seco) +#define XNODE_seco (sat->prop.sdp4->sdp4_XNODE_seco) +#define EM_seco (sat->prop.sdp4->sdp4_EM_seco) +#define XINC_seco (sat->prop.sdp4->sdp4_XINC_seco) +#define XN_seco (sat->prop.sdp4->sdp4_XN_seco) + +#define E_pero (sat->prop.sdp4->sdp4_E_pero) +#define XINC_pero (sat->prop.sdp4->sdp4_XINC_pero) +#define OMGADF_pero (sat->prop.sdp4->sdp4_OMGADF_pero) +#define XNODE_pero (sat->prop.sdp4->sdp4_XNODE_pero) +#define XMAM_pero (sat->prop.sdp4->sdp4_XMAM_pero) + +void +sdp4 (SatData *sat, Vec3 *pos, Vec3 *dpos, double TSINCE) +{ + int i; + + /* private temporary variables used only in init section */ + double A1,A3OVK2,AO,C2,COEF,COEF1,DEL1,DELO,EETA,ETA, + ETASQ,PERIGE,PINVSQ,PSISQ,QOMS24,S4,THETA4,TSI,X1M5TH,XHDOT1; + + /* private temporary variables */ + double A,AXN,AYN,AYNL,BETA,BETAL,CAPU,COS2U,COSEPW=0, + COSIK,COSNOK,COSU,COSUK,E,ECOSE,ELSQ,EM=0,EPW,ESINE,OMGADF,PL, + R,RDOT,RDOTK,RFDOT,RFDOTK,RK,SIN2U,SINEPW=0,SINIK,SINNOK, + SINU,SINUK,TEMP,TEMP1,TEMP2,TEMP3=0,TEMP4=0,TEMP5=0,TEMP6=0,TEMPA, + TEMPE,TEMPL,TSQ,U,UK,UX,UY,UZ,VX,VY,VZ,XINC=0,XINCK,XL,XLL,XLT, + XMAM,XMDF,XMX,XMY,XN,XNODDF,XNODE,XNODEK; + +#if 0 + A1=A3OVK2=AO=C2=COEF=COEF1=DEL1=DELO=EETA=ETA = signaling_nan(); + ETASQ=PERIGE=PINVSQ=PSISQ=QOMS24=S4=THETA4=TSI=X1M5TH=XHDOT1 = signaling_nan(); + + A=AXN=AYN=AYNL=BETA=BETAL=CAPU=COS2U=COSEPW = signaling_nan(); + COSIK=COSNOK=COSU=COSUK=E=ECOSE=ELSQ=EM=EPW=ESINE=OMGADF=PL = signaling_nan(); + R=RDOT=RDOTK=RFDOT=RFDOTK=RK=SIN2U=SINEPW=SINIK=SINNOK = signaling_nan(); + SINU=SINUK=TEMP=TEMP1=TEMP2=TEMP3=TEMP4=TEMP5=TEMP6=TEMPA = signaling_nan(); + TEMPE=TEMPL=TSQ=U=UK=UX=UY=UZ=VX=VY=VZ=XINC=XINCK=XL=XLL=XLT = signaling_nan(); + XMAM=XMDF=XMX=XMY=XN=XNODDF=XNODE=XNODEK = signaling_nan(); +#endif + + if(TSINCE != 0.0 && !sat->prop.sdp4) { + /* + * Yes, this is a recursive call. + */ + sdp4(sat, pos, dpos, 0.0); + } + +/* IF (IFLAG .EQ. 0) GO TO 100 */ +/* if(!IFLAG) */ + if(!sat->prop.sdp4) { + sat->prop.sdp4 = (struct sdp4_data *) malloc(sizeof(struct sdp4_data)); + +/* init_sdp4(sat->prop.sdp4); */ + +/* RECOVER ORIGINAL MEAN MOTION (XNODP) AND SEMIMAJOR AXIS (AODP) */ +/* FROM INPUT ELEMENTS */ + + A1=pow((XKE/XNO), TOTHRD); + COSIO=cos(XINCL); + THETA2=COSIO*COSIO; + X3THM1=3.0 * THETA2 - 1.0; + EOSQ = EO * EO; + BETAO2 = 1.0 - EOSQ; + BETAO = sqrt(BETAO2); + DEL1 = 1.5 * CK2 * X3THM1 / (A1 * A1 * BETAO * BETAO2); + AO = A1 * (1.0 - DEL1 * (0.5 * TOTHRD + + DEL1 * (1.0 + 134.0 / 81.0 * DEL1))); + DELO = 1.5 * CK2 * X3THM1 / (AO * AO * BETAO * BETAO2); + XNODP = XNO / (1.0 + DELO); + AODP = AO / (1.0 - DELO); + +/* INITIALIZATION */ + +/* FOR PERIGEE BELOW 156 KM, THE VALUES OF +* S AND QOMS2T ARE ALTERED */ + + S4 = S; + QOMS24 = QOMS2T; + PERIGE = (AODP * (1.0 - EO) - AE) * XKMPER; + +/* IF(PERIGE .GE. 156.) GO TO 10 */ + + if(PERIGE < 156.0) { + S4 = PERIGE - 78.0; + + if(PERIGE <= 98.0) { /* GO TO 9 */ + S4 = 20.0; + } + + QOMS24 = pow((120.0 - S4) * AE / XKMPER, 4.0); /* 9 */ + S4 = S4 / XKMPER + AE; + } + PINVSQ = 1.0 / (AODP * AODP * BETAO2 * BETAO2); /* 10 */ + SING = sin(OMEGAO); + COSG = cos(OMEGAO); + TSI = 1.0 / (AODP - S4); + ETA = AODP * EO * TSI; + ETASQ = ETA * ETA; + EETA = EO * ETA; + PSISQ = fabs(1.0 - ETASQ); + COEF = QOMS24 * pow(TSI, 4.0); + COEF1 = COEF / pow(PSISQ, 3.5); + C2 = COEF1 * XNODP * (AODP * (1.0 + 1.5 * ETASQ + + EETA * (4.0 + ETASQ)) + + .75 * CK2 * TSI / PSISQ * X3THM1 * + (8.0 + 3.0 * ETASQ * (8.0 + ETASQ))); + C1 = BSTAR * C2; + SINIO = sin(XINCL); + A3OVK2 = -XJ3 / CK2 * AE * AE * AE; /* A3OVK2=-XJ3/CK2*AE**3; */ + X1MTH2 = 1.0 - THETA2; + C4 = 2.0 * XNODP * COEF1 * AODP * BETAO2 * + (ETA * (2.0 + .5 * ETASQ) + EO * (.5 + 2.0 * ETASQ) - + 2.0 * CK2 * TSI / (AODP * PSISQ) * + (-3.0 * X3THM1 * (1.0 - 2.0 * EETA + ETASQ * + (1.5 - .5 * EETA)) + + .75 * X1MTH2 * (2.0 * ETASQ - EETA * + (1.0 + ETASQ)) * cos(2.0 * OMEGAO))); + THETA4 = THETA2 * THETA2; + TEMP1 = 3.0 * CK2 * PINVSQ * XNODP; + TEMP2 = TEMP1 * CK2 * PINVSQ; + TEMP3 = 1.25 * CK4 * PINVSQ * PINVSQ * XNODP; + XMDOT = XNODP + 0.5 * TEMP1 * BETAO * X3THM1 + .0625 * TEMP2 * BETAO * + (13.0 - 78.0 * THETA2 + 137.0 * THETA4); + X1M5TH=1.0 - 5.0 * THETA2; + OMGDOT = -.5 * TEMP1 * X1M5TH + .0625 * TEMP2 * + (7.0 - 114.0 * THETA2 + 395.0 * THETA4) + + TEMP3 * (3.0 - 36.0 * THETA2 + 49.0 * THETA4); + XHDOT1 = -TEMP1 * COSIO; + XNODOT = XHDOT1 + (.5 * TEMP2 * (4.0 - 19.0 * THETA2) + + 2.0 * TEMP3 * (3.0 - 7.0 * THETA2)) * COSIO; + XNODCF = 3.5 * BETAO2 * XHDOT1 * C1; + T2COF = 1.5 * C1; + XLCOF = .125 * A3OVK2 * SINIO * (3.0 + 5.0 * COSIO) / (1.0 + COSIO); + AYCOF = .25 * A3OVK2 * SINIO; + X7THM1 = 7.0 * THETA2 - 1.0; +/* 90 IFLAG=0 */ + +#ifdef SDP_DEEP_DEBUG + printf("calling dpinit\n"); + printf("%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n", + EOSQ,SINIO,COSIO,BETAO,AODP,THETA2, + SING,COSG,BETAO2,XMDOT,OMGDOT,XNODOT,XNODP); +#endif + dpinit(sat, EOSQ, SINIO, COSIO, BETAO, AODP, THETA2, + SING, COSG, BETAO2, XMDOT, OMGDOT, XNODOT, XNODP); + +/* CALL DPINIT(EOSQ,SINIO,COSIO,BETAO,AODP,THETA2, + 1 SING,COSG,BETAO2,XMDOT,OMGDOT,XNODOT,XNODP) */ + +/* UPDATE FOR SECULAR GRAVITY AND ATMOSPHERIC DRAG */ + } + + XMDF = XMO + XMDOT * TSINCE; /* 100 */ + OMGADF = OMEGAO + OMGDOT * TSINCE; + XNODDF = XNODEO + XNODOT * TSINCE; + TSQ = TSINCE * TSINCE; + XNODE = XNODDF + XNODCF * TSQ; + TEMPA = 1.0 - C1 * TSINCE; + TEMPE = BSTAR * C4 * TSINCE; + TEMPL = T2COF * TSQ; + XN = XNODP; + + if(TSINCE == 0.0) { + XMDF_seco = XMDF; + OMGADF_seco = OMGADF; + XNODE_seco = XNODE; + EM_seco = EM; + XINC_seco = XINC; + XN_seco = XN; + } + + dpsec(sat, &XMDF, &OMGADF, &XNODE, &EM, &XINC, &XN, TSINCE); + + if(TSINCE == 0.0) { + XMDF_seco = XMDF - XMDF_seco; + OMGADF_seco = OMGADF - OMGADF_seco; + XNODE_seco = XNODE - XNODE_seco; + EM_seco = EM - EM_seco; + XINC_seco = XINC - XINC_seco; + XN_seco = XN - XN_seco; + +#if 0 + printf("XMDF_seco = %e\n", XMDF_seco); + printf("OMGADF_seco = %e\n", OMGADF_seco); + printf("XNODE_seco = %e\n", XNODE_seco); + printf("EM_seco = %e\n", EM_seco); + printf("XINC_seco = %e\n", XINC_seco); + printf("XN_seco = %e\n", XN_seco); +#endif + } + + /* + XMDF -= XMDF_seco; + OMGADF -= OMGADF_seco; + XNODE -= XNODE_seco; + EM -= EM_seco; + XINC -= XINC_seco; + XN -= XN_seco; + */ + + A = pow(XKE/XN, TOTHRD) * TEMPA * TEMPA; + E = EM - TEMPE; +#ifdef SDP_DEEP_DEBUG + printf("*** E = %f\n", E); +#endif + XMAM = XMDF + XNODP * TEMPL; +/* CALL DPPER(E,XINC,OMGADF,XNODE,XMAM) */ + +#ifdef SDP_DEEP_DEBUG + printf("%12s %12s %12s %12s %12s\n", + "E", "XINC", "OMGADF", "XNODE", "XMAM"); + printf("%12f %12f %12f %12f %12f\n", + E, XINC, OMGADF, XNODE, XMAM); +#endif + + if(TSINCE == 0.0) { + E_pero = E; + XINC_pero = XINC; + OMGADF_pero = OMGADF; + XNODE_pero = XNODE; + XMAM_pero = XMAM; + } + + dpper(sat, &E, &XINC, &OMGADF, &XNODE, &XMAM, TSINCE); + + if(TSINCE == 0.0) { + E_pero = E - E_pero; + XINC_pero = XINC - XINC_pero; + OMGADF_pero = OMGADF - OMGADF_pero; + XNODE_pero = XNODE - XNODE_pero; + XMAM_pero = XMAM - XMAM_pero; + +#if 0 + printf("E_pero = %e\n", E_pero); + printf("XINC_pero = %e\n", XINC_pero); + printf("OMGADF_pero = %e\n", OMGADF_pero); + printf("XNODE_pero = %e\n", XNODE_pero); + printf("XMAM_pero = %e\n\n", XMAM_pero); +#endif + } + + /* + E -= E_pero; + XINC -= XINC_pero; + OMGADF -= OMGADF_pero; + XNODE -= XNODE_pero; + XMAM -= XMAM_pero; + */ + XL = XMAM + OMGADF + XNODE; + BETA = sqrt(1.0 - E * E); + XN = XKE / pow(A, 1.5); + +/* LONG PERIOD PERIODICS */ + + AXN = E * cos(OMGADF); + TEMP=1./(A*BETA*BETA); + XLL=TEMP*XLCOF*AXN; + AYNL=TEMP*AYCOF; + XLT=XL+XLL; + AYN=E*sin(OMGADF)+AYNL; + +/* SOLVE KEPLERS EQUATION */ + + CAPU=fmod(XLT-XNODE, TWOPI); + TEMP2=CAPU; +/* DO 130 I=1,10*/ + for(i = 1; i < 10; i++) { + SINEPW=sin(TEMP2); + COSEPW=cos(TEMP2); + TEMP3=AXN*SINEPW; + TEMP4=AYN*COSEPW; + TEMP5=AXN*COSEPW; + TEMP6=AYN*SINEPW; + EPW=(CAPU-TEMP4+TEMP3-TEMP2)/(1.-TEMP5-TEMP6)+TEMP2; +/* IF(ABS(EPW-TEMP2) .LE. E6A) GO TO 140 */ + if(fabs(EPW-TEMP2) <= E6A) + break; + TEMP2=EPW; /* 130 */ + } + +/* SHORT PERIOD PRELIMINARY QUANTITIES */ + + ECOSE=TEMP5+TEMP6; /* 140 */ + ESINE=TEMP3-TEMP4; + ELSQ=AXN*AXN+AYN*AYN; + TEMP=1.-ELSQ; + PL=A*TEMP; + R=A*(1.-ECOSE); + TEMP1=1./R; + RDOT=XKE*sqrt(A)*ESINE*TEMP1; + RFDOT=XKE*sqrt(PL)*TEMP1; + TEMP2=A*TEMP1; + BETAL=sqrt(TEMP); + TEMP3=1./(1.+BETAL); + COSU=TEMP2*(COSEPW-AXN+AYN*ESINE*TEMP3); + SINU=TEMP2*(SINEPW-AYN-AXN*ESINE*TEMP3); + U=actan(SINU,COSU); + SIN2U=2.*SINU*COSU; + COS2U=2.*COSU*COSU-1.0; + TEMP=1./PL; + TEMP1=CK2*TEMP; + TEMP2=TEMP1*TEMP; + +/* UPDATE FOR SHORT PERIODICS */ + + RK=R*(1.-1.5*TEMP2*BETAL*X3THM1)+.5*TEMP1*X1MTH2*COS2U; + UK=U - .25 * TEMP2 * X7THM1 * SIN2U; + XNODEK=XNODE+1.5*TEMP2*COSIO*SIN2U; + XINCK=XINC+1.5*TEMP2*COSIO*SINIO*COS2U; + RDOTK=RDOT-XN*TEMP1*X1MTH2*SIN2U; + RFDOTK=RFDOT+XN*TEMP1*(X1MTH2*COS2U+1.5*X3THM1); + +/* ORIENTATION VECTORS */ + SINUK=sin(UK); + COSUK=cos(UK); + SINIK=sin(XINCK); + COSIK=cos(XINCK); + SINNOK=sin(XNODEK); + COSNOK=cos(XNODEK); + XMX=-SINNOK*COSIK; + XMY=COSNOK*COSIK; + UX=XMX*SINUK+COSNOK*COSUK; + UY=XMY*SINUK+SINNOK*COSUK; + UZ=SINIK*SINUK; + VX=XMX*COSUK-COSNOK*SINUK; + VY=XMY*COSUK-SINNOK*SINUK; + VZ=SINIK*COSUK; +#if 0 + printf("UX = %f VX = %f RK = %f RDOTK = %f RFDOTK = %f\n", + UX, VX, RK, RDOTK, RFDOTK); +#endif +/* POSITION AND VELOCITY */ + + pos->x = RK*UX; + pos->y = RK*UY; + pos->z = RK*UZ; + dpos->x = RDOTK*UX+RFDOTK*VX; + dpos->y = RDOTK*UY+RFDOTK*VY; + dpos->z = RDOTK*UZ+RFDOTK*VZ; +/* RETURN + END */ +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: sdp4.c,v $ $Date: 2002/12/26 05:43:07 $ $Revision: 1.5 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/sgp4.c b/Common/Libraries/XEphemAstroLib/src/sgp4.c new file mode 100644 index 000000000..e1b191acf --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/sgp4.c @@ -0,0 +1,401 @@ +#include +#include + +#include "sattypes.h" +#include "vector.h" +#include "satspec.h" + +#define XMO (sat->elem->se_XMO) +#define XNODEO (sat->elem->se_XNODEO) +#define OMEGAO (sat->elem->se_OMEGAO) +#define EO (sat->elem->se_EO) +#define XINCL (sat->elem->se_XINCL) +#define XNO (sat->elem->se_XNO) +#define XNDT20 (sat->elem->se_XNDT20) +#define XNDD60 (sat->elem->se_XNDD60) +#define BSTAR (sat->elem->se_BSTAR) +#define EPOCH (sat->elem->se_EPOCH) + +#define X (pos->sl_X) +#define XDOT (pos->sl_XDOT) +#define Y (pos->sl_Y) +#define YDOT (pos->sl_YDOT) +#define Z (pos->sl_Z) +#define ZDOT (pos->sl_ZDOT) + +#define AODP (sat->prop.sgp4->sgp4_AODP) +#define AYCOF (sat->prop.sgp4->sgp4_AYCOF) +#define C1 (sat->prop.sgp4->sgp4_C1) +#define C4 (sat->prop.sgp4->sgp4_C4) +#define C5 (sat->prop.sgp4->sgp4_C5) +#define COSIO (sat->prop.sgp4->sgp4_COSIO) +#define D2 (sat->prop.sgp4->sgp4_D2) +#define D3 (sat->prop.sgp4->sgp4_D3) +#define D4 (sat->prop.sgp4->sgp4_D4) +#define DELMO (sat->prop.sgp4->sgp4_DELMO) +#define ETA (sat->prop.sgp4->sgp4_ETA) +#define OMGCOF (sat->prop.sgp4->sgp4_OMGCOF) +#define OMGDOT (sat->prop.sgp4->sgp4_OMGDOT) +#define SINIO (sat->prop.sgp4->sgp4_SINIO) +#define SINMO (sat->prop.sgp4->sgp4_SINMO) +#define T2COF (sat->prop.sgp4->sgp4_T2COF) +#define T3COF (sat->prop.sgp4->sgp4_T3COF) +#define T4COF (sat->prop.sgp4->sgp4_T4COF) +#define T5COF (sat->prop.sgp4->sgp4_T5COF) +#define X1MTH2 (sat->prop.sgp4->sgp4_X1MTH2) +#define X3THM1 (sat->prop.sgp4->sgp4_X3THM1) +#define X7THM1 (sat->prop.sgp4->sgp4_X7THM1) +#define XLCOF (sat->prop.sgp4->sgp4_XLCOF) +#define XMCOF (sat->prop.sgp4->sgp4_XMCOF) +#define XMDOT (sat->prop.sgp4->sgp4_XMDOT) +#define XNODCF (sat->prop.sgp4->sgp4_XNODCF) +#define XNODOT (sat->prop.sgp4->sgp4_XNODOT) +#define XNODP (sat->prop.sgp4->sgp4_XNODP) + +#define CK2 (5.413080e-04) +#define CK4 (6.209887e-07) +#define QOMS2T (1.880279e-09) +#define S (1.012229e+00) + +#define AE (1.0) +#define DE2RA (.174532925E-1) +#define E6A (1.E-12) +#define PI (3.14159265) +#define PIO2 (1.57079633) +#define QO (120.0) +#define SO (78.0) +#define TOTHRD (.66666667) +#define TWOPI (6.2831853) +#define X3PIO2 (4.71238898) +#define XJ2 (1.082616E-3) +#define XJ3 (-.253881E-5) +#define XJ4 (-1.65597E-6) +#define XKE (.743669161E-1) +#define XKMPER (6378.135) +#define XMNPDA (1440.0) + +/* compute position and velocity vectors for the satellite defined in sat->elem + * at its epoch + TSINCE. + */ +void +sgp4(SatData *sat, Vec3 *pos, Vec3 *dpos, double TSINCE) +{ + int i; + + double A1, A3OVK2, AO, BETAO, BETAO2, C1SQ, C2, C3, COEF, COEF1, + DEL1, DELO, EETA, EOSQ, ETASQ, PERIGE, PINVSQ, PSISQ, QOMS24, + S4, TEMP, TEMP1, TEMP2, TEMP3=0, THETA2, THETA4, TSI, X1M5TH, + XHDOT1; + + double A, AXN, AYN, AYNL, BETA, BETAL, CAPU, COS2U, COSEPW=0, COSIK, + COSNOK, COSU, COSUK, DELM, DELOMG, E, ECOSE, ELSQ, EPW, ESINE, + OMEGA, OMGADF, PL, R, RDOT, RDOTK, RFDOT, RFDOTK, RK, SIN2U, + SINEPW=0, SINIK, SINNOK, SINU, SINUK, TCUBE, TEMP4=0, TEMP5=0, TEMP6=0, + TEMPA, TEMPE, TEMPL, TFOUR, TSQ, U, UK, UX, UY, UZ, VX, VY, VZ, + XINCK, XL, XLL, XLT, XMDF, XMP, XMX, XMY, XN, XNODDF, XNODE, + XNODEK; + +#if 0 + A1 = A3OVK2 = AO = BETAO = BETAO2 = C1SQ = C2 = C3 = COEF = COEF1 = + DEL1 = DELO = EETA = EOSQ = ETASQ = PERIGE = PINVSQ = PSISQ = QOMS24 = + S4 = TEMP = TEMP1 = TEMP2 = TEMP3 = THETA2 = THETA4 = TSI = X1M5TH = + XHDOT1 = signaling_nan(); + + A = AXN = AYN = AYNL = BETA = BETAL = CAPU = COS2U = COSEPW = COSIK = + COSNOK = COSU = COSUK = DELM = DELOMG = E = ECOSE = ELSQ = EPW = + ESINE = OMEGA = OMGADF = PL = R = RDOT = RDOTK = RFDOT = RFDOTK = + RK = SIN2U = SINEPW = SINIK = SINNOK = SINU = SINUK = TCUBE = TEMP4 = + TEMP5 = TEMP6 = TEMPA = TEMPE = TEMPL = TFOUR = TSQ = U = UK = UX = + UY = UZ = VX = VY = VZ = XINCK = XL = XLL = XLT = XMDF = XMP = XMX = + XMY = XN = XNODDF = XNODE = XNODEK = signaling_nan(); +#endif + + if(!sat->prop.sgp4) { + sat->prop.sgp4 = (struct sgp4_data *) malloc(sizeof(struct sgp4_data)); + + /* + * RECOVER ORIGINAL MEAN MOTION (XNODP) AND SEMIMAJOR AXIS (AODP) + * FROM INPUT ELEMENTS + */ + + A1 = pow((XKE/XNO), TOTHRD); + COSIO = cos(XINCL); + THETA2 = COSIO * COSIO; + X3THM1 = 3.0 * THETA2 - 1.0; + EOSQ = EO * EO; + BETAO2 = 1.0 - EOSQ; + BETAO = sqrt(BETAO2); + DEL1 = 1.5 * CK2 * X3THM1 / (A1 * A1 * BETAO * BETAO2); + AO = A1 * (1.0 - DEL1 * (.5 * TOTHRD + + DEL1 * (1.0 + 134.0 /81.0 * DEL1))); + DELO = 1.5 * CK2 * X3THM1 / (AO * AO * BETAO * BETAO2); + XNODP = XNO / (1.0 + DELO); + AODP=AO / (1.0 - DELO); + + /* + * INITIALIZATION + * + * FOR PERIGEE LESS THAN 220 KILOMETERS, THE ISIMP FLAG IS SET AND + * THE EQUATIONS ARE TRUNCATED TO LINEAR VARIATION IN SQRT A AND + * QUADRATIC VARIATION IN MEAN ANOMALY. ALSO, THE C3 TERM, THE + * DELTA OMEGA TERM, AND THE DELTA M TERM ARE DROPPED. + */ + + sat->prop.sgp4->sgp4_flags = 0; + + /* IF((AODP*(1.-EO)/AE) .LT. (220./XKMPER+AE)) ISIMP=1 */ + + if((AODP * (1.0 - EO) / AE) < (220.0 / XKMPER + AE)) + sat->prop.sgp4->sgp4_flags |= SGP4_SIMPLE; + + /* + * FOR PERIGEE BELOW 156 KM, THE VALUES OF + * S AND QOMS2T ARE ALTERED + */ + + S4 = S; + QOMS24 = QOMS2T; + PERIGE = (AODP * (1.0 - EO) - AE) * XKMPER; + + if(PERIGE < 156.0) { + S4 = PERIGE - 78.0; + + if(PERIGE <= 98.0) + S4 = 20.0; + + QOMS24 = pow(((120.0 - S4) * AE / XKMPER), 4.0); + S4 = S4 / XKMPER + AE; + } + + PINVSQ=1.0 / (AODP * AODP * BETAO2 * BETAO2); + TSI = 1.0 / (AODP - S4); + ETA = AODP * EO * TSI; + ETASQ = ETA * ETA; + EETA = EO * ETA; + + PSISQ = fabs(1.0 - ETASQ); + + COEF = QOMS24 * pow(TSI, 4.0); + COEF1 = COEF / pow(PSISQ, 3.5); + + C2 = COEF1 * XNODP * (AODP * (1.0 + 1.5 * ETASQ + + EETA * (4.0 + ETASQ)) + .75 * + CK2 * TSI / + PSISQ * X3THM1 * (8.0 + + 3.0 * ETASQ * (8.0 + ETASQ))); + + + C1 = BSTAR * C2; + + SINIO = sin(XINCL); + + A3OVK2 = -XJ3 / CK2 * pow(AE, 3.0); + + C3 = COEF * TSI * A3OVK2 * XNODP * AE * SINIO / EO; + + X1MTH2 = 1.0 - THETA2; + C4 = 2.0 * XNODP * COEF1 * AODP * BETAO2 * + (ETA * (2.0 + .5 * ETASQ) + + EO * (.5 + 2.0 * ETASQ) - + 2.0 * CK2 * TSI / (AODP * PSISQ) * + (-3.0 * X3THM1 * (1.0 - 2.0 * EETA + ETASQ * (1.5 - .5 * EETA)) + + .75 * X1MTH2 * (2.0 * ETASQ - EETA * (1.0 + ETASQ)) * + cos(2.0 * OMEGAO))); + + C5 = 2.0 * COEF1 * AODP * BETAO2 * (1.0 + + 2.75 * (ETASQ + EETA) + + EETA * ETASQ); + THETA4 = THETA2 * THETA2; + TEMP1 = 3.0 * CK2 * PINVSQ * XNODP; + TEMP2 = TEMP1 * CK2 * PINVSQ; + TEMP3 = 1.25 * CK4 * PINVSQ * PINVSQ * XNODP; + + XMDOT = XNODP + + .5 * TEMP1 * BETAO * X3THM1 + + .0625 * TEMP2 * BETAO * (13.0 - 78.0 * THETA2 + 137.0 * THETA4); + + X1M5TH = 1.0 - 5.0 * THETA2; + + OMGDOT = -.5 * TEMP1 * X1M5TH + + .0625 * TEMP2 * (7.0 - 114.0 * THETA2 + 395.0 * THETA4) + + TEMP3 * (3.0 - 36.0 * THETA2 + 49.0 * THETA4); + + XHDOT1 = -TEMP1 * COSIO; + + XNODOT = XHDOT1 + (.5 * TEMP2 * (4.0 - 19.0 * THETA2) + + 2.0 * TEMP3 * (3.0 - 7.0 * THETA2)) * COSIO; + + OMGCOF = BSTAR * C3 * cos(OMEGAO); + + XMCOF = -TOTHRD * COEF * BSTAR * AE / EETA; + XNODCF = 3.5 * BETAO2 * XHDOT1 * C1; + T2COF = 1.5 * C1; + XLCOF = .125 * A3OVK2 * SINIO * (3.0 + 5.0 *COSIO) / (1.0 + COSIO); + + AYCOF = .25 * A3OVK2 * SINIO; + DELMO = pow(1.0 + ETA * cos(XMO), 3.0); + SINMO = sin(XMO); + + X7THM1 = 7.0 * THETA2 - 1.0; + +/* IF(ISIMP .EQ. 1) GO TO 90 */ + if(!(sat->prop.sgp4->sgp4_flags & SGP4_SIMPLE)) { + C1SQ = C1 * C1; + D2 = 4.0 * AODP * TSI * C1SQ; + TEMP = D2 * TSI * C1 / 3.0; + D3 = (17.0 * AODP + S4) * TEMP; + D4 = .5 * TEMP * AODP * TSI * (221.0 * AODP + 31.0 * S4) * C1; + T3COF = D2 + 2.0 * C1SQ; + T4COF = .25 * (3.0 * D3 + C1 * (12.0 * D2 + 10.0 * C1SQ)); + T5COF = .2 * (3.0 * D4 + + 12.0 * C1 * D3 + + 6.0 * D2 * D2 + + 15.0 * C1SQ * (2.0 * D2 + C1SQ)); + } + } + + /* + * UPDATE FOR SECULAR GRAVITY AND ATMOSPHERIC DRAG + */ + + XMDF = XMO + XMDOT * TSINCE; + OMGADF = OMEGAO + OMGDOT * TSINCE; + XNODDF = XNODEO + XNODOT * TSINCE; + OMEGA = OMGADF; + XMP = XMDF; + TSQ = TSINCE * TSINCE; + XNODE = XNODDF + XNODCF * TSQ; + TEMPA = 1.0 - C1 * TSINCE; + TEMPE = BSTAR * C4 * TSINCE; + TEMPL = T2COF * TSQ; + if(!(sat->prop.sgp4->sgp4_flags & SGP4_SIMPLE)) { + DELOMG = OMGCOF * TSINCE; + DELM = XMCOF * (pow(1.0 + ETA * cos(XMDF), 3) - DELMO); + TEMP = DELOMG + DELM; + XMP = XMDF + TEMP; + OMEGA = OMGADF - TEMP; + TCUBE = TSQ * TSINCE; + TFOUR = TSINCE * TCUBE; + TEMPA = TEMPA - D2 * TSQ - D3 * TCUBE - D4 * TFOUR; + TEMPE = TEMPE + BSTAR * C5 * (sin(XMP) - SINMO); + TEMPL = TEMPL + T3COF * TCUBE + TFOUR * (T4COF + TSINCE * T5COF); + } + + A = AODP * TEMPA * TEMPA; + E = EO - TEMPE; + XL = XMP + OMEGA + XNODE + XNODP * TEMPL; + BETA = sqrt(1.0 - E * E); + XN = XKE / pow(A, 1.5); + + /* + * LONG PERIOD PERIODICS + */ + + AXN = E * cos(OMEGA); + TEMP = 1.0 / (A * BETA * BETA); + XLL = TEMP * XLCOF * AXN; + AYNL = TEMP * AYCOF; + XLT = XL + XLL; + AYN = E * sin(OMEGA) + AYNL; + + /* + * SOLVE KEPLERS EQUATION + */ + + CAPU = fmod(XLT - XNODE, TWOPI); + TEMP2 = CAPU; + + for(i = 0; i < 10; i++) { + SINEPW = sin(TEMP2); + COSEPW = cos(TEMP2); + TEMP3 = AXN * SINEPW; + TEMP4 = AYN * COSEPW; + TEMP5 = AXN * COSEPW; + TEMP6 = AYN * SINEPW; + EPW = (CAPU - TEMP4 + TEMP3 - TEMP2) / (1.0 - TEMP5 - TEMP6) + TEMP2; + + if(fabs(EPW - TEMP2) <= E6A) + break; + + TEMP2 = EPW; + } + + /* + * SHORT PERIOD PRELIMINARY QUANTITIES + */ + + ECOSE = TEMP5 + TEMP6; + ESINE = TEMP3 - TEMP4; + ELSQ = AXN * AXN + AYN * AYN; + TEMP = 1.0 - ELSQ; + PL = A * TEMP; + R = A * (1.0 - ECOSE); + + TEMP1 = 1.0 / R; + RDOT = XKE * sqrt(A) * ESINE * TEMP1; + RFDOT = XKE * sqrt(PL) * TEMP1; + TEMP2 = A * TEMP1; + BETAL = sqrt(TEMP); + TEMP3 = 1.0 / (1.0 + BETAL); + + COSU = TEMP2 * (COSEPW - AXN + AYN * ESINE * TEMP3); + SINU = TEMP2 * (SINEPW - AYN - AXN * ESINE * TEMP3); + + U = actan(SINU, COSU); + + SIN2U = 2.0 * SINU * COSU; + COS2U = 2.0 * COSU * COSU - 1.0; + + TEMP = 1.0 / PL; + TEMP1 = CK2 * TEMP; + TEMP2 = TEMP1 * TEMP; + + /* + * UPDATE FOR SHORT PERIODICS + */ + + RK = R * (1.0 - 1.5 * TEMP2 * BETAL * X3THM1) + + .5 * TEMP1 * X1MTH2 * COS2U; + + UK = U - .25 * TEMP2 * X7THM1 * SIN2U; + + XNODEK = XNODE + 1.5 * TEMP2 * COSIO * SIN2U; + XINCK = XINCL + 1.5 * TEMP2 * COSIO * SINIO * COS2U; + RDOTK = RDOT - XN * TEMP1 * X1MTH2 * SIN2U; + RFDOTK = RFDOT + XN * TEMP1 * (X1MTH2 * COS2U + 1.5 * X3THM1); + + /* + * ORIENTATION VECTORS + */ + + SINUK = sin(UK); + COSUK = cos(UK); + SINIK = sin(XINCK); + COSIK = cos(XINCK); + SINNOK = sin(XNODEK); + COSNOK = cos(XNODEK); + + XMX = -SINNOK * COSIK; + XMY = COSNOK * COSIK; + UX = XMX * SINUK + COSNOK * COSUK; + UY = XMY * SINUK + SINNOK * COSUK; + UZ = SINIK * SINUK; + VX = XMX * COSUK - COSNOK * SINUK; + VY = XMY * COSUK - SINNOK * SINUK; + VZ = SINIK * COSUK; + + /* + * POSITION AND VELOCITY + */ + + pos->x = RK * UX; + pos->y = RK * UY; + pos->z = RK * UZ; + + dpos->x = RDOTK * UX + RFDOTK * VX; + dpos->y = RDOTK * UY + RFDOTK * VY; + dpos->z = RDOTK * UZ + RFDOTK * VZ; +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: sgp4.c,v $ $Date: 2012/10/01 00:05:23 $ $Revision: 1.5 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/sphcart.c b/Common/Libraries/XEphemAstroLib/src/sphcart.c new file mode 100644 index 000000000..9d216a8af --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/sphcart.c @@ -0,0 +1,43 @@ +#include +#include + +#include "astro.h" + +/* transformation from spherical to cartesian coordinates */ +void +sphcart ( +double l, double b, double r, /* source: spherical coordinates */ +double *x, double *y, double *z) /* result: rectangular coordinates */ +{ + double rcb = r * cos(b); + + *x = rcb * cos(l); + *y = rcb * sin(l); + *z = r * sin(b); +} + +/* transformation from cartesian to spherical coordinates */ +void +cartsph ( +double x, double y, double z, /* source: rectangular coordinates */ +double *l, double *b, double *r) /* result: spherical coordinates */ +{ + double rho = x*x + y*y; + + if (rho > 0) { /* standard case: off axis */ + *l = atan2(y, x); + range (l, 2*PI); + *b = atan2(z, sqrt(rho)); + *r = sqrt(rho + z*z); + } else { /* degenerate case; avoid math error */ + *l = 0.0; + if (z == 0.0) + *b = 0.0; + else + *b = (z > 0.0) ? PI/2. : -PI/2.; + *r = fabs(z); + } +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: sphcart.c,v $ $Date: 2006/08/28 00:20:27 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/sun.c b/Common/Libraries/XEphemAstroLib/src/sun.c new file mode 100644 index 000000000..6d92d5ec5 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/sun.c @@ -0,0 +1,44 @@ +#include +#include + +#include "astro.h" +#include "vsop87.h" + +/* given the modified JD, mj, return the true geocentric ecliptic longitude + * of the sun for the mean equinox of the date, *lsn, in radians, the + * sun-earth distance, *rsn, in AU, and the latitude *bsn, in radians + * (since this is always <= 1.2 arcseconds, in can be neglected by + * calling with bsn = NULL). + * + * if the APPARENT ecliptic longitude is required, correct the longitude for + * nutation to the true equinox of date and for aberration (light travel time, + * approximately -9.27e7/186000/(3600*24*365)*2*pi = -9.93e-5 radians). + */ +void +sunpos (double mj, double *lsn, double *rsn, double *bsn) +{ + static double last_mj = -3691, last_lsn, last_rsn, last_bsn; + double ret[6]; + + if (mj == last_mj) { + *lsn = last_lsn; + *rsn = last_rsn; + if (bsn) *bsn = last_bsn; + return; + } + + vsop87(mj, SUN, 0.0, ret); /* full precision earth pos */ + + *lsn = ret[0] - PI; /* revert to sun pos */ + range (lsn, 2*PI); /* normalise */ + + last_lsn = *lsn; /* memorise */ + last_rsn = *rsn = ret[2]; + last_bsn = -ret[1]; + last_mj = mj; + + if (bsn) *bsn = last_bsn; /* assign only if non-NULL pointer */ +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: sun.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/thetag.c b/Common/Libraries/XEphemAstroLib/src/thetag.c new file mode 100644 index 000000000..36a96a7ee --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/thetag.c @@ -0,0 +1,90 @@ +#include + +#include "deepconst.h" + +/* @(#) $Id: thetag.c,v 1.3 2000/10/07 05:12:17 ecdowney Exp $ */ + + +/* + * FUNCTION THETAG(EP) + * COMMON /E1/XMO,XNODEO,OMEGAO,EO,XINCL,XNO,XNDT2O,XNDD6O,BSTAR, + * 1 X,Y,Z,XDOT,YDOT,ZDOT,EPOCH,DS50 + * DOUBLE PRECISION EPOCH,D,THETA,TWOPI,YR,TEMP,EP,DS50 + * TWOPI=6.28318530717959D0 + * YR=(EP+2.D-7)*1.D-3 + * JY=YR + * YR=JY + * D=EP-YR*1.D3 + * IF(JY.LT.10) JY=JY+80 + * N=(JY-69)/4 + * IF(JY.LT.70) N=(JY-72)/4 + * DS50=7305.D0 + 365.D0*(JY-70) +N + D + * THETA=1.72944494D0 + 6.3003880987D0*DS50 + * TEMP=THETA/TWOPI + * I=TEMP + * TEMP=I + * THETAG=THETA-TEMP*TWOPI + * IF(THETAG.LT.0.D0) THETAG=THETAG+TWOPI + * RETURN + * END + */ + +/* FUNCTION THETAG(EP) */ +double +thetag(double EP, double *DS50) +{ + int JY, N, I; + double YR, D, THETA, TEMP, THETAG; + + YR = (EP + 2.0E-7) * 1.0E-3; + + JY = (int) YR; + + YR = JY; + + D = EP - YR * 1.0E3; + + if(JY < 10) + JY += 80; + + N = (JY - 69) / 4; + + if(JY < 70) + N = (JY - 72) / 4; + +/* printf("N = %d\n", N); */ + + *DS50 = 7305.0 + 365.0 * (JY-70) + N + D; + +/* printf("DS50 = %f\n", *DS50); */ + + THETA = 1.72944494 + 6.3003880987 * *DS50; + +/* printf("THETA = %f\n", THETA); */ + + TEMP = THETA / TWOPI; + + I = (int)TEMP; + TEMP = I; + + THETAG = THETA - TEMP * TWOPI; + + if(THETAG < 0.0) + THETAG += TWOPI; + + return THETAG; +} + +#if 0 +void main(int argc, char **argv) { + double ds50, gwa; + + if(argc >= 2) { + gwa = thetag(atof(argv[1]), &ds50); + printf("%f, %f\n", gwa, ds50); + } +} +#endif + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: thetag.c,v $ $Date: 2000/10/07 05:12:17 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/twobody.c b/Common/Libraries/XEphemAstroLib/src/twobody.c new file mode 100644 index 000000000..086bc577a --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/twobody.c @@ -0,0 +1,243 @@ +/* + * + * TWOBODY.C + * + * Computation of planetary position, two-body computation + * + * Paul Schlyter, 1987-06-15 + * + * Decreased EPSILON from 2E-4 to 3E-8, 1988-12-05 + * + * 1990-01-01: Bug fix in almost parabolic orbits: now the routine + * doesn't bomb there (an if block was too large) + * + * 2000-12-06: Donated to Elwood Downey if he wants to use it in XEphem + */ + + +#include +#include +#include + + +/* Constants used when solving Kepler's equation */ +#undef EPSILON +#define EPSILON 3E-8 +#undef INFINITY +#define INFINITY 1E+10 + +/* Math constants */ +#undef PI +#define PI 3.14159265358979323846 +#define RADEG ( 180.0 / PI ) +#define DEGRAD ( PI / 180.0 ) + +/* Trig functions in degrees */ +#define sind(x) sin(x*DEGRAD) +#define cosd(x) cos(x*DEGRAD) +#define atand(x) (RADEG*atan(x)) +#define atan2d(y,x) (RADEG*atan2(y,x)) + +/* Gauss' grav.-konstant */ +#define K 1.720209895E-2 +#define KD ( K * 180.0 / PI ) +#define K2 ( K / 2.0 ) + + + + +static double cubroot( double x ) +/* Cubic root */ +{ + double a,b; + + if ( x == 0.0 ) + return 0.0; + else + { + a = fabs(x); + b = exp( log(a) / 3.0 ); + return x > 0.0 ? b : -b; + } +} /* cubroot */ + + +static double rev180( double ang ) +/* Normalize angle to between +180 and -180 degrees */ +{ + return ang - 360.0 * floor(ang*(1.0/360.0) + 0.5); +} /* rev180 */ + + + +static double kepler( double m, double ex ) +/* + * Solves Kepler's equation + * m = mean anomaly + * ex = eccentricity + * kepler = eccentric anomaly + */ +{ + double m1, sinm, cosm, exd, exan, dexan, lim1, adko, adk, denom; + int converged; + + m1 = rev180(m); + sinm = sind(m1); + cosm = cosd(m1); + /* 1st approximation: */ + exan = atan2d(sinm,cosm-ex); + if ( ex > 0.008 ) + { /* Iteration formula: */ + exd = ex * RADEG; + lim1 = 1E-3 / ex; + adko = INFINITY; + denom = 1.0 - ex * cosd(exan); + do + { + dexan = (m1 + exd * sind(exan) - exan) / denom; + exan = exan + dexan; + adk = fabs(dexan); + converged = adk < EPSILON || adk >= adko ; + adko = adk; + if ( !converged && adk > lim1 ) + denom = 1.0 - ex * cosd(exan); + } while ( !converged ); + } + return exan; +} /* kepler */ + + +static void vr( double *v, double *r, double m, double e, double a ) +/* + * Elliptic orbits only: + * computes: v = true anomaly (degrees) + * r = radius vector (a.u.) + * from: m = mean anomaly (degrees) + * e = eccentricity + * a = semimajor axis (a.u.) + */ +{ + double ean, x, y; + + ean = kepler(m,e); + x = a*(cosd(ean)-e); + y = a*sqrt(1.-e*e)*sind(ean); + *r = sqrt(x*x+y*y); + *v = atan2d(y,x); +} /* vr */ + + +/* return 0 if ok, else -1 */ +int vrc( double *v, double *r, double tp, double e, double q ) +/* + * Elliptic, hyperbolic and near-parabolic orbits: + * computes: v = true anomaly (degrees) + * r = radius vector (a.u.) + * from: tp = time from perihelion (days) + * e = eccentricity + * q = perihelion distance (a.u.) + */ +{ + + double lambda; + + double a, b, w, w2, w4, c, c1, c2, c3, c5, a0, a1, a2, + a3, m, n, g, adgg, adgg2, gs, dg; + + if ( tp == 0.0 ) /* In perihelion */ + { + *v = 0.0; + *r = q; + return 0; + } + + + lambda = (1.0-e) / (1.0+e); + + if ( fabs(lambda) < 0.01 ) + { /* Near-parabolic orbits */ + a = K2 * sqrt((1.0+e)/(q*q*q)) * tp; + b = sqrt( 1.0 + 2.25*a*a ); + w = cubroot( b + 1.5*a ) - cubroot( b - 1.5*a ); + + /* Test if it's accuate enough to compute this as a near-parabolic orbit */ + if ( fabs(w*w*lambda) > 0.2 ) + { + if ( fabs(lambda) < 0.0002 ) + { + /* Sorry, but we cannot compute this at all -- we must give up! + * + * This happens very rarely, in orbits having an eccentricity + * some 2% away from 1.0 AND if the body is very very far from + * perihelion. E.g. a Kreutz sun-grazing comet having + * eccentricity near 0.98 or 1.02, and being outside + * the orbit of Pluto. For any reasonable orbit this will + * never happen in practice. + * + * You might want to code a more graceful error exit here though. + * + */ + printf( "\nNear-parabolic orbit: inaccurate result." + "\n e = %f, lambda = %f, w = %f", e, lambda, w ); + return -1; + } + else + { + /* We cannot compute this as a near-parabolic orbit, so let's + compute it as an elliptic or hyperbolic orbit instead. */ + goto ellipse_hyperbola; + } + } + + /* Go ahead computing the near-parabolic case */ + c = 1.0 + 1.0 / (w*w); + c1 = 1.0 / c; + c2 = c1*c1; + c3 = c1*c2; + c5 = c3*c2; + w2 = w*w; + w4 = w2*w2; + a0 = w; + a1 = 2.0 * w * (0.33333333 + 0.2*w2) * c1; + a2 = 0.2 * w * (7.0 + 0.14285714 * (33.0*w2+7.4*w4)) * c3; + a3 = 0.022857143 * (108.0 + 37.177777*w2 + 5.1111111*w4) * c5; + w = (( lambda * a3 + a2 ) * lambda + a1 ) * lambda + a0; + w2 = w*w; + *v = 2.0 * atand(w); + *r = q * (1+w2) / ( 1.0 + w2*lambda ); + return 0; /* Near-parabolic orbit */ + } + + +ellipse_hyperbola: + + if ( lambda > 0.0 ) + { /* Elliptic orbit: */ + a = q / (1.0-e); /* Semi-major axis */ + m = KD * tp / sqrt(a*a*a); /* Mean Anomaly */ + vr( v, r, m, e, a ); /* Solve Kepler's equation, etc */ + } + else + { /* Hyperbolic orbit: */ + a = q / (e-1.0); /* Semi-major axis */ + n = K * tp / sqrt(a*a*a); /* "Daily motion" */ + g = n/e; + adgg = INFINITY; + do + { + adgg2 = adgg; + gs = sqrt(g*g+1.0); + dg = -( e*g - log(g+gs) - n ) / ( e - 1.0/gs ); + g = g + dg; + adgg = fabs(dg/g); + } while ( adgg < adgg2 && adgg > 1E-5 ); + gs = sqrt(g*g+1.0); + *v = 2.0 * atand( sqrt( (e+1.0)/(e-1.0) ) * g / (gs+1.0) ); + *r = q * (1.0+e) / ( 1.0 + e*cosd(*v) ); + } + return 0; + +} /* vrc */ + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: twobody.c,v $ $Date: 2004/04/20 04:17:08 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/umoon.c b/Common/Libraries/XEphemAstroLib/src/umoon.c new file mode 100644 index 000000000..7b0c98257 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/umoon.c @@ -0,0 +1,270 @@ +/* uranus moon info */ + +#include +#include +#include +#include +#include + +#include "astro.h" +#include "bdl.h" + +static int use_bdl (double jd, char *dir, MoonData md[U_NMOONS]); +static void moonradec (double usize, MoonData md[U_NMOONS]); +static void moonSVis (Obj *sop, Obj *uop, MoonData md[U_NMOONS]); +static void moonEVis (MoonData md[U_NMOONS]); +static void moonPShad (Obj *sop, Obj *uop, MoonData md[U_NMOONS]); +static void moonTrans (MoonData md[U_NMOONS]); + +/* moon table and a few other goodies and when it was last computed */ +static double mdmjd = -123456; +static MoonData umd[U_NMOONS] = { + {"Uranus", NULL}, + {"Ariel", "I"}, + {"Umbriel", "II"}, + {"Titania", "III"}, + {"Oberon", "IV"}, + {"Miranda", "V"}, +}; +static double sizemjd; /* size at last mjd */ + +/* These values are from the Explanatory Supplement. + * Precession degrades them gradually over time. + */ +#define POLE_RA degrad(257.43) /* RA of Uranus' north pole */ +#define POLE_DEC degrad(-15.10) /* Dec of Uranus' north pole */ + + +/* get uranus info in md[0], moon info in md[1..U_NMOONS-1]. + * if !uop caller just wants md[] for names + * N.B. we assume sop and uop are updated. + */ +void +uranus_data ( +double Mjd, /* mjd */ +char dir[], /* dir in which to look for helper files */ +Obj *sop, /* Sun */ +Obj *uop, /* uranus */ +double *sizep, /* u angular diam, rads */ +double *polera, double *poledec, /* pole location */ +MoonData md[U_NMOONS]) /* return info */ +{ + double JD; + + /* always copy back at least for name */ + memcpy (md, umd, sizeof(umd)); + + /* pole */ + if (polera) *polera = POLE_RA; + if (poledec) *poledec = POLE_DEC; + + /* nothing else if repeat call or just want names */ + if (Mjd == mdmjd || !uop) { + if (uop) { + *sizep = sizemjd; + } + return; + } + JD = Mjd + MJD0; + + /* planet in [0] */ + md[0].ra = uop->s_ra; + md[0].dec = uop->s_dec; + md[0].mag = get_mag(uop); + md[0].x = 0; + md[0].y = 0; + md[0].z = 0; + md[0].evis = 1; + md[0].svis = 1; + + /* size is straight from uop */ + *sizep = degrad(uop->s_size/3600.0); + + /* from Pasachoff/Menzel */ + + md[1].mag = 14.2; + md[2].mag = 14.8; + md[3].mag = 13.7; + md[4].mag = 14.0; + md[5].mag = 16.3; + + /* get moon x,y,z from BDL if possible */ + if (!dir || use_bdl (JD, dir, md) < 0) { + int i; + for (i = 1; i < U_NMOONS; i++) + md[i].x = md[i].y = md[i].z = 0.0; + fprintf (stderr, "No uranus model available\n"); + } + + /* set visibilities */ + moonSVis (sop, uop, md); + moonPShad (sop, uop, md); + moonEVis (md); + moonTrans (md); + + /* fill in moon ra and dec */ + moonradec (*sizep, md); + + /* save */ + mdmjd = Mjd; + sizemjd = *sizep; + memcpy (umd, md, sizeof(umd)); +} + +/* hunt for BDL file in dir[] and use if possible + * return 0 if ok, else -1 + */ +static int +use_bdl ( +double JD, /* julian date */ +char dir[], /* directory */ +MoonData md[U_NMOONS]) /* fill md[1..NM-1].x/y/z for each moon */ +{ +#define URAU .0001597 /* Uranus radius, AU */ + double x[U_NMOONS], y[U_NMOONS], z[U_NMOONS]; + char buf[1024]; + FILE *fp; + char *fn; + int i; + + /* check ranges and appropriate data file */ + if (JD < 2451179.50000) /* Jan 1 1999 UTC */ + return (-1); + if (JD < 2455562.5) /* Jan 1 2011 UTC */ + fn = "uranus.9910"; + else if (JD < 2459215.5) /* Jan 1 2021 UTC */ + fn = "uranus.1020"; + else + return (-1); + + /* open */ + (void) sprintf (buf, "%s/%s", dir, fn); + fp = fopen (buf, "r"); + if (!fp) { + fprintf (stderr, "%s: %s\n", fn, strerror(errno)); + return (-1); + } + + /* use it */ + if ((i = read_bdl (fp, JD, x, y, z, buf)) < 0) { + fprintf (stderr, "%s: %s\n", fn, buf); + fclose (fp); + return (-1); + } + if (i != U_NMOONS-1) { + fprintf (stderr, "%s: BDL says %d moons, code expects %d", fn, + i, U_NMOONS-1); + fclose (fp); + return (-1); + } + + /* copy into md[1..NM-1] with our scale and sign conventions */ + for (i = 1; i < U_NMOONS; i++) { + md[i].x = x[i-1]/URAU; /* we want u radii +E */ + md[i].y = -y[i-1]/URAU; /* we want u radii +S */ + md[i].z = -z[i-1]/URAU; /* we want u radii +front */ + } + + /* ok */ + fclose (fp); + return (0); +} + +/* given uranus loc in md[0].ra/dec and size, and location of each moon in + * md[1..NM-1].x/y in ura radii, find ra/dec of each moon in md[1..NM-1].ra/dec. + */ +static void +moonradec ( +double usize, /* ura diameter, rads */ +MoonData md[U_NMOONS]) /* fill in RA and Dec */ +{ + double urad = usize/2; + double ura = md[0].ra; + double udec = md[0].dec; + int i; + + for (i = 1; i < U_NMOONS; i++) { + double dra = urad * md[i].x; + double ddec = urad * md[i].y; + md[i].ra = ura + dra; + md[i].dec = udec - ddec; + } +} + +/* set svis according to whether moon is in sun light */ +static void +moonSVis( +Obj *sop, /* SUN */ +Obj *uop, /* uranus */ +MoonData md[U_NMOONS]) +{ + double esd = sop->s_edist; + double eod = uop->s_edist; + double sod = uop->s_sdist; + double soa = degrad(uop->s_elong); + double esa = asin(esd*sin(soa)/sod); + double h = sod*uop->s_hlat; + double nod = h*(1./eod - 1./sod); + double sca = cos(esa), ssa = sin(esa); + int i; + + for (i = 1; i < U_NMOONS; i++) { + MoonData *mdp = &md[i]; + double xp = sca*mdp->x + ssa*mdp->z; + double yp = mdp->y; + double zp = -ssa*mdp->x + sca*mdp->z; + double ca = cos(nod), sa = sin(nod); + double xpp = xp; + double ypp = ca*yp - sa*zp; + double zpp = sa*yp + ca*zp; + int outside = xpp*xpp + ypp*ypp > 1.0; + int infront = zpp > 0.0; + mdp->svis = outside || infront; + } +} + +/* set evis according to whether moon is geometrically visible from earth */ +static void +moonEVis (MoonData md[U_NMOONS]) +{ + int i; + + for (i = 1; i < U_NMOONS; i++) { + MoonData *mdp = &md[i]; + int outside = mdp->x*mdp->x + mdp->y*mdp->y > 1.0; + int infront = mdp->z > 0.0; + mdp->evis = outside || infront; + } +} + +/* set pshad and sx,sy shadow info */ +static void +moonPShad( +Obj *sop, /* SUN */ +Obj *uop, /* uranus */ +MoonData md[U_NMOONS]) +{ + int i; + + for (i = 1; i < U_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->pshad = !plshadow (uop, sop, POLE_RA, POLE_DEC, mdp->x, + mdp->y, mdp->z, &mdp->sx, &mdp->sy); + } +} + +/* set whether moons are transiting */ +static void +moonTrans (MoonData md[U_NMOONS]) +{ + int i; + + for (i = 1; i < U_NMOONS; i++) { + MoonData *mdp = &md[i]; + mdp->trans = mdp->z > 0 && mdp->x*mdp->x + mdp->y*mdp->y < 1; + } +} + + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: umoon.c,v $ $Date: 2006/08/29 03:16:47 $ $Revision: 1.10 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/utc_gst.c b/Common/Libraries/XEphemAstroLib/src/utc_gst.c new file mode 100644 index 000000000..bc4d3bbf7 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/utc_gst.c @@ -0,0 +1,95 @@ +#include "astro.h" + +static double gmst0 (double mj); + +/* given a modified julian date, mj, and a universally coordinated time, utc, + * return greenwich mean siderial time, *gst. + * N.B. mj must be at the beginning of the day. + */ +void +utc_gst (double mj, double utc, double *gst) +{ + static double lastmj = -18981; + static double t0; + + if (mj != lastmj) { + t0 = gmst0(mj); + lastmj = mj; + } + *gst = (1.0/SIDRATE)*utc + t0; + range (gst, 24.0); +} + +/* given a modified julian date, mj, and a greenwich mean siderial time, gst, + * return universally coordinated time, *utc. + * N.B. mj must be at the beginning of the day. + */ +void +gst_utc (double mj, double gst, double *utc) +{ + static double lastmj = -10000; + static double t0; + + if (mj != lastmj) { + t0 = gmst0 (mj); + lastmj = mj; + } + *utc = gst - t0; + range (utc, 24.0); + *utc *= SIDRATE; +} + +/* gmst0() - return Greenwich Mean Sidereal Time at 0h UT; stern + */ +static double +gmst0 ( +double mj) /* date at 0h UT in julian days since MJD0 */ +{ + double T, x; + + T = ((int)(mj - 0.5) + 0.5 - J2000)/36525.0; + x = 24110.54841 + + (8640184.812866 + (0.093104 - 6.2e-6 * T) * T) * T; + x /= 3600.0; + range(&x, 24.0); + return (x); +} + +#ifdef TEST_GMST + +/* original routine by elwood; has a secular drift of 0.08s/cty */ +static double +tnaught (mj) +double mj; /* julian days since 1900 jan 0.5 */ +{ + double dmj; + int m, y; + double d; + double t, t0; + + mjd_cal (mj, &m, &d, &y); + cal_mjd (1, 0., y, &dmj); + t = dmj/36525; + t0 = 6.57098e-2 * (mj - dmj) - + (24 - (6.6460656 + (5.1262e-2 + (t * 2.581e-5))*t) - + (2400 * (t - (((double)y - 1900)/100)))); + range(&t0, 24.0); + return (t0); +} + +#include +main(argc, argv) + int argc; + char *argv[]; +{ + double mj, gst; + while (scanf("%lf", &mj) == 1) { + mj -= MJD0; + gst = tnaught(mj); + printf("%17.9f %10.7f %10.7f\n", mj + MJD0, gst, gmst0(mj)); + } +} +#endif + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: utc_gst.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.3 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/vector.h b/Common/Libraries/XEphemAstroLib/src/vector.h new file mode 100644 index 000000000..be1ec56c2 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/vector.h @@ -0,0 +1,19 @@ +#ifndef __SATVECTOR_H +#define __SATVECTOR_H + +/* $Id: vector.h,v 1.1 2000/09/25 17:21:25 ecdowney Exp $ */ + +#define dotp(A,B) ((A).x*(B).x+(A).y*(B).y+(A).z*(B).z) + +#define crossp(A,B,C) {(C).x=(A).y*(B).z-(A).z*(B).y;(C).y=(A).z*(B).x-(A).x*(B).z;(C).z=(A).x*(B).y-(A).y*(B).x;} + +#define vecabs(V) (sqrt((V).x*(V).x+(V).y*(V).y+(V).z*(V).z)) +#define vecsq(V) ((V).x*(V).x+(V).y*(V).y+(V).z*(V).z) +#define vecsub(A,B,C) {(C).x=(A).x-(B).x;(C).y=(A).y-(B).y;(C).z=(A).z-(B).z;} +#define vecscale(A,k) {(A).x*=(k);(A).y*=(k);(A).z*=(k);} + +#endif /* __SATVECTOR_H */ + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: vector.h,v $ $Date: 2000/09/25 17:21:25 $ $Revision: 1.1 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/vsop87.c b/Common/Libraries/XEphemAstroLib/src/vsop87.c new file mode 100644 index 000000000..57c2c8d79 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/vsop87.c @@ -0,0 +1,209 @@ +/* VSOP87 planetary theory + * + * currently uses version VSOP87D: + * heliocentric spherical, mean ecliptic of date. + * + * calculation of rates (daily changes) is optional; + * see header file for the necessary #define's + * + * rough orientation on calculation time, miliseconds + * on an HP 715/75, all planets Mercury to Neptune, prec=0.0: + * + * terms with rates without rates + * 3598 11 7.1 + * 31577 51 44 + * + * with secular terms for JD 2232395.0 19/12/1399 0h TDB: + * + * FULL PRECISION code (31577 terms), milliseconds + * prec terms rates no rates + * 1e-8 15086 62 36 + * 1e-7 10105 44 25 + * 1e-6 3725 20 13 + * 1e-5 1324 11 7.8 + * 1e-4 443 7.0 6.0 + * 1e-3 139 6.0 5.0 + * + * REDUCED PRECISION code (3598 terms), milliseconds + * prec terms rates no rates + * 1e-7 2463 9.9 5.5 + * 1e-6 1939 8.0 4.5 + * 1e-5 1131 4.9 2.9 + * 1e-4 443 2.2 1.5 + * 1e-3 139 1.0 0.9 + */ + +#include + +#include "astro.h" +#include "vsop87.h" + +#define VSOP_A1000 365250.0 /* days per millenium */ +#define VSOP_MAXALPHA 5 /* max degree of time */ + +/****************************************************************** + * adapted from BdL FORTRAN Code; stern + * + * Reference : Bureau des Longitudes - PBGF9502 + * + * Object : calculate a VSOP87 position for a given time. + * + * Input : + * + * mj modified julian date, counted from J1900.0 + * time scale : dynamical time TDB. + * + * obj object number as in astro.h, NB: not for pluto + * + * prec relative precision + * + * if prec is equal to 0 then the precision is the precision + * p0 of the complete solution VSOP87. + * Mercury p0 = 0.6 10**-8 + * Venus p0 = 2.5 10**-8 + * Earth p0 = 2.5 10**-8 + * Mars p0 = 10.0 10**-8 + * Jupiter p0 = 35.0 10**-8 + * Saturn p0 = 70.0 10**-8 + * Uranus p0 = 8.0 10**-8 + * Neptune p0 = 42.0 10**-8 + * + * if prec is not equal to 0, let us say in between p0 and + * 10**-3, the precision is : + * for the positions : + * - prec*a0 au for the distances. + * - prec rad for the other variables. + * for the velocities : + * - prec*a0 au/day for the distances. + * - prec rad/day for the other variables. + * a0 is the semi-major axis of the body. + * + * Output : + * + * ret[6] array of the results (double). + * + * for spherical coordinates : + * 1: longitude (rd) + * 2: latitude (rd) + * 3: radius (au) + * #if VSOP_GETRATE: + * 4: longitude velocity (rad/day) + * 5: latitude velocity (rad/day) + * 6: radius velocity (au/day) + * + * return: error index (int) + * 0: no error. + * 2: object out of range [MERCURY .. NEPTUNE, SUN] + * 3: precision out of range [0.0 .. 1e-3] + ******************************************************************/ +int +vsop87 (double mj, int obj, double prec, double *ret) +{ + static double (*vx_map[])[3] = { /* data tables */ + vx_mercury, vx_venus, vx_mars, vx_jupiter, + vx_saturn, vx_uranus, vx_neptune, 0, vx_earth, + }; + static int (*vn_map[])[3] = { /* indexes */ + vn_mercury, vn_venus, vn_mars, vn_jupiter, + vn_saturn, vn_uranus, vn_neptune, 0, vn_earth, + }; + static double a0[] = { /* semimajor axes; for precision ctrl only */ + 0.39, 0.72, 1.5, 5.2, 9.6, 19.2, 30.1, 39.5, 1.0, + }; + double (*vx_obj)[3] = vx_map[obj]; /* VSOP87 data and indexes */ + int (*vn_obj)[3] = vn_map[obj]; + + double t[VSOP_MAXALPHA+1]; /* powers of time */ + double t_abs[VSOP_MAXALPHA+1]; /* powers of abs(time) */ + double q; /* aux for precision control */ + int i, cooidx, alpha; /* misc indexes */ + + if (obj == PLUTO || obj > SUN) + return (2); + + if (prec < 0.0 || prec > 1e-3) + return(3); + + /* zero result array */ + for (i = 0; i < 6; ++i) ret[i] = 0.0; + + /* time and its powers */ + t[0] = 1.0; + t[1] = (mj - J2000)/VSOP_A1000; + for (i = 2; i <= VSOP_MAXALPHA; ++i) t[i] = t[i-1] * t[1]; + t_abs[0] = 1.0; + for (i = 1; i <= VSOP_MAXALPHA; ++i) t_abs[i] = fabs(t[i]); + + /* precision control */ + q = -log10(prec + 1e-35) - 2; /* decades below 1e-2 */ + q = VSOP_ASCALE * prec / 10.0 / q; /* reduce threshold progressively + * for higher precision */ + + /* do the term summation; first the spatial dimensions */ + for (cooidx = 0; cooidx < 3; ++cooidx) { + + /* then the powers of time */ + for (alpha = 0; vn_obj[alpha+1][cooidx] ; ++alpha) { + double p, term, termdot; + + /* precision threshold */ + p= alpha ? q/(t_abs[alpha] + alpha*t_abs[alpha-1]*1e-4 + 1e-35) : q; +#if VSOP_SPHERICAL + if (cooidx == 2) /* scale by semimajor axis for radius */ +#endif + p *= a0[obj]; + + term = termdot = 0.0; + for (i = vn_obj[alpha][cooidx]; i < vn_obj[alpha+1][cooidx]; ++i) { + double a, b, c, arg; + + a = vx_obj[i][0]; + if (a < p) continue; /* ignore small terms */ + + b = vx_obj[i][1]; + c = vx_obj[i][2]; + + arg = b + c * t[1]; + term += a * cos(arg); +#if VSOP_GETRATE + termdot += -c * a * sin(arg); +#endif + } + + ret[cooidx] += t[alpha] * term; +#if VSOP_GETRATE + ret[cooidx + 3] += t[alpha] * termdot + + ((alpha > 0) ? alpha * t[alpha - 1] * term : 0.0); +#endif + } /* alpha */ + } /* cooidx */ + + for (i = 0; i < 6; ++i) ret[i] /= VSOP_ASCALE; + +#if VSOP_SPHERICAL + /* reduce longitude to 0..2pi */ + ret[0] -= floor(ret[0]/(2.*PI)) * (2.*PI); +#endif + +#if VSOP_GETRATE + /* convert millenium rate to day rate */ + for (i = 3; i < 6; ++i) ret[i] /= VSOP_A1000; +#endif + +#if VSOP_SPHERICAL + /* reduction from dynamical equinox of VSOP87 to FK5; + */ + if (prec < 5e-7) { /* 5e-7 rad = 0.1 arc seconds */ + double L1, c1, s1; + L1 = ret[0] - degrad(13.97 * t[1] - 0.031 * t[2]); + c1 = cos(L1); s1 = sin(L1); + ret[0] += degrad(-0.09033 + 0.03916 * (c1 + s1) * tan(ret[1]))/3600.0; + ret[1] += degrad(0.03916 * (c1 - s1))/3600.0; + } +#endif + + return (0); +} + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: vsop87.c,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.4 $ $Name: $"}; diff --git a/Common/Libraries/XEphemAstroLib/src/vsop87.h b/Common/Libraries/XEphemAstroLib/src/vsop87.h new file mode 100644 index 000000000..b5cb958f5 --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/vsop87.h @@ -0,0 +1,93 @@ +/* Position of planets mercury to neptune; from: +ftp://ftp.bdl.fr/pub/ephem/planets/vsop87/ +from README: + +========================== =========================== + BUREAU DES LONGITUDES + PLANETARY SOLUTION VSOP87 + 1996, January +========================== =========================== + +These files and programs are associated to : + +Planetary Theories in rectangular and spherical variables: VSOP87 solution. + Bretagnon P., Francou G. + Astron. Astrophys. 202, 309 (1988). + +Theorie du mouvement de l'ensemble des planetes (VSOP82). + Bretagnon P. + Astron. Astrophys. 114, 278 (1982). + +============================================================================== + +Description: + The Planetary solutions VSOP87 (Variations Seculaires des Orbites + Planetaires) are analytical solutions of the motion of the planets in + different versions. The main version VSOP87 consists of the series in + elliptic elements as in the case of VSOP82 solution and the other + versions VSOP87 (A-B-C-D-E) are built in rectangular and spherical + variables. + +Authors' Address: + P. Bretagnon, G. Francou + Bureau des Longitudes, CNRS URA 707 + 77, Avenue Denfert-Rochereau + 75014, Paris, France + Tel : (33) 1 40 51 22 69 (33) 1 40 51 22 60 + Fax : (33) 1 46 33 28 34 + E-mail : pierre@bdl.fr francou@bdl.fr + +Contents: + The main version of VSOP87 is similar to the previous theory VSOP82. + In the both cases the constants of integration have been determined by + fitting to the numerical integration DE200 of the Jet Propulsion + Laboratory. The various versions of VSOP87 are different from one to + another in the type of coordinates and the reference frame. + VSOP87 : heliocentric elliptic variables; equinox and ecliptic J2000. + VSOP87A : heliocentric rectangular variables; equinox and ecliptic J2000. + VSOP87B : heliocentric spherical variables; equinox and ecliptic J2000. + VSOP87C : heliocentric rectangular variables; equinox and ecliptic of date. + VSOP87D : heliocentric spherical variables; equinox and ecliptic of date. + VSOP87E : barycentric rectangular variables; equinox and ecliptic J2000. +... +============================================================================== +User feed-back is encouraged. Unless otherwise specified, send comments and bug +reports to: E-mail : comments@bdl.fr + Fax : (33) 1 46 33 28 34 + Postal mail: Bureau des longitudes + 77 avenue Denfert Rochereau + F-75014 PARIS +============================================================================== + implemented for C: stern +*/ + +#define VSOP_ASCALE 1e8 /* amplitude factor as stored */ + +/* coding flags */ +#define VSOP_SPHERICAL 1 /* version in data.c uses spherical coords */ +#define VSOP_GETRATE 0 /* calculate time derivatives of coordinates */ + +/* data tables */ +extern double vx_mercury[][3]; +extern int vn_mercury[][3]; +extern double vx_venus[][3]; +extern int vn_venus[][3]; +extern double vx_earth[][3]; +extern int vn_earth[][3]; +extern double vx_mars[][3]; +extern int vn_mars[][3]; +extern double vx_jupiter[][3]; +extern int vn_jupiter[][3]; +extern double vx_saturn[][3]; +extern int vn_saturn[][3]; +extern double vx_uranus[][3]; +extern int vn_uranus[][3]; +extern double vx_neptune[][3]; +extern int vn_neptune[][3]; + +extern int vsop87 (double mj, int obj, double prec, double *ret); + + +/* For RCS Only -- Do Not Edit + * @(#) $RCSfile: vsop87.h,v $ $Date: 2003/03/20 08:51:37 $ $Revision: 1.2 $ $Name: $ + */ diff --git a/Common/Libraries/XEphemAstroLib/src/vsop87_data.c b/Common/Libraries/XEphemAstroLib/src/vsop87_data.c new file mode 100644 index 000000000..360c3865e --- /dev/null +++ b/Common/Libraries/XEphemAstroLib/src/vsop87_data.c @@ -0,0 +1,6988 @@ +/* data tables for planetary solution VSOP87 + * + * created by automatic conversion from original distribution files at + * ftp://ftp.bdl.fr/pub/ephem/planets/vsop87/ + * + * Each coordinate is calculated as: + * + * x = Sum{ T^alpha * A * cos( B + C*T ) } + * + * x is the coordinate in rad or a.u. + * T is the VSOP time in Julian Millenia(!) since J2000.0 + * Note: the time argument in VSOP87 theory is equal to TAI + 32.184 s + * + * A (scaled by VSOP_ASCALE), B, C given below for each x and alpha + * run-of-the mill for each planet in one array vx_planet[][3]. + * The block-boundary indices for each spatial dimension are then listed + * in a separate array vn_planet[][3]. + * + * Truncation errors given in comments are from the authors' empirical + * formula: 2*sqrt(number of retained terms)*A[last retained] + */ + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_earth[][3] = { + /* earth l, T^0 */ + { 175347045.7, 0, 0 }, + { 3341656.5, 4.66925680, 6283.07584999 }, + { 34894.3, 4.626102, 12566.151700 }, + { 3417.6, 2.82887, 3.52312 }, + { 3497.1, 2.74412, 5753.38488 }, + { 3135.9, 3.62767, 77713.77147 }, + { 2676.2, 4.41808, 7860.41939 }, + { 2342.7, 6.13516, 3930.20970 }, + { 1273.2, 2.03710, 529.69097 }, + { 1324.3, 0.74246, 11506.76977 }, + { 901.9, 2.0451, 26.2983 }, + { 1199.2, 1.10963, 1577.34354 }, + { 857.2, 3.5085, 398.1490 }, + { 779.8, 1.1788, 5223.6939 }, + { 990.2, 5.2327, 5884.9268 }, + { 753.1, 2.5334, 5507.5532 }, + { 505.3, 4.5829, 18849.2275 }, + { 492.4, 4.2051, 775.5226 }, + { 356.7, 2.9195, 0.0673 }, + { 284.1, 1.8987, 796.2980 }, + { 242.8, 0.3448, 5486.7778 }, + { 317.1, 5.8490, 11790.6291 }, + { 271.0, 0.3149, 10977.0788 }, + { 206.2, 4.8065, 2544.3144 }, + { 205.4, 1.8695, 5573.1428 }, + { 202.3, 2.4577, 6069.7768 }, + { 126.2, 1.0830, 20.7754 }, + { 155.5, 0.8331, 213.2991 }, + { 115.1, 0.6454, 0.9803 }, + { 102.9, 0.6360, 4694.0030 }, + { 101.7, 4.2668, 7.1135 }, + { 99.2, 6.210, 2146.165 }, + { 132.2, 3.4112, 2942.4634 }, + { 97.6, 0.681, 155.420 }, + { 85.1, 1.299, 6275.962 }, + { 74.7, 1.755, 5088.629 }, + { 101.9, 0.9757, 15720.8388 }, + { 84.7, 3.671, 71430.696 }, + { 73.5, 4.679, 801.821 }, + { 73.9, 3.503, 3154.687 }, + { 78.8, 3.037, 12036.461 }, + { 79.6, 1.808, 17260.155 }, + { 85.8, 5.983, 161000.686 }, + { 57.0, 2.784, 6286.599 }, + { 61.1, 1.818, 7084.897 }, + { 69.6, 0.833, 9437.763 }, + { 56.1, 4.387, 14143.495 }, + { 62.4, 3.978, 8827.390 }, + { 51.1, 0.283, 5856.478 }, + { 55.6, 3.470, 6279.553 }, + { 41.0, 5.368, 8429.241 }, + { 51.6, 1.333, 1748.016 }, + { 52.0, 0.189, 12139.554 }, + { 49.0, 0.487, 1194.447 }, + { 39.2, 6.168, 10447.388 }, + { 35.6, 1.776, 6812.767 }, + { 36.8, 6.041, 10213.286 }, + { 36.6, 2.570, 1059.382 }, + { 33.3, 0.593, 17789.846 }, + { 36.0, 1.709, 2352.866 }, + { 40.9, 2.399, 19651.048 }, + { 30.0, 2.740, 1349.867 }, + { 30.4, 0.443, 83996.847 }, + { 23.7, 0.485, 8031.092 }, + { 23.6, 2.065, 3340.612 }, + { 21.1, 4.148, 951.718 }, + { 24.7, 0.215, 3.590 }, + { 25.4, 3.165, 4690.480 }, + { 22.8, 5.222, 4705.732 }, + { 21.4, 1.426, 16730.464 }, + { 21.9, 5.556, 553.569 }, + { 17.5, 4.561, 135.065 }, + { 19.9, 5.222, 12168.003 }, + { 19.9, 5.775, 6309.374 }, + { 20.3, 0.371, 283.859 }, + { 14.4, 4.193, 242.729 }, + { 16.2, 5.988, 11769.854 }, + { 15.1, 4.196, 6256.778 }, + { 19.1, 3.822, 23581.258 }, + { 18.9, 5.386, 149854.400 }, + { 14.3, 3.724, 38.028 }, + { 17.9, 2.215, 13367.973 }, + { 12.1, 2.622, 955.600 }, + { 11.3, 0.177, 4164.312 }, + { 14.0, 4.401, 6681.225 }, + { 13.6, 1.889, 7632.943 }, + { 12.5, 1.131, 5.523 }, + { 10.5, 5.359, 1592.596 }, + { 9.8, 1.00, 11371.70 }, + { 9.2, 4.57, 4292.33 }, + { 10.3, 6.200, 6438.496 }, + { 12.0, 1.004, 632.784 }, + { 10.8, 0.327, 103.093 }, + { 8.4, 4.54, 25132.30 }, + { 10.0, 6.029, 5746.271 }, + { 8.4, 3.30, 7234.79 }, + { 8.0, 5.82, 28.45 }, + { 10.5, 0.939, 11926.254 }, + { 7.7, 3.12, 7238.68 }, + { 9.4, 2.62, 5760.50 }, + { 8.1, 6.11, 4732.03 }, + { 9.2, 0.48, 522.58 }, + { 9.8, 5.24, 27511.47 }, + { 7.9, 1.00, 5643.18 }, + { 8.1, 6.27, 426.60 }, + { 9.0, 5.34, 6386.17 }, + { 8.6, 4.17, 7058.60 }, + { 6.3, 4.72, 6836.65 }, + { 7.6, 3.97, 11499.66 }, + { 7.8, 2.96, 23013.54 }, + { 7.3, 0.61, 11513.88 }, + { 6.5, 5.79, 18073.70 }, + { 7.2, 4.00, 74.78 }, + { 7.3, 4.39, 316.39 }, + { 7.1, 0.32, 263.08 }, + { 6.6, 3.66, 17298.18 }, + { 6.8, 5.91, 90955.55 }, + /* 117 terms retained, 442 terms dropped, error 0.3" */ + + /* earth l, T^1 */ + { 628331966747.5, 0, 0 }, + { 206058.9, 2.6782346, 6283.0758500 }, + { 4303.4, 2.63513, 12566.15170 }, + { 425.3, 1.5905, 3.5231 }, + { 109.0, 2.9662, 1577.3435 }, + { 93.5, 2.592, 18849.228 }, + { 119.3, 5.7956, 26.2983 }, + { 72.1, 1.138, 529.691 }, + { 67.8, 1.875, 398.149 }, + { 67.3, 4.409, 5507.553 }, + { 59.0, 2.888, 5223.694 }, + { 56.0, 2.175, 155.420 }, + { 45.4, 0.398, 796.298 }, + { 36.4, 0.466, 775.523 }, + { 29.0, 2.647, 7.114 }, + { 19.1, 1.846, 5486.778 }, + { 20.8, 5.341, 0.980 }, + { 18.5, 4.969, 213.299 }, + { 16.2, 0.032, 2544.314 }, + { 17.3, 2.991, 6275.962 }, + { 15.8, 1.430, 2146.165 }, + { 14.6, 1.205, 10977.079 }, + { 11.9, 3.258, 5088.629 }, + { 11.5, 2.075, 4694.003 }, + { 9.7, 4.24, 1349.87 }, + { 10.0, 1.303, 6286.599 }, + { 9.5, 2.70, 242.73 }, + { 12.5, 2.834, 1748.016 }, + { 11.8, 5.274, 1194.447 }, + { 8.6, 5.64, 951.72 }, + { 10.6, 0.766, 553.569 }, + { 7.6, 5.30, 2352.87 }, + { 5.8, 1.77, 1059.38 }, + { 6.4, 2.65, 9437.76 }, + { 5.2, 5.66, 71430.70 }, + { 5.3, 0.91, 3154.69 }, + { 6.1, 4.67, 4690.48 }, + { 4.3, 0.24, 6812.77 }, + { 5.0, 1.42, 6438.50 }, + { 4.3, 0.77, 10447.39 }, + { 5.2, 1.85, 801.82 }, + { 3.7, 2.00, 8031.09 }, + { 3.6, 2.43, 14143.50 }, + { 3.4, 3.86, 1592.60 }, + { 3.4, 0.89, 12036.46 }, + { 3.2, 3.19, 4705.73 }, + { 3.2, 0.62, 8429.24 }, + { 4.1, 5.24, 7084.90 }, + { 3.0, 6.07, 4292.33 }, + { 2.9, 2.32, 20.36 }, + { 3.5, 4.80, 6279.55 }, + { 2.9, 1.43, 5746.27 }, + { 2.7, 4.80, 7234.79 }, + { 2.5, 6.22, 6836.65 }, + { 2.7, 0.93, 5760.50 }, + { 3.2, 3.40, 7632.94 }, + { 2.3, 5.00, 17789.85 }, + { 2.1, 3.96, 10213.29 }, + { 2.1, 2.22, 5856.48 }, + { 2.3, 5.67, 11499.66 }, + { 2.1, 5.20, 11513.88 }, + { 1.9, 0.53, 3340.61 }, + { 1.9, 4.74, 83996.85 }, + { 2.1, 2.55, 25132.30 }, + { 1.8, 1.47, 4164.31 }, + { 1.8, 3.02, 5.52 }, + { 2.0, 0.91, 6256.78 }, + { 2.1, 2.27, 522.58 }, + { 1.8, 3.03, 5753.38 }, + { 1.6, 6.12, 5216.58 }, + { 1.6, 4.64, 3.29 }, + /* 71 terms retained, 270 terms dropped, error 0.056"*T */ + + /* earth l, T^2 */ + { 52918.9, 0, 0 }, + { 8719.8, 1.07210, 6283.07585 }, + { 309.1, 0.8673, 12566.1517 }, + { 27.3, 0.053, 3.523 }, + { 16.3, 5.188, 26.298 }, + { 15.8, 3.685, 155.420 }, + { 9.5, 0.76, 18849.23 }, + { 8.9, 2.06, 77713.77 }, + { 7.0, 0.83, 775.52 }, + { 5.1, 4.66, 1577.34 }, + { 4.1, 1.03, 7.11 }, + { 3.5, 5.14, 796.30 }, + { 3.2, 6.05, 5507.55 }, + { 3.0, 1.19, 242.73 }, + { 2.9, 6.12, 529.69 }, + { 3.8, 3.44, 5573.14 }, + { 2.7, 0.31, 398.15 }, + { 2.4, 4.38, 5223.69 }, + { 2.5, 2.28, 553.57 }, + { 2.1, 3.75, 0.98 }, + { 1.7, 0.90, 951.72 }, + { 1.5, 5.76, 1349.87 }, + { 1.2, 2.97, 2146.17 }, + { 1.4, 4.36, 1748.02 }, + { 1.3, 3.72, 1194.45 }, + { 1.3, 2.95, 6438.50 }, + { 1.0, 5.99, 6286.60 }, + { 0.9, 4.80, 5088.63 }, + { 0.8, 3.31, 213.30 }, + { 1.1, 1.27, 161000.69 }, + { 0.8, 3.42, 5486.78 }, + { 1.0, 0.60, 3154.69 }, + { 0.9, 5.23, 7084.90 }, + { 0.6, 1.60, 2544.31 }, + { 0.7, 3.43, 4694.00 }, + { 0.6, 2.48, 10977.08 }, + { 0.7, 6.19, 4690.48 }, + { 0.6, 1.98, 801.82 }, + { 0.5, 1.44, 6836.65 }, + { 0.5, 2.34, 1592.60 }, + { 0.5, 1.31, 4292.33 }, + { 0.4, 0.04, 7234.79 }, + { 0.5, 3.81, 149854.40 }, + { 0.4, 4.94, 7632.94 }, + /* 44 terms retained, 98 terms dropped, error 0.011"*T^2 */ + + /* earth l, T^3 */ + { 289.2, 5.8438, 6283.0758 }, + { 35.0, 0, 0 }, + { 16.8, 5.488, 12566.152 }, + { 3.0, 5.20, 155.42 }, + { 1.3, 4.72, 3.52 }, + { 0.6, 5.97, 242.73 }, + { 0.7, 5.30, 18849.23 }, + { 0.4, 3.79, 553.57 }, + /* 8 terms retained, 14 terms dropped, error 0.005"*T^3 */ + + /* earth l, T^4 */ + { 114.1, 3.1416, 0 }, + { 7.7, 4.13, 6283.08 }, + { 0.8, 3.84, 12566.15 }, + { 0.4, 0.42, 155.42 }, + /* 4 terms retained, 7 terms dropped, error 0.00032"*T^4 */ + + /* earth l, T^5 */ + { 0.9, 3.14, 0 }, + { 0.2, 2.77, 6283.08 }, + { 0.1, 2.01, 155.42 }, + /* 3 terms retained, 2 terms dropped, error 0.00023"*T^5 */ + /* end earth l */ + + /* earth b, T^0 */ + { 279.6, 3.1987, 84334.6616 }, + { 101.6, 5.4225, 5507.5532 }, + { 80.4, 3.880, 5223.694 }, + { 43.8, 3.704, 2352.866 }, + { 31.9, 4.000, 1577.344 }, + { 22.7, 3.985, 1047.747 }, + { 16.4, 3.565, 5856.478 }, + { 18.1, 4.984, 6283.076 }, + { 14.4, 3.703, 9437.763 }, + { 14.3, 3.411, 10213.286 }, + { 11.2, 4.828, 14143.495 }, + { 10.9, 2.086, 6812.767 }, + { 9.7, 3.47, 4694.00 }, + { 10.4, 4.057, 71092.881 }, + { 8.8, 4.44, 5753.38 }, + { 8.4, 4.99, 7084.90 }, + { 6.9, 4.33, 6275.96 }, + { 9.1, 1.14, 6620.89 }, + { 7.2, 3.60, 529.69 }, + { 7.7, 5.55, 167621.58 }, + /* 20 terms retained, 164 terms dropped, error 0.15" */ + + /* earth b, T^1 */ + { 9.0, 3.90, 5507.55 }, + { 6.2, 1.73, 5223.69 }, + { 3.8, 5.24, 2352.87 }, + { 2.8, 2.47, 1577.34 }, + { 1.8, 0.42, 6283.08 }, + /* 5 terms retained, 94 terms dropped, error 0.018"*T */ + + /* earth b, T^2 */ + { 1.7, 1.63, 84334.66 }, + { 0.5, 2.41, 1047.75 }, + /* 2 terms retained, 47 terms dropped, error 0.0035"*T^2 */ + + /* earth b, T^3 */ + /* 0 terms retained, 11 terms dropped, error 4.5e-05"*T^3 */ + + /* earth b, T^4 */ + /* 0 terms retained, 5 terms dropped, error 1.7e-05"*T^4 */ + /* end earth b */ + + /* earth r, T^0 */ + { 100013988.8, 0, 0 }, + { 1670699.6, 3.09846351, 6283.07584999 }, + { 13956.0, 3.055246, 12566.151700 }, + { 3083.7, 5.19847, 77713.77147 }, + { 1628.5, 1.17388, 5753.38488 }, + { 1575.6, 2.84685, 7860.41939 }, + { 924.8, 5.4529, 11506.7698 }, + { 542.4, 4.5641, 3930.2097 }, + { 472.1, 3.6610, 5884.9268 }, + { 328.8, 5.8998, 5223.6939 }, + { 346.0, 0.9637, 5507.5532 }, + { 306.8, 0.2987, 5573.1428 }, + { 174.8, 3.0119, 18849.2275 }, + { 243.2, 4.2735, 11790.6291 }, + { 211.8, 5.8471, 1577.3435 }, + { 185.8, 5.0219, 10977.0788 }, + { 109.8, 5.0551, 5486.7778 }, + { 98.3, 0.887, 6069.777 }, + { 86.5, 5.690, 15720.839 }, + { 85.8, 1.271, 161000.686 }, + { 62.9, 0.922, 529.691 }, + { 57.1, 2.014, 83996.847 }, + { 64.9, 0.273, 17260.155 }, + { 49.4, 3.245, 2544.314 }, + { 55.7, 5.242, 71430.696 }, + { 42.5, 6.011, 6275.962 }, + { 47.0, 2.578, 775.523 }, + { 39.0, 5.361, 4694.003 }, + { 44.7, 5.537, 9437.763 }, + { 35.7, 1.675, 12036.461 }, + { 31.9, 0.184, 5088.629 }, + { 31.8, 1.778, 398.149 }, + { 33.2, 0.244, 7084.897 }, + { 38.2, 2.393, 8827.390 }, + { 28.5, 1.213, 6286.599 }, + { 37.5, 0.830, 19651.048 }, + { 37.0, 4.901, 12139.554 }, + { 34.5, 1.843, 2942.463 }, + { 26.3, 4.589, 10447.388 }, + { 24.6, 3.787, 8429.241 }, + { 23.6, 0.269, 796.298 }, + { 27.8, 1.899, 6279.553 }, + { 23.9, 4.996, 5856.478 }, + { 20.3, 4.653, 2146.165 }, + { 23.3, 2.808, 14143.495 }, + { 22.1, 1.950, 3154.687 }, + { 19.5, 5.382, 2352.866 }, + { 18.0, 0.199, 6812.767 }, + { 17.2, 4.433, 10213.286 }, + { 16.2, 5.232, 17789.846 }, + { 17.3, 6.152, 16730.464 }, + { 13.8, 5.190, 8031.092 }, + { 18.8, 0.673, 149854.400 }, + { 18.3, 2.253, 23581.258 }, + { 13.6, 3.685, 4705.732 }, + { 13.1, 0.653, 13367.973 }, + { 10.4, 4.333, 11769.854 }, + { 10.0, 4.201, 6309.374 }, + { 10.2, 1.594, 4690.480 }, + { 7.6, 2.63, 6256.78 }, + { 9.7, 3.68, 27511.47 }, + { 6.7, 0.56, 3340.61 }, + { 8.7, 6.06, 1748.02 }, + { 7.8, 3.67, 12168.00 }, + { 6.6, 5.66, 11371.70 }, + { 7.7, 0.31, 7632.94 }, + { 6.6, 3.14, 801.82 }, + { 7.5, 5.65, 11926.25 }, + { 6.9, 2.92, 6681.22 }, + { 6.8, 1.42, 23013.54 }, + { 6.5, 2.65, 19804.83 }, + /* 71 terms retained, 455 terms dropped, error 1.1e-06 a.u. */ + + /* earth r, T^1 */ + { 103018.6, 1.1074897, 6283.0758500 }, + { 1721.2, 1.06442, 12566.15170 }, + { 702.2, 3.1416, 0 }, + { 32.3, 1.022, 18849.228 }, + { 30.8, 2.844, 5507.553 }, + { 25.0, 1.319, 5223.694 }, + { 18.5, 1.424, 1577.344 }, + { 10.1, 5.914, 10977.079 }, + { 8.6, 0.27, 5486.78 }, + { 8.7, 1.42, 6275.96 }, + { 5.1, 1.69, 5088.63 }, + { 5.0, 6.01, 6286.60 }, + { 4.7, 5.99, 529.69 }, + { 4.4, 0.52, 4694.00 }, + { 3.9, 4.75, 2544.31 }, + { 3.8, 5.07, 796.30 }, + { 4.1, 1.08, 9437.76 }, + { 3.5, 0.02, 83996.85 }, + { 3.4, 0.95, 71430.70 }, + { 3.2, 6.16, 2146.17 }, + { 3.4, 5.41, 775.52 }, + { 2.9, 5.48, 10447.39 }, + { 2.5, 0.24, 398.15 }, + { 2.2, 4.95, 6812.77 }, + { 2.2, 0.42, 8031.09 }, + { 2.8, 3.42, 2352.87 }, + { 2.6, 6.13, 6438.50 }, + { 1.9, 5.31, 8429.24 }, + { 2.4, 3.09, 4690.48 }, + { 1.7, 1.54, 4705.73 }, + { 2.2, 3.69, 7084.90 }, + { 2.1, 1.28, 1748.02 }, + { 1.8, 3.23, 6279.55 }, + { 1.6, 4.10, 11499.66 }, + { 1.6, 5.54, 3154.69 }, + { 1.8, 1.82, 7632.94 }, + /* 36 terms retained, 256 terms dropped, error 2.2e-07 a.u.*T */ + + /* earth r, T^2 */ + { 4359.4, 5.78455, 6283.07585 }, + { 123.6, 5.5793, 12566.1517 }, + { 12.3, 3.142, 0 }, + { 8.8, 3.63, 77713.77 }, + { 5.7, 1.87, 5573.14 }, + { 3.3, 5.47, 18849.23 }, + { 1.5, 4.48, 5507.55 }, + { 1.0, 2.81, 5223.69 }, + { 0.9, 3.11, 1577.34 }, + { 1.1, 2.84, 161000.69 }, + { 0.6, 5.47, 775.52 }, + { 0.6, 1.38, 6438.50 }, + { 0.5, 4.42, 6286.60 }, + { 0.4, 0.90, 10977.08 }, + { 0.4, 3.20, 5088.63 }, + { 0.5, 3.66, 7084.90 }, + { 0.5, 5.39, 149854.40 }, + /* 17 terms retained, 122 terms dropped, error 3.9e-08 a.u.*T^2 */ + + /* earth r, T^3 */ + { 144.6, 4.2732, 6283.0758 }, + { 6.7, 3.92, 12566.15 }, + { 0.8, 0, 0 }, + { 0.2, 3.73, 18849.23 }, + /* 4 terms retained, 23 terms dropped, error 1.1e-08 a.u.*T^3 */ + + /* earth r, T^4 */ + { 3.9, 2.56, 6283.08 }, + { 0.3, 2.27, 12566.15 }, + { 0.1, 3.44, 5573.14 }, + /* 3 terms retained, 7 terms dropped, error 2.1e-09 a.u.*T^4 */ + + /* earth r, T^5 */ + { 0.1, 1.22, 6283.08 }, + /* 1 terms retained, 2 terms dropped, error 2.4e-09 a.u.*T^5 */ + /* end earth */ +}; + +int vn_earth[][3] = { + /* addresses for earth l, b, r */ + /* T^0 */ { 0, 247, 274, }, + /* T^1 */ { 117, 267, 345, }, + /* T^2 */ { 188, 272, 381, }, + /* T^3 */ { 232, 274, 398, }, + /* T^4 */ { 240, 0, 402, }, + /* T^5 */ { 244, 0, 405, }, + /* end */ { 247, 0, 406, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_jupiter[][3] = { + /* jupiter l, T^0 */ + { 59954691.5, 0, 0 }, + { 9695898.7, 5.06191793, 529.69096509 }, + { 573610.1, 1.4440621, 7.1135470 }, + { 306389.2, 5.4173473, 1059.3819302 }, + { 97178.3, 4.142647, 632.783739 }, + { 72903.1, 3.640429, 522.577418 }, + { 64264.0, 3.411452, 103.092774 }, + { 39806.1, 2.293767, 419.484644 }, + { 38857.8, 1.272317, 316.391870 }, + { 27964.6, 1.784546, 536.804512 }, + { 13589.7, 5.774810, 1589.072895 }, + { 8246.4, 3.58228, 206.18555 }, + { 8768.7, 3.63000, 949.17561 }, + { 7368.1, 5.08101, 735.87651 }, + { 6263.2, 0.02498, 213.29910 }, + { 6114.0, 4.51320, 1162.47470 }, + { 4905.4, 1.32085, 110.20632 }, + { 5305.3, 1.30671, 14.22709 }, + { 5305.5, 4.18625, 1052.26838 }, + { 4647.2, 4.69958, 3.93215 }, + { 3045.0, 4.31676, 426.59819 }, + { 2610.0, 1.56668, 846.08283 }, + { 2028.2, 1.06377, 3.18139 }, + { 1764.8, 2.14148, 1066.49548 }, + { 1723.0, 3.88036, 1265.56748 }, + { 1921.0, 0.97169, 639.89729 }, + { 1633.2, 3.58201, 515.46387 }, + { 1432.0, 4.29684, 625.67019 }, + { 973.3, 4.0976, 95.9792 }, + { 884.4, 2.4370, 412.3711 }, + { 732.9, 6.0853, 838.9693 }, + { 731.1, 3.8059, 1581.9593 }, + { 691.9, 6.1337, 2118.7639 }, + { 709.2, 1.2927, 742.9901 }, + { 614.5, 4.1085, 1478.8666 }, + { 495.2, 3.7557, 323.5054 }, + { 581.9, 4.5397, 309.2783 }, + { 375.7, 4.7030, 1368.6603 }, + { 389.9, 4.8972, 1692.1657 }, + { 341.0, 5.7145, 533.6231 }, + { 330.5, 4.7405, 0.0482 }, + { 440.9, 2.9582, 454.9094 }, + { 417.3, 1.0355, 2.4477 }, + { 244.2, 5.2202, 728.7630 }, + { 261.5, 1.8765, 0.9632 }, + { 256.6, 3.7241, 199.0720 }, + { 261.0, 0.8205, 380.1278 }, + { 220.4, 1.6512, 543.9181 }, + { 202.0, 1.8068, 1375.7738 }, + { 207.3, 1.8546, 525.7588 }, + { 197.0, 5.2925, 1155.3612 }, + { 235.1, 1.2269, 909.8187 }, + { 174.8, 5.9097, 956.2892 }, + { 149.4, 4.3775, 1685.0521 }, + { 175.2, 3.2263, 1898.3512 }, + { 175.2, 3.7297, 942.0621 }, + { 157.9, 4.3648, 1795.2584 }, + { 137.9, 1.3180, 1169.5883 }, + { 117.5, 2.5002, 1596.1864 }, + { 150.5, 3.9063, 74.7816 }, + { 116.8, 3.3892, 0.5213 }, + { 105.9, 4.5544, 526.5096 }, + { 130.5, 4.1687, 1045.1548 }, + { 141.4, 3.1357, 491.5579 }, + { 99.5, 1.421, 532.872 }, + { 96.1, 1.182, 117.320 }, + { 91.8, 0.858, 1272.681 }, + { 87.7, 1.217, 453.425 }, + { 68.5, 2.352, 2.921 }, + { 66.1, 5.344, 1471.753 }, + { 77.4, 4.427, 39.357 }, + { 72.0, 4.238, 2111.650 }, + { 63.4, 4.977, 0.751 }, + { 59.4, 4.111, 2001.444 }, + { 62.5, 0.512, 220.413 }, + { 66.5, 2.989, 2214.743 }, + { 60.2, 4.126, 4.193 }, + { 56.0, 1.155, 21.341 }, + { 52.9, 0.912, 10.295 }, + { 70.3, 5.142, 835.037 }, + { 51.9, 4.100, 1258.454 }, + { 46.4, 4.665, 5.629 }, + { 58.2, 5.866, 5753.385 }, + { 40.1, 4.688, 0.160 }, + { 46.7, 4.794, 305.346 }, + { 39.3, 4.254, 853.196 }, + { 46.0, 5.110, 4.666 }, + { 54.5, 1.571, 983.116 }, + { 38.9, 6.076, 518.645 }, + { 38.4, 2.438, 433.712 }, + { 46.8, 3.546, 5.417 }, + { 41.8, 4.680, 302.165 }, + { 35.9, 2.451, 430.530 }, + { 37.9, 0.211, 2648.455 }, + { 39.2, 1.718, 11.046 }, + { 37.6, 6.195, 831.856 }, + { 35.8, 4.615, 2008.558 }, + { 43.4, 0.150, 528.206 }, + { 31.6, 5.141, 1788.145 }, + { 29.8, 5.344, 2221.857 }, + { 32.8, 5.289, 88.866 }, + { 27.7, 1.852, 0.212 }, + { 25.8, 3.859, 2317.836 }, + { 33.8, 1.006, 9683.595 }, + { 27.1, 2.808, 18.159 }, + { 26.8, 1.776, 532.139 }, + { 26.1, 2.744, 2531.135 }, + { 30.8, 0.423, 1.484 }, + { 30.5, 3.667, 508.350 }, + /* 109 terms retained, 651 terms dropped, error 1.3" */ + + /* jupiter l, T^1 */ + { 52993480757.5, 0, 0 }, + { 489741.2, 4.2206669, 529.6909651 }, + { 228918.5, 6.0264746, 7.1135470 }, + { 27655.4, 4.572660, 1059.381930 }, + { 20720.9, 5.459389, 522.577418 }, + { 12105.7, 0.169858, 536.804512 }, + { 6068.1, 4.42420, 103.09277 }, + { 5433.9, 3.98478, 419.48464 }, + { 4237.8, 5.89009, 14.22709 }, + { 2211.9, 5.26771, 206.18555 }, + { 1295.8, 5.55133, 3.18139 }, + { 1745.9, 4.92669, 1589.07290 }, + { 1163.4, 0.51451, 3.93215 }, + { 1007.2, 0.46478, 735.87651 }, + { 1173.1, 5.85647, 1052.26838 }, + { 847.7, 5.7581, 110.2063 }, + { 827.3, 4.8031, 213.2991 }, + { 1003.6, 3.15040, 426.59819 }, + { 1098.7, 5.30705, 515.46387 }, + { 816.4, 0.5864, 1066.4955 }, + { 725.4, 5.5183, 639.8973 }, + { 567.8, 5.9887, 625.6702 }, + { 474.2, 4.1325, 412.3711 }, + { 412.9, 5.7365, 95.9792 }, + { 335.8, 3.7325, 1162.4747 }, + { 345.2, 4.2416, 632.7837 }, + { 234.1, 6.2430, 309.2783 }, + { 194.8, 2.2188, 323.5054 }, + { 234.3, 4.0347, 949.1756 }, + { 183.9, 6.2796, 543.9181 }, + { 198.5, 1.5046, 838.9693 }, + { 186.9, 6.0862, 742.9901 }, + { 171.4, 5.4166, 199.0720 }, + { 130.8, 0.6264, 728.7630 }, + { 107.6, 4.4928, 956.2892 }, + { 115.4, 0.6802, 846.0828 }, + { 115.0, 5.2864, 2118.7639 }, + { 66.8, 5.734, 21.341 }, + { 69.6, 5.973, 532.872 }, + { 64.9, 6.088, 1581.959 }, + { 79.7, 5.824, 1045.155 }, + { 57.9, 0.995, 1596.186 }, + { 65.6, 0.129, 526.510 }, + { 58.5, 0.586, 1155.361 }, + { 56.6, 1.412, 533.623 }, + { 71.6, 5.342, 942.062 }, + { 57.4, 5.969, 1169.588 }, + { 54.9, 5.428, 10.295 }, + { 52.0, 0.230, 1368.660 }, + { 52.3, 5.727, 117.320 }, + { 50.4, 6.081, 525.759 }, + { 47.4, 3.626, 1478.867 }, + { 39.9, 4.162, 1692.166 }, + { 46.7, 0.511, 1265.567 }, + { 32.8, 5.036, 220.413 }, + { 33.6, 0.099, 302.165 }, + { 29.4, 3.359, 4.666 }, + { 29.3, 0.759, 88.866 }, + { 32.4, 5.375, 508.350 }, + { 29.5, 5.422, 1272.681 }, + { 21.8, 6.151, 1685.052 }, + { 25.2, 1.607, 831.856 }, + { 21.1, 5.863, 1258.454 }, + { 19.7, 2.172, 316.392 }, + { 17.9, 0.828, 433.712 }, + { 17.7, 5.955, 5.417 }, + { 17.2, 2.764, 853.196 }, + { 17.5, 0.707, 1471.753 }, + { 17.5, 0.498, 1375.774 }, + { 14.4, 0.915, 18.159 }, + { 14.1, 0.630, 2.921 }, + { 11.6, 4.304, 405.258 }, + { 11.7, 1.764, 380.128 }, + { 11.1, 5.567, 1574.846 }, + { 10.4, 0.314, 1361.547 }, + { 9.8, 5.90, 519.40 }, + { 9.8, 0.39, 1073.61 }, + { 9.3, 3.22, 1795.26 }, + { 8.9, 0.54, 1788.14 }, + { 8.4, 5.88, 2001.44 }, + { 8.1, 5.10, 1485.98 }, + { 7.7, 5.65, 2648.45 }, + { 6.7, 2.41, 4.19 }, + { 7.3, 6.19, 11.05 }, + { 6.3, 1.36, 1148.25 }, + /* 85 terms retained, 284 terms dropped, error 0.24"*T */ + + /* jupiter l, T^2 */ + { 47233.6, 4.321483, 7.113547 }, + { 30629.1, 2.930214, 529.690965 }, + { 38965.5, 0, 0 }, + { 3189.3, 1.05505, 522.57742 }, + { 2723.4, 3.41412, 1059.38193 }, + { 2729.3, 4.84545, 536.80451 }, + { 1721.1, 4.18734, 14.22709 }, + { 383.3, 5.7679, 419.4846 }, + { 367.5, 6.0551, 103.0928 }, + { 377.5, 0.7605, 515.4639 }, + { 337.4, 3.7864, 3.1814 }, + { 308.2, 0.6936, 206.1855 }, + { 218.4, 3.8139, 1589.0729 }, + { 198.9, 5.3400, 1066.4955 }, + { 197.4, 2.4836, 3.9322 }, + { 146.2, 3.8137, 639.8973 }, + { 155.9, 1.4064, 1052.2684 }, + { 129.6, 5.8374, 412.3711 }, + { 141.9, 1.6344, 426.5982 }, + { 117.3, 1.4144, 625.6702 }, + { 96.7, 4.034, 110.206 }, + { 90.8, 1.106, 95.979 }, + { 78.8, 4.637, 543.918 }, + { 72.4, 2.217, 735.877 }, + { 87.3, 2.522, 632.784 }, + { 56.9, 3.123, 213.299 }, + { 48.6, 1.673, 309.278 }, + { 58.5, 0.832, 199.072 }, + { 40.1, 4.025, 21.341 }, + { 39.8, 0.624, 323.505 }, + { 35.7, 2.326, 728.763 }, + { 25.6, 2.512, 1162.475 }, + { 29.3, 3.608, 10.295 }, + { 23.6, 3.005, 956.289 }, + { 27.8, 3.240, 838.969 }, + { 26.0, 4.501, 742.990 }, + { 25.2, 1.219, 1045.155 }, + { 19.5, 4.290, 532.872 }, + { 17.7, 0.810, 508.350 }, + { 15.4, 5.810, 1596.186 }, + { 17.1, 4.200, 2118.764 }, + { 17.0, 1.834, 526.510 }, + { 14.7, 4.000, 117.320 }, + { 13.6, 1.803, 302.165 }, + { 13.2, 2.519, 88.866 }, + { 12.8, 4.369, 1169.588 }, + { 15.3, 0.682, 942.062 }, + { 11.0, 4.436, 525.759 }, + { 13.9, 5.952, 316.392 }, + { 9.4, 2.18, 1155.36 }, + { 8.8, 3.29, 220.41 }, + { 7.8, 5.76, 846.08 }, + { 7.5, 2.71, 533.62 }, + { 9.7, 1.72, 1581.96 }, + { 8.7, 3.32, 831.86 }, + { 6.3, 0.50, 949.18 }, + { 6.7, 2.18, 1265.57 }, + { 5.4, 6.01, 405.26 }, + { 4.7, 1.41, 1258.45 }, + { 4.4, 3.02, 1692.17 }, + { 4.4, 5.48, 433.71 }, + { 4.3, 5.07, 1073.61 }, + { 4.2, 5.29, 18.16 }, + { 3.9, 1.27, 853.20 }, + { 5.4, 3.65, 1272.68 }, + { 4.4, 2.27, 1368.66 }, + { 3.5, 1.54, 519.40 }, + { 2.7, 2.10, 1478.87 }, + { 2.7, 1.06, 1574.85 }, + { 2.9, 2.05, 1361.55 }, + { 3.1, 0.99, 191.96 }, + { 2.5, 2.37, 1471.75 }, + { 2.2, 2.48, 721.65 }, + { 2.1, 3.71, 1485.98 }, + { 2.0, 1.88, 1685.05 }, + { 2.3, 3.03, 1148.25 }, + { 2.0, 6.17, 330.62 }, + /* 77 terms retained, 114 terms dropped, error 0.074"*T^2 */ + + /* jupiter l, T^3 */ + { 6501.7, 2.59863, 7.11355 }, + { 1356.5, 1.34636, 529.69097 }, + { 470.7, 2.4750, 14.2271 }, + { 417.0, 3.2445, 536.8045 }, + { 352.9, 2.9736, 522.5774 }, + { 154.9, 2.0757, 1059.3819 }, + { 86.8, 2.514, 515.464 }, + { 33.5, 3.826, 1066.495 }, + { 44.4, 0, 0 }, + { 22.6, 2.982, 543.918 }, + { 23.7, 1.277, 412.371 }, + { 28.5, 2.448, 206.186 }, + { 19.8, 2.101, 639.897 }, + { 19.7, 1.403, 419.485 }, + { 18.8, 1.594, 103.093 }, + { 17.0, 2.302, 21.341 }, + { 16.8, 2.598, 1589.073 }, + { 16.2, 3.145, 625.670 }, + { 16.1, 3.360, 1052.268 }, + { 13.4, 2.760, 95.979 }, + { 13.2, 2.539, 199.072 }, + { 12.6, 6.266, 426.598 }, + { 8.6, 2.27, 110.21 }, + { 6.7, 3.43, 309.28 }, + { 8.7, 1.76, 10.29 }, + { 6.5, 4.04, 728.76 }, + { 5.4, 5.25, 323.51 }, + { 5.7, 2.52, 508.35 }, + { 5.4, 2.91, 1045.15 }, + { 4.0, 4.30, 88.87 }, + { 3.9, 3.52, 302.16 }, + { 3.8, 4.09, 735.88 }, + { 3.3, 1.43, 956.29 }, + { 2.8, 4.36, 1596.19 }, + { 2.7, 1.25, 213.30 }, + { 2.6, 2.24, 117.32 }, + { 2.4, 2.90, 742.99 }, + { 2.7, 5.02, 838.97 }, + { 1.9, 2.77, 1169.59 }, + { 2.3, 2.36, 942.06 }, + { 1.5, 1.61, 220.41 }, + { 1.5, 3.09, 2118.76 }, + { 1.9, 5.01, 831.86 }, + { 1.6, 1.40, 405.26 }, + { 1.3, 3.98, 1155.36 }, + { 1.2, 3.46, 1073.61 }, + { 1.0, 3.39, 532.87 }, + { 0.9, 2.70, 191.96 }, + { 0.8, 1.48, 632.78 }, + { 0.8, 1.11, 1162.47 }, + { 0.8, 3.30, 1258.45 }, + { 0.7, 5.90, 853.20 }, + { 0.8, 3.66, 1581.96 }, + { 0.7, 3.75, 433.71 }, + { 0.7, 2.93, 1574.85 }, + { 0.7, 3.53, 525.76 }, + { 0.6, 4.15, 721.65 }, + { 0.6, 4.69, 81.75 }, + { 0.7, 1.96, 1272.68 }, + { 0.5, 1.57, 949.18 }, + { 0.7, 2.02, 526.51 }, + { 0.5, 4.36, 1368.66 }, + { 0.5, 4.96, 1148.25 }, + { 0.5, 4.31, 330.62 }, + { 0.6, 2.28, 551.03 }, + { 0.5, 3.87, 1361.55 }, + { 0.4, 2.95, 1038.04 }, + { 0.4, 4.08, 1471.75 }, + { 0.4, 2.22, 539.99 }, + { 0.4, 4.53, 1464.64 }, + /* 70 terms retained, 39 terms dropped, error 0.014"*T^3 */ + + /* jupiter l, T^4 */ + { 669.5, 0.8528, 7.1135 }, + { 100.0, 0.7426, 14.2271 }, + { 114.0, 3.1416, 0 }, + { 50.0, 1.653, 536.805 }, + { 43.6, 5.820, 529.691 }, + { 31.8, 4.858, 522.577 }, + { 14.7, 4.291, 515.464 }, + { 8.9, 0.71, 1059.38 }, + { 5.0, 1.30, 543.92 }, + { 4.5, 2.32, 1066.50 }, + { 4.3, 0.48, 21.34 }, + { 3.1, 3.00, 412.37 }, + { 2.1, 0.40, 639.90 }, + { 1.8, 4.91, 625.67 }, + { 1.9, 4.26, 199.07 }, + { 1.7, 4.26, 206.19 }, + { 1.4, 5.26, 1052.27 }, + { 1.2, 4.72, 95.98 }, + { 1.1, 1.29, 1589.07 }, + { 1.0, 4.78, 1045.15 }, + { 0.9, 6.06, 88.87 }, + { 0.9, 5.78, 728.76 }, + { 0.9, 4.55, 426.60 }, + { 0.8, 3.40, 419.48 }, + { 0.8, 3.55, 103.09 }, + { 0.7, 0.52, 110.21 }, + { 0.4, 5.23, 302.16 }, + { 0.4, 6.24, 956.29 }, + { 0.4, 5.25, 309.28 }, + { 0.4, 0.60, 117.32 }, + { 0.3, 4.78, 508.35 }, + { 0.3, 3.48, 323.51 }, + { 0.3, 2.96, 1596.19 }, + { 0.3, 4.33, 942.06 }, + { 0.3, 0.48, 831.86 }, + { 0.3, 1.80, 1073.61 }, + { 0.2, 0.44, 220.41 }, + { 0.2, 1.13, 1169.59 }, + { 0.2, 2.16, 1361.55 }, + { 0.2, 3.43, 1148.25 }, + { 0.2, 1.93, 2118.76 }, + { 0.2, 3.03, 1272.68 }, + /* 42 terms retained, 3 terms dropped, error 0.0042"*T^4 */ + + /* jupiter l, T^5 */ + { 49.6, 5.257, 7.114 }, + { 15.8, 5.251, 14.227 }, + { 4.3, 0.01, 536.80 }, + { 1.5, 1.10, 522.58 }, + { 0.7, 5.86, 543.92 }, + { 0.7, 0.87, 515.46 }, + { 0.8, 3.14, 0 }, + { 0.5, 0.82, 1066.50 }, + { 0.3, 5.63, 1059.38 }, + /* 9 terms retained, 1 terms dropped, error 0.0038"*T^5 */ + /* end jupiter l */ + + /* jupiter b, T^0 */ + { 2268615.7, 3.55852607, 529.69096509 }, + { 109971.6, 3.9080935, 1059.3819302 }, + { 110090.4, 0, 0 }, + { 8101.4, 3.60510, 522.57742 }, + { 6044.0, 4.25883, 1589.07290 }, + { 6437.8, 0.30627, 536.80451 }, + { 1106.9, 2.98534, 1162.47470 }, + { 941.7, 2.9362, 1052.2684 }, + { 894.1, 1.7545, 7.1135 }, + { 767.3, 2.1547, 632.7837 }, + { 944.3, 1.6752, 426.5982 }, + { 684.2, 3.6781, 213.2991 }, + { 629.2, 0.6434, 1066.4955 }, + { 835.9, 5.1788, 103.0928 }, + { 531.7, 2.7031, 110.2063 }, + { 558.5, 0.0135, 846.0828 }, + { 464.4, 1.1734, 949.1756 }, + { 431.1, 2.6083, 419.4846 }, + { 351.4, 4.6106, 2118.7639 }, + { 123.1, 3.3497, 1692.1657 }, + { 115.0, 5.0489, 316.3919 }, + { 132.2, 4.7782, 742.9901 }, + { 103.4, 2.3188, 1478.8666 }, + { 116.4, 1.3869, 323.5054 }, + { 102.4, 3.1529, 1581.9593 }, + { 103.8, 3.7010, 515.4639 }, + { 78.7, 3.983, 1265.567 }, + { 69.9, 2.560, 956.289 }, + { 55.6, 0.375, 1375.774 }, + { 52.0, 0.990, 1596.186 }, + { 55.2, 0.402, 525.759 }, + { 63.5, 4.501, 735.877 }, + { 49.7, 0.186, 543.918 }, + { 48.8, 3.573, 533.623 }, + { 28.4, 1.535, 625.670 }, + { 29.2, 5.431, 206.186 }, + /* 36 terms retained, 213 terms dropped, error 0.73" */ + + /* jupiter b, T^1 */ + { 177351.8, 5.7016649, 529.6909651 }, + { 3230.2, 5.77942, 1059.38193 }, + { 3081.4, 5.47464, 522.57742 }, + { 2211.9, 4.73477, 536.80451 }, + { 1694.2, 3.14159, 0 }, + { 346.4, 4.7460, 1052.2684 }, + { 234.3, 5.1886, 1066.4955 }, + { 196.2, 6.1855, 7.1135 }, + { 150.5, 3.9272, 1589.0729 }, + { 114.1, 3.4390, 632.7837 }, + { 96.7, 2.914, 949.176 }, + { 76.6, 2.505, 103.093 }, + { 81.7, 5.077, 1162.475 }, + { 76.6, 0.613, 419.485 }, + { 73.9, 5.500, 515.464 }, + { 49.9, 3.948, 735.877 }, + { 60.5, 5.447, 213.299 }, + { 36.6, 4.698, 543.918 }, + { 46.0, 0.539, 110.206 }, + { 45.1, 1.895, 846.083 }, + { 36.0, 6.110, 316.392 }, + { 32.0, 4.925, 1581.959 }, + { 21.0, 5.630, 1596.186 }, + { 23.2, 5.848, 323.505 }, + { 24.7, 3.941, 2118.764 }, + { 17.3, 5.653, 533.623 }, + { 16.5, 5.898, 526.510 }, + { 16.7, 5.667, 1265.567 }, + { 15.8, 4.433, 1045.155 }, + { 13.4, 4.302, 532.872 }, + { 11.7, 1.810, 956.289 }, + { 11.9, 4.301, 525.759 }, + { 9.5, 2.03, 206.19 }, + { 10.5, 6.155, 14.227 }, + { 8.4, 3.93, 1478.87 }, + { 8.1, 4.20, 1169.59 }, + { 7.7, 2.99, 942.06 }, + { 8.8, 1.56, 426.60 }, + { 8.9, 4.87, 1155.36 }, + { 7.8, 3.85, 625.67 }, + /* 40 terms retained, 101 terms dropped, error 0.21"*T */ + + /* jupiter b, T^2 */ + { 8094.1, 1.46323, 529.69097 }, + { 742.4, 0.9569, 522.5774 }, + { 813.2, 3.1416, 0 }, + { 399.0, 2.8989, 536.8045 }, + { 342.2, 1.4468, 1059.3819 }, + { 73.9, 0.407, 1052.268 }, + { 46.2, 3.480, 1066.495 }, + { 29.3, 0.991, 515.464 }, + { 29.7, 1.925, 1589.073 }, + { 22.8, 4.271, 7.114 }, + { 13.9, 2.922, 543.918 }, + { 12.1, 5.222, 632.784 }, + { 10.7, 4.880, 949.176 }, + { 6.1, 6.21, 1045.15 }, + { 5.9, 0.53, 1581.96 }, + { 5.0, 1.43, 526.51 }, + { 4.6, 0.92, 1162.47 }, + { 4.5, 4.02, 1596.19 }, + { 5.1, 6.03, 735.88 }, + { 3.6, 4.54, 110.21 }, + { 3.4, 1.39, 533.62 }, + { 3.3, 4.40, 14.23 }, + { 3.4, 0.42, 419.48 }, + { 2.9, 2.06, 316.39 }, + { 2.5, 3.98, 323.51 }, + { 3.1, 2.48, 2118.76 }, + { 3.1, 2.40, 532.87 }, + { 2.2, 4.78, 942.06 }, + { 2.1, 3.89, 426.60 }, + { 2.3, 0.37, 1155.36 }, + { 2.0, 3.90, 846.08 }, + { 1.9, 1.20, 103.09 }, + { 1.7, 1.42, 1265.57 }, + { 2.3, 0.88, 213.30 }, + { 1.8, 5.80, 625.67 }, + { 1.7, 2.24, 525.76 }, + /* 36 terms retained, 45 terms dropped, error 0.043"*T^2 */ + + /* jupiter b, T^3 */ + { 251.6, 3.3809, 529.6910 }, + { 121.7, 2.7331, 522.5774 }, + { 48.7, 1.037, 536.805 }, + { 11.0, 2.315, 1052.268 }, + { 8.1, 2.77, 515.46 }, + { 6.2, 1.78, 1066.50 }, + { 7.3, 4.25, 1059.38 }, + { 3.6, 1.13, 543.92 }, + { 2.8, 3.14, 0 }, + { 1.9, 2.29, 7.11 }, + { 1.6, 1.78, 1045.15 }, + { 0.9, 0.45, 632.78 }, + { 0.8, 0.31, 949.18 }, + { 0.7, 2.64, 14.23 }, + { 0.9, 0.33, 1589.07 }, + { 0.7, 2.37, 1581.96 }, + { 0.6, 2.48, 1596.19 }, + { 0.7, 1.53, 735.88 }, + { 0.5, 3.68, 419.48 }, + { 0.5, 0.27, 942.06 }, + { 0.5, 3.18, 526.51 }, + { 0.4, 2.88, 110.21 }, + /* 22 terms retained, 20 terms dropped, error 0.0081"*T^3 */ + + /* jupiter b, T^4 */ + { 15.1, 4.530, 522.577 }, + { 5.4, 4.47, 529.69 }, + { 4.5, 5.44, 536.80 }, + { 3.4, 0, 0 }, + { 1.8, 4.52, 515.46 }, + { 1.3, 4.20, 1052.27 }, + { 0.8, 5.59, 543.92 }, + { 0.5, 0.06, 1066.50 }, + { 0.3, 3.67, 1059.38 }, + { 0.1, 3.56, 1045.15 }, + { 0.1, 5.70, 7.11 }, + { 0.1, 1.17, 14.23 }, + /* 12 terms retained, 0 terms dropped, error 0.0017"*T^4 */ + + /* jupiter b, T^5 */ + { 1.4, 0.09, 522.58 }, + { 0.4, 0.01, 515.46 }, + { 0.3, 3.28, 536.80 }, + { 0.1, 0.34, 529.69 }, + /* 4 terms retained, 1 terms dropped, error 0.0012"*T^5 */ + /* end jupiter b */ + + /* jupiter r, T^0 */ + { 520887429.5, 0, 0 }, + { 25209327.0, 3.491086400, 529.690965095 }, + { 610599.9, 3.8411537, 1059.3819302 }, + { 282029.5, 2.5741988, 632.7837393 }, + { 187647.4, 2.0759038, 522.5774181 }, + { 86792.9, 0.710011, 419.484644 }, + { 72062.9, 0.214657, 536.804512 }, + { 65517.2, 5.979959, 316.391870 }, + { 29134.6, 1.677592, 103.092774 }, + { 30135.3, 2.161321, 949.175609 }, + { 23453.2, 3.540231, 735.876514 }, + { 22283.7, 4.193628, 1589.072895 }, + { 23947.3, 0.274579, 7.113547 }, + { 13032.6, 2.960431, 1162.474704 }, + { 9703.3, 1.90670, 206.18555 }, + { 12749.0, 2.715501, 1052.268383 }, + { 9161.4, 4.41353, 213.29910 }, + { 7894.5, 2.47908, 426.59819 }, + { 7058.0, 2.18185, 1265.56748 }, + { 6137.8, 6.26418, 846.08283 }, + { 5477.1, 5.65729, 639.89729 }, + { 3502.5, 0.56531, 1066.49548 }, + { 4136.9, 2.72220, 625.67019 }, + { 4170.0, 2.01605, 515.46387 }, + { 2500.0, 4.55182, 838.96929 }, + { 2617.0, 2.00994, 1581.95935 }, + { 1911.9, 0.85622, 412.37110 }, + { 2127.6, 6.12751, 742.99006 }, + { 1610.5, 3.08868, 1368.66025 }, + { 1479.5, 2.68026, 1478.86657 }, + { 1230.7, 1.89043, 323.50542 }, + { 1216.8, 1.80172, 110.20632 }, + { 961.1, 4.5488, 2118.7639 }, + { 885.7, 4.1479, 533.6231 }, + { 776.7, 3.6770, 728.7630 }, + { 998.6, 2.8721, 309.2783 }, + { 1015.0, 1.38673, 454.90937 }, + { 727.2, 3.9882, 1155.3612 }, + { 655.3, 2.7907, 1685.0521 }, + { 821.5, 1.5934, 1898.3512 }, + { 620.8, 4.8228, 956.2892 }, + { 654.0, 3.3815, 1692.1657 }, + { 812.0, 5.9409, 909.8187 }, + { 562.1, 0.0810, 543.9181 }, + { 542.2, 0.2836, 525.7588 }, + { 457.9, 0.1272, 1375.7738 }, + { 614.8, 2.2762, 942.0621 }, + { 435.8, 2.6027, 95.9792 }, + { 496.1, 5.5301, 380.1278 }, + { 470.0, 2.8190, 1795.2584 }, + { 445.0, 0.1462, 14.2271 }, + { 290.9, 3.8934, 1471.7530 }, + { 276.6, 2.5224, 2001.4440 }, + { 275.1, 2.9886, 526.5096 }, + { 293.9, 2.0494, 199.0720 }, + { 291.0, 6.0313, 1169.5883 }, + { 338.3, 2.7987, 1045.1548 }, + { 257.5, 6.1340, 532.8724 }, + { 319.0, 1.3480, 2214.7431 }, + { 309.4, 5.3686, 1272.6810 }, + { 345.8, 1.5640, 491.5579 }, + { 303.4, 1.1541, 5753.3849 }, + { 192.3, 0.9200, 1596.1864 }, + { 215.4, 2.6357, 2111.6503 }, + { 200.7, 2.3726, 1258.4539 }, + { 239.0, 3.5740, 835.0371 }, + { 197.1, 5.9286, 453.4249 }, + { 139.4, 3.6396, 1788.1449 }, + { 191.4, 6.2825, 983.1159 }, + { 176.6, 2.5767, 9683.5946 }, + { 123.6, 2.2616, 2317.8359 }, + { 128.2, 4.6659, 831.8557 }, + { 112.4, 0.8560, 433.7117 }, + { 128.8, 1.1057, 2531.1350 }, + { 99.4, 4.503, 518.645 }, + { 93.9, 2.726, 853.196 }, + { 106.5, 5.8146, 220.4126 }, + { 120.2, 2.9516, 3.9322 }, + { 104.0, 2.2222, 74.7816 }, + { 81.7, 3.235, 1361.547 }, + { 112.5, 4.8622, 528.2065 }, + { 79.5, 0.885, 430.530 }, + { 85.8, 2.115, 1574.846 }, + { 85.7, 2.338, 2428.042 }, + { 68.3, 3.357, 2104.537 }, + { 69.6, 3.042, 302.165 }, + { 69.8, 3.224, 305.346 }, + { 69.6, 0.205, 532.139 }, + { 57.0, 2.002, 2634.228 }, + { 77.1, 2.098, 508.350 }, + { 56.7, 3.917, 2221.857 }, + { 58.3, 5.724, 628.852 }, + { 52.5, 4.025, 527.243 }, + { 63.6, 1.100, 1364.728 }, + { 53.6, 0.874, 2847.527 }, + { 59.6, 0.958, 494.266 }, + { 58.0, 3.458, 2008.558 }, + { 41.5, 3.520, 529.739 }, + { 44.7, 1.623, 984.600 }, + { 44.9, 4.901, 2648.455 }, + { 53.2, 1.198, 760.256 }, + { 44.4, 4.426, 1063.314 }, + { 37.6, 2.930, 1677.939 }, + { 41.5, 0.322, 529.643 }, + { 42.9, 0.031, 1439.510 }, + { 46.0, 2.543, 636.716 }, + { 40.2, 4.394, 1148.248 }, + { 38.8, 4.317, 149.563 }, + { 40.3, 2.101, 2744.434 }, + { 48.9, 5.603, 2810.921 }, + { 37.1, 5.078, 1905.465 }, + { 43.9, 1.245, 621.738 }, + { 34.0, 3.094, 2420.929 }, + { 36.8, 0.842, 530.654 }, + { 31.1, 5.358, 1485.980 }, + { 39.3, 4.708, 569.048 }, + { 39.7, 2.462, 355.749 }, + { 31.5, 6.193, 3.181 }, + { 28.4, 2.485, 519.396 }, + { 32.4, 2.733, 604.473 }, + { 27.1, 3.923, 2324.949 }, + { 26.8, 1.750, 2950.620 }, + { 29.0, 1.835, 1891.238 }, + { 26.5, 0.604, 1055.450 }, + { 33.5, 0.761, 643.829 }, + { 26.6, 1.036, 405.258 }, + { 25.5, 3.463, 458.842 }, + { 32.9, 3.186, 528.728 }, + { 25.7, 0.524, 511.532 }, + { 26.0, 1.336, 330.619 }, + /* 130 terms retained, 615 terms dropped, error 6e-06 a.u. */ + + /* jupiter r, T^1 */ + { 1271801.6, 2.64937511, 529.69096509 }, + { 61661.8, 3.000763, 1059.381930 }, + { 53443.6, 3.897176, 522.577418 }, + { 31185.2, 4.882767, 536.804512 }, + { 41390.3, 0, 0 }, + { 11847.2, 2.413296, 419.484644 }, + { 9166.4, 4.75979, 7.11355 }, + { 3175.8, 2.79298, 103.09277 }, + { 3203.4, 5.21083, 735.87651 }, + { 3403.6, 3.34689, 1589.07290 }, + { 2600.0, 3.63435, 206.18555 }, + { 2412.2, 1.46947, 426.59819 }, + { 2806.1, 3.74224, 515.46387 }, + { 2676.6, 4.33053, 1052.26838 }, + { 2100.5, 3.92763, 639.89729 }, + { 1646.2, 5.30954, 1066.49548 }, + { 1641.3, 4.41629, 625.67019 }, + { 1049.9, 3.16114, 213.29910 }, + { 1024.8, 2.55433, 412.37110 }, + { 741.0, 2.1709, 1162.4747 }, + { 806.4, 2.6775, 632.7837 }, + { 676.9, 6.2495, 838.9693 }, + { 468.9, 4.7097, 543.9181 }, + { 444.7, 0.4028, 323.5054 }, + { 567.1, 4.5766, 742.9901 }, + { 415.9, 5.3684, 728.7630 }, + { 484.7, 2.4688, 949.1756 }, + { 337.6, 3.1678, 956.2892 }, + { 401.7, 4.6053, 309.2783 }, + { 347.4, 4.6815, 14.2271 }, + { 260.8, 5.3429, 846.0828 }, + { 220.1, 4.8421, 1368.6603 }, + { 203.2, 5.6000, 1155.3612 }, + { 246.6, 3.9231, 942.0621 }, + { 183.5, 4.2653, 95.9792 }, + { 180.1, 4.4017, 532.8724 }, + { 197.1, 3.7055, 2118.7639 }, + { 196.0, 3.7588, 199.0720 }, + { 200.2, 4.4389, 1045.1548 }, + { 170.2, 4.8465, 526.5096 }, + { 146.3, 6.1296, 533.6231 }, + { 133.5, 1.3225, 110.2063 }, + { 132.1, 4.5119, 525.7588 }, + { 123.9, 2.0429, 1478.8666 }, + { 121.9, 4.4058, 1169.5883 }, + { 115.3, 4.4674, 1581.9593 }, + { 98.5, 5.728, 1596.186 }, + { 91.6, 4.530, 1685.052 }, + { 110.6, 3.6250, 1272.6810 }, + { 80.5, 4.113, 1258.454 }, + { 79.6, 2.719, 1692.166 }, + { 100.2, 5.2469, 1265.5675 }, + { 77.9, 5.567, 1471.753 }, + { 85.8, 0.079, 831.856 }, + { 82.1, 3.808, 508.350 }, + { 55.3, 0.352, 316.392 }, + { 52.3, 5.531, 433.712 }, + { 55.8, 4.751, 302.165 }, + { 50.6, 4.856, 1375.774 }, + { 43.6, 4.944, 1361.547 }, + { 42.2, 1.224, 853.196 }, + { 37.7, 4.268, 2001.444 }, + { 49.4, 4.014, 220.413 }, + { 38.3, 5.330, 1788.145 }, + { 35.6, 1.762, 1795.258 }, + { 36.3, 3.850, 1574.846 }, + { 29.3, 5.166, 3.932 }, + { 25.2, 4.338, 519.396 }, + { 24.8, 2.729, 405.258 }, + { 27.0, 6.097, 1148.248 }, + { 22.6, 0.192, 380.128 }, + { 20.5, 4.329, 3.181 }, + { 19.9, 4.630, 1677.939 }, + { 19.5, 5.106, 1073.609 }, + { 18.4, 3.765, 1485.980 }, + { 18.9, 5.053, 2104.537 }, + { 17.0, 4.018, 2317.836 }, + { 16.7, 5.429, 88.866 }, + { 15.3, 2.927, 2008.558 }, + { 14.5, 3.633, 628.852 }, + { 14.6, 5.508, 721.649 }, + { 13.7, 4.876, 629.602 }, + { 18.5, 6.030, 330.619 }, + { 13.5, 1.385, 518.645 }, + { 15.7, 2.930, 1905.465 }, + { 12.5, 1.586, 2111.650 }, + { 12.3, 3.377, 635.965 }, + { 11.8, 4.085, 2648.455 }, + { 11.2, 4.626, 636.716 }, + { 14.3, 2.742, 2221.857 }, + { 11.2, 3.553, 1891.238 }, + { 13.1, 5.838, 1464.639 }, + { 11.4, 2.576, 511.532 }, + { 10.5, 0.499, 453.425 }, + { 9.7, 4.39, 1994.33 }, + { 10.1, 2.764, 423.417 }, + { 8.6, 5.16, 1056.20 }, + { 9.0, 4.79, 2420.93 }, + { 8.1, 3.73, 2634.23 }, + { 8.1, 1.29, 2428.04 }, + { 8.9, 1.86, 750.10 }, + { 8.9, 4.81, 1062.56 }, + { 8.6, 4.54, 21.34 }, + { 9.5, 4.33, 1802.37 }, + { 6.9, 5.97, 540.74 }, + { 7.3, 4.98, 1699.28 }, + { 7.1, 4.99, 1055.45 }, + { 7.2, 4.98, 1898.35 }, + { 6.5, 1.39, 422.67 }, + { 6.8, 2.91, 2324.95 }, + { 6.5, 4.57, 1038.04 }, + { 7.3, 3.02, 416.30 }, + { 6.6, 5.55, 1781.03 }, + /* 113 terms retained, 268 terms dropped, error 1.4e-06 a.u.*T */ + + /* jupiter r, T^2 */ + { 79644.8, 1.358659, 529.690965 }, + { 8251.6, 5.77774, 522.57742 }, + { 7029.9, 3.27477, 536.80451 }, + { 5314.0, 1.83835, 1059.38193 }, + { 1860.8, 2.97682, 7.11355 }, + { 836.3, 4.1989, 419.4846 }, + { 964.5, 5.4803, 515.4639 }, + { 406.5, 3.7825, 1066.4955 }, + { 426.6, 2.2275, 639.8973 }, + { 377.3, 2.2425, 1589.0729 }, + { 497.9, 3.1416, 0 }, + { 339.0, 6.1269, 625.6702 }, + { 362.9, 5.3676, 206.1855 }, + { 342.0, 6.0992, 1052.2684 }, + { 279.9, 4.2616, 412.3711 }, + { 332.6, 0.0033, 426.5982 }, + { 229.8, 0.7053, 735.8765 }, + { 200.8, 3.0685, 543.9181 }, + { 199.8, 4.4288, 103.0928 }, + { 257.3, 0.9630, 632.7837 }, + { 138.6, 2.9324, 14.2271 }, + { 113.5, 0.7871, 728.7630 }, + { 86.0, 5.144, 323.505 }, + { 94.6, 1.705, 838.969 }, + { 83.5, 0.058, 309.278 }, + { 75.2, 1.605, 956.289 }, + { 70.5, 1.510, 213.299 }, + { 80.3, 2.981, 742.990 }, + { 56.2, 0.955, 1162.475 }, + { 61.6, 6.101, 1045.155 }, + { 66.6, 5.473, 199.072 }, + { 50.1, 2.721, 532.872 }, + { 51.9, 5.584, 942.062 }, + { 39.8, 5.946, 95.979 }, + { 44.5, 5.524, 508.350 }, + { 44.3, 0.271, 526.510 }, + { 29.9, 0.936, 1155.361 }, + { 28.4, 2.878, 525.759 }, + { 26.3, 4.269, 1596.186 }, + { 27.0, 2.806, 1169.588 }, + { 27.5, 2.648, 2118.764 }, + { 22.7, 0.178, 302.165 }, + { 29.3, 1.786, 831.856 }, + { 20.0, 0.043, 949.176 }, + { 19.9, 1.161, 533.623 }, + { 21.7, 1.888, 1272.681 }, + { 17.6, 4.150, 846.083 }, + { 17.1, 5.892, 1258.454 }, + { 21.4, 4.355, 316.392 }, + { 21.3, 0.544, 1265.567 }, + { 19.9, 0.065, 1581.959 }, + { 17.0, 0.534, 1368.660 }, + { 12.8, 3.900, 433.712 }, + { 13.1, 0.795, 110.206 }, + { 11.9, 0.407, 1361.547 }, + { 11.7, 4.444, 405.258 }, + { 12.0, 2.229, 220.413 }, + { 9.6, 6.01, 853.20 }, + { 10.2, 0.995, 1471.753 }, + { 9.0, 1.60, 1692.17 }, + { 8.7, 3.52, 1073.61 }, + { 8.3, 5.60, 1574.85 }, + { 9.0, 6.27, 519.40 }, + { 7.8, 0.65, 1478.87 }, + { 7.8, 0.18, 1685.05 }, + { 7.5, 0.88, 88.87 }, + { 7.3, 0.89, 721.65 }, + { 9.1, 1.51, 1148.25 }, + { 6.1, 2.50, 3.18 }, + { 7.0, 4.44, 330.62 }, + { 5.2, 2.79, 21.34 }, + { 5.1, 2.98, 1375.77 }, + { 4.9, 0.05, 1677.94 }, + { 4.7, 2.28, 1485.98 }, + { 4.7, 0.86, 3.93 }, + { 5.3, 0.85, 1788.14 }, + { 4.2, 0.41, 629.60 }, + { 4.2, 1.61, 635.97 }, + { 3.6, 2.71, 551.03 }, + { 3.3, 0.55, 1795.26 }, + { 4.4, 1.28, 1464.64 }, + { 3.3, 1.19, 1905.46 }, + { 3.2, 6.19, 1038.04 }, + { 3.1, 6.23, 2001.44 }, + { 3.4, 2.45, 539.99 }, + { 3.2, 5.55, 191.96 }, + { 2.6, 3.24, 1062.56 }, + { 2.6, 0.55, 2104.54 }, + { 2.2, 5.33, 1891.24 }, + { 2.7, 4.82, 416.30 }, + { 2.2, 1.72, 628.85 }, + { 2.3, 6.19, 1994.33 }, + { 2.3, 4.28, 963.40 }, + { 2.6, 0.03, 1898.35 }, + { 2.1, 3.33, 1699.28 }, + { 2.5, 2.40, 227.53 }, + { 2.5, 0.07, 750.10 }, + { 2.0, 0.29, 636.72 }, + { 1.9, 0.32, 295.05 }, + { 1.9, 3.44, 647.01 }, + { 1.9, 0.29, 2111.65 }, + { 1.9, 3.14, 611.44 }, + { 2.3, 1.95, 824.74 }, + { 1.9, 4.72, 2125.88 }, + { 2.5, 1.24, 2221.86 }, + { 1.8, 1.60, 2008.56 }, + { 1.6, 5.83, 422.67 }, + { 1.7, 2.32, 440.83 }, + { 1.6, 0.37, 1056.20 }, + { 1.6, 2.42, 10.29 }, + { 1.6, 3.52, 1055.45 }, + { 1.6, 5.76, 117.32 }, + { 1.6, 5.89, 2317.84 }, + { 2.0, 4.62, 423.42 }, + { 2.1, 1.05, 1781.03 }, + { 1.9, 1.12, 618.56 }, + { 1.9, 2.79, 1802.37 }, + { 1.8, 3.01, 2648.45 }, + /* 118 terms retained, 72 terms dropped, error 3.9e-07 a.u.*T^2 */ + + /* jupiter r, T^3 */ + { 3519.3, 6.05801, 529.69097 }, + { 1073.2, 1.67321, 536.80451 }, + { 915.7, 1.4133, 522.5774 }, + { 341.6, 0.5230, 1059.3819 }, + { 254.9, 1.1963, 7.1135 }, + { 221.5, 0.9523, 515.4639 }, + { 69.1, 2.269, 1066.495 }, + { 89.7, 3.142, 0 }, + { 57.8, 1.414, 543.918 }, + { 57.7, 0.526, 639.897 }, + { 51.1, 5.980, 412.371 }, + { 46.9, 1.579, 625.670 }, + { 42.8, 6.117, 419.485 }, + { 37.5, 1.183, 14.227 }, + { 33.8, 1.667, 1052.268 }, + { 31.2, 1.043, 1589.073 }, + { 30.0, 4.632, 426.598 }, + { 33.5, 0.848, 206.186 }, + { 20.8, 2.501, 728.763 }, + { 14.5, 0.960, 508.350 }, + { 13.0, 1.502, 1045.155 }, + { 11.7, 3.555, 323.505 }, + { 12.3, 2.610, 735.877 }, + { 15.0, 0.891, 199.072 }, + { 11.2, 1.790, 309.278 }, + { 10.6, 6.278, 956.289 }, + { 9.8, 6.26, 103.09 }, + { 9.3, 3.45, 838.97 }, + { 6.7, 1.87, 302.16 }, + { 7.4, 1.28, 742.99 }, + { 7.2, 0.92, 942.06 }, + { 5.6, 1.38, 95.98 }, + { 6.8, 3.45, 831.86 }, + { 4.6, 2.83, 1596.19 }, + { 4.0, 1.21, 1169.59 }, + { 3.9, 5.99, 213.30 }, + { 3.6, 6.11, 405.26 }, + { 2.9, 2.33, 1155.36 }, + { 2.4, 1.87, 532.87 }, + { 2.4, 0.43, 220.41 }, + { 2.3, 1.95, 1073.61 }, + { 2.3, 0.09, 632.78 }, + { 2.2, 1.59, 2118.76 }, + { 2.4, 5.97, 1162.47 }, + { 2.1, 1.07, 21.34 }, + { 2.1, 1.51, 1258.45 }, + { 2.5, 0.35, 1272.68 }, + { 2.0, 5.94, 110.21 }, + { 2.0, 2.55, 88.87 }, + { 2.0, 2.16, 433.71 }, + { 2.0, 2.70, 721.65 }, + { 1.7, 4.46, 853.20 }, + { 1.9, 2.26, 1361.55 }, + { 1.7, 1.98, 525.76 }, + { 1.5, 0.12, 949.18 }, + { 2.0, 3.17, 1148.25 }, + { 1.7, 2.71, 330.62 }, + { 1.6, 0.47, 526.51 }, + { 1.2, 3.02, 963.40 }, + { 1.7, 0.44, 533.62 }, + { 1.2, 1.16, 1574.85 }, + { 1.1, 2.55, 846.08 }, + { 1.4, 1.17, 1038.04 }, + { 1.0, 2.70, 519.40 }, + { 1.4, 0.67, 551.03 }, + { 1.0, 4.17, 2627.11 }, + { 1.1, 1.07, 227.53 }, + { 0.9, 2.93, 1368.66 }, + { 0.8, 4.87, 611.44 }, + { 1.1, 1.79, 1581.96 }, + { 0.9, 4.91, 1670.83 }, + { 0.9, 3.69, 824.74 }, + { 0.8, 3.23, 2125.88 }, + { 0.8, 2.39, 2317.84 }, + { 0.9, 0.60, 539.99 }, + { 0.9, 4.52, 750.10 }, + { 0.8, 0.21, 1141.13 }, + { 0.8, 0.94, 191.96 }, + { 0.8, 2.25, 2538.25 }, + { 0.7, 0.67, 440.83 }, + { 0.7, 5.80, 1485.98 }, + { 0.6, 2.48, 1265.57 }, + { 0.6, 6.14, 1279.79 }, + { 0.6, 5.51, 2413.82 }, + { 0.6, 4.41, 1382.89 }, + { 0.6, 2.18, 1062.56 }, + { 0.6, 1.93, 2634.23 }, + { 0.5, 2.05, 295.05 }, + { 0.5, 2.32, 1471.75 }, + { 0.7, 2.27, 1699.28 }, + { 0.5, 1.96, 1677.94 }, + { 0.5, 4.36, 1692.17 }, + { 0.5, 2.50, 2207.63 }, + { 0.5, 5.77, 1478.87 }, + { 0.4, 5.99, 934.95 }, + { 0.4, 2.80, 81.75 }, + { 0.4, 3.94, 316.39 }, + { 0.5, 0.19, 10.29 }, + /* 98 terms retained, 0 terms dropped, error 1e-07 a.u.*T^3 */ + + /* jupiter r, T^4 */ + { 128.6, 0.0842, 536.8045 }, + { 113.5, 4.2486, 529.6910 }, + { 82.7, 3.298, 522.577 }, + { 37.9, 2.733, 515.464 }, + { 26.7, 5.691, 7.114 }, + { 17.6, 5.400, 1059.382 }, + { 12.6, 6.016, 543.918 }, + { 9.3, 0.77, 1066.50 }, + { 8.1, 5.68, 14.23 }, + { 6.3, 5.12, 639.90 }, + { 7.0, 1.43, 412.37 }, + { 5.4, 3.34, 625.67 }, + { 2.9, 3.40, 1052.27 }, + { 2.6, 4.16, 728.76 }, + { 2.6, 2.90, 426.60 }, + { 2.3, 6.22, 1589.07 }, + { 2.1, 3.12, 1045.15 }, + { 1.7, 2.81, 206.19 }, + { 1.8, 2.60, 199.07 }, + { 1.8, 1.89, 419.48 }, + { 1.5, 1.33, 1596.19 }, + { 1.7, 0, 0 }, + { 1.0, 4.42, 956.29 }, + { 1.2, 5.16, 831.86 }, + { 0.9, 3.17, 508.35 }, + { 0.9, 5.79, 1169.59 }, + { 0.9, 1.87, 1148.25 }, + { 1.0, 0.67, 1361.55 }, + { 0.8, 1.48, 1272.68 }, + { 1.0, 5.47, 220.41 }, + { 0.8, 2.42, 117.32 }, + { 0.7, 0.50, 1073.61 }, + { 0.7, 3.53, 302.16 }, + { 0.7, 2.85, 191.96 }, + { 0.8, 2.20, 942.06 }, + { 0.8, 5.31, 551.03 }, + { 0.7, 3.72, 88.87 }, + { 0.5, 1.83, 647.01 }, + { 0.6, 0.86, 330.62 }, + { 0.5, 5.26, 21.34 }, + { 0.6, 3.82, 618.56 }, + { 0.5, 4.44, 110.21 }, + { 0.6, 1.59, 3.18 }, + { 0.6, 1.84, 10.29 }, + { 0.5, 1.53, 405.26 }, + { 0.5, 0.24, 433.71 }, + /* 46 terms retained, 0 terms dropped, error 7.1e-08 a.u.*T^4 */ + + /* jupiter r, T^5 */ + { 11.2, 4.752, 536.805 }, + { 4.3, 5.92, 522.58 }, + { 2.1, 5.57, 515.46 }, + { 1.9, 4.30, 543.92 }, + { 1.9, 3.69, 7.11 }, + { 1.6, 5.49, 1066.50 }, + { 1.6, 4.13, 1059.38 }, + { 1.2, 3.78, 14.23 }, + { 1.0, 4.51, 529.69 }, + /* 9 terms retained, 0 terms dropped, error 6.5e-08 a.u.*T^5 */ + /* end jupiter */ +}; + +int vn_jupiter[][3] = { + /* addresses for jupiter l, b, r */ + /* T^0 */ { 0, 392, 542, }, + /* T^1 */ { 109, 428, 672, }, + /* T^2 */ { 194, 468, 785, }, + /* T^3 */ { 271, 504, 903, }, + /* T^4 */ { 341, 526, 1001, }, + /* T^5 */ { 383, 538, 1047, }, + /* end */ { 392, 542, 1056, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_mars[][3] = { + /* mars l, T^0 */ + { 620347711.6, 0, 0 }, + { 18656368.1, 5.050371003, 3340.612426700 }, + { 1108216.8, 5.40099837, 6681.22485340 }, + { 91798.4, 5.754787, 10021.837280 }, + { 27745.0, 5.970495, 3.523118 }, + { 10610.2, 2.939585, 2281.230497 }, + { 12315.9, 0.849561, 2810.921462 }, + { 8926.8, 4.15698, 0.01725 }, + { 8715.7, 6.11005, 13362.44971 }, + { 6797.6, 0.36462, 398.14900 }, + { 7774.9, 3.33969, 5621.84292 }, + { 3575.1, 1.66187, 2544.31442 }, + { 4161.1, 0.22815, 2942.46342 }, + { 3075.2, 0.85697, 191.44827 }, + { 2628.1, 0.64806, 3337.08931 }, + { 2937.5, 6.07894, 0.06731 }, + { 2389.4, 5.03896, 796.29801 }, + { 2579.8, 0.02997, 3344.13555 }, + { 1528.1, 1.14979, 6151.53389 }, + { 1798.8, 0.65634, 529.69097 }, + { 1264.4, 3.62275, 5092.15196 }, + { 1286.2, 3.06796, 2146.16542 }, + { 1546.4, 2.91580, 1751.53953 }, + { 1024.9, 3.69334, 8962.45535 }, + { 891.6, 0.1829, 16703.0621 }, + { 858.8, 2.4009, 2914.0142 }, + { 832.7, 2.4642, 3340.5952 }, + { 832.7, 4.4950, 3340.6297 }, + { 712.9, 3.6634, 1059.3819 }, + { 748.7, 3.8225, 155.4204 }, + { 723.9, 0.6750, 3738.7614 }, + { 635.6, 2.9218, 8432.7644 }, + { 655.2, 0.4886, 3127.3133 }, + { 550.5, 3.8100, 0.9803 }, + { 552.7, 4.4748, 1748.0164 }, + { 426.0, 0.5537, 6283.0758 }, + { 415.1, 0.4966, 213.2991 }, + { 472.2, 3.6255, 1194.4470 }, + { 306.6, 0.3805, 6684.7480 }, + { 312.1, 0.9985, 6677.7017 }, + { 293.2, 4.2213, 20.7754 }, + { 302.4, 4.4862, 3532.0607 }, + { 274.0, 0.5422, 3340.5451 }, + { 281.1, 5.8816, 1349.8674 }, + { 231.2, 1.2824, 3870.3034 }, + { 283.6, 5.7689, 3149.1642 }, + { 236.1, 5.7550, 3333.4989 }, + { 274.0, 0.1337, 3340.6797 }, + { 299.4, 2.7832, 6254.6267 }, + { 204.2, 2.8213, 1221.8486 }, + { 238.9, 5.3716, 4136.9104 }, + { 188.6, 1.4910, 9492.1463 }, + { 221.2, 3.5047, 382.8965 }, + { 179.2, 1.0056, 951.7184 }, + { 172.1, 0.4394, 5486.7778 }, + { 193.1, 3.3572, 3.5904 }, + { 144.3, 1.4187, 135.0651 }, + { 160.0, 3.9485, 4562.4610 }, + { 174.1, 2.4136, 553.5694 }, + { 131.0, 4.0449, 12303.0678 }, + { 138.2, 4.3015, 7.1135 }, + { 128.1, 1.8067, 5088.6288 }, + { 139.9, 3.3259, 2700.7151 }, + { 128.1, 2.2081, 1592.5960 }, + { 116.9, 3.1281, 7903.0734 }, + { 110.4, 1.0520, 242.7286 }, + { 113.5, 3.7007, 1589.0729 }, + { 100.1, 3.2434, 11773.3768 }, + { 95.6, 0.540, 20043.675 }, + { 98.9, 4.846, 6681.242 }, + { 104.5, 0.7854, 8827.3903 }, + { 84.2, 3.990, 4399.994 }, + { 86.9, 2.202, 11243.686 }, + { 71.4, 2.803, 3185.192 }, + { 72.1, 5.847, 5884.927 }, + { 73.5, 2.184, 8429.241 }, + { 98.9, 2.815, 6681.208 }, + { 68.4, 2.738, 2288.344 }, + { 86.8, 1.021, 7079.374 }, + { 65.3, 2.681, 28.449 }, + { 83.7, 3.203, 4690.480 }, + { 75.0, 0.766, 6467.926 }, + { 69.0, 3.764, 6041.328 }, + { 66.7, 0.736, 3723.509 }, + { 63.3, 4.528, 426.598 }, + { 61.7, 6.168, 2274.117 }, + { 52.3, 0.899, 9623.688 }, + { 55.5, 4.606, 4292.331 }, + { 51.3, 4.148, 3341.593 }, + { 56.6, 5.063, 15.252 }, + { 63.4, 0.913, 3553.912 }, + { 45.8, 0.788, 1990.745 }, + { 48.5, 3.957, 4535.059 }, + { 41.2, 6.020, 3894.182 }, + { 41.9, 3.583, 8031.092 }, + { 56.4, 1.687, 6872.673 }, + { 55.9, 3.463, 263.084 }, + { 51.7, 2.813, 3339.632 }, + { 40.7, 3.138, 9595.239 }, + { 38.1, 0.734, 10025.360 }, + { 39.5, 5.632, 3097.884 }, + { 44.2, 3.195, 5628.956 }, + { 36.7, 2.637, 692.158 }, + { 45.9, 0.287, 5614.729 }, + { 38.4, 5.829, 3191.049 }, + { 38.2, 2.348, 162.467 }, + { 32.6, 0.484, 6681.292 }, + { 37.1, 0.685, 2818.035 }, + { 31.2, 3.982, 20.355 }, + { 32.6, 0.893, 6681.158 }, + { 37.8, 4.155, 2803.808 }, + { 33.6, 6.120, 6489.777 }, + { 29.0, 2.427, 3319.837 }, + { 38.8, 1.352, 10018.314 }, + { 33.1, 1.140, 5.523 }, + { 27.6, 1.597, 7210.916 }, + { 28.7, 5.721, 7477.523 }, + { 34.0, 2.595, 11769.854 }, + { 25.4, 0.521, 10.637 }, + { 26.4, 1.345, 3496.033 }, + { 25.6, 0.250, 522.577 }, + { 27.3, 4.556, 3361.388 }, + { 27.5, 6.084, 6674.111 }, + { 25.5, 3.432, 3443.705 }, + /* 124 terms retained, 1093 terms dropped, error 1.2" */ + + /* mars l, T^1 */ + { 334085627474.3, 0, 0 }, + { 1458227.1, 3.60426054, 3340.61242670 }, + { 164901.3, 3.9263125, 6681.2248534 }, + { 19963.3, 4.265941, 10021.837280 }, + { 3452.4, 4.73210, 3.52312 }, + { 2485.5, 4.61278, 13362.44971 }, + { 841.6, 4.4586, 2281.2305 }, + { 537.6, 5.0159, 398.1490 }, + { 521.0, 4.9942, 3344.1355 }, + { 432.6, 2.5607, 191.4483 }, + { 429.7, 5.3165, 155.4204 }, + { 381.7, 3.5388, 796.2980 }, + { 314.1, 4.9634, 16703.0621 }, + { 282.8, 3.1597, 2544.3144 }, + { 205.7, 4.5689, 2146.1654 }, + { 168.8, 1.3289, 3337.0893 }, + { 157.6, 4.1850, 1751.5395 }, + { 133.7, 2.2333, 0.9803 }, + { 116.6, 2.2135, 1059.3819 }, + { 117.6, 6.0241, 6151.5339 }, + { 113.6, 5.4280, 3738.7614 }, + { 133.6, 5.9742, 1748.0164 }, + { 91.1, 1.096, 1349.867 }, + { 83.3, 5.296, 6684.748 }, + { 113.9, 2.1287, 1194.4470 }, + { 80.8, 4.428, 529.691 }, + { 79.5, 2.249, 8962.455 }, + { 72.5, 5.842, 242.729 }, + { 72.9, 2.502, 951.718 }, + { 71.5, 3.856, 2914.014 }, + { 85.3, 3.909, 553.569 }, + { 67.6, 5.023, 382.897 }, + { 65.1, 1.018, 3340.595 }, + { 65.1, 3.049, 3340.630 }, + { 61.5, 4.152, 3149.164 }, + { 48.5, 4.874, 213.299 }, + { 46.6, 1.315, 3185.192 }, + { 56.5, 3.888, 4136.910 }, + { 47.6, 1.182, 3333.499 }, + { 41.3, 0.714, 1592.596 }, + { 40.1, 5.316, 20043.675 }, + { 40.3, 2.725, 7.114 }, + { 32.9, 5.411, 6283.076 }, + { 28.2, 0.045, 9492.146 }, + { 22.3, 5.885, 3870.303 }, + { 22.4, 5.466, 20.355 }, + { 22.6, 0.838, 3097.884 }, + { 21.4, 5.379, 3340.545 }, + { 23.3, 6.168, 3532.061 }, + { 26.6, 3.890, 1221.849 }, + { 22.8, 1.545, 2274.117 }, + { 20.4, 2.364, 1589.073 }, + { 20.2, 3.364, 5088.629 }, + { 26.6, 5.113, 2700.715 }, + { 19.7, 2.578, 12303.068 }, + { 19.5, 0.492, 6677.702 }, + { 21.1, 3.525, 15.252 }, + { 21.4, 4.971, 3340.680 }, + { 18.5, 5.579, 1990.745 }, + { 17.8, 6.125, 4292.331 }, + { 16.5, 2.603, 3341.593 }, + { 16.6, 1.255, 3894.182 }, + { 19.5, 2.531, 4399.994 }, + { 15.0, 1.035, 2288.344 }, + { 20.0, 4.731, 4690.480 }, + { 15.4, 2.470, 4535.059 }, + { 20.0, 5.787, 7079.374 }, + { 15.3, 2.265, 3723.509 }, + { 14.7, 3.370, 6681.242 }, + { 13.5, 2.123, 5486.778 }, + { 12.9, 5.619, 10025.360 }, + { 12.7, 2.950, 3496.033 }, + { 13.6, 1.977, 5614.729 }, + { 13.0, 1.514, 5628.956 }, + { 14.7, 1.339, 6681.208 }, + { 11.4, 6.234, 135.065 }, + { 13.3, 3.422, 5621.843 }, + { 10.9, 5.282, 2818.035 }, + { 11.8, 3.127, 426.598 }, + { 10.5, 2.736, 2787.043 }, + { 11.1, 5.842, 2803.808 }, + { 11.8, 2.586, 8432.764 }, + { 11.9, 5.476, 3553.912 }, + { 8.5, 1.91, 11773.38 }, + { 9.7, 4.53, 6489.78 }, + { 8.6, 3.16, 162.47 }, + { 11.0, 4.158, 2388.894 }, + { 8.1, 1.61, 2957.72 }, + { 8.8, 4.23, 7477.52 }, + { 8.0, 5.70, 6041.33 }, + { 8.3, 2.18, 23.88 }, + { 7.7, 5.72, 9623.69 }, + { 8.7, 4.44, 5092.15 }, + { 8.4, 3.16, 3347.73 }, + { 6.7, 5.08, 8031.09 }, + { 8.7, 4.33, 3339.63 }, + { 7.4, 6.18, 3583.34 }, + { 6.4, 2.12, 5884.93 }, + /* 98 terms retained, 588 terms dropped, error 0.26"*T */ + + /* mars l, T^2 */ + { 58015.8, 2.049795, 3340.612427 }, + { 54187.6, 0, 0 }, + { 13908.4, 2.457424, 6681.224853 }, + { 2465.1, 2.80000, 10021.83728 }, + { 398.4, 3.1412, 13362.4497 }, + { 222.0, 3.1944, 3.5231 }, + { 121.0, 0.5433, 155.4204 }, + { 61.5, 3.485, 16703.062 }, + { 53.6, 3.542, 3344.136 }, + { 34.3, 6.002, 2281.230 }, + { 31.7, 4.140, 191.448 }, + { 29.8, 1.999, 796.298 }, + { 23.2, 4.334, 242.729 }, + { 21.7, 3.445, 398.149 }, + { 16.0, 6.110, 2146.165 }, + { 20.4, 5.422, 553.569 }, + { 14.9, 6.095, 3185.192 }, + { 16.2, 0.657, 0.980 }, + { 14.3, 2.619, 1349.867 }, + { 14.4, 4.019, 951.718 }, + { 11.9, 3.861, 6684.748 }, + { 15.6, 1.221, 1748.016 }, + { 11.3, 4.718, 2544.314 }, + { 13.4, 0.602, 1194.447 }, + { 10.4, 0.250, 382.897 }, + { 9.5, 0.68, 1059.38 }, + { 9.2, 3.83, 20043.67 }, + { 9.0, 3.88, 3738.76 }, + { 7.5, 5.46, 1751.54 }, + { 6.5, 5.48, 1592.60 }, + { 6.3, 2.34, 3097.88 }, + { 6.9, 2.58, 3149.16 }, + { 5.9, 1.15, 7.11 }, + { 6.7, 2.38, 4136.91 }, + { 4.6, 4.43, 6151.53 }, + { 4.2, 3.69, 5614.73 }, + { 4.8, 2.90, 3333.50 }, + { 4.0, 6.12, 5628.96 }, + { 3.7, 4.07, 1990.75 }, + { 3.6, 2.47, 529.69 }, + { 3.3, 0.68, 8962.46 }, + { 3.3, 2.80, 3894.18 }, + { 3.1, 4.57, 3496.03 }, + { 2.9, 5.41, 2914.01 }, + { 2.9, 1.23, 2787.04 }, + { 2.8, 1.39, 4292.33 }, + { 2.6, 1.04, 3341.59 }, + { 2.9, 3.41, 3337.09 }, + { 2.4, 0.96, 4535.06 }, + { 2.4, 4.85, 9492.15 }, + { 2.6, 5.75, 3340.60 }, + { 2.2, 3.26, 213.30 }, + { 2.6, 1.50, 3340.63 }, + { 2.3, 4.18, 10025.36 }, + { 2.6, 4.68, 3583.34 }, + { 2.6, 2.65, 2388.89 }, + { 1.8, 0.97, 1589.07 }, + { 2.4, 1.05, 4399.99 }, + { 2.4, 4.27, 7079.37 }, + { 2.2, 0.16, 6525.80 }, + { 2.3, 0.01, 4690.48 }, + { 1.6, 4.96, 5088.63 }, + { 1.6, 1.11, 12303.07 }, + { 2.1, 0.48, 2700.72 }, + { 1.6, 4.94, 1221.85 }, + { 1.8, 3.81, 3723.51 }, + { 1.8, 2.52, 2810.92 }, + /* 67 terms retained, 243 terms dropped, error 0.06"*T^2 */ + + /* mars l, T^3 */ + { 1482.4, 0.44435, 3340.61243 }, + { 662.1, 0.8847, 6681.2249 }, + { 188.3, 1.2880, 10021.8373 }, + { 41.5, 1.649, 13362.450 }, + { 22.7, 2.053, 155.420 }, + { 26.0, 0, 0 }, + { 8.0, 2.00, 16703.06 }, + { 10.5, 1.580, 3.523 }, + { 4.9, 2.82, 242.73 }, + { 3.8, 2.02, 3344.14 }, + { 3.2, 4.59, 3185.19 }, + { 3.1, 0.65, 553.57 }, + { 1.7, 5.54, 951.72 }, + { 1.5, 5.72, 191.45 }, + { 1.4, 0.46, 796.30 }, + { 1.4, 2.34, 20043.67 }, + { 1.3, 5.36, 0.98 }, + { 1.2, 4.15, 1349.87 }, + { 1.1, 2.38, 6684.75 }, + { 1.0, 1.77, 382.90 }, + { 0.9, 5.34, 1194.45 }, + { 0.8, 2.75, 1748.02 }, + { 0.6, 6.11, 3496.03 }, + { 0.6, 1.85, 398.15 }, + { 0.6, 5.86, 7.11 }, + { 0.6, 3.18, 3583.34 }, + { 0.5, 5.98, 2787.04 }, + { 0.5, 1.01, 3149.16 }, + { 0.5, 4.93, 6525.80 }, + { 0.4, 1.27, 2281.23 }, + { 0.4, 2.33, 3738.76 }, + { 0.5, 0.84, 4136.91 }, + /* 32 terms retained, 97 terms dropped, error 0.011"*T^3 */ + + /* mars l, T^4 */ + { 114.0, 3.1416, 0 }, + { 28.7, 5.637, 6681.225 }, + { 24.4, 5.139, 3340.612 }, + { 11.2, 6.032, 10021.837 }, + { 3.2, 3.56, 155.42 }, + { 3.3, 0.13, 13362.45 }, + { 0.8, 0.49, 16703.06 }, + { 0.8, 1.32, 242.73 }, + { 0.5, 3.06, 3185.19 }, + { 0.4, 2.16, 553.57 }, + { 0.3, 6.23, 3.52 }, + { 0.2, 0.44, 3344.14 }, + { 0.2, 0.82, 20043.67 }, + { 0.2, 3.74, 3496.03 }, + { 0.1, 1.67, 3583.34 }, + /* 15 terms retained, 21 terms dropped, error 0.0019"*T^4 */ + + /* mars l, T^5 */ + { 0.7, 4.04, 6681.22 }, + { 0.9, 3.14, 0 }, + { 0.5, 4.49, 10021.84 }, + { 0.4, 5.07, 155.42 }, + { 0.2, 3.51, 3340.61 }, + { 0.2, 4.85, 13362.45 }, + { 0.1, 6.09, 242.73 }, + /* 7 terms retained, 8 terms dropped, error 0.0012"*T^5 */ + /* end mars l */ + + /* mars b, T^0 */ + { 3197135.0, 3.76832042, 3340.61242670 }, + { 298033.2, 4.1061700, 6681.2248534 }, + { 289104.7, 0, 0 }, + { 31365.5, 4.446511, 10021.837280 }, + { 3484.1, 4.78813, 13362.44971 }, + { 443.0, 5.6523, 3337.0893 }, + { 443.4, 5.0264, 3344.1355 }, + { 399.1, 5.1306, 16703.0621 }, + { 292.5, 3.7929, 2281.2305 }, + { 182.0, 6.1365, 6151.5339 }, + { 163.2, 4.2640, 529.6910 }, + { 159.7, 2.2319, 1059.3819 }, + { 139.3, 2.4180, 8962.4553 }, + { 149.3, 2.1650, 5621.8429 }, + { 142.7, 1.1822, 3340.5952 }, + { 142.7, 3.2129, 3340.6297 }, + { 82.5, 5.367, 6684.748 }, + { 73.6, 5.092, 398.149 }, + { 72.7, 5.538, 6283.076 }, + { 86.4, 5.744, 3738.761 }, + { 83.3, 5.989, 6677.702 }, + { 60.1, 3.680, 796.298 }, + { 63.1, 0.730, 5884.927 }, + { 62.3, 4.851, 2942.463 }, + { 47.0, 5.543, 3340.545 }, + { 47.0, 5.135, 3340.680 }, + { 46.6, 5.474, 20043.675 }, + { 45.6, 2.133, 2810.921 }, + { 41.3, 0.200, 9492.146 }, + { 47.2, 4.522, 3149.164 }, + { 38.5, 4.080, 4136.910 }, + { 33.1, 4.066, 1751.540 }, + { 29.7, 5.922, 3532.061 }, + { 32.7, 2.621, 2914.014 }, + { 29.5, 2.753, 12303.068 }, + { 28.2, 2.063, 5486.778 }, + { 28.6, 4.947, 3870.303 }, + { 26.6, 3.551, 6681.242 }, + { 26.6, 1.520, 6681.208 }, + { 26.1, 2.601, 4399.994 }, + /* 40 terms retained, 401 terms dropped, error 0.69" */ + + /* mars b, T^1 */ + { 350068.8, 5.3684784, 3340.6124267 }, + { 14116.0, 3.141593, 0 }, + { 9670.8, 5.47878, 6681.22485 }, + { 1471.9, 3.20206, 10021.83728 }, + { 425.9, 3.4084, 13362.4497 }, + { 102.0, 0.7762, 3337.0893 }, + { 78.8, 3.718, 16703.062 }, + { 26.2, 2.483, 2281.230 }, + { 32.7, 3.458, 5621.843 }, + { 20.7, 1.441, 6151.534 }, + { 18.3, 6.031, 529.691 }, + { 15.7, 3.931, 8962.455 }, + { 17.0, 4.811, 3344.136 }, + { 13.1, 0.973, 6677.702 }, + { 15.6, 2.782, 3340.595 }, + { 15.6, 4.813, 3340.630 }, + { 13.8, 1.680, 3532.061 }, + { 12.7, 4.045, 20043.675 }, + { 14.3, 0.246, 2942.463 }, + { 12.5, 2.256, 5884.927 }, + { 8.8, 0.34, 398.15 }, + { 8.6, 1.75, 2544.31 }, + { 8.9, 5.95, 2810.92 }, + { 8.1, 0.84, 6283.08 }, + { 9.2, 4.35, 3496.03 }, + { 8.1, 4.30, 6684.75 }, + /* 26 terms retained, 261 terms dropped, error 0.17"*T */ + + /* mars b, T^2 */ + { 16726.7, 0.602214, 3340.612427 }, + { 4986.8, 3.14159, 0 }, + { 302.1, 5.5587, 6681.2249 }, + { 25.8, 1.897, 13362.450 }, + { 21.5, 0.917, 10021.837 }, + { 11.8, 2.242, 3337.089 }, + { 8.0, 2.25, 16703.06 }, + { 3.0, 5.89, 3496.03 }, + { 2.4, 5.19, 5621.84 }, + { 1.8, 2.59, 20043.67 }, + /* 10 terms retained, 120 terms dropped, error 0.024"*T^2 */ + + /* mars b, T^3 */ + { 606.5, 1.9805, 3340.6124 }, + { 42.6, 0, 0 }, + { 13.7, 1.796, 6681.225 }, + { 2.7, 3.45, 10021.84 }, + { 0.9, 3.75, 3337.09 }, + { 0.6, 0.11, 13362.45 }, + { 0.6, 1.14, 3496.03 }, + { 0.5, 0.71, 16703.06 }, + /* 8 terms retained, 33 terms dropped, error 0.0059"*T^3 */ + + /* mars b, T^4 */ + { 11.3, 3.457, 3340.612 }, + { 13.4, 0, 0 }, + { 0.7, 0.50, 6681.22 }, + { 0.1, 1.05, 10021.84 }, + { 0.1, 2.66, 3496.03 }, + /* 5 terms retained, 6 terms dropped, error 0.001"*T^4 */ + + /* mars b, T^5 */ + { 0.5, 4.87, 3340.61 }, + /* 1 terms retained, 4 terms dropped, error 0.0027"*T^5 */ + /* end mars b */ + + /* mars r, T^0 */ + { 153033488.3, 0, 0 }, + { 14184953.2, 3.479712835, 3340.612426700 }, + { 660776.4, 3.8178344, 6681.2248534 }, + { 46179.1, 4.155953, 10021.837280 }, + { 8109.7, 5.55958, 2810.92146 }, + { 7485.3, 1.77239, 5621.84292 }, + { 5523.2, 1.36436, 2281.23050 }, + { 3825.2, 4.49407, 13362.44971 }, + { 2306.5, 0.09082, 2544.31442 }, + { 1999.4, 5.36060, 3337.08931 }, + { 2484.4, 4.92546, 2942.46342 }, + { 1960.2, 4.74249, 3344.13555 }, + { 1167.1, 2.11262, 5092.15196 }, + { 1102.8, 5.00908, 398.14900 }, + { 899.1, 4.4079, 529.6910 }, + { 992.3, 5.8386, 6151.5339 }, + { 807.3, 2.1022, 1059.3819 }, + { 797.9, 3.4484, 796.2980 }, + { 741.0, 1.4991, 2146.1654 }, + { 692.3, 2.1338, 8962.4553 }, + { 633.1, 0.8935, 3340.5952 }, + { 725.6, 1.2452, 8432.7644 }, + { 633.1, 2.9243, 3340.6297 }, + { 574.4, 0.8290, 2914.0142 }, + { 526.2, 5.3829, 3738.7614 }, + { 630.0, 1.2874, 1751.5395 }, + { 472.8, 5.1985, 3127.3133 }, + { 348.1, 4.8322, 16703.0621 }, + { 283.7, 2.9069, 3532.0607 }, + { 279.6, 5.2575, 6283.0758 }, + { 233.8, 5.1055, 5486.7778 }, + { 219.4, 5.5834, 191.4483 }, + { 269.9, 3.7639, 5884.9268 }, + { 208.3, 5.2548, 3340.5451 }, + { 275.2, 2.9082, 1748.0164 }, + { 275.5, 1.2177, 6254.6267 }, + { 239.1, 2.0367, 1194.4470 }, + { 223.2, 4.1986, 3149.1642 }, + { 182.7, 5.0806, 6684.7480 }, + { 186.2, 5.6987, 6677.7017 }, + { 176.0, 5.9534, 3870.3034 }, + { 178.6, 4.1842, 3333.4989 }, + { 208.3, 4.8463, 3340.6797 }, + { 228.1, 3.2553, 6872.6731 }, + { 144.3, 0.2130, 5088.6288 }, + { 163.5, 3.7989, 4136.9104 }, + { 133.1, 1.5391, 7903.0734 }, + { 141.8, 2.4779, 4562.4610 }, + { 114.9, 4.3175, 1349.8674 }, + { 118.8, 2.1218, 1589.0729 }, + { 102.1, 6.1814, 9492.1463 }, + { 128.6, 5.4988, 8827.3903 }, + { 111.5, 0.5534, 11243.6858 }, + { 82.5, 1.622, 11773.377 }, + { 83.2, 0.616, 8429.241 }, + { 84.5, 0.623, 1592.596 }, + { 86.7, 1.750, 2700.715 }, + { 71.8, 2.475, 12303.068 }, + { 85.3, 1.616, 4690.480 }, + { 63.6, 2.673, 426.598 }, + { 68.6, 2.402, 4399.994 }, + { 58.6, 4.721, 213.299 }, + { 62.0, 1.101, 1221.849 }, + { 66.5, 2.213, 6041.328 }, + { 55.8, 1.233, 3185.192 }, + { 55.0, 5.727, 951.718 }, + { 52.4, 3.024, 4292.331 }, + { 55.7, 5.447, 3723.509 }, + { 59.0, 3.262, 6681.242 }, + { 44.6, 2.015, 8031.092 }, + { 59.0, 1.232, 6681.208 }, + { 42.4, 2.266, 155.420 }, + { 39.0, 2.578, 3341.593 }, + { 51.6, 5.723, 7079.374 }, + { 48.9, 5.616, 3553.912 }, + { 45.4, 5.433, 6467.926 }, + { 36.4, 4.439, 3894.182 }, + { 36.0, 1.160, 2288.344 }, + { 35.3, 5.490, 1990.745 }, + { 42.2, 1.633, 5628.956 }, + { 44.3, 5.003, 5614.729 }, + { 33.6, 5.170, 20043.675 }, + { 43.3, 1.037, 11769.854 }, + { 39.2, 1.242, 3339.632 }, + { 31.9, 4.593, 2274.117 }, + { 30.3, 2.442, 11371.705 }, + { 32.3, 2.382, 4535.059 }, + { 31.9, 4.375, 3.523 }, + { 29.3, 4.060, 3097.884 }, + { 32.0, 1.940, 382.897 }, + { 26.2, 5.585, 9623.688 }, + { 27.9, 4.258, 3191.049 }, + { 33.1, 0.855, 553.569 }, + { 27.5, 1.577, 9595.239 }, + { 25.2, 0.814, 10713.995 }, + /* 95 terms retained, 1023 terms dropped, error 4.9e-06 a.u. */ + + /* mars r, T^1 */ + { 1107433.3, 2.03250525, 3340.61242670 }, + { 103175.9, 2.3707185, 6681.2248534 }, + { 12877.2, 0, 0 }, + { 10815.9, 2.708881, 10021.837280 }, + { 1194.5, 3.04702, 13362.44971 }, + { 438.6, 2.8884, 2281.2305 }, + { 395.7, 3.4232, 3344.1355 }, + { 182.6, 1.5843, 2544.3144 }, + { 135.8, 3.3851, 16703.0621 }, + { 128.2, 0.6299, 1059.3819 }, + { 127.1, 1.9539, 796.2980 }, + { 118.4, 2.9976, 2146.1654 }, + { 128.4, 6.0434, 3337.0893 }, + { 87.5, 3.421, 398.149 }, + { 83.0, 3.856, 3738.761 }, + { 75.6, 4.451, 6151.534 }, + { 72.0, 2.764, 529.691 }, + { 66.5, 2.549, 1751.540 }, + { 54.3, 0.678, 8962.455 }, + { 51.0, 3.726, 6684.748 }, + { 66.4, 4.406, 1748.016 }, + { 47.9, 2.285, 2914.014 }, + { 49.4, 5.730, 3340.595 }, + { 49.4, 1.477, 3340.630 }, + { 57.5, 0.544, 1194.447 }, + { 48.3, 2.581, 3149.164 }, + { 36.4, 6.027, 3185.192 }, + { 37.2, 5.814, 1349.867 }, + { 36.0, 5.895, 3333.499 }, + { 31.1, 0.978, 191.448 }, + { 39.0, 2.319, 4136.910 }, + { 27.2, 5.414, 1592.596 }, + { 24.3, 3.758, 155.420 }, + { 22.8, 1.748, 5088.629 }, + { 22.3, 0.939, 951.718 }, + { 21.7, 3.836, 6283.076 }, + { 21.3, 0.780, 1589.073 }, + { 21.6, 4.569, 3532.061 }, + { 18.0, 4.219, 3870.303 }, + { 18.2, 0.413, 5486.778 }, + { 16.3, 3.808, 3340.545 }, + { 16.8, 5.549, 3097.884 }, + { 16.9, 4.537, 4292.331 }, + { 15.8, 4.757, 9492.146 }, + { 15.7, 3.724, 20043.675 }, + { 20.4, 3.135, 4690.480 }, + { 14.7, 5.953, 3894.182 }, + { 16.3, 3.399, 3340.680 }, + { 14.3, 3.999, 1990.745 }, + { 16.5, 0.968, 4399.994 }, + { 13.0, 5.142, 6677.702 }, + { 12.5, 1.032, 3341.593 }, + { 16.5, 3.539, 2700.715 }, + { 16.2, 2.349, 553.569 }, + { 13.2, 0.415, 5614.729 }, + { 11.3, 1.024, 12303.068 }, + { 12.4, 6.231, 5628.956 }, + { 12.7, 0.690, 3723.509 }, + { 11.8, 6.253, 2274.117 }, + { 10.4, 1.233, 426.598 }, + { 11.2, 1.318, 3496.033 }, + { 10.3, 0.901, 4535.059 }, + { 12.2, 4.223, 7079.374 }, + { 9.8, 3.45, 382.90 }, + { 8.6, 1.16, 2787.04 }, + { 7.9, 5.74, 2288.34 }, + { 9.2, 1.82, 6681.24 }, + { 7.8, 4.15, 6041.33 }, + { 9.2, 6.07, 6681.21 }, + { 9.0, 2.58, 2388.89 }, + { 6.8, 0.24, 11773.38 }, + { 7.1, 3.51, 8031.09 }, + { 9.2, 3.90, 3553.91 }, + { 6.7, 4.26, 242.73 }, + { 7.2, 3.70, 2818.04 }, + { 6.5, 0.04, 2957.72 }, + { 8.8, 2.20, 1221.85 }, + { 6.5, 2.12, 8429.24 }, + { 6.8, 4.05, 10025.36 }, + { 7.3, 4.27, 2803.81 }, + { 7.7, 1.01, 8432.76 }, + { 6.3, 1.90, 5621.84 }, + { 6.3, 1.60, 3347.73 }, + { 6.5, 2.76, 3339.63 }, + /* 84 terms retained, 512 terms dropped, error 1.2e-06 a.u.*T */ + + /* mars r, T^2 */ + { 44242.2, 0.479306, 3340.612427 }, + { 8138.0, 0.86998, 6681.22485 }, + { 1274.9, 1.22594, 10021.83728 }, + { 187.4, 1.5730, 13362.4497 }, + { 40.7, 1.971, 3344.136 }, + { 52.4, 3.142, 0 }, + { 26.6, 1.917, 16703.062 }, + { 17.8, 4.435, 2281.230 }, + { 11.7, 4.525, 3185.192 }, + { 10.2, 5.391, 1059.382 }, + { 9.9, 0.42, 796.30 }, + { 9.2, 4.54, 2146.17 }, + { 7.3, 3.14, 2544.31 }, + { 7.2, 2.29, 6684.75 }, + { 6.8, 5.27, 155.42 }, + { 6.5, 2.31, 3738.76 }, + { 7.8, 5.93, 1748.02 }, + { 5.8, 1.05, 1349.87 }, + { 6.7, 5.30, 1194.45 }, + { 4.7, 0.77, 3097.88 }, + { 5.4, 1.00, 3149.16 }, + { 4.4, 2.46, 951.72 }, + { 4.3, 3.90, 1592.60 }, + { 3.5, 1.85, 398.15 }, + { 3.7, 2.26, 20043.67 }, + { 3.4, 3.82, 1751.54 }, + { 4.6, 0.81, 4136.91 }, + { 3.2, 2.12, 5614.73 }, + { 3.6, 1.32, 3333.50 }, + { 2.9, 1.19, 529.69 }, + { 3.0, 2.86, 6151.53 }, + { 3.1, 4.55, 5628.96 }, + { 2.9, 1.20, 3894.18 }, + { 3.9, 3.86, 553.57 }, + { 2.8, 2.49, 1990.75 }, + { 2.7, 6.07, 4292.33 }, + { 2.7, 2.92, 3496.03 }, + { 2.4, 5.94, 2787.04 }, + { 2.3, 2.56, 191.45 }, + { 2.2, 5.37, 8962.46 }, + { 2.1, 2.75, 242.73 }, + { 2.2, 1.85, 3337.09 }, + { 2.0, 5.76, 3341.59 }, + { 2.0, 3.82, 2914.01 }, + { 1.8, 5.69, 1589.07 }, + { 1.8, 3.32, 5088.63 }, + { 2.4, 4.68, 4690.48 }, + { 2.0, 4.17, 3340.60 }, + { 2.0, 6.21, 3340.63 }, + { 1.6, 5.68, 4535.06 }, + { 2.2, 1.07, 2388.89 }, + { 2.0, 3.11, 3583.34 }, + { 2.0, 5.76, 4399.99 }, + /* 53 terms retained, 260 terms dropped, error 2.9e-07 a.u.*T^2 */ + + /* mars r, T^3 */ + { 1113.1, 5.14987, 3340.61243 }, + { 424.4, 5.6134, 6681.2249 }, + { 100.0, 5.9973, 10021.8373 }, + { 19.6, 0.076, 13362.450 }, + { 3.5, 0.43, 16703.06 }, + { 4.7, 3.14, 0 }, + { 2.9, 0.45, 3344.14 }, + { 2.4, 3.02, 3185.19 }, + { 0.7, 0.81, 6684.75 }, + { 0.5, 3.87, 1059.38 }, + { 0.6, 0.78, 20043.67 }, + { 0.5, 4.52, 3496.03 }, + { 0.5, 1.61, 3583.34 }, + { 0.4, 5.72, 3149.16 }, + /* 14 terms retained, 97 terms dropped, error 3.1e-08 a.u.*T^3 */ + + /* mars r, T^4 */ + { 19.6, 3.582, 3340.612 }, + { 16.3, 4.051, 6681.225 }, + { 5.8, 4.46, 10021.84 }, + { 1.5, 4.84, 13362.45 }, + { 0.4, 1.51, 3185.19 }, + { 0.3, 5.21, 16703.06 }, + { 0.2, 5.16, 3344.14 }, + { 0.1, 2.19, 3496.03 }, + { 0.1, 0, 0 }, + /* 9 terms retained, 19 terms dropped, error 9.4e-09 a.u.*T^4 */ + + /* mars r, T^5 */ + { 0.5, 2.48, 6681.22 }, + { 0.3, 2.92, 10021.84 }, + { 0.1, 1.77, 3340.61 }, + /* 3 terms retained, 6 terms dropped, error 4.6e-09 a.u.*T^5 */ + /* end mars */ +}; + +int vn_mars[][3] = { + /* addresses for mars l, b, r */ + /* T^0 */ { 0, 343, 433, }, + /* T^1 */ { 124, 383, 528, }, + /* T^2 */ { 222, 409, 612, }, + /* T^3 */ { 289, 419, 665, }, + /* T^4 */ { 321, 427, 679, }, + /* T^5 */ { 336, 432, 688, }, + /* end */ { 343, 433, 691, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_mercury[][3] = { + /* mercury l, T^0 */ + { 440250710.1, 0, 0 }, + { 40989415.0, 1.483020342, 26087.903141574 }, + { 5046294.2, 4.47785490, 52175.80628315 }, + { 855346.8, 1.1652032, 78263.7094247 }, + { 165590.4, 4.1196916, 104351.6125663 }, + { 34561.9, 0.779308, 130439.515708 }, + { 7583.5, 3.71348, 156527.41885 }, + { 3559.7, 1.51203, 1109.37855 }, + { 1726.0, 0.35832, 182615.32199 }, + { 1803.5, 4.10333, 5661.33205 }, + { 1364.7, 4.59918, 27197.28169 }, + { 1589.9, 2.99510, 25028.52121 }, + { 1017.3, 0.88031, 31749.23519 }, + { 714.2, 1.5414, 24978.5246 }, + { 643.8, 5.3027, 21535.9496 }, + { 404.2, 3.2823, 208703.2251 }, + { 352.4, 5.2416, 20426.5711 }, + { 343.3, 5.7653, 955.5997 }, + { 339.2, 5.8633, 25558.2122 }, + { 451.1, 6.0499, 51116.4244 }, + { 325.3, 1.3367, 53285.1848 }, + { 259.6, 0.9873, 4551.9535 }, + { 345.2, 2.7921, 15874.6176 }, + { 272.9, 2.4945, 529.6910 }, + { 234.8, 0.2667, 11322.6641 }, + { 238.8, 0.1134, 1059.3819 }, + { 264.3, 3.9171, 57837.1383 }, + { 216.6, 0.6599, 13521.7514 }, + { 183.4, 2.6288, 27043.5029 }, + { 176.0, 4.5364, 51066.4277 }, + { 181.6, 2.4341, 25661.3050 }, + { 209.0, 2.0918, 47623.8528 }, + { 172.6, 2.4520, 24498.8302 }, + { 142.3, 3.3600, 37410.5672 }, + { 137.9, 0.2910, 10213.2855 }, + { 118.2, 2.7815, 77204.3275 }, + { 96.9, 6.204, 234791.128 }, + { 125.2, 3.7208, 39609.6546 }, + { 86.8, 2.642, 51646.115 }, + { 86.7, 1.960, 46514.474 }, + { 88.3, 5.413, 26617.594 }, + { 106.4, 4.2057, 19804.8273 }, + { 90.0, 5.852, 41962.521 }, + { 85.0, 4.331, 79373.088 }, + { 69.2, 4.194, 19.670 }, + { 63.5, 3.147, 7238.676 }, + { 68.5, 0.634, 83925.041 }, + { 69.7, 3.572, 25132.303 }, + { 59.5, 2.747, 16983.996 }, + { 64.8, 0.048, 33326.579 }, + { 55.4, 4.053, 30639.857 }, + { 54.4, 3.143, 27147.285 }, + { 47.6, 5.497, 3.881 }, + { 49.6, 3.990, 6770.711 }, + { 56.5, 5.119, 73711.756 }, + { 41.8, 5.642, 53131.406 }, + { 51.5, 5.478, 50586.733 }, + { 44.7, 1.224, 77154.331 }, + { 41.9, 5.193, 6283.076 }, + { 38.0, 2.431, 12566.152 }, + { 35.6, 0.814, 32858.614 }, + { 48.0, 5.493, 51749.208 }, + { 35.4, 3.370, 36301.189 }, + { 34.0, 2.786, 14765.239 }, + { 30.6, 5.840, 43071.899 }, + { 36.0, 1.424, 2218.757 }, + { 34.0, 0.475, 65697.558 }, + { 30.8, 5.770, 103292.231 }, + { 28.5, 0.650, 426.598 }, + { 26.2, 5.242, 22645.328 }, + { 26.3, 0.648, 1589.073 }, + { 29.5, 0.698, 213.299 }, + { 27.5, 0.980, 45892.730 }, + { 26.8, 1.061, 3442.575 }, + { 27.1, 0.085, 63498.470 }, + /* 75 terms retained, 1305 terms dropped, error 0.97" */ + + /* mercury l, T^1 */ + { 2608814706222.7, 0, 0 }, + { 1126007.8, 6.21703971, 26087.90314157 }, + { 303471.4, 3.0556547, 52175.8062831 }, + { 80538.5, 6.104547, 78263.709425 }, + { 21245.0, 2.835319, 104351.612566 }, + { 5592.1, 5.82676, 130439.51571 }, + { 1472.2, 2.51845, 156527.41885 }, + { 352.2, 3.0524, 1109.3786 }, + { 388.3, 5.4804, 182615.3220 }, + { 93.5, 6.118, 27197.282 }, + { 90.6, 0.000, 24978.525 }, + { 102.7, 2.1488, 208703.2251 }, + { 51.9, 5.621, 5661.332 }, + { 44.4, 4.573, 25028.521 }, + { 28.1, 3.042, 51066.428 }, + { 22.0, 0.865, 955.600 }, + { 27.3, 5.092, 234791.128 }, + { 20.4, 3.715, 20426.571 }, + { 20.2, 0.519, 21535.950 }, + { 17.5, 5.727, 4551.953 }, + { 16.7, 1.351, 529.691 }, + { 15.3, 1.792, 11322.664 }, + { 15.4, 5.743, 19.670 }, + { 14.0, 3.594, 24498.830 }, + { 12.8, 2.696, 53285.185 }, + { 12.6, 3.895, 3.881 }, + { 12.6, 4.705, 1059.382 }, + { 8.0, 4.18, 26617.59 }, + { 7.9, 0.50, 46514.47 }, + { 8.0, 3.93, 27043.50 }, + { 7.7, 2.48, 57837.14 }, + { 8.6, 6.06, 77154.33 }, + { 6.8, 2.77, 7.11 }, + { 6.6, 5.53, 6770.71 }, + { 7.3, 1.75, 260879.03 }, + { 7.2, 2.98, 2218.76 }, + { 6.4, 2.14, 25132.30 }, + /* 37 terms retained, 802 terms dropped, error 0.16"*T */ + + /* mercury l, T^2 */ + { 53049.8, 0, 0 }, + { 16903.7, 4.690723, 26087.903142 }, + { 7396.7, 1.34736, 52175.80628 }, + { 3018.3, 4.45644, 78263.70942 }, + { 1107.4, 1.26227, 104351.61257 }, + { 378.2, 4.3200, 130439.5157 }, + { 123.0, 1.0687, 156527.4188 }, + { 38.7, 4.080, 182615.322 }, + { 14.9, 4.633, 1109.379 }, + { 11.9, 0.792, 208703.225 }, + { 5.2, 4.72, 24978.52 }, + { 3.6, 3.77, 234791.13 }, + { 2.6, 1.44, 27197.28 }, + { 2.0, 1.50, 51066.43 }, + /* 14 terms retained, 381 terms dropped, error 0.033"*T^2 */ + + /* mercury l, T^3 */ + { 188.1, 0.0347, 52175.8063 }, + { 142.2, 3.1251, 26087.9031 }, + { 96.9, 3.004, 78263.709 }, + { 43.7, 6.019, 104351.613 }, + { 35.4, 0, 0 }, + { 18.0, 2.775, 130439.516 }, + { 7.0, 5.82, 156527.42 }, + { 2.6, 2.57, 182615.32 }, + { 0.9, 5.59, 208703.23 }, + /* 9 terms retained, 144 terms dropped, error 0.012"*T^3 */ + + /* mercury l, T^4 */ + { 114.1, 3.1416, 0 }, + { 3.2, 2.03, 26087.90 }, + { 1.9, 1.42, 78263.71 }, + { 1.7, 4.50, 52175.81 }, + { 1.2, 4.50, 104351.61 }, + { 0.6, 1.27, 130439.52 }, + { 0.3, 4.31, 156527.42 }, + { 0.1, 1.06, 182615.32 }, + /* 8 terms retained, 20 terms dropped, error 0.0016"*T^4 */ + + /* mercury l, T^5 */ + { 0.9, 3.14, 0 }, + /* 1 terms retained, 12 terms dropped, error 0.0051"*T^5 */ + /* end mercury l */ + + /* mercury b, T^0 */ + { 11737529.0, 1.983574988, 26087.903141574 }, + { 2388077.0, 5.03738960, 52175.80628315 }, + { 1222839.5, 3.14159265, 0 }, + { 543251.8, 1.7964436, 78263.7094247 }, + { 129778.8, 4.8323250, 104351.6125663 }, + { 31866.9, 1.580885, 130439.515708 }, + { 7963.3, 4.60972, 156527.41885 }, + { 2014.2, 1.35324, 182615.32199 }, + { 514.0, 4.3784, 208703.2251 }, + { 207.7, 4.9177, 27197.2817 }, + { 208.6, 2.0202, 24978.5246 }, + { 132.0, 1.1191, 234791.1283 }, + { 100.5, 5.6568, 20426.5711 }, + { 121.4, 1.8127, 53285.1848 }, + { 91.6, 2.282, 25028.521 }, + { 99.2, 0.094, 51116.424 }, + { 94.6, 1.242, 31749.235 }, + { 78.8, 4.407, 57837.138 }, + { 77.7, 0.526, 1059.382 }, + { 84.3, 5.085, 51066.428 }, + { 49.9, 3.498, 5661.332 }, + { 46.5, 3.237, 77204.327 }, + { 44.8, 4.878, 79373.088 }, + { 40.8, 2.466, 46514.474 }, + { 37.4, 4.458, 4551.953 }, + { 34.1, 4.142, 260879.031 }, + { 35.9, 1.091, 1109.379 }, + { 32.0, 1.185, 83925.041 }, + { 31.0, 3.503, 21535.950 }, + { 31.8, 2.415, 47623.853 }, + { 28.7, 1.848, 77154.331 }, + { 25.8, 2.776, 27043.503 }, + { 25.2, 3.591, 27147.285 }, + /* 33 terms retained, 785 terms dropped, error 0.61" */ + + /* mercury b, T^1 */ + { 429151.4, 3.5016978, 26087.9031416 }, + { 146233.7, 3.1415927, 0 }, + { 22675.3, 0.015154, 52175.806283 }, + { 10895.0, 0.485402, 78263.709425 }, + { 6353.5, 3.42944, 104351.61257 }, + { 2495.7, 0.16051, 130439.51571 }, + { 859.6, 3.1845, 156527.4188 }, + { 277.5, 6.2102, 182615.3220 }, + { 86.2, 2.952, 208703.225 }, + { 26.1, 5.977, 234791.128 }, + { 27.7, 0.291, 27197.282 }, + { 12.8, 3.377, 53285.185 }, + { 12.7, 0.538, 24978.525 }, + { 7.8, 2.72, 260879.03 }, + { 7.5, 3.58, 51066.43 }, + /* 15 terms retained, 479 terms dropped, error 0.12"*T */ + + /* mercury b, T^2 */ + { 11830.9, 4.790656, 26087.903142 }, + { 1913.5, 0, 0 }, + { 1044.8, 1.21217, 52175.80628 }, + { 266.2, 4.4342, 78263.7094 }, + { 170.3, 1.6226, 104351.6126 }, + { 96.3, 4.800, 130439.516 }, + { 44.7, 1.608, 156527.419 }, + { 18.3, 4.669, 182615.322 }, + { 6.9, 1.43, 208703.23 }, + { 2.5, 4.47, 234791.13 }, + { 1.7, 1.83, 27197.28 }, + /* 11 terms retained, 219 terms dropped, error 0.025"*T^2 */ + + /* mercury b, T^3 */ + { 235.4, 0.3539, 26087.9031 }, + { 160.5, 0, 0 }, + { 18.9, 4.363, 52175.806 }, + { 6.4, 2.51, 78263.71 }, + { 4.6, 6.14, 104351.61 }, + { 3.1, 3.12, 130439.52 }, + { 1.7, 6.27, 156527.42 }, + { 0.9, 3.08, 182615.32 }, + /* 8 terms retained, 45 terms dropped, error 0.011"*T^3 */ + + /* mercury b, T^4 */ + { 4.3, 1.75, 26087.90 }, + { 1.0, 3.14, 0 }, + { 0.4, 4.03, 52175.81 }, + { 0.3, 0.21, 78263.71 }, + { 0.1, 3.75, 104351.61 }, + /* 5 terms retained, 10 terms dropped, error 0.0012"*T^4 */ + + /* mercury b, T^5 */ + { 0.1, 3.95, 26087.90 }, + /* 1 terms retained, 9 terms dropped, error 0.00062"*T^5 */ + /* end mercury b */ + + /* mercury r, T^0 */ + { 39528271.7, 0, 0 }, + { 7834131.8, 6.19233723, 26087.90314157 }, + { 795525.6, 2.9598969, 52175.8062831 }, + { 121281.8, 6.0106415, 78263.7094247 }, + { 21922.0, 2.778201, 104351.612566 }, + { 4354.1, 5.82895, 130439.51571 }, + { 918.2, 2.5965, 156527.4188 }, + { 260.0, 3.0282, 27197.2817 }, + { 290.0, 1.4244, 25028.5212 }, + { 201.9, 5.6473, 182615.3220 }, + { 201.5, 5.5923, 31749.2352 }, + { 142.0, 6.2526, 24978.5246 }, + { 100.1, 3.7344, 21535.9496 }, + { 77.6, 3.670, 20426.571 }, + { 63.3, 4.299, 25558.212 }, + { 63.0, 4.766, 1059.382 }, + { 66.8, 2.525, 5661.332 }, + { 75.5, 4.474, 51116.424 }, + { 48.3, 6.068, 53285.185 }, + { 45.7, 2.415, 208703.225 }, + { 35.2, 1.059, 27043.503 }, + { 40.8, 2.359, 57837.138 }, + { 44.2, 1.220, 15874.618 }, + { 33.9, 0.864, 25661.305 }, + { 37.2, 0.517, 47623.853 }, + { 30.1, 1.795, 37410.567 }, + { 28.4, 3.021, 51066.428 }, + { 30.9, 0.884, 24498.830 }, + { 26.1, 2.150, 39609.655 }, + /* 29 terms retained, 1186 terms dropped, error 2.9e-06 a.u. */ + + /* mercury r, T^1 */ + { 217347.7, 4.6561716, 26087.9031416 }, + { 44141.8, 1.423855, 52175.806283 }, + { 10094.5, 4.474663, 78263.709425 }, + { 2432.8, 1.24226, 104351.61257 }, + { 1624.4, 0, 0 }, + { 604.0, 4.2930, 130439.5157 }, + { 152.9, 1.0606, 156527.4188 }, + { 39.2, 4.111, 182615.322 }, + { 17.8, 4.544, 27197.282 }, + { 18.0, 4.712, 24978.525 }, + { 10.2, 0.879, 208703.225 }, + { 8.1, 3.01, 25028.52 }, + /* 12 terms retained, 699 terms dropped, error 5.8e-07 a.u.*T */ + + /* mercury r, T^2 */ + { 3117.9, 3.08232, 26087.90314 }, + { 1245.4, 6.15183, 52175.80628 }, + { 424.8, 2.9258, 78263.7094 }, + { 136.1, 5.9798, 104351.6126 }, + { 42.2, 2.749, 130439.516 }, + { 21.8, 3.142, 0 }, + { 12.8, 5.801, 156527.419 }, + { 3.8, 2.57, 182615.32 }, + /* 8 terms retained, 318 terms dropped, error 2.3e-07 a.u.*T^2 */ + + /* mercury r, T^3 */ + { 32.7, 1.680, 26087.903 }, + { 24.2, 4.634, 52175.806 }, + { 12.1, 1.390, 78263.709 }, + { 5.1, 4.44, 104351.61 }, + { 2.0, 1.21, 130439.52 }, + { 1.5, 3.14, 0 }, + { 0.7, 4.26, 156527.42 }, + /* 7 terms retained, 112 terms dropped, error 4.1e-08 a.u.*T^3 */ + + /* mercury r, T^4 */ + { 0.4, 0.37, 26087.90 }, + { 0.4, 3.19, 52175.81 }, + { 0.3, 6.17, 78263.71 }, + { 0.1, 2.92, 104351.61 }, + /* 4 terms retained, 14 terms dropped, error 6.7e-09 a.u.*T^4 */ + + /* mercury r, T^5 */ + /* 0 terms retained, 10 terms dropped, error 1.2e-10 a.u.*T^5 */ + /* end mercury */ +}; + +int vn_mercury[][3] = { + /* addresses for mercury l, b, r */ + /* T^0 */ { 0, 144, 217, }, + /* T^1 */ { 75, 177, 246, }, + /* T^2 */ { 112, 192, 258, }, + /* T^3 */ { 126, 203, 266, }, + /* T^4 */ { 135, 211, 273, }, + /* T^5 */ { 143, 216, 277, }, + /* end */ { 144, 217, 0, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_neptune[][3] = { + /* neptune l, T^0 */ + { 531188633.0, 0, 0 }, + { 1798475.5, 2.90101273, 38.13303564 }, + { 1019727.7, 0.48580924, 1.48447271 }, + { 124531.8, 4.8300809, 36.6485629 }, + { 42064.4, 5.410550, 2.968945 }, + { 37714.6, 6.092218, 35.164090 }, + { 33784.7, 1.244889, 76.266071 }, + { 16482.7, 0.000077, 491.557929 }, + { 9198.6, 4.93747, 39.61751 }, + { 8994.2, 0.27462, 175.16606 }, + { 4216.2, 1.98712, 73.29713 }, + { 3364.8, 1.03590, 33.67962 }, + { 2284.8, 4.20607, 4.45342 }, + { 1433.5, 2.78340, 74.78160 }, + { 900.2, 2.0761, 109.9457 }, + { 745.0, 3.1903, 71.8127 }, + { 506.2, 5.7479, 114.3991 }, + { 399.6, 0.3497, 1021.2489 }, + { 345.2, 3.4619, 41.1020 }, + { 306.3, 0.4968, 0.5213 }, + { 287.3, 4.5052, 0.0482 }, + { 323.0, 2.2482, 32.1951 }, + { 340.3, 3.3037, 77.7505 }, + { 266.6, 4.8893, 0.9632 }, + { 227.1, 1.7971, 453.4249 }, + { 244.7, 1.2469, 9.5612 }, + { 232.9, 2.5046, 137.0330 }, + { 282.2, 2.2457, 146.5943 }, + { 251.9, 5.7817, 388.4652 }, + { 150.2, 2.9971, 5.9379 }, + { 170.4, 3.3239, 108.4612 }, + { 151.4, 2.1915, 33.9402 }, + { 148.3, 0.8595, 111.4302 }, + { 118.7, 3.6771, 2.4477 }, + { 101.8, 5.7054, 0.1119 }, + { 97.9, 2.805, 8.077 }, + { 103.1, 4.4044, 70.3282 }, + { 103.3, 0.0408, 0.2606 }, + { 109.3, 2.4160, 183.2428 }, + { 73.9, 1.328, 529.691 }, + { 77.7, 4.164, 4.193 }, + { 86.4, 4.228, 490.073 }, + { 81.5, 5.199, 493.042 }, + { 71.5, 5.295, 350.332 }, + { 64.4, 3.545, 168.053 }, + { 62.6, 0.150, 182.280 }, + { 58.5, 3.501, 145.110 }, + { 48.3, 1.113, 112.915 }, + { 47.2, 4.574, 46.210 }, + { 39.1, 1.666, 213.299 }, + { 47.7, 0.129, 484.444 }, + { 46.9, 3.017, 498.671 }, + { 38.7, 2.387, 2.921 }, + { 47.0, 4.498, 173.682 }, + { 47.6, 2.584, 219.891 }, + { 44.7, 5.473, 176.651 }, + { 32.3, 3.458, 30.711 }, + { 28.2, 4.133, 6.592 }, + /* 58 terms retained, 365 terms dropped, error 0.9" */ + + /* neptune l, T^1 */ + { 3837687716.7, 0, 0 }, + { 16604.2, 4.863191, 1.484473 }, + { 15807.1, 2.279235, 38.133036 }, + { 3334.7, 3.68200, 76.26607 }, + { 1305.8, 3.67321, 2.96895 }, + { 604.8, 1.5048, 35.1641 }, + { 178.6, 3.4532, 39.6175 }, + { 106.5, 2.4513, 4.4534 }, + { 105.7, 2.7548, 33.6796 }, + { 72.7, 5.487, 36.649 }, + { 57.1, 5.216, 0.521 }, + { 57.4, 1.858, 114.399 }, + { 35.4, 4.517, 74.782 }, + { 32.2, 5.904, 77.751 }, + { 29.9, 3.670, 388.465 }, + { 28.9, 5.169, 9.561 }, + { 28.7, 5.167, 2.448 }, + { 25.5, 5.245, 168.053 }, + { 24.9, 4.732, 182.280 }, + { 20.2, 5.789, 1021.249 }, + { 19.0, 1.830, 484.444 }, + { 18.7, 1.316, 498.671 }, + { 15.1, 4.950, 137.033 }, + { 15.1, 3.987, 32.195 }, + { 10.7, 2.441, 4.193 }, + { 11.7, 4.893, 71.813 }, + { 9.6, 1.23, 5.94 }, + { 9.6, 1.89, 41.10 }, + { 9.0, 0.02, 8.08 }, + { 9.9, 6.08, 7.11 }, + { 7.6, 5.51, 73.30 }, + { 7.0, 0.62, 2.92 }, + /* 32 terms retained, 151 terms dropped, error 0.17"*T */ + + /* neptune l, T^2 */ + { 53892.6, 0, 0 }, + { 281.3, 1.1908, 38.1330 }, + { 295.7, 1.8552, 1.4845 }, + { 270.2, 5.7214, 76.2661 }, + { 23.0, 1.210, 2.969 }, + { 7.3, 0.54, 2.45 }, + { 9.1, 4.43, 35.16 }, + { 5.2, 0.67, 168.05 }, + { 5.2, 3.02, 182.28 }, + { 4.3, 3.84, 114.40 }, + { 3.9, 3.53, 484.44 }, + { 3.7, 5.90, 498.67 }, + { 3.0, 0.31, 4.45 }, + { 3.4, 0.56, 74.78 }, + { 3.3, 1.85, 175.17 }, + { 2.2, 1.89, 388.47 }, + { 2.2, 4.38, 7.11 }, + { 1.8, 3.49, 9.56 }, + { 2.5, 4.69, 491.56 }, + { 1.8, 5.12, 33.68 }, + { 2.2, 1.69, 77.75 }, + { 1.7, 2.56, 36.65 }, + /* 22 terms retained, 35 terms dropped, error 0.033"*T^2 */ + + /* neptune l, T^3 */ + { 31.3, 0, 0 }, + { 12.5, 6.044, 1.484 }, + { 14.5, 1.353, 76.266 }, + { 11.5, 6.113, 38.133 }, + { 1.4, 4.94, 2.97 }, + { 0.7, 2.36, 168.05 }, + { 0.7, 1.27, 182.28 }, + { 0.5, 5.24, 484.44 }, + { 0.5, 4.17, 498.67 }, + { 0.7, 0.56, 31.02 }, + /* 10 terms retained, 5 terms dropped, error 0.0091"*T^3 */ + + /* neptune l, T^4 */ + { 114.0, 3.1416, 0 }, + { 0.6, 3.18, 76.27 }, + /* 2 terms retained, 0 terms dropped, error 0.0043"*T^4 */ + + /* neptune l, T^5 */ + { 0.9, 3.14, 0 }, + /* 1 terms retained, 0 terms dropped, error 0.0051"*T^5 */ + /* end neptune l */ + + /* neptune b, T^0 */ + { 3088622.9, 1.44104373, 38.13303564 }, + { 27780.1, 5.912719, 76.266071 }, + { 27623.6, 0, 0 }, + { 15355.5, 2.521238, 36.648563 }, + { 15448.1, 3.508771, 39.617508 }, + { 1999.9, 1.50999, 74.78160 }, + { 1967.5, 4.37778, 1.48447 }, + { 1015.1, 3.21561, 35.16409 }, + { 605.8, 2.8025, 73.2971 }, + { 594.9, 2.1289, 41.1020 }, + { 588.8, 3.1866, 2.9689 }, + { 401.8, 4.1688, 114.3991 }, + { 254.3, 3.2712, 453.4249 }, + { 261.6, 3.7672, 213.2991 }, + { 280.0, 1.6817, 77.7505 }, + { 205.6, 4.2565, 529.6910 }, + { 140.5, 3.5297, 137.0330 }, + { 98.5, 4.168, 33.680 }, + { 51.3, 1.951, 4.453 }, + { 68.0, 4.670, 71.813 }, + { 41.9, 5.418, 111.430 }, + { 41.8, 5.948, 112.915 }, + { 30.6, 0.936, 42.586 }, + /* 23 terms retained, 149 terms dropped, error 0.62" */ + + /* neptune b, T^1 */ + { 227279.2, 3.8079309, 38.1330356 }, + { 1803.1, 1.97576, 76.26607 }, + { 1385.7, 4.82556, 36.64856 }, + { 1433.3, 3.14159, 0 }, + { 1073.3, 6.08054, 39.61751 }, + { 147.9, 3.8577, 74.7816 }, + { 136.4, 0.4776, 1.4845 }, + { 70.3, 6.188, 35.164 }, + { 51.9, 5.052, 73.297 }, + { 37.3, 4.895, 41.102 }, + { 42.6, 0.307, 114.399 }, + { 37.1, 5.760, 2.969 }, + { 26.4, 5.216, 213.299 }, + { 16.9, 4.265, 77.751 }, + { 18.7, 0.904, 453.425 }, + { 13.0, 6.177, 529.691 }, + { 10.5, 1.203, 137.033 }, + /* 17 terms retained, 65 terms dropped, error 0.18"*T */ + + /* neptune b, T^2 */ + { 9690.8, 5.57124, 38.13304 }, + { 78.8, 3.627, 76.266 }, + { 71.5, 0.455, 36.649 }, + { 58.6, 3.142, 0 }, + { 29.9, 1.607, 39.618 }, + { 6.5, 5.61, 74.78 }, + { 5.8, 2.25, 1.48 }, + { 4.3, 1.68, 35.16 }, + { 3.5, 2.39, 114.40 }, + { 2.6, 0.65, 73.30 }, + /* 10 terms retained, 15 terms dropped, error 0.036"*T^2 */ + + /* neptune b, T^3 */ + { 273.4, 1.0169, 38.1330 }, + { 2.3, 2.37, 36.65 }, + { 2.0, 5.33, 76.27 }, + { 2.4, 0, 0 }, + { 0.5, 3.22, 39.62 }, + /* 5 terms retained, 4 terms dropped, error 0.0054"*T^3 */ + + /* neptune b, T^4 */ + { 5.7, 2.67, 38.13 }, + /* 1 terms retained, 0 terms dropped, error 0.033"*T^4 */ + + /* neptune b, T^5 */ + { 0.1, 4.71, 38.13 }, + /* 1 terms retained, 0 terms dropped, error 0.00066"*T^5 */ + /* end neptune b */ + + /* neptune r, T^0 */ + { 3007013206.1, 0, 0 }, + { 27062259.5, 1.329994589, 38.133035638 }, + { 1691764.3, 3.25186139, 36.64856293 }, + { 807830.7, 5.1859284, 1.4844727 }, + { 537760.6, 4.5211390, 35.1640902 }, + { 495725.6, 1.5710565, 491.5579295 }, + { 274572.0, 1.8455226, 175.1660598 }, + { 135134.1, 3.3722061, 39.6175083 }, + { 121801.8, 5.7975444, 76.2660713 }, + { 100895.4, 0.3770275, 73.2971259 }, + { 69791.7, 3.796172, 2.968945 }, + { 46687.8, 5.749378, 33.679618 }, + { 24593.8, 0.508017, 109.945689 }, + { 16939.2, 1.594222, 71.812653 }, + { 14229.7, 1.077861, 74.781599 }, + { 12011.8, 1.920621, 1021.248895 }, + { 8394.7, 0.67817, 146.59425 }, + { 7571.8, 1.07149, 388.46516 }, + { 5720.9, 2.59060, 4.45342 }, + { 4839.7, 1.90686, 41.10198 }, + { 4483.5, 2.90573, 529.69097 }, + { 4270.2, 3.41344, 453.42489 }, + { 4353.8, 0.67986, 32.19514 }, + { 4420.8, 1.74994, 108.46122 }, + { 2881.1, 1.98600, 137.03302 }, + { 2635.5, 3.09756, 213.29910 }, + { 3380.9, 0.84811, 183.24281 }, + { 2878.9, 3.67416, 350.33212 }, + { 2306.3, 2.80963, 70.32818 }, + { 2530.1, 5.79840, 490.07346 }, + { 2523.1, 0.48631, 493.04240 }, + { 2087.3, 0.61858, 33.94025 }, + { 1976.5, 5.11703, 168.05251 }, + { 1905.3, 1.72186, 182.27961 }, + { 1654.0, 1.92783, 145.10978 }, + { 1435.1, 1.70005, 484.44438 }, + { 1403.0, 4.58914, 498.67148 }, + { 1499.2, 1.01623, 219.89138 }, + { 1398.9, 0.76220, 176.65053 }, + { 1403.4, 6.07659, 173.68159 }, + { 1128.6, 5.96661, 9.56123 }, + { 1228.3, 1.59881, 77.75054 }, + { 835.4, 3.9707, 114.3991 }, + { 811.2, 3.0026, 46.2098 }, + { 731.9, 2.1045, 181.7583 }, + { 615.8, 2.9787, 106.9767 }, + { 704.8, 1.1874, 256.5399 }, + { 502.0, 1.3866, 5.9379 }, + { 530.4, 4.2406, 111.4302 }, + { 437.1, 2.2703, 1550.9399 }, + { 400.2, 1.2561, 8.0768 }, + { 421.0, 1.8908, 30.7107 }, + { 382.5, 3.2997, 983.1159 }, + { 422.5, 5.5319, 525.4982 }, + { 355.4, 2.2785, 218.4069 }, + { 280.1, 1.5413, 98.9000 }, + { 314.5, 3.9593, 381.3516 }, + { 280.6, 4.5424, 44.7253 }, + { 267.7, 5.1332, 112.9146 }, + { 333.3, 5.7507, 39.0962 }, + { 291.6, 4.0240, 68.8437 }, + { 321.4, 1.5063, 454.9094 }, + { 309.2, 2.8545, 72.0733 }, + { 345.1, 1.3591, 293.1885 }, + { 307.4, 0.3196, 601.7643 }, + { 251.4, 3.5399, 312.1991 }, + { 248.2, 3.4108, 37.6118 }, + { 306.0, 2.7248, 6244.9428 }, + { 293.5, 4.8908, 528.2065 }, + { 234.5, 0.5923, 42.5865 }, + { 239.6, 3.1644, 143.6253 }, + { 214.5, 3.6248, 278.2588 }, + { 246.2, 1.0151, 141.2258 }, + { 174.1, 5.5501, 567.8240 }, + { 163.9, 2.1017, 2.4477 }, + { 162.9, 2.4895, 4.1928 }, + { 193.5, 1.5843, 138.5175 }, + { 155.3, 3.2843, 31.0195 }, + { 182.5, 2.4524, 255.0555 }, + { 177.8, 4.1477, 10175.1525 }, + { 174.4, 1.5304, 329.8371 }, + { 137.6, 3.3490, 0.9632 }, + { 161.0, 5.1666, 211.8146 }, + { 113.5, 4.9629, 148.0787 }, + { 128.8, 3.2552, 24.1184 }, + { 107.4, 3.2646, 1059.3819 }, + { 122.7, 5.3940, 62.2514 }, + { 120.5, 3.0805, 184.7273 }, + { 99.4, 1.929, 28.572 }, + { 97.7, 2.595, 6.592 }, + { 124.1, 3.1152, 221.3759 }, + { 124.7, 2.9704, 251.4321 }, + { 114.3, 0.2504, 594.6507 }, + { 111.0, 3.3428, 180.2739 }, + { 120.9, 1.9291, 25.6029 }, + { 104.7, 0.9488, 395.5787 }, + { 109.8, 5.4315, 494.5269 }, + { 96.9, 0.862, 1014.135 }, + { 98.7, 0.896, 488.589 }, + { 89.0, 4.781, 144.147 }, + { 107.9, 0.9870, 1124.3417 }, + { 97.1, 2.627, 291.704 }, + { 75.1, 5.889, 43.241 }, + { 93.7, 6.099, 526.722 }, + { 94.8, 0.207, 456.394 }, + { 70.0, 2.397, 426.598 }, + { 77.2, 4.211, 105.492 }, + { 89.9, 3.251, 258.024 }, + { 69.1, 4.930, 1028.362 }, + { 90.7, 1.695, 366.486 }, + { 74.2, 3.145, 82.858 }, + { 58.0, 0.862, 60.767 }, + { 78.7, 1.093, 700.664 }, + { 57.2, 0.813, 2.921 }, + { 63.4, 4.396, 149.563 }, + { 55.7, 3.890, 47.694 }, + { 56.4, 5.150, 0.521 }, + { 56.2, 5.430, 911.043 }, + { 61.7, 6.165, 1019.764 }, + { 70.5, 0.081, 40.581 }, + { 74.7, 4.859, 186.212 }, + { 61.9, 4.787, 11.046 }, + { 61.1, 0.837, 1022.733 }, + { 61.3, 5.702, 178.135 }, + { 52.9, 0.375, 27.087 }, + { 56.7, 3.523, 216.922 }, + { 48.8, 5.108, 64.960 }, + { 63.3, 4.394, 807.950 }, + { 64.1, 6.283, 7.114 }, + { 46.4, 1.347, 451.940 }, + { 60.5, 3.403, 294.673 }, + { 46.9, 0.170, 7.422 }, + { 56.8, 0.450, 140.002 }, + { 55.9, 1.068, 172.197 }, + { 53.8, 2.796, 328.353 }, + { 43.8, 6.047, 135.549 }, + { 49.5, 0.641, 41.054 }, + { 54.0, 2.918, 563.631 }, + { 43.0, 5.402, 487.365 }, + { 51.5, 0.091, 210.330 }, + { 41.9, 3.123, 29.226 }, + { 47.7, 3.907, 63.736 }, + { 41.6, 6.268, 32.716 }, + { 41.4, 4.455, 37.170 }, + { 40.7, 0.160, 79.235 }, + { 48.2, 1.842, 403.134 }, + { 36.9, 0.448, 30.056 }, + { 47.8, 0.881, 3302.479 }, + { 39.5, 3.506, 357.446 }, + { 42.1, 0.634, 343.219 }, + { 41.3, 1.364, 31.232 }, + { 42.6, 3.553, 38.654 }, + { 38.9, 5.267, 415.292 }, + { 39.0, 5.259, 386.981 }, + { 33.7, 5.244, 67.359 }, + { 40.9, 3.553, 331.322 }, + { 38.8, 1.123, 38.181 }, + { 37.5, 6.087, 35.425 }, + { 38.8, 4.679, 38.085 }, + { 38.2, 6.265, 389.950 }, + { 30.0, 4.458, 22.634 }, + { 31.4, 0.077, 12.530 }, + { 26.3, 4.596, 106.014 }, + { 27.5, 5.995, 206.186 }, + { 25.2, 4.499, 34.201 }, + { 29.0, 3.649, 253.571 }, + { 27.2, 4.379, 142.141 }, + { 30.6, 1.593, 348.848 }, + { 31.5, 1.051, 100.384 }, + { 26.3, 3.016, 365.001 }, + { 26.5, 3.614, 367.970 }, + { 25.5, 2.438, 351.817 }, + { 25.7, 2.005, 439.783 }, + { 25.4, 4.740, 1474.674 }, + /* 174 terms retained, 433 terms dropped, error 6.7e-06 a.u. */ + + /* neptune r, T^1 */ + { 236338.5, 0.7049801, 38.1330356 }, + { 13220.3, 3.320155, 1.484473 }, + { 8621.9, 6.21629, 35.16409 }, + { 2701.7, 1.88141, 39.61751 }, + { 2153.2, 5.16874, 76.26607 }, + { 2154.7, 2.09431, 2.96895 }, + { 1463.9, 1.18417, 33.67962 }, + { 1603.2, 0, 0 }, + { 1135.8, 3.91891, 36.64856 }, + { 897.6, 5.2412, 388.4652 }, + { 789.9, 0.5332, 168.0525 }, + { 760.0, 0.0205, 182.2796 }, + { 607.2, 1.0771, 1021.2489 }, + { 571.6, 3.4006, 484.4444 }, + { 560.8, 2.8869, 498.6715 }, + { 490.2, 3.4683, 137.0330 }, + { 264.1, 0.8622, 4.4534 }, + { 270.5, 3.2736, 71.8127 }, + { 203.5, 2.4182, 32.1951 }, + { 155.4, 0.3654, 41.1020 }, + { 132.8, 3.6016, 9.5612 }, + { 93.6, 0.667, 46.210 }, + { 83.3, 3.260, 98.900 }, + { 72.2, 4.477, 601.764 }, + { 69.0, 1.463, 74.782 }, + { 87.0, 5.772, 381.352 }, + { 68.7, 4.526, 70.328 }, + { 64.7, 3.855, 73.297 }, + { 68.4, 3.395, 108.461 }, + { 53.4, 5.437, 395.579 }, + { 44.5, 3.614, 2.448 }, + { 41.2, 4.739, 8.077 }, + { 48.3, 1.986, 175.166 }, + { 41.7, 4.943, 31.019 }, + { 44.1, 1.417, 1550.940 }, + { 41.2, 1.420, 490.073 }, + { 41.1, 4.863, 493.042 }, + { 36.3, 5.308, 312.199 }, + { 36.3, 0.382, 77.751 }, + { 40.6, 2.272, 529.691 }, + { 32.4, 5.911, 5.938 }, + { 31.2, 2.705, 1014.135 }, + { 32.7, 5.221, 41.054 }, + { 36.1, 4.878, 491.558 }, + { 30.2, 3.633, 30.711 }, + { 30.0, 3.308, 1028.362 }, + { 27.0, 1.776, 44.725 }, + { 27.8, 4.556, 7.114 }, + { 27.5, 0.972, 33.940 }, + { 24.9, 3.101, 144.147 }, + { 26.0, 2.997, 60.767 }, + { 21.4, 4.713, 278.259 }, + { 21.3, 0.690, 251.432 }, + { 23.7, 5.120, 176.651 }, + { 21.4, 0.863, 4.193 }, + { 23.4, 1.650, 173.682 }, + { 24.2, 3.566, 145.110 }, + { 20.2, 5.615, 24.118 }, + { 27.0, 4.143, 453.425 }, + { 24.0, 1.007, 213.299 }, + { 18.3, 1.980, 72.073 }, + { 18.3, 6.173, 189.393 }, + { 19.2, 4.652, 106.977 }, + { 17.6, 1.603, 62.251 }, + { 16.5, 1.699, 357.446 }, + { 20.1, 3.295, 114.399 }, + { 15.4, 4.388, 25.603 }, + { 19.2, 2.200, 343.219 }, + { 15.1, 3.668, 0.521 }, + { 14.0, 0.553, 129.919 }, + { 13.4, 5.858, 68.844 }, + { 15.4, 4.207, 567.824 }, + { 12.7, 3.528, 477.331 }, + { 11.7, 5.576, 31.232 }, + { 11.5, 0.891, 594.651 }, + { 10.5, 4.356, 32.716 }, + { 10.8, 5.218, 26.827 }, + { 10.1, 1.981, 40.581 }, + { 10.5, 5.273, 2.921 }, + { 9.2, 0.50, 64.96 }, + { 9.2, 0.68, 160.94 }, + { 8.7, 5.81, 6.59 }, + { 10.1, 4.512, 28.572 }, + { 10.4, 5.189, 42.586 }, + { 9.9, 3.77, 181.76 }, + { 8.3, 2.82, 43.24 }, + { 9.8, 1.49, 47.69 }, + { 7.6, 4.08, 389.95 }, + { 8.0, 2.78, 505.79 }, + { 7.4, 2.36, 11.05 }, + { 7.3, 1.62, 135.55 }, + { 9.5, 0.27, 426.60 }, + { 7.2, 0.83, 911.04 }, + { 7.0, 1.87, 206.19 }, + { 6.9, 0.84, 82.86 }, + { 7.9, 1.87, 38.65 }, + { 6.7, 3.98, 12.53 }, + { 6.4, 0.90, 487.37 }, + { 6.7, 1.34, 220.41 }, + { 7.7, 5.13, 23.91 }, + { 7.1, 6.00, 639.90 }, + { 8.3, 3.86, 37.61 }, + { 6.4, 2.42, 1059.38 }, + { 6.8, 1.97, 45.25 }, + { 6.4, 4.08, 35.69 }, + { 6.4, 0.65, 350.33 }, + /* 106 terms retained, 144 terms dropped, error 1.3e-06 a.u.*T */ + + /* neptune r, T^2 */ + { 4247.4, 5.89911, 38.13304 }, + { 217.6, 0.3458, 1.4845 }, + { 163.0, 2.2387, 168.0525 }, + { 156.3, 4.5941, 182.2796 }, + { 117.9, 5.1030, 484.4444 }, + { 112.4, 1.1900, 498.6715 }, + { 127.1, 2.8479, 35.1641 }, + { 99.5, 3.416, 175.166 }, + { 64.8, 3.462, 388.465 }, + { 77.3, 0.017, 491.558 }, + { 49.5, 4.070, 76.266 }, + { 39.3, 6.095, 1021.249 }, + { 36.5, 5.171, 137.033 }, + { 37.1, 5.973, 2.969 }, + { 30.5, 3.583, 33.680 }, + { 21.1, 0.768, 36.649 }, + { 13.9, 3.592, 395.579 }, + { 13.1, 5.093, 98.900 }, + { 11.4, 1.181, 381.352 }, + { 9.1, 2.35, 601.76 }, + { 8.5, 5.25, 2.45 }, + { 8.1, 4.96, 4.45 }, + { 7.4, 4.47, 189.39 }, + { 7.2, 1.92, 9.56 }, + { 7.3, 1.66, 1028.36 }, + { 8.1, 5.84, 220.41 }, + { 9.7, 0, 0 }, + { 6.6, 0.69, 144.15 }, + { 7.8, 1.14, 1059.38 }, + { 5.7, 6.25, 74.78 }, + { 5.6, 5.23, 46.21 }, + { 5.5, 4.59, 1014.14 }, + { 5.2, 5.23, 477.33 }, + { 5.5, 3.50, 183.76 }, + { 4.9, 3.53, 39.62 }, + { 4.8, 2.08, 41.10 }, + { 5.1, 0.20, 166.57 }, + { 4.8, 1.18, 169.54 }, + { 4.7, 1.51, 73.30 }, + { 6.1, 6.18, 71.81 }, + { 4.6, 3.92, 587.54 }, + { 5.8, 2.24, 176.65 }, + { 4.5, 2.84, 7.11 }, + { 4.3, 0.52, 446.31 }, + { 3.9, 0.26, 1550.94 }, + { 4.5, 3.01, 129.92 }, + { 3.7, 2.38, 160.94 }, + { 3.8, 3.79, 111.43 }, + { 4.1, 1.70, 983.12 }, + { 3.3, 1.08, 505.79 }, + { 4.0, 0.31, 494.74 }, + { 4.0, 5.97, 488.38 }, + { 3.9, 4.86, 60.77 }, + { 3.0, 2.02, 822.18 }, + { 4.0, 1.08, 374.24 }, + { 3.8, 5.23, 350.33 }, + { 2.8, 6.18, 704.86 }, + { 3.5, 0.79, 274.07 }, + { 2.8, 1.32, 386.98 }, + { 2.8, 5.37, 251.43 }, + { 3.1, 5.13, 426.60 }, + { 3.3, 5.61, 1124.34 }, + { 2.6, 0.68, 312.20 }, + { 2.6, 3.56, 567.82 }, + { 2.6, 1.46, 1035.48 }, + { 2.5, 5.19, 1227.43 }, + { 2.5, 4.12, 171.23 }, + { 2.5, 2.72, 179.10 }, + { 2.3, 0.96, 1019.76 }, + { 2.5, 0.70, 707.78 }, + { 2.5, 4.60, 693.55 }, + { 2.3, 0.74, 976.00 }, + /* 72 terms retained, 0 terms dropped, error 3.8e-07 a.u.*T^2 */ + + /* neptune r, T^3 */ + { 166.3, 4.5524, 38.1330 }, + { 22.4, 3.948, 168.053 }, + { 21.3, 2.863, 182.280 }, + { 16.2, 0.542, 484.444 }, + { 15.6, 5.757, 498.671 }, + { 11.9, 4.403, 1.484 }, + { 6.4, 5.19, 31.02 }, + { 3.7, 5.91, 1007.02 }, + { 3.7, 1.63, 388.47 }, + { 3.2, 0.70, 1558.05 }, + { 3.2, 1.88, 522.58 }, + { 3.3, 2.94, 76.27 }, + { 2.7, 1.87, 402.69 }, + { 3.2, 0.79, 536.80 }, + { 2.6, 5.77, 343.22 }, + { 2.6, 4.65, 500.16 }, + { 2.5, 4.79, 482.96 }, + { 2.5, 1.73, 395.58 }, + { 2.7, 2.21, 446.31 }, + { 2.4, 5.77, 485.93 }, + { 2.9, 6.20, 815.06 }, + { 2.3, 3.67, 497.19 }, + /* 22 terms retained, 0 terms dropped, error 2.2e-07 a.u.*T^3 */ + + /* neptune r, T^4 */ + { 4.2, 2.40, 477.33 }, + { 4.3, 0.10, 395.58 }, + { 3.5, 4.78, 1028.36 }, + { 3.2, 3.88, 505.79 }, + { 3.0, 1.04, 189.39 }, + { 2.3, 1.11, 182.28 }, + { 2.3, 5.68, 168.05 }, + /* 7 terms retained, 0 terms dropped, error 1.3e-07 a.u.*T^4 */ + /* end neptune */ +}; + +int vn_neptune[][3] = { + /* addresses for neptune l, b, r */ + /* T^0 */ { 0, 125, 182, }, + /* T^1 */ { 58, 148, 356, }, + /* T^2 */ { 90, 165, 462, }, + /* T^3 */ { 112, 175, 534, }, + /* T^4 */ { 122, 180, 556, }, + /* T^5 */ { 124, 181, 563, }, + /* end */ { 125, 182, 0, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_saturn[][3] = { + /* saturn l, T^0 */ + { 87401354.0, 0, 0 }, + { 11107659.8, 3.962050902, 213.299095438 }, + { 1414151.0, 4.58581516, 7.11354700 }, + { 398379.4, 0.5211203, 206.1855484 }, + { 350769.2, 3.3032990, 426.5981909 }, + { 206816.3, 0.2465837, 103.0927742 }, + { 79271.3, 3.840071, 220.412642 }, + { 23990.3, 4.669769, 110.206321 }, + { 16573.6, 0.437191, 419.484644 }, + { 14907.0, 5.769033, 316.391870 }, + { 15820.3, 0.938090, 632.783739 }, + { 14609.6, 1.565186, 3.932153 }, + { 13160.3, 4.448912, 14.227094 }, + { 15053.5, 2.716700, 639.897286 }, + { 13005.3, 5.981191, 11.045700 }, + { 10725.1, 3.129396, 202.253395 }, + { 5863.2, 0.23657, 529.69097 }, + { 5227.8, 4.20783, 3.18139 }, + { 6126.3, 1.76328, 277.03499 }, + { 5019.7, 3.17788, 433.71174 }, + { 4592.5, 0.61976, 199.07200 }, + { 4005.9, 2.24480, 63.73590 }, + { 2953.8, 0.98280, 95.97923 }, + { 3873.7, 3.22283, 138.51750 }, + { 2461.2, 2.03164, 735.87651 }, + { 3269.5, 0.77492, 949.17561 }, + { 1758.1, 3.26581, 522.57742 }, + { 1640.2, 5.50505, 846.08283 }, + { 1391.3, 4.02332, 323.50542 }, + { 1580.6, 4.37266, 309.27832 }, + { 1123.5, 2.83727, 415.55249 }, + { 1017.3, 3.71698, 227.52619 }, + { 848.6, 3.1915, 209.3669 }, + { 1087.2, 4.18343, 2.44768 }, + { 956.8, 0.5074, 1265.5675 }, + { 789.2, 5.0075, 0.9632 }, + { 687.0, 1.7471, 1052.2684 }, + { 654.5, 1.5989, 0.0482 }, + { 748.8, 2.1440, 853.1964 }, + { 634.0, 2.2989, 412.3711 }, + { 743.6, 5.2528, 224.3448 }, + { 852.7, 3.4214, 175.1661 }, + { 579.9, 3.0926, 74.7816 }, + { 624.9, 0.9705, 210.1177 }, + { 529.9, 4.4494, 117.3199 }, + { 542.6, 1.5182, 9.5612 }, + { 474.3, 5.4753, 742.9901 }, + { 448.5, 1.2899, 127.4718 }, + { 546.4, 2.1268, 350.3321 }, + { 478.1, 2.9649, 137.0330 }, + { 354.9, 3.0129, 838.9693 }, + { 451.8, 1.0444, 490.3341 }, + { 347.4, 1.5393, 340.7709 }, + { 343.5, 0.2460, 0.5213 }, + { 309.0, 3.4949, 216.4805 }, + { 322.2, 0.9614, 203.7379 }, + { 372.3, 2.2782, 217.2312 }, + { 321.5, 2.5718, 647.0108 }, + { 330.2, 0.2472, 1581.9593 }, + { 249.1, 1.4701, 1368.6603 }, + { 286.7, 2.3704, 351.8166 }, + { 220.2, 4.2042, 200.7689 }, + { 277.8, 0.4002, 211.8146 }, + { 204.5, 6.0108, 265.9893 }, + { 207.7, 0.4835, 1162.4747 }, + { 208.7, 1.3452, 625.6702 }, + { 182.5, 5.4912, 2.9208 }, + { 226.6, 4.9100, 12.5302 }, + { 207.7, 1.2830, 39.3569 }, + { 173.9, 1.8631, 0.7508 }, + { 184.7, 3.5034, 149.5632 }, + { 183.5, 0.9725, 4.1928 }, + { 146.1, 6.2310, 195.1398 }, + { 164.5, 0.4401, 5.4166 }, + { 147.5, 1.5353, 5.6291 }, + { 139.7, 4.2945, 21.3406 }, + { 131.3, 4.0683, 10.2949 }, + { 117.3, 2.6792, 1155.3612 }, + { 149.3, 5.7359, 52.6902 }, + { 122.4, 1.9759, 4.6659 }, + { 113.7, 5.5943, 1059.3819 }, + { 102.7, 1.1975, 1685.0521 }, + { 118.2, 5.3407, 554.0700 }, + { 109.3, 3.4381, 536.8045 }, + { 110.4, 0.1660, 1.4845 }, + { 125.0, 6.2774, 1898.3512 }, + { 89.9, 5.804, 114.138 }, + { 104.0, 2.1921, 88.8657 }, + { 112.4, 1.1050, 191.2077 }, + { 106.6, 4.0116, 956.2892 }, + { 91.4, 1.875, 38.133 }, + { 83.8, 5.488, 0.112 }, + { 83.5, 2.290, 628.852 }, + { 97.0, 4.537, 302.165 }, + { 100.6, 4.9651, 269.9214 }, + { 75.5, 2.180, 728.763 }, + { 96.3, 2.833, 275.551 }, + { 82.4, 3.055, 440.825 }, + { 73.9, 5.089, 1375.774 }, + { 71.6, 5.109, 65.220 }, + { 70.4, 4.868, 0.212 }, + { 69.8, 3.710, 14.978 }, + { 88.8, 3.863, 278.519 }, + { 68.1, 0.734, 1478.867 }, + { 66.5, 0.027, 70.849 }, + { 65.7, 2.022, 142.450 }, + { 75.8, 1.614, 284.149 }, + { 63.2, 3.495, 479.288 }, + { 62.5, 2.587, 422.666 }, + { 69.3, 3.440, 515.464 }, + { 79.0, 4.452, 35.425 }, + { 63.7, 3.317, 62.251 }, + { 52.9, 5.514, 0.261 }, + { 53.0, 3.185, 8.077 }, + { 54.5, 2.457, 22.091 }, + { 50.5, 4.267, 99.161 }, + { 55.2, 0.968, 942.062 }, + { 49.3, 2.386, 1471.753 }, + { 47.2, 2.025, 312.199 }, + { 61.1, 1.503, 210.851 }, + { 45.1, 0.931, 2001.444 }, + { 60.6, 2.687, 388.465 }, + { 43.5, 2.526, 288.081 }, + { 42.5, 3.818, 330.619 }, + { 39.9, 5.714, 408.439 }, + { 50.1, 6.032, 2214.743 }, + { 45.9, 0.542, 212.336 }, + { 54.2, 0.782, 191.958 }, + { 47.0, 4.599, 437.644 }, + { 42.4, 1.901, 430.530 }, + { 39.7, 1.633, 1066.495 }, + { 36.3, 0.848, 213.347 }, + { 35.5, 4.186, 215.747 }, + { 36.3, 3.933, 213.251 }, + { 38.0, 0.313, 423.417 }, + { 44.7, 1.125, 6.150 }, + { 37.9, 1.198, 2.708 }, + { 43.4, 1.374, 563.631 }, + { 43.8, 3.930, 525.498 }, + { 34.8, 1.016, 203.004 }, + { 31.8, 1.693, 0.160 }, + { 30.9, 6.135, 417.037 }, + { 36.4, 6.006, 18.159 }, + { 29.0, 1.197, 404.507 }, + { 32.8, 0.536, 107.025 }, + { 30.4, 0.723, 222.860 }, + { 32.6, 0.812, 1795.258 }, + { 37.8, 3.697, 1272.681 }, + { 27.7, 1.457, 7.162 }, + { 27.2, 1.897, 1045.155 }, + { 37.7, 4.520, 24.379 }, + { 34.9, 4.461, 214.262 }, + { 32.6, 0.664, 692.587 }, + { 30.3, 5.304, 33.940 }, + { 27.5, 6.227, 1.272 }, + { 26.7, 4.567, 7.065 }, + { 31.7, 5.498, 56.622 }, + { 28.1, 5.644, 128.956 }, + { 32.0, 5.223, 92.047 }, + { 27.0, 0.067, 205.222 }, + { 31.8, 5.592, 6069.777 }, + { 31.0, 0.372, 703.633 }, + { 29.4, 0.147, 131.404 }, + { 26.2, 5.413, 140.002 }, + { 25.7, 4.360, 32.243 }, + /* 165 terms retained, 987 terms dropped, error 1.4" */ + + /* saturn l, T^1 */ + { 21354295596.0, 0, 0 }, + { 1296855.0, 1.82820545, 213.29909544 }, + { 564347.6, 2.8850014, 7.1135470 }, + { 98323.0, 1.080701, 426.598191 }, + { 107678.8, 2.2776991, 206.1855484 }, + { 40254.6, 2.041283, 220.412642 }, + { 19941.7, 1.279547, 103.092774 }, + { 10511.7, 2.748804, 14.227094 }, + { 6939.2, 0.40493, 639.89729 }, + { 4803.3, 2.44194, 419.48464 }, + { 4056.3, 2.92167, 110.20632 }, + { 3768.6, 3.64966, 3.93215 }, + { 3384.7, 2.41694, 3.18139 }, + { 3302.2, 1.26256, 433.71174 }, + { 3071.4, 2.32739, 199.07200 }, + { 1953.0, 3.56395, 11.04570 }, + { 1249.3, 2.62804, 95.97923 }, + { 921.7, 1.9609, 227.5262 }, + { 705.6, 4.4169, 529.6910 }, + { 649.7, 6.1742, 202.2534 }, + { 627.6, 6.1109, 309.2783 }, + { 486.8, 6.0400, 853.1964 }, + { 468.4, 4.6171, 63.7359 }, + { 478.5, 4.9878, 522.5774 }, + { 417.0, 2.1171, 323.5054 }, + { 407.6, 1.2995, 209.3669 }, + { 343.8, 3.9585, 412.3711 }, + { 339.7, 3.6340, 316.3919 }, + { 335.9, 3.7717, 735.8765 }, + { 331.9, 2.8608, 210.1177 }, + { 352.5, 2.3171, 632.7837 }, + { 289.4, 2.7326, 117.3199 }, + { 265.8, 0.5434, 647.0108 }, + { 230.5, 1.6443, 216.4805 }, + { 280.9, 5.7440, 2.4477 }, + { 191.7, 2.9651, 224.3448 }, + { 172.9, 4.0770, 846.0828 }, + { 167.1, 2.5975, 21.3406 }, + { 136.3, 2.2858, 10.2949 }, + { 131.4, 3.4411, 742.9901 }, + { 127.8, 4.0953, 217.2312 }, + { 108.9, 6.1614, 415.5525 }, + { 93.9, 3.484, 1052.268 }, + { 92.5, 3.948, 88.866 }, + { 97.6, 4.728, 838.969 }, + { 86.6, 1.220, 440.825 }, + { 83.5, 3.113, 625.670 }, + { 77.6, 6.244, 302.165 }, + { 61.6, 1.828, 195.140 }, + { 61.9, 4.293, 127.472 }, + { 67.1, 0.290, 4.666 }, + { 56.9, 5.019, 137.033 }, + { 54.2, 5.126, 490.334 }, + { 54.6, 0.284, 74.782 }, + { 51.4, 1.458, 536.805 }, + { 65.8, 5.648, 9.561 }, + { 57.8, 2.476, 191.958 }, + { 44.4, 2.709, 5.417 }, + { 46.8, 1.177, 149.563 }, + { 40.4, 3.889, 728.763 }, + { 37.8, 2.534, 12.530 }, + { 46.6, 5.148, 515.464 }, + { 45.9, 2.232, 956.289 }, + { 40.4, 0.413, 269.921 }, + { 37.2, 3.782, 2.921 }, + { 33.8, 3.211, 1368.660 }, + { 38.0, 0.647, 422.666 }, + { 32.9, 0.301, 351.817 }, + { 33.0, 5.430, 1066.495 }, + { 30.3, 2.841, 203.004 }, + { 35.1, 6.084, 5.629 }, + { 29.7, 3.391, 1059.382 }, + { 33.2, 4.641, 277.035 }, + { 31.9, 4.386, 1155.361 }, + { 28.9, 2.026, 330.619 }, + { 28.3, 2.742, 265.989 }, + { 30.1, 6.187, 284.149 }, + { 31.3, 2.435, 52.690 }, + { 26.5, 4.512, 340.771 }, + { 22.0, 5.144, 4.193 }, + { 22.2, 1.965, 203.738 }, + { 20.8, 6.160, 860.310 }, + { 21.7, 2.676, 942.062 }, + { 22.6, 5.886, 210.851 }, + { 19.8, 2.313, 437.644 }, + { 19.4, 4.766, 70.849 }, + { 19.3, 4.102, 18.159 }, + { 22.7, 4.137, 191.208 }, + { 18.2, 0.903, 429.780 }, + { 17.7, 1.850, 234.640 }, + { 17.5, 2.447, 423.417 }, + { 15.4, 4.238, 1162.475 }, + { 14.6, 3.597, 1045.155 }, + { 14.1, 2.943, 1685.052 }, + { 16.3, 4.057, 949.176 }, + { 13.3, 6.245, 38.133 }, + { 15.9, 1.064, 56.622 }, + { 14.1, 1.435, 408.439 }, + { 13.1, 5.758, 138.517 }, + { 15.8, 5.594, 6.150 }, + { 15.0, 5.772, 22.091 }, + { 16.0, 1.939, 1272.681 }, + { 16.8, 5.967, 628.852 }, + { 12.8, 4.247, 405.258 }, + { 13.6, 4.099, 1471.753 }, + { 15.1, 0.741, 200.769 }, + { 11.0, 1.550, 223.594 }, + { 11.7, 1.812, 124.433 }, + { 10.3, 3.468, 1375.774 }, + { 12.1, 1.857, 131.404 }, + { 10.1, 2.382, 107.025 }, + { 9.9, 3.95, 430.53 }, + { 9.8, 2.55, 99.91 }, + { 10.6, 5.367, 215.747 }, + { 12.1, 4.845, 831.856 }, + { 10.2, 6.077, 32.243 }, + { 9.2, 3.65, 142.45 }, + { 9.0, 1.24, 106.27 }, + { 9.3, 5.81, 7.16 }, + { 9.7, 1.39, 145.63 }, + { 8.4, 4.42, 703.63 }, + { 8.4, 5.64, 62.25 }, + { 8.2, 2.42, 1258.45 }, + { 7.8, 0.53, 654.12 }, + { 7.6, 3.75, 312.20 }, + { 7.2, 0.28, 0.75 }, + { 8.2, 6.22, 14.98 }, + { 7.1, 0.53, 388.47 }, + { 6.6, 3.49, 35.42 }, + { 9.0, 4.95, 208.63 }, + { 9.0, 0.08, 288.08 }, + { 6.4, 3.33, 1361.55 }, + { 6.5, 2.89, 114.14 }, + { 6.7, 0.24, 8.08 }, + { 7.3, 4.85, 222.86 }, + { 6.3, 3.81, 1788.14 }, + { 6.9, 2.05, 99.16 }, + { 6.6, 5.83, 483.22 }, + /* 138 terms retained, 504 terms dropped, error 0.32"*T */ + + /* saturn l, T^2 */ + { 116441.2, 1.1798785, 7.1135470 }, + { 91920.8, 0.074253, 213.299095 }, + { 90592.3, 0, 0 }, + { 15276.9, 4.064920, 206.185548 }, + { 10631.4, 0.257783, 220.412642 }, + { 10605.0, 5.409636, 426.598191 }, + { 4265.4, 1.04596, 14.22709 }, + { 1215.5, 2.91860, 103.09277 }, + { 1164.7, 4.60942, 639.89729 }, + { 1082.0, 5.69130, 433.71174 }, + { 1020.1, 0.63369, 3.18139 }, + { 1044.8, 4.04206, 199.07200 }, + { 633.6, 4.3883, 419.4846 }, + { 549.3, 5.5730, 3.9322 }, + { 456.9, 1.2684, 110.2063 }, + { 425.1, 0.2094, 227.5262 }, + { 273.7, 4.2884, 95.9792 }, + { 161.6, 1.3814, 11.0457 }, + { 129.5, 1.5659, 309.2783 }, + { 117.0, 3.8812, 853.1964 }, + { 105.4, 4.9000, 647.0108 }, + { 101.0, 0.8927, 21.3406 }, + { 95.2, 5.626, 412.371 }, + { 81.9, 1.025, 117.320 }, + { 74.9, 4.762, 210.118 }, + { 82.7, 6.050, 216.480 }, + { 95.7, 2.911, 316.392 }, + { 63.7, 0.352, 323.505 }, + { 84.9, 5.735, 209.367 }, + { 60.6, 4.875, 632.784 }, + { 66.5, 0.483, 10.295 }, + { 67.2, 0.456, 522.577 }, + { 53.3, 2.747, 529.691 }, + { 45.8, 5.693, 440.825 }, + { 45.3, 1.669, 202.253 }, + { 42.3, 5.708, 88.866 }, + { 32.1, 0.071, 63.736 }, + { 31.6, 1.672, 302.165 }, + { 31.1, 4.164, 191.958 }, + { 24.6, 5.656, 735.877 }, + { 26.6, 0.833, 224.345 }, + { 20.1, 5.944, 217.231 }, + { 17.5, 4.900, 625.670 }, + { 17.1, 1.626, 742.990 }, + { 13.7, 3.765, 195.140 }, + { 12.2, 4.718, 203.004 }, + { 11.9, 0.126, 234.640 }, + { 16.0, 0.579, 515.464 }, + { 11.2, 5.922, 536.805 }, + { 14.1, 0.207, 838.969 }, + { 11.0, 5.602, 728.763 }, + { 11.7, 3.121, 846.083 }, + { 10.0, 4.155, 860.310 }, + { 10.6, 3.203, 1066.495 }, + { 10.1, 0.257, 330.619 }, + { 9.5, 0.46, 956.29 }, + { 10.2, 4.987, 422.666 }, + { 8.3, 2.14, 269.92 }, + { 7.2, 5.40, 1052.27 }, + { 7.7, 5.25, 429.78 }, + { 6.4, 4.46, 284.15 }, + { 5.9, 5.41, 149.56 }, + { 7.5, 4.03, 9.56 }, + { 5.8, 4.29, 415.55 }, + { 6.1, 5.93, 405.26 }, + { 5.7, 0.02, 124.43 }, + { 5.7, 6.02, 223.59 }, + { 4.8, 4.93, 654.12 }, + { 4.7, 2.27, 18.16 }, + { 4.5, 4.41, 942.06 }, + { 5.6, 0.30, 127.47 }, + { 5.5, 5.54, 949.18 }, + { 4.1, 4.69, 74.78 }, + { 4.1, 5.31, 1045.15 }, + { 4.2, 2.89, 56.62 }, + { 4.9, 3.20, 277.03 }, + { 3.9, 3.30, 490.33 }, + { 3.9, 6.10, 81.75 }, + { 3.8, 4.93, 52.69 }, + { 4.6, 6.14, 1155.36 }, + { 3.7, 0.41, 137.03 }, + { 3.4, 4.29, 99.91 }, + { 3.6, 0.20, 1272.68 }, + { 3.9, 0.37, 12.53 }, + { 3.2, 1.57, 1059.38 }, + { 4.1, 0.29, 831.86 }, + { 3.7, 0.15, 437.64 }, + { 2.9, 3.13, 70.85 }, + { 2.8, 0.33, 191.21 }, + { 2.7, 1.88, 295.05 }, + { 3.5, 4.77, 423.42 }, + { 2.6, 5.15, 1368.66 }, + { 2.5, 3.90, 210.85 }, + { 2.5, 1.59, 32.24 }, + { 2.6, 3.59, 131.40 }, + { 2.3, 4.77, 351.82 }, + { 2.4, 5.83, 106.27 }, + { 2.2, 5.98, 6062.66 }, + { 2.2, 2.06, 6076.89 }, + { 2.2, 5.95, 145.63 }, + { 2.7, 3.38, 408.44 }, + { 2.3, 3.14, 22.09 }, + { 2.1, 1.12, 9992.87 }, + { 2.1, 3.48, 10007.10 }, + { 2.6, 5.12, 265.99 }, + { 1.8, 4.15, 1258.45 }, + { 1.8, 5.05, 1361.55 }, + { 1.8, 4.14, 107.02 }, + { 1.9, 4.52, 138.52 }, + { 1.7, 1.36, 231.46 }, + { 2.0, 5.87, 1471.75 }, + { 2.1, 5.23, 1265.57 }, + { 1.6, 5.62, 447.94 }, + { 1.6, 3.75, 628.85 }, + { 1.7, 6.24, 1148.25 }, + /* 115 terms retained, 206 terms dropped, error 0.074"*T^2 */ + + /* saturn l, T^3 */ + { 16038.7, 5.739454, 7.113547 }, + { 4249.8, 4.58540, 213.29910 }, + { 1906.5, 4.76082, 220.41264 }, + { 1465.7, 5.91327, 206.18555 }, + { 1162.0, 5.61973, 14.22709 }, + { 1066.6, 3.60817, 426.59819 }, + { 239.4, 3.8609, 433.7117 }, + { 237.0, 5.7683, 199.0720 }, + { 165.6, 5.1164, 3.1814 }, + { 131.4, 4.7433, 227.5262 }, + { 151.4, 2.7359, 639.8973 }, + { 61.6, 4.743, 103.093 }, + { 63.4, 0.229, 419.485 }, + { 40.4, 5.473, 21.341 }, + { 40.2, 5.964, 95.979 }, + { 38.7, 5.834, 110.206 }, + { 28.0, 3.012, 647.011 }, + { 25.0, 0.988, 3.932 }, + { 18.1, 1.025, 412.371 }, + { 17.9, 3.319, 309.278 }, + { 16.2, 3.898, 440.825 }, + { 15.8, 5.617, 117.320 }, + { 19.0, 1.916, 853.196 }, + { 18.3, 4.967, 10.295 }, + { 12.9, 1.181, 88.866 }, + { 17.9, 4.204, 216.480 }, + { 11.5, 5.575, 11.046 }, + { 10.5, 5.929, 191.958 }, + { 10.4, 3.948, 209.367 }, + { 8.7, 3.39, 302.16 }, + { 7.6, 4.88, 323.51 }, + { 6.7, 0.38, 632.78 }, + { 5.9, 1.06, 210.12 }, + { 5.4, 4.64, 234.64 }, + { 6.3, 2.25, 522.58 }, + { 3.6, 2.31, 515.46 }, + { 3.2, 2.20, 860.31 }, + { 3.7, 3.14, 0 }, + { 2.6, 4.93, 224.34 }, + { 2.5, 0.42, 625.67 }, + { 2.2, 3.20, 202.25 }, + { 2.4, 4.77, 330.62 }, + { 2.9, 0.59, 529.69 }, + { 2.0, 4.40, 124.43 }, + { 2.2, 1.35, 405.26 }, + { 2.3, 3.35, 429.78 }, + { 2.0, 3.07, 654.12 }, + { 2.0, 1.03, 728.76 }, + { 1.9, 3.09, 422.67 }, + { 1.8, 4.15, 536.80 }, + { 2.2, 1.19, 1066.50 }, + { 2.1, 4.16, 223.59 }, + { 1.5, 0.38, 316.39 }, + { 1.7, 5.83, 195.14 }, + { 1.5, 1.58, 81.75 }, + { 1.6, 6.04, 742.99 }, + { 1.3, 1.66, 63.74 }, + { 1.3, 5.02, 956.29 }, + { 1.4, 2.11, 838.97 }, + { 1.2, 3.88, 269.92 }, + { 1.0, 3.73, 295.05 }, + { 1.3, 1.38, 735.88 }, + { 1.3, 2.33, 217.23 }, + { 0.9, 2.76, 284.15 }, + { 0.9, 0.71, 846.08 }, + { 0.9, 3.84, 447.94 }, + { 0.9, 3.31, 18.16 }, + { 0.8, 4.71, 56.62 }, + { 0.9, 2.02, 831.86 }, + { 0.8, 0.80, 1045.15 }, + { 0.7, 4.27, 437.64 }, + { 0.7, 6.18, 942.06 }, + { 0.8, 2.41, 203.00 }, + { 0.7, 1.65, 423.42 }, + { 0.5, 2.86, 184.84 }, + { 0.5, 6.26, 1059.38 }, + { 0.5, 3.43, 149.56 }, + { 0.5, 4.88, 1272.68 }, + { 0.4, 5.40, 408.44 }, + { 0.4, 4.06, 543.92 }, + { 0.4, 1.69, 1155.36 }, + { 0.4, 1.22, 1052.27 }, + /* 82 terms retained, 66 terms dropped, error 0.015"*T^3 */ + + /* saturn l, T^4 */ + { 1661.9, 3.99826, 7.11355 }, + { 257.1, 2.9844, 220.4126 }, + { 236.3, 3.9024, 14.2271 }, + { 149.4, 2.7411, 213.2991 }, + { 109.6, 1.5152, 206.1855 }, + { 114.0, 3.1416, 0 }, + { 68.4, 1.721, 426.598 }, + { 37.7, 1.238, 199.072 }, + { 40.1, 2.046, 433.712 }, + { 31.2, 3.011, 227.526 }, + { 15.1, 0.829, 639.897 }, + { 9.4, 3.71, 21.34 }, + { 5.7, 2.42, 419.48 }, + { 4.5, 1.45, 95.98 }, + { 5.6, 1.16, 647.01 }, + { 4.5, 2.12, 440.83 }, + { 3.2, 4.09, 110.21 }, + { 2.9, 2.77, 412.37 }, + { 2.8, 3.01, 88.87 }, + { 2.6, 0.00, 853.20 }, + { 2.6, 0.39, 103.09 }, + { 1.9, 5.08, 309.28 }, + { 2.2, 3.78, 117.32 }, + { 1.8, 5.19, 302.16 }, + { 1.9, 2.83, 234.64 }, + { 1.8, 2.24, 216.48 }, + { 1.2, 1.55, 191.96 }, + { 0.8, 3.45, 323.51 }, + { 0.8, 4.83, 210.12 }, + { 0.6, 4.19, 515.46 }, + { 0.6, 2.29, 209.37 }, + { 0.6, 4.03, 522.58 }, + { 0.6, 2.38, 632.78 }, + { 0.6, 0.30, 860.31 }, + { 0.6, 2.17, 124.43 }, + { 0.4, 2.24, 447.94 }, + { 0.4, 5.45, 1066.50 }, + { 0.5, 1.27, 654.12 }, + { 0.5, 3.20, 405.26 }, + { 0.4, 3.12, 330.62 }, + { 0.4, 3.39, 81.75 }, + { 0.3, 4.12, 838.97 }, + { 0.3, 3.18, 529.69 }, + { 0.3, 1.41, 429.78 }, + { 0.3, 3.19, 1464.64 }, + { 0.3, 2.94, 728.76 }, + { 0.2, 3.67, 1148.25 }, + { 0.3, 2.58, 1045.15 }, + { 0.2, 3.58, 1155.36 }, + { 0.3, 2.05, 1677.94 }, + { 0.2, 2.62, 536.80 }, + { 0.3, 2.48, 625.67 }, + { 0.2, 4.39, 1574.85 }, + { 0.2, 1.26, 422.67 }, + { 0.2, 2.33, 223.59 }, + { 0.2, 1.09, 742.99 }, + { 0.2, 0.70, 824.74 }, + { 0.2, 5.03, 203.00 }, + { 0.2, 0.40, 867.42 }, + { 0.2, 3.68, 831.86 }, + { 0.2, 5.75, 1073.61 }, + { 0.2, 3.02, 1781.03 }, + { 0.1, 2.28, 295.05 }, + { 0.1, 3.48, 956.29 }, + { 0.2, 1.91, 942.06 }, + { 0.1, 6.17, 316.39 }, + /* 66 terms retained, 2 terms dropped, error 0.0049"*T^4 */ + + /* saturn l, T^5 */ + { 123.6, 2.2592, 7.1135 }, + { 34.2, 2.163, 14.227 }, + { 27.5, 1.199, 220.413 }, + { 5.8, 1.22, 227.53 }, + { 5.3, 0.24, 433.71 }, + { 3.7, 6.23, 426.60 }, + { 3.1, 2.97, 199.07 }, + { 2.9, 4.29, 206.19 }, + { 1.6, 6.25, 213.30 }, + { 1.3, 5.28, 639.90 }, + { 0.9, 5.57, 647.01 }, + { 0.8, 6.18, 191.96 }, + { 0.8, 0.69, 302.16 }, + { 1.0, 0.24, 440.83 }, + { 1.0, 3.14, 0 }, + { 0.5, 4.88, 88.87 }, + { 0.5, 4.78, 419.48 }, + { 0.3, 4.32, 853.20 }, + { 0.4, 5.70, 654.12 }, + { 0.2, 2.05, 323.51 }, + { 0.3, 1.11, 234.64 }, + { 0.2, 0.89, 309.28 }, + { 0.3, 5.10, 95.98 }, + { 0.2, 2.40, 515.46 }, + { 0.2, 4.70, 860.31 }, + { 0.1, 0.49, 117.32 }, + /* 26 terms retained, 1 terms dropped, error 0.0022"*T^5 */ + /* end saturn l */ + + /* saturn b, T^0 */ + { 4330678.0, 3.60284428, 213.29909544 }, + { 240348.3, 2.8523849, 426.5981909 }, + { 84745.9, 0, 0 }, + { 30863.4, 3.484415, 220.412642 }, + { 34116.1, 0.572973, 206.185548 }, + { 14734.1, 2.118466, 639.897286 }, + { 9916.7, 5.79003, 419.48464 }, + { 6993.6, 4.73605, 7.11355 }, + { 4807.6, 5.43305, 316.39187 }, + { 4788.4, 4.96513, 110.20632 }, + { 3432.1, 2.73256, 433.71174 }, + { 1506.1, 6.01305, 103.09277 }, + { 1060.3, 5.63099, 529.69097 }, + { 969.1, 5.2043, 632.7837 }, + { 942.1, 1.3965, 853.1964 }, + { 707.6, 3.8030, 323.5054 }, + { 552.3, 5.1315, 202.2534 }, + { 399.7, 3.3589, 227.5262 }, + { 316.1, 1.9972, 647.0108 }, + { 319.4, 3.6257, 209.3669 }, + { 284.5, 4.8865, 224.3448 }, + { 314.2, 0.4651, 217.2312 }, + { 236.4, 2.1389, 11.0457 }, + { 215.4, 5.9498, 846.0828 }, + { 208.5, 2.1200, 415.5525 }, + { 179.0, 2.9536, 63.7359 }, + { 207.2, 0.7302, 199.0720 }, + { 139.1, 1.9982, 735.8765 }, + { 134.9, 5.2450, 742.9901 }, + { 140.6, 0.6442, 490.3341 }, + { 121.7, 3.1154, 522.5774 }, + { 139.2, 4.5954, 14.2271 }, + { 115.5, 3.1089, 216.4805 }, + { 114.2, 0.9626, 210.1177 }, + { 96.4, 4.482, 117.320 }, + { 80.6, 1.317, 277.035 }, + { 73.0, 3.060, 536.805 }, + { 69.3, 4.924, 309.278 }, + { 74.3, 2.894, 149.563 }, + { 68.0, 2.180, 351.817 }, + { 61.7, 0.677, 1066.495 }, + { 56.6, 2.610, 440.825 }, + { 48.9, 5.787, 95.979 }, + { 48.2, 2.182, 74.782 }, + { 38.3, 5.292, 1059.382 }, + { 36.3, 1.633, 628.852 }, + { 35.1, 1.713, 1052.268 }, + { 34.3, 2.457, 422.666 }, + { 34.3, 5.980, 412.371 }, + { 33.8, 1.141, 949.176 }, + { 31.6, 4.147, 437.644 }, + { 36.8, 6.278, 1162.475 }, + { 27.0, 1.272, 860.310 }, + /* 53 terms retained, 447 terms dropped, error 0.82" */ + + /* saturn b, T^1 */ + { 397555.0, 5.3328999, 213.2990954 }, + { 49478.6, 3.141593, 0 }, + { 18571.6, 6.099192, 426.598191 }, + { 14800.6, 2.305861, 206.185548 }, + { 9644.0, 1.69675, 220.41264 }, + { 3757.2, 1.25430, 419.48464 }, + { 2716.6, 5.91167, 639.89729 }, + { 1455.3, 0.85162, 433.71174 }, + { 1290.6, 2.91771, 7.11355 }, + { 852.6, 0.4357, 316.3919 }, + { 284.4, 1.6188, 227.5262 }, + { 292.2, 5.3157, 853.1964 }, + { 275.1, 3.8886, 103.0928 }, + { 297.7, 0.9191, 632.7837 }, + { 172.4, 0.0522, 647.0108 }, + { 127.7, 1.2071, 529.6910 }, + { 166.2, 2.4435, 199.0720 }, + { 158.2, 5.2085, 110.2063 }, + { 109.8, 2.4570, 217.2312 }, + { 81.8, 2.758, 210.118 }, + { 81.0, 2.860, 14.227 }, + { 68.7, 1.655, 202.253 }, + { 59.3, 1.824, 323.505 }, + { 65.2, 1.255, 216.480 }, + { 61.0, 1.253, 209.367 }, + { 46.4, 0.815, 440.825 }, + { 36.2, 1.819, 224.345 }, + { 34.0, 2.840, 117.320 }, + { 32.2, 1.187, 846.083 }, + { 33.1, 1.306, 412.371 }, + { 27.3, 4.647, 1066.495 }, + { 22.8, 4.129, 415.552 }, + { 27.1, 4.442, 11.046 }, + { 18.1, 5.564, 860.310 }, + { 20.9, 1.410, 309.278 }, + { 14.9, 1.343, 95.979 }, + { 15.3, 1.224, 63.736 }, + { 14.6, 1.008, 536.805 }, + { 12.8, 2.271, 742.990 }, + { 12.8, 4.889, 522.577 }, + { 13.1, 2.460, 490.334 }, + { 11.9, 1.873, 423.417 }, + { 13.0, 3.217, 277.035 }, + { 9.9, 3.12, 625.67 }, + { 12.7, 0.295, 422.666 }, + { 9.6, 1.75, 330.62 }, + { 8.1, 2.42, 430.53 }, + { 8.2, 4.68, 215.75 }, + { 9.0, 0.46, 429.78 }, + { 6.5, 3.01, 949.18 }, + { 7.3, 5.97, 149.56 }, + { 6.6, 3.91, 351.82 }, + { 6.8, 1.52, 437.64 }, + /* 53 terms retained, 207 terms dropped, error 0.21"*T */ + + /* saturn b, T^2 */ + { 20630.0, 0.504824, 213.299095 }, + { 3719.6, 3.99833, 206.18555 }, + { 1627.2, 6.18190, 220.41264 }, + { 1346.1, 0, 0 }, + { 705.8, 3.0391, 419.4846 }, + { 365.0, 5.0993, 426.5982 }, + { 329.6, 5.2790, 433.7117 }, + { 219.3, 3.8284, 639.8973 }, + { 139.4, 1.0427, 7.1135 }, + { 104.0, 6.1573, 227.5262 }, + { 93.0, 1.980, 316.392 }, + { 71.2, 4.148, 199.072 }, + { 51.9, 2.884, 632.784 }, + { 49.0, 4.434, 647.011 }, + { 41.4, 3.159, 853.196 }, + { 28.6, 4.530, 210.118 }, + { 24.0, 1.116, 14.227 }, + { 20.5, 4.351, 217.231 }, + { 19.5, 5.308, 440.825 }, + { 18.3, 0.854, 110.206 }, + { 15.7, 4.258, 103.093 }, + { 16.8, 5.681, 216.480 }, + { 13.6, 2.999, 412.371 }, + { 11.6, 2.527, 529.691 }, + { 8.0, 3.32, 202.25 }, + { 6.6, 0.29, 323.51 }, + { 6.3, 1.16, 117.32 }, + { 5.9, 3.58, 309.28 }, + { 6.6, 5.56, 209.37 }, + { 5.6, 2.48, 1066.50 }, + { 6.2, 3.61, 860.31 }, + { 4.2, 3.02, 846.08 }, + { 3.6, 4.80, 625.67 }, + { 3.4, 3.77, 423.42 }, + { 3.4, 6.04, 234.64 }, + { 2.6, 5.64, 735.88 }, + { 2.8, 4.82, 429.78 }, + { 2.8, 4.48, 654.12 }, + { 2.6, 0.22, 522.58 }, + { 2.6, 3.29, 95.98 }, + { 2.4, 0.03, 415.55 }, + { 2.1, 4.56, 422.67 }, + { 2.3, 6.25, 330.62 }, + { 1.8, 5.53, 536.80 }, + { 1.8, 5.06, 277.03 }, + { 1.6, 5.54, 224.34 }, + /* 46 terms retained, 65 terms dropped, error 0.045"*T^2 */ + + /* saturn b, T^3 */ + { 666.3, 1.9901, 213.2991 }, + { 632.4, 5.6978, 206.1855 }, + { 398.1, 0, 0 }, + { 187.8, 4.3378, 220.4126 }, + { 91.9, 4.841, 419.485 }, + { 42.4, 2.381, 426.598 }, + { 51.5, 3.421, 433.712 }, + { 25.7, 4.402, 227.526 }, + { 20.6, 5.853, 199.072 }, + { 18.1, 1.993, 639.897 }, + { 10.9, 5.373, 7.114 }, + { 9.6, 2.55, 647.01 }, + { 7.1, 3.46, 316.39 }, + { 6.0, 4.80, 632.78 }, + { 5.8, 0.02, 210.12 }, + { 4.9, 5.64, 14.23 }, + { 4.5, 1.22, 853.20 }, + { 5.5, 3.52, 440.83 }, + { 3.5, 4.71, 412.37 }, + { 2.9, 0.63, 103.09 }, + { 2.2, 3.72, 216.48 }, + { 2.0, 6.11, 217.23 }, + { 1.4, 1.69, 860.31 }, + { 1.2, 4.31, 234.64 }, + { 1.2, 5.75, 309.28 }, + { 0.8, 5.69, 117.32 }, + { 0.7, 0.60, 1066.50 }, + { 0.7, 0.22, 625.67 }, + { 0.8, 5.48, 202.25 }, + { 0.9, 2.66, 654.12 }, + { 0.5, 2.86, 429.78 }, + { 0.5, 4.18, 529.69 }, + { 0.5, 4.52, 323.51 }, + /* 33 terms retained, 25 terms dropped, error 0.012"*T^3 */ + + /* saturn b, T^4 */ + { 80.4, 1.119, 206.186 }, + { 31.7, 3.122, 213.299 }, + { 17.1, 2.481, 220.413 }, + { 11.8, 3.142, 0 }, + { 9.0, 0.38, 419.48 }, + { 6.2, 1.56, 433.71 }, + { 4.7, 1.28, 199.07 }, + { 4.8, 2.63, 227.53 }, + { 1.5, 1.43, 426.60 }, + { 1.4, 0.67, 647.01 }, + { 1.1, 6.18, 639.90 }, + { 1.1, 1.72, 440.83 }, + { 0.7, 3.85, 14.23 }, + { 0.7, 3.49, 7.11 }, + { 0.5, 0.47, 632.78 }, + { 0.5, 0.31, 412.37 }, + { 0.3, 5.86, 853.20 }, + { 0.3, 2.50, 234.64 }, + { 0.2, 5.39, 316.39 }, + { 0.2, 2.11, 210.12 }, + { 0.2, 6.10, 860.31 }, + { 0.2, 5.95, 216.48 }, + { 0.1, 1.99, 625.67 }, + { 0.1, 0.86, 654.12 }, + { 0.1, 5.04, 117.32 }, + { 0.1, 0.45, 110.21 }, + /* 26 terms retained, 0 terms dropped, error 0.0025"*T^4 */ + + /* saturn b, T^5 */ + { 7.9, 2.82, 206.19 }, + { 1.0, 0.51, 220.41 }, + { 0.8, 2.99, 199.07 }, + { 1.0, 3.14, 0 }, + { 0.6, 5.96, 433.71 }, + { 0.6, 0.78, 227.53 }, + { 0.4, 2.39, 419.48 }, + { 0.1, 5.11, 647.01 }, + /* 8 terms retained, 3 terms dropped, error 0.0012"*T^5 */ + /* end saturn b */ + + /* saturn r, T^0 */ + { 955758135.8, 0, 0 }, + { 52921382.5, 2.392262197, 213.299095438 }, + { 1873679.9, 5.23549605, 206.18554844 }, + { 1464664.0, 1.64763045, 426.59819088 }, + { 821891.1, 5.9352003, 316.3918697 }, + { 547506.9, 5.0153263, 103.0927742 }, + { 371684.4, 2.2711483, 220.4126424 }, + { 361778.4, 3.1390430, 7.1135470 }, + { 140617.5, 5.7040665, 632.7837393 }, + { 108974.7, 3.2931360, 110.2063212 }, + { 69007.0, 5.940996, 419.484644 }, + { 61053.3, 0.940378, 639.897286 }, + { 48913.0, 1.557334, 202.253395 }, + { 34143.8, 0.195186, 277.034994 }, + { 32401.7, 5.470846, 949.175609 }, + { 20936.6, 0.463492, 735.876514 }, + { 20839.1, 1.521026, 433.711738 }, + { 20746.7, 5.332557, 199.072001 }, + { 15298.5, 3.059437, 529.690965 }, + { 14296.5, 2.604335, 323.505417 }, + { 11993.3, 5.980514, 846.082835 }, + { 11380.3, 1.731057, 522.577418 }, + { 12884.1, 1.648923, 138.517497 }, + { 7752.8, 5.85191, 95.97923 }, + { 9796.1, 5.20476, 1265.56748 }, + { 6466.0, 0.17733, 1052.26838 }, + { 6770.6, 3.00433, 14.22709 }, + { 5850.4, 1.45520, 415.55249 }, + { 5307.5, 0.59738, 63.73590 }, + { 4695.7, 2.14919, 227.52619 }, + { 4044.0, 1.64010, 209.36694 }, + { 3688.1, 0.78016, 412.37110 }, + { 3376.5, 3.69528, 224.34480 }, + { 2885.3, 1.38764, 838.96929 }, + { 2976.0, 5.68468, 210.11770 }, + { 3419.6, 4.94549, 1581.95935 }, + { 3460.9, 1.85089, 175.16606 }, + { 3400.6, 0.55387, 350.33212 }, + { 2507.6, 3.53852, 742.99006 }, + { 2448.3, 6.18412, 1368.66025 }, + { 2406.1, 2.96559, 117.31987 }, + { 2881.2, 0.17961, 853.19638 }, + { 2174.0, 0.01509, 340.77089 }, + { 2024.5, 5.05411, 11.04570 }, + { 1740.3, 2.34657, 309.27832 }, + { 1861.4, 5.93362, 625.67019 }, + { 1888.4, 0.02968, 3.93215 }, + { 1610.9, 1.17302, 74.78160 }, + { 1462.6, 1.92588, 216.48049 }, + { 1474.5, 5.67670, 203.73787 }, + { 1395.1, 5.93669, 127.47180 }, + { 1781.2, 0.76314, 217.23125 }, + { 1817.2, 5.77713, 490.33409 }, + { 1472.4, 1.40065, 137.03302 }, + { 1304.1, 0.77236, 647.01083 }, + { 1149.8, 5.74021, 1162.47470 }, + { 1126.7, 4.46708, 265.98929 }, + { 1277.5, 2.98413, 1059.38193 }, + { 1207.1, 0.75286, 351.81659 }, + { 1071.4, 1.13567, 1155.36116 }, + { 1020.9, 5.91234, 1685.05212 }, + { 1315.0, 5.11203, 211.81462 }, + { 1295.6, 4.69184, 1898.35122 }, + { 1099.0, 1.81765, 149.56320 }, + { 998.5, 2.6313, 200.7689 }, + { 985.9, 2.2599, 956.2892 }, + { 932.4, 3.6698, 554.0700 }, + { 664.5, 0.6030, 728.7630 }, + { 659.8, 4.6664, 195.1398 }, + { 617.7, 5.6209, 942.0621 }, + { 626.4, 5.9421, 1478.8666 }, + { 482.2, 1.8407, 479.2884 }, + { 487.7, 2.7937, 3.1814 }, + { 470.1, 0.8385, 1471.7530 }, + { 451.8, 5.6447, 2001.4440 }, + { 553.1, 3.4109, 269.9214 }, + { 534.4, 1.2644, 275.5505 }, + { 472.6, 1.8820, 515.4639 }, + { 405.4, 1.6400, 536.8045 }, + { 517.2, 4.4431, 2214.7431 }, + { 452.8, 3.0035, 302.1648 }, + { 494.3, 2.2863, 278.5195 }, + { 489.8, 5.8063, 191.2077 }, + { 427.5, 0.0574, 284.1485 }, + { 339.8, 1.4020, 440.8253 }, + { 340.6, 0.8909, 628.8516 }, + { 386.0, 1.9970, 1272.6810 }, + { 288.3, 1.1216, 422.6660 }, + { 294.4, 0.4258, 312.1991 }, + { 262.5, 0.3175, 1045.1548 }, + { 295.3, 0.6714, 88.8657 }, + { 343.0, 5.8560, 1795.2584 }, + { 341.1, 2.3759, 525.4982 }, + { 234.0, 4.2276, 114.1385 }, + { 223.7, 2.2813, 330.6190 }, + { 275.8, 0.4783, 38.1330 }, + { 224.6, 0.5475, 1788.1449 }, + { 303.3, 0.8795, 6069.7768 }, + { 292.1, 6.2142, 210.8514 }, + { 226.1, 0.3750, 142.4497 }, + { 277.3, 5.3192, 692.5875 }, + { 242.9, 5.3719, 1258.4539 }, + { 205.6, 0.9576, 288.0807 }, + { 207.6, 5.3813, 2317.8359 }, + { 186.8, 6.0359, 404.5068 }, + { 218.5, 5.2561, 212.3359 }, + { 222.2, 5.9459, 39.3569 }, + { 179.7, 4.4105, 408.4389 }, + { 241.4, 1.1253, 388.4652 }, + { 197.1, 3.9014, 52.6902 }, + { 236.6, 0.9080, 1375.7738 }, + { 171.9, 5.5632, 213.3473 }, + { 169.9, 2.8567, 99.1606 }, + { 214.4, 4.2025, 2531.1350 }, + { 172.0, 2.3654, 213.2509 }, + { 165.7, 2.6368, 215.7468 }, + { 230.9, 5.4946, 191.9585 }, + { 177.6, 0.3816, 430.5303 }, + { 191.5, 2.9591, 437.6439 }, + { 163.2, 3.4583, 617.8059 }, + { 162.3, 5.7305, 203.0042 }, + { 175.1, 5.7140, 1066.4955 }, + { 183.0, 5.6685, 2111.6503 }, + { 150.1, 4.4066, 417.0370 }, + { 187.9, 6.0792, 563.6312 }, + { 145.1, 5.0818, 423.4168 }, + { 137.5, 5.4391, 222.8603 }, + { 172.8, 1.8492, 1589.0729 }, + { 165.5, 2.8913, 214.2623 }, + { 145.7, 1.5657, 831.8557 }, + { 176.9, 2.3032, 9999.9865 }, + { 128.9, 2.5534, 414.0680 }, + { 120.1, 0.0433, 1361.5467 }, + { 143.4, 0.9982, 76.2661 }, + { 108.7, 2.0928, 207.6700 }, + { 132.1, 2.8590, 312.4597 }, + { 112.2, 0.2622, 2104.5368 }, + { 125.2, 4.7835, 205.2223 }, + { 104.4, 3.6367, 65.2204 }, + { 107.4, 3.6706, 212.7778 }, + { 108.6, 2.8549, 21.3406 }, + { 97.7, 5.122, 2634.228 }, + { 109.1, 1.6323, 208.6332 }, + { 96.9, 4.199, 305.346 }, + { 96.5, 2.560, 1692.166 }, + { 85.8, 4.545, 210.378 }, + { 99.2, 5.138, 1574.846 }, + { 112.5, 5.0311, 703.6332 }, + { 84.0, 1.183, 429.780 }, + { 89.0, 5.388, 107.025 }, + { 110.2, 2.4366, 355.7487 }, + { 90.7, 4.209, 213.820 }, + { 95.9, 5.446, 2428.042 }, + { 94.1, 2.398, 483.221 }, + { 85.6, 0.034, 860.310 }, + { 88.8, 4.058, 128.956 }, + { 82.0, 1.665, 62.251 }, + { 91.2, 3.969, 2847.527 }, + { 84.0, 4.608, 177.874 }, + { 88.4, 3.868, 140.002 }, + { 93.3, 0.738, 831.105 }, + { 91.9, 2.950, 35.425 }, + { 87.1, 1.334, 1905.465 }, + { 96.6, 4.844, 131.404 }, + { 71.0, 0.993, 405.258 }, + { 95.3, 2.515, 2.448 }, + { 72.5, 4.632, 245.542 }, + { 82.6, 1.528, 145.631 }, + { 76.7, 3.152, 767.369 }, + { 70.3, 4.043, 173.942 }, + { 86.0, 2.301, 85.827 }, + { 66.5, 4.751, 70.849 }, + { 65.8, 2.469, 280.967 }, + { 64.8, 0.093, 9.561 }, + { 71.6, 0.012, 565.116 }, + { 66.5, 1.080, 339.286 }, + { 63.5, 2.017, 234.640 }, + { 60.8, 5.120, 756.323 }, + { 58.1, 6.057, 1677.939 }, + { 64.2, 1.286, 1148.248 }, + { 73.1, 4.378, 425.114 }, + { 55.0, 3.859, 342.255 }, + { 57.1, 6.267, 2420.929 }, + { 64.1, 4.099, 327.438 }, + { 55.3, 1.605, 543.024 }, + { 58.0, 5.473, 347.884 }, + { 73.6, 3.723, 92.047 }, + { 73.8, 3.570, 1.484 }, + { 64.9, 2.447, 267.474 }, + { 54.4, 3.715, 344.703 }, + { 49.8, 3.935, 192.692 }, + { 49.5, 3.228, 333.657 }, + { 47.5, 3.929, 199.284 }, + { 49.4, 4.903, 217.492 }, + { 62.7, 4.401, 214.784 }, + { 46.4, 2.094, 212.548 }, + { 46.3, 2.640, 10.295 }, + { 54.3, 1.072, 362.862 }, + { 58.7, 2.623, 225.829 }, + { 48.5, 3.152, 216.220 }, + { 46.3, 4.862, 2950.620 }, + { 46.0, 4.973, 198.321 }, + { 46.7, 2.450, 207.149 }, + { 44.9, 1.776, 223.594 }, + { 44.5, 5.560, 264.505 }, + { 55.9, 4.295, 329.725 }, + { 49.6, 5.208, 2744.434 }, + { 58.8, 4.231, 700.664 }, + { 52.6, 3.792, 343.219 }, + { 41.5, 0.745, 125.987 }, + { 47.8, 2.393, 207.882 }, + { 56.2, 2.072, 124.433 }, + { 43.3, 1.837, 106.274 }, + { 39.8, 4.009, 12.530 }, + { 53.9, 4.979, 134.585 }, + { 50.1, 5.759, 320.324 }, + { 45.0, 5.357, 218.928 }, + { 41.1, 4.923, 1891.238 }, + { 46.5, 2.066, 2008.558 }, + { 42.9, 0.399, 357.446 }, + { 38.0, 2.065, 247.239 }, + { 48.7, 5.328, 3127.313 }, + { 34.6, 5.626, 99.911 }, + { 41.1, 2.473, 237.678 }, + { 40.8, 4.084, 621.738 }, + { 34.2, 0.731, 750.104 }, + { 34.0, 5.313, 206.234 }, + { 36.5, 1.688, 22.091 }, + { 39.4, 3.457, 241.610 }, + { 34.8, 2.248, 487.365 }, + { 33.0, 4.866, 209.106 }, + { 32.6, 2.227, 319.573 }, + { 39.0, 3.739, 3163.919 }, + { 32.7, 1.066, 252.656 }, + { 38.7, 4.396, 18.159 }, + { 34.5, 1.826, 380.128 }, + { 41.5, 0.081, 210.330 }, + { 33.5, 5.805, 251.432 }, + { 31.2, 1.965, 244.319 }, + { 30.5, 2.269, 1169.588 }, + { 34.8, 5.963, 217.965 }, + { 38.5, 4.437, 160.609 }, + { 36.0, 3.833, 56.622 }, + { 31.0, 4.899, 144.147 }, + { 32.3, 3.582, 231.458 }, + { 28.8, 5.801, 1994.330 }, + { 32.2, 2.132, 206.137 }, + { 32.6, 1.931, 98.900 }, + { 34.9, 5.653, 497.448 }, + { 28.9, 2.217, 14.978 }, + { 31.6, 3.818, 73.297 }, + { 32.2, 0.998, 1464.639 }, + { 29.2, 5.984, 2737.321 }, + { 36.7, 4.755, 348.848 }, + { 28.7, 1.687, 78.714 }, + { 27.5, 6.121, 214.050 }, + { 28.8, 0.044, 5.629 }, + { 27.2, 0.246, 313.210 }, + { 32.4, 3.779, 33.940 }, + { 27.1, 5.203, 148.079 }, + { 35.0, 3.439, 273.103 }, + { 33.1, 2.447, 969.622 }, + { 27.7, 1.446, 258.876 }, + { 27.2, 4.259, 179.359 }, + { 27.9, 0.788, 546.956 }, + { 29.1, 4.839, 905.887 }, + { 27.4, 2.449, 254.944 }, + { 34.3, 6.009, 166.829 }, + { 28.9, 6.029, 188.920 }, + { 26.0, 0.650, 654.124 }, + { 33.6, 1.237, 2221.857 }, + { 27.8, 5.178, 5.417 }, + { 25.6, 3.359, 0.963 }, + { 28.8, 0.755, 488.850 }, + { 31.2, 2.053, 282.452 }, + { 25.4, 5.290, 636.716 }, + { 25.3, 4.970, 3060.826 }, + { 29.6, 3.927, 206.707 }, + { 28.3, 2.721, 32.243 }, + { 26.9, 2.863, 24.379 }, + { 28.3, 4.731, 552.586 }, + { 25.3, 5.120, 168.053 }, + { 26.4, 1.593, 491.819 }, + { 27.1, 5.537, 555.554 }, + { 27.3, 3.579, 561.184 }, + { 25.2, 1.781, 182.280 }, + { 25.6, 1.621, 2324.949 }, + { 25.6, 2.099, 248.724 }, + /* 288 terms retained, 917 terms dropped, error 8.7e-06 a.u. */ + + /* saturn r, T^1 */ + { 6182981.3, 0.25843515, 213.29909544 }, + { 506577.6, 0.7111465, 206.1855484 }, + { 341394.1, 5.7963577, 426.5981909 }, + { 188491.4, 0.4721572, 220.4126424 }, + { 186261.5, 3.1415927, 0 }, + { 143891.2, 1.4074486, 7.1135470 }, + { 49621.1, 6.017445, 103.092774 }, + { 20928.2, 5.092457, 639.897286 }, + { 19952.6, 1.175601, 419.484644 }, + { 18839.6, 1.608196, 110.206321 }, + { 12892.8, 5.943303, 433.711738 }, + { 13876.6, 0.758862, 199.072001 }, + { 5396.7, 1.28852, 14.22709 }, + { 4869.3, 0.86794, 323.50542 }, + { 4247.5, 0.39299, 227.52619 }, + { 3252.1, 1.25853, 95.97923 }, + { 2856.0, 2.16731, 735.87651 }, + { 2909.4, 4.60679, 202.25340 }, + { 3081.4, 3.43663, 522.57742 }, + { 1987.7, 2.45054, 412.37110 }, + { 1941.3, 6.02393, 209.36694 }, + { 1581.4, 1.29192, 210.11770 }, + { 1339.5, 4.30802, 853.19638 }, + { 1315.6, 1.25296, 117.31987 }, + { 1203.1, 1.86655, 316.39187 }, + { 1091.1, 0.07527, 216.48049 }, + { 954.4, 5.1517, 647.0108 }, + { 966.0, 0.4799, 632.7837 }, + { 881.8, 1.8847, 1052.2684 }, + { 874.2, 1.4022, 224.3448 }, + { 897.5, 0.9834, 529.6910 }, + { 784.9, 3.0638, 838.9693 }, + { 739.9, 1.3823, 625.6702 }, + { 613.0, 3.0331, 63.7359 }, + { 658.2, 4.1436, 309.2783 }, + { 649.6, 1.7249, 742.9901 }, + { 599.2, 2.5492, 217.2312 }, + { 502.9, 2.1296, 3.9322 }, + { 413.0, 4.5933, 415.5525 }, + { 356.1, 2.3031, 728.7630 }, + { 344.8, 5.8879, 440.8253 }, + { 395.0, 0.5335, 956.2892 }, + { 335.5, 1.6161, 1368.6603 }, + { 362.8, 4.7069, 302.1648 }, + { 321.6, 0.9793, 3.1814 }, + { 277.8, 0.2601, 195.1398 }, + { 291.2, 2.8313, 1155.3612 }, + { 265.0, 2.4267, 88.8657 }, + { 264.9, 5.8286, 149.5632 }, + { 316.8, 3.5840, 515.4639 }, + { 294.3, 2.8163, 11.0457 }, + { 244.9, 1.0449, 942.0621 }, + { 215.4, 3.5654, 490.3341 }, + { 264.0, 1.2855, 1059.3819 }, + { 246.2, 0.9073, 191.9585 }, + { 222.1, 5.1319, 269.9214 }, + { 195.0, 4.5667, 846.0828 }, + { 182.8, 2.6791, 127.4718 }, + { 181.6, 4.9343, 74.7816 }, + { 174.7, 3.4456, 137.0330 }, + { 165.5, 5.9978, 536.8045 }, + { 154.8, 1.1972, 265.9893 }, + { 169.7, 4.6346, 284.1485 }, + { 151.5, 0.5293, 330.6190 }, + { 152.5, 5.4389, 422.6660 }, + { 157.7, 2.9956, 340.7709 }, + { 140.6, 2.0207, 1045.1548 }, + { 139.8, 1.3528, 1685.0521 }, + { 141.0, 1.2710, 203.0042 }, + { 136.0, 5.0168, 351.8166 }, + { 153.4, 0.2697, 1272.6810 }, + { 129.5, 1.1434, 21.3406 }, + { 127.8, 2.5388, 1471.7530 }, + { 126.5, 3.0031, 277.0350 }, + { 100.3, 3.6136, 1066.4955 }, + { 103.2, 0.3818, 203.7379 }, + { 107.5, 4.3187, 210.8514 }, + { 95.9, 0.795, 1258.454 }, + { 82.7, 0.282, 234.640 }, + { 98.0, 2.561, 191.208 }, + { 97.4, 3.262, 831.856 }, + { 72.2, 4.380, 860.310 }, + { 70.6, 0.732, 437.644 }, + { 70.4, 0.877, 423.417 }, + { 72.1, 5.580, 429.780 }, + { 73.3, 0.625, 1375.774 }, + { 66.4, 2.684, 405.258 }, + { 63.8, 1.751, 1361.547 }, + { 61.6, 1.093, 2001.444 }, + { 67.0, 0.069, 408.439 }, + { 68.9, 2.471, 949.176 }, + { 60.5, 2.251, 1788.145 }, + { 67.1, 5.454, 200.769 }, + { 65.6, 0.055, 1589.073 }, + { 49.3, 4.172, 138.517 }, + { 50.6, 6.269, 223.594 }, + { 55.2, 4.595, 628.852 }, + { 47.9, 0.839, 10.295 }, + { 46.7, 2.173, 312.199 }, + { 54.2, 0.284, 124.433 }, + { 49.5, 3.800, 215.747 }, + { 40.1, 5.182, 1478.867 }, + { 39.3, 0.563, 1574.846 }, + { 35.0, 4.685, 38.133 }, + { 42.8, 2.986, 1148.248 }, + { 36.5, 0.635, 52.690 }, + { 39.8, 0.284, 131.404 }, + { 31.8, 5.190, 76.266 }, + { 33.0, 1.980, 142.450 }, + { 42.1, 4.830, 288.081 }, + { 30.8, 1.479, 1677.939 }, + { 42.8, 3.382, 208.633 }, + { 29.2, 5.099, 654.124 }, + { 29.2, 4.957, 1795.258 }, + { 29.1, 2.747, 404.507 }, + { 32.7, 6.121, 145.631 }, + { 28.0, 0.832, 2317.836 }, + { 27.7, 2.244, 430.530 }, + { 29.9, 1.964, 2104.537 }, + { 33.0, 3.282, 222.860 }, + { 31.8, 6.025, 1905.465 }, + { 27.0, 5.243, 388.465 }, + { 26.5, 0.996, 107.025 }, + { 25.4, 2.873, 703.633 }, + { 24.9, 1.077, 99.911 }, + { 25.0, 6.240, 106.274 }, + { 24.9, 0.810, 312.460 }, + { 24.3, 0.549, 214.262 }, + { 28.4, 0.826, 1692.166 }, + { 23.2, 5.080, 479.288 }, + { 24.4, 3.106, 212.336 }, + { 22.0, 6.067, 85.827 }, + { 22.0, 3.899, 563.631 }, + { 22.6, 4.867, 295.051 }, + { 21.3, 5.108, 333.657 }, + { 26.0, 2.208, 1265.567 }, + { 20.9, 3.289, 70.849 }, + { 21.5, 3.795, 347.884 }, + { 22.1, 4.227, 217.965 }, + { 20.6, 1.687, 231.458 }, + { 21.4, 3.089, 554.070 }, + { 21.3, 0.389, 319.573 }, + { 20.5, 2.457, 18.159 }, + { 26.1, 4.276, 483.221 }, + { 20.7, 5.121, 362.862 }, + { 22.0, 5.512, 343.219 }, + { 19.4, 2.024, 313.210 }, + { 20.2, 5.085, 750.104 }, + { 20.1, 3.430, 213.347 }, + { 24.2, 0.648, 207.882 }, + { 22.0, 0.729, 99.161 }, + { 21.1, 2.693, 1464.639 }, + { 17.2, 4.715, 2111.650 }, + { 18.5, 0.048, 245.542 }, + { 17.5, 3.837, 497.448 }, + { 16.1, 4.224, 565.116 }, + { 21.6, 4.166, 2.448 }, + { 16.0, 0.274, 225.829 }, + { 16.8, 1.411, 114.138 }, + { 15.6, 2.828, 81.752 }, + { 15.5, 1.206, 1994.330 }, + { 15.2, 3.846, 1162.475 }, + { 16.4, 3.048, 134.585 }, + { 15.9, 0.330, 1891.238 }, + { 20.4, 0.232, 213.251 }, + { 16.3, 1.706, 2420.929 }, + { 16.3, 4.942, 357.446 }, + { 18.1, 5.695, 56.622 }, + { 13.7, 0.572, 2634.228 }, + { 17.4, 3.553, 218.928 }, + { 13.7, 5.705, 92.047 }, + { 15.3, 1.313, 216.220 }, + { 12.5, 5.192, 635.965 }, + { 12.8, 1.602, 320.324 }, + { 13.0, 0.451, 1169.588 }, + { 12.0, 5.949, 543.918 }, + { 11.8, 2.803, 217.492 }, + { 14.7, 5.565, 344.703 }, + { 12.8, 1.636, 273.103 }, + { 11.9, 2.462, 721.649 }, + { 13.3, 5.756, 2221.857 }, + { 14.5, 0.453, 2008.558 }, + { 11.8, 1.757, 160.609 }, + { 12.4, 1.015, 329.725 }, + { 10.7, 1.581, 212.778 }, + { 12.8, 1.920, 1581.959 }, + { 11.9, 4.447, 32.243 }, + { 11.9, 5.107, 4.666 }, + { 11.9, 4.308, 618.557 }, + { 10.0, 0.487, 305.346 }, + { 12.8, 3.744, 508.350 }, + { 10.7, 0.766, 218.716 }, + { 11.4, 3.000, 198.321 }, + { 10.2, 2.409, 546.956 }, + { 10.0, 2.639, 416.303 }, + { 9.3, 5.46, 414.07 }, + { 9.3, 4.46, 2428.04 }, + { 9.9, 4.05, 62.25 }, + { 12.8, 3.433, 258.876 }, + { 9.7, 1.61, 327.44 }, + { 11.2, 2.407, 1781.031 }, + { 10.6, 2.075, 213.820 }, + { 9.1, 2.92, 1279.79 }, + { 9.5, 1.10, 113.39 }, + { 9.8, 3.28, 275.55 }, + { 11.3, 1.894, 561.184 }, + { 8.6, 2.18, 425.11 }, + { 8.6, 1.95, 35.42 }, + { 10.2, 0.090, 182.280 }, + { 11.8, 3.713, 350.332 }, + { 8.6, 1.83, 629.60 }, + { 8.4, 3.77, 251.43 }, + { 8.5, 0.36, 617.81 }, + { 8.2, 5.31, 65.22 }, + { 8.3, 1.38, 1.48 }, + { 8.0, 5.14, 22.09 }, + { 8.4, 0.92, 1485.98 }, + { 8.0, 0.94, 2310.72 }, + { 8.9, 0.54, 168.05 }, + { 8.2, 3.46, 424.15 }, + { 8.0, 3.38, 144.15 }, + { 7.9, 5.14, 358.93 }, + { 8.9, 6.14, 621.74 }, + { 7.5, 5.75, 447.94 }, + { 7.5, 2.19, 264.50 }, + { 8.1, 1.43, 2737.32 }, + { 8.2, 0.96, 767.37 }, + { 8.2, 0.35, 278.52 }, + { 8.2, 5.44, 254.94 }, + { 6.8, 1.20, 5.42 }, + { 8.9, 4.88, 120.36 }, + { 7.8, 4.56, 280.97 }, + { 6.6, 3.50, 9.56 }, + { 6.4, 0.33, 2950.62 }, + { 6.9, 3.39, 98.90 }, + { 7.4, 4.52, 5.63 }, + { 8.0, 0.94, 636.72 }, + { 7.2, 3.85, 214.05 }, + { 6.4, 2.12, 274.07 }, + { 6.5, 5.31, 6076.89 }, + { 6.4, 0.45, 10007.10 }, + { 6.3, 3.21, 219.45 }, + { 6.7, 1.65, 1898.35 }, + { 7.6, 0.10, 2324.95 }, + { 6.3, 0.76, 210.38 }, + { 6.6, 1.79, 12.53 }, + /* 246 terms retained, 393 terms dropped, error 2.1e-06 a.u.*T */ + + /* saturn r, T^2 */ + { 436902.5, 4.7867167, 213.2990954 }, + { 71922.8, 2.500700, 206.185548 }, + { 49766.8, 4.971682, 220.412642 }, + { 43220.9, 3.869404, 426.598191 }, + { 29645.6, 5.963103, 7.113547 }, + { 4141.6, 4.10671, 433.71174 }, + { 4720.9, 2.47528, 199.07200 }, + { 3789.4, 3.09771, 639.89729 }, + { 2964.0, 1.37206, 103.09277 }, + { 2556.4, 2.85066, 419.48464 }, + { 2208.5, 6.27589, 110.20632 }, + { 2187.6, 5.85546, 14.22709 }, + { 1956.9, 4.92449, 227.52619 }, + { 2326.8, 0, 0 }, + { 923.8, 5.4639, 323.5054 }, + { 705.9, 2.9708, 95.9792 }, + { 546.1, 4.1285, 412.3711 }, + { 373.8, 5.8344, 117.3199 }, + { 360.9, 3.2770, 647.0108 }, + { 356.3, 3.1915, 210.1177 }, + { 390.6, 4.4811, 216.4805 }, + { 431.5, 5.1783, 522.5774 }, + { 325.6, 2.2687, 853.1964 }, + { 405.0, 4.1729, 209.3669 }, + { 204.5, 0.0877, 202.2534 }, + { 206.9, 4.0219, 735.8765 }, + { 178.5, 4.0972, 440.8253 }, + { 180.1, 3.5970, 632.7837 }, + { 153.7, 3.1347, 625.6702 }, + { 147.8, 0.1361, 302.1648 }, + { 123.2, 4.1890, 88.8657 }, + { 133.1, 2.5935, 191.9585 }, + { 100.4, 5.4606, 3.1814 }, + { 132.0, 5.9329, 309.2783 }, + { 97.2, 4.018, 728.763 }, + { 110.7, 4.7785, 838.9693 }, + { 119.1, 5.5539, 224.3448 }, + { 93.9, 4.384, 217.231 }, + { 108.7, 5.2931, 515.4639 }, + { 78.6, 5.725, 21.341 }, + { 81.5, 5.109, 956.289 }, + { 96.4, 6.259, 742.990 }, + { 69.2, 4.049, 3.932 }, + { 65.2, 3.777, 1052.268 }, + { 64.1, 5.812, 529.691 }, + { 62.5, 2.184, 195.140 }, + { 57.0, 3.147, 203.004 }, + { 56.0, 4.841, 234.640 }, + { 52.9, 5.078, 330.619 }, + { 50.6, 2.773, 942.062 }, + { 41.6, 4.790, 63.736 }, + { 44.9, 0.565, 269.921 }, + { 41.4, 3.735, 316.392 }, + { 52.8, 3.926, 949.176 }, + { 38.4, 3.740, 1045.155 }, + { 37.6, 4.189, 536.805 }, + { 35.3, 2.908, 284.149 }, + { 33.6, 3.805, 149.563 }, + { 41.1, 4.579, 1155.361 }, + { 30.4, 2.481, 860.310 }, + { 31.4, 4.841, 1272.681 }, + { 30.2, 4.352, 405.258 }, + { 39.4, 3.509, 422.666 }, + { 29.7, 1.589, 1066.495 }, + { 35.2, 5.945, 1059.382 }, + { 25.8, 3.549, 1368.660 }, + { 26.3, 4.816, 124.433 }, + { 30.0, 3.663, 429.780 }, + { 33.0, 4.969, 831.856 }, + { 24.3, 5.311, 10.295 }, + { 26.3, 4.453, 223.594 }, + { 22.1, 2.761, 415.552 }, + { 27.2, 1.663, 277.035 }, + { 21.6, 1.038, 11.046 }, + { 19.7, 2.522, 1258.454 }, + { 17.1, 3.277, 654.124 }, + { 17.3, 3.494, 1361.547 }, + { 16.1, 1.734, 490.334 }, + { 21.1, 3.621, 1265.567 }, + { 17.7, 4.311, 1471.753 }, + { 13.5, 0.323, 295.051 }, + { 12.6, 3.138, 74.782 }, + { 12.0, 2.329, 210.851 }, + { 15.1, 3.596, 265.989 }, + { 13.0, 4.624, 1589.073 }, + { 15.4, 5.013, 127.472 }, + { 11.2, 4.550, 81.752 }, + { 13.4, 4.887, 437.644 }, + { 10.7, 5.052, 191.208 }, + { 14.0, 3.050, 423.417 }, + { 10.6, 5.028, 137.033 }, + { 14.4, 4.687, 1148.248 }, + { 13.5, 1.903, 408.439 }, + { 10.1, 5.204, 340.771 }, + { 10.3, 3.345, 1685.052 }, + { 9.6, 3.17, 351.82 }, + { 11.3, 5.478, 1375.774 }, + { 8.6, 2.81, 99.91 }, + { 8.5, 3.23, 1677.94 }, + { 7.9, 2.36, 1574.85 }, + { 7.6, 6.08, 231.46 }, + { 9.2, 3.40, 1581.96 }, + { 7.3, 2.00, 131.40 }, + { 8.2, 4.04, 1788.14 }, + { 7.6, 3.68, 846.08 }, + { 6.7, 4.37, 145.63 }, + { 7.5, 3.29, 750.10 }, + { 6.4, 4.00, 447.94 }, + { 6.2, 4.56, 106.27 }, + { 6.5, 1.34, 215.75 }, + { 6.5, 3.78, 313.21 }, + { 6.0, 0.55, 18.16 }, + { 6.2, 2.85, 138.52 }, + { 6.8, 4.83, 319.57 }, + { 6.7, 5.43, 508.35 }, + { 7.2, 4.38, 1464.64 }, + { 5.8, 4.14, 543.92 }, + { 5.7, 4.35, 1905.46 }, + { 5.1, 2.64, 288.08 }, + { 5.3, 3.63, 6076.89 }, + { 5.5, 4.20, 721.65 }, + { 5.1, 5.05, 10007.10 }, + { 5.5, 1.13, 56.62 }, + { 4.8, 3.30, 76.27 }, + { 4.9, 6.18, 483.22 }, + { 5.0, 2.45, 628.85 }, + { 4.5, 1.20, 200.77 }, + { 4.8, 3.12, 2001.44 }, + { 4.7, 1.27, 6062.66 }, + { 4.8, 5.78, 184.84 }, + { 4.8, 0.76, 333.66 }, + { 4.5, 0.95, 343.22 }, + { 4.5, 2.69, 9992.87 }, + { 4.4, 0.80, 222.86 }, + { 4.9, 5.92, 618.56 }, + { 4.1, 1.92, 497.45 }, + { 5.1, 4.50, 416.30 }, + { 4.1, 1.98, 347.88 }, + { 4.0, 2.88, 38.13 }, + { 4.1, 2.90, 107.02 }, + { 4.0, 2.93, 1994.33 }, + { 4.9, 3.12, 1898.35 }, + { 3.7, 3.25, 362.86 }, + { 3.8, 0.88, 703.63 }, + { 3.6, 3.48, 388.47 }, + { 3.6, 4.08, 430.53 }, + { 3.6, 0.05, 32.24 }, + { 3.6, 5.46, 6283.08 }, + { 3.5, 1.82, 70.85 }, + { 3.8, 3.12, 635.97 }, + { 3.4, 0.55, 10213.29 }, + { 3.4, 3.52, 629.60 }, + { 3.4, 3.28, 357.45 }, + { 3.3, 1.98, 203.74 }, + { 3.1, 2.18, 1891.24 }, + { 3.2, 1.26, 134.59 }, + { 4.0, 5.45, 1692.17 }, + { 3.2, 2.46, 867.42 }, + { 3.4, 4.21, 337.73 }, + { 3.0, 2.19, 217.96 }, + { 3.6, 5.55, 113.39 }, + { 3.7, 3.79, 2104.54 }, + { 3.1, 4.09, 1478.87 }, + { 2.9, 3.91, 312.20 }, + { 3.2, 3.92, 1038.04 }, + { 4.0, 5.18, 404.51 }, + { 3.9, 4.12, 1781.03 }, + { 3.1, 1.61, 1073.61 }, + { 3.1, 5.01, 312.46 }, + { 3.0, 5.46, 258.88 }, + { 2.9, 2.38, 181.06 }, + { 3.0, 0.89, 1279.79 }, + { 2.7, 0.01, 195.89 }, + { 3.1, 5.60, 216.22 }, + { 2.6, 6.13, 273.10 }, + { 2.7, 2.32, 565.12 }, + { 3.2, 3.88, 85.83 }, + { 2.7, 5.74, 160.61 }, + { 2.9, 4.75, 213.25 }, + { 2.5, 5.30, 444.76 }, + { 2.8, 5.09, 1169.59 }, + { 2.9, 1.67, 213.35 }, + { 2.9, 4.21, 650.94 }, + { 3.0, 2.55, 6069.78 }, + { 3.1, 2.67, 52.69 }, + { 2.4, 0.90, 121.25 }, + { 3.0, 3.97, 9999.99 }, + { 3.1, 0.41, 561.18 }, + { 2.4, 4.74, 218.72 }, + { 2.6, 1.13, 344.70 }, + { 2.3, 4.08, 131.55 }, + { 2.2, 3.38, 22.09 }, + { 2.1, 3.32, 358.93 }, + { 2.7, 1.69, 208.63 }, + { 2.6, 5.10, 824.74 }, + { 2.2, 2.60, 305.35 }, + { 2.1, 3.37, 320.32 }, + { 2.7, 3.62, 436.89 }, + { 2.5, 2.96, 2214.74 }, + { 2.7, 2.88, 643.08 }, + { 2.1, 1.61, 218.93 }, + { 2.0, 4.63, 188.03 }, + { 2.4, 3.46, 6275.96 }, + { 2.0, 2.29, 2627.11 }, + { 1.9, 5.67, 28.45 }, + { 1.9, 4.26, 546.96 }, + { 2.5, 3.58, 2420.93 }, + { 1.9, 1.31, 212.34 }, + { 1.9, 1.59, 424.15 }, + { 1.9, 3.58, 329.73 }, + { 2.1, 3.95, 1795.26 }, + { 2.2, 4.22, 2221.86 }, + { 1.9, 1.69, 350.33 }, + { 1.8, 2.07, 144.15 }, + { 1.9, 4.61, 182.28 }, + { 2.2, 5.18, 99.16 }, + { 1.8, 2.73, 291.26 }, + { 2.2, 5.43, 207.88 }, + { 1.8, 2.24, 168.05 }, + { 1.7, 1.32, 219.45 }, + { 1.7, 5.56, 92.80 }, + { 1.7, 1.95, 129.92 }, + { 2.1, 4.85, 1141.13 }, + { 1.8, 5.05, 214.26 }, + { 1.8, 2.86, 636.72 }, + { 1.9, 2.90, 2310.72 }, + { 1.8, 5.35, 45.58 }, + { 1.7, 6.14, 554.07 }, + { 1.6, 4.51, 210.38 }, + { 1.7, 3.55, 1354.43 }, + { 1.9, 3.01, 2317.84 }, + { 1.6, 1.16, 235.39 }, + { 1.9, 4.13, 225.83 }, + { 1.6, 3.30, 1670.83 }, + { 1.9, 0.18, 12.53 }, + { 1.6, 5.73, 1485.98 }, + { 1.7, 3.44, 2428.04 }, + { 1.8, 2.70, 12.74 }, + { 1.7, 4.98, 2008.56 }, + /* 239 terms retained, 103 terms dropped, error 5.2e-07 a.u.*T^2 */ + + /* saturn r, T^3 */ + { 20315.0, 3.021866, 213.299095 }, + { 8923.6, 3.19144, 220.41264 }, + { 6908.7, 4.35175, 206.18555 }, + { 4087.1, 4.22407, 7.11355 }, + { 3879.0, 2.01056, 426.59819 }, + { 1070.8, 4.20360, 199.07200 }, + { 907.3, 2.2834, 433.7117 }, + { 606.1, 3.1746, 227.5262 }, + { 596.6, 4.1346, 14.2271 }, + { 483.2, 1.1735, 639.8973 }, + { 393.2, 0, 0 }, + { 229.5, 4.6984, 419.4846 }, + { 188.2, 4.5900, 110.2063 }, + { 149.5, 3.2020, 103.0928 }, + { 121.4, 3.7683, 323.5054 }, + { 101.2, 5.8188, 412.3711 }, + { 102.1, 4.7097, 95.9792 }, + { 93.1, 1.435, 647.011 }, + { 72.6, 4.154, 117.320 }, + { 84.3, 2.635, 216.480 }, + { 62.2, 2.312, 440.825 }, + { 45.1, 4.373, 191.958 }, + { 49.5, 2.389, 209.367 }, + { 54.8, 0.305, 853.196 }, + { 40.5, 1.838, 302.165 }, + { 38.1, 5.945, 88.866 }, + { 32.2, 4.011, 21.341 }, + { 40.7, 0.688, 522.577 }, + { 28.2, 5.772, 210.118 }, + { 25.0, 3.062, 234.640 }, + { 20.8, 4.926, 625.670 }, + { 25.1, 0.731, 515.464 }, + { 17.5, 5.731, 728.763 }, + { 18.0, 1.456, 309.278 }, + { 16.9, 3.528, 3.181 }, + { 13.4, 3.365, 330.619 }, + { 11.1, 3.372, 224.345 }, + { 11.1, 3.417, 956.289 }, + { 10.0, 1.588, 202.253 }, + { 11.6, 5.991, 735.877 }, + { 10.5, 6.069, 405.258 }, + { 9.1, 2.94, 124.43 }, + { 8.7, 4.65, 632.78 }, + { 10.0, 0.582, 860.310 }, + { 7.5, 4.51, 942.06 }, + { 10.1, 0.283, 838.969 }, + { 9.2, 2.57, 223.59 }, + { 8.7, 1.76, 429.78 }, + { 7.6, 1.46, 654.12 }, + { 7.1, 5.47, 1045.15 }, + { 7.0, 1.52, 422.67 }, + { 8.1, 4.48, 742.99 }, + { 6.8, 4.83, 316.39 }, + { 7.7, 0.44, 831.86 }, + { 7.9, 4.20, 195.14 }, + { 6.1, 2.34, 269.92 }, + { 5.6, 1.15, 284.15 }, + { 5.6, 4.18, 529.69 }, + { 5.0, 2.12, 295.05 }, + { 6.6, 3.42, 10.29 }, + { 5.5, 2.47, 536.80 }, + { 6.2, 6.01, 1066.50 }, + { 5.6, 0.83, 217.23 }, + { 4.3, 3.23, 1272.68 }, + { 4.5, 0.92, 203.00 }, + { 3.3, 4.33, 1258.45 }, + { 3.7, 0.06, 81.75 }, + { 4.0, 0.11, 1155.36 }, + { 3.8, 6.01, 1052.27 }, + { 2.9, 5.64, 3.93 }, + { 3.0, 2.19, 447.94 }, + { 3.0, 1.89, 149.56 }, + { 3.1, 0.19, 1148.25 }, + { 2.8, 0.92, 508.35 }, + { 2.8, 4.97, 1677.94 }, + { 2.6, 3.00, 1589.07 }, + { 2.9, 5.41, 1361.55 }, + { 2.3, 1.30, 184.84 }, + { 2.5, 3.71, 408.44 }, + { 2.5, 3.22, 319.57 }, + { 2.6, 2.31, 543.92 }, + { 2.3, 5.88, 721.65 }, + { 2.0, 0.52, 416.30 }, + { 2.5, 4.24, 1059.38 }, + { 1.9, 2.41, 337.73 }, + { 1.9, 0.54, 635.97 }, + { 1.9, 5.62, 11.05 }, + { 2.4, 5.73, 313.21 }, + { 1.9, 2.41, 131.55 }, + { 1.7, 4.58, 1994.33 }, + { 1.9, 5.17, 2854.64 }, + { 1.9, 6.23, 1471.75 }, + { 2.0, 6.18, 1464.64 }, + { 1.8, 5.59, 1038.04 }, + { 1.5, 0.61, 210.85 }, + { 1.6, 1.75, 195.89 }, + { 1.6, 0.56, 2324.95 }, + { 1.5, 0.27, 497.45 }, + { 1.7, 2.58, 2090.31 }, + { 1.8, 1.82, 436.89 }, + { 1.6, 6.15, 490.33 }, + { 1.8, 6.12, 1073.61 }, + { 1.5, 0.85, 415.55 }, + { 1.6, 2.95, 437.64 }, + { 1.4, 4.12, 1574.85 }, + { 1.6, 5.97, 1781.03 }, + { 1.5, 3.85, 1251.34 }, + { 1.4, 5.33, 2538.25 }, + { 1.8, 1.51, 750.10 }, + { 1.5, 3.29, 1884.12 }, + { 1.5, 0.99, 643.08 }, + { 1.3, 3.79, 1567.73 }, + { 1.7, 0.03, 423.42 }, + { 1.5, 5.35, 1354.43 }, + { 1.4, 0.70, 867.42 }, + { 1.1, 1.80, 618.56 }, + { 1.1, 4.70, 113.39 }, + { 1.1, 3.96, 1891.24 }, + { 1.5, 1.50, 430.53 }, + { 1.1, 5.13, 25.27 }, + { 1.2, 2.97, 241.75 }, + { 1.3, 2.29, 2420.93 }, + { 1.1, 0.05, 63.74 }, + { 1.4, 5.58, 1382.89 }, + { 1.1, 3.11, 2200.52 }, + { 1.1, 0.79, 127.47 }, + { 1.0, 5.85, 215.75 }, + { 1.1, 3.73, 131.40 }, + { 1.2, 0.48, 824.74 }, + { 1.1, 3.78, 1375.77 }, + { 1.0, 5.91, 265.99 }, + { 1.2, 1.41, 2634.23 }, + { 1.1, 4.80, 1987.22 }, + { 0.9, 6.26, 2015.67 }, + { 1.0, 1.09, 362.86 }, + { 1.1, 5.42, 1279.79 }, + { 0.9, 1.92, 483.22 }, + { 0.9, 2.97, 934.95 }, + { 0.9, 2.66, 145.63 }, + { 0.9, 6.26, 2.45 }, + { 1.1, 4.48, 2214.74 }, + { 1.0, 0.74, 16.67 }, + { 1.0, 4.06, 231.46 }, + { 0.9, 0.09, 628.85 }, + { 0.9, 5.99, 2524.02 }, + { 0.9, 3.16, 2207.63 }, + { 0.8, 1.24, 74.78 }, + { 0.8, 2.90, 2008.56 }, + { 0.8, 2.28, 1478.87 }, + { 1.0, 5.33, 2428.04 }, + { 0.8, 2.38, 2228.97 }, + { 0.8, 4.70, 1670.83 }, + { 1.0, 4.23, 1802.37 }, + { 0.8, 5.87, 1368.66 }, + { 0.7, 5.92, 1685.05 }, + { 0.8, 1.16, 3053.71 }, + { 0.7, 3.13, 56.62 }, + /* 157 terms retained, 0 terms dropped, error 1.7e-07 a.u.*T^3 */ + + /* saturn r, T^4 */ + { 1202.0, 1.41499, 220.41264 }, + { 707.8, 1.1615, 213.2991 }, + { 516.1, 6.2397, 206.1855 }, + { 426.7, 2.4692, 7.1135 }, + { 267.7, 0.1866, 426.5982 }, + { 170.2, 5.9593, 199.0720 }, + { 145.1, 1.4421, 227.5262 }, + { 150.3, 0.4797, 433.7117 }, + { 121.0, 2.4053, 14.2271 }, + { 47.3, 5.569, 639.897 }, + { 15.7, 2.901, 110.206 }, + { 16.7, 0.529, 440.825 }, + { 19.0, 5.856, 647.011 }, + { 14.1, 1.303, 412.371 }, + { 12.7, 2.093, 323.505 }, + { 14.7, 0.299, 419.485 }, + { 11.1, 2.463, 117.320 }, + { 11.3, 0.218, 95.979 }, + { 9.2, 2.28, 21.34 }, + { 9.2, 1.56, 88.87 }, + { 9.0, 0.68, 216.48 }, + { 7.7, 3.59, 302.16 }, + { 7.8, 4.49, 853.20 }, + { 8.4, 1.27, 234.64 }, + { 9.6, 3.14, 0 }, + { 4.8, 2.59, 515.46 }, + { 6.1, 5.17, 103.09 }, + { 4.4, 0.02, 191.96 }, + { 4.4, 1.60, 330.62 }, + { 3.7, 3.30, 210.12 }, + { 4.4, 5.97, 654.12 }, + { 4.4, 4.97, 860.31 }, + { 3.2, 2.73, 522.58 }, + { 4.0, 1.60, 405.26 }, + { 3.1, 0.75, 209.37 }, + { 2.5, 1.19, 124.43 }, + { 3.1, 1.32, 728.76 }, + { 2.2, 3.28, 203.00 }, + { 2.1, 6.15, 429.78 }, + { 2.1, 0.75, 295.05 }, + { 2.0, 3.89, 1066.50 }, + { 2.2, 0.49, 447.94 }, + { 2.2, 0.73, 625.67 }, + { 1.8, 0.09, 942.06 }, + { 1.7, 1.40, 224.34 }, + { 1.6, 3.02, 184.84 }, + { 1.8, 0.82, 223.59 }, + { 1.9, 2.00, 831.86 }, + { 1.6, 5.41, 824.74 }, + { 1.5, 5.96, 422.67 }, + { 1.1, 1.12, 838.97 }, + { 1.2, 1.90, 956.29 }, + { 1.5, 2.12, 529.69 }, + { 1.4, 0.72, 536.80 }, + { 1.1, 0.89, 721.65 }, + { 1.3, 1.65, 17.41 }, + { 1.2, 5.97, 195.14 }, + { 1.0, 5.36, 316.39 }, + { 1.0, 3.06, 1574.85 }, + { 1.1, 1.59, 735.88 }, + { 0.8, 4.93, 56.62 }, + { 0.8, 2.72, 508.35 }, + { 1.0, 1.01, 1045.15 }, + { 0.7, 1.11, 1169.59 }, + /* 64 terms retained, 0 terms dropped, error 1.2e-07 a.u.*T^4 */ + + /* saturn r, T^5 */ + { 128.6, 5.9128, 220.4126 }, + { 32.3, 0.693, 7.114 }, + { 26.7, 5.914, 227.526 }, + { 19.9, 0.674, 14.227 }, + { 20.2, 4.951, 433.712 }, + { 13.5, 1.457, 199.072 }, + { 14.1, 2.671, 206.186 }, + { 13.4, 4.588, 426.598 }, + { 7.3, 4.63, 213.30 }, + { 4.9, 3.61, 639.90 }, + { 3.1, 4.66, 191.96 }, + { 2.9, 0.49, 323.51 }, + { 3.8, 4.90, 440.83 }, + { 3.3, 4.07, 647.01 }, + { 2.9, 3.18, 419.48 }, + { 2.3, 3.70, 88.87 }, + { 1.9, 5.33, 302.16 }, + { 2.1, 3.32, 95.98 }, + { 1.6, 2.67, 853.20 }, + { 2.0, 0.56, 117.32 }, + { 1.6, 0.86, 515.46 }, + { 1.7, 0, 0 }, + { 1.1, 5.98, 3.18 }, + { 1.3, 5.83, 234.64 }, + { 0.9, 5.23, 216.48 }, + { 1.1, 0.16, 412.37 }, + { 0.8, 0.37, 28.45 }, + { 0.8, 5.05, 124.43 }, + /* 28 terms retained, 0 terms dropped, error 9e-08 a.u.*T^5 */ + /* end saturn */ +}; + +int vn_saturn[][3] = { + /* addresses for saturn l, b, r */ + /* T^0 */ { 0, 592, 811, }, + /* T^1 */ { 165, 645, 1099, }, + /* T^2 */ { 303, 698, 1345, }, + /* T^3 */ { 418, 744, 1584, }, + /* T^4 */ { 500, 777, 1741, }, + /* T^5 */ { 566, 803, 1805, }, + /* end */ { 592, 811, 1833, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_uranus[][3] = { + /* uranus l, T^0 */ + { 548129294.3, 0, 0 }, + { 9260408.3, 0.89106422, 74.78159857 }, + { 1504247.8, 3.62719262, 1.48447271 }, + { 365981.7, 1.8996219, 73.2971259 }, + { 272328.1, 3.3582371, 149.5631971 }, + { 70328.5, 5.392544, 63.735898 }, + { 68892.6, 6.092925, 76.266071 }, + { 61998.6, 2.269520, 2.968945 }, + { 61950.7, 2.850989, 11.045700 }, + { 26468.9, 3.141521, 71.812653 }, + { 25710.5, 6.113798, 454.909367 }, + { 21078.9, 4.360595, 148.078724 }, + { 17818.7, 1.744370, 36.648563 }, + { 14613.5, 4.737320, 3.932153 }, + { 11162.5, 5.826820, 224.344796 }, + { 10997.9, 0.488655, 138.517497 }, + { 9527.5, 2.95517, 35.16409 }, + { 7545.5, 5.23626, 109.94569 }, + { 4220.2, 3.23329, 70.84945 }, + { 4051.9, 2.27754, 151.04767 }, + { 3354.6, 1.06549, 4.45342 }, + { 2926.7, 4.62904, 9.56123 }, + { 3490.4, 5.48306, 146.59425 }, + { 3144.1, 4.75199, 77.75054 }, + { 2922.4, 5.35237, 85.82730 }, + { 2272.8, 4.36601, 70.32818 }, + { 2051.2, 1.51774, 0.11187 }, + { 2148.6, 0.60746, 38.13304 }, + { 1991.7, 4.92437, 277.03499 }, + { 1376.2, 2.04281, 65.22037 }, + { 1666.9, 3.62745, 380.12777 }, + { 1284.2, 3.11346, 202.25340 }, + { 1150.4, 0.93344, 3.18139 }, + { 1533.2, 2.58593, 52.69020 }, + { 1281.6, 0.54270, 222.86032 }, + { 1372.1, 4.19642, 111.43016 }, + { 1221.0, 0.19901, 108.46122 }, + { 946.2, 1.1925, 127.4718 }, + { 1151.0, 4.17898, 33.67962 }, + { 1244.3, 0.91613, 2.44768 }, + { 1072.0, 0.23565, 62.25143 }, + { 1090.5, 1.77502, 12.53017 }, + { 707.9, 5.1829, 213.2991 }, + { 653.4, 0.9659, 78.7138 }, + { 627.6, 0.1821, 984.6003 }, + { 524.5, 2.0128, 299.1264 }, + { 559.4, 3.3578, 0.5213 }, + { 606.8, 5.4321, 529.6910 }, + { 404.9, 5.9869, 8.0768 }, + { 467.2, 0.4148, 145.1098 }, + { 471.3, 1.4066, 184.7273 }, + { 483.2, 2.1055, 0.9632 }, + { 395.6, 5.8704, 351.8166 }, + { 433.5, 5.5214, 183.2428 }, + { 309.9, 5.8330, 145.6310 }, + { 378.6, 2.3498, 56.6224 }, + { 399.0, 0.3381, 415.5525 }, + { 300.4, 5.6435, 22.0914 }, + { 249.2, 4.7462, 225.8293 }, + { 239.3, 2.3505, 137.0330 }, + { 294.2, 5.8392, 39.6175 }, + { 216.5, 4.7785, 340.7709 }, + { 251.8, 1.6370, 221.3759 }, + { 219.6, 1.9221, 67.6681 }, + { 202.0, 1.2969, 0.0482 }, + { 224.1, 0.5157, 84.3428 }, + { 216.5, 6.1421, 5.9379 }, + { 222.6, 2.8431, 0.2606 }, + { 207.8, 5.5802, 68.8437 }, + { 187.5, 1.3192, 0.1601 }, + { 158.0, 0.7381, 54.1747 }, + { 199.1, 0.9563, 152.5321 }, + { 168.6, 5.8787, 18.1592 }, + { 170.3, 3.6772, 5.4166 }, + { 193.7, 1.8880, 456.3938 }, + { 193.0, 0.9162, 453.4249 }, + { 181.9, 3.5362, 79.2350 }, + { 173.1, 1.5386, 160.6089 }, + { 164.6, 1.4238, 106.9767 }, + { 172.0, 5.6795, 219.8914 }, + { 162.8, 3.0503, 112.9146 }, + { 146.7, 1.2630, 59.8037 }, + { 139.5, 5.3860, 32.1951 }, + { 138.6, 4.2599, 909.8187 }, + { 143.1, 1.3000, 35.4247 }, + { 123.8, 1.3736, 7.1135 }, + { 104.4, 5.0282, 0.7508 }, + { 103.3, 0.6810, 14.9779 }, + { 94.7, 0.907, 74.670 }, + { 83.0, 2.928, 265.989 }, + { 110.2, 2.0269, 554.0700 }, + { 94.2, 3.943, 74.893 }, + { 79.9, 1.014, 6.592 }, + { 109.4, 5.7058, 77.9630 }, + { 85.9, 1.706, 82.858 }, + { 103.6, 1.4577, 24.3790 }, + { 74.7, 4.632, 69.365 }, + { 79.9, 3.010, 297.642 }, + { 84.5, 0.369, 186.212 }, + { 88.8, 0.525, 181.758 }, + { 70.3, 1.190, 66.705 }, + { 70.0, 0.875, 305.346 }, + { 69.9, 3.761, 131.404 }, + { 84.6, 5.887, 256.540 }, + { 74.3, 6.243, 447.796 }, + { 62.3, 0.169, 479.288 }, + { 72.7, 2.849, 462.023 }, + { 69.1, 4.439, 39.357 }, + { 76.6, 4.587, 6.220 }, + { 73.4, 4.276, 87.312 }, + { 55.3, 1.496, 71.600 }, + { 57.3, 1.630, 143.625 }, + { 61.7, 3.186, 77.229 }, + { 57.6, 3.672, 51.206 }, + { 50.3, 1.123, 20.607 }, + { 53.7, 5.519, 128.956 }, + { 57.9, 2.669, 381.612 }, + { 58.1, 1.586, 60.767 }, + { 45.4, 0.481, 14.015 }, + { 37.6, 6.068, 211.815 }, + { 38.6, 3.436, 153.495 }, + { 46.1, 4.362, 75.745 }, + { 40.1, 4.573, 46.210 }, + { 34.2, 2.940, 140.002 }, + { 38.7, 5.589, 99.161 }, + { 34.8, 1.028, 203.738 }, + { 40.0, 0.699, 218.407 }, + { 32.5, 4.216, 200.769 }, + { 31.9, 5.510, 72.334 }, + { 41.7, 3.824, 81.001 }, + { 34.8, 0.394, 1.373 }, + { 39.8, 6.056, 293.189 }, + { 27.6, 2.183, 125.987 }, + { 36.3, 1.666, 258.024 }, + { 35.4, 1.967, 835.037 }, + { 35.4, 3.723, 692.587 }, + { 27.3, 2.102, 209.367 }, + { 26.5, 4.483, 373.908 }, + { 34.5, 1.079, 191.208 }, + { 29.9, 3.874, 259.509 }, + { 26.2, 3.632, 490.334 }, + { 25.8, 0.545, 41.644 }, + { 27.0, 6.277, 28.572 }, + { 26.4, 5.811, 75.303 }, + { 34.2, 6.056, 275.551 }, + { 29.9, 1.888, 269.921 }, + { 26.2, 6.201, 134.585 }, + { 25.2, 5.425, 116.426 }, + { 26.5, 4.772, 284.149 }, + { 27.0, 4.753, 41.102 }, + { 28.9, 0.171, 528.206 }, + { 25.8, 0.746, 278.519 }, + /* 152 terms retained, 795 terms dropped, error 1.3" */ + + /* uranus l, T^1 */ + { 7502543121.6, 0, 0 }, + { 154458.2, 5.2420166, 74.7815986 }, + { 24456.4, 1.712557, 1.484473 }, + { 9257.8, 0.42845, 11.04570 }, + { 8266.0, 1.50220, 63.73590 }, + { 7841.7, 1.31984, 149.56320 }, + { 3899.1, 0.46484, 3.93215 }, + { 2283.8, 4.17368, 76.26607 }, + { 1926.6, 0.53013, 2.96895 }, + { 1232.7, 1.58634, 70.84945 }, + { 791.2, 5.4364, 3.1814 }, + { 767.0, 1.9956, 73.2971 }, + { 481.7, 2.9840, 85.8273 }, + { 449.8, 4.1383, 138.5175 }, + { 445.6, 3.7230, 224.3448 }, + { 426.6, 4.7313, 71.8127 }, + { 347.7, 2.4537, 9.5612 }, + { 353.8, 2.5832, 148.0787 }, + { 317.1, 5.5786, 52.6902 }, + { 179.9, 5.6837, 12.5302 }, + { 171.1, 3.0006, 78.7138 }, + { 205.6, 2.3626, 2.4477 }, + { 158.0, 2.9093, 0.9632 }, + { 189.1, 4.2024, 56.6224 }, + { 154.7, 5.5908, 4.4534 }, + { 183.8, 0.2837, 151.0477 }, + { 143.5, 2.5905, 62.2514 }, + { 152.0, 2.9422, 77.7505 }, + { 153.5, 4.6519, 35.1641 }, + { 121.5, 4.1484, 127.4718 }, + { 115.5, 3.7322, 65.2204 }, + { 102.0, 4.1875, 145.6310 }, + { 101.7, 6.0339, 0.1119 }, + { 88.2, 3.990, 18.159 }, + { 87.5, 6.155, 202.253 }, + { 80.5, 2.641, 22.091 }, + { 72.0, 6.045, 70.328 }, + { 68.6, 4.051, 77.963 }, + { 59.2, 3.704, 67.668 }, + { 47.3, 3.543, 351.817 }, + { 42.5, 5.724, 5.417 }, + { 44.3, 5.909, 7.114 }, + { 35.6, 3.292, 8.077 }, + { 35.5, 3.328, 71.600 }, + { 36.1, 5.900, 33.680 }, + { 30.6, 5.464, 160.609 }, + { 31.5, 5.620, 984.600 }, + { 38.5, 4.915, 222.860 }, + { 35.0, 5.080, 38.133 }, + { 30.8, 5.496, 59.804 }, + { 28.9, 4.519, 84.343 }, + { 26.6, 5.541, 131.404 }, + { 29.9, 1.660, 447.796 }, + { 29.2, 1.147, 462.023 }, + { 25.8, 4.994, 137.033 }, + { 25.4, 5.736, 380.128 }, + { 21.7, 2.806, 69.365 }, + { 26.6, 6.146, 299.126 }, + { 23.0, 2.249, 111.430 }, + { 19.2, 3.556, 54.175 }, + { 21.8, 0.933, 213.299 }, + { 19.3, 1.862, 108.461 }, + { 16.2, 3.102, 14.978 }, + { 13.1, 1.954, 87.312 }, + { 13.9, 1.541, 340.771 }, + { 13.5, 4.385, 5.938 }, + { 13.1, 5.883, 6.220 }, + { 11.8, 0.326, 35.425 }, + { 11.0, 1.692, 45.577 }, + { 12.4, 0.328, 51.206 }, + { 10.9, 5.971, 265.989 }, + { 11.4, 3.378, 72.334 }, + { 12.0, 3.604, 269.921 }, + { 11.7, 1.745, 79.235 }, + { 13.8, 2.690, 225.829 }, + { 12.0, 5.344, 152.532 }, + { 9.9, 5.50, 153.50 }, + { 10.4, 4.169, 24.379 }, + { 10.6, 3.069, 284.149 }, + { 9.6, 0.50, 209.37 }, + { 9.3, 3.54, 41.64 }, + { 9.5, 5.60, 82.86 }, + { 9.7, 1.01, 68.84 }, + { 9.2, 4.49, 20.61 }, + { 10.2, 3.518, 529.691 }, + { 8.6, 3.89, 60.77 }, + { 10.0, 4.648, 77.229 }, + { 8.7, 1.97, 195.14 }, + { 8.4, 4.41, 134.59 }, + { 9.3, 3.93, 39.62 }, + { 7.8, 5.36, 75.74 }, + { 7.7, 5.77, 73.82 }, + { 7.7, 4.44, 14.01 }, + { 8.4, 2.44, 146.59 }, + { 8.0, 5.73, 184.73 }, + { 7.5, 2.19, 145.11 }, + { 6.4, 0.85, 32.20 }, + { 6.3, 2.17, 74.89 }, + { 7.9, 0.17, 120.36 }, + { 7.0, 4.12, 191.21 }, + { 6.9, 2.13, 116.43 }, + /* 101 terms retained, 325 terms dropped, error 0.29"*T */ + + /* uranus l, T^2 */ + { 53033.3, 0, 0 }, + { 2357.6, 2.26015, 74.78160 }, + { 769.1, 4.5256, 11.0457 }, + { 551.5, 3.2581, 63.7359 }, + { 541.5, 2.2757, 3.9322 }, + { 529.5, 4.9235, 1.4845 }, + { 257.5, 3.6906, 3.1814 }, + { 238.8, 5.8581, 149.5632 }, + { 181.9, 6.2176, 70.8494 }, + { 49.4, 6.031, 56.622 }, + { 53.5, 1.442, 76.266 }, + { 38.2, 1.785, 52.690 }, + { 44.8, 3.909, 2.448 }, + { 44.5, 0.812, 85.827 }, + { 37.4, 4.462, 2.969 }, + { 33.0, 0.864, 9.561 }, + { 24.3, 2.107, 18.159 }, + { 29.4, 5.098, 73.297 }, + { 22.1, 4.817, 78.714 }, + { 22.5, 5.993, 138.517 }, + { 17.2, 2.535, 145.631 }, + { 21.4, 2.399, 77.963 }, + { 20.6, 2.169, 224.345 }, + { 16.8, 3.466, 12.530 }, + { 12.0, 0.019, 22.091 }, + { 10.5, 4.456, 62.251 }, + { 11.0, 0.085, 127.472 }, + { 8.7, 4.26, 7.11 }, + { 10.5, 5.165, 71.600 }, + { 7.2, 1.25, 5.42 }, + { 8.4, 5.50, 67.67 }, + { 6.1, 5.45, 65.22 }, + { 6.0, 4.52, 151.05 }, + { 5.7, 1.83, 202.25 }, + { 6.1, 3.36, 447.80 }, + { 6.0, 5.73, 462.02 }, + { 5.1, 3.52, 59.80 }, + { 5.2, 1.06, 131.40 }, + { 6.0, 5.61, 148.08 }, + { 5.1, 3.36, 4.45 }, + { 4.8, 1.20, 71.81 }, + { 4.0, 0.68, 77.75 }, + { 3.7, 1.76, 351.82 }, + { 3.1, 3.84, 45.58 }, + { 3.0, 3.32, 160.61 }, + { 3.0, 6.15, 77.23 }, + { 3.6, 4.57, 454.91 }, + { 2.7, 5.36, 269.92 }, + { 2.5, 1.05, 69.36 }, + { 2.3, 2.69, 84.34 }, + { 2.2, 5.08, 14.98 }, + { 2.2, 1.39, 284.15 }, + { 2.1, 4.35, 984.60 }, + { 2.1, 2.32, 120.36 }, + { 1.9, 5.70, 54.17 }, + { 2.0, 3.87, 195.14 }, + { 1.6, 5.08, 209.37 }, + { 1.6, 0.49, 137.03 }, + { 1.6, 2.91, 51.21 }, + { 1.7, 6.26, 41.64 }, + { 2.1, 1.24, 35.16 }, + { 1.7, 6.28, 277.03 }, + /* 62 terms retained, 89 terms dropped, error 0.055"*T^2 */ + + /* uranus l, T^3 */ + { 120.9, 0.0242, 74.7816 }, + { 68.1, 4.121, 3.932 }, + { 52.8, 2.390, 11.046 }, + { 43.8, 2.960, 1.484 }, + { 45.3, 2.044, 3.181 }, + { 45.8, 0, 0 }, + { 25.0, 4.887, 63.736 }, + { 21.1, 4.545, 70.849 }, + { 19.9, 2.313, 149.563 }, + { 8.9, 1.58, 56.62 }, + { 4.3, 0.23, 18.16 }, + { 3.6, 5.39, 76.27 }, + { 3.5, 4.98, 85.83 }, + { 3.5, 4.13, 52.69 }, + { 3.6, 0.95, 77.96 }, + { 2.3, 0.86, 145.63 }, + { 2.7, 0.37, 78.71 }, + { 1.9, 2.68, 7.11 }, + { 2.2, 5.66, 9.56 }, + { 1.4, 4.87, 224.34 }, + { 1.3, 1.25, 12.53 }, + { 1.6, 0.49, 71.60 }, + { 1.5, 5.20, 73.30 }, + { 1.2, 3.93, 22.09 }, + { 0.9, 2.19, 127.47 }, + { 0.8, 3.98, 462.02 }, + { 0.8, 5.06, 447.80 }, + { 0.7, 0.35, 5.63 }, + { 0.7, 1.06, 138.52 }, + { 0.7, 2.94, 131.40 }, + { 0.5, 1.59, 151.05 }, + { 0.4, 4.33, 120.36 }, + /* 32 terms retained, 14 terms dropped, error 0.0098"*T^3 */ + + /* uranus l, T^4 */ + { 113.9, 3.1416, 0 }, + { 5.6, 4.58, 74.78 }, + { 3.2, 0.35, 11.05 }, + { 1.2, 3.42, 56.62 }, + { 0.6, 4.66, 18.16 }, + { 0.2, 3.80, 149.56 }, + { 0.1, 4.36, 63.74 }, + /* 7 terms retained, 0 terms dropped, error 0.0016"*T^4 */ + + /* uranus l, T^5 */ + { 0.9, 3.14, 0 }, + /* 1 terms retained, 0 terms dropped, error 0.0051"*T^5 */ + /* end uranus l */ + + /* uranus b, T^0 */ + { 1346277.6, 2.61877811, 74.78159857 }, + { 62341.4, 5.081112, 149.563197 }, + { 61601.2, 3.141593, 0 }, + { 9963.7, 1.61604, 76.26607 }, + { 9926.2, 0.57630, 73.29713 }, + { 3259.5, 1.26119, 224.34480 }, + { 2972.3, 2.24367, 1.48447 }, + { 2010.3, 6.05550, 148.07872 }, + { 1522.2, 0.27960, 63.73590 }, + { 924.1, 4.0382, 151.0477 }, + { 760.6, 6.1400, 71.8127 }, + { 420.3, 5.2128, 11.0457 }, + { 430.7, 3.5545, 213.2991 }, + { 436.8, 3.3808, 529.6910 }, + { 522.3, 3.3209, 138.5175 }, + { 434.6, 0.3407, 77.7505 }, + { 462.6, 0.7426, 85.8273 }, + { 232.6, 2.2572, 222.8603 }, + { 215.8, 1.5912, 38.1330 }, + { 244.7, 0.7880, 2.9689 }, + { 179.9, 3.7249, 299.1264 }, + { 174.9, 1.2355, 146.5943 }, + { 173.7, 1.9365, 380.1278 }, + { 160.4, 5.3364, 111.4302 }, + { 144.1, 5.9624, 35.1641 }, + { 102.0, 2.6188, 78.7138 }, + { 116.4, 5.7388, 70.8494 }, + { 106.4, 0.9410, 70.3282 }, + { 86.2, 0.703, 39.618 }, + { 72.6, 0.206, 225.829 }, + { 71.2, 0.833, 109.946 }, + { 57.5, 2.670, 108.461 }, + { 54.3, 3.352, 184.727 }, + { 44.5, 2.744, 152.532 }, + { 38.6, 5.174, 202.253 }, + { 39.2, 2.171, 351.817 }, + { 41.3, 3.221, 160.609 }, + { 35.1, 4.001, 112.915 }, + { 33.1, 3.614, 221.376 }, + { 31.3, 2.720, 145.110 }, + { 37.3, 4.021, 52.690 }, + { 32.0, 1.292, 145.631 }, + { 27.6, 3.701, 36.649 }, + /* 43 terms retained, 240 terms dropped, error 0.75" */ + + /* uranus b, T^1 */ + { 206366.2, 4.1239431, 74.7815986 }, + { 8563.2, 0.33820, 149.56320 }, + { 1725.7, 2.12193, 73.29713 }, + { 1368.9, 3.06862, 76.26607 }, + { 1374.4, 0, 0 }, + { 399.8, 2.8477, 224.3448 }, + { 450.6, 3.7766, 1.4845 }, + { 307.2, 1.2546, 148.0787 }, + { 154.3, 3.7858, 63.7359 }, + { 110.9, 5.3289, 138.5175 }, + { 112.4, 5.5730, 151.0477 }, + { 83.5, 3.592, 71.813 }, + { 55.6, 3.401, 85.827 }, + { 41.4, 4.455, 78.714 }, + { 53.7, 1.705, 77.751 }, + { 41.9, 1.215, 11.046 }, + { 32.0, 3.774, 222.860 }, + { 30.3, 2.564, 2.969 }, + { 27.0, 5.337, 213.299 }, + { 26.2, 0.416, 380.128 }, + { 20.1, 5.931, 529.691 }, + { 23.0, 2.489, 146.594 }, + { 19.6, 5.372, 299.126 }, + { 20.4, 3.702, 70.849 }, + { 19.1, 1.092, 111.430 }, + { 19.4, 3.830, 38.133 }, + { 10.8, 2.663, 3.932 }, + { 10.2, 2.313, 109.946 }, + { 9.4, 2.77, 39.62 }, + { 7.7, 1.81, 225.83 }, + { 8.1, 4.69, 184.73 }, + { 6.6, 5.50, 35.16 }, + { 7.4, 1.18, 65.22 }, + { 6.5, 4.98, 71.60 }, + /* 34 terms retained, 120 terms dropped, error 0.16"*T */ + + /* uranus b, T^2 */ + { 9211.7, 5.80044, 74.78160 }, + { 556.9, 0, 0 }, + { 286.3, 2.1773, 149.5632 }, + { 95.0, 3.842, 73.297 }, + { 45.4, 4.878, 76.266 }, + { 20.1, 5.463, 1.484 }, + { 14.8, 0.880, 138.517 }, + { 14.0, 5.072, 63.736 }, + { 14.3, 2.845, 148.079 }, + { 10.1, 5.003, 224.345 }, + { 8.3, 6.27, 78.71 }, + { 4.7, 5.16, 71.81 }, + { 3.8, 6.28, 85.83 }, + { 3.5, 3.53, 11.05 }, + { 2.6, 1.44, 151.05 }, + { 2.4, 4.23, 3.93 }, + { 2.6, 0.41, 71.60 }, + /* 17 terms retained, 43 terms dropped, error 0.045"*T^2 */ + + /* uranus b, T^3 */ + { 267.8, 1.2510, 74.7816 }, + { 11.0, 3.142, 0 }, + { 6.2, 4.01, 149.56 }, + { 3.4, 5.78, 73.30 }, + { 1.6, 1.06, 63.74 }, + { 1.3, 1.67, 78.71 }, + { 1.2, 2.59, 138.52 }, + { 1.1, 0.29, 76.27 }, + { 0.6, 1.87, 71.60 }, + { 0.6, 0.80, 1.48 }, + { 0.5, 4.43, 148.08 }, + /* 11 terms retained, 5 terms dropped, error 0.0067"*T^3 */ + + /* uranus b, T^4 */ + { 5.7, 2.85, 74.78 }, + { 0.3, 3.14, 0 }, + /* 2 terms retained, 0 terms dropped, error 0.0021"*T^4 */ + /* end uranus b */ + + /* uranus r, T^0 */ + { 1921264847.9, 0, 0 }, + { 88784984.1, 5.603775270, 74.781598567 }, + { 3440835.5, 0.32836099, 73.29712586 }, + { 2055653.5, 1.78295170, 149.56319713 }, + { 649321.9, 4.5224730, 76.2660713 }, + { 602248.1, 3.8600382, 63.7358983 }, + { 496404.2, 1.4013993, 454.9093665 }, + { 338525.5, 1.5800268, 138.5174969 }, + { 243508.2, 1.5708660, 71.8126532 }, + { 190521.9, 1.9980936, 1.4844727 }, + { 161858.3, 2.7913786, 148.0787244 }, + { 143705.9, 1.3836857, 11.0457003 }, + { 93192.4, 0.174372, 36.648563 }, + { 71424.3, 4.245093, 224.344796 }, + { 89805.8, 3.661054, 109.945689 }, + { 39009.6, 1.669711, 70.849445 }, + { 46677.3, 1.399766, 35.164090 }, + { 39025.7, 3.362347, 277.034994 }, + { 36755.2, 3.886489, 146.594252 }, + { 30348.9, 0.701004, 151.047670 }, + { 29156.3, 3.180562, 77.750544 }, + { 20471.6, 1.555890, 202.253395 }, + { 25620.4, 5.256563, 380.127768 }, + { 25785.8, 3.785377, 85.827299 }, + { 22637.2, 0.725191, 529.690965 }, + { 20473.2, 2.796398, 70.328180 }, + { 17900.6, 0.554555, 2.968945 }, + { 12328.2, 5.960392, 127.471797 }, + { 14701.6, 4.904344, 108.461216 }, + { 11494.7, 0.437740, 65.220371 }, + { 15502.8, 5.354050, 38.133036 }, + { 10792.7, 1.421049, 213.299095 }, + { 11696.1, 3.298256, 3.932153 }, + { 11959.4, 1.750441, 984.600332 }, + { 12896.5, 2.621540, 111.430161 }, + { 11853.0, 0.993428, 52.690198 }, + { 9111.4, 4.99639, 62.25143 }, + { 8420.6, 5.25351, 222.86032 }, + { 7449.1, 0.79492, 351.81659 }, + { 8402.1, 5.03878, 415.55249 }, + { 6046.4, 5.67961, 78.71375 }, + { 5524.1, 3.11499, 9.56123 }, + { 7329.5, 3.97278, 183.24281 }, + { 5444.9, 5.10576, 145.10978 }, + { 5238.1, 2.62960, 33.67962 }, + { 4079.2, 3.22065, 340.77089 }, + { 3801.6, 6.10986, 184.72729 }, + { 3919.5, 4.25015, 39.61751 }, + { 2940.5, 2.14637, 137.03302 }, + { 3781.2, 3.45840, 456.39384 }, + { 2942.2, 0.42394, 299.12639 }, + { 3686.8, 2.48718, 453.42489 }, + { 3101.7, 4.14031, 219.89138 }, + { 2962.6, 0.82978, 56.62235 }, + { 2937.8, 3.67657, 140.00197 }, + { 2865.1, 0.30997, 12.53017 }, + { 2538.0, 4.85458, 131.40395 }, + { 1962.5, 5.24342, 84.34283 }, + { 2363.6, 0.44253, 554.06999 }, + { 1979.4, 6.12836, 106.97674 }, + { 2182.6, 2.94040, 305.34617 }, + { 1963.0, 0.04115, 221.37585 }, + { 1829.6, 4.01106, 68.84371 }, + { 1642.9, 0.35564, 67.66805 }, + { 1584.8, 3.16267, 225.82927 }, + { 1848.7, 2.91112, 909.81873 }, + { 1632.4, 4.23062, 22.09140 }, + { 1401.4, 1.39084, 265.98929 }, + { 1403.7, 5.63564, 4.45342 }, + { 1655.9, 1.96431, 79.23502 }, + { 1249.0, 5.44027, 54.17467 }, + { 1563.4, 1.47918, 112.91463 }, + { 1248.1, 4.88984, 479.28839 }, + { 1197.4, 2.52186, 145.63104 }, + { 1507.0, 5.24186, 181.75834 }, + { 1481.7, 5.66203, 152.53214 }, + { 1438.8, 1.53046, 447.79582 }, + { 1408.5, 4.41922, 462.02291 }, + { 1477.1, 4.32215, 256.53994 }, + { 1228.3, 5.97703, 59.80375 }, + { 1250.0, 6.24485, 160.60890 }, + { 906.5, 5.6203, 74.6697 }, + { 1090.7, 4.15394, 77.96299 }, + { 844.9, 0.1294, 82.8584 }, + { 900.4, 2.3732, 74.8935 }, + { 1072.0, 1.74287, 528.20649 }, + { 689.7, 3.0810, 69.3650 }, + { 593.8, 4.5007, 8.0768 }, + { 718.6, 4.0005, 128.9563 }, + { 699.6, 0.0399, 143.6253 }, + { 575.7, 5.8955, 66.7048 }, + { 759.0, 2.1370, 692.5875 }, + { 710.4, 5.4161, 218.4069 }, + { 548.7, 5.6281, 3.1814 }, + { 651.6, 4.4234, 18.1592 }, + { 539.8, 6.2079, 71.6002 }, + { 544.5, 5.6938, 203.7379 }, + { 710.3, 4.2197, 381.6122 }, + { 593.8, 3.8381, 32.1951 }, + { 710.1, 4.4897, 293.1885 }, + { 705.5, 0.4552, 835.0371 }, + { 588.0, 5.0825, 186.2118 }, + { 598.2, 0.3582, 269.9214 }, + { 641.9, 2.7113, 87.3118 }, + { 495.6, 2.6509, 200.7689 }, + { 630.3, 4.4615, 275.5505 }, + { 575.2, 5.5786, 2.4477 }, + { 569.9, 1.6393, 77.2293 }, + { 556.7, 1.0723, 1059.3819 }, + { 449.4, 0.2798, 617.8059 }, + { 463.6, 1.4345, 297.6419 }, + { 436.5, 0.5280, 209.3669 }, + { 463.9, 2.3544, 211.8146 }, + { 435.9, 2.1008, 1514.2913 }, + { 515.5, 3.2327, 284.1485 }, + { 454.9, 4.0836, 99.1606 }, + { 477.4, 2.8940, 39.3569 }, + { 542.3, 5.3948, 278.5195 }, + { 410.1, 3.0497, 404.5068 }, + { 367.8, 0.7116, 125.9873 }, + { 503.1, 5.8393, 191.2077 }, + { 487.5, 0.0640, 60.7670 }, + { 455.0, 2.5932, 490.3341 }, + { 436.3, 2.0818, 51.2057 }, + { 435.8, 2.7945, 75.7448 }, + { 323.5, 4.8290, 195.1398 }, + { 359.4, 0.0087, 35.4247 }, + { 429.3, 3.0803, 41.1020 }, + { 320.0, 5.4863, 14.9779 }, + { 414.3, 0.0901, 258.0244 }, + { 379.7, 0.0583, 378.6433 }, + { 420.1, 2.2539, 81.0014 }, + { 357.7, 4.7141, 173.9422 }, + { 358.9, 0.3521, 426.5982 }, + { 405.4, 6.1226, 24.3790 }, + { 365.2, 5.5948, 255.0555 }, + { 308.1, 3.9236, 116.4261 }, + { 325.7, 4.7200, 134.5853 }, + { 292.8, 3.9952, 72.3339 }, + { 386.5, 0.6862, 230.5646 }, + { 305.7, 3.7611, 344.7030 }, + { 287.0, 1.8499, 153.4954 }, + { 353.6, 4.6572, 329.8371 }, + { 302.1, 0.1319, 565.1157 }, + { 241.1, 1.6045, 81.3739 }, + { 249.8, 4.2421, 75.3029 }, + { 245.1, 5.9491, 20.6069 }, + { 248.3, 1.0628, 105.4923 }, + { 305.4, 2.5553, 6208.2943 }, + { 296.3, 4.2110, 1364.7281 }, + { 219.9, 2.9612, 120.3582 }, + { 233.6, 2.9707, 46.2098 }, + { 262.4, 3.8365, 831.1050 }, + { 233.5, 4.4812, 628.8516 }, + { 187.4, 3.0353, 135.5486 }, + { 216.8, 3.4291, 241.6103 }, + { 255.8, 1.1671, 177.8744 }, + { 220.5, 0.1963, 180.2739 }, + { 224.5, 0.4068, 114.3991 }, + { 205.4, 2.3038, 259.5089 }, + { 211.1, 4.9308, 103.0928 }, + { 175.8, 5.5082, 7.1135 }, + { 188.5, 2.2359, 5.4166 }, + { 171.7, 5.2173, 41.6445 }, + { 176.1, 1.9596, 756.3234 }, + { 170.4, 4.9498, 206.1855 }, + { 169.5, 4.0432, 55.6591 }, + { 219.0, 0.2479, 294.6730 }, + { 187.8, 2.0454, 408.4389 }, + { 182.3, 0.7073, 391.1735 }, + { 192.1, 5.7672, 291.7040 }, + { 153.7, 4.7066, 543.0243 }, + { 170.0, 4.5100, 288.0807 }, + { 164.1, 5.2253, 67.3592 }, + { 194.3, 6.1169, 414.0680 }, + { 168.0, 5.2581, 518.6453 }, + { 156.6, 0.6630, 220.4126 }, + { 182.3, 0.7838, 417.0370 }, + { 167.5, 4.9224, 422.6660 }, + { 170.8, 2.3093, 98.9000 }, + { 161.7, 3.2726, 443.8637 }, + { 132.8, 2.8888, 373.9080 }, + { 161.1, 3.8234, 451.9404 }, + { 179.3, 4.8241, 366.4856 }, + { 178.2, 3.9803, 10138.5039 }, + { 141.9, 1.2697, 159.1244 }, + { 153.8, 4.2785, 45.5767 }, + { 161.5, 4.9955, 73.8184 }, + { 146.3, 2.6566, 465.9551 }, + { 124.9, 4.3047, 339.2864 }, + { 154.6, 4.3205, 760.2555 }, + { 142.9, 2.0777, 457.8783 }, + { 152.4, 4.6474, 155.7830 }, + { 116.4, 4.4351, 5.9379 }, + { 113.4, 4.6535, 80.1982 }, + { 107.6, 3.7729, 142.4497 }, + { 133.7, 5.3089, 14.0146 }, + { 116.1, 2.5118, 296.1574 }, + { 129.1, 0.3628, 96.8730 }, + { 122.8, 2.3834, 141.4864 }, + { 101.4, 1.0574, 92.3077 }, + { 114.7, 6.2486, 767.3691 }, + { 113.3, 0.8305, 100.3845 }, + { 107.2, 2.3937, 347.8844 }, + { 95.4, 0.801, 342.255 }, + { 110.8, 0.3865, 216.9224 }, + { 127.0, 0.4236, 331.3215 }, + { 112.6, 0.0811, 558.0021 }, + { 103.2, 0.6979, 358.9301 }, + { 111.5, 0.7502, 80.7195 }, + { 90.9, 5.165, 144.147 }, + { 90.7, 0.220, 333.657 }, + { 98.6, 4.332, 74.521 }, + { 89.3, 2.189, 74.830 }, + { 117.2, 3.9497, 74.2603 }, + { 89.1, 5.878, 74.733 }, + { 97.3, 0.694, 977.487 }, + { 116.6, 1.8368, 1289.9465 }, + { 85.4, 5.803, 6.592 }, + { 86.8, 5.620, 300.611 }, + { 105.2, 5.9451, 328.3526 }, + { 112.1, 1.2117, 329.7252 }, + { 83.0, 2.208, 74.942 }, + { 94.3, 4.539, 28.572 }, + { 106.8, 1.8207, 306.8306 }, + { 103.6, 2.9937, 6.2198 }, + { 106.4, 0.8158, 1087.6931 }, + { 77.7, 2.734, 110.206 }, + { 98.4, 3.735, 75.042 }, + { 86.2, 2.833, 983.116 }, + { 89.0, 4.738, 604.473 }, + { 83.0, 1.883, 387.241 }, + { 90.2, 3.804, 986.085 }, + { 84.6, 1.258, 142.141 }, + { 74.7, 1.351, 350.332 }, + { 95.8, 5.548, 969.622 }, + { 90.3, 0.368, 0.963 }, + { 82.7, 5.856, 74.622 }, + { 75.8, 2.780, 88.115 }, + { 83.8, 1.844, 227.314 }, + { 70.7, 4.656, 44.725 }, + { 71.3, 3.650, 894.841 }, + { 94.1, 4.988, 403.134 }, + { 89.0, 4.439, 154.017 }, + { 79.4, 5.667, 267.474 }, + { 75.6, 5.410, 50.403 }, + { 68.6, 4.767, 991.714 }, + { 65.3, 0.693, 152.745 }, + { 63.0, 2.899, 79.889 }, + { 63.9, 0.098, 681.542 }, + { 80.1, 2.975, 526.722 }, + { 69.7, 3.953, 187.696 }, + { 59.5, 3.596, 58.107 }, + { 59.3, 0.509, 28.311 }, + { 68.6, 2.419, 235.390 }, + { 66.0, 5.046, 30.711 }, + { 70.2, 3.736, 546.956 }, + { 66.8, 0.855, 522.577 }, + { 63.0, 0.293, 119.507 }, + { 62.0, 2.316, 74.031 }, + { 71.4, 3.170, 23.576 }, + { 74.8, 5.368, 373.014 }, + { 64.2, 2.368, 157.640 }, + { 70.7, 0.558, 92.941 }, + { 55.8, 5.270, 874.394 }, + { 75.6, 4.663, 101.869 }, + { 73.7, 6.206, 312.460 }, + { 72.9, 0.584, 367.970 }, + { 53.2, 2.247, 17.526 }, + { 63.1, 4.596, 67.880 }, + { 60.5, 0.576, 253.571 }, + { 52.9, 2.459, 264.505 }, + { 70.2, 1.519, 552.586 }, + { 68.6, 2.445, 555.554 }, + { 62.8, 0.338, 561.184 }, + { 49.0, 1.092, 19.122 }, + { 64.6, 5.275, 68.189 }, + { 63.0, 5.359, 92.047 }, + { 47.7, 3.909, 192.692 }, + { 65.3, 4.236, 771.301 }, + { 65.2, 3.739, 536.805 }, + { 59.5, 6.106, 365.001 }, + { 52.2, 1.717, 905.887 }, + { 46.0, 3.871, 210.330 }, + { 46.4, 5.974, 477.804 }, + { 62.1, 2.675, 130.441 }, + { 46.0, 3.894, 48.758 }, + { 42.7, 3.815, 61.288 }, + { 53.9, 2.865, 353.301 }, + { 46.9, 1.000, 166.829 }, + { 42.2, 2.617, 90.823 }, + { 43.3, 4.158, 173.682 }, + { 41.3, 1.799, 149.451 }, + { 45.0, 1.766, 0.521 }, + { 51.9, 2.978, 383.097 }, + { 42.9, 1.574, 120.991 }, + { 49.6, 4.034, 303.862 }, + { 45.3, 3.584, 97.416 }, + { 38.7, 2.394, 31.493 }, + { 38.1, 5.795, 75.532 }, + { 50.1, 4.764, 911.303 }, + { 50.9, 5.155, 439.783 }, + { 43.1, 0.850, 58.319 }, + { 42.7, 5.173, 162.093 }, + { 50.3, 5.816, 66.917 }, + { 35.6, 1.874, 472.175 }, + { 50.0, 1.889, 42.586 }, + { 40.0, 1.743, 89.759 }, + { 45.3, 1.925, 55.138 }, + { 44.9, 1.484, 450.977 }, + { 34.3, 5.203, 316.392 }, + { 46.4, 0.339, 273.103 }, + { 37.2, 2.038, 117.911 }, + { 46.1, 5.623, 1819.637 }, + { 39.4, 4.194, 486.402 }, + { 41.0, 4.830, 149.675 }, + { 45.0, 0.727, 3265.831 }, + { 43.6, 0.753, 404.619 }, + { 31.8, 3.848, 20.447 }, + { 44.2, 4.368, 418.261 }, + { 37.9, 3.029, 167.089 }, + { 43.7, 1.573, 491.558 }, + { 34.0, 1.263, 260.993 }, + { 31.3, 4.161, 13.333 }, + { 40.0, 2.866, 468.243 }, + { 36.5, 2.588, 68.562 }, + { 32.4, 3.116, 103.353 }, + { 33.9, 0.156, 24.118 }, + { 35.9, 1.368, 59.282 }, + { 33.6, 0.755, 290.220 }, + { 29.8, 5.332, 1033.358 }, + { 32.0, 4.675, 205.222 }, + { 31.0, 4.628, 258.876 }, + { 35.3, 1.007, 1108.140 }, + { 33.4, 3.407, 43.129 }, + { 32.6, 5.255, 114.138 }, + { 29.8, 5.642, 254.944 }, + { 31.6, 3.782, 152.011 }, + { 31.0, 2.267, 104.008 }, + { 34.6, 5.173, 25.603 }, + { 28.4, 1.769, 820.059 }, + { 28.0, 3.925, 199.284 }, + { 29.0, 2.582, 76.479 }, + { 33.8, 5.794, 274.066 }, + { 29.4, 5.936, 280.967 }, + { 31.1, 1.394, 178.789 }, + { 30.1, 0.444, 27.087 }, + { 33.8, 6.262, 401.650 }, + { 27.5, 2.152, 480.773 }, + { 26.9, 2.513, 123.540 }, + { 26.1, 0.220, 286.596 }, + { 26.5, 3.882, 372.424 }, + { 34.0, 1.446, 88.796 }, + { 30.1, 0.827, 100.645 }, + { 27.7, 4.648, 198.321 }, + { 33.7, 1.143, 82.486 }, + { 26.5, 1.979, 95.389 }, + { 26.6, 0.399, 106.014 }, + { 27.0, 2.102, 1057.897 }, + { 31.0, 5.340, 476.431 }, + { 27.0, 0.713, 248.724 }, + { 29.1, 3.992, 908.334 }, + { 28.0, 3.465, 1439.510 }, + { 27.8, 4.124, 694.072 }, + { 25.5, 5.496, 115.884 }, + { 27.2, 5.761, 1215.165 }, + { 26.3, 2.775, 490.073 }, + { 26.4, 3.371, 49.721 }, + { 26.9, 3.260, 691.103 }, + { 25.0, 3.650, 73.409 }, + /* 370 terms retained, 754 terms dropped, error 9.6e-06 a.u. */ + + /* uranus r, T^1 */ + { 1479896.4, 3.67205705, 74.78159857 }, + { 71212.1, 6.226010, 63.735898 }, + { 68627.0, 6.134113, 149.563197 }, + { 20857.3, 5.246255, 11.045700 }, + { 21468.2, 2.601767, 76.266071 }, + { 24059.6, 3.141593, 0 }, + { 11405.3, 0.018485, 70.849445 }, + { 7496.8, 0.42360, 73.29713 }, + { 4243.8, 1.41692, 85.82730 }, + { 3505.9, 2.58354, 138.51750 }, + { 3228.8, 5.25500, 3.93215 }, + { 3926.7, 3.15514, 71.81265 }, + { 3060.0, 0.15322, 1.48447 }, + { 3578.4, 2.31161, 224.34480 }, + { 2564.3, 0.98077, 148.07872 }, + { 2429.4, 3.99440, 52.69020 }, + { 1644.7, 2.65349, 127.47180 }, + { 1583.8, 1.43046, 78.71375 }, + { 1413.1, 4.57462, 202.25340 }, + { 1489.5, 2.67559, 56.62235 }, + { 1403.2, 1.36985, 77.75054 }, + { 1228.2, 1.04704, 62.25143 }, + { 1508.0, 5.05996, 151.04767 }, + { 992.1, 2.1717, 65.2204 }, + { 1032.7, 0.26459, 131.40395 }, + { 861.9, 5.0553, 351.8166 }, + { 744.4, 3.0764, 35.1641 }, + { 604.4, 0.9072, 984.6003 }, + { 646.9, 4.4729, 70.3282 }, + { 574.7, 3.2307, 447.7958 }, + { 687.5, 2.4991, 77.9630 }, + { 623.6, 0.8625, 9.5612 }, + { 527.8, 5.1514, 2.9689 }, + { 561.8, 2.7178, 462.0229 }, + { 530.4, 5.9166, 213.2991 }, + { 460.1, 4.2230, 12.5302 }, + { 494.3, 0.4629, 145.6310 }, + { 487.3, 0.7061, 380.1278 }, + { 380.9, 3.8509, 3.1814 }, + { 444.4, 2.1556, 67.6681 }, + { 338.8, 2.5382, 18.1592 }, + { 372.9, 5.0514, 529.6910 }, + { 348.3, 1.7487, 71.6002 }, + { 405.9, 1.2296, 22.0914 }, + { 268.9, 6.2407, 340.7709 }, + { 255.6, 2.9570, 84.3428 }, + { 259.5, 3.9205, 59.8037 }, + { 224.7, 3.9096, 160.6089 }, + { 221.7, 3.6473, 137.0330 }, + { 254.6, 3.5041, 38.1330 }, + { 238.3, 2.0488, 269.9214 }, + { 272.4, 3.3836, 222.8603 }, + { 200.6, 1.2486, 69.3650 }, + { 234.2, 0.2783, 108.4612 }, + { 188.5, 4.4131, 265.9893 }, + { 211.7, 0.6803, 111.4302 }, + { 205.9, 1.5338, 284.1485 }, + { 196.2, 4.7715, 299.1264 }, + { 153.1, 5.2176, 209.3669 }, + { 162.6, 4.3405, 33.6796 }, + { 150.6, 1.9897, 54.1747 }, + { 137.0, 0.4032, 195.1398 }, + { 117.2, 0.3965, 87.3118 }, + { 127.9, 2.4033, 39.6175 }, + { 104.2, 2.9215, 134.5853 }, + { 103.9, 1.8162, 72.3339 }, + { 105.7, 0.1707, 79.2350 }, + { 106.4, 0.6980, 2.4477 }, + { 95.3, 4.029, 82.858 }, + { 104.8, 4.4362, 305.3462 }, + { 93.8, 5.018, 51.206 }, + { 103.7, 2.5755, 191.2077 }, + { 106.7, 1.2300, 225.8293 }, + { 93.5, 3.093, 77.229 }, + { 97.4, 3.814, 152.532 }, + { 84.6, 5.725, 68.844 }, + { 77.4, 0.083, 45.577 }, + { 76.2, 4.204, 73.818 }, + { 86.2, 0.531, 145.110 }, + { 75.8, 3.786, 75.745 }, + { 77.6, 1.636, 479.288 }, + { 84.6, 0.617, 116.426 }, + { 100.2, 4.9408, 120.3582 }, + { 72.1, 4.305, 565.116 }, + { 70.7, 2.385, 60.767 }, + { 71.6, 3.939, 153.495 }, + { 84.6, 5.560, 344.703 }, + { 63.6, 1.937, 41.644 }, + { 71.6, 3.712, 408.439 }, + { 61.6, 3.900, 4.453 }, + { 65.0, 1.558, 106.977 }, + { 59.9, 0.601, 74.893 }, + { 62.0, 4.394, 453.425 }, + { 63.4, 4.192, 184.727 }, + { 62.3, 3.238, 422.666 }, + { 54.4, 3.725, 7.114 }, + { 52.5, 6.086, 404.507 }, + { 59.1, 1.556, 456.394 }, + { 52.6, 3.505, 125.987 }, + { 52.8, 5.201, 358.930 }, + { 58.1, 5.335, 220.413 }, + { 52.9, 4.448, 426.598 }, + { 50.9, 0.526, 490.334 }, + { 55.0, 1.601, 14.978 }, + { 49.5, 4.255, 5.417 }, + { 51.3, 0.368, 206.186 }, + { 51.8, 1.758, 8.077 }, + { 57.0, 0.841, 146.594 }, + { 49.1, 0.941, 99.161 }, + { 46.4, 5.351, 152.745 }, + { 48.0, 1.972, 288.081 }, + { 43.8, 3.037, 20.607 }, + { 49.5, 5.846, 112.915 }, + { 42.0, 0.046, 128.956 }, + { 48.6, 3.628, 81.001 }, + { 41.5, 2.337, 277.035 }, + { 40.0, 5.095, 35.425 }, + { 41.9, 2.511, 24.379 }, + { 38.3, 3.619, 173.942 }, + { 38.4, 2.060, 333.657 }, + { 42.6, 1.261, 1514.291 }, + { 38.9, 0.742, 347.884 }, + { 38.5, 4.951, 92.941 }, + { 33.2, 1.384, 74.670 }, + { 33.8, 3.684, 66.917 }, + { 39.0, 5.492, 200.769 }, + { 31.9, 0.540, 203.738 }, + { 33.3, 6.260, 1059.382 }, + { 30.8, 2.538, 977.487 }, + { 29.2, 5.431, 58.107 }, + { 30.1, 0.195, 387.241 }, + { 29.0, 3.105, 991.714 }, + { 35.6, 3.729, 96.873 }, + { 27.6, 0.371, 80.198 }, + { 32.5, 4.384, 221.376 }, + { 27.0, 1.356, 0.963 }, + { 31.3, 0.796, 373.014 }, + { 31.1, 2.054, 230.565 }, + { 25.9, 3.468, 144.147 }, + { 30.2, 0.714, 109.946 }, + { 24.7, 3.042, 14.015 }, + { 27.9, 4.766, 415.552 }, + { 25.1, 5.124, 81.374 }, + { 25.6, 2.569, 522.577 }, + { 24.4, 2.203, 628.852 }, + { 25.5, 1.795, 143.625 }, + { 24.2, 5.672, 443.864 }, + { 25.7, 5.432, 546.956 }, + { 24.2, 5.600, 32.195 }, + { 24.4, 3.303, 617.806 }, + { 23.5, 0.658, 46.210 }, + { 22.4, 4.821, 135.549 }, + { 27.2, 2.027, 536.805 }, + { 22.2, 4.617, 391.173 }, + { 22.0, 4.592, 241.610 }, + { 20.8, 0.244, 465.955 }, + { 27.3, 2.152, 140.002 }, + { 21.4, 5.272, 159.124 }, + { 23.6, 4.950, 561.184 }, + { 24.9, 0.546, 181.758 }, + { 23.0, 3.806, 55.138 }, + { 19.8, 1.303, 518.645 }, + { 19.3, 1.314, 543.024 }, + { 19.7, 4.909, 909.819 }, + { 20.8, 0.912, 76.479 }, + { 19.9, 0.665, 66.705 }, + { 19.0, 4.680, 98.900 }, + { 25.9, 4.529, 454.909 }, + { 21.9, 1.234, 41.102 }, + { 18.7, 6.096, 103.093 }, + { 18.2, 0.973, 55.659 }, + { 21.2, 4.194, 329.725 }, + { 19.4, 4.315, 6.220 }, + { 18.5, 5.786, 142.450 }, + { 22.6, 5.846, 297.642 }, + { 16.8, 6.091, 211.815 }, + { 16.4, 2.500, 61.288 }, + { 20.4, 3.161, 186.212 }, + { 16.0, 2.983, 81.895 }, + { 19.0, 6.012, 155.783 }, + { 17.7, 4.826, 273.103 }, + { 15.1, 3.656, 472.175 }, + { 18.4, 3.476, 36.649 }, + { 16.3, 0.131, 554.070 }, + { 18.6, 0.239, 23.576 }, + { 14.4, 2.694, 70.116 }, + { 15.2, 2.438, 486.402 }, + { 14.0, 5.124, 29.205 }, + { 15.8, 4.249, 146.382 }, + { 14.1, 1.557, 110.206 }, + { 17.5, 1.945, 835.037 }, + { 13.7, 1.638, 92.047 }, + { 13.8, 0.137, 235.390 }, + { 13.6, 2.854, 49.509 }, + { 12.6, 3.209, 100.384 }, + { 12.4, 2.886, 60.555 }, + { 15.0, 0.326, 259.509 }, + { 12.9, 2.776, 105.492 }, + { 12.3, 3.364, 440.682 }, + { 15.2, 0.256, 258.876 }, + { 12.1, 0.109, 157.640 }, + { 12.9, 0.307, 124.290 }, + { 10.9, 3.429, 33.137 }, + { 11.2, 4.988, 604.473 }, + { 10.8, 3.863, 767.369 }, + { 11.6, 2.605, 166.829 }, + { 10.2, 5.278, 264.505 }, + { 10.9, 0.641, 558.002 }, + { 12.3, 4.340, 16.675 }, + { 9.9, 0.67, 31.49 }, + { 12.6, 4.832, 114.399 }, + { 10.5, 0.204, 275.551 }, + { 11.3, 0.961, 373.908 }, + { 12.1, 1.917, 378.643 }, + { 12.2, 0.705, 218.407 }, + { 10.8, 5.745, 88.115 }, + { 9.5, 0.66, 353.30 }, + { 11.0, 2.630, 154.017 }, + { 9.1, 2.99, 681.54 }, + { 10.4, 2.331, 132.888 }, + { 9.2, 4.79, 216.48 }, + { 9.3, 0.76, 129.92 }, + { 8.9, 0.78, 67.36 }, + { 8.8, 6.13, 150.53 }, + { 9.6, 2.89, 67.88 }, + { 10.5, 0.369, 699.701 }, + { 9.3, 1.50, 19.64 }, + { 9.4, 5.26, 80.72 }, + { 10.1, 3.565, 278.519 }, + { 9.5, 3.06, 149.68 }, + { 9.2, 3.03, 162.09 }, + { 8.4, 2.18, 342.26 }, + { 9.2, 5.33, 152.01 }, + { 9.8, 2.44, 75.30 }, + { 10.0, 0.819, 339.286 }, + { 9.4, 1.94, 147.12 }, + { 7.9, 4.72, 106.01 }, + { 8.8, 0.02, 42.59 }, + { 7.8, 0.61, 135.34 }, + { 8.2, 2.60, 469.14 }, + { 10.1, 2.586, 50.403 }, + { 8.6, 5.69, 760.26 }, + { 7.5, 2.65, 5.94 }, + { 8.7, 0.54, 66.18 }, + { 8.0, 1.94, 180.27 }, + { 7.5, 5.95, 97.42 }, + { 7.6, 5.80, 450.98 }, + { 8.7, 3.70, 300.61 }, + { 7.7, 1.47, 32.24 }, + { 8.2, 2.31, 254.94 }, + { 8.5, 1.28, 39.36 }, + { 7.0, 0.68, 874.39 }, + { 8.9, 0.16, 43.13 }, + { 7.2, 4.98, 117.91 }, + { 7.4, 4.09, 92.31 }, + { 7.3, 5.04, 756.32 }, + { 8.5, 1.22, 79.45 }, + { 6.9, 6.04, 350.33 }, + { 8.8, 1.33, 48.76 }, + { 7.3, 3.33, 68.19 }, + { 6.8, 4.78, 142.66 }, + { 6.8, 3.90, 480.77 }, + { 7.1, 1.28, 68.56 }, + { 7.9, 4.30, 624.92 }, + { 6.7, 5.43, 610.69 }, + { 6.5, 5.44, 88.80 }, + { 7.6, 4.81, 312.46 }, + { 7.2, 3.18, 268.44 }, + { 8.1, 1.99, 692.59 }, + { 6.5, 1.05, 685.47 }, + { 6.6, 1.38, 291.26 }, + { 6.9, 2.59, 282.66 }, + { 7.1, 5.80, 468.24 }, + { 6.3, 2.58, 458.09 }, + { 7.6, 0.49, 296.16 }, + { 8.5, 0.01, 227.31 }, + { 6.5, 3.99, 42.54 }, + { 6.4, 1.04, 365.90 }, + { 8.2, 1.13, 69.15 }, + { 6.4, 0.16, 228.28 }, + { 8.0, 4.04, 183.24 }, + { 6.3, 3.52, 285.63 }, + { 6.9, 3.32, 306.83 }, + { 6.9, 1.34, 7.86 }, + { 6.5, 0.46, 106.27 }, + { 6.6, 5.25, 58.32 }, + { 6.4, 0.35, 411.62 }, + { 6.4, 5.19, 120.99 }, + { 7.0, 4.86, 419.48 }, + { 6.4, 2.78, 198.32 }, + /* 290 terms retained, 224 terms dropped, error 2.2e-06 a.u.*T */ + + /* uranus r, T^2 */ + { 22439.9, 0.699531, 74.781599 }, + { 4727.0, 1.69902, 63.73590 }, + { 1681.9, 4.64834, 70.84945 }, + { 1433.8, 3.52120, 149.56320 }, + { 1649.6, 3.09660, 11.04570 }, + { 770.2, 0, 0 }, + { 461.0, 0.7668, 3.9322 }, + { 500.4, 6.1723, 76.2661 }, + { 390.4, 4.4961, 56.6224 }, + { 389.9, 5.5267, 85.8273 }, + { 292.1, 0.2039, 52.6902 }, + { 272.9, 3.8471, 138.5175 }, + { 286.6, 3.5336, 73.2971 }, + { 205.4, 3.2476, 78.7138 }, + { 219.7, 1.9642, 131.4039 }, + { 215.8, 0.8481, 77.9630 }, + { 128.8, 2.0815, 3.1814 }, + { 148.6, 4.8984, 127.4718 }, + { 117.5, 4.9341, 447.7958 }, + { 112.7, 1.0136, 462.0229 }, + { 98.9, 6.158, 224.345 }, + { 91.4, 0.680, 18.159 }, + { 89.2, 0.234, 202.253 }, + { 88.2, 2.931, 62.251 }, + { 114.1, 4.7874, 145.6310 }, + { 103.9, 3.5856, 71.6002 }, + { 61.8, 3.300, 351.817 }, + { 57.8, 4.907, 22.091 }, + { 64.4, 3.390, 1.484 }, + { 71.1, 6.105, 454.909 }, + { 51.0, 3.867, 65.220 }, + { 63.5, 3.962, 67.668 }, + { 59.0, 5.555, 9.561 }, + { 48.7, 3.747, 269.921 }, + { 43.6, 1.926, 59.804 }, + { 42.2, 2.617, 151.048 }, + { 42.4, 6.136, 284.149 }, + { 44.3, 5.900, 71.813 }, + { 37.3, 5.913, 984.600 }, + { 36.2, 5.403, 77.751 }, + { 42.0, 2.091, 12.530 }, + { 31.4, 4.592, 148.079 }, + { 31.3, 2.267, 195.140 }, + { 27.2, 3.532, 209.367 }, + { 28.2, 4.578, 77.229 }, + { 26.1, 0.660, 120.358 }, + { 24.4, 5.867, 69.365 }, + { 23.0, 1.038, 84.343 }, + { 22.7, 1.714, 160.609 }, + { 27.7, 4.915, 277.035 }, + { 20.8, 2.196, 45.577 }, + { 20.0, 2.321, 2.448 }, + { 16.6, 4.775, 213.299 }, + { 16.6, 1.856, 340.771 }, + { 17.2, 4.369, 54.175 }, + { 16.1, 3.646, 152.745 }, + { 14.8, 5.438, 408.439 }, + { 13.9, 3.385, 358.930 }, + { 13.3, 5.252, 137.033 }, + { 13.3, 1.263, 134.585 }, + { 12.9, 3.033, 92.941 }, + { 12.5, 1.332, 51.206 }, + { 13.4, 1.532, 422.666 }, + { 16.4, 0.402, 265.989 }, + { 12.0, 5.104, 191.208 }, + { 12.9, 4.432, 87.312 }, + { 11.4, 2.026, 7.114 }, + { 11.8, 4.656, 41.644 }, + { 12.0, 3.239, 116.426 }, + { 11.7, 3.733, 220.413 }, + { 11.6, 4.165, 60.555 }, + { 10.2, 0.329, 70.328 }, + { 11.3, 1.076, 72.334 }, + { 9.7, 3.06, 2.97 }, + { 9.3, 2.44, 565.12 }, + { 9.0, 5.19, 225.83 }, + { 10.3, 1.186, 344.703 }, + { 8.8, 6.01, 5.42 }, + { 8.5, 5.25, 347.88 }, + { 8.3, 3.72, 14.98 }, + { 8.3, 2.27, 299.13 }, + { 8.1, 5.72, 55.14 }, + { 7.8, 0.90, 222.86 }, + { 8.3, 4.49, 70.12 }, + { 8.8, 5.82, 153.50 }, + { 8.5, 3.91, 333.66 }, + { 9.9, 5.97, 35.16 }, + { 9.6, 0.39, 415.55 }, + { 7.1, 1.51, 991.71 }, + { 6.6, 1.18, 96.87 }, + { 8.1, 2.26, 206.19 }, + { 6.5, 2.99, 380.13 }, + { 9.0, 6.05, 146.38 }, + { 6.1, 0.06, 99.16 }, + { 5.8, 0.82, 142.45 }, + { 5.8, 4.63, 49.51 }, + { 5.6, 0.66, 58.11 }, + { 6.0, 2.49, 373.01 }, + { 5.7, 2.24, 80.20 }, + { 5.3, 5.07, 440.68 }, + { 5.2, 4.36, 977.49 }, + { 5.4, 0.85, 546.96 }, + { 5.8, 0.34, 536.80 }, + { 5.9, 5.48, 76.48 }, + { 5.3, 3.73, 23.58 }, + { 5.2, 4.14, 132.89 }, + { 5.3, 6.14, 39.62 }, + { 5.8, 3.40, 458.09 }, + { 5.0, 4.26, 522.58 }, + { 5.0, 4.79, 387.24 }, + { 5.2, 3.26, 561.18 }, + { 4.6, 1.69, 152.53 }, + { 5.3, 1.84, 124.29 }, + { 5.0, 0.37, 60.77 }, + { 4.5, 2.30, 312.46 }, + { 4.5, 0.46, 33.14 }, + { 5.7, 0.90, 81.90 }, + { 5.8, 0.92, 20.61 }, + { 5.7, 0.66, 38.13 }, + { 4.3, 3.55, 479.29 }, + { 4.2, 4.38, 79.24 }, + { 4.2, 1.65, 128.96 }, + { 5.1, 1.41, 144.15 }, + { 4.0, 6.07, 19.64 }, + { 4.0, 5.77, 288.08 }, + { 5.0, 3.00, 29.20 }, + { 3.8, 2.60, 426.60 }, + { 3.9, 3.20, 159.12 }, + { 3.9, 4.44, 141.70 }, + { 5.3, 4.08, 111.43 }, + { 4.6, 0.01, 298.23 }, + { 3.7, 5.28, 353.30 }, + { 3.9, 5.27, 521.09 }, + { 3.7, 5.15, 490.33 }, + { 4.0, 0.61, 152.01 }, + { 3.9, 1.34, 535.32 }, + { 4.4, 0.62, 827.17 }, + { 3.6, 4.72, 6.90 }, + { 3.6, 3.25, 230.56 }, + { 3.5, 0.79, 983.12 }, + { 4.5, 2.87, 129.92 }, + { 3.6, 5.59, 774.48 }, + { 3.5, 4.50, 376.20 }, + { 3.4, 2.56, 258.88 }, + { 4.4, 2.10, 404.51 }, + { 3.3, 0.90, 469.14 }, + { 3.3, 3.86, 42.54 }, + { 3.2, 2.76, 248.72 }, + { 3.2, 0.08, 1514.29 }, + { 3.8, 5.30, 369.08 }, + { 3.3, 2.25, 73.82 }, + { 3.1, 2.60, 433.71 }, + { 3.1, 4.55, 980.67 }, + { 3.1, 1.27, 200.77 }, + { 3.1, 1.71, 639.90 }, + { 3.1, 3.63, 16.67 }, + { 3.5, 4.94, 411.62 }, + { 3.5, 4.49, 881.51 }, + { 3.3, 5.59, 472.17 }, + { 3.0, 6.03, 291.26 }, + { 3.5, 2.17, 554.07 }, + { 3.1, 0.52, 1094.81 }, + { 3.3, 2.49, 451.73 }, + { 2.9, 0.50, 305.35 }, + { 3.1, 4.20, 146.59 }, + { 2.9, 2.45, 135.34 }, + { 3.0, 0.39, 25.27 }, + { 2.8, 2.53, 867.28 }, + { 2.7, 5.29, 125.99 }, + { 2.9, 4.71, 218.93 }, + { 2.8, 4.28, 350.33 }, + { 2.7, 1.99, 82.86 }, + { 2.9, 3.09, 216.48 }, + { 3.4, 3.68, 661.09 }, + { 2.9, 1.44, 381.61 }, + { 2.8, 0.39, 33.68 }, + { 2.8, 4.63, 1357.61 }, + { 3.4, 2.13, 685.47 }, + { 2.6, 5.93, 89.76 }, + { 2.7, 0.76, 486.40 }, + { 2.7, 4.16, 235.39 }, + { 2.6, 3.82, 550.89 }, + { 3.4, 3.17, 108.46 }, + { 2.6, 5.68, 24.38 }, + { 2.7, 1.87, 529.69 }, + { 2.6, 4.37, 1080.58 }, + { 2.4, 3.07, 391.17 }, + { 2.4, 5.74, 535.91 }, + { 2.3, 5.19, 1059.38 }, + { 2.6, 1.10, 913.00 }, + { 2.2, 6.10, 140.00 }, + { 3.1, 5.35, 681.54 }, + /* 192 terms retained, 0 terms dropped, error 8.5e-07 a.u.*T^2 */ + + /* uranus r, T^3 */ + { 1164.4, 4.73453, 74.78160 }, + { 212.4, 3.3426, 63.7359 }, + { 196.4, 2.9800, 70.8494 }, + { 104.5, 0.9581, 11.0457 }, + { 71.7, 0.025, 56.622 }, + { 72.5, 0.997, 149.563 }, + { 54.9, 2.594, 3.932 }, + { 34.0, 3.816, 76.266 }, + { 32.1, 3.598, 131.404 }, + { 29.6, 3.441, 85.827 }, + { 36.4, 5.650, 77.963 }, + { 27.7, 0.428, 3.181 }, + { 27.5, 2.551, 52.690 }, + { 24.6, 5.140, 78.714 }, + { 19.4, 5.135, 18.159 }, + { 15.8, 0.371, 447.796 }, + { 15.4, 5.573, 462.023 }, + { 15.2, 3.860, 73.297 }, + { 15.5, 2.975, 145.631 }, + { 18.0, 0, 0 }, + { 16.0, 5.199, 71.600 }, + { 11.1, 6.032, 138.517 }, + { 10.5, 3.583, 224.345 }, + { 7.6, 1.45, 1.48 }, + { 8.1, 2.62, 22.09 }, + { 7.1, 5.44, 269.92 }, + { 6.5, 4.37, 284.15 }, + { 6.8, 0.01, 151.05 }, + { 8.1, 0.30, 127.47 }, + { 5.8, 4.23, 373.01 }, + { 5.0, 1.84, 202.25 }, + { 4.7, 2.78, 120.36 }, + { 5.1, 0.78, 62.25 }, + { 4.2, 1.84, 72.33 }, + { 3.9, 1.89, 209.37 }, + { 5.2, 4.16, 195.14 }, + { 3.6, 2.00, 65.22 }, + { 3.6, 3.93, 124.29 }, + { 3.8, 1.05, 92.94 }, + { 4.2, 3.96, 9.56 }, + { 3.5, 1.54, 148.08 }, + { 3.2, 2.99, 387.24 }, + { 4.0, 1.86, 152.74 }, + { 3.3, 1.41, 351.82 }, + { 3.6, 1.17, 153.50 }, + { 2.9, 6.04, 12.53 }, + { 2.7, 5.65, 134.59 }, + { 2.8, 0.79, 572.23 }, + { 3.1, 5.84, 160.61 }, + { 2.7, 1.99, 450.98 }, + { 2.7, 2.77, 213.30 }, + { 2.3, 1.68, 358.93 }, + { 2.3, 5.77, 84.34 }, + { 2.3, 4.81, 536.80 }, + { 2.2, 2.20, 465.96 }, + /* 55 terms retained, 0 terms dropped, error 3.3e-07 a.u.*T^3 */ + + /* uranus r, T^4 */ + { 53.0, 3.008, 74.782 }, + { 9.9, 1.91, 56.62 }, + { 7.0, 5.09, 11.05 }, + { 6.7, 5.43, 149.56 }, + { 3.7, 5.23, 131.40 }, + { 3.4, 1.30, 85.83 }, + { 2.7, 0.44, 63.74 }, + { 2.3, 0.92, 145.63 }, + { 2.4, 6.21, 358.93 }, + { 2.3, 2.23, 440.68 }, + { 3.1, 3.14, 0 }, + /* 11 terms retained, 0 terms dropped, error 2.1e-07 a.u.*T^4 */ + /* end uranus */ +}; + +int vn_uranus[][3] = { + /* addresses for uranus l, b, r */ + /* T^0 */ { 0, 355, 462, }, + /* T^1 */ { 152, 398, 832, }, + /* T^2 */ { 253, 432, 1122, }, + /* T^3 */ { 315, 449, 1314, }, + /* T^4 */ { 347, 460, 1369, }, + /* T^5 */ { 354, 462, 1380, }, + /* end */ { 355, 0, 0, }, + /* termination */ { 0, } +}; + +/* version d4 (lbr) + * heliocentric dynamical ecliptic and equinox of the date + */ + +double vx_venus[][3] = { + /* venus l, T^0 */ + { 317614666.8, 0, 0 }, + { 1353968.4, 5.59313320, 10213.28554621 }, + { 89891.6, 5.306500, 20426.571092 }, + { 5477.2, 4.41631, 7860.41939 }, + { 3455.7, 2.69964, 11790.62909 }, + { 2372.1, 2.99378, 3930.20970 }, + { 1317.1, 5.18668, 26.29832 }, + { 1664.1, 4.25019, 1577.34354 }, + { 1438.3, 4.15745, 9683.59458 }, + { 1200.5, 6.15357, 30639.85664 }, + { 761.4, 1.9501, 529.6910 }, + { 707.7, 1.0647, 775.5226 }, + { 584.8, 3.9984, 191.4483 }, + { 769.3, 0.8163, 9437.7629 }, + { 499.9, 4.1234, 15720.8388 }, + { 326.2, 4.5906, 10404.7338 }, + { 429.5, 3.5864, 19367.1892 }, + { 327.0, 5.6774, 5507.5532 }, + { 231.9, 3.1625, 9153.9036 }, + { 179.7, 4.6534, 1109.3786 }, + { 128.3, 4.2260, 20.7754 }, + { 155.5, 5.5704, 19651.0485 }, + { 127.9, 0.9621, 5661.3320 }, + { 105.5, 1.5372, 801.8209 }, + { 85.7, 0.356, 3154.687 }, + { 99.1, 0.833, 213.299 }, + { 98.8, 5.394, 13367.973 }, + { 82.1, 3.216, 18837.498 }, + { 88.0, 3.889, 9999.986 }, + { 71.6, 0.111, 11015.106 }, + { 56.1, 4.240, 7.114 }, + { 70.2, 0.675, 23581.258 }, + { 50.8, 0.245, 11322.664 }, + { 46.1, 5.316, 18073.705 }, + { 44.6, 6.063, 40853.142 }, + { 42.6, 5.329, 2352.866 }, + { 42.6, 1.800, 7084.897 }, + { 41.2, 0.362, 382.897 }, + { 35.7, 2.704, 10206.172 }, + { 33.9, 2.023, 6283.076 }, + { 29.1, 3.592, 22003.915 }, + { 28.5, 2.224, 1059.382 }, + { 29.8, 4.022, 10239.584 }, + { 33.3, 2.100, 27511.468 }, + { 30.2, 4.942, 13745.346 }, + { 29.3, 3.514, 283.859 }, + { 26.3, 0.541, 17298.182 }, + /* 47 terms retained, 320 terms dropped, error 0.75" */ + + /* venus l, T^1 */ + { 1021352943052.9, 0, 0 }, + { 95707.7, 2.464244, 10213.285546 }, + { 14445.0, 0.516246, 20426.571092 }, + { 213.4, 1.7955, 30639.8566 }, + { 151.7, 6.1064, 1577.3435 }, + { 173.9, 2.6554, 26.2983 }, + { 82.2, 5.702, 191.448 }, + { 69.7, 2.681, 9437.763 }, + { 52.4, 3.600, 775.523 }, + { 38.3, 1.034, 529.691 }, + { 29.6, 1.251, 5507.553 }, + { 25.1, 6.107, 10404.734 }, + { 17.8, 6.194, 1109.379 }, + { 16.5, 2.643, 7.114 }, + { 14.2, 5.451, 9153.904 }, + { 12.6, 1.245, 40853.142 }, + { 11.6, 4.976, 213.299 }, + { 12.6, 1.881, 382.897 }, + { 8.9, 0.95, 13367.97 }, + { 7.4, 4.39, 10206.17 }, + { 6.6, 2.28, 2352.87 }, + { 6.3, 4.08, 3154.69 }, + { 6.7, 5.06, 801.82 }, + /* 23 terms retained, 192 terms dropped, error 0.14"*T */ + + /* venus l, T^2 */ + { 54127.1, 0, 0 }, + { 3891.5, 0.34514, 10213.28555 }, + { 1337.9, 2.02011, 20426.57109 }, + { 23.8, 2.046, 26.298 }, + { 19.3, 3.535, 30639.857 }, + { 10.0, 3.971, 775.523 }, + { 7.0, 1.52, 1577.34 }, + { 6.0, 1.00, 191.45 }, + { 3.2, 4.36, 9437.76 }, + { 2.1, 2.66, 40853.14 }, + { 1.9, 3.39, 382.90 }, + /* 11 terms retained, 59 terms dropped, error 0.028"*T^2 */ + + /* venus l, T^3 */ + { 135.7, 4.8039, 10213.2855 }, + { 77.8, 3.669, 20426.571 }, + { 26.0, 0, 0 }, + { 1.2, 5.32, 30639.86 }, + /* 4 terms retained, 5 terms dropped, error 0.011"*T^3 */ + + /* venus l, T^4 */ + { 114.0, 3.1416, 0 }, + { 3.2, 5.21, 20426.57 }, + { 1.7, 2.51, 10213.29 }, + /* 3 terms retained, 2 terms dropped, error 0.014"*T^4 */ + + /* venus l, T^5 */ + { 0.9, 3.14, 0 }, + { 0.1, 0.55, 20426.57 }, + { 0.1, 1.91, 10213.29 }, + /* 3 terms retained, 2 terms dropped, error 0.00097"*T^5 */ + /* end venus l */ + + /* venus b, T^0 */ + { 5923638.5, 0.26702776, 10213.28554621 }, + { 40108.0, 1.147372, 20426.571092 }, + { 32814.9, 3.141593, 0 }, + { 1011.4, 1.08946, 30639.85664 }, + { 149.5, 6.2539, 18073.7049 }, + { 137.8, 0.8602, 1577.3435 }, + { 130.0, 3.6715, 9437.7629 }, + { 119.5, 3.7047, 2352.8662 }, + { 108.0, 4.5390, 22003.9146 }, + { 92.0, 1.540, 9153.904 }, + { 53.0, 2.281, 5507.553 }, + { 45.6, 0.723, 10239.584 }, + { 38.9, 2.934, 10186.987 }, + { 43.5, 6.140, 11790.629 }, + { 41.7, 5.991, 19896.880 }, + { 39.6, 3.868, 8635.942 }, + { 39.2, 3.950, 529.691 }, + { 33.3, 4.832, 14143.495 }, + /* 18 terms retained, 192 terms dropped, error 0.6" */ + + /* venus b, T^1 */ + { 513347.6, 1.8036431, 10213.2855462 }, + { 4380.1, 3.38616, 20426.57109 }, + { 196.6, 2.5300, 30639.8566 }, + { 199.2, 0, 0 }, + { 14.0, 2.271, 9437.763 }, + { 13.0, 1.507, 18073.705 }, + { 11.9, 5.605, 1577.344 }, + { 10.3, 5.242, 2352.866 }, + { 9.3, 6.08, 22003.91 }, + { 7.4, 1.50, 11790.63 }, + { 8.0, 0.29, 9153.90 }, + { 7.5, 5.08, 10186.99 }, + /* 12 terms retained, 121 terms dropped, error 0.11"*T */ + + /* venus b, T^2 */ + { 22377.7, 3.385091, 10213.285546 }, + { 281.7, 0, 0 }, + { 173.2, 5.2556, 20426.5711 }, + { 26.9, 3.870, 30639.857 }, + /* 4 terms retained, 55 terms dropped, error 0.25"*T^2 */ + + /* venus b, T^3 */ + { 646.7, 4.9917, 10213.2855 }, + { 20.0, 3.142, 0 }, + { 5.5, 0.77, 20426.57 }, + { 2.5, 5.44, 30639.86 }, + /* 4 terms retained, 11 terms dropped, error 0.023"*T^3 */ + + /* venus b, T^4 */ + { 14.1, 0.315, 10213.286 }, + { 0.2, 2.35, 20426.57 }, + { 0.2, 0.74, 30639.86 }, + { 0.2, 3.14, 0 }, + /* 4 terms retained, 1 terms dropped, error 0.002"*T^4 */ + + /* venus b, T^5 */ + { 0.2, 2.05, 10213.29 }, + /* 1 terms retained, 3 terms dropped, error 0.0014"*T^5 */ + /* end venus b */ + + /* venus r, T^0 */ + { 72334820.9, 0, 0 }, + { 489824.2, 4.0215183, 10213.2855462 }, + { 1658.1, 4.90207, 20426.57109 }, + { 1632.1, 2.84549, 7860.41939 }, + { 1378.0, 1.12847, 11790.62909 }, + { 498.4, 2.5868, 9683.5946 }, + { 374.0, 1.4231, 3930.2097 }, + { 263.6, 5.5294, 9437.7629 }, + { 237.5, 2.5514, 15720.8388 }, + { 222.0, 2.0135, 19367.1892 }, + { 119.5, 3.0198, 10404.7338 }, + { 125.9, 2.7277, 1577.3435 }, + { 76.2, 1.596, 9153.904 }, + { 85.3, 3.986, 19651.048 }, + { 74.3, 4.120, 5507.553 }, + { 41.9, 1.643, 18837.498 }, + { 42.5, 3.819, 13367.973 }, + { 39.4, 5.390, 23581.258 }, + { 29.0, 5.677, 5661.332 }, + { 27.6, 5.724, 775.523 }, + { 27.3, 4.822, 11015.106 }, + { 31.3, 2.318, 9999.986 }, + /* 22 terms retained, 308 terms dropped, error 3e-06 a.u. */ + + /* venus r, T^1 */ + { 34551.0, 0.891987, 10213.285546 }, + { 234.2, 1.7722, 20426.5711 }, + { 234.0, 3.1416, 0 }, + { 23.9, 1.113, 9437.763 }, + { 10.6, 4.592, 1577.344 }, + { 9.1, 4.54, 10404.73 }, + { 6.6, 5.98, 5507.55 }, + /* 7 terms retained, 173 terms dropped, error 3.7e-07 a.u.*T */ + + /* venus r, T^2 */ + { 1406.6, 5.06366, 10213.28555 }, + { 15.5, 5.473, 20426.571 }, + { 13.1, 0, 0 }, + /* 3 terms retained, 60 terms dropped, error 5.2e-07 a.u.*T^2 */ + + /* venus r, T^3 */ + { 49.6, 3.223, 10213.286 }, + { 0.8, 3.21, 20426.57 }, + /* 2 terms retained, 5 terms dropped, error 2.9e-08 a.u.*T^3 */ + + /* venus r, T^4 */ + { 0.6, 0.92, 10213.29 }, + /* 1 terms retained, 2 terms dropped, error 1.6e-08 a.u.*T^4 */ + + /* venus r, T^5 */ + /* 0 terms retained, 2 terms dropped, error 9e-10 a.u.*T^5 */ + /* end venus */ +}; + +int vn_venus[][3] = { + /* addresses for venus l, b, r */ + /* T^0 */ { 0, 91, 134, }, + /* T^1 */ { 47, 109, 156, }, + /* T^2 */ { 70, 121, 163, }, + /* T^3 */ { 81, 125, 166, }, + /* T^4 */ { 85, 129, 168, }, + /* T^5 */ { 88, 133, 169, }, + /* end */ { 91, 134, 0, }, + /* termination */ { 0, } +}; + + +/* For RCS Only -- Do Not Edit */ +static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: vsop87_data.c,v $ $Date: 1997/05/19 18:21:42 $ $Revision: 1.1 $ $Name: $"}; diff --git a/Common/Servers/AntennaBoss/include/BossCore.h b/Common/Servers/AntennaBoss/include/BossCore.h index c109b4dd2..0c957beaa 100644 --- a/Common/Servers/AntennaBoss/include/BossCore.h +++ b/Common/Servers/AntennaBoss/include/BossCore.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include diff --git a/Common/Servers/AntennaBoss/src/BossCore.cpp b/Common/Servers/AntennaBoss/src/BossCore.cpp index cd3ab88c9..181718076 100644 --- a/Common/Servers/AntennaBoss/src/BossCore.cpp +++ b/Common/Servers/AntennaBoss/src/BossCore.cpp @@ -1551,7 +1551,7 @@ Antenna::EphemGenerator_ptr CBossCore::loadInternalGenerator(const Antenna::TGen ref=Antenna::EphemGenerator::_duplicate(m_satelliteGenerator); break; } - case Antenna::ANT_SOLARSYTEMBODY : { + case Antenna::ANT_SOLARSYSTEMBODY : { if (CORBA::is_nil(m_solarBodyGenerator)) { m_solarBodyGenerator=loadGenerator(type); // could throw exceptions } @@ -1605,7 +1605,7 @@ Antenna::EphemGenerator_ptr CBossCore::loadPrimaryGenerator(const Antenna::TGene ref=Antenna::EphemGenerator::_duplicate(m_primarySatelliteGenerator); break; } - case Antenna::ANT_SOLARSYTEMBODY : { + case Antenna::ANT_SOLARSYSTEMBODY : { if (CORBA::is_nil(m_primarySolarBodyGenerator)) { m_primarySolarBodyGenerator=loadGenerator(type); // could throw exceptions } @@ -1652,7 +1652,7 @@ Antenna::EphemGenerator_ptr CBossCore::loadGenerator(const Antenna::TGeneratorTy cSpec->component_type = CORBA::string_dup((const char*)m_config->getSatelliteInterface()); //IDL interface implemented by the component break; } - case Antenna::ANT_SOLARSYTEMBODY : { + case Antenna::ANT_SOLARSYSTEMBODY : { cSpec->component_type = CORBA::string_dup((const char*)m_config->getSolarSystemBodyInterface()); //IDL interface implemented by the component break; } diff --git a/Common/Servers/AntennaBoss/src/BossCore_prepareScan.i b/Common/Servers/AntennaBoss/src/BossCore_prepareScan.i index afa85a04a..9f6038ba1 100644 --- a/Common/Servers/AntennaBoss/src/BossCore_prepareScan.i +++ b/Common/Servers/AntennaBoss/src/BossCore_prepareScan.i @@ -269,6 +269,7 @@ Antenna::EphemGenerator_ptr CBossCore::prepareScan( } try { currentGenerator->setOffsets(lonOffTmp,latOffTmp,offFrameTmp); //could throw an AntennaErrorsEx exception + ACS_LOG(LM_FULL_INFO,"CBossCore::prepareScan()",(LM_DEBUG,"currentGenerator SET OFFSET")); } catch (CORBA::SystemException& ex) { _EXCPT(ComponentErrors::CORBAProblemExImpl,impl,"CBossCore::prepareScan()"); @@ -383,6 +384,8 @@ Antenna::EphemGenerator_ptr CBossCore::prepareScan( sourceName=IRA::CString(att->sourceID); currentGeneratorFlux=currentGenerator; // the flux computer is the moon generator itself...make a deep copy } + + catch (CORBA::SystemException& ex) { sourceName=IRA::CString("????"); ra=dec=0.0; // in that case I do not want to rise an error @@ -391,11 +394,95 @@ Antenna::EphemGenerator_ptr CBossCore::prepareScan( //velDef=Antenna::ANT_UNDEF_DEF; axis=Management::MNG_NO_AXIS; } + catch(AntennaErrors::AntennaErrorsEx& ex) { + _ADD_BACKTRACE(AntennaErrors::ScanErrorExImpl,impl,ex,"CBossCore::prepareScan()"); + impl.setReason("Unable to load the scan configuration into the generator"); + throw impl; + } + catch (ComponentErrors::ComponentErrorsEx& ex) { + _ADD_BACKTRACE(AntennaErrors::ScanErrorExImpl,impl,ex,"CBossCore::prepareScan()"); + impl.setReason("Unable to load the scan configuration into the generator"); + throw impl; + } + catch (...) { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"CBossCore::prepareScan()"); + } + + vrad=primary.RadialVelocity; velFrame=primary.VradFrame; velDef=primary.VradDefinition; timeToStop=0; } + else if (primary.type==Antenna::ANT_SUN || primary.type==Antenna::ANT_SOLARSYSTEMBODY ) { + // moon has nothing to do...no configuration + Antenna::SolarSystemBody_var tracker; + tracker=Antenna::SolarSystemBody::_narrow(currentGenerator); + try{ + + tracker->setBodyName(primary.targetName); // + + } catch(AntennaErrors::AntennaErrorsEx& ex) { + + _ADD_BACKTRACE(AntennaErrors::ScanErrorExImpl,impl,ex,"CBossCore::prepareScan()"); + impl.setReason("Unable to load the scan configuration into the generator"); + throw impl; + } + + //copy the current track and store it + copyTrack(lastPar,primary); + lastPar.applyOffsets=false; + lastPar.secondary=false; + if (primary.type==Antenna::ANT_SUN ) + { + ACS_LOG(LM_FULL_INFO,"CBossCore::prepareScan()",(LM_DEBUG,"SUN_TRACKING")); + } else + { + ACS_LOG(LM_FULL_INFO,"CBossCore::prepareScan()",(LM_DEBUG,"PLANET_TRACKING")); + + } + + try { + Antenna::SolarSystemBodyAttributes_var att; + tracker->getAttributes(att); + ACS_LOG(LM_FULL_INFO,"CBossCore::prepareScan()",(LM_DEBUG,"GOT ATTRIBUTES")) + ra=att->J2000RightAscension; + + dec=att->J2000Declination; + lon=att->gLongitude; + lat=att->gLatitude; + //vrad=0.0; + //velFrame=Antenna::ANT_UNDEF_FRAME; + //velDef=Antenna::ANT_UNDEF_DEF; + axis=att->axis; + sourceName=IRA::CString(att->sourceID); + currentGeneratorFlux=currentGenerator; // the flux computer is the moon generator itself...make a deep copy + } + catch(AntennaErrors::AntennaErrorsEx& ex) { + _ADD_BACKTRACE(AntennaErrors::ScanErrorExImpl,impl,ex,"CBossCore::prepareScan()"); + impl.setReason("Unable to load the scan configuration into the generator"); + throw impl; + } + catch (...) { + _THROW_EXCPT(ComponentErrors::UnexpectedExImpl,"CBossCore::prepareScan()"); + } + + //catch (CORBA::SystemException& ex) { + // sourceName=IRA::CString("????"); + // ra=dec=0.0; // in that case I do not want to rise an error + // //vrad=0.0; + // //velFrame=Antenna::ANT_UNDEF_FRAME; + // //velDef=Antenna::ANT_UNDEF_DEF; + // axis=Management::MNG_NO_AXIS; + // } + + vrad=primary.RadialVelocity; + velFrame=primary.VradFrame; + velDef=primary.VradDefinition; + timeToStop=0; + } + + else if (primary.type==Antenna::ANT_OTF) { ACS_LOG(LM_FULL_INFO,"CBossCore::prepareScan()",(LM_DEBUG,"OTF_SCANNING")); Antenna::OTF_var tracker; @@ -473,9 +560,15 @@ Antenna::EphemGenerator_ptr CBossCore::prepareScan( } else if (primary.type==Antenna::ANT_SATELLITE) { } - else if (primary.type==Antenna::ANT_SOLARSYTEMBODY) { + + + else if (primary.type==Antenna::ANT_SOLARSYSTEMBODY) { + + } else if (primary.type==Antenna::ANT_SUN) { + + // useless? } // if everything looks ok....return back the offsets..... /* @@ -486,6 +579,8 @@ Antenna::EphemGenerator_ptr CBossCore::prepareScan( return currentGenerator._retn(); } + + Antenna::EphemGenerator_ptr CBossCore::prepareOTFSecondary(const bool& useInternal,const Antenna::TTrackingParameters& sec,IRA::CString& sourceName,double& ra,double& dec,double& lon, double& lat,double& vrad,Antenna::TReferenceFrame& velFrame,Antenna::TVradDefinition& velDef,bool& result) { diff --git a/Common/Servers/AntennaBoss/src/Makefile b/Common/Servers/AntennaBoss/src/Makefile index ba00b1850..8e36f6f4b 100644 --- a/Common/Servers/AntennaBoss/src/Makefile +++ b/Common/Servers/AntennaBoss/src/Makefile @@ -66,7 +66,7 @@ AntennaBossImpl_OBJECTS = AntennaBossImpl BossCore Configuration \ WorkingThread WatchingThread Callback SlewCheck Offset AntennaBossImpl_LIBS = AntennaDefinitionsStubs AntennaBossStubs MountStubs ObservatoryStubs \ EphemGeneratorStubs ManagmentDefinitionsStubs IRALibrary ComponentErrors ManagementErrors \ - AntennaErrors ParserErrors PointingModelStubs RefractionStubs SkySourceStubs OTFStubs MoonStubs acsnc \ + AntennaErrors ParserErrors PointingModelStubs RefractionStubs SkySourceStubs OTFStubs MoonStubs SolarSystemBodyStubs acsnc \ DiscosVersion # diff --git a/Common/Servers/Moon/src/MoonImpl.cpp b/Common/Servers/Moon/src/MoonImpl.cpp index f3408e6ff..0d9c66e72 100644 --- a/Common/Servers/Moon/src/MoonImpl.cpp +++ b/Common/Servers/Moon/src/MoonImpl.cpp @@ -39,7 +39,7 @@ MoonImpl::~MoonImpl() // initialization void MoonImpl::initialize() throw(ACSErr::ACSbaseExImpl) { - AUTO_TRACE("moonImpl::initilize()"); + AUTO_TRACE("moonImpl::initialize()"); ra_off = dec_off = 0.0; az_off = el_off = 0.0; m_offsetFrame=Antenna::ANT_HORIZONTAL; diff --git a/Common/Servers/Scheduler/include/Core_Operations.h b/Common/Servers/Scheduler/include/Core_Operations.h index 65d169927..741433dbb 100644 --- a/Common/Servers/Scheduler/include/Core_Operations.h +++ b/Common/Servers/Scheduler/include/Core_Operations.h @@ -88,6 +88,24 @@ void _track(const char *targetName) throw (ManagementErrors::TelescopeSubScanErr void _moon() throw (ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl, ManagementErrors::CloseTelescopeScanErrorExImpl); +/** + * starts the tracking of the sun + */ +void _sun() throw (ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl, + ManagementErrors::CloseTelescopeScanErrorExImpl); + + +/** + * Starts a sidereal tracking of a source from equatorial coordinates + * @param planet of the source + * + */ + +void _planet(const char * planetName) throw (ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl, + ManagementErrors::CloseTelescopeScanErrorExImpl); + + + /** * Starts a sidereal tracking of a source from equatorial coordinates * @param targetName name of the source diff --git a/Common/Servers/Scheduler/include/Schedule.h b/Common/Servers/Scheduler/include/Schedule.h index aee7ce884..6aba618e9 100644 --- a/Common/Servers/Scheduler/include/Schedule.h +++ b/Common/Servers/Scheduler/include/Schedule.h @@ -64,6 +64,8 @@ public: void track(const char *targetName); void moon(); + void sun(); + void planet(const char * planetName); void sidereal(const char * targetName,const double& ra,const double& dec,const Antenna::TSystemEquinox& eq,const Antenna::TSections& section); void sidereal(const char * targetName,const Antenna::TCoordinateFrame& frame,double *parameters,const long& paramNumber, const Antenna::TSystemEquinox& eq); @@ -543,6 +545,16 @@ private: bool parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& errMsg,CSubScanBinder& binder); + /** + * Parse the list of parameters for moon tracking + * @param val line to parse + * @param otf structure containing the ORF parameters + * @param id numeral identifier of the scan + * @param errMsg error specification string in case of unsuccessful operation + * @return the result of the parse + */ + bool parseSun(const IRA::CString& val,Antenna::TTrackingParameters *scan,DWORD& id,IRA::CString& errMsg); + /** * Parse the list of parameters for moon tracking * @param val line to parse @@ -552,6 +564,17 @@ private: * @return the result of the parse */ bool parseMoon(const IRA::CString& val,Antenna::TTrackingParameters *scan,DWORD& id,IRA::CString& errMsg); + + /** + * Parse the list of parameters for moon tracking + * @param val line to parse + * @param otf structure containing the ORF parameters + * @param id numeral identifier of the scan + * @param errMsg error specification string in case of unsuccessful operation + * @return the result of the parse + */ + bool parsePlanet(const IRA::CString& val,Antenna::TTrackingParameters *scan,DWORD& id,IRA::CString& errMsg); + /** * Parse the vRAD switch in order to configure a radial velocity diff --git a/Common/Servers/Scheduler/include/SchedulerImpl.h b/Common/Servers/Scheduler/include/SchedulerImpl.h index d39a3f33e..1fed74cff 100644 --- a/Common/Servers/Scheduler/include/SchedulerImpl.h +++ b/Common/Servers/Scheduler/include/SchedulerImpl.h @@ -398,6 +398,31 @@ public: */ virtual void moon() throw (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException); + /** + * It allows to immediately start a tracking of the sun. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ManagementErrors::ManagementErrorsEx + */ + virtual void sun() throw (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException); + + + /** + * It allows to immediately start a tracking of a sidereal source, given its equatorial coordinates + * @param name or identifier of the planed + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw ManagementErrors::ManagementErrorsEx + */ + + + + + + + virtual void planet(const char * name) throw (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException); + + /** * It allows to immediately start a tracking of a sidereal source, given its equatorial coordinates * @param targetName name or identifier of the source diff --git a/Common/Servers/Scheduler/src/Core.cpp b/Common/Servers/Scheduler/src/Core.cpp index a92646ba1..6ea312b86 100644 --- a/Common/Servers/Scheduler/src/Core.cpp +++ b/Common/Servers/Scheduler/src/Core.cpp @@ -150,6 +150,8 @@ void CCore::execute() throw(ComponentErrors::TimerErrorExImpl, ComponentErrors:: m_parser->add("latOTF", new function3 >, I >, I >(this, &CCore::_latOTF), 3); m_parser->add("skydipOTF", new function3 >, I >, I >(this, &CCore::_skydipOTF), 3); m_parser->add("moon", new function0(this, &CCore::_moon), 0); + m_parser->add("sun", new function0(this, &CCore::_sun), 0); + m_parser->add("planet", new function1 > (this, &CCore::_planet), 1); m_parser->add("sidereal", new function5, I >, I >, I >, I > >(this, &CCore::_sidereal), 5); m_parser->add("track", new function1 >(this, &CCore::_track), 1); m_parser->add("goTo", new function2 >, I > >(this, &CCore::_goTo), 2); diff --git a/Common/Servers/Scheduler/src/Core_Common.i b/Common/Servers/Scheduler/src/Core_Common.i index 66f3a740e..a69488c9c 100644 --- a/Common/Servers/Scheduler/src/Core_Common.i +++ b/Common/Servers/Scheduler/src/Core_Common.i @@ -36,6 +36,7 @@ bool CCore::checkScan(ACS::Time& ut,const Antenna::TTrackingParameters *const pr try { //antennaUT will stores the estimated start time from the antenna for all kind of subscans antennaAnswer=m_antennaBoss->checkScan(ut,*prim,*sec,minEl,maxEl,m_antennaRTime.out()); + ACS_LOG(LM_FULL_INFO,"CCore::checkScan()",(LM_DEBUG,"MIN EL %f :",(float)minEl)); ACS_LOG(LM_FULL_INFO,"CCore::checkScan()",(LM_DEBUG,"SLEWING_TIME %llu :",(unsigned long long)m_antennaRTime->slewingTime)); } catch (ComponentErrors::ComponentErrorsEx& ex) { diff --git a/Common/Servers/Scheduler/src/Core_Operations.i b/Common/Servers/Scheduler/src/Core_Operations.i index b693b3a1b..0368e1b6b 100644 --- a/Common/Servers/Scheduler/src/Core_Operations.i +++ b/Common/Servers/Scheduler/src/Core_Operations.i @@ -184,6 +184,42 @@ void CCore::_moon() throw (ManagementErrors::TelescopeSubScanErrorExImpl,Managem m_subScanEpoch=startTime; } +void CCore::_sun() throw (ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl, + ManagementErrors::CloseTelescopeScanErrorExImpl) +{ + baci::ThreadSyncGuard guard(&m_mutex); + ACS::Time startTime=0; // start asap + Antenna::TTrackingParameters primary,secondary; + MinorServo::MinorServoScan servo; + Receivers::TReceiversParameters receievers; + Management::TSubScanConfiguration subConf; + Schedule::CSubScanBinder binder(&primary,&secondary,&servo,&receievers,&subConf); + binder.sun(); + startTime=0; // it means start as soon as possible + startScan(startTime,&primary,&secondary,&servo,&receievers,subConf); //ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl + m_subScanEpoch=startTime; +} +void CCore::_planet(const char * planetName) throw (ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl, + ManagementErrors::CloseTelescopeScanErrorExImpl) +{ + baci::ThreadSyncGuard guard(&m_mutex); + ACS::Time startTime=0; // start asap + Antenna::TTrackingParameters primary,secondary; + MinorServo::MinorServoScan servo; + Receivers::TReceiversParameters receievers; + Management::TSubScanConfiguration subConf; + Schedule::CSubScanBinder binder(&primary,&secondary,&servo,&receievers,&subConf); + binder.planet(planetName); + startTime=0; // it means start as soon as possible + # + startScan(startTime,&primary,&secondary,&servo,&receievers,subConf); //ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl + + m_subScanEpoch=startTime; +} + + + + void CCore::_sidereal(const char * targetName,const double& ra,const double& dec,const Antenna::TSystemEquinox& eq,const Antenna::TSections& section) throw ( ManagementErrors::TelescopeSubScanErrorExImpl,ManagementErrors::TargetOrSubscanNotFeasibleExImpl,ManagementErrors::CloseTelescopeScanErrorExImpl) { diff --git a/Common/Servers/Scheduler/src/Schedule_ScanList.cpp b/Common/Servers/Scheduler/src/Schedule_ScanList.cpp index e9fe48bc9..c03b2c1b0 100644 --- a/Common/Servers/Scheduler/src/Schedule_ScanList.cpp +++ b/Common/Servers/Scheduler/src/Schedule_ScanList.cpp @@ -13,6 +13,7 @@ #define SUN "SUN" #define MOON "MOON" #define SATELLITE "SATELLITE" +#define PLANET "PLANET" #define SOLARSYTEMBODY "SOLARSYTEMBODY" #define OTF "OTF" #define OTFC "OTFC" @@ -198,6 +199,30 @@ bool CScanList::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS break; } case Management::MNG_SUN: { + DWORD id; + Antenna::TTrackingParameters *prim=new Antenna::TTrackingParameters; + if (!parseSun(line,prim,id,errMsg)) { + if (prim) delete prim; + return false; // errMsg already set by previous call + } + Antenna::TTrackingParameters *sec=new Antenna::TTrackingParameters; + resetTrackingParameters(sec); + TRecord *rec=new TRecord; + rec->id=id; + rec->type=type; + rec->primaryParameters=(void *)prim; + rec->secondaryParameters=(void *)sec; + // ************************************** + // Da modificare come MNG_PEAKER + CSubScanBinder binder(getConfiguration(),false); + rec->receieversParsmeters=(void *)binder.getReceivers(); + rec->servoParameters=(void *)binder.getServo(); + rec->subScanConfiguration=binder.getSubScanConfiguration(); + // ************************************** + + //rec->target=""; + rec->line=lnNumber; + m_schedule.push_back(rec); break; } case Management::MNG_MOON: { @@ -275,7 +300,34 @@ bool CScanList::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS case Management::MNG_SATELLITE: { break; } - case Management::MNG_SOLARSYTEMBODY: { + case Management::MNG_PLANET: { + + DWORD id; + Antenna::TTrackingParameters *prim=new Antenna::TTrackingParameters; + if (!parsePlanet(line,prim,id,errMsg)) { + if (prim) delete prim; + return false; // errMsg already set by previous call + } + Antenna::TTrackingParameters *sec=new Antenna::TTrackingParameters; + resetTrackingParameters(sec); + TRecord *rec=new TRecord; + rec->id=id; + rec->type=type; + rec->primaryParameters=(void *)prim; + rec->secondaryParameters=(void *)sec; + // ************************************** + // Da modificare come MNG_PEAKER + CSubScanBinder binder(getConfiguration(),false); + rec->receieversParsmeters=(void *)binder.getReceivers(); + rec->servoParameters=(void *)binder.getServo(); + rec->subScanConfiguration=binder.getSubScanConfiguration(); + // ************************************** + + //rec->target=""; + rec->line=lnNumber; + m_schedule.push_back(rec); + break; + break; } case Management::MNG_OTF: { @@ -379,6 +431,147 @@ bool CScanList::parseMoon(const IRA::CString& val,Antenna::TTrackingParameters * return true; } +bool CScanList::parseSun(const IRA::CString& val,Antenna::TTrackingParameters *scan,DWORD& id,IRA::CString& errMsg) +{ + char type[32],offFrame[32],lonOff[32],latOff[32]; + long out; + //double lonOff,latOff; + out=sscanf((const char *)val,"%u\t%s\t%s\t%s\t%s",&id,type,offFrame,lonOff,latOff); + if ((out!=2) && (out!=5)) { + errMsg="invalid sun scan definition"; + return false; + } + scan->targetName=CORBA::string_dup("Sun"); + scan->type=Antenna::ANT_SUN; + scan->paramNumber=0; + scan->secondary=false; + scan->VradFrame=Antenna::ANT_UNDEF_FRAME; + scan->VradDefinition=Antenna::ANT_UNDEF_DEF; + scan->RadialVelocity=0.0; + scan->section=Antenna::ACU_NEUTRAL; // no support for section selection in schedule right now + scan->enableCorrection=true; + if (out==5) { + if (strcmp(offFrame,OFFFRAMEEQ)==0) { + scan->offsetFrame=Antenna::ANT_EQUATORIAL; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid equatorial longitude offset"; + return false; //ra + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid equatorial latitude offset"; + return false; //dec + } + } + else if (strcmp(offFrame,OFFFRAMEHOR)==0) { + scan->offsetFrame=Antenna::ANT_HORIZONTAL; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid horizontal longitude offset"; + return false; //azimuth...since they are offsets negative values are valid + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid horizontal latitude offset"; + return false; //elevation + } + } + else if (strcmp(offFrame,OFFFRAMEGAL)==0) { + scan->offsetFrame=Antenna::ANT_GALACTIC; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid galactic longitude offset"; + return false; //longitude + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid galactic latitude offset"; + return false; //latitude + } + } + else { + return false; + } + scan->applyOffsets=true; + } + else { + scan->latitudeOffset=0.0; + scan->longitudeOffset=0.0; + scan->applyOffsets=false; + } + return true; +} + +bool CScanList::parsePlanet(const IRA::CString& val,Antenna::TTrackingParameters *scan,DWORD& id,IRA::CString& errMsg) +{ + char type[32],offFrame[32],lonOff[32],latOff[32],planetName[32]; + long out; + //double lonOff,latOff; + out=sscanf((const char *)val,"%u\t%s\t%s\t%s\t%s\t%s",&id,type,planetName,offFrame,lonOff,latOff); + if ((out!=3) && (out!=6)) { + errMsg="invalid planet scan definition"; + return false; + } + scan->targetName=CORBA::string_dup(planetName); + scan->type=Antenna::ANT_SOLARSYSTEMBODY; + scan->paramNumber=0; + scan->secondary=false; + scan->VradFrame=Antenna::ANT_UNDEF_FRAME; + scan->VradDefinition=Antenna::ANT_UNDEF_DEF; + scan->RadialVelocity=0.0; + scan->section=Antenna::ACU_NEUTRAL; // no support for section selection in schedule right now + scan->enableCorrection=true; + if (out==6) { + + if (strcmp(offFrame,OFFFRAMEEQ)==0) { + scan->offsetFrame=Antenna::ANT_EQUATORIAL; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid equatorial longitude offset"; + return false; //ra + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid equatorial latitude offset"; + return false; //dec + } + } + else if (strcmp(offFrame,OFFFRAMEHOR)==0) { + scan->offsetFrame=Antenna::ANT_HORIZONTAL; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid horizontal longitude offset"; + return false; //azimuth...since they are offsets negative values are valid + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid horizontal latitude offset"; + return false; //elevation + } + } + else if (strcmp(offFrame,OFFFRAMEGAL)==0) { + scan->offsetFrame=Antenna::ANT_GALACTIC; + if (!IRA::CIRATools::offsetToRad(lonOff,scan->longitudeOffset)) { + errMsg="invalid galactic longitude offset"; + return false; //longitude + } + if (!IRA::CIRATools::offsetToRad(latOff,scan->latitudeOffset)) { + errMsg="invalid galactic latitude offset"; + return false; //latitude + } + } + else { + return false; + } + scan->applyOffsets=true; + } + else { + scan->latitudeOffset=0.0; + scan->longitudeOffset=0.0; + scan->applyOffsets=false; + } + return true; +} + + + + + + + + + // void CSubScanBinder::sidereal(const char * targetName,const double& ra,const double& dec,const Antenna::TSystemEquinox& eq,const Antenna::TSections& section) bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& errMsg,CSubScanBinder& binder) diff --git a/Common/Servers/Scheduler/src/SchedulerImpl.cpp b/Common/Servers/Scheduler/src/SchedulerImpl.cpp index 510057e46..ef6ba3cd6 100644 --- a/Common/Servers/Scheduler/src/SchedulerImpl.cpp +++ b/Common/Servers/Scheduler/src/SchedulerImpl.cpp @@ -476,6 +476,41 @@ void SchedulerImpl::moon() throw (ComponentErrors::ComponentErrorsEx,ManagementE } } +void SchedulerImpl::sun() throw (ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException) +{ + try { + m_core->_sun(); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ManagementErrors::ManagementErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getManagementErrorsEx(); + } +} + +void SchedulerImpl::planet(const char * name) throw ( + ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException) +{ + + try { + m_core->_planet(name); + } + catch (ComponentErrors::ComponentErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + catch (ManagementErrors::ManagementErrorsExImpl& ex) { + ex.log(LM_DEBUG); + throw ex.getManagementErrorsEx(); + } + + +} + + void SchedulerImpl::sidereal(const char * targetName,CORBA::Double ra,CORBA::Double dec,Antenna::TSystemEquinox eq,Antenna::TSections section) throw ( ComponentErrors::ComponentErrorsEx,ManagementErrors::ManagementErrorsEx,CORBA::SystemException) { diff --git a/Common/Servers/Scheduler/src/SubScanBinder.cpp b/Common/Servers/Scheduler/src/SubScanBinder.cpp index 0e9e7c1a2..c5bab1e27 100644 --- a/Common/Servers/Scheduler/src/SubScanBinder.cpp +++ b/Common/Servers/Scheduler/src/SubScanBinder.cpp @@ -326,6 +326,48 @@ void CSubScanBinder::moon() // The other subsystems can stay with defaults } +void CSubScanBinder::sun() +{ + m_secondary->type=Antenna::ANT_NONE; + m_secondary->secondary=false; + m_secondary->applyOffsets=false; + m_secondary->paramNumber=0; + m_secondary->enableCorrection=true; + m_primary->type=Antenna::ANT_SUN; + m_primary->secondary=false; + m_primary->targetName=CORBA::string_dup("Sun"); + m_primary->applyOffsets=false; + m_primary->section=Antenna::ACU_NEUTRAL; + m_primary->enableCorrection=true; + m_servo->is_empty_scan=true; + m_servo->axis_code=CORBA::string_dup(""); + m_servo->range=0; + m_servo->total_time=0; + m_subScanConf->signal=Management::MNG_SIGNAL_SIGNAL; + // The other subsystems can stay with defaults +} + +void CSubScanBinder::planet(const char * planetName) +{ + m_secondary->type=Antenna::ANT_NONE; + m_secondary->secondary=false; + m_secondary->applyOffsets=false; + m_secondary->paramNumber=0; + m_secondary->enableCorrection=true; + m_primary->type=Antenna::ANT_SOLARSYSTEMBODY; + m_primary->secondary=false; + m_primary->targetName=CORBA::string_dup(planetName); + m_primary->applyOffsets=false; + m_primary->section=Antenna::ACU_NEUTRAL; + m_primary->enableCorrection=true; + m_servo->is_empty_scan=true; + m_servo->axis_code=CORBA::string_dup(""); + m_servo->range=0; + m_servo->total_time=0; + m_subScanConf->signal=Management::MNG_SIGNAL_SIGNAL; + // The other subsystems can stay with defaults +} + void CSubScanBinder::track(const char *targetName) { m_secondary->type=Antenna::ANT_NONE; diff --git a/Common/Servers/Scheduler/templates/MapJupiter1x1.bck b/Common/Servers/Scheduler/templates/MapJupiter1x1.bck new file mode 100644 index 000000000..bda5d9ea0 --- /dev/null +++ b/Common/Servers/Scheduler/templates/MapJupiter1x1.bck @@ -0,0 +1,2 @@ +STD:BACKENDS/TotalPower { +} diff --git a/Common/Servers/Scheduler/templates/MapJupiter1x1.cfg b/Common/Servers/Scheduler/templates/MapJupiter1x1.cfg new file mode 100644 index 000000000..9b46e6dbf --- /dev/null +++ b/Common/Servers/Scheduler/templates/MapJupiter1x1.cfg @@ -0,0 +1,13 @@ +INIT { + nop +} + +PRE { + waitOnsource + tsys + wait=5.000 +} + +POST { + wait=2.000 +} diff --git a/Common/Servers/Scheduler/templates/MapJupiter1x1.lis b/Common/Servers/Scheduler/templates/MapJupiter1x1.lis new file mode 100644 index 000000000..8b5309358 --- /dev/null +++ b/Common/Servers/Scheduler/templates/MapJupiter1x1.lis @@ -0,0 +1,208 @@ +#OTF columns labels +#ID type label Lon1 Lat1 Lon2 Lat2 frame sFrame geometry descr direction duration offsetFrame LonOffset LatOffset +1 PLANET JUPITER +2 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.493056d +3 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.479167d +4 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.465278d +5 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.451389d +6 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.437500d +7 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.423611d +8 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.409722d +9 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.395833d +10 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.381944d +11 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.368056d +12 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.354167d +13 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.340278d +14 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.326389d +15 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.312500d +16 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.298611d +17 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.284722d +18 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.270833d +19 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.256944d +20 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.243056d +21 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.229167d +22 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.215278d +23 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.201389d +24 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.187500d +25 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.173611d +26 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.159722d +27 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.145833d +28 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.131944d +29 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.118056d +30 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.104167d +31 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.0902778d +32 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.0763889d +33 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.0625000d +34 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.0486111d +35 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.0347222d +36 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d -0.0208333d +37 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d -0.00694444 +38 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.00694444d +39 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.0208333d +40 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.0347222d +41 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.0486111d +42 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.0625000d +43 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.0763889d +44 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.0902778d +45 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.104167d +46 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.118056d +47 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.131944d +48 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.145833d +49 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.159722d +50 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.173611d +51 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.187500d +52 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.201389d +53 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.215278d +54 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.229167d +55 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.243056d +56 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.256944d +57 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.270833d +58 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.284722d +59 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.298611d +60 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.312500d +61 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.326389d +62 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.340278d +63 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.354167d +64 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.368056d +65 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.381944d +66 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.395833d +67 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.409722d +68 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.423611d +69 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.437500d +70 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.451389d +71 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.465278d +72 OTFC 1 1.0d EQ EQ LAT INC 20.0 -EQOFFS 0.00000d 0.479167d +73 OTFC 1 1.0d EQ EQ LAT DEC 20.0 -EQOFFS 0.00000d 0.493056d + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Servers/Scheduler/templates/MapJupiter1x1.scd b/Common/Servers/Scheduler/templates/MapJupiter1x1.scd new file mode 100644 index 000000000..6a4fe0133 --- /dev/null +++ b/Common/Servers/Scheduler/templates/MapJupiter1x1.scd @@ -0,0 +1,85 @@ +PROJECT: S0000 +OBSERVER: ssss +SCANLIST: MapJupiter1x1.lis +PROCEDURELIST: MapJupiter1x1.cfg +BACKENDLIST: MapJupiter1x1.bck +MODE: SEQ +SCANTAG: 1 +INITPROC: INIT +#1x1 map done in equatorial frame over JUPITER. +#scan scanTag label backend scanLayout +#subScanTag duration IDSubScan preSubScan postSubScan +SC: 1 VirA7GHz_Map_bis STD:MANAGEMENT/FitsZilla +1_1 20.000000 2 NULL POST +1_2 20.000000 3 NULL POST +1_3 20.000000 4 NULL POST +1_4 20.000000 5 NULL POST +1_5 20.000000 6 NULL POST +1_6 20.000000 7 NULL POST +1_7 20.000000 8 NULL POST +1_8 20.000000 9 NULL POST +1_9 20.000000 10 NULL POST +1_10 20.000000 11 NULL POST +1_11 20.000000 12 NULL POST +1_12 20.000000 13 NULL POST +1_13 20.000000 14 NULL POST +1_14 20.000000 15 NULL POST +1_15 20.000000 16 NULL POST +1_16 20.000000 17 NULL POST +1_17 20.000000 18 NULL POST +1_18 20.000000 19 NULL POST +1_19 20.000000 20 NULL POST +1_20 20.000000 21 NULL POST +1_21 20.000000 22 NULL POST +1_22 20.000000 23 NULL POST +1_23 20.000000 24 NULL POST +1_24 20.000000 25 NULL POST +1_25 20.000000 26 NULL POST +1_26 20.000000 27 NULL POST +1_27 20.000000 28 NULL POST +1_28 20.000000 29 NULL POST +1_29 20.000000 30 NULL POST +1_30 20.000000 31 NULL POST +1_31 20.000000 32 NULL POST +1_32 20.000000 33 NULL POST +1_33 20.000000 34 NULL POST +1_34 20.000000 35 NULL POST +1_35 20.000000 36 NULL POST +1_36 20.000000 37 NULL POST +1_37 20.000000 38 NULL POST +1_38 20.000000 39 NULL POST +1_39 20.000000 40 NULL POST +1_40 20.000000 41 NULL POST +1_41 20.000000 42 NULL POST +1_42 20.000000 43 NULL POST +1_43 20.000000 44 NULL POST +1_44 20.000000 45 NULL POST +1_45 20.000000 46 NULL POST +1_46 20.000000 47 NULL POST +1_47 20.000000 48 NULL POST +1_48 20.000000 49 NULL POST +1_49 20.000000 50 NULL POST +1_50 20.000000 51 NULL POST +1_51 20.000000 52 NULL POST +1_52 20.000000 53 NULL POST +1_53 20.000000 54 NULL POST +1_54 20.000000 55 NULL POST +1_55 20.000000 56 NULL POST +1_56 20.000000 57 NULL POST +1_57 20.000000 58 NULL POST +1_58 20.000000 59 NULL POST +1_59 20.000000 60 NULL POST +1_60 20.000000 61 NULL POST +1_61 20.000000 62 NULL POST +1_62 20.000000 63 NULL POST +1_63 20.000000 64 NULL POST +1_64 20.000000 65 NULL POST +1_65 20.000000 66 NULL POST +1_66 20.000000 67 NULL POST +1_67 20.000000 68 NULL POST +1_68 20.000000 69 NULL POST +1_69 20.000000 70 NULL POST +1_70 20.000000 71 NULL POST +1_71 20.000000 72 NULL POST +1_72 20.000000 73 NULL POST + diff --git a/Common/Servers/Scheduler/templates/calib.lis b/Common/Servers/Scheduler/templates/calib.lis index 1fd87c845..e280a61e1 100644 --- a/Common/Servers/Scheduler/templates/calib.lis +++ b/Common/Servers/Scheduler/templates/calib.lis @@ -1,4 +1,4 @@ -10 SIDEREAL 3c123 +10 PLNET JUPIrER 11 SIDEREAL 3c123 -HOROFFS 1.0d 0.0d 20 SIDEREAL 3c286 21 SIDEREAL 3c286 -HOROFFS 1.0d 0.0d diff --git a/Common/Servers/SolarSystem/ChangeLog b/Common/Servers/SolarSystem/ChangeLog new file mode 100644 index 000000000..a6bf091b5 --- /dev/null +++ b/Common/Servers/SolarSystem/ChangeLog @@ -0,0 +1 @@ +"@(#) $Id$" diff --git a/Common/Servers/SolarSystem/include/SolarSystemBodyImpl.h b/Common/Servers/SolarSystem/include/SolarSystemBodyImpl.h new file mode 100644 index 000000000..60187d4bd --- /dev/null +++ b/Common/Servers/SolarSystem/include/SolarSystemBodyImpl.h @@ -0,0 +1,222 @@ +#ifndef SOLSYSBODYIMPL_H_ +#define SOLSYSBODYIMPL_H_ +/** +* This code is under GNU General Public Licence (GPL) +* +* Sergio Poppi 09/05/2017 creation +* +* +*/ + +/** + * @mainpage Solar System bodies tracking component implementation documentation + * @date 09/05/2017 + * @version 1.02.0 + * @author Sergio Poppi + * @remarks + + */ + +#ifndef __cplusplus +#error This is a C++ include file and cannot be used from plain C +#endif + + +#include +#include "SolarSystemBodyS.h" +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +// If THROUGH_GET is true get the exception by an exImpl method +#define THROW_EX(TYPE, NAME, MESSAGE, THROUGH_GET) \ +{ \ + string msg(MESSAGE); \ + ACS_SHORT_LOG((LM_ERROR, msg.c_str())); \ + TYPE::NAME##Impl exImpl(__FILE__, __LINE__, msg.c_str()); \ + if(THROUGH_GET) \ + throw exImpl.get##NAME(); \ + else \ + throw exImpl; \ +} + +#include "libastrowrapper.h" + + +class SolarSystemBodyImpl: public virtual acscomponent::ACSComponentImpl,public virtual POA_Antenna::SolarSystemBody + +{ +public: + + SolarSystemBodyImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices); + + virtual ~SolarSystemBodyImpl(); + /** + * Called to give the component time to initialize itself. The component reads into + configuration files/parameters, builds up connection. + * Called before execute. It is implimented as a synchronous (blocking) call. + */ + + virtual void initialize() throw (ACSErr::ACSbaseExImpl); + /* + * Called after initialize() to tell the component that it has to be ready to + accept incoming function calls at any time. + * Must be implemented as a synchronous (blocking) call. + * In this class the default implementation only logs the COMPSTATE_OPERTIONAL + */ + virtual void execute() throw (ACSErr::ACSbaseExImpl); + + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + virtual void cleanUp(); + + + /* + * Called by the container in the case of error or emergency situation. This function tries to free all the resources even though + * there is no warrenty that the function is completly executed before the component is destroyed + * */ + virtual void aboutToAbort(); + /* + * This method is used to retrive all the attribute of the component in one shot. + * @throw CORBA::SystemException + * @param att that's the pointer to the structure containing all the data. + */ + void getAttributes(Antenna::SolarSystemBodyAttributes_out att) throw (CORBA::SystemException); + + + void setBodyName(const char* bodyName) throw (CORBA::SystemException,AntennaErrors::AntennaErrorsEx) ; + + /* + * This method is used to apply new offsets to a givrn frame. Longitude is corrected for latitude cosine before use. + * @throw CORBA::SystemException + * @throw AntennaErrors::AntennaErrorsEx + * @param longitude new offset for the longitude in radians. + * @param latitude new offset for the latitude in radians. + * @param frame frame the offstes refer to, galactic frame not supported and an error is thrown. + */ + void setOffsets(CORBA::Double lon,CORBA::Double lat,Antenna::TCoordinateFrame frame) throw (CORBA::SystemException,AntennaErrors::AntennaErrorsEx); + + /* + * It used, given a timestamp, to retrive the apparent topocentric coordinates in one shot. + * @throw CORBA::SystemException + * @param time this parameter is used to pass the exact time the caller wants to know the topocentric coordinates. + * @param az that's the returned value in radians of the azimuth for the requested time. + * @param az that's the returned value in radians of the elevation for the requested time. + */ + void getHorizontalCoordinate(ACS::Time time, CORBA::Double_out az, CORBA::Double_out el) throw (CORBA::SystemException); + + /** + * This method is only for control software internal use. It used, given a timestamp, to retrive the apparent + * J2000 Equatorial coordiantes coordinates in one shot. + * @throw CORBA::SystemException + * @param timestamp this parameter is used to pass the exact time the caller wants to know the topocentric coordinates. + * @param ra that's the returned value in radians of the right ascension for the requested time. + * @param re that's the returned value in radians of the declination for the requested time. + */ + void getJ2000EquatorialCoordinate(ACS::Time time, CORBA::Double_out ra, CORBA::Double_out dec) throw (CORBA::SystemException); + + + + /** + * It used, given a timestamp, to retrieve the all apparent coordinates in all frames in one shot. + * @throw CORBA::SystemException + * @param time this parameter is used to pass the exact time the caller wants to know the horizontal coordinates. + * @param az that's the returned value in radians of the azimuth for the requested time. + * @param el that's the returned value in radians of the elevation for the requested time. + * @param ra that's the returned value in radians of the elevation for the requested time. + * @param dec that's the returned value in radians of the right ascension for the requested time. + * @param jepoch julian epoch the returned equatorial point refers to + * @param lon that's the returned value in radians of the galactic longitude for the requested time. + * @param lat that's the returned value in radians of the galactic latitude for the requested time. + */ + void getAllCoordinates(ACS::Time time,CORBA::Double_out az,CORBA::Double_out el,CORBA::Double_out ra,CORBA::Double_out dec,CORBA::Double_out jepoch, + CORBA::Double_out lon,CORBA::Double_out lat) throw (CORBA::SystemException); + + /* + * This method is used to check if the given coordinate at the given time belongs to the trajectory generated by this component with + * the tollerance of a tens of HPBW. If the given coordinate is the telescope coordinate we can say that the antenna is tracking. + * @throw CORBA::SystemException + * @param time that the time mark the given coordinate refers to. + * @param az that's the azimuth of the given coordinate (in radians) + * @param el that's the elevation of the given coordinate (in radians) + * @param HPBW that's the beam width at half power for the telescope. This parameter, given in radians, changes with + the frequency so it must be provided by the caller. + * @return true if the given point is in the generated trajectory. + */ + bool checkTracking(ACS::Time time,CORBA::Double az,CORBA::Double el,CORBA::Double HPBW) throw (CORBA::SystemException); + + /** + * This method is supposed to compute the flux of the moon. At present a 0.0 Jy is always returned. + * @throw CORBA::SystemException + * @param freq frequency observed + * @param fwhm fwhm + * @param flux computed flux (Jy) + */ + void computeFlux(CORBA::Double freq, CORBA::Double fwhm, CORBA::Double_out flux) throw (CORBA::SystemException); + /** + * This method is only for control software internal use. It used, given a timestamp, to body distance in AY. + * @throw CORBA::SystemException + * @param timestamp this parameter is used to pass the exact time the caller wants to know the topocentric coordinates. + * @param distance that's the returned distance at given time in AU + */ + + + + void getDistance(ACS::Time time,CORBA::Double_out distance) throw (CORBA::SystemException); + +private: + + IRA::CString m_bodyName; + int m_bodycode; + BACIMutex m_mutex; + + IRA::CSite m_site; + IRA::CSkySource m_source; + xephemlib::Site* m_sitex; // site class for libastro + xephemlib::SolarSystemBody* m_body_xephem; + // dummy CSkySource onj for coordinate conversion + double m_longitude; + double m_latitude; + double m_height; + + /* + * right ascension, declination, right ascension and declination offset + * azimuth, elevation, azimuth and elevation offset + */ + double m_ra, m_dec,m_ra_off, m_dec_off; + double m_az, m_el,m_az_off, m_el_off; + double m_glon, m_glat; + double m_ra2000,m_dec2000; + double m_dut1; + + double m_distance; + /* + * Currently used frame for the offsets + */ + Antenna::TCoordinateFrame m_offsetFrame; + double m_parallacticAngle; + /* + * This will contain the name of the component...... + */ + IRA::CString m_componentName; + + void BodyPosition(TIMEVALUE &time); + +}; + + + + +#endif /*SOLSYSBODYIMPL_H_*/ diff --git a/Common/Servers/SolarSystem/include/libastrowrapper.h b/Common/Servers/SolarSystem/include/libastrowrapper.h new file mode 100644 index 000000000..90da0dea6 --- /dev/null +++ b/Common/Servers/SolarSystem/include/libastrowrapper.h @@ -0,0 +1,104 @@ +/* + + C++ Wrapper for Xephem libastro. + + + +*/ + + + + +#ifndef _LIBRWAPPER +#define _LIBRWAPPER + +#include +#include +#include "astro.h" +#include "preferences.h" +#include +#include +#include +#include +#include + +namespace xephemlib +{ + + +class Site: public Now { + +public: + + Site(double mj, double lon, double lt, double height); + Site(); + + void setCoordinate(double lon, double lt, double height); + void setTime(double mj); + + void stampa(void); + double getMjd(); + + +private: + double m_lon,m_lat,m_height; + std::string name; + +}; + +class SolarSystemBody { + +public: + + + SolarSystemBody(PLCode code); + ~SolarSystemBody(){ delete obj;} + + static std::string getPlanetNameFromCode(PLCode code); + static PLCode getPlanetCodeFromName(std::string name); + void compute (Site* site); + SolarSystemBody(); + void setObject(PLCode code); + + + Obj* getObject(); + void report(); + static std::map planet; + void getCoordinates(double& ra, double& dec,double& az,double& el, double& range); + private: + + double _ra,_dec,_range,_az,_el; + PLCode _code; + + + +protected: + + Obj* obj; + + + +}; + +class Jupiter : public SolarSystemBody { + +public: + + Jupiter() ; + + + +}; + +} + + + + + + + + + + +#endif /*_LIBRWAPPER*/ diff --git a/Common/Servers/SolarSystem/src/Makefile b/Common/Servers/SolarSystem/src/Makefile new file mode 100644 index 000000000..b0c7cafc0 --- /dev/null +++ b/Common/Servers/SolarSystem/src/Makefile @@ -0,0 +1,113 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# spoppi 03/05/17 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- + EXECUTABLES = testastrolib +# EXECUTABLES_L = + + + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +# INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = SolarSystemBodyImpl +LIBRARIES_L = + +# +# + +SolarSystemBodyImpl_OBJECTS = SolarSystemBodyImpl libastrowrapper +SolarSystemBodyImpl_LIBS = EphemGeneratorStubs SolarSystemBodyStubs baci maci IRALibrary \ + SlaLibrary ObservatoryStubs \ + ComponentErrors AntennaErrors \ + AntennaDefinitionsStubs ManagmentDefinitionsStubs \ + ManagementErrors astro + +testastrolib_OBJECTS = libastrowrapper mainastro +testastrolib_LIBS = astro +# +# Scripts (public and local) +# ---------------------------- +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Servers/SolarSystem/src/MyMake b/Common/Servers/SolarSystem/src/MyMake new file mode 100644 index 000000000..825063c56 --- /dev/null +++ b/Common/Servers/SolarSystem/src/MyMake @@ -0,0 +1,22 @@ + +CC = c++ +CFLAGS= -O2 -Wall -lm +CFLAGS_TEST= -L/opt/gtest/lib -lgtest -lgtest_main -lpthread +DEPS= +INCLUDE= -I../libastro/ +HS = + +%.o: %.cpp $(DEPS) + $(CC) -c -o $@ $< $(CFLAGS) $(INCLUDE) + +myephem: testlibastro.o + $(CC) -o testlibastro testlibastro.o ../libastro/libastro.a + +debug: testlibastro.o + $(CC) -g -o testlibastro testlibastro.o ../libastro/libastro.a + +astrotest: mainastro.o libastrowrapper.o + $(CC) -g -o mainastro libastrowrapper.o mainastro.o ../libastro/libastro.a + +test: libastrowrapper.o test.o + $(CC) -o test -I$(INTROOT)/include libastrowrapper.o test.o ../libastro/libastro.a $(CFLAGS_TEST) diff --git a/Common/Servers/SolarSystem/src/SolarSystemBodyImpl.cpp b/Common/Servers/SolarSystem/src/SolarSystemBodyImpl.cpp new file mode 100644 index 000000000..f9ba45baf --- /dev/null +++ b/Common/Servers/SolarSystem/src/SolarSystemBodyImpl.cpp @@ -0,0 +1,424 @@ +#include "SolarSystemBodyImpl.h" +//#include +#include +#include +#include +#include +#include +//#include +//#include +//#include +//#include +//#include +#include +//#include +#include +#define R2D 57.29577951308232 + +using namespace ComponentErrors; +// using namespace baci; +using namespace IRA; + +using namespace baci; + + +SolarSystemBodyImpl::SolarSystemBodyImpl(const ACE_CString &CompName,maci::ContainerServices *containerServices) : + acscomponent::ACSComponentImpl(CompName, containerServices) +{ + AUTO_TRACE("SolarSystemBodyImpl::SolarSystemBodyImpl()"); + m_componentName=CString(CompName); + m_bodyName="Unset"; +} + +SolarSystemBodyImpl::~SolarSystemBodyImpl() +{ + AUTO_TRACE("SolarSystemBodyImpl::~SolarSystemBodyImpl()"); + +} + +void SolarSystemBodyImpl::initialize() throw(ACSErr::ACSbaseExImpl) +{ + AUTO_TRACE("SolarSystemBodyImpl::initialize()"); + + m_ra_off = m_dec_off = 0.0; + m_az_off = m_el_off = 0.0; + m_offsetFrame=Antenna::ANT_HORIZONTAL; + + + ACS_LOG(LM_FULL_INFO, "SolarSystemBodyImpl::initialize()", (LM_INFO,"COMPSTATE_INITIALIZING")); +} + +void SolarSystemBodyImpl::cleanUp() +{ + AUTO_TRACE("SolarSystemBodyImpl::cleanUp()"); + delete m_sitex; + delete m_body_xephem; + ACSComponentImpl::cleanUp(); +} + +void SolarSystemBodyImpl::aboutToAbort() +{ + AUTO_TRACE("SolarSystemBodyImpl::aboutToAbort()"); +} + +void SolarSystemBodyImpl::execute() throw (ACSErr::ACSbaseExImpl) +{ + AUTO_TRACE("SolarSystemBodyImpl::execute()"); + CError error; + Antenna::TSiteInformation_var site; + + + Antenna::Observatory_var observatory=Antenna::Observatory::_nil(); + try { + observatory=getContainerServices()->getComponent("ANTENNA/Observatory"); + } + catch (maciErrType::CannotGetComponentExImpl & ex){ + _ADD_BACKTRACE(ComponentErrors::CouldntGetComponentExImpl,Impl,ex,"SolarSystemBodyImpl::execute()"); + Impl.setComponentName("ANTENNA/Observatory"); + throw Impl; + } + + ACS_LOG(LM_FULL_INFO,"SolarSystemBodyImpl::execute()", (LM_INFO, (const char *)CString(m_componentName+"::OBSERVATORY_LOCATED"))); + try { + site=observatory->getSiteSummary(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ComponentErrors::CORBAProblemExImpl,_dummy, "SolarSystemBodyImpl::execute()"); + _dummy.setName(ex._name()); + _dummy.setMinor(ex.minor()); + throw _dummy; + } + m_site=CSite(site.out()); + m_source=IRA::CSkySource(); // dummy obj for coordinate conversion + + m_dut1=site->DUT1; + m_longitude=site->longitude; + m_latitude=site->latitude; + m_height=site->height; + // std::cout << "Site:" << site->longitude *R2D << " " << m_latitude ; + m_sitex= new xephemlib::Site(); + m_sitex-> setCoordinate(site->longitude,site->latitude,site->height); //coordinates in degrees. + m_body_xephem = new xephemlib::SolarSystemBody(); + + + try { + getContainerServices()->releaseComponent((const char*)observatory->name()); + } + catch (maciErrType::CannotReleaseComponentExImpl& ex) { + _ADD_BACKTRACE(ComponentErrors::CouldntReleaseComponentExImpl,Impl,ex,"SolarSystemBodyImpl::initialize()"); + Impl.setComponentName("ANTENNA/Observatory"); + throw Impl; + } + ACS_LOG(LM_FULL_INFO,"SolarSystemBodyImpl::execute()", (LM_INFO,"SITE_INITIALIZED")); +} + + + +void SolarSystemBodyImpl::getAttributes(Antenna::SolarSystemBodyAttributes_out att) throw (CORBA::SystemException) +{ + + AUTO_TRACE("SolarSystemBodyImpl::getAttributes()"); + + + baci::ThreadSyncGuard guard(&m_mutex); +TIMEVALUE now; + + IRA::CIRATools::getTime(now); + + BodyPosition(now); + + /* Returns the julian epoch of the date. + * @return the epoch which is the year with the fracional part of the year. + */ + double JulianEpoch; + + BodyPosition(now); + IRA::CDateTime currentTime(now,m_dut1); + JulianEpoch = currentTime.getJulianEpoch(); + + /* Getting the output field + */ + + att=new Antenna::SolarSystemBodyAttributes; + + att->sourceID=CORBA::string_dup(m_bodyName); + att->J2000RightAscension=slaDranrm(m_ra2000); + att->J2000Declination=IRA::CIRATools::latRangeRad(m_dec2000); + att-> rightAscension = slaDranrm(m_ra); + att-> declination = IRA::CIRATools::latRangeRad(m_dec) ; + att-> azimuth = slaDranrm(m_az); + att-> elevation = IRA::CIRATools::latRangeRad(m_el); + att-> julianEpoch = JulianEpoch; + att-> parallacticAngle = m_parallacticAngle; + att-> userAzimuthOffset = m_az_off; + att-> userElevationOffset = m_el_off; + att-> userRightAscensionOffset = m_ra_off; + att-> userDeclinationOffset = m_dec_off; + att->gLongitude=slaDranrm(m_glon); + att->gLatitude=IRA::CIRATools::latRangeRad(m_glat); + att->userLatitudeOffset=att->userLongitudeOffset=0.0; + att->axis=Management::MNG_TRACK; + att->distance=m_distance; + att->angularSize= att->radialVelocity=0; + att->vradFrame= Antenna::ANT_TOPOCEN ; + att->vradDefinition=Antenna::ANT_RADIO; + +} + +void SolarSystemBodyImpl::setOffsets(CORBA::Double lon,CORBA::Double lat,Antenna::TCoordinateFrame frame) throw (CORBA::SystemException,AntennaErrors::AntennaErrorsEx) +{ + AUTO_TRACE("SolarSystemBodyImpl::setOffsets()"); + if (frame==Antenna::ANT_HORIZONTAL) { + m_source.setHorizontalOffsets(lon,lat); + m_az_off=lon; + m_el_off=lat; + m_ra_off=0.0; + m_dec_off=0.0; + } + else if (frame==Antenna::ANT_EQUATORIAL) { + m_az_off=0.0; + m_el_off=0.0; + m_ra_off=lon; + m_dec_off=lat; + m_source.setEquatorialOffsets(lon,lat); + + } + else { + _EXCPT(AntennaErrors::OffsetFrameNotSupportedExImpl,impl,"SolarSystemBodyImpl::setOffsets()"); + throw impl.getAntennaErrorsEx(); + } + +} + +void SolarSystemBodyImpl::getJ2000EquatorialCoordinate(ACS::Time time, CORBA::Double_out ra2000, CORBA::Double_out dec2000) throw (CORBA::SystemException) + +{ + AUTO_TRACE("SolarSystemBodyImpl::getJ2000EquatorialCoordinate()"); + double _ra,_dec; + TIMEVALUE val(time); + BodyPosition(val); + + IRA::CDateTime ctime(val,m_dut1); + _ra =slaDranrm(m_ra2000); + _dec =IRA::CIRATools::latRangeRad(m_dec2000); + ra2000=_ra; + dec2000=_dec; + + +} + + +void SolarSystemBodyImpl::getHorizontalCoordinate(ACS::Time time, CORBA::Double_out az, CORBA::Double_out el) throw (CORBA::SystemException) + +{ + AUTO_TRACE("SolarSystemBodyImpl::getHorizontalCoordinate()"); + double azi,ele; + TIMEVALUE val(time); + IRA::CDateTime ctime(val,m_dut1); + baci::ThreadSyncGuard guard(&m_mutex); + BodyPosition(val); + m_source.process(ctime,m_site); + m_source.getApparentHorizontal(azi,ele); + az=azi; el=ele; + + + +} + +void SolarSystemBodyImpl::getAllCoordinates(ACS::Time time,CORBA::Double_out az,CORBA::Double_out el,CORBA::Double_out ra,CORBA::Double_out dec,CORBA::Double_out jepoch,CORBA::Double_out lon, + CORBA::Double_out lat) throw (CORBA::SystemException) +{ + + AUTO_TRACE("SolarSystemBodyImpl::getAllCoordinates()") + + TIMEVALUE val(time); + double azi,ele,rae,dece,lone,late,jepoche; + IRA::CDateTime ctime(val,m_dut1); + baci::ThreadSyncGuard guard(&m_mutex); + BodyPosition(val); + m_source.process(ctime,m_site); + m_source.getApparentHorizontal(azi,ele); + m_source.getApparentEquatorial(rae,dece,jepoche); + m_source.getApparentGalactic(lone,late); + az=azi; el=ele; + ra=rae; dec=dece; jepoch=jepoche; + lon=lone; lat=late; +} + + +bool SolarSystemBodyImpl::checkTracking(ACS::Time time,CORBA::Double az,CORBA::Double el,CORBA::Double HPBW) throw (CORBA::SystemException) +{ + AUTO_TRACE("SolarSystemBodyImpl::checkTracking()") + double computedAz,computedEl,azErr,elErr,skyErr; + TIMEVALUE val(time); + IRA::CDateTime refTime(val,m_dut1); + baci::ThreadSyncGuard guard(&m_mutex); // obtain access + m_source.process(refTime,m_site); + m_source.getApparentHorizontal(computedAz,computedEl); + elErr=computedEl-el; + azErr=(computedAz-az)*cos(el); + skyErr=sqrt(elErr*elErr+azErr*azErr); //total skyError + return skyErr<=HPBW*0.1; + +} + + +void SolarSystemBodyImpl::setBodyName(const char* bodyName) throw (CORBA::SystemException,AntennaErrors::AntennaErrorsEx) +{ + +/* +typedef enum { + MERCURY, + VENUS, + MARS, + JUPITER, + SATURN, + URANUS, + NEPTUNE, + PLUTO, + SUN, + MOON, + NOBJ // total number of basic objects +} PLCode; +*/ + + + AUTO_TRACE("SolarSystemBodyImpl::setBodyName()"); + m_bodyName=CString(bodyName); + m_bodyName.MakeUpper(); +// std::map plan; + + PLCode code; + + code=xephemlib::SolarSystemBody::getPlanetCodeFromName(bodyName); + CUSTOM_LOG(LM_FULL_INFO,"SolarSystemBodyImpl::setBodyName()", + (LM_INFO,"Solar System body name:%s",(const char *)m_bodyName)); + + + if (code!=NOBJ){ +// m_body_xephem = new xephemlib::SolarSystemBody(code); + try{ + m_body_xephem ->setObject(code); + } + + + catch (std::exception& e) + { + std::cout << e.what() << '\n'; + } + catch (...) + {std::cout << "except" << std::endl;} + + + + // std::cout << "Body name:" << bodyName < setTime(time_utc) ; + m_body_xephem->compute( m_sitex ); + // m_body_xephem->report(); + m_body_xephem->getCoordinates(ra,dec,az,el,range); + m_ra2000 = ra; + m_dec2000= dec; + m_distance=range; + m_source.setInputEquatorial(m_ra2000, m_dec2000, IRA::CSkySource::SS_J2000); + // IRA::CSkySource m_source; // dummy CSkySource onj for coordinate conversion + m_source.process(date,m_site); + m_source.getApparentEquatorial (ra,dec,eph); + m_source.getApparentHorizontal(az,el); + m_source.getApparentGalactic(lone,late); + m_source.apparentToHorizontal(date,m_site); + m_ra=ra; + m_dec=dec; + m_az=az; + m_el=el; + m_glon=lone; + m_glat=late; + + m_parallacticAngle=m_source.getParallacticAngle(); +} + +#include +MACI_DLL_SUPPORT_FUNCTIONS(SolarSystemBodyImpl) + + + diff --git a/Common/Servers/SolarSystem/src/libastrowrapper.cpp b/Common/Servers/SolarSystem/src/libastrowrapper.cpp new file mode 100644 index 000000000..e8f90406e --- /dev/null +++ b/Common/Servers/SolarSystem/src/libastrowrapper.cpp @@ -0,0 +1,281 @@ +#include "libastrowrapper.h" + +namespace xephemlib { + + + +const char *planetnames[]={"Mercury","Venus","Mars","Jupiter","Saturn", + "Uranus","Neptune","Pluto","Sun","Moon","NOBJ"}; + + + + +Site::Site(double mj, double lon, double lt, double height) +{ + this->n_mjd=mj-15019.5; // xephem uses mjd 0 as 1899 12 31 at 12:00 + this->n_lat=lt; + this->n_lng=lon; + this->n_epoch=J2000; + // this->n_height=height; + +} + +Site::Site() + +{ + this->n_epoch=J2000; +} + +void Site::setCoordinate(double lon, double lt,double height) +{ + + this->n_lat=lt; + this->n_lng=lon; + // this->n_heigt=height; + +} + +void Site::setTime(double mj) +{ + + this->n_mjd=mj-15019.5; // xephem uses mjd 0 as 1899 12 31 at 12:00 + + + +} + + + + +void Site::stampa(void){ + + std::cout<< "mjd:"<< this->n_mjd <n_lng) << std::endl; + std::cout << "lat:"<< raddeg(this->n_lat) << std::endl; + + +} + +double Site::getMjd() +{ + + return this->n_mjd+15019.5; + +} + +SolarSystemBody::SolarSystemBody() +{ + obj=new Obj(); + + +}; + +void SolarSystemBody::setObject(PLCode code){ + + + +// obj=new Obj(); + _code=code; + + + // obj->any.co_type=PLANET; + strncpy(obj->any.co_name,planetnames[_code],10); +// obj-> + // pl.plo_code=code; +#ifdef DEBUG +// std::cout << "Code: " << code << std::endl; +// std::cout << "Name: " << planetnames[code] << std::endl; + // std::cout << "Name: " << obj->any.co_name << std::endl; +#endif + +// pref_set(PREF_EQUATORIAL,PREF_TOPO); + + // std::cout << "exit after pref_set: " << obj->any.co_name << std::endl; + +}; + +SolarSystemBody::SolarSystemBody(PLCode code) +{ + //obj=new Obj(); + + _code=code; + +// obj->any.co_type=PLANET; + // strncpy(obj->any.co_name,planetnames[_code],10); + // obj->pl.plo_code=code; +#ifdef DEBUG +// std::cout << "Code: " << code << std::endl; +// std::cout << "Name: " << planetnames[code] << std::endl; +// std::cout << "Name: " << obj->any.co_name << std::endl; +#endif + + // pref_set(PREF_EQUATORIAL,PREF_TOPO); + + + +} + +PLCode SolarSystemBody::getPlanetCodeFromName(std::string str) +{ + std::locale loc; + for (std::string::size_type i=0; i::iterator it=SolarSystemBody::planet.begin(); it!=SolarSystemBody::planet.end(); ++it) + { +#ifdef DEBUG + // std::cout << it->first << " => " << it->second << '\n'; +#endif + if (it->second == code) + name=it->first; + + } + + + + return name; + + + + +} + + +void SolarSystemBody::getCoordinates(double& ra, double& dec,double& az,double& el, double& range) +{ + ra=_ra; + dec=_dec; + az=_az; + el=_el; + range=_range; + + +}; + + +void SolarSystemBody::compute(Site* site){ + + Obj* obj=new Obj(); + + + + obj->any.co_type=PLANET; + strncpy(obj->any.co_name,planetnames[_code],10); + obj-> + pl.plo_code=_code; +#ifdef DEBUG +// std::cout << "Code: " << _code << std::endl; +// std::cout << "Name: " << planetnames[_code] << std::endl; +// std::cout << "Name: " << obj->any.co_name << std::endl; +#endif + pref_set(PREF_EQUATORIAL,PREF_TOPO); + + +// std::cout << "Compute " <any.co_ra; + _dec=obj->any.co_dec; + _az=obj->any.co_az; + _el=obj->any.co_alt; + _range=obj->anyss.so_edist; + delete obj; + +} + + +Obj* SolarSystemBody::getObject() +{ + return obj; + + +} + +void SolarSystemBody::report() +{ +/* Astrometric right ascension and declination of the target center with +respect to the observing site (coordinate origin) in the reference frame of +the planetary ephemeris (ICRF). Compensated for down-leg light-time delay +aberration.*/ + + + + std::cout << "Ra : " << _ra << std::endl; + std::cout << "Dec: " << _dec << std::endl; + std::cout << "Az : " << _az << std::endl; + std::cout << "El : " << _el << std::endl; + std::cout << "Range : " << _range << std::endl; + + + + +} + +std::mapSolarSystemBody::planet; //definition of static variable + + + bool createMap() // function to initialize static map +{ /* +typedef enum { + MERCURY, + VENUS, + MARS, + JUPITER, + SATURN, + URANUS, + NEPTUNE, + PLUTO, + SUN, + MOON, + NOBJ // total number of basic objects +} PLCode; +*/ + + SolarSystemBody::planet["MERCURY"]=MERCURY; + SolarSystemBody::planet["VENUS"]=VENUS ; + SolarSystemBody::planet["MARS"]=MARS ; + SolarSystemBody::planet["JUPITER"]=JUPITER; + SolarSystemBody::planet["SATURN"]=SATURN ; + SolarSystemBody::planet["URANUS"]=URANUS ; + SolarSystemBody::planet["NEPTUNE"]=NEPTUNE ; + SolarSystemBody::planet["PLUTO"]=PLUTO ; + SolarSystemBody::planet["SUN"]=SUN ; + SolarSystemBody::planet["MOON"]=MOON ; + SolarSystemBody::planet["NOBJ"]=NOBJ ; + return 0; +} + + +static bool _tmp=createMap(); // call to the function + +} + diff --git a/Common/Servers/SolarSystem/src/mainastro.cpp b/Common/Servers/SolarSystem/src/mainastro.cpp new file mode 100644 index 000000000..c25fbaa73 --- /dev/null +++ b/Common/Servers/SolarSystem/src/mainastro.cpp @@ -0,0 +1,22 @@ +#include "libastrowrapper.h" +#include +int main(int argc, char** argv) + +{ + + xephemlib::SolarSystemBody p = xephemlib::SolarSystemBody(MERCURY); + std::cout << "New SolarSystemBody done" << std::endl; + xephemlib::Site *site = new xephemlib::Site(); + site -> setCoordinate(degrad(9.5),degrad(39.5),600); + site -> setTime(59319.5) ; +// Site *site = new Site(59319.5,degrad(9.5),degrad(39.5),600); + + + p.compute(site); + p.report(); + std::cout < +#include + +class SolarSystemBodyTest : public ::testing::Test { + + + protected: + + + Site* site; + + SolarSystemBodyTest() + { + + } + + virtual void SetUp() { + + site = new Site(59393.5,degrad(9.5),degrad(39.5),600); + + } + + virtual void TearDown() { + } +}; + + + + + +// TEST_F(EphemTest,versionTest){ +// std::string toolkit_version; +// EXPECT_STREQ("CSPICE_N0065",solsys.spiceToolkitVersion().c_str()); +// +// } + + + +TEST_F(SolarSystemBodyTest,JupiterPosition){ + +// Site *site = new Site(59393.5,degrad(9.5),degrad(39.5),700); + + SolarSystemBody* p = new SolarSystemBody(JUPITER); + p->compute(this->site); + + EXPECT_NEAR( 334.167106906 ,raddeg(p->ra),2.7e-4); + EXPECT_NEAR( -11.764766054 ,raddeg(p->dec),2.7e-4); + EXPECT_NEAR( 4.39448666972074 ,p->range,2.7e-5); + + //334.16711 -11.76477 + + +} + +TEST_F(SolarSystemBodyTest,Sun){ + + Site *site = new Site(); + site -> setCoordinate(degrad(9.5),degrad(39.5),700); + site -> setTime(59393.5) + + + SolarSystemBody* p = new SolarSystemBody(SUN); + p->compute(site); + + EXPECT_NEAR( 96.800863628 ,raddeg(p->ra),2.7e-4); + EXPECT_NEAR( 23.287056282 ,raddeg(p->dec),2.7e-4); + EXPECT_NEAR( 1.01658809887528 ,p->range,2.7e-6); + + + + +} + + + +// Google Test can be run manually from the main() function +// or, it can be linked to the gtest_main library for an already +// set-up main() function primed to accept Google Test test cases. +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} + +// Build command: g++ main.cpp -lgtest diff --git a/Common/Servers/SolarSystem/src/test_SolarSystemBody.py b/Common/Servers/SolarSystem/src/test_SolarSystemBody.py new file mode 100644 index 000000000..4f5ef77a0 --- /dev/null +++ b/Common/Servers/SolarSystem/src/test_SolarSystemBody.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +#******************************************************************************* +# ALMA - Atacama Large Millimiter Array +# (c) Associated Universities Inc., 2002 +# (c) European Southern Observatory, 2002 +# Copyright by ESO (in the framework of the ALMA collaboration) +# and Cosylab 2002, All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# @(#) $Id: acspyexmplDynamicHelloWorld.py,v 1.10 2006/03/30 16:58:36 dfugate Exp $ + + +''' +DESCRIPTION +This client consists of an example which asks manager to create a dynamic +Hello World +component for it. This is done by changing some of the default parameters to the +getComponent method of the ContainerServices class. Once the reference to the newly +created component has been retrieved, a method is invoked to show that the +everything is working. + +WHAT CAN I GAIN FROM THIS EXAMPLE? +- PySimpleClient usage. +- Accessing (remote) components. +- Using PySimpleClient to create and reference dynamic components. +- Manipulating default parameters of ContainerServices methods. + +LINKS +- HelloWorld IDL Documentation +''' + +# Import command-line arguments +from sys import argv + +# Import the SimpleClient class +from Acspy.Clients.SimpleClient import PySimpleClient +import AntennaErrorsImpl +import AntennaErrors +import sys +import Antenna +from math import radians,degrees +from IRAPy import logger +import Acspy.Common.TimeHelper +import time +''' +Date__(UT)__HR:MN R.A.___(ICRF)___DEC R.A._(a-appar)_DEC. Azi____(a-app)___Elev +************************************************************************************** +2022-Jan-21 00:00:00.000 m 336.65825 -10.79656 336.94218 -10.68735 312.371754 -52.320793 + 2021-Apr-15 00:00 2459319.500000000 328.035447923 -13.662097629 327.791152902 -13.167532812 84.489404675 -27.482527702 5.49776328729022 -23.8801089 + 328.03548968344006, -13.662066250524141 + + 328.03548968344006, -13.66206625052414 +''' + + + +epoch = Acspy.Common.TimeHelper.TimeUtil() + +struct_time = time.strptime("2021-Apr-15 00:00", "%Y-%b-%d %H:%M") + +tm=time.mktime(struct_time) + + + +acstime=epoch.py2epoch(tm) + +print (acstime.value) +# Make an instance of the PySimpleClient +simpleClient = PySimpleClient() + +# Obtain a reference to a dynamic component using the ContainerServices +# getComponent method. +hwRef = simpleClient.getDynamicComponent(None, + "IDL:alma/Antenna/SolarSystemBody:1.0", + "SolarSystemBodyImpl",None) + +if hwRef != None: + simpleClient.getLogger().logInfo("Retrieved valid reference from manager.") + #Do something useful with the reference. + + try: + name='Neptuune' + hwRef.setBodyName(name) + except AntennaErrors.SourceNotFoundEx, ex: + newex=AntennaErrorsImpl.SourceNotFoundExImpl(ex) + logger.logError('source %s not found' % ex) + logger.logError(newex.log()) + simpleClient.disconnect() + sys.exit(-1) + except ValueError: + print('zzz') + sys.exit(-1) + sourceID = J2000RightAscension= J2000Declination= rightAscension= declination= julianEpoch= gLongitude= gLatitude= azimuth= elevation= parallacticAngle=0. + userAzimuthOffset=userElevationOffset= userRightAscensionOffset= userDeclinationOffset= userLongitudeOffset= userLatitudeOffset=axis=angularSize=0. + distance= radialVelocity= vradFrame= vradDefinition=0. +# hwRef.getAttributes(sourceID, J2000RightAscension, J2000Declination, rightAscension, declination, julianEpoch, gLongitude, gLatitude, azimuth, elevation, parallacticAngle, userAzimuthOffset, userElevationOffset, userRightAscensionOffset, +# userDeclinationOffset, userLongitudeOffset, userLatitudeOffset, axis, angularSize, distance, radialVelocity, vradFrame, vradDefinition) +#print(att) + +# az,el,ra,dec,l,lon,lat = hwRef.getAllCoordinates(acstime.value) + + ra,dec=hwRef.getJ2000EquatorialCoordinate(acstime.value) + +# print ("az,el",degrees(az),degrees(el)) + print ("ra,dec",degrees(ra),degrees(dec)) + att=hwRef.getAttributes() + dec2000=att.J2000Declination + ra2000=att.J2000RightAscension + print(degrees(ra2000),degrees(dec2000)) + simpleClient.getLogger().logInfo("Method of dynamic component successfully invoked. Have a nice day!") +else: + simpleClient.getLogger().logAlert("Bad reference retrieved from manager") + +simpleClient.disconnect() +print "The end __oOo__" + diff --git a/Common/Servers/SolarSystem/test/Makefile b/Common/Servers/SolarSystem/test/Makefile new file mode 100644 index 000000000..0e616982f --- /dev/null +++ b/Common/Servers/SolarSystem/test/Makefile @@ -0,0 +1,3 @@ +test: + python -m unittest discover -v + diff --git a/Common/Servers/SolarSystem/test/__init__.py b/Common/Servers/SolarSystem/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/Common/Servers/SolarSystem/test/test_jupiter.py b/Common/Servers/SolarSystem/test/test_jupiter.py new file mode 100644 index 000000000..1d6af1823 --- /dev/null +++ b/Common/Servers/SolarSystem/test/test_jupiter.py @@ -0,0 +1,54 @@ +import unittest +# Import command-line arguments +from sys import argv + +# Import the SimpleClient class +from Acspy.Clients.SimpleClient import PySimpleClient + +import Antenna +from math import radians,degrees + +import Acspy.Common.TimeHelper +import time + + +class JupiterPositionTest(unittest.TestCase): + def setUp(self): + epoch = Acspy.Common.TimeHelper.TimeUtil() + struct_time = time.strptime("2021-Apr-15 00:00", "%Y-%b-%d %H:%M") + tm=time.mktime(struct_time) + self.acstime=epoch.py2epoch(tm) + print(tm) + self.simpleClient = PySimpleClient() + self.hwRef = self.simpleClient.getDynamicComponent(None,"IDL:alma/Antenna/SolarSystemBody:1.0","SolarSystemBodyImpl",None) + self.hwRef.setBodyName('Jupiter') + + + + def test_equatorialJ2000(self): + ra,dec=self.hwRef.getJ2000EquatorialCoordinate(self.acstime.value) + time.sleep(1) + print(ra,dec) + + + self.assertAlmostEqual(degrees(ra), 328.035447280, places=4) + self.assertAlmostEqual(degrees(dec), -13.662097261, places=4) + + def test_equatorialApparent(self): + + az,el,ra,dec,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + self.assertAlmostEqual(degrees(ra), 328.315829715 , delta=1e-4) + self.assertAlmostEqual(degrees(dec), -13.564437853 , delta=1e-4) +# def test_horizontalApparent(self): +# az,el,ra,dec,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + self.assertAlmostEqual(degrees(az), 84.320777342 , delta=5e-4) + self.assertAlmostEqual(degrees(el), -28.325680692 , delta=5e-4) + + def tearDown(self): + print('closing') + self.simpleClient.disconnect() + +if __name__ == '__main__': + + unittest.main() + diff --git a/Common/Servers/SolarSystem/test/test_jupiter_distance.py b/Common/Servers/SolarSystem/test/test_jupiter_distance.py new file mode 100644 index 000000000..25d7d943b --- /dev/null +++ b/Common/Servers/SolarSystem/test/test_jupiter_distance.py @@ -0,0 +1,44 @@ +import unittest +# Import command-line arguments +from sys import argv + +# Import the SimpleClient class +from Acspy.Clients.SimpleClient import PySimpleClient + +import Antenna +from math import radians,degrees + +import Acspy.Common.TimeHelper +import time + + +class JupiterDistanceTest(unittest.TestCase): + def setUp(self): + epoch = Acspy.Common.TimeHelper.TimeUtil() + struct_time = time.strptime("2021-Apr-15 00:00", "%Y-%b-%d %H:%M") + tm=time.mktime(struct_time) + self.acstime=epoch.py2epoch(tm) + print(tm) + simpleClient = PySimpleClient() + self.hwRef = simpleClient.getDynamicComponent(None,"IDL:alma/Antenna/SolarSystemBody:1.0","SolarSystemBodyImpl",None) + self.hwRef.setBodyName('Jupiter') + + + + def test_jupiter_distance(self): + distance=self.hwRef.getDistance(self.acstime.value) + time.sleep(1) + + print('distance',distance) + + + self.assertAlmostEqual(distance, 5.49776341649024, delta=5e-5) + + + + + +if __name__ == '__main__': + + unittest.main() + diff --git a/Common/Servers/SolarSystem/test/test_offset.py b/Common/Servers/SolarSystem/test/test_offset.py new file mode 100644 index 000000000..2815471c9 --- /dev/null +++ b/Common/Servers/SolarSystem/test/test_offset.py @@ -0,0 +1,54 @@ +import unittest +# Import command-line arguments +from sys import argv + +# Import the SimpleClient class +from Acspy.Clients.SimpleClient import PySimpleClient + +import Antenna +from math import radians,degrees,cos + +import Acspy.Common.TimeHelper +import time + + +class SetOffsetTest(unittest.TestCase): + def setUp(self): + epoch = Acspy.Common.TimeHelper.TimeUtil() + struct_time = time.strptime("2021-Apr-15 00:00", "%Y-%b-%d %H:%M") + tm=time.mktime(struct_time) + self.acstime=epoch.py2epoch(tm) + print(tm) + simpleClient = PySimpleClient() + self.hwRef = simpleClient.getDynamicComponent(None,"IDL:alma/Antenna/SolarSystemBody:1.0","SolarSystemBodyImpl",None) + self.hwRef.setBodyName('Jupiter') + + + + + def test_equatorialOffset(self): + ra_ref=radians(328.315829715) + dec_ref=radians(-13.564437853) + ra_offs=radians(1) + dec_offs=radians(1) + + self.hwRef.setOffsets(ra_offs,dec_offs,Antenna.ANT_EQUATORIAL) + _,_,ra,dec,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + self.assertAlmostEqual(degrees(ra), degrees(ra_ref+ra_offs/cos(dec_ref+dec_offs)) , delta=1e-4) + self.assertAlmostEqual(degrees(dec), degrees(dec_ref+dec_offs) , delta=1e-4) + def test_horizontalOffset(self): + az_ref=radians(84.320777342) + el_ref=radians(-28.325680692 ) + az_offs=radians(1) + el_offs=radians(1) + self.hwRef.setOffsets(az_offs,el_offs,Antenna.ANT_HORIZONTAL) + az,el,_,_,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + self.assertAlmostEqual(degrees(az),degrees( az_ref+az_offs/cos(el_ref+el_offs)) , delta=5e-4) + self.assertAlmostEqual(degrees(el), degrees( el_ref+el_offs) , delta=5e-4) + + + +if __name__ == '__main__': + + unittest.main() + diff --git a/Common/Servers/SolarSystem/test/test_sun.py b/Common/Servers/SolarSystem/test/test_sun.py new file mode 100644 index 000000000..abb7c833f --- /dev/null +++ b/Common/Servers/SolarSystem/test/test_sun.py @@ -0,0 +1,55 @@ +import unittest +# Import command-line arguments +from sys import argv + +# Import the SimpleClient class +from Acspy.Clients.SimpleClient import PySimpleClient + +import Antenna +from math import radians,degrees + +import Acspy.Common.TimeHelper +import time + + + +class SunPositionTest(unittest.TestCase): + def setUp(self): + epoch = Acspy.Common.TimeHelper.TimeUtil() + struct_time = time.strptime("2022-Jan-27 13:30", "%Y-%b-%d %H:%M") + tm=time.mktime(struct_time) + self.acstime=epoch.py2epoch(tm) + print(tm) + simpleClient = PySimpleClient() + self.hwRef = simpleClient.getDynamicComponent(None,"IDL:alma/Antenna/SolarSystemBody:1.0","SolarSystemBodyImpl",None) + self.hwRef.setBodyName('Sun') + + + + def test_equatorialJ2000(self): + ra,dec=self.hwRef.getJ2000EquatorialCoordinate(self.acstime.value) + time.sleep(1) + print(ra,dec) + + + self.assertAlmostEqual(degrees(ra), 309.681353589, delta=1e-4) + self.assertAlmostEqual(degrees(dec), -18.451737235, delta=1e-4) + + def test_equatorialApparent(self): + + az,el,ra,dec,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + print('type az',type(az)) + self.assertAlmostEqual(degrees(ra),309.986231168 , delta=1e-4) + self.assertAlmostEqual(degrees(dec),-18.376456126 , delta=1e-4) +# def test_horizontalApparent(self): +# az,el,ra,dec,l,lon,lat =self.hwRef.getAllCoordinates(self.acstime.value) + print ('az,el=',degrees(az),degrees(el)) + self.assertAlmostEqual(degrees(az), 210.403368369 , delta=5e-4) + self.assertAlmostEqual(degrees(el), 26.276295555 , delta=5e-4) + + + +if __name__ == '__main__': + + unittest.main() + diff --git a/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index ea6e644ba..1ff19de19 100644 --- a/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/SRT/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -18,4 +18,9 @@ Type="IDL:alma/Antenna/Moon:1.0" Container="AntennaContainer" ImplLang="cpp"/> + diff --git a/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml b/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml index b6cba5510..d1c9a8313 100644 --- a/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml +++ b/SRT/CDB/MACI/Containers/AntennaBossContainer/AntennaBossContainer.xml @@ -10,7 +10,7 @@ UseIFR="true" ManagerRetry="10" ImplLang="cpp" - Recovery="false"> + Recovery="true"> @@ -18,8 +18,8 @@ + Sidereal="IDL:alma/Antenna/SkySource:1.0" + Sun="IDL:alma/Antenna/SolarSystemBody:1.0" + Moon="IDL:alma/Antenna/Moon:1.0" + Satellite="" + SolarSystemBody="IDL:alma/Antenna/SolarSystemBody:1.0" + Otf="IDL:alma/Antenna/OTF:1.0"> diff --git a/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml b/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml index ea6e644ba..1ff19de19 100644 --- a/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml +++ b/SRT/Configuration/CDB/MACI/Components/ANTENNA/IncludeDynamic.xml @@ -18,4 +18,9 @@ Type="IDL:alma/Antenna/Moon:1.0" Container="AntennaContainer" ImplLang="cpp"/> + diff --git a/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml b/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml index 918f7dde4..44487b11d 100644 --- a/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/ANTENNA/Boss/Boss.xml @@ -22,10 +22,10 @@ PointingModelInstance="ANTENNA/PointingModel" RefractionInstance="ANTENNA/Refraction" Sidereal="IDL:alma/Antenna/SkySource:1.0" - Sun="" - Moon="IDL:alma/Antenna/Moon:1.0" - Satellite="" - SolarSystemBody="" + Sun="IDL:alma/Antenna/SolarSystemBody:1.0" + Moon="IDL:alma/Antenna/Moon:1.0" + Satellite="" + SolarSystemBody="IDL:alma/Antenna/SolarSystemBody:1.0" Otf="IDL:alma/Antenna/OTF:1.0"> diff --git a/SystemMake/Makefile b/SystemMake/Makefile index bede02f70..af500c4ad 100644 --- a/SystemMake/Makefile +++ b/SystemMake/Makefile @@ -30,9 +30,9 @@ COMMON_INTERFACES:=CommonInterface ManagmentInterface AntennaInterface Receivers WeatherStationInterface ActiveSurfaceInterface \ XBackendInterface COMMON_LIBRARIES:=SlaLibrary IRALibrary DiscosVersion TextWindowLibrary ParserLibrary \ - XarcosLibrary ModbusChannel ComponentProxy DiscosLocals \ + XarcosLibrary ModbusChannel ComponentProxy DiscosLocals XEphemAstroLib \ DiscosBackendProtocol PyTestingLibrary \ -COMMON_SERVERS:=AntennaBoss Observatory OTF PointingModel Refraction SkySource \ +COMMON_SERVERS:=AntennaBoss Observatory OTF PointingModel Refraction SkySource SolarSystem \ Moon FitsWriter Scheduler ReceiversBoss ExternalClients \ CalibrationTool TotalPower CustomLogger \ PyDewarPositioner Sardara Skarab PyLocalOscillator MFKBandBaseReceiver PyCalmux \ -- GitLab From e221085b47e39ad801488dd5bc8ae10c131ee4ec Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 4 Mar 2025 13:59:20 +0100 Subject: [PATCH 139/150] Added changelog for Solar System bodies tracking --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fd35d937..c8e1ed874 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/ issue #619 - Active surface components are now capable of changing look-up tables on the fly via the `asSetLUT` command issue #806 Added support for the C-band receiver at the SRT project #2 - Completed integration of new SRT Minor Servos + issue #2 - Completed integration of solar system planets, sun and moon tracking. Other bodies will be added in the future. ## Fixed ## Changed -- GitLab From 2790826ce0c231ca9e096c34e43ab1b22fb2fa24 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Wed, 12 Mar 2025 12:49:23 +0000 Subject: [PATCH 140/150] fixs samplerate and frequency parameters into header fits file --- Common/Servers/Skarab/src/CommandLine.cpp | 24 +++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Common/Servers/Skarab/src/CommandLine.cpp b/Common/Servers/Skarab/src/CommandLine.cpp index 245f499bc..3569d1dbb 100644 --- a/Common/Servers/Skarab/src/CommandLine.cpp +++ b/Common/Servers/Skarab/src/CommandLine.cpp @@ -1108,6 +1108,18 @@ void CCommandLine::setEnabled(const ACS::longSeq& en) throw (BackendsErrors::Bac throw impl; } } + if ((m_recstr.Compare("CCB")==0) || (m_recstr.Compare("CCG")==0)) { + if (en[0] != 0) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setEnabled()"); + impl.setValueName("feed"); + throw impl; + } + if (en[1] != 0) { + _EXCPT(ComponentErrors::ValueOutofRangeExImpl,impl,"CCommandLine::setEnabled()"); + impl.setValueName("feed"); + throw impl; + } + } if (en[0] == en[1]) { // central feed m_inputsNumber = 2; if (m_stokes == false) @@ -1136,7 +1148,7 @@ void CCommandLine::setEnabled(const ACS::longSeq& en) throw (BackendsErrors::Bac Message reply = sendBackendCommand(request); if (reply.is_success_reply()) { // TBD - ACS_LOG(LM_FULL_INFO,"CCommandLine::setEnabled()",(LM_NOTICE,"NODDING enabled")); + ACS_LOG(LM_FULL_INFO,"CCommandLine::setEnabled()",(LM_NOTICE,"FEEDS enabled")); } } else { @@ -1427,7 +1439,7 @@ void CCommandLine::fillChannelHeader(Backends::TSectionHeader *chHr,const long& chHr[index].frequency=m_frequency[i]; chHr[index].attenuation[0]=m_attenuation[i]; chHr[index].attenuation[1]=m_attenuation[i]; - chHr[index].sampleRate=/*m_sampleRate[i];*/m_commonSampleRate; + chHr[index].sampleRate=m_sampleRate[i]; if (m_stokes==true) { chHr[index].inputs=2; chHr[index].feed=m_feedNumber[2*i]; @@ -1809,8 +1821,12 @@ bool CCommandLine::initializeConfiguration(const IRA::CString & config) throw (C m_commonSampleRate=DEFAULT_SAMPLE_RATE; m_calPeriod=DEFAULT_DIODE_SWITCH_PERIOD; for (i=0;i Date: Fri, 14 Mar 2025 09:58:01 +0100 Subject: [PATCH 141/150] Fix #902, added configuration for Noto (#903) * fix issue #902: fixed an issue, related to the porting to python 3 for the Noto LocalOscillator component * fix issue #902: changed totalpower, weather station configuration and IfDistributr python code (ported to python 3) * fix issue #902: small fix as requested in Pull Request review * fix issue #902: adjusted attenutaions in setup procedure for primary band recevier --------- Co-authored-by: Andrea Orlati --- .../RECEIVERS/NotoReceivers/NotoReceivers.xml | 3 ++- .../BACKENDS/TotalPower/TotalPower.xml | 1 + .../alma/BACKENDS/TotalPower/TotalPower.xml | 2 +- .../alma/DataBlock/TotalPower/TotalPower.xml | 2 +- .../StationProcedures/StationProcedures.xml | 12 ++++++------ .../WeatherStation/WeatherStation.xml | 2 +- .../Servers/NotoPyIfDistributor/src/_ifdist.py | 6 +++--- .../src/NotoLocalOscillatorImpl/CommandLine.py | 18 +++++++++++++----- .../NotoLocalOscillator.py | 10 +++------- 9 files changed, 31 insertions(+), 25 deletions(-) diff --git a/Noto/CDB/alma/RECEIVERS/NotoReceivers/NotoReceivers.xml b/Noto/CDB/alma/RECEIVERS/NotoReceivers/NotoReceivers.xml index f8b91490f..e18478c1b 100644 --- a/Noto/CDB/alma/RECEIVERS/NotoReceivers/NotoReceivers.xml +++ b/Noto/CDB/alma/RECEIVERS/NotoReceivers/NotoReceivers.xml @@ -2,6 +2,7 @@ diff --git a/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml b/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml index ba08992d6..36c714432 100644 --- a/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml +++ b/Noto/Configuration/CDB/MACI/Components/BACKENDS/TotalPower/TotalPower.xml @@ -12,6 +12,7 @@ Code="TotalPowerImpl" Type="IDL:alma/Backends/TotalPower:1.0" Container="TotalPowerContainer" + Default="true" KeepAliveTime="-1" ImplLang="cpp" /> diff --git a/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml b/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml index 05b5037dc..67ceeff70 100644 --- a/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml +++ b/Noto/Configuration/CDB/alma/BACKENDS/TotalPower/TotalPower.xml @@ -18,7 +18,7 @@ RepetitionCacheTime="2000000" RepetitionExpireTime="5000000" DataPort="9001" - DataIPAddress="192.167.187.40" + DataIPAddress="192.167.187.17" DataLatency="3000000" SenderSleepTime="300000" SenderResponseTime="1000000" diff --git a/Noto/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml b/Noto/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml index bb03202f4..d0c6a31ee 100644 --- a/Noto/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml +++ b/Noto/Configuration/CDB/alma/DataBlock/TotalPower/TotalPower.xml @@ -80,7 +80,7 @@ 2 FALSE GREGORIAN - 3 + 9 730 1 0 1 diff --git a/Noto/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml b/Noto/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml index 95447e60d..239e801a7 100644 --- a/Noto/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml +++ b/Noto/Configuration/CDB/alma/Procedures/StationProcedures/StationProcedures.xml @@ -88,7 +88,7 @@ ifdist=1,3,-1 ifdist=2,3,-1 ifdist=1,-1,10 - ifdist=2,-1,10 + ifdist=2,-1,11 @@ -121,8 +121,8 @@ calOff ifdist=1,2,-1 ifdist=2,2,-1 - ifdist=1,-1,44 - ifdist=2,-1,44 + ifdist=1,-1,22 + ifdist=2,-1,22 @@ -138,8 +138,8 @@ calOff ifdist=1,4,-1 ifdist=2,4,-1 - ifdist=1,-1,8 - ifdist=2,-1,8 + ifdist=1,-1,10 + ifdist=2,-1,10 @@ -155,7 +155,7 @@ calOff ifdist=1,5,-1 ifdist=2,3,-1 - ifdist=1,-1,8 + ifdist=1,-1,10 ifdist=2,-1,10 diff --git a/Noto/Configuration/CDB/alma/WEATHERSTATION/WeatherStation/WeatherStation.xml b/Noto/Configuration/CDB/alma/WEATHERSTATION/WeatherStation/WeatherStation.xml index 725206827..22b444117 100644 --- a/Noto/Configuration/CDB/alma/WEATHERSTATION/WeatherStation/WeatherStation.xml +++ b/Noto/Configuration/CDB/alma/WEATHERSTATION/WeatherStation/WeatherStation.xml @@ -6,7 +6,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - IPAddress="192.167.187.103" + IPAddress="192.167.187.244" port="22222" UpdatingThreadTime="10000000"> diff --git a/Noto/Servers/NotoPyIfDistributor/src/_ifdist.py b/Noto/Servers/NotoPyIfDistributor/src/_ifdist.py index 0cf6da920..72d40a4b2 100644 --- a/Noto/Servers/NotoPyIfDistributor/src/_ifdist.py +++ b/Noto/Servers/NotoPyIfDistributor/src/_ifdist.py @@ -31,12 +31,12 @@ def send_command(ip, port, command): s.connect((ip,int(port))) except socket.error: return "Fail" - s.sendall(command) + s.sendall(command.encode()) time.sleep(0.1) response=s.recv(1024) s.close() - response=response.strip().split('\n') - return response + res=response.decode().strip().split('\n') + return res def cdb(xmlstr): root=ET.fromstring(xmlstr) diff --git a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py index b9b658198..e534a5614 100644 --- a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py +++ b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/CommandLine.py @@ -32,7 +32,7 @@ class CommandLine: def initialize(self): #raises an error..... - self.create() + return self.create() def configure(self,ip,port): ''' @@ -42,7 +42,7 @@ class CommandLine: self.ip=ip self.port=port #raises an error..... - self.connect() + return self.connect() def create(self): try: @@ -63,10 +63,17 @@ class CommandLine: def connect(self): try: if self.connected==False: + #print ("PRovo la connessione") self.sock.connect((self.ip,self.port)) + #print ("Conessione ok") self.connected=True - self.sock.sendall('*CLS\n;SYST:ERR?\n++read\n') + cmd="*CLS\n;SYST:ERR?\n++read\n" + #print ("mando stringa di inizializzazione") + self.sock.sendall(cmd.encode()) + #print ("mandata") msg=self.sock.recv(1024) + #print ("ricevuta risposta :") + #print (msg) except socket.error as msg: self.close() return False @@ -169,7 +176,7 @@ class CommandLine: msg="" if self.check(): try: - self.sock.sendall(cmd) + self.sock.sendall(cmd.encode()) except socket.error as msg: self.close() return False,msg @@ -181,7 +188,8 @@ class CommandLine: msg="" if self.check(): try: - self.sock.sendall(cmd+'\n++read\n') + buff=cmd+'\n++read\n' + self.sock.sendall(cmd.encode()) except socket.error as msg: self.close() return False,msg diff --git a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/NotoLocalOscillator.py b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/NotoLocalOscillator.py index 1770e98cc..f2126f17b 100644 --- a/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/NotoLocalOscillator.py +++ b/Noto/Servers/NotoPyLocalOscillator/src/NotoLocalOscillatorImpl/NotoLocalOscillator.py @@ -99,16 +99,12 @@ class NotoLocalOscillator(Receivers__POA.LocalOscillator, CharacteristicComponen except Exception: exc=ComponentErrorsImpl.CDBAccessExImpl() raise exc - try: - self.cl.initialize() - except CommandLineError as ex: + if not self.cl.initialize(): exc=ComponentErrorsImpl.SocketErrorExImpl() exc.setData('Reason',ex.__str__) raise exc - try: - self.cl.configure(IP,PORT) - except CommandLineError as ex: - msg="cannot connect to synthesiser, IP %s, error message is %s" %(IP,ex.__str__) + if not self.cl.configure(IP,PORT): + msg="cannot connect to synthesiser, IP %s, PORT %s" %(IP,PORT) exc=ComponentErrorsImpl.SocketErrorExImpl() exc.setData('Reason',msg) raise exc -- GitLab From e95c40ea1f66db6d439ec614c5f0bbd46686b571 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 17 Mar 2025 14:44:14 +0000 Subject: [PATCH 142/150] Added new LUT file for SRT active surface --- SRT/CDB/alma/AS/LT_lut_20240917_2.txt | 1116 +++++++++++++++++ .../CDB/alma/AS/LT_lut_20240917_2.txt | 1116 +++++++++++++++++ 2 files changed, 2232 insertions(+) create mode 100644 SRT/CDB/alma/AS/LT_lut_20240917_2.txt create mode 100644 SRT/Configuration/CDB/alma/AS/LT_lut_20240917_2.txt diff --git a/SRT/CDB/alma/AS/LT_lut_20240917_2.txt b/SRT/CDB/alma/AS/LT_lut_20240917_2.txt new file mode 100644 index 000000000..0096d74d6 --- /dev/null +++ b/SRT/CDB/alma/AS/LT_lut_20240917_2.txt @@ -0,0 +1,1116 @@ +2.136 1.633 -0.073 -0.996 -1.839 -2.895 -13.865 +4.214 3.170 0.400 -1.968 -3.217 -2.809 -13.865 +2.304 1.589 0.126 -1.226 -1.788 -2.646 -13.865 +2.336 1.895 0.157 -0.961 -1.018 -2.205 -13.865 +1.523 1.443 -0.112 -1.064 -0.742 -1.785 -13.865 +1.223 1.058 -0.153 -0.723 -0.943 -1.169 -13.865 +0.966 0.564 -0.244 -0.668 -1.075 -0.508 -13.865 +1.139 0.467 0.002 -0.166 -1.125 0.416 -13.865 +0.531 -0.388 0.010 -0.735 -0.671 0.733 -13.865 +0.684 -0.325 -0.001 -0.329 0.356 1.191 -13.865 +0.493 -0.331 0.034 -0.284 0.933 1.464 -13.865 +0.651 -0.281 0.134 -0.200 1.153 1.633 -13.865 +0.813 0.069 0.234 -0.059 0.961 1.589 -13.865 +0.640 -0.191 0.050 -0.219 0.685 1.305 -13.865 +0.768 0.085 0.129 -0.527 0.474 1.202 -13.865 +0.868 -0.029 0.191 -0.469 0.335 2.903 -13.865 +1.064 0.336 0.118 -0.370 -0.166 0.704 -13.865 +1.243 0.361 0.051 -0.721 -0.420 -0.243 -13.865 +1.696 0.589 0.167 -0.559 -0.737 -0.581 -13.865 +2.120 1.347 0.448 -0.411 -0.961 -1.322 -13.865 +2.229 1.237 0.287 -0.693 -1.085 -1.542 -13.865 +2.136 1.730 0.330 -0.835 -1.386 -2.381 -13.865 +1.875 1.615 -0.086 -1.383 -2.024 -2.879 -13.865 +2.319 1.920 0.193 -1.022 -1.896 -2.832 -13.865 +2.561 3.262 0.185 -1.470 -2.385 -3.886 -5.247 +4.737 4.860 0.575 -2.711 -5.013 -3.569 -5.247 +2.276 2.406 0.092 -1.030 -2.390 -3.140 -5.247 +2.296 1.946 0.329 -1.111 -1.636 -2.675 -5.247 +2.040 1.723 0.040 -0.773 -1.211 -2.286 -5.247 +1.792 1.128 -0.012 -0.809 -0.968 -1.535 -5.247 +1.303 0.745 0.106 -0.253 -0.395 -0.471 -5.247 +0.623 0.097 0.034 -0.770 -0.055 0.350 -5.247 +1.106 0.480 0.210 0.012 0.999 1.203 -5.247 +0.860 0.032 0.554 -0.067 1.902 1.928 -5.247 +1.101 -0.338 0.466 0.439 1.571 2.527 -5.247 +0.872 -0.324 0.469 0.569 1.267 2.701 -5.247 +0.724 -0.551 0.390 0.116 1.521 2.697 -5.247 +0.463 -0.946 0.104 -0.009 1.182 2.006 -5.247 +0.852 -0.609 0.209 0.069 0.928 2.075 -5.247 +0.581 0.120 0.105 -0.181 0.639 1.175 -5.247 +0.363 -0.302 0.233 -0.257 0.185 1.493 -5.247 +1.648 0.538 0.327 -0.126 -0.299 -0.050 -5.247 +2.082 0.876 -0.053 -0.815 -0.936 -1.445 -5.247 +2.915 0.322 0.297 -0.780 -1.220 0.189 -5.247 +2.305 1.616 0.187 -1.449 -2.142 -2.685 -5.247 +2.486 1.950 0.121 -0.975 -1.863 -3.294 -5.247 +2.833 2.429 0.331 -1.320 -2.130 -2.499 -5.247 +2.711 2.444 0.134 -1.387 -2.379 -3.930 -5.247 +2.624 3.215 0.327 -1.450 -2.252 -4.120 0.619 +3.062 3.404 0.217 -1.461 -2.640 -4.253 0.619 +3.532 3.872 0.468 -1.386 -2.586 -4.062 0.619 +6.036 6.138 0.430 -3.589 -5.988 -4.577 0.619 +3.376 3.813 0.460 -1.225 -2.499 -3.704 0.619 +2.645 2.648 0.166 -1.398 -2.422 -3.515 0.619 +2.654 2.984 0.443 -1.143 -1.501 -3.034 0.619 +2.571 2.613 0.066 -1.213 -1.137 -3.040 0.619 +2.464 2.562 0.384 -0.886 -1.399 -2.603 0.619 +3.629 2.934 0.983 -0.354 -0.983 -2.186 0.619 +2.462 2.019 0.551 -0.683 -0.788 -2.538 0.619 +1.896 1.504 0.190 -0.583 -0.779 -1.385 0.619 +1.715 1.467 0.488 -0.331 -0.137 -0.561 0.619 +1.126 0.735 0.032 -0.587 -0.216 -0.420 0.619 +1.339 0.807 0.256 -0.359 0.331 0.497 0.619 +1.235 0.491 0.376 0.195 0.847 1.300 0.619 +1.256 0.501 0.590 0.308 1.002 1.590 0.619 +1.083 0.448 0.430 0.263 1.257 1.387 0.619 +1.046 0.239 0.535 0.656 1.549 2.352 0.619 +0.801 -0.389 0.320 0.400 1.438 2.412 0.619 +0.791 -0.284 0.530 0.361 1.679 2.862 0.619 +0.713 -0.536 0.438 0.471 1.764 2.818 0.619 +0.976 -0.681 0.577 0.591 2.087 3.439 0.619 +0.602 -1.206 0.311 0.449 1.829 2.942 0.619 +0.746 -1.098 0.615 0.598 2.044 3.367 0.619 +0.229 -1.414 0.012 0.145 2.102 2.963 0.619 +0.425 -1.158 0.367 0.374 1.811 3.322 0.619 +0.993 -0.610 0.467 0.705 2.383 3.811 0.619 +1.169 -0.507 1.067 1.065 2.152 3.552 0.619 +0.322 -1.122 0.090 0.229 1.561 2.355 0.619 +0.439 -1.441 -0.129 -0.106 0.875 1.680 0.619 +0.450 -1.076 -0.096 -0.465 -0.963 1.690 0.619 +0.239 -0.950 -0.044 -0.184 0.324 2.511 0.619 +0.992 -0.041 0.380 0.049 0.656 0.184 0.619 +1.212 0.288 0.405 0.090 0.427 -0.043 0.619 +1.319 0.512 0.260 0.130 -0.132 0.123 0.619 +1.695 0.786 0.666 -0.113 -0.087 -0.316 0.619 +2.121 0.962 0.495 -0.161 -0.708 -0.689 0.619 +1.959 1.435 0.470 -0.475 -0.764 -1.595 0.619 +2.452 1.663 0.500 -0.934 -1.457 -2.708 0.619 +2.693 1.958 0.674 -0.514 -1.074 -2.221 0.619 +2.699 1.906 0.219 -1.428 -1.983 -2.325 0.619 +3.013 2.805 0.666 -0.688 -1.539 -2.565 0.619 +2.663 3.045 0.382 -1.139 -2.065 -3.269 0.619 +2.654 2.553 0.201 -1.405 -2.396 -3.873 0.619 +3.038 2.808 0.267 -1.666 -2.873 -4.313 0.619 +2.920 3.009 0.216 -1.577 -2.208 -4.394 0.619 +2.977 2.907 0.053 -1.878 -2.867 -4.474 0.619 +3.293 3.478 0.192 -1.869 -3.211 -5.034 5.121 +3.702 3.828 0.399 -1.588 -2.819 -4.915 5.121 +3.594 3.854 0.295 -1.625 -3.226 -4.718 5.121 +7.164 7.496 0.792 -3.552 -5.610 -4.981 5.121 +3.153 3.497 0.212 -1.612 -2.953 -4.574 5.121 +3.419 4.268 0.270 -1.275 -2.383 -3.972 5.121 +3.475 3.341 0.308 -1.340 -2.155 -3.640 5.121 +2.292 2.795 0.121 -1.585 -2.197 -3.981 5.121 +3.089 3.105 0.706 -0.770 -1.521 -2.943 5.121 +2.680 2.510 0.464 -1.012 -1.677 -2.890 5.121 +0.604 1.969 0.047 -0.939 -1.511 -2.268 5.121 +1.886 1.325 -0.157 -0.980 -1.165 -1.552 5.121 +1.130 1.622 0.071 -0.636 -0.655 -0.690 5.121 +1.285 0.889 0.187 -0.230 0.265 0.772 5.121 +1.142 0.585 0.217 0.034 0.393 0.749 5.121 +0.769 0.416 0.208 0.107 0.828 1.594 5.121 +1.016 0.115 0.539 0.453 1.468 2.122 5.121 +1.066 -0.006 0.690 0.718 1.721 2.770 5.121 +0.805 -0.763 0.592 0.405 1.688 2.700 5.121 +0.692 0.350 0.519 0.630 1.879 3.371 5.121 +0.953 -0.899 0.374 0.575 1.964 3.371 5.121 +0.411 -0.464 0.651 0.798 2.365 4.217 5.121 +0.339 -1.296 0.411 1.194 2.365 3.904 5.121 +0.680 -1.341 0.684 0.597 2.641 4.122 5.121 +0.574 -1.466 0.358 0.535 2.267 4.032 5.121 +0.281 -1.746 0.348 0.676 2.319 3.861 5.121 +0.437 -1.479 0.445 0.763 2.418 3.758 5.121 +0.624 -1.226 0.792 0.965 2.528 3.892 5.121 +0.166 -1.782 0.065 0.625 1.916 3.549 5.121 +0.154 -2.303 -0.156 0.002 1.280 2.748 5.121 +0.739 -1.045 0.184 0.601 1.053 2.828 5.121 +0.390 -1.423 0.266 0.562 1.245 2.236 5.121 +0.174 -1.590 -0.188 -0.398 0.484 1.076 5.121 +-0.027 -0.812 -0.085 0.280 0.487 1.091 5.121 +0.492 -0.683 -0.103 -0.438 -0.006 0.431 5.121 +1.091 -0.015 0.305 -0.199 0.114 0.114 5.121 +1.294 0.453 0.333 -0.246 -1.642 -0.366 5.121 +1.461 0.639 0.141 -0.711 -1.311 -1.490 5.121 +2.055 0.880 0.283 -0.836 -1.197 -2.051 5.121 +2.497 1.642 0.441 -0.721 -1.199 -2.430 5.121 +2.297 1.756 0.215 -1.279 -1.417 -3.038 5.121 +3.128 3.190 0.801 -0.776 -1.493 -2.911 5.121 +2.827 2.605 0.389 -1.353 -2.271 -3.507 5.121 +3.046 3.067 0.138 -1.585 -3.625 -4.046 5.121 +3.841 3.316 0.509 -1.438 -2.724 -4.148 5.121 +3.442 3.427 0.350 -1.711 -3.133 -4.971 5.121 +3.179 3.201 0.065 -2.098 -3.452 -5.246 5.121 +3.424 3.572 0.254 -1.528 -3.121 -4.992 5.121 +3.682 4.102 0.635 -1.427 -2.878 -4.953 7.938 +3.532 4.031 0.321 -1.734 -3.383 -5.165 7.938 +3.541 3.859 0.063 -2.109 -3.816 -5.492 7.938 +7.140 7.688 0.361 -3.426 -7.138 -5.577 7.938 +3.029 3.555 -0.123 -1.913 -3.865 -5.170 7.938 +2.792 3.425 0.035 -1.689 -2.871 -4.383 7.938 +2.499 2.783 0.167 -1.386 -2.374 -3.433 7.938 +2.032 2.567 -0.155 -1.588 -2.456 -3.468 7.938 +2.253 2.742 0.077 -1.141 -2.133 -3.081 7.938 +1.760 2.373 -0.112 -1.232 -2.281 -3.203 7.938 +2.132 1.845 -0.180 -1.411 -1.820 -2.568 7.938 +1.333 1.674 0.082 -0.714 -0.990 -1.046 7.938 +1.034 0.767 -0.019 -0.847 0.317 -0.461 7.938 +0.627 0.598 0.009 -0.354 0.039 0.164 7.938 +0.565 0.327 0.091 -0.196 0.422 0.566 7.938 +0.610 -0.187 0.062 -0.129 0.694 1.047 7.938 +0.651 0.016 0.221 0.188 1.044 1.467 7.938 +0.086 -0.867 0.022 -0.081 0.838 1.469 7.938 +0.618 -0.400 0.445 0.770 1.660 2.429 7.938 +0.324 -1.327 0.335 0.547 1.726 3.198 7.938 +0.725 -0.610 0.716 0.506 2.209 3.974 7.938 +1.453 -0.262 0.450 0.848 2.473 4.207 7.938 +0.307 -1.289 0.542 0.557 2.310 4.166 7.938 +0.229 -1.552 0.567 0.748 2.396 4.239 7.938 +0.568 -1.668 0.286 0.636 2.330 4.122 7.938 +0.294 -1.747 0.632 0.670 2.100 3.655 7.938 +0.056 -1.941 0.294 0.515 1.781 3.248 7.938 +-0.055 -2.066 -0.143 0.370 1.564 2.845 7.938 +0.185 -1.803 0.466 0.650 2.097 3.194 7.938 +-0.072 -1.663 -0.108 0.698 1.431 2.763 7.938 +-0.130 -1.987 -0.200 0.210 0.874 1.279 7.938 +0.019 -1.802 -0.089 -0.817 0.943 1.773 7.938 +-0.067 -1.329 -0.071 0.387 0.726 1.279 7.938 +0.182 -1.451 -0.202 -0.649 0.577 1.088 7.938 +0.506 -0.786 -0.028 -0.088 0.349 0.551 7.938 +-0.222 -0.527 0.075 -0.169 0.038 0.108 7.938 +1.318 0.284 0.209 -0.296 -0.370 -0.070 7.938 +1.417 0.604 0.133 -0.592 -0.993 -1.448 7.938 +2.240 1.467 0.614 -0.488 -1.191 -2.174 7.938 +2.316 1.598 0.262 -0.921 -1.793 -2.690 7.938 +1.973 1.670 0.308 -1.149 -1.876 -2.742 7.938 +2.319 2.154 0.321 -1.088 -1.873 -2.998 7.938 +2.431 2.325 -0.218 -1.305 -2.526 -3.223 7.938 +2.529 2.346 -0.136 -1.767 -3.096 -4.350 7.938 +3.489 3.462 0.476 -1.440 -3.014 -4.427 7.938 +3.547 3.445 0.170 -2.033 -3.603 -5.339 7.938 +3.459 3.501 0.082 -1.952 -3.354 -5.629 7.938 +3.342 4.140 0.328 -1.701 -3.255 -5.208 7.938 +3.327 3.828 0.291 -2.086 -3.446 -4.991 9.587 +3.118 3.659 0.033 -1.926 -3.573 -5.357 9.587 +3.488 4.188 0.317 -1.415 -2.955 -5.112 9.587 +5.831 6.749 -0.001 -4.096 -6.860 -5.288 9.587 +2.344 3.228 -0.086 -1.530 -2.814 -4.600 9.587 +2.447 3.171 0.168 -1.082 -2.307 -3.450 9.587 +2.059 3.027 0.131 -0.993 -1.776 -3.065 9.587 +1.848 2.911 0.136 -1.100 -1.809 -2.681 9.587 +1.882 2.540 0.105 -0.786 -1.527 -2.654 9.587 +1.619 2.115 -0.064 -1.116 -1.614 -2.794 9.587 +0.973 1.521 -0.123 -0.879 -1.027 -2.141 9.587 +1.045 1.449 0.157 -0.474 -0.481 -1.062 9.587 +0.648 0.780 -0.114 -0.523 -0.562 -0.635 9.587 +0.268 0.322 -0.036 -0.672 0.037 -0.435 9.587 +0.480 0.280 0.022 -0.703 0.413 0.465 9.587 +0.629 0.017 0.302 0.364 0.974 1.335 9.587 +0.145 -0.384 0.105 -0.036 1.149 1.339 9.587 +0.422 0.168 0.428 0.674 1.644 2.200 9.587 +0.155 -0.980 0.263 0.087 1.484 2.197 9.587 +0.635 -0.491 0.816 0.672 2.168 3.596 9.587 +0.867 -0.978 0.634 0.684 2.123 3.968 9.587 +0.542 -1.211 0.659 0.313 2.310 3.935 9.587 +0.227 -1.731 0.341 0.694 2.408 4.038 9.587 +0.459 -1.749 0.578 0.571 2.474 4.499 9.587 +0.615 -1.343 0.815 1.214 2.967 3.818 9.587 +0.346 -1.796 0.103 0.739 2.126 3.430 9.587 +-0.072 -2.109 0.150 0.334 1.643 2.852 9.587 +-0.282 -2.231 0.044 0.237 1.201 2.535 9.587 +-0.335 -2.314 -0.471 0.039 0.998 2.140 9.587 +-0.152 -1.894 0.153 0.837 1.690 2.392 9.587 +-0.425 -2.435 -0.558 -0.439 0.591 1.779 9.587 +-0.363 -2.102 -0.466 -0.173 0.482 1.500 9.587 +-0.379 -1.868 -0.489 -0.363 0.509 1.030 9.587 +-0.642 -1.308 -0.254 -0.188 0.355 0.185 9.587 +0.327 -0.787 0.312 0.176 0.877 0.204 9.587 +0.549 -0.335 0.189 0.015 0.171 0.220 9.587 +0.810 0.003 0.185 0.019 -0.278 -0.595 9.587 +1.073 0.295 0.248 -0.355 -0.744 -1.031 9.587 +1.772 1.109 0.480 -0.206 -0.733 -1.248 9.587 +1.757 1.312 0.311 -0.606 -1.473 -2.147 9.587 +2.199 1.952 0.608 -0.347 -1.258 -1.822 9.587 +1.927 2.275 0.358 -0.609 -1.468 -2.269 9.587 +2.108 2.281 0.431 -0.759 -1.792 -2.615 9.587 +2.367 2.456 0.128 -0.851 -2.398 -3.423 9.587 +2.757 2.922 0.398 -1.243 -2.563 -3.898 9.587 +3.229 3.327 0.210 -1.420 -3.162 -4.777 9.587 +3.267 3.686 0.380 -1.748 -3.264 -4.893 9.587 +3.217 3.733 0.209 -1.775 -3.187 -5.109 9.587 +3.216 3.682 0.184 -1.577 -3.080 -4.889 10.270 +2.776 3.409 -0.027 -1.872 -3.336 -4.816 10.270 +3.079 3.761 0.208 -1.550 -3.054 -4.694 10.270 +3.304 3.883 -0.025 -1.343 -3.297 -5.098 10.270 +5.139 6.228 -0.039 -4.149 -6.885 -4.898 10.270 +3.888 5.014 0.239 -2.037 -3.174 -4.754 10.270 +5.615 7.063 0.202 -3.102 -5.670 -4.366 10.270 +2.225 3.529 -0.419 -2.145 -3.545 -4.784 10.270 +1.801 3.120 -0.234 -1.431 -2.477 -3.889 10.270 +1.782 2.800 -0.140 -1.119 -2.155 -3.750 10.270 +1.729 2.673 -0.065 -0.912 -1.934 -3.244 10.270 +1.554 2.650 0.078 -0.742 -1.384 -3.468 10.270 +1.325 2.547 0.020 -0.624 -1.513 -2.261 10.270 +1.090 2.341 -0.483 -0.957 -1.786 -2.556 10.270 +1.284 2.152 0.011 -0.712 -0.604 -2.028 10.270 +0.767 1.633 -0.561 -1.196 -1.674 -3.123 10.270 +1.683 1.993 -0.143 -0.871 -1.263 -2.294 10.270 +2.006 3.143 0.474 -0.393 -0.846 -1.472 10.270 +1.128 1.904 -0.055 -0.757 -1.200 -2.258 10.270 +1.529 1.328 -0.363 -0.978 -1.357 -1.996 10.270 +0.893 1.524 -0.207 -0.470 -1.034 -1.865 10.270 +0.790 2.278 -0.049 -0.627 -0.626 -1.657 10.270 +0.839 1.214 0.005 -0.394 -0.541 -1.174 10.270 +0.712 0.911 0.045 0.690 -0.418 -0.507 10.270 +0.463 0.041 0.072 -0.162 -0.301 -0.281 10.270 +0.474 0.944 0.103 -0.056 -0.127 -0.048 10.270 +0.729 0.885 0.150 0.040 0.336 0.475 10.270 +0.898 1.225 0.260 1.076 0.378 0.867 10.270 +0.762 0.548 0.248 0.017 0.672 0.378 10.270 +0.544 0.204 0.265 0.215 0.649 2.746 10.270 +-0.231 -0.565 -0.138 -0.312 0.823 0.456 10.270 +-0.367 -0.724 -0.174 0.081 0.557 1.403 10.270 +0.113 -0.038 0.090 0.166 0.640 1.019 10.270 +-0.158 -0.551 0.156 0.036 1.427 1.071 10.270 +-0.289 -0.891 0.012 0.152 0.998 1.489 10.270 +0.115 -0.528 0.403 0.765 1.428 1.790 10.270 +0.294 -0.089 0.343 0.436 2.113 0.628 10.270 +0.068 -0.918 0.276 0.396 1.718 2.135 10.270 +0.057 -0.744 0.268 0.336 1.484 2.391 10.270 +-0.123 -1.266 0.105 0.040 1.255 2.876 10.270 +0.529 -0.890 0.689 1.051 2.143 3.745 10.270 +0.532 -0.955 0.705 0.995 2.286 3.747 10.270 +0.138 -1.512 0.452 0.610 2.085 3.447 10.270 +0.449 -1.114 0.448 0.774 2.357 3.613 10.270 +0.383 -1.022 0.591 1.036 2.677 4.044 10.270 +0.430 -1.626 0.317 0.399 2.138 3.383 10.270 +0.467 -1.302 0.750 0.882 2.845 4.448 10.270 +0.868 -1.129 0.588 0.744 2.687 4.195 10.270 +0.755 -1.511 0.719 1.048 2.504 3.963 10.270 +0.512 -1.799 0.664 0.736 2.306 3.350 10.270 +0.349 -1.525 0.450 0.805 2.414 3.003 10.270 +0.283 -1.581 0.274 0.774 2.208 2.842 10.270 +-0.021 -2.047 -0.140 0.356 1.512 2.592 10.270 +-0.291 -2.374 -0.297 0.072 1.191 2.196 10.270 +-0.544 -2.489 -0.226 0.059 1.096 1.914 10.270 +-0.614 -2.345 -0.231 0.128 0.995 1.871 10.270 +-0.638 -2.642 -0.470 -0.142 0.595 1.566 10.270 +-0.796 -2.700 -0.671 -0.116 0.896 1.368 10.270 +-0.887 -2.740 -0.669 -0.370 0.519 1.735 10.270 +-1.207 -2.991 -0.832 -0.374 0.471 0.999 10.270 +-0.399 -2.485 -0.784 -0.155 0.425 1.947 10.270 +-0.858 -2.408 -0.537 -0.057 0.343 0.862 10.270 +-0.865 -2.464 -0.631 -0.389 0.159 0.689 10.270 +-1.010 -2.225 -0.580 -0.315 0.139 0.535 10.270 +-0.648 -1.363 -0.188 0.196 0.623 -0.489 10.270 +-0.746 -2.289 -0.431 -0.239 0.059 0.819 10.270 +-0.379 -1.666 -0.346 -0.093 0.362 0.589 10.270 +-0.215 -1.445 -0.189 -0.083 0.071 0.543 10.270 +-0.040 -0.858 0.017 0.123 0.311 0.338 10.270 +-0.019 -0.816 0.063 0.023 0.102 0.125 10.270 +-0.006 -1.000 -0.238 -0.362 -0.249 -0.105 10.270 +2.243 0.932 2.389 1.334 1.440 0.739 10.270 +0.190 -0.329 -0.213 -0.175 -0.565 -0.273 10.270 +0.806 0.249 0.411 0.076 -0.116 -0.296 10.270 +0.398 0.280 -0.159 -0.433 -0.877 -1.224 10.270 +0.677 0.266 -0.128 -0.521 -0.946 -1.111 10.270 +1.152 0.872 0.443 -0.106 -0.575 -0.972 10.270 +1.382 0.992 0.173 -0.410 -0.872 -1.285 10.270 +1.344 1.255 0.332 -0.229 -0.860 -1.266 10.270 +1.536 1.401 0.228 -1.060 -1.046 -1.496 10.270 +1.176 1.011 0.068 -0.544 -1.240 -1.612 10.270 +0.836 0.893 -0.264 -1.279 -1.036 -2.038 10.270 +1.348 1.533 0.319 -0.491 -1.069 -1.589 10.270 +1.633 1.930 0.573 -0.605 -0.301 -1.573 10.270 +1.448 2.237 0.348 -0.117 -1.194 -1.755 10.270 +1.991 2.500 0.621 -0.193 -0.940 -2.276 10.270 +1.763 2.112 0.192 -0.626 -1.814 -2.548 10.270 +2.259 2.752 0.430 -0.757 -1.547 -2.645 10.270 +2.115 2.839 0.285 -1.047 -1.968 -3.205 10.270 +2.142 2.535 -0.132 -1.680 -2.935 -4.123 10.270 +2.431 2.831 0.105 -1.661 -2.270 -4.390 10.270 +2.833 3.015 0.004 -1.921 -3.363 -4.754 10.270 +2.967 3.208 0.146 -1.577 -3.092 -4.974 10.270 +2.895 3.371 0.057 -1.854 -3.015 -4.860 10.270 +2.958 3.421 0.145 -1.514 -3.161 -4.810 10.270 +3.245 3.746 0.179 -1.075 -3.188 -5.118 10.270 +3.134 3.412 0.189 -1.931 -3.030 -4.494 10.174 +3.016 2.821 -0.226 -1.825 -3.357 -4.659 10.174 +2.825 3.152 0.063 -1.560 -2.940 -4.980 10.174 +2.751 3.150 -0.113 -1.821 -3.125 -4.450 10.174 +4.675 5.500 -0.265 -4.139 -6.595 -4.659 10.174 +1.984 2.694 -0.419 -1.995 -3.473 -4.383 10.174 +4.147 6.142 -0.127 -2.952 -5.360 -3.779 10.174 +1.881 2.561 -0.150 -1.303 -2.320 -3.473 10.174 +1.616 2.404 -0.223 -1.134 -1.586 -3.028 10.174 +0.945 2.282 -0.362 -0.970 -1.703 -2.636 10.174 +0.972 2.091 -0.016 -0.384 -1.013 -1.988 10.174 +0.825 2.222 0.209 -0.147 -0.437 -1.003 10.174 +0.196 1.554 -0.412 -1.247 -0.884 -1.566 10.174 +0.961 1.851 0.159 -0.091 -0.134 -0.645 10.174 +0.578 1.816 -0.057 0.292 -0.414 -0.895 10.174 +0.487 0.826 -0.280 -0.715 -0.536 -1.424 10.174 +0.165 0.995 -0.784 -1.153 -1.199 -1.602 10.174 +0.667 1.408 -0.251 0.014 -0.835 -1.423 10.174 +0.783 1.541 -0.069 -0.332 -0.813 -1.291 10.174 +0.834 1.272 0.025 -0.242 -0.761 -0.890 10.174 +0.598 1.355 0.037 -0.006 -0.252 -0.578 10.174 +0.024 0.852 -0.090 -0.160 -0.490 -0.477 10.174 +0.399 1.270 0.034 -0.303 -0.098 -0.550 10.174 +0.197 0.575 -0.123 -0.060 -0.207 -0.445 10.174 +0.763 0.714 -0.039 0.588 -0.160 -0.652 10.174 +-0.170 0.920 -0.225 -0.083 0.110 -0.001 10.174 +-0.021 0.512 -0.167 -0.012 0.261 1.923 10.174 +0.290 0.441 0.102 0.259 0.701 0.193 10.174 +-0.075 0.125 -0.012 0.494 0.537 0.435 10.174 +-0.086 0.302 0.249 -0.067 1.019 0.486 10.174 +-0.433 -0.456 0.049 0.111 0.487 0.875 10.174 +0.229 -0.241 0.020 0.037 0.937 0.854 10.174 +-0.414 -0.598 0.175 0.273 0.767 1.014 10.174 +0.283 0.084 0.466 1.020 1.328 1.232 10.174 +-0.471 -0.849 0.309 0.686 1.265 0.860 10.174 +-0.008 -0.656 0.292 0.857 1.324 1.288 10.174 +-0.445 -1.163 -0.056 0.129 0.704 1.179 10.174 +0.147 -0.933 0.064 0.228 1.249 1.577 10.174 +-0.365 -1.017 0.190 0.260 1.216 1.690 10.174 +0.878 -0.401 0.632 0.906 1.599 2.653 10.174 +0.328 -1.096 0.424 0.235 1.507 3.948 10.174 +0.067 -1.083 0.401 0.759 1.925 4.025 10.174 +0.120 -0.811 0.402 1.201 2.274 3.617 10.174 +-0.064 -1.600 0.168 0.540 2.054 3.330 10.174 +0.871 -1.116 0.608 0.759 2.708 3.258 10.174 +0.271 -1.408 0.486 0.760 2.707 3.903 10.174 +0.250 -1.808 0.199 0.385 1.955 1.963 10.174 +0.398 -1.846 0.652 0.981 2.448 3.932 10.174 +0.387 -1.592 0.457 0.379 2.347 3.911 10.174 +0.468 -1.450 0.321 0.481 2.182 3.742 10.174 +0.307 -1.746 0.357 0.774 1.984 3.374 10.174 +-0.080 -1.993 0.274 0.254 1.730 2.657 10.174 +-0.034 -1.698 0.056 0.450 1.811 2.273 10.174 +-0.071 -1.918 -0.093 0.272 1.335 2.037 10.174 +-0.510 -2.442 -0.380 -0.053 0.846 1.659 10.174 +-0.851 -2.836 -0.652 -0.343 0.564 1.120 10.174 +-1.036 -2.701 -0.575 -0.107 0.593 1.125 10.174 +-1.067 -2.691 -0.863 -0.526 0.193 0.928 10.174 +-1.238 -3.048 -0.480 -0.227 0.702 0.972 10.174 +-1.115 -2.530 -0.724 -0.515 0.119 1.195 10.174 +-1.160 -2.581 -0.795 -0.247 -0.048 0.208 10.174 +-1.474 -2.751 -0.988 -0.773 -0.210 0.815 10.174 +-1.469 -2.449 -0.958 -0.275 -0.125 0.159 10.174 +-1.172 -3.167 -0.693 0.191 0.210 0.149 10.174 +-1.026 -2.006 -0.667 -0.298 0.050 0.182 10.174 +-1.069 -1.828 -0.372 -0.522 -0.179 0.581 10.174 +-1.110 -2.775 -0.605 -0.286 -0.592 0.613 10.174 +-1.210 -1.747 -0.510 -0.318 -0.270 0.027 10.174 +-0.551 -1.471 -0.315 -0.069 -0.104 -0.106 10.174 +-0.308 -0.874 -0.136 -0.524 -0.041 -0.271 10.174 +-0.108 -0.784 0.594 0.138 0.304 0.388 10.174 +13.121 13.467 2.070 14.011 13.573 8.356 10.174 +0.048 -0.243 0.288 0.080 -0.095 -0.099 10.174 +0.226 -0.313 -0.048 0.232 -0.163 -0.240 10.174 +0.361 0.107 -0.295 0.267 -0.190 -0.178 10.174 +0.519 0.445 0.335 0.293 -0.100 -0.299 10.174 +0.404 0.140 0.134 -0.058 -0.217 -0.615 10.174 +0.475 0.563 0.222 -0.022 -0.440 -0.706 10.174 +0.793 0.897 0.212 -0.117 -0.512 -0.503 10.174 +0.754 1.245 0.431 0.025 -0.436 -0.771 10.174 +1.160 1.304 0.436 0.075 0.650 -0.276 10.174 +1.037 1.063 0.354 0.434 -1.031 -0.788 10.174 +0.626 1.213 0.364 -0.738 -0.139 -0.506 10.174 +0.515 0.874 0.099 -0.291 -0.742 -0.685 10.174 +0.471 1.180 0.089 -0.197 -0.051 -0.682 10.174 +0.901 1.564 0.282 -0.300 -0.634 -0.882 10.174 +0.926 1.813 0.318 -0.374 -0.467 -1.260 10.174 +1.335 1.948 0.231 -0.532 -0.907 -1.490 10.174 +1.706 2.235 0.106 -0.916 -1.523 -2.032 10.174 +1.427 3.216 0.159 -1.893 -2.028 -2.882 10.174 +1.526 2.295 -0.031 -1.574 -2.647 -3.527 10.174 +2.384 2.729 0.040 -1.538 -2.683 -4.108 10.174 +2.483 2.855 0.203 -1.626 -2.874 -4.123 10.174 +2.647 3.081 0.081 -1.660 -3.042 -4.554 10.174 +2.671 2.795 -0.202 -1.881 -3.270 -4.897 10.174 +2.599 3.058 -0.128 -1.828 -3.237 -4.947 10.174 +2.529 2.586 -0.108 -1.698 -3.144 -4.397 9.410 +2.647 2.651 -0.116 -1.752 -3.066 -4.656 9.410 +2.286 2.316 -0.370 -1.599 -3.079 -4.146 9.410 +2.498 2.666 -0.178 -1.597 -3.104 -4.510 9.410 +3.817 4.381 -0.111 -3.507 -6.321 -3.940 9.410 +2.075 2.888 -0.333 -1.365 -2.772 -3.872 9.410 +3.314 4.574 -0.453 -2.365 -4.448 -3.112 9.410 +1.645 2.181 -0.212 -0.929 -1.905 -3.051 9.410 +1.218 1.910 -0.221 -0.387 -1.474 -2.100 9.410 +0.188 2.139 -0.581 -1.350 -1.379 -1.746 9.410 +0.098 1.603 -0.247 -0.127 -0.258 -0.617 9.410 +0.292 1.025 -0.194 0.017 -0.198 -0.330 9.410 +-0.181 1.301 -0.148 0.147 0.365 0.262 9.410 +-0.411 0.935 -0.371 -0.171 -0.213 -0.520 9.410 +-0.188 0.979 -0.298 -0.330 1.104 -0.265 9.410 +-0.062 1.047 -0.200 0.098 0.050 -0.298 9.410 +-0.099 1.320 -0.109 0.054 0.094 -0.152 9.410 +0.068 1.007 -0.588 -0.285 -0.506 -0.507 9.410 +0.280 1.041 0.161 0.550 -0.017 -0.356 9.410 +0.600 1.250 -0.046 0.078 -0.313 -0.586 9.410 +-0.969 0.178 -0.681 -0.298 -0.591 -0.962 9.410 +0.248 1.015 -0.098 0.102 -0.066 -0.428 9.410 +-0.032 0.544 -0.340 0.055 -0.178 0.132 9.410 +0.483 0.713 0.147 0.516 0.152 0.215 9.410 +-0.215 0.711 -0.048 0.153 0.156 1.585 9.410 +0.628 0.416 0.014 -0.224 0.347 0.117 9.410 +-0.144 0.152 -0.037 0.227 0.277 -0.478 9.410 +-0.080 0.372 0.057 0.473 0.361 0.165 9.410 +0.090 0.368 0.062 0.335 0.473 0.146 9.410 +-0.452 -0.158 -0.202 0.143 0.298 0.511 9.410 +-0.358 0.037 0.061 0.126 0.694 0.354 9.410 +-0.159 -0.211 0.235 0.453 0.705 0.638 9.410 +-0.237 0.240 -0.263 -0.680 0.661 0.077 9.410 +-0.729 -1.105 -0.406 0.144 0.236 -0.847 9.410 +-0.477 -0.722 -0.079 0.829 0.582 -0.051 9.410 +-0.904 -1.031 -0.423 -0.193 -0.004 0.293 9.410 +0.181 -0.937 -0.132 -0.015 0.329 1.207 9.410 +-0.349 -1.210 -0.589 -0.039 0.323 0.144 9.410 +-0.305 -0.841 0.101 0.240 1.038 0.839 9.410 +0.772 -0.717 0.211 -0.079 1.327 1.869 9.410 +0.663 -0.943 0.298 0.637 1.697 2.185 9.410 +0.660 -0.873 0.277 0.650 1.799 2.689 9.410 +0.299 -1.028 0.411 0.528 1.694 3.182 9.410 +0.744 -0.919 0.350 0.840 2.130 3.672 9.410 +0.349 -1.019 0.464 0.572 1.946 3.175 9.410 +0.801 -0.918 0.637 0.849 2.109 3.876 9.410 +0.953 -0.964 0.761 1.250 2.763 3.573 9.410 +0.173 -1.286 0.198 0.392 1.836 3.740 9.410 +0.174 -1.480 0.265 0.350 2.012 3.301 9.410 +0.304 -1.353 0.325 1.193 2.026 3.104 9.410 +-0.080 -1.746 0.179 0.306 1.823 2.843 9.410 +0.079 -1.723 0.112 0.357 1.639 2.774 9.410 +-0.307 -2.235 0.051 -0.037 1.221 2.398 9.410 +-0.509 -1.925 -0.195 0.033 1.301 1.842 9.410 +-0.230 -1.974 -0.394 -0.026 0.882 1.447 9.410 +-0.661 -2.426 -0.449 -0.171 0.482 1.076 9.410 +-1.140 -2.630 -1.033 -1.056 -0.439 0.204 9.410 +-1.332 -2.678 -0.986 -0.741 -0.111 -0.005 9.410 +-1.435 -2.192 -0.968 -0.776 -0.177 -0.110 9.410 +-1.209 -2.347 -0.904 -1.145 -0.752 -0.378 9.410 +-0.881 -2.206 -0.905 -0.955 -0.816 -0.746 9.410 +-1.552 -2.454 -1.072 -0.916 -0.538 -0.589 9.410 +-0.846 -1.727 -1.043 0.246 0.396 -0.676 9.410 +-1.513 -2.553 -0.830 -0.698 -0.654 -0.330 9.410 +-1.485 -2.322 -1.141 -0.811 -0.673 -0.992 9.410 +-0.602 -1.810 -0.549 -0.234 -0.171 0.032 9.410 +-1.393 -1.772 -0.853 -0.551 -0.624 -0.381 9.410 +-0.813 -1.383 -0.324 0.306 -0.092 0.124 9.410 +-0.835 -1.655 -0.387 -0.253 -0.174 -0.282 9.410 +-0.430 -0.911 -0.251 -0.276 0.096 -0.349 9.410 +-0.209 -0.612 -0.371 0.230 -0.133 -0.275 9.410 +-0.655 -1.172 0.745 0.359 0.917 -0.153 9.410 +-0.295 -0.524 -0.082 0.167 -0.068 0.015 9.410 +-0.316 -0.187 -0.570 0.047 -0.176 0.123 9.410 +-14.085 -13.855 -2.077 -12.968 -12.856 -12.639 9.410 +-0.294 -0.947 -0.672 -0.129 -0.417 -0.348 9.410 +-0.169 0.039 0.044 -0.041 -0.148 -0.150 9.410 +0.254 1.009 0.185 0.167 -0.020 0.010 9.410 +0.137 0.650 0.328 0.299 -0.056 -0.034 9.410 +0.963 1.399 0.339 0.241 0.041 0.317 9.410 +0.080 -0.394 0.136 0.253 0.123 0.158 9.410 +0.188 1.063 0.161 -0.026 0.070 0.285 9.410 +-0.073 0.674 0.119 0.305 -0.010 0.463 9.410 +-0.107 0.671 -0.021 -0.268 0.053 0.239 9.410 +-0.263 0.562 0.052 0.863 0.361 0.906 9.410 +-0.270 0.754 -0.068 -0.247 -0.310 0.103 9.410 +-0.018 0.896 -0.233 -0.515 -0.486 -0.265 9.410 +0.605 1.389 0.119 -0.501 -0.777 -0.883 9.410 +0.960 1.815 0.062 -0.707 -0.898 -1.365 9.410 +1.576 2.005 0.088 -1.191 -1.007 -2.302 9.410 +1.768 2.396 0.109 -1.164 -1.895 -2.554 9.410 +1.913 2.122 -0.197 -1.695 -2.702 -3.715 9.410 +2.356 3.080 0.353 -1.227 -2.420 -3.467 9.410 +2.527 2.661 0.022 -1.617 -3.001 -4.210 9.410 +1.741 2.275 -0.377 -2.427 -3.214 -4.599 9.410 +2.570 2.667 0.128 -1.393 -2.697 -3.711 9.410 +2.201 1.542 -0.423 -1.731 -2.901 -3.831 8.262 +2.161 2.073 -0.197 -1.619 -2.448 -3.906 8.262 +2.262 1.917 -0.373 -1.788 -2.931 -4.185 8.262 +1.947 1.954 -0.188 -1.368 -2.580 -3.710 8.262 +3.682 3.935 -0.097 -1.304 -4.626 -3.357 8.262 +1.519 1.868 -0.195 -1.098 -2.141 -2.926 8.262 +2.308 2.417 -1.023 -2.307 -3.739 -2.865 8.262 +1.177 1.039 -0.376 -0.766 -1.539 -2.157 8.262 +0.358 1.156 -0.408 -0.391 -1.100 -1.442 8.262 +-0.240 0.582 -0.390 -0.246 -0.547 -0.207 8.262 +-0.898 0.485 -0.499 -0.204 -0.168 -0.034 8.262 +-0.890 0.335 -0.154 0.664 0.737 0.652 8.262 +0.072 1.282 -0.116 1.745 2.087 1.546 8.262 +-0.671 0.663 0.029 0.300 1.127 1.112 8.262 +-0.427 0.676 -0.004 0.785 0.676 1.140 8.262 +-1.928 0.154 -0.417 0.203 0.442 -0.470 8.262 +-0.955 0.379 -0.358 0.295 0.251 -0.137 8.262 +-0.770 0.591 -0.165 0.411 0.071 0.141 8.262 +-0.782 1.233 -0.367 0.962 0.325 0.349 8.262 +-0.475 0.470 -0.169 0.120 0.316 0.250 8.262 +-0.247 0.367 -0.225 0.316 0.322 0.823 8.262 +-0.417 0.551 -0.002 0.687 0.577 0.390 8.262 +-0.298 0.685 -0.391 0.055 0.348 -0.124 8.262 +-0.035 0.935 -0.154 1.101 0.857 0.050 8.262 +-0.116 0.275 -0.100 0.977 0.292 -0.003 8.262 +-0.457 0.029 -0.226 0.205 0.134 -0.300 8.262 +-0.510 -0.094 -0.355 0.191 0.241 0.479 8.262 +-0.583 -0.070 -0.118 0.145 -0.020 -0.234 8.262 +-0.257 0.246 -0.103 0.019 0.638 -0.247 8.262 +-0.233 -0.034 0.036 0.213 0.665 -0.143 8.262 +-0.840 -0.434 -0.164 0.387 0.194 0.063 8.262 +-1.251 -0.287 -0.316 -0.066 0.208 -0.299 8.262 +-0.241 -0.423 -0.094 0.073 0.126 -0.377 8.262 +-1.091 -0.863 -0.338 0.230 0.217 -0.229 8.262 +-0.564 -0.421 -0.345 0.125 -0.321 -0.272 8.262 +-0.466 -1.297 -0.246 -0.495 -0.465 -0.747 8.262 +-0.725 -0.902 -0.509 0.035 0.158 -0.908 8.262 +-0.439 -0.865 -0.420 -0.442 0.507 -0.548 8.262 +-0.097 -0.628 -0.206 0.160 0.630 0.336 8.262 +0.428 -0.145 0.172 0.734 0.874 1.379 8.262 +0.149 -0.232 0.062 0.873 0.886 1.663 8.262 +0.422 -0.344 0.371 1.260 1.369 2.313 8.262 +0.554 -0.008 0.422 0.822 1.668 1.835 8.262 +0.266 -0.300 0.192 0.399 1.957 2.542 8.262 +0.347 -0.700 0.272 0.477 1.461 2.791 8.262 +0.474 -0.800 0.300 0.372 1.545 3.521 8.262 +0.369 -0.995 0.179 0.215 1.462 2.757 8.262 +0.014 -1.009 0.279 0.538 1.862 2.537 8.262 +0.282 -1.213 0.108 -0.640 1.251 2.719 8.262 +-0.022 -1.555 0.070 0.280 1.529 3.448 8.262 +-0.451 -1.689 -0.424 0.114 1.108 2.192 8.262 +-0.130 -1.619 -0.109 0.307 1.155 2.528 8.262 +-0.065 -1.487 -0.045 0.204 1.261 2.024 8.262 +-0.180 -1.800 -0.477 -0.507 0.612 1.824 8.262 +-0.617 -2.005 -0.580 -0.454 0.305 0.877 8.262 +-0.987 -2.027 -0.756 -0.166 0.051 0.345 8.262 +-1.320 -2.237 -1.050 -0.533 -0.444 -0.171 8.262 +-1.148 -1.758 -0.816 -0.706 -0.665 -1.038 8.262 +-2.098 -2.006 -1.096 -1.053 -0.977 -2.005 8.262 +-1.247 -2.028 -1.248 -1.364 -0.581 -1.744 8.262 +-1.311 -2.087 -0.981 -1.478 -1.594 -1.934 8.262 +-1.906 -2.145 -1.079 -1.056 -1.171 -1.795 8.262 +-1.340 -1.625 -0.735 -0.857 -0.462 -1.023 8.262 +-1.662 -1.888 -0.827 -0.519 -0.552 -0.803 8.262 +-1.228 -1.765 -0.865 -0.618 -0.743 -0.982 8.262 +-1.118 -1.366 -0.528 -0.374 -0.189 -0.436 8.262 +-0.922 -1.210 -0.397 -0.061 -0.208 -0.444 8.262 +-0.627 -0.689 -0.230 0.153 0.042 -0.262 8.262 +-1.078 -1.255 -0.481 -0.106 -0.448 -0.790 8.262 +-0.427 -0.836 -0.001 0.403 0.201 -0.101 8.262 +-0.545 -0.651 -0.084 0.451 0.237 0.093 8.262 +-0.909 -1.612 -0.026 0.156 0.060 -0.675 8.262 +-0.397 0.248 0.060 0.604 0.483 0.282 8.262 +0.035 0.023 0.318 0.913 0.755 0.358 8.262 +-0.686 -0.671 -0.817 0.345 -0.144 0.202 8.262 +0.066 0.211 0.398 0.813 0.945 0.785 8.262 +-0.034 -0.674 0.135 0.601 0.525 1.076 8.262 +-0.147 -0.050 0.330 0.575 0.442 0.832 8.262 +-0.224 0.403 0.238 0.566 0.529 1.021 8.262 +-0.651 -0.632 0.202 0.482 0.444 0.855 8.262 +0.013 0.175 0.202 0.583 0.847 1.312 8.262 +-0.755 -0.144 -0.005 0.414 0.569 1.020 8.262 +-0.797 0.024 0.036 0.401 0.915 1.607 8.262 +-0.829 0.249 0.248 0.842 1.514 1.879 8.262 +-1.271 -0.026 0.213 0.701 1.339 2.104 8.262 +-0.748 0.500 0.106 0.865 1.400 1.820 8.262 +-0.346 0.579 0.137 0.199 0.393 1.536 8.262 +-0.940 0.489 -0.240 -0.268 0.082 0.056 8.262 +0.455 0.855 -0.050 -0.339 -0.492 -0.487 8.262 +1.403 1.227 -0.061 -0.687 -1.177 -1.252 8.262 +1.367 1.444 -0.024 -0.925 -1.453 -1.768 8.262 +0.857 1.923 -0.509 -1.472 -2.598 -3.131 8.262 +1.565 1.789 -0.427 -1.509 -2.645 -3.357 8.262 +2.096 1.837 -0.205 -1.707 -2.607 -2.770 8.262 +2.272 2.056 -0.063 -1.437 -2.662 -3.542 8.262 +2.109 2.094 -0.318 -1.655 -2.735 -3.910 8.262 +1.992 1.458 -0.439 -1.551 -2.744 -3.743 6.741 +1.775 1.008 -0.489 -1.776 -2.900 -3.673 6.741 +1.408 0.981 -0.527 -1.731 -2.677 -3.487 6.741 +1.591 0.612 -0.479 -1.780 -2.915 -3.847 6.741 +3.325 2.429 -0.489 -2.285 -3.936 -1.946 6.741 +0.743 0.628 -0.772 -1.950 -2.456 -3.005 6.741 +1.606 1.103 -0.940 -1.714 -3.080 -1.942 6.741 +0.240 0.057 -0.760 -0.928 -1.515 -1.563 6.741 +-0.497 -0.283 -0.811 -0.978 -1.057 -1.011 6.741 +-0.952 -0.244 -0.659 0.047 -0.151 -0.156 6.741 +-1.266 -0.506 -0.733 0.290 0.158 1.144 6.741 +-1.562 -0.316 -0.179 0.928 1.261 2.131 6.741 +-1.782 -0.509 -0.149 0.881 1.656 2.794 6.741 +-1.799 -0.411 -0.191 1.660 1.569 2.032 6.741 +-1.632 -0.542 -0.224 0.751 1.270 1.581 6.741 +-1.619 -0.341 -0.468 0.383 0.694 0.381 6.741 +-1.170 -0.054 -0.049 0.833 1.223 1.543 6.741 +-1.285 -0.438 -0.372 0.354 0.567 0.226 6.741 +-1.796 -0.210 -0.186 0.763 1.653 1.219 6.741 +-1.035 -0.578 -0.430 0.464 0.372 1.216 6.741 +-0.533 0.151 0.038 0.870 0.843 1.278 6.741 +-0.681 0.130 -0.160 0.632 0.529 1.178 6.741 +-0.909 -0.290 -0.121 0.660 0.421 0.450 6.741 +0.048 0.584 -0.189 1.255 1.034 0.425 6.741 +-0.733 -0.071 -0.254 0.353 0.275 0.234 6.741 +-0.700 -0.225 -0.244 0.455 0.339 -0.067 6.741 +-0.066 0.984 0.741 1.289 0.937 0.288 6.741 +10.982 10.578 5.089 13.247 12.113 6.727 6.741 +-0.979 -0.421 -0.481 -0.227 -0.525 -0.642 6.741 +-0.349 0.068 -0.146 0.466 -0.181 -0.523 6.741 +-0.531 -0.161 -0.074 0.161 0.110 -0.832 6.741 +-0.802 0.088 -0.268 0.175 0.135 -0.515 6.741 +-0.717 -0.369 -0.341 0.313 -0.120 -1.152 6.741 +-0.848 -0.685 -0.389 -0.156 -0.311 -0.500 6.741 +-1.002 -1.124 -0.539 -0.696 -0.853 -1.366 6.741 +-0.990 -0.420 -0.661 -0.472 -0.761 -2.028 6.741 +-0.757 -1.268 -0.803 -1.236 -0.717 -2.345 6.741 +-0.200 -0.273 -0.499 -0.317 -0.610 -1.301 6.741 +-0.465 -0.338 -0.530 -0.398 -0.791 -0.122 6.741 +-0.285 -0.274 -0.337 -0.296 -0.180 -0.037 6.741 +0.144 -0.317 -0.278 -0.030 0.090 0.896 6.741 +0.356 0.019 0.409 0.704 1.307 1.203 6.741 +0.211 -0.271 0.167 1.255 1.303 1.715 6.741 +0.700 -0.314 0.469 1.255 1.616 2.471 6.741 +1.278 0.278 0.589 0.647 1.431 2.380 6.741 +0.277 -0.212 0.486 0.801 1.615 2.338 6.741 +1.152 -0.261 0.358 0.457 1.311 2.323 6.741 +1.484 -0.237 0.335 0.274 1.407 2.543 6.741 +-0.361 -1.219 -0.010 0.067 0.997 2.123 6.741 +-0.216 -0.801 -0.134 -0.219 1.127 2.039 6.741 +-0.064 -1.394 -0.274 -0.301 0.529 1.277 6.741 +-0.555 -1.312 -0.281 -0.524 0.723 0.734 6.741 +-0.506 -1.040 -0.225 0.146 0.631 1.393 6.741 +-0.367 -1.349 -0.514 -0.358 0.404 1.180 6.741 +-0.496 -1.189 -0.386 -0.689 0.057 0.269 6.741 +-1.322 -1.756 -0.820 -0.807 -0.487 -0.764 6.741 +-0.927 -0.952 -0.873 -0.633 -0.855 -1.263 6.741 +-1.244 -1.784 -1.150 -1.220 -1.540 -1.845 6.741 +-0.954 -1.519 -0.905 -1.204 -1.356 -2.207 6.741 +-0.883 -1.132 -0.941 -0.790 -1.548 -2.382 6.741 +-1.879 -2.551 -1.710 -2.059 -2.692 -3.058 6.741 +-1.993 -2.216 -1.473 -1.563 -1.808 -3.022 6.741 +-1.544 -1.460 -1.033 -0.402 -1.200 -1.913 6.741 +-1.682 -1.204 -1.048 -0.924 -1.166 -1.293 6.741 +-1.645 -1.414 -1.097 -0.819 -1.328 -1.820 6.741 +-0.656 -0.499 -0.237 0.173 -0.292 -1.280 6.741 +-0.705 -0.875 -0.561 -0.154 -0.627 -0.899 6.741 +-1.314 -1.292 -0.609 -0.243 -0.648 -1.086 6.741 +-0.949 -0.952 -0.256 0.171 -0.383 -0.847 6.741 +-0.693 -0.932 -0.133 0.308 -0.020 -0.156 6.741 +-0.693 -0.672 0.013 0.160 -0.146 -0.433 6.741 +9.838 10.099 5.821 11.953 11.369 5.582 6.741 +-0.385 -0.002 0.493 0.662 0.432 0.543 6.741 +-0.608 -0.414 -0.005 0.677 0.564 0.463 6.741 +-0.353 -0.122 0.382 0.939 0.564 0.900 6.741 +-0.832 -0.493 0.001 0.642 0.468 1.410 6.741 +-0.365 -0.091 0.176 0.463 0.886 1.447 6.741 +-0.524 -0.263 -0.126 0.973 0.778 1.816 6.741 +0.011 0.318 0.574 1.379 0.905 2.106 6.741 +-0.878 -0.463 -0.078 0.583 0.792 1.754 6.741 +-1.594 -0.908 -0.261 0.440 0.894 1.826 6.741 +-1.284 0.192 -0.028 0.603 1.058 2.176 6.741 +-1.620 -0.632 -0.047 0.803 1.688 2.480 6.741 +-1.610 -0.596 -0.106 0.787 1.622 2.916 6.741 +-1.005 -0.634 -0.245 1.303 2.099 3.515 6.741 +-3.183 -0.997 -0.128 0.745 1.167 2.863 6.741 +-1.006 -0.291 -0.096 0.430 1.389 1.705 6.741 +-0.537 0.153 -0.110 -0.064 0.208 1.198 6.741 +-0.136 -0.077 -0.291 -0.356 -0.367 0.164 6.741 +0.084 0.278 -0.550 -0.839 -0.665 -0.710 6.741 +0.572 0.814 -0.434 -1.039 -1.732 -1.445 6.741 +1.054 0.833 -0.451 -1.129 -2.123 -2.436 6.741 +1.312 0.882 -0.560 -1.271 -2.240 -2.506 6.741 +1.475 1.302 -0.390 -1.640 -2.937 -3.472 6.741 +1.411 0.731 -0.819 -1.991 -2.954 -3.552 6.741 +1.926 1.397 -0.456 -1.831 -2.779 -3.473 6.741 +1.689 0.611 -0.194 -1.148 -2.098 -2.462 4.839 +1.110 0.394 -0.337 -1.343 -2.221 -2.574 4.839 +1.453 0.375 -0.282 -1.430 -2.187 -2.616 4.839 +0.588 -0.295 -0.796 -1.704 -2.410 -2.713 4.839 +1.742 0.045 -0.317 -2.339 -3.494 -1.986 4.839 +0.143 -0.859 -0.894 -1.233 -1.553 -1.729 4.839 +0.403 -0.317 -0.491 -0.926 -1.369 -0.795 4.839 +0.354 -0.598 -0.480 -0.395 -0.397 0.102 4.839 +-1.098 -0.851 -0.707 -0.163 -0.032 0.665 4.839 +-1.643 -1.136 -0.535 0.196 0.922 1.950 4.839 +-2.106 -1.314 -0.726 0.694 1.067 2.327 4.839 +-2.029 -1.219 -0.246 1.306 2.158 3.725 4.839 +-0.626 0.448 -0.491 3.496 4.742 4.035 4.839 +-2.847 -1.811 -0.512 1.234 2.262 3.793 4.839 +-2.596 -1.559 -0.514 1.148 2.128 3.090 4.839 +-2.020 -1.173 -0.237 1.318 1.923 2.841 4.839 +-1.874 -1.134 -0.210 1.184 1.828 2.628 4.839 +-1.382 -0.729 -0.184 0.960 1.305 2.714 4.839 +-5.742 -4.033 -0.354 1.542 0.734 2.134 4.839 +-1.617 -0.897 -0.309 0.846 1.260 1.726 4.839 +-1.292 -1.199 -0.077 0.913 1.090 1.723 4.839 +-1.101 -0.427 0.013 1.095 1.277 1.191 4.839 +-0.878 -0.144 0.034 1.475 0.873 1.047 4.839 +0.089 0.545 -0.099 2.235 1.623 0.815 4.839 +-1.089 -0.416 -0.155 0.608 0.532 1.288 4.839 +-1.047 0.210 -0.129 0.711 0.329 0.532 4.839 +-1.466 0.054 -0.016 0.732 0.411 -0.476 4.839 +-0.680 0.212 0.339 0.827 0.428 -0.118 4.839 +-0.424 -0.021 -0.253 0.460 -0.060 -0.487 4.839 +-1.287 -0.529 -0.480 -0.090 -0.284 -1.063 4.839 +-1.151 -0.413 -0.651 -0.262 -1.103 -1.453 4.839 +-0.832 0.129 -0.468 0.659 0.014 -1.473 4.839 +-1.092 0.120 -0.379 -0.120 -0.769 -1.305 4.839 +-0.749 -0.324 -0.265 0.034 -0.535 -1.580 4.839 +-0.554 -0.019 -0.445 0.036 -1.036 -1.897 4.839 +-1.142 -0.478 -0.960 -1.124 -1.510 -3.102 4.839 +-0.272 0.592 -0.358 -0.675 -1.498 -2.747 4.839 +0.558 -0.203 -0.495 -0.144 -1.047 -2.044 4.839 +-0.391 0.096 -0.601 -0.467 -0.992 -1.481 4.839 +-0.361 0.023 -0.204 -0.106 -0.704 -0.092 4.839 +0.886 0.450 0.017 -0.161 0.143 0.223 4.839 +-0.155 -0.062 -0.467 0.335 0.082 0.028 4.839 +0.330 0.406 -0.181 0.237 0.370 0.964 4.839 +0.303 0.215 0.334 0.477 1.136 1.713 4.839 +0.682 0.460 0.498 0.490 1.681 1.936 4.839 +1.082 1.093 0.324 0.403 1.284 2.714 4.839 +1.120 0.975 0.763 0.767 1.260 2.259 4.839 +0.045 -0.306 0.611 0.437 1.308 2.091 4.839 +0.928 0.733 0.296 0.417 1.101 2.219 4.839 +-0.481 -0.658 -0.169 0.258 0.147 1.747 4.839 +-0.166 -0.190 -0.265 -0.515 0.286 1.209 4.839 +-0.130 -0.308 -0.099 -0.240 0.419 1.942 4.839 +0.453 0.408 0.277 0.191 0.922 1.551 4.839 +-0.561 -0.650 -0.532 -0.755 -0.131 0.311 4.839 +-0.829 -0.705 -0.737 -0.938 -0.765 -0.585 4.839 +-1.200 -0.807 -0.833 -0.949 -0.934 -1.195 4.839 +-0.639 -0.796 -0.874 -1.200 -1.398 -2.285 4.839 +-0.652 -1.068 -0.944 -1.063 -1.542 -2.387 4.839 +-1.213 -1.128 -1.136 -1.362 -2.080 -2.938 4.839 +-1.604 -1.420 -1.394 -1.508 -2.365 -3.681 4.839 +-1.432 -1.073 -1.197 -1.349 -2.318 -3.940 4.839 +-2.129 -1.168 -1.281 -1.250 -2.289 -3.621 4.839 +-1.649 -1.220 -1.112 -1.259 -2.064 -3.192 4.839 +-1.720 -0.995 -0.906 -0.342 -1.473 -2.548 4.839 +-0.979 -0.394 -0.466 -0.024 -1.053 -2.098 4.839 +-1.593 -0.902 -0.859 -0.574 -0.554 -1.853 4.839 +-0.536 0.047 -0.134 0.174 -0.448 -1.390 4.839 +-0.787 -0.300 -0.390 0.106 -0.582 -1.298 4.839 +-1.041 -0.755 -0.461 0.096 -0.539 -1.130 4.839 +-0.899 -0.650 -0.041 0.245 -0.250 -0.602 4.839 +-1.029 -0.329 -0.442 0.775 -0.073 -0.093 4.839 +-13.084 -11.733 -6.502 -9.981 -10.535 -5.617 4.839 +-0.597 -0.351 -0.223 0.810 0.545 0.583 4.839 +-0.393 0.186 0.793 1.176 1.176 1.389 4.839 +-1.152 -0.042 0.401 1.249 1.076 1.464 4.839 +-0.602 -0.365 0.476 1.316 1.383 1.513 4.839 +-1.507 -0.460 -0.002 1.178 1.939 2.216 4.839 +-11.786 -12.160 -4.904 -14.646 -14.961 0.835 4.839 +-1.461 -0.961 -0.196 1.041 1.481 2.818 4.839 +-1.600 -0.449 0.360 1.292 1.807 3.419 4.839 +-1.628 -0.717 0.330 1.477 2.222 3.599 4.839 +-1.769 -0.548 0.403 1.566 2.599 3.802 4.839 +-1.959 -1.005 0.147 1.515 2.697 4.112 4.839 +-2.254 -0.904 0.106 1.687 3.404 4.703 4.839 +-2.512 -1.366 -0.124 1.413 2.878 4.745 4.839 +-2.310 -1.475 -0.274 0.965 2.298 3.952 4.839 +-1.754 -0.975 -0.152 0.688 1.811 3.309 4.839 +-1.271 -0.958 -0.213 0.617 1.248 2.423 4.839 +-0.806 -0.606 -0.203 0.197 0.719 1.791 4.839 +-0.230 -0.284 -0.144 0.266 -0.117 0.840 4.839 +0.478 -0.119 -0.135 -0.502 -0.428 0.124 4.839 +0.148 -0.091 -0.595 -1.083 -1.239 -1.449 4.839 +1.102 0.237 -0.344 -1.196 -1.510 -1.679 4.839 +1.015 0.412 -0.159 -1.090 -1.589 -1.513 4.839 +1.572 0.740 -0.172 -1.253 -1.921 -2.274 4.839 +1.779 0.803 0.004 -0.935 -2.097 -2.024 4.839 +1.487 -0.338 -0.292 -1.251 -2.089 -1.812 2.659 +1.361 -0.348 -0.381 -0.925 -1.816 -2.057 2.659 +1.225 -0.543 -0.442 -1.410 -1.859 -1.358 2.659 +1.370 -0.440 -0.175 -0.780 -1.343 -1.345 2.659 +-0.890 -3.642 -0.414 -3.730 -4.459 -0.793 2.659 +0.501 -0.833 -0.150 -0.307 -0.901 -0.240 2.659 +-0.372 -2.287 -1.397 -0.844 -0.797 0.568 2.659 +-1.067 -1.529 -0.600 -0.299 -0.070 0.562 2.659 +-1.221 -1.736 -0.480 0.138 0.855 2.273 2.659 +-1.859 -1.918 -0.523 0.747 1.509 2.971 2.659 +-2.564 -2.435 -0.761 0.685 1.662 3.404 2.659 +-2.678 -2.454 -0.572 1.540 2.534 4.194 2.659 +-3.006 -2.389 -0.415 1.736 3.068 5.120 2.659 +-3.050 -2.387 -0.340 1.844 3.092 4.945 2.659 +-2.303 -2.159 -0.095 1.866 3.004 4.646 2.659 +-2.665 -2.168 -0.364 1.454 2.203 3.731 2.659 +-2.035 -1.604 -0.143 1.519 2.507 4.192 2.659 +-2.020 -1.454 -0.132 1.396 2.188 3.659 2.659 +-4.447 -3.767 -0.346 2.616 2.474 3.131 2.659 +-1.744 -1.063 -0.091 1.267 1.729 2.621 2.659 +-1.475 -1.158 0.099 1.351 1.920 2.198 2.659 +-1.539 -1.316 -0.297 1.048 1.219 1.847 2.659 +-0.900 -0.640 -0.021 1.085 1.094 0.929 2.659 +-0.392 0.200 -0.343 1.851 1.768 1.192 2.659 +-1.054 -0.634 -0.294 0.663 0.006 0.634 2.659 +-1.393 -0.683 -0.340 0.433 0.345 -0.029 2.659 +-1.181 -0.528 -0.311 0.382 0.096 0.018 2.659 +-1.083 -0.541 -0.383 0.064 -0.346 -0.898 2.659 +-0.973 -0.292 -0.419 -0.107 -0.571 -1.154 2.659 +-0.217 -0.197 -0.232 0.641 -0.521 -1.336 2.659 +-1.708 -0.878 -1.032 -0.237 -1.257 -1.952 2.659 +-0.705 0.527 -0.553 0.252 -0.820 -1.877 2.659 +-0.531 -0.027 -0.331 -0.136 -1.122 -2.302 2.659 +-0.550 0.528 -0.063 0.190 -0.841 -2.108 2.659 +-0.812 -0.147 -0.680 -0.554 -1.843 -2.954 2.659 +-0.046 0.385 -0.463 -0.381 -1.870 -3.826 2.659 +-0.195 0.236 -0.603 -0.930 -2.163 -2.899 2.659 +-0.415 0.379 -0.666 -0.741 -2.030 -1.803 2.659 +-0.302 0.327 -0.534 -0.665 -1.489 -2.498 2.659 +0.308 0.797 -0.265 -0.229 -1.108 -1.417 2.659 +-4.731 -3.859 -3.090 -4.974 -5.523 0.137 2.659 +1.025 1.227 0.047 -0.284 -0.033 -0.169 2.659 +0.589 1.029 -0.058 -0.116 -0.879 -0.309 2.659 +0.415 0.971 -0.129 -0.071 0.033 0.980 2.659 +1.195 1.540 0.264 0.034 0.003 0.964 2.659 +0.801 0.756 0.199 -0.126 0.515 1.144 2.659 +1.225 1.441 0.558 0.282 0.644 1.650 2.659 +0.969 1.919 0.382 0.322 0.943 2.296 2.659 +1.118 1.311 0.521 -0.110 0.358 1.833 2.659 +0.898 1.838 0.389 -0.135 0.646 2.159 2.659 +0.617 0.724 0.051 0.013 -0.078 1.294 2.659 +0.786 0.887 0.110 -0.281 0.000 0.933 2.659 +0.444 0.594 -0.197 -0.923 -0.482 0.703 2.659 +0.091 0.290 -0.340 -0.572 -0.303 -0.227 2.659 +-0.330 0.025 -0.838 -1.298 -1.560 -1.721 2.659 +-0.485 -0.092 -0.885 -1.299 -1.611 -1.742 2.659 +-0.267 0.062 -0.939 -1.236 -1.998 -2.490 2.659 +-0.878 -0.316 -1.086 -1.418 -2.381 -3.394 2.659 +-0.948 -0.382 -1.252 -1.437 -2.759 -3.756 2.659 +-1.312 -0.391 -1.107 -1.625 -2.918 -3.958 2.659 +-1.147 -0.316 -1.410 -1.028 -3.142 -4.666 2.659 +-1.562 -0.545 -1.613 -1.760 -3.231 -4.846 2.659 +-1.713 -0.736 -1.629 -1.757 -3.131 -4.689 2.659 +-1.689 -0.685 -1.195 -1.180 -1.882 -3.707 2.659 +-1.333 -0.461 -0.998 -0.814 -2.052 -3.375 2.659 +-1.217 -0.363 -0.657 -0.274 -1.334 -2.684 2.659 +-1.097 -0.042 -0.544 -0.232 -1.313 -2.168 2.659 +-0.941 -0.101 -0.341 0.042 -0.574 -1.965 2.659 +-0.346 0.110 -0.044 0.215 -0.363 -1.432 2.659 +-0.764 0.211 0.019 0.963 -0.142 -0.436 2.659 +-0.527 0.355 0.407 0.633 0.044 -0.026 2.659 +9.128 10.538 5.102 12.060 11.367 5.679 2.659 +-0.438 0.216 0.678 1.109 0.822 1.160 2.659 +-0.522 0.401 0.426 1.708 1.210 1.614 2.659 +-0.162 -0.030 0.734 1.647 1.824 2.305 2.659 +-4.210 -2.694 0.364 0.675 1.837 2.251 2.659 +-0.466 0.252 0.901 2.348 2.446 3.044 2.659 +-1.107 -0.688 0.215 2.178 2.283 3.128 2.659 +-0.879 -0.238 0.711 2.076 2.727 3.722 2.659 +-2.019 -1.193 0.059 1.365 2.237 3.689 2.659 +-2.253 -1.330 0.112 1.420 2.413 4.686 2.659 +-2.092 -1.534 0.118 1.559 2.828 4.462 2.659 +-2.407 -1.365 0.139 1.791 3.211 5.632 2.659 +-2.817 -1.738 -0.012 1.748 3.493 5.991 2.659 +-2.618 -1.602 0.163 1.920 3.717 5.811 2.659 +-2.655 -1.795 -0.203 1.450 2.841 5.003 2.659 +-1.896 -1.389 0.098 1.554 2.508 4.750 2.659 +-1.485 -1.426 0.100 1.095 2.223 3.953 2.659 +-0.875 -1.167 -0.098 0.743 1.469 3.378 2.659 +-0.140 -0.821 -0.028 0.547 0.792 1.852 2.659 +-0.046 -0.101 -0.157 -0.133 0.217 1.655 2.659 +0.506 -0.786 -0.311 -0.596 -0.489 0.034 2.659 +0.912 0.195 -0.031 -0.530 -0.623 -0.131 2.659 +1.400 -0.091 0.003 -0.866 -1.207 -1.019 2.659 +1.415 -0.439 -0.251 -0.912 -1.583 -1.384 2.659 +1.481 -0.357 -0.364 -1.210 -2.023 -1.894 2.659 +1.655 -0.940 -0.054 -1.097 -1.030 -1.035 0.121 +1.324 -1.431 -0.262 -0.791 -1.531 -0.980 0.121 +1.571 -1.379 -0.121 -0.596 -1.208 -0.455 0.121 +0.875 -1.114 -0.111 -0.697 -0.528 0.014 0.121 +-1.417 -5.440 -0.046 -2.605 -2.504 0.975 0.121 +0.362 -1.456 -0.077 0.386 0.208 1.132 0.121 +-1.109 -4.836 -0.729 0.376 1.151 2.188 0.121 +-0.896 -2.262 -0.094 0.562 1.206 2.972 0.121 +-1.280 -2.691 -0.259 0.971 1.853 3.987 0.121 +-2.311 -3.045 -0.269 1.487 2.492 4.483 0.121 +-2.475 -3.298 -0.413 1.685 2.897 4.961 0.121 +-2.843 -3.093 -0.337 1.973 3.359 5.799 0.121 +-3.417 -3.488 -0.354 2.122 3.887 6.565 0.121 +-3.494 -3.054 -0.014 2.855 4.248 6.657 0.121 +-3.255 -3.465 -0.285 1.778 3.665 6.315 0.121 +-3.770 -3.629 -0.704 1.579 2.913 5.029 0.121 +-3.154 -2.921 -0.051 2.106 3.301 5.528 0.121 +-2.616 -2.895 -0.212 1.949 2.862 4.934 0.121 +-8.340 -8.057 0.044 3.197 1.657 4.917 0.121 +-2.083 -1.959 -0.097 1.878 2.375 3.996 0.121 +-2.143 -1.825 -0.139 1.586 1.976 3.690 0.121 +-2.051 -1.924 -0.116 1.214 1.515 2.999 0.121 +-1.613 -1.288 -0.143 1.167 1.168 2.114 0.121 +-0.025 0.490 -0.350 2.296 2.346 1.794 0.121 +-1.169 -0.947 -0.312 0.887 0.596 0.998 0.121 +-1.311 -1.095 -0.327 0.654 0.058 0.481 0.121 +-1.039 -0.277 0.013 0.792 0.013 -0.108 0.121 +-1.271 -1.005 -0.518 -0.040 -0.594 -1.001 0.121 +-0.319 -0.264 -0.457 0.216 -0.736 -1.649 0.121 +-0.704 -0.133 -0.537 0.121 -0.977 -1.580 0.121 +-0.578 0.098 -0.418 -0.243 -1.186 -2.637 0.121 +0.473 1.163 -0.623 0.873 -0.296 -3.006 0.121 +-0.413 0.320 -0.522 -0.382 -1.646 -3.662 0.121 +-0.969 0.044 -0.786 -0.591 -1.767 -3.368 0.121 +-0.361 0.787 -0.617 -0.705 -2.325 -4.107 0.121 +-0.223 0.325 -0.930 -1.121 -2.939 -4.675 0.121 +0.278 1.282 -0.693 -1.040 -2.512 -3.857 0.121 +-0.287 0.750 -0.876 -1.019 -2.767 -4.067 0.121 +-0.537 0.304 -1.020 -1.300 -2.880 -3.820 0.121 +-0.274 0.891 -0.634 -0.997 -2.150 -2.675 0.121 +0.737 1.294 -0.668 -1.197 -2.086 -2.610 0.121 +0.708 1.839 0.013 -0.543 -1.187 -1.267 0.121 +1.187 2.537 0.206 -0.311 -0.800 -0.596 0.121 +1.415 1.916 0.377 0.030 -0.378 0.239 0.121 +1.413 1.974 0.052 -0.418 -0.476 0.254 0.121 +1.362 1.935 0.248 -0.003 -0.218 0.941 0.121 +1.586 2.219 0.255 -0.535 -0.353 0.925 0.121 +1.532 2.580 0.645 0.057 0.107 1.449 0.121 +2.250 2.484 0.688 0.075 0.092 1.648 0.121 +1.076 1.995 0.241 -0.226 -0.077 0.911 0.121 +1.504 2.215 0.112 -0.421 -0.555 0.285 0.121 +0.839 1.744 0.053 -0.634 -0.462 0.399 0.121 +0.976 1.633 -0.219 -0.843 -1.182 -0.742 0.121 +-0.146 0.851 -0.761 -1.354 -1.584 -1.854 0.121 +0.346 1.101 -0.562 -1.595 -2.002 -2.075 0.121 +-0.924 0.638 -1.103 -1.612 -2.541 -2.600 0.121 +-0.476 0.710 -1.057 -1.724 -3.275 -3.232 0.121 +-1.088 0.438 -1.408 -1.806 -3.156 -3.868 0.121 +-0.815 0.765 -1.275 -1.802 -3.345 -4.404 0.121 +-1.003 0.512 -1.315 -1.400 -3.262 -4.826 0.121 +-1.245 0.317 -1.475 -1.734 -3.723 -5.264 0.121 +-1.378 0.124 -1.450 -1.530 -3.638 -4.662 0.121 +-0.734 0.708 -1.387 -0.650 -2.859 -4.944 0.121 +-1.801 -0.031 -1.269 -0.875 -2.759 -4.275 0.121 +-1.409 0.705 -0.930 -0.870 -2.445 -4.303 0.121 +-1.237 0.339 -0.653 -0.373 -1.688 -3.305 0.121 +-0.754 0.555 -0.479 0.208 -1.461 -2.786 0.121 +-1.202 -0.234 -0.745 -0.267 -1.131 -2.578 0.121 +-1.051 0.192 -0.613 -0.083 -1.011 -2.256 0.121 +-0.523 0.582 0.298 0.968 -0.048 -1.105 0.121 +-0.933 -0.154 0.473 0.626 -0.252 -1.483 0.121 +11.482 11.469 3.018 11.586 11.551 7.965 0.121 +-0.695 0.799 1.462 1.433 1.574 0.723 0.121 +-0.572 0.032 0.433 1.723 1.221 1.745 0.121 +-0.556 0.436 0.740 1.876 2.118 2.571 0.121 +-5.452 -3.532 0.667 0.081 1.133 2.968 0.121 +-0.937 -0.062 0.524 2.144 2.588 3.384 0.121 +-1.105 -0.526 0.774 2.508 2.979 4.333 0.121 +-1.365 -0.512 0.789 2.781 3.576 5.444 0.121 +-2.110 -1.571 0.084 2.142 2.983 4.796 0.121 +-2.044 -1.295 0.488 1.888 4.133 6.060 0.121 +-2.681 -1.883 0.155 2.172 3.650 6.009 0.121 +-2.567 -1.602 0.414 2.473 4.469 7.059 0.121 +-3.092 -2.159 0.080 2.341 4.299 7.076 0.121 +-3.002 -2.246 0.265 2.326 4.536 6.744 0.121 +-2.532 -2.281 0.417 2.274 4.313 5.943 0.121 +-2.525 -2.591 0.197 1.685 3.795 5.613 0.121 +-2.119 -1.992 0.242 1.664 3.110 5.559 0.121 +-1.466 -1.951 0.014 1.289 2.434 4.410 0.121 +-0.896 -1.552 0.080 0.688 1.618 3.508 0.121 +-0.076 -1.185 0.235 1.092 1.355 3.109 0.121 +0.332 -0.833 0.146 0.204 0.596 1.911 0.121 +0.747 -1.171 0.106 -0.359 0.559 1.175 0.121 +1.005 -1.121 -0.117 -0.506 -0.748 -0.810 0.121 +1.560 -0.975 -0.013 -0.761 -1.014 -0.285 0.121 +1.436 -1.685 -0.262 -1.695 -1.518 -0.778 0.121 +-0.407 -1.430 0.465 1.325 2.218 1.502 -1.082 +-0.341 -1.132 0.483 1.871 2.631 1.574 -1.082 +-0.229 -1.097 0.696 1.374 2.459 1.596 -1.082 +-0.046 -0.423 0.641 1.903 2.559 1.510 -1.082 +-1.290 -3.087 -0.221 -1.023 0.337 0.269 -1.082 +-0.903 -3.943 -0.675 -0.235 0.180 1.382 -1.082 +-3.161 -8.476 -1.968 0.230 1.354 2.780 -1.082 +-2.337 -4.649 -1.136 0.128 1.025 3.312 -1.082 +-2.576 -4.428 -0.752 1.044 2.334 4.938 -1.082 +-2.979 -4.615 -0.688 1.508 2.872 6.127 -1.082 +-3.726 -5.117 -1.025 1.650 3.229 6.430 -1.082 +-3.977 -5.007 -0.667 2.263 4.009 7.081 -1.082 +-1.964 -2.267 -0.645 4.957 6.852 7.872 -1.082 +-4.857 -5.042 -0.840 2.122 4.457 7.985 -1.082 +-4.282 -4.275 -0.402 2.763 4.697 7.767 -1.082 +-4.406 -4.624 -0.718 1.997 3.974 7.031 -1.082 +-4.382 -4.658 -1.003 1.817 3.530 6.506 -1.082 +-3.825 -4.057 -0.112 2.500 3.892 6.656 -1.082 +-7.345 -8.108 1.010 5.389 4.948 7.080 -1.082 +-2.867 -3.120 -0.355 1.804 2.658 5.146 -1.082 +-2.630 -3.086 -0.441 1.464 2.082 4.341 -1.082 +-2.750 -2.846 -0.525 1.210 1.605 3.284 -1.082 +-1.828 -2.071 -0.103 1.218 1.462 3.146 -1.082 +-1.684 -1.784 -0.889 1.120 1.080 1.533 -1.082 +-1.258 -1.589 -0.421 0.763 0.406 1.258 -1.082 +-1.685 -1.318 -0.581 0.547 -0.100 0.346 -1.082 +-1.129 -0.820 -0.421 0.407 -0.328 -0.441 -1.082 +-1.379 -0.746 -0.746 -0.022 -1.044 -1.584 -1.082 +-1.080 -0.514 -0.755 -0.309 -1.521 -2.321 -1.082 +-1.339 -0.772 -1.046 -0.641 -1.851 -3.364 -1.082 +-0.612 0.019 -0.713 -0.441 -2.106 -3.563 -1.082 +0.269 1.386 -0.940 0.630 -0.756 -3.758 -1.082 +-0.805 0.205 -1.049 -1.102 -2.855 -4.446 -1.082 +-0.773 0.531 -0.988 -1.012 -2.746 -4.392 -1.082 +-0.984 0.382 -1.414 -1.451 -3.457 -5.773 -1.082 +-0.465 0.932 -1.121 -1.232 -3.500 -6.166 -1.082 +-0.136 1.380 -1.095 -1.597 -3.614 -5.506 -1.082 +-0.345 1.168 -1.209 -1.479 -3.549 -4.150 -1.082 +-0.361 1.274 -1.135 -1.655 -3.671 -4.897 -1.082 +0.344 1.816 -0.781 -1.282 -2.552 -3.235 -1.082 +0.594 1.951 -0.818 -1.659 -3.080 -3.837 -1.082 +0.463 2.063 -0.758 -1.400 -2.293 -2.617 -1.082 +0.646 1.520 -0.955 -1.604 -2.520 -2.248 -1.082 +1.323 2.663 -0.154 -0.710 -1.302 -0.901 -1.082 +1.919 3.262 0.281 -0.619 -1.074 -0.662 -1.082 +0.818 2.261 -0.621 -1.331 -1.661 -0.885 -1.082 +1.574 2.755 -0.236 -0.983 -1.446 -0.386 -1.082 +1.629 2.446 -0.136 -0.584 -0.801 0.017 -1.082 +1.498 2.451 -0.236 -0.871 -1.124 -0.400 -1.082 +1.406 2.327 -0.229 -0.610 -0.907 0.068 -1.082 +1.073 2.436 -0.464 -1.262 -1.627 -0.668 -1.082 +0.507 2.039 -0.763 -1.538 -2.019 -1.198 -1.082 +0.824 2.272 -0.773 -1.399 -2.139 -1.544 -1.082 +0.333 2.045 -1.009 -1.714 -2.553 -2.103 -1.082 +0.121 1.843 -1.131 -1.633 -2.730 -2.619 -1.082 +-0.178 1.373 -1.001 -1.189 -2.019 -2.055 -1.082 +-0.100 1.308 -0.907 -0.965 -2.198 -2.134 -1.082 +-1.098 0.674 -1.805 -1.984 -3.340 -3.176 -1.082 +-0.410 1.400 -1.102 -1.209 -2.735 -3.104 -1.082 +-1.431 0.658 -1.943 -2.018 -3.989 -4.644 -1.082 +-1.388 0.687 -1.910 -1.721 -3.457 -4.771 -1.082 +-1.144 0.912 -1.494 -1.175 -3.114 -4.146 -1.082 +-1.485 0.637 -2.009 -1.536 -3.737 -5.042 -1.082 +-2.024 0.073 -1.847 -1.482 -3.087 -3.893 -1.082 +-1.463 0.509 -1.566 -1.264 -2.961 -4.243 -1.082 +-1.798 0.296 -1.578 -0.933 -2.748 -4.238 -1.082 +-1.129 0.426 -1.076 -0.598 -1.857 -3.254 -1.082 +-1.105 0.715 -0.713 -0.031 -1.330 -2.514 -1.082 +-1.292 0.380 -0.785 -0.128 -1.514 -2.665 -1.082 +-1.350 0.335 -0.675 0.271 -0.965 -2.100 -1.082 +-1.910 -0.700 -0.781 -0.663 -1.786 -2.443 -1.082 +-0.070 0.614 -1.065 0.747 -0.103 1.444 -1.082 +7.153 6.366 -0.492 5.169 5.806 4.376 -1.082 +-2.612 -1.679 -0.827 0.411 -0.169 -0.791 -1.082 +-1.126 -0.083 -0.044 1.339 1.442 0.929 -1.082 +-7.309 -5.908 -0.249 -1.556 -2.141 1.112 -1.082 +-1.454 -0.738 0.032 1.840 2.533 2.357 -1.082 +-2.263 -1.470 -0.103 2.077 2.885 3.950 -1.082 +-4.078 -3.351 -1.498 0.729 1.836 3.437 -1.082 +-3.098 -2.476 -0.435 1.687 3.071 4.034 -1.082 +-2.601 -2.152 0.065 2.427 3.991 4.276 -1.082 +-2.981 -2.297 0.143 2.618 4.483 5.225 -1.082 +-3.362 -3.028 -0.170 2.560 4.612 5.459 -1.082 +-3.765 -3.355 -0.191 2.639 5.058 7.902 -1.082 +-2.918 -2.930 -0.108 2.180 4.124 4.237 -1.082 +-1.206 -1.778 -0.158 0.864 1.473 0.634 -1.082 +-2.111 -2.411 -0.116 1.552 2.869 2.672 -1.082 +-2.758 -3.584 -0.458 1.656 3.441 4.549 -1.082 +-2.732 -3.750 -0.698 0.913 2.436 5.249 -1.082 +-2.802 -3.551 -1.380 -0.817 -0.054 1.047 -1.082 +-0.798 -1.268 -0.126 0.317 0.294 -0.677 -1.082 +-0.520 -1.042 0.298 0.851 1.414 0.309 -1.082 +-0.892 -0.912 0.306 1.394 2.023 0.274 -1.082 +-0.557 -0.991 0.468 1.475 2.531 0.976 -1.082 +-0.690 -1.311 0.421 1.526 2.274 0.827 -1.082 +-0.492 -1.242 0.557 1.635 2.328 1.540 -1.082 +-0.251 1.187 -0.290 -0.003 -0.630 -0.414 9.410 +-0.492 1.110 -0.094 0.558 0.480 0.363 9.410 +-0.712 -0.735 -0.112 0.190 0.844 0.195 9.410 +-0.412 -0.927 -0.175 0.135 0.608 0.770 9.410 +-1.302 -2.279 -0.969 -0.690 -0.299 -0.510 9.410 +-1.260 -1.701 -0.690 0.098 0.123 -0.465 9.410 +-0.401 0.474 0.169 0.298 0.499 0.336 9.410 +-0.329 0.727 -0.218 -0.256 -0.251 0.087 9.410 +-2.849 -1.437 -0.674 0.697 1.929 3.277 6.741 +-0.303 -0.644 -0.582 -1.082 -1.697 -2.738 6.741 +-1.566 -1.480 -1.284 -1.582 -2.608 -3.972 6.741 +-2.539 -0.771 0.077 1.671 2.723 4.279 6.741 diff --git a/SRT/Configuration/CDB/alma/AS/LT_lut_20240917_2.txt b/SRT/Configuration/CDB/alma/AS/LT_lut_20240917_2.txt new file mode 100644 index 000000000..0096d74d6 --- /dev/null +++ b/SRT/Configuration/CDB/alma/AS/LT_lut_20240917_2.txt @@ -0,0 +1,1116 @@ +2.136 1.633 -0.073 -0.996 -1.839 -2.895 -13.865 +4.214 3.170 0.400 -1.968 -3.217 -2.809 -13.865 +2.304 1.589 0.126 -1.226 -1.788 -2.646 -13.865 +2.336 1.895 0.157 -0.961 -1.018 -2.205 -13.865 +1.523 1.443 -0.112 -1.064 -0.742 -1.785 -13.865 +1.223 1.058 -0.153 -0.723 -0.943 -1.169 -13.865 +0.966 0.564 -0.244 -0.668 -1.075 -0.508 -13.865 +1.139 0.467 0.002 -0.166 -1.125 0.416 -13.865 +0.531 -0.388 0.010 -0.735 -0.671 0.733 -13.865 +0.684 -0.325 -0.001 -0.329 0.356 1.191 -13.865 +0.493 -0.331 0.034 -0.284 0.933 1.464 -13.865 +0.651 -0.281 0.134 -0.200 1.153 1.633 -13.865 +0.813 0.069 0.234 -0.059 0.961 1.589 -13.865 +0.640 -0.191 0.050 -0.219 0.685 1.305 -13.865 +0.768 0.085 0.129 -0.527 0.474 1.202 -13.865 +0.868 -0.029 0.191 -0.469 0.335 2.903 -13.865 +1.064 0.336 0.118 -0.370 -0.166 0.704 -13.865 +1.243 0.361 0.051 -0.721 -0.420 -0.243 -13.865 +1.696 0.589 0.167 -0.559 -0.737 -0.581 -13.865 +2.120 1.347 0.448 -0.411 -0.961 -1.322 -13.865 +2.229 1.237 0.287 -0.693 -1.085 -1.542 -13.865 +2.136 1.730 0.330 -0.835 -1.386 -2.381 -13.865 +1.875 1.615 -0.086 -1.383 -2.024 -2.879 -13.865 +2.319 1.920 0.193 -1.022 -1.896 -2.832 -13.865 +2.561 3.262 0.185 -1.470 -2.385 -3.886 -5.247 +4.737 4.860 0.575 -2.711 -5.013 -3.569 -5.247 +2.276 2.406 0.092 -1.030 -2.390 -3.140 -5.247 +2.296 1.946 0.329 -1.111 -1.636 -2.675 -5.247 +2.040 1.723 0.040 -0.773 -1.211 -2.286 -5.247 +1.792 1.128 -0.012 -0.809 -0.968 -1.535 -5.247 +1.303 0.745 0.106 -0.253 -0.395 -0.471 -5.247 +0.623 0.097 0.034 -0.770 -0.055 0.350 -5.247 +1.106 0.480 0.210 0.012 0.999 1.203 -5.247 +0.860 0.032 0.554 -0.067 1.902 1.928 -5.247 +1.101 -0.338 0.466 0.439 1.571 2.527 -5.247 +0.872 -0.324 0.469 0.569 1.267 2.701 -5.247 +0.724 -0.551 0.390 0.116 1.521 2.697 -5.247 +0.463 -0.946 0.104 -0.009 1.182 2.006 -5.247 +0.852 -0.609 0.209 0.069 0.928 2.075 -5.247 +0.581 0.120 0.105 -0.181 0.639 1.175 -5.247 +0.363 -0.302 0.233 -0.257 0.185 1.493 -5.247 +1.648 0.538 0.327 -0.126 -0.299 -0.050 -5.247 +2.082 0.876 -0.053 -0.815 -0.936 -1.445 -5.247 +2.915 0.322 0.297 -0.780 -1.220 0.189 -5.247 +2.305 1.616 0.187 -1.449 -2.142 -2.685 -5.247 +2.486 1.950 0.121 -0.975 -1.863 -3.294 -5.247 +2.833 2.429 0.331 -1.320 -2.130 -2.499 -5.247 +2.711 2.444 0.134 -1.387 -2.379 -3.930 -5.247 +2.624 3.215 0.327 -1.450 -2.252 -4.120 0.619 +3.062 3.404 0.217 -1.461 -2.640 -4.253 0.619 +3.532 3.872 0.468 -1.386 -2.586 -4.062 0.619 +6.036 6.138 0.430 -3.589 -5.988 -4.577 0.619 +3.376 3.813 0.460 -1.225 -2.499 -3.704 0.619 +2.645 2.648 0.166 -1.398 -2.422 -3.515 0.619 +2.654 2.984 0.443 -1.143 -1.501 -3.034 0.619 +2.571 2.613 0.066 -1.213 -1.137 -3.040 0.619 +2.464 2.562 0.384 -0.886 -1.399 -2.603 0.619 +3.629 2.934 0.983 -0.354 -0.983 -2.186 0.619 +2.462 2.019 0.551 -0.683 -0.788 -2.538 0.619 +1.896 1.504 0.190 -0.583 -0.779 -1.385 0.619 +1.715 1.467 0.488 -0.331 -0.137 -0.561 0.619 +1.126 0.735 0.032 -0.587 -0.216 -0.420 0.619 +1.339 0.807 0.256 -0.359 0.331 0.497 0.619 +1.235 0.491 0.376 0.195 0.847 1.300 0.619 +1.256 0.501 0.590 0.308 1.002 1.590 0.619 +1.083 0.448 0.430 0.263 1.257 1.387 0.619 +1.046 0.239 0.535 0.656 1.549 2.352 0.619 +0.801 -0.389 0.320 0.400 1.438 2.412 0.619 +0.791 -0.284 0.530 0.361 1.679 2.862 0.619 +0.713 -0.536 0.438 0.471 1.764 2.818 0.619 +0.976 -0.681 0.577 0.591 2.087 3.439 0.619 +0.602 -1.206 0.311 0.449 1.829 2.942 0.619 +0.746 -1.098 0.615 0.598 2.044 3.367 0.619 +0.229 -1.414 0.012 0.145 2.102 2.963 0.619 +0.425 -1.158 0.367 0.374 1.811 3.322 0.619 +0.993 -0.610 0.467 0.705 2.383 3.811 0.619 +1.169 -0.507 1.067 1.065 2.152 3.552 0.619 +0.322 -1.122 0.090 0.229 1.561 2.355 0.619 +0.439 -1.441 -0.129 -0.106 0.875 1.680 0.619 +0.450 -1.076 -0.096 -0.465 -0.963 1.690 0.619 +0.239 -0.950 -0.044 -0.184 0.324 2.511 0.619 +0.992 -0.041 0.380 0.049 0.656 0.184 0.619 +1.212 0.288 0.405 0.090 0.427 -0.043 0.619 +1.319 0.512 0.260 0.130 -0.132 0.123 0.619 +1.695 0.786 0.666 -0.113 -0.087 -0.316 0.619 +2.121 0.962 0.495 -0.161 -0.708 -0.689 0.619 +1.959 1.435 0.470 -0.475 -0.764 -1.595 0.619 +2.452 1.663 0.500 -0.934 -1.457 -2.708 0.619 +2.693 1.958 0.674 -0.514 -1.074 -2.221 0.619 +2.699 1.906 0.219 -1.428 -1.983 -2.325 0.619 +3.013 2.805 0.666 -0.688 -1.539 -2.565 0.619 +2.663 3.045 0.382 -1.139 -2.065 -3.269 0.619 +2.654 2.553 0.201 -1.405 -2.396 -3.873 0.619 +3.038 2.808 0.267 -1.666 -2.873 -4.313 0.619 +2.920 3.009 0.216 -1.577 -2.208 -4.394 0.619 +2.977 2.907 0.053 -1.878 -2.867 -4.474 0.619 +3.293 3.478 0.192 -1.869 -3.211 -5.034 5.121 +3.702 3.828 0.399 -1.588 -2.819 -4.915 5.121 +3.594 3.854 0.295 -1.625 -3.226 -4.718 5.121 +7.164 7.496 0.792 -3.552 -5.610 -4.981 5.121 +3.153 3.497 0.212 -1.612 -2.953 -4.574 5.121 +3.419 4.268 0.270 -1.275 -2.383 -3.972 5.121 +3.475 3.341 0.308 -1.340 -2.155 -3.640 5.121 +2.292 2.795 0.121 -1.585 -2.197 -3.981 5.121 +3.089 3.105 0.706 -0.770 -1.521 -2.943 5.121 +2.680 2.510 0.464 -1.012 -1.677 -2.890 5.121 +0.604 1.969 0.047 -0.939 -1.511 -2.268 5.121 +1.886 1.325 -0.157 -0.980 -1.165 -1.552 5.121 +1.130 1.622 0.071 -0.636 -0.655 -0.690 5.121 +1.285 0.889 0.187 -0.230 0.265 0.772 5.121 +1.142 0.585 0.217 0.034 0.393 0.749 5.121 +0.769 0.416 0.208 0.107 0.828 1.594 5.121 +1.016 0.115 0.539 0.453 1.468 2.122 5.121 +1.066 -0.006 0.690 0.718 1.721 2.770 5.121 +0.805 -0.763 0.592 0.405 1.688 2.700 5.121 +0.692 0.350 0.519 0.630 1.879 3.371 5.121 +0.953 -0.899 0.374 0.575 1.964 3.371 5.121 +0.411 -0.464 0.651 0.798 2.365 4.217 5.121 +0.339 -1.296 0.411 1.194 2.365 3.904 5.121 +0.680 -1.341 0.684 0.597 2.641 4.122 5.121 +0.574 -1.466 0.358 0.535 2.267 4.032 5.121 +0.281 -1.746 0.348 0.676 2.319 3.861 5.121 +0.437 -1.479 0.445 0.763 2.418 3.758 5.121 +0.624 -1.226 0.792 0.965 2.528 3.892 5.121 +0.166 -1.782 0.065 0.625 1.916 3.549 5.121 +0.154 -2.303 -0.156 0.002 1.280 2.748 5.121 +0.739 -1.045 0.184 0.601 1.053 2.828 5.121 +0.390 -1.423 0.266 0.562 1.245 2.236 5.121 +0.174 -1.590 -0.188 -0.398 0.484 1.076 5.121 +-0.027 -0.812 -0.085 0.280 0.487 1.091 5.121 +0.492 -0.683 -0.103 -0.438 -0.006 0.431 5.121 +1.091 -0.015 0.305 -0.199 0.114 0.114 5.121 +1.294 0.453 0.333 -0.246 -1.642 -0.366 5.121 +1.461 0.639 0.141 -0.711 -1.311 -1.490 5.121 +2.055 0.880 0.283 -0.836 -1.197 -2.051 5.121 +2.497 1.642 0.441 -0.721 -1.199 -2.430 5.121 +2.297 1.756 0.215 -1.279 -1.417 -3.038 5.121 +3.128 3.190 0.801 -0.776 -1.493 -2.911 5.121 +2.827 2.605 0.389 -1.353 -2.271 -3.507 5.121 +3.046 3.067 0.138 -1.585 -3.625 -4.046 5.121 +3.841 3.316 0.509 -1.438 -2.724 -4.148 5.121 +3.442 3.427 0.350 -1.711 -3.133 -4.971 5.121 +3.179 3.201 0.065 -2.098 -3.452 -5.246 5.121 +3.424 3.572 0.254 -1.528 -3.121 -4.992 5.121 +3.682 4.102 0.635 -1.427 -2.878 -4.953 7.938 +3.532 4.031 0.321 -1.734 -3.383 -5.165 7.938 +3.541 3.859 0.063 -2.109 -3.816 -5.492 7.938 +7.140 7.688 0.361 -3.426 -7.138 -5.577 7.938 +3.029 3.555 -0.123 -1.913 -3.865 -5.170 7.938 +2.792 3.425 0.035 -1.689 -2.871 -4.383 7.938 +2.499 2.783 0.167 -1.386 -2.374 -3.433 7.938 +2.032 2.567 -0.155 -1.588 -2.456 -3.468 7.938 +2.253 2.742 0.077 -1.141 -2.133 -3.081 7.938 +1.760 2.373 -0.112 -1.232 -2.281 -3.203 7.938 +2.132 1.845 -0.180 -1.411 -1.820 -2.568 7.938 +1.333 1.674 0.082 -0.714 -0.990 -1.046 7.938 +1.034 0.767 -0.019 -0.847 0.317 -0.461 7.938 +0.627 0.598 0.009 -0.354 0.039 0.164 7.938 +0.565 0.327 0.091 -0.196 0.422 0.566 7.938 +0.610 -0.187 0.062 -0.129 0.694 1.047 7.938 +0.651 0.016 0.221 0.188 1.044 1.467 7.938 +0.086 -0.867 0.022 -0.081 0.838 1.469 7.938 +0.618 -0.400 0.445 0.770 1.660 2.429 7.938 +0.324 -1.327 0.335 0.547 1.726 3.198 7.938 +0.725 -0.610 0.716 0.506 2.209 3.974 7.938 +1.453 -0.262 0.450 0.848 2.473 4.207 7.938 +0.307 -1.289 0.542 0.557 2.310 4.166 7.938 +0.229 -1.552 0.567 0.748 2.396 4.239 7.938 +0.568 -1.668 0.286 0.636 2.330 4.122 7.938 +0.294 -1.747 0.632 0.670 2.100 3.655 7.938 +0.056 -1.941 0.294 0.515 1.781 3.248 7.938 +-0.055 -2.066 -0.143 0.370 1.564 2.845 7.938 +0.185 -1.803 0.466 0.650 2.097 3.194 7.938 +-0.072 -1.663 -0.108 0.698 1.431 2.763 7.938 +-0.130 -1.987 -0.200 0.210 0.874 1.279 7.938 +0.019 -1.802 -0.089 -0.817 0.943 1.773 7.938 +-0.067 -1.329 -0.071 0.387 0.726 1.279 7.938 +0.182 -1.451 -0.202 -0.649 0.577 1.088 7.938 +0.506 -0.786 -0.028 -0.088 0.349 0.551 7.938 +-0.222 -0.527 0.075 -0.169 0.038 0.108 7.938 +1.318 0.284 0.209 -0.296 -0.370 -0.070 7.938 +1.417 0.604 0.133 -0.592 -0.993 -1.448 7.938 +2.240 1.467 0.614 -0.488 -1.191 -2.174 7.938 +2.316 1.598 0.262 -0.921 -1.793 -2.690 7.938 +1.973 1.670 0.308 -1.149 -1.876 -2.742 7.938 +2.319 2.154 0.321 -1.088 -1.873 -2.998 7.938 +2.431 2.325 -0.218 -1.305 -2.526 -3.223 7.938 +2.529 2.346 -0.136 -1.767 -3.096 -4.350 7.938 +3.489 3.462 0.476 -1.440 -3.014 -4.427 7.938 +3.547 3.445 0.170 -2.033 -3.603 -5.339 7.938 +3.459 3.501 0.082 -1.952 -3.354 -5.629 7.938 +3.342 4.140 0.328 -1.701 -3.255 -5.208 7.938 +3.327 3.828 0.291 -2.086 -3.446 -4.991 9.587 +3.118 3.659 0.033 -1.926 -3.573 -5.357 9.587 +3.488 4.188 0.317 -1.415 -2.955 -5.112 9.587 +5.831 6.749 -0.001 -4.096 -6.860 -5.288 9.587 +2.344 3.228 -0.086 -1.530 -2.814 -4.600 9.587 +2.447 3.171 0.168 -1.082 -2.307 -3.450 9.587 +2.059 3.027 0.131 -0.993 -1.776 -3.065 9.587 +1.848 2.911 0.136 -1.100 -1.809 -2.681 9.587 +1.882 2.540 0.105 -0.786 -1.527 -2.654 9.587 +1.619 2.115 -0.064 -1.116 -1.614 -2.794 9.587 +0.973 1.521 -0.123 -0.879 -1.027 -2.141 9.587 +1.045 1.449 0.157 -0.474 -0.481 -1.062 9.587 +0.648 0.780 -0.114 -0.523 -0.562 -0.635 9.587 +0.268 0.322 -0.036 -0.672 0.037 -0.435 9.587 +0.480 0.280 0.022 -0.703 0.413 0.465 9.587 +0.629 0.017 0.302 0.364 0.974 1.335 9.587 +0.145 -0.384 0.105 -0.036 1.149 1.339 9.587 +0.422 0.168 0.428 0.674 1.644 2.200 9.587 +0.155 -0.980 0.263 0.087 1.484 2.197 9.587 +0.635 -0.491 0.816 0.672 2.168 3.596 9.587 +0.867 -0.978 0.634 0.684 2.123 3.968 9.587 +0.542 -1.211 0.659 0.313 2.310 3.935 9.587 +0.227 -1.731 0.341 0.694 2.408 4.038 9.587 +0.459 -1.749 0.578 0.571 2.474 4.499 9.587 +0.615 -1.343 0.815 1.214 2.967 3.818 9.587 +0.346 -1.796 0.103 0.739 2.126 3.430 9.587 +-0.072 -2.109 0.150 0.334 1.643 2.852 9.587 +-0.282 -2.231 0.044 0.237 1.201 2.535 9.587 +-0.335 -2.314 -0.471 0.039 0.998 2.140 9.587 +-0.152 -1.894 0.153 0.837 1.690 2.392 9.587 +-0.425 -2.435 -0.558 -0.439 0.591 1.779 9.587 +-0.363 -2.102 -0.466 -0.173 0.482 1.500 9.587 +-0.379 -1.868 -0.489 -0.363 0.509 1.030 9.587 +-0.642 -1.308 -0.254 -0.188 0.355 0.185 9.587 +0.327 -0.787 0.312 0.176 0.877 0.204 9.587 +0.549 -0.335 0.189 0.015 0.171 0.220 9.587 +0.810 0.003 0.185 0.019 -0.278 -0.595 9.587 +1.073 0.295 0.248 -0.355 -0.744 -1.031 9.587 +1.772 1.109 0.480 -0.206 -0.733 -1.248 9.587 +1.757 1.312 0.311 -0.606 -1.473 -2.147 9.587 +2.199 1.952 0.608 -0.347 -1.258 -1.822 9.587 +1.927 2.275 0.358 -0.609 -1.468 -2.269 9.587 +2.108 2.281 0.431 -0.759 -1.792 -2.615 9.587 +2.367 2.456 0.128 -0.851 -2.398 -3.423 9.587 +2.757 2.922 0.398 -1.243 -2.563 -3.898 9.587 +3.229 3.327 0.210 -1.420 -3.162 -4.777 9.587 +3.267 3.686 0.380 -1.748 -3.264 -4.893 9.587 +3.217 3.733 0.209 -1.775 -3.187 -5.109 9.587 +3.216 3.682 0.184 -1.577 -3.080 -4.889 10.270 +2.776 3.409 -0.027 -1.872 -3.336 -4.816 10.270 +3.079 3.761 0.208 -1.550 -3.054 -4.694 10.270 +3.304 3.883 -0.025 -1.343 -3.297 -5.098 10.270 +5.139 6.228 -0.039 -4.149 -6.885 -4.898 10.270 +3.888 5.014 0.239 -2.037 -3.174 -4.754 10.270 +5.615 7.063 0.202 -3.102 -5.670 -4.366 10.270 +2.225 3.529 -0.419 -2.145 -3.545 -4.784 10.270 +1.801 3.120 -0.234 -1.431 -2.477 -3.889 10.270 +1.782 2.800 -0.140 -1.119 -2.155 -3.750 10.270 +1.729 2.673 -0.065 -0.912 -1.934 -3.244 10.270 +1.554 2.650 0.078 -0.742 -1.384 -3.468 10.270 +1.325 2.547 0.020 -0.624 -1.513 -2.261 10.270 +1.090 2.341 -0.483 -0.957 -1.786 -2.556 10.270 +1.284 2.152 0.011 -0.712 -0.604 -2.028 10.270 +0.767 1.633 -0.561 -1.196 -1.674 -3.123 10.270 +1.683 1.993 -0.143 -0.871 -1.263 -2.294 10.270 +2.006 3.143 0.474 -0.393 -0.846 -1.472 10.270 +1.128 1.904 -0.055 -0.757 -1.200 -2.258 10.270 +1.529 1.328 -0.363 -0.978 -1.357 -1.996 10.270 +0.893 1.524 -0.207 -0.470 -1.034 -1.865 10.270 +0.790 2.278 -0.049 -0.627 -0.626 -1.657 10.270 +0.839 1.214 0.005 -0.394 -0.541 -1.174 10.270 +0.712 0.911 0.045 0.690 -0.418 -0.507 10.270 +0.463 0.041 0.072 -0.162 -0.301 -0.281 10.270 +0.474 0.944 0.103 -0.056 -0.127 -0.048 10.270 +0.729 0.885 0.150 0.040 0.336 0.475 10.270 +0.898 1.225 0.260 1.076 0.378 0.867 10.270 +0.762 0.548 0.248 0.017 0.672 0.378 10.270 +0.544 0.204 0.265 0.215 0.649 2.746 10.270 +-0.231 -0.565 -0.138 -0.312 0.823 0.456 10.270 +-0.367 -0.724 -0.174 0.081 0.557 1.403 10.270 +0.113 -0.038 0.090 0.166 0.640 1.019 10.270 +-0.158 -0.551 0.156 0.036 1.427 1.071 10.270 +-0.289 -0.891 0.012 0.152 0.998 1.489 10.270 +0.115 -0.528 0.403 0.765 1.428 1.790 10.270 +0.294 -0.089 0.343 0.436 2.113 0.628 10.270 +0.068 -0.918 0.276 0.396 1.718 2.135 10.270 +0.057 -0.744 0.268 0.336 1.484 2.391 10.270 +-0.123 -1.266 0.105 0.040 1.255 2.876 10.270 +0.529 -0.890 0.689 1.051 2.143 3.745 10.270 +0.532 -0.955 0.705 0.995 2.286 3.747 10.270 +0.138 -1.512 0.452 0.610 2.085 3.447 10.270 +0.449 -1.114 0.448 0.774 2.357 3.613 10.270 +0.383 -1.022 0.591 1.036 2.677 4.044 10.270 +0.430 -1.626 0.317 0.399 2.138 3.383 10.270 +0.467 -1.302 0.750 0.882 2.845 4.448 10.270 +0.868 -1.129 0.588 0.744 2.687 4.195 10.270 +0.755 -1.511 0.719 1.048 2.504 3.963 10.270 +0.512 -1.799 0.664 0.736 2.306 3.350 10.270 +0.349 -1.525 0.450 0.805 2.414 3.003 10.270 +0.283 -1.581 0.274 0.774 2.208 2.842 10.270 +-0.021 -2.047 -0.140 0.356 1.512 2.592 10.270 +-0.291 -2.374 -0.297 0.072 1.191 2.196 10.270 +-0.544 -2.489 -0.226 0.059 1.096 1.914 10.270 +-0.614 -2.345 -0.231 0.128 0.995 1.871 10.270 +-0.638 -2.642 -0.470 -0.142 0.595 1.566 10.270 +-0.796 -2.700 -0.671 -0.116 0.896 1.368 10.270 +-0.887 -2.740 -0.669 -0.370 0.519 1.735 10.270 +-1.207 -2.991 -0.832 -0.374 0.471 0.999 10.270 +-0.399 -2.485 -0.784 -0.155 0.425 1.947 10.270 +-0.858 -2.408 -0.537 -0.057 0.343 0.862 10.270 +-0.865 -2.464 -0.631 -0.389 0.159 0.689 10.270 +-1.010 -2.225 -0.580 -0.315 0.139 0.535 10.270 +-0.648 -1.363 -0.188 0.196 0.623 -0.489 10.270 +-0.746 -2.289 -0.431 -0.239 0.059 0.819 10.270 +-0.379 -1.666 -0.346 -0.093 0.362 0.589 10.270 +-0.215 -1.445 -0.189 -0.083 0.071 0.543 10.270 +-0.040 -0.858 0.017 0.123 0.311 0.338 10.270 +-0.019 -0.816 0.063 0.023 0.102 0.125 10.270 +-0.006 -1.000 -0.238 -0.362 -0.249 -0.105 10.270 +2.243 0.932 2.389 1.334 1.440 0.739 10.270 +0.190 -0.329 -0.213 -0.175 -0.565 -0.273 10.270 +0.806 0.249 0.411 0.076 -0.116 -0.296 10.270 +0.398 0.280 -0.159 -0.433 -0.877 -1.224 10.270 +0.677 0.266 -0.128 -0.521 -0.946 -1.111 10.270 +1.152 0.872 0.443 -0.106 -0.575 -0.972 10.270 +1.382 0.992 0.173 -0.410 -0.872 -1.285 10.270 +1.344 1.255 0.332 -0.229 -0.860 -1.266 10.270 +1.536 1.401 0.228 -1.060 -1.046 -1.496 10.270 +1.176 1.011 0.068 -0.544 -1.240 -1.612 10.270 +0.836 0.893 -0.264 -1.279 -1.036 -2.038 10.270 +1.348 1.533 0.319 -0.491 -1.069 -1.589 10.270 +1.633 1.930 0.573 -0.605 -0.301 -1.573 10.270 +1.448 2.237 0.348 -0.117 -1.194 -1.755 10.270 +1.991 2.500 0.621 -0.193 -0.940 -2.276 10.270 +1.763 2.112 0.192 -0.626 -1.814 -2.548 10.270 +2.259 2.752 0.430 -0.757 -1.547 -2.645 10.270 +2.115 2.839 0.285 -1.047 -1.968 -3.205 10.270 +2.142 2.535 -0.132 -1.680 -2.935 -4.123 10.270 +2.431 2.831 0.105 -1.661 -2.270 -4.390 10.270 +2.833 3.015 0.004 -1.921 -3.363 -4.754 10.270 +2.967 3.208 0.146 -1.577 -3.092 -4.974 10.270 +2.895 3.371 0.057 -1.854 -3.015 -4.860 10.270 +2.958 3.421 0.145 -1.514 -3.161 -4.810 10.270 +3.245 3.746 0.179 -1.075 -3.188 -5.118 10.270 +3.134 3.412 0.189 -1.931 -3.030 -4.494 10.174 +3.016 2.821 -0.226 -1.825 -3.357 -4.659 10.174 +2.825 3.152 0.063 -1.560 -2.940 -4.980 10.174 +2.751 3.150 -0.113 -1.821 -3.125 -4.450 10.174 +4.675 5.500 -0.265 -4.139 -6.595 -4.659 10.174 +1.984 2.694 -0.419 -1.995 -3.473 -4.383 10.174 +4.147 6.142 -0.127 -2.952 -5.360 -3.779 10.174 +1.881 2.561 -0.150 -1.303 -2.320 -3.473 10.174 +1.616 2.404 -0.223 -1.134 -1.586 -3.028 10.174 +0.945 2.282 -0.362 -0.970 -1.703 -2.636 10.174 +0.972 2.091 -0.016 -0.384 -1.013 -1.988 10.174 +0.825 2.222 0.209 -0.147 -0.437 -1.003 10.174 +0.196 1.554 -0.412 -1.247 -0.884 -1.566 10.174 +0.961 1.851 0.159 -0.091 -0.134 -0.645 10.174 +0.578 1.816 -0.057 0.292 -0.414 -0.895 10.174 +0.487 0.826 -0.280 -0.715 -0.536 -1.424 10.174 +0.165 0.995 -0.784 -1.153 -1.199 -1.602 10.174 +0.667 1.408 -0.251 0.014 -0.835 -1.423 10.174 +0.783 1.541 -0.069 -0.332 -0.813 -1.291 10.174 +0.834 1.272 0.025 -0.242 -0.761 -0.890 10.174 +0.598 1.355 0.037 -0.006 -0.252 -0.578 10.174 +0.024 0.852 -0.090 -0.160 -0.490 -0.477 10.174 +0.399 1.270 0.034 -0.303 -0.098 -0.550 10.174 +0.197 0.575 -0.123 -0.060 -0.207 -0.445 10.174 +0.763 0.714 -0.039 0.588 -0.160 -0.652 10.174 +-0.170 0.920 -0.225 -0.083 0.110 -0.001 10.174 +-0.021 0.512 -0.167 -0.012 0.261 1.923 10.174 +0.290 0.441 0.102 0.259 0.701 0.193 10.174 +-0.075 0.125 -0.012 0.494 0.537 0.435 10.174 +-0.086 0.302 0.249 -0.067 1.019 0.486 10.174 +-0.433 -0.456 0.049 0.111 0.487 0.875 10.174 +0.229 -0.241 0.020 0.037 0.937 0.854 10.174 +-0.414 -0.598 0.175 0.273 0.767 1.014 10.174 +0.283 0.084 0.466 1.020 1.328 1.232 10.174 +-0.471 -0.849 0.309 0.686 1.265 0.860 10.174 +-0.008 -0.656 0.292 0.857 1.324 1.288 10.174 +-0.445 -1.163 -0.056 0.129 0.704 1.179 10.174 +0.147 -0.933 0.064 0.228 1.249 1.577 10.174 +-0.365 -1.017 0.190 0.260 1.216 1.690 10.174 +0.878 -0.401 0.632 0.906 1.599 2.653 10.174 +0.328 -1.096 0.424 0.235 1.507 3.948 10.174 +0.067 -1.083 0.401 0.759 1.925 4.025 10.174 +0.120 -0.811 0.402 1.201 2.274 3.617 10.174 +-0.064 -1.600 0.168 0.540 2.054 3.330 10.174 +0.871 -1.116 0.608 0.759 2.708 3.258 10.174 +0.271 -1.408 0.486 0.760 2.707 3.903 10.174 +0.250 -1.808 0.199 0.385 1.955 1.963 10.174 +0.398 -1.846 0.652 0.981 2.448 3.932 10.174 +0.387 -1.592 0.457 0.379 2.347 3.911 10.174 +0.468 -1.450 0.321 0.481 2.182 3.742 10.174 +0.307 -1.746 0.357 0.774 1.984 3.374 10.174 +-0.080 -1.993 0.274 0.254 1.730 2.657 10.174 +-0.034 -1.698 0.056 0.450 1.811 2.273 10.174 +-0.071 -1.918 -0.093 0.272 1.335 2.037 10.174 +-0.510 -2.442 -0.380 -0.053 0.846 1.659 10.174 +-0.851 -2.836 -0.652 -0.343 0.564 1.120 10.174 +-1.036 -2.701 -0.575 -0.107 0.593 1.125 10.174 +-1.067 -2.691 -0.863 -0.526 0.193 0.928 10.174 +-1.238 -3.048 -0.480 -0.227 0.702 0.972 10.174 +-1.115 -2.530 -0.724 -0.515 0.119 1.195 10.174 +-1.160 -2.581 -0.795 -0.247 -0.048 0.208 10.174 +-1.474 -2.751 -0.988 -0.773 -0.210 0.815 10.174 +-1.469 -2.449 -0.958 -0.275 -0.125 0.159 10.174 +-1.172 -3.167 -0.693 0.191 0.210 0.149 10.174 +-1.026 -2.006 -0.667 -0.298 0.050 0.182 10.174 +-1.069 -1.828 -0.372 -0.522 -0.179 0.581 10.174 +-1.110 -2.775 -0.605 -0.286 -0.592 0.613 10.174 +-1.210 -1.747 -0.510 -0.318 -0.270 0.027 10.174 +-0.551 -1.471 -0.315 -0.069 -0.104 -0.106 10.174 +-0.308 -0.874 -0.136 -0.524 -0.041 -0.271 10.174 +-0.108 -0.784 0.594 0.138 0.304 0.388 10.174 +13.121 13.467 2.070 14.011 13.573 8.356 10.174 +0.048 -0.243 0.288 0.080 -0.095 -0.099 10.174 +0.226 -0.313 -0.048 0.232 -0.163 -0.240 10.174 +0.361 0.107 -0.295 0.267 -0.190 -0.178 10.174 +0.519 0.445 0.335 0.293 -0.100 -0.299 10.174 +0.404 0.140 0.134 -0.058 -0.217 -0.615 10.174 +0.475 0.563 0.222 -0.022 -0.440 -0.706 10.174 +0.793 0.897 0.212 -0.117 -0.512 -0.503 10.174 +0.754 1.245 0.431 0.025 -0.436 -0.771 10.174 +1.160 1.304 0.436 0.075 0.650 -0.276 10.174 +1.037 1.063 0.354 0.434 -1.031 -0.788 10.174 +0.626 1.213 0.364 -0.738 -0.139 -0.506 10.174 +0.515 0.874 0.099 -0.291 -0.742 -0.685 10.174 +0.471 1.180 0.089 -0.197 -0.051 -0.682 10.174 +0.901 1.564 0.282 -0.300 -0.634 -0.882 10.174 +0.926 1.813 0.318 -0.374 -0.467 -1.260 10.174 +1.335 1.948 0.231 -0.532 -0.907 -1.490 10.174 +1.706 2.235 0.106 -0.916 -1.523 -2.032 10.174 +1.427 3.216 0.159 -1.893 -2.028 -2.882 10.174 +1.526 2.295 -0.031 -1.574 -2.647 -3.527 10.174 +2.384 2.729 0.040 -1.538 -2.683 -4.108 10.174 +2.483 2.855 0.203 -1.626 -2.874 -4.123 10.174 +2.647 3.081 0.081 -1.660 -3.042 -4.554 10.174 +2.671 2.795 -0.202 -1.881 -3.270 -4.897 10.174 +2.599 3.058 -0.128 -1.828 -3.237 -4.947 10.174 +2.529 2.586 -0.108 -1.698 -3.144 -4.397 9.410 +2.647 2.651 -0.116 -1.752 -3.066 -4.656 9.410 +2.286 2.316 -0.370 -1.599 -3.079 -4.146 9.410 +2.498 2.666 -0.178 -1.597 -3.104 -4.510 9.410 +3.817 4.381 -0.111 -3.507 -6.321 -3.940 9.410 +2.075 2.888 -0.333 -1.365 -2.772 -3.872 9.410 +3.314 4.574 -0.453 -2.365 -4.448 -3.112 9.410 +1.645 2.181 -0.212 -0.929 -1.905 -3.051 9.410 +1.218 1.910 -0.221 -0.387 -1.474 -2.100 9.410 +0.188 2.139 -0.581 -1.350 -1.379 -1.746 9.410 +0.098 1.603 -0.247 -0.127 -0.258 -0.617 9.410 +0.292 1.025 -0.194 0.017 -0.198 -0.330 9.410 +-0.181 1.301 -0.148 0.147 0.365 0.262 9.410 +-0.411 0.935 -0.371 -0.171 -0.213 -0.520 9.410 +-0.188 0.979 -0.298 -0.330 1.104 -0.265 9.410 +-0.062 1.047 -0.200 0.098 0.050 -0.298 9.410 +-0.099 1.320 -0.109 0.054 0.094 -0.152 9.410 +0.068 1.007 -0.588 -0.285 -0.506 -0.507 9.410 +0.280 1.041 0.161 0.550 -0.017 -0.356 9.410 +0.600 1.250 -0.046 0.078 -0.313 -0.586 9.410 +-0.969 0.178 -0.681 -0.298 -0.591 -0.962 9.410 +0.248 1.015 -0.098 0.102 -0.066 -0.428 9.410 +-0.032 0.544 -0.340 0.055 -0.178 0.132 9.410 +0.483 0.713 0.147 0.516 0.152 0.215 9.410 +-0.215 0.711 -0.048 0.153 0.156 1.585 9.410 +0.628 0.416 0.014 -0.224 0.347 0.117 9.410 +-0.144 0.152 -0.037 0.227 0.277 -0.478 9.410 +-0.080 0.372 0.057 0.473 0.361 0.165 9.410 +0.090 0.368 0.062 0.335 0.473 0.146 9.410 +-0.452 -0.158 -0.202 0.143 0.298 0.511 9.410 +-0.358 0.037 0.061 0.126 0.694 0.354 9.410 +-0.159 -0.211 0.235 0.453 0.705 0.638 9.410 +-0.237 0.240 -0.263 -0.680 0.661 0.077 9.410 +-0.729 -1.105 -0.406 0.144 0.236 -0.847 9.410 +-0.477 -0.722 -0.079 0.829 0.582 -0.051 9.410 +-0.904 -1.031 -0.423 -0.193 -0.004 0.293 9.410 +0.181 -0.937 -0.132 -0.015 0.329 1.207 9.410 +-0.349 -1.210 -0.589 -0.039 0.323 0.144 9.410 +-0.305 -0.841 0.101 0.240 1.038 0.839 9.410 +0.772 -0.717 0.211 -0.079 1.327 1.869 9.410 +0.663 -0.943 0.298 0.637 1.697 2.185 9.410 +0.660 -0.873 0.277 0.650 1.799 2.689 9.410 +0.299 -1.028 0.411 0.528 1.694 3.182 9.410 +0.744 -0.919 0.350 0.840 2.130 3.672 9.410 +0.349 -1.019 0.464 0.572 1.946 3.175 9.410 +0.801 -0.918 0.637 0.849 2.109 3.876 9.410 +0.953 -0.964 0.761 1.250 2.763 3.573 9.410 +0.173 -1.286 0.198 0.392 1.836 3.740 9.410 +0.174 -1.480 0.265 0.350 2.012 3.301 9.410 +0.304 -1.353 0.325 1.193 2.026 3.104 9.410 +-0.080 -1.746 0.179 0.306 1.823 2.843 9.410 +0.079 -1.723 0.112 0.357 1.639 2.774 9.410 +-0.307 -2.235 0.051 -0.037 1.221 2.398 9.410 +-0.509 -1.925 -0.195 0.033 1.301 1.842 9.410 +-0.230 -1.974 -0.394 -0.026 0.882 1.447 9.410 +-0.661 -2.426 -0.449 -0.171 0.482 1.076 9.410 +-1.140 -2.630 -1.033 -1.056 -0.439 0.204 9.410 +-1.332 -2.678 -0.986 -0.741 -0.111 -0.005 9.410 +-1.435 -2.192 -0.968 -0.776 -0.177 -0.110 9.410 +-1.209 -2.347 -0.904 -1.145 -0.752 -0.378 9.410 +-0.881 -2.206 -0.905 -0.955 -0.816 -0.746 9.410 +-1.552 -2.454 -1.072 -0.916 -0.538 -0.589 9.410 +-0.846 -1.727 -1.043 0.246 0.396 -0.676 9.410 +-1.513 -2.553 -0.830 -0.698 -0.654 -0.330 9.410 +-1.485 -2.322 -1.141 -0.811 -0.673 -0.992 9.410 +-0.602 -1.810 -0.549 -0.234 -0.171 0.032 9.410 +-1.393 -1.772 -0.853 -0.551 -0.624 -0.381 9.410 +-0.813 -1.383 -0.324 0.306 -0.092 0.124 9.410 +-0.835 -1.655 -0.387 -0.253 -0.174 -0.282 9.410 +-0.430 -0.911 -0.251 -0.276 0.096 -0.349 9.410 +-0.209 -0.612 -0.371 0.230 -0.133 -0.275 9.410 +-0.655 -1.172 0.745 0.359 0.917 -0.153 9.410 +-0.295 -0.524 -0.082 0.167 -0.068 0.015 9.410 +-0.316 -0.187 -0.570 0.047 -0.176 0.123 9.410 +-14.085 -13.855 -2.077 -12.968 -12.856 -12.639 9.410 +-0.294 -0.947 -0.672 -0.129 -0.417 -0.348 9.410 +-0.169 0.039 0.044 -0.041 -0.148 -0.150 9.410 +0.254 1.009 0.185 0.167 -0.020 0.010 9.410 +0.137 0.650 0.328 0.299 -0.056 -0.034 9.410 +0.963 1.399 0.339 0.241 0.041 0.317 9.410 +0.080 -0.394 0.136 0.253 0.123 0.158 9.410 +0.188 1.063 0.161 -0.026 0.070 0.285 9.410 +-0.073 0.674 0.119 0.305 -0.010 0.463 9.410 +-0.107 0.671 -0.021 -0.268 0.053 0.239 9.410 +-0.263 0.562 0.052 0.863 0.361 0.906 9.410 +-0.270 0.754 -0.068 -0.247 -0.310 0.103 9.410 +-0.018 0.896 -0.233 -0.515 -0.486 -0.265 9.410 +0.605 1.389 0.119 -0.501 -0.777 -0.883 9.410 +0.960 1.815 0.062 -0.707 -0.898 -1.365 9.410 +1.576 2.005 0.088 -1.191 -1.007 -2.302 9.410 +1.768 2.396 0.109 -1.164 -1.895 -2.554 9.410 +1.913 2.122 -0.197 -1.695 -2.702 -3.715 9.410 +2.356 3.080 0.353 -1.227 -2.420 -3.467 9.410 +2.527 2.661 0.022 -1.617 -3.001 -4.210 9.410 +1.741 2.275 -0.377 -2.427 -3.214 -4.599 9.410 +2.570 2.667 0.128 -1.393 -2.697 -3.711 9.410 +2.201 1.542 -0.423 -1.731 -2.901 -3.831 8.262 +2.161 2.073 -0.197 -1.619 -2.448 -3.906 8.262 +2.262 1.917 -0.373 -1.788 -2.931 -4.185 8.262 +1.947 1.954 -0.188 -1.368 -2.580 -3.710 8.262 +3.682 3.935 -0.097 -1.304 -4.626 -3.357 8.262 +1.519 1.868 -0.195 -1.098 -2.141 -2.926 8.262 +2.308 2.417 -1.023 -2.307 -3.739 -2.865 8.262 +1.177 1.039 -0.376 -0.766 -1.539 -2.157 8.262 +0.358 1.156 -0.408 -0.391 -1.100 -1.442 8.262 +-0.240 0.582 -0.390 -0.246 -0.547 -0.207 8.262 +-0.898 0.485 -0.499 -0.204 -0.168 -0.034 8.262 +-0.890 0.335 -0.154 0.664 0.737 0.652 8.262 +0.072 1.282 -0.116 1.745 2.087 1.546 8.262 +-0.671 0.663 0.029 0.300 1.127 1.112 8.262 +-0.427 0.676 -0.004 0.785 0.676 1.140 8.262 +-1.928 0.154 -0.417 0.203 0.442 -0.470 8.262 +-0.955 0.379 -0.358 0.295 0.251 -0.137 8.262 +-0.770 0.591 -0.165 0.411 0.071 0.141 8.262 +-0.782 1.233 -0.367 0.962 0.325 0.349 8.262 +-0.475 0.470 -0.169 0.120 0.316 0.250 8.262 +-0.247 0.367 -0.225 0.316 0.322 0.823 8.262 +-0.417 0.551 -0.002 0.687 0.577 0.390 8.262 +-0.298 0.685 -0.391 0.055 0.348 -0.124 8.262 +-0.035 0.935 -0.154 1.101 0.857 0.050 8.262 +-0.116 0.275 -0.100 0.977 0.292 -0.003 8.262 +-0.457 0.029 -0.226 0.205 0.134 -0.300 8.262 +-0.510 -0.094 -0.355 0.191 0.241 0.479 8.262 +-0.583 -0.070 -0.118 0.145 -0.020 -0.234 8.262 +-0.257 0.246 -0.103 0.019 0.638 -0.247 8.262 +-0.233 -0.034 0.036 0.213 0.665 -0.143 8.262 +-0.840 -0.434 -0.164 0.387 0.194 0.063 8.262 +-1.251 -0.287 -0.316 -0.066 0.208 -0.299 8.262 +-0.241 -0.423 -0.094 0.073 0.126 -0.377 8.262 +-1.091 -0.863 -0.338 0.230 0.217 -0.229 8.262 +-0.564 -0.421 -0.345 0.125 -0.321 -0.272 8.262 +-0.466 -1.297 -0.246 -0.495 -0.465 -0.747 8.262 +-0.725 -0.902 -0.509 0.035 0.158 -0.908 8.262 +-0.439 -0.865 -0.420 -0.442 0.507 -0.548 8.262 +-0.097 -0.628 -0.206 0.160 0.630 0.336 8.262 +0.428 -0.145 0.172 0.734 0.874 1.379 8.262 +0.149 -0.232 0.062 0.873 0.886 1.663 8.262 +0.422 -0.344 0.371 1.260 1.369 2.313 8.262 +0.554 -0.008 0.422 0.822 1.668 1.835 8.262 +0.266 -0.300 0.192 0.399 1.957 2.542 8.262 +0.347 -0.700 0.272 0.477 1.461 2.791 8.262 +0.474 -0.800 0.300 0.372 1.545 3.521 8.262 +0.369 -0.995 0.179 0.215 1.462 2.757 8.262 +0.014 -1.009 0.279 0.538 1.862 2.537 8.262 +0.282 -1.213 0.108 -0.640 1.251 2.719 8.262 +-0.022 -1.555 0.070 0.280 1.529 3.448 8.262 +-0.451 -1.689 -0.424 0.114 1.108 2.192 8.262 +-0.130 -1.619 -0.109 0.307 1.155 2.528 8.262 +-0.065 -1.487 -0.045 0.204 1.261 2.024 8.262 +-0.180 -1.800 -0.477 -0.507 0.612 1.824 8.262 +-0.617 -2.005 -0.580 -0.454 0.305 0.877 8.262 +-0.987 -2.027 -0.756 -0.166 0.051 0.345 8.262 +-1.320 -2.237 -1.050 -0.533 -0.444 -0.171 8.262 +-1.148 -1.758 -0.816 -0.706 -0.665 -1.038 8.262 +-2.098 -2.006 -1.096 -1.053 -0.977 -2.005 8.262 +-1.247 -2.028 -1.248 -1.364 -0.581 -1.744 8.262 +-1.311 -2.087 -0.981 -1.478 -1.594 -1.934 8.262 +-1.906 -2.145 -1.079 -1.056 -1.171 -1.795 8.262 +-1.340 -1.625 -0.735 -0.857 -0.462 -1.023 8.262 +-1.662 -1.888 -0.827 -0.519 -0.552 -0.803 8.262 +-1.228 -1.765 -0.865 -0.618 -0.743 -0.982 8.262 +-1.118 -1.366 -0.528 -0.374 -0.189 -0.436 8.262 +-0.922 -1.210 -0.397 -0.061 -0.208 -0.444 8.262 +-0.627 -0.689 -0.230 0.153 0.042 -0.262 8.262 +-1.078 -1.255 -0.481 -0.106 -0.448 -0.790 8.262 +-0.427 -0.836 -0.001 0.403 0.201 -0.101 8.262 +-0.545 -0.651 -0.084 0.451 0.237 0.093 8.262 +-0.909 -1.612 -0.026 0.156 0.060 -0.675 8.262 +-0.397 0.248 0.060 0.604 0.483 0.282 8.262 +0.035 0.023 0.318 0.913 0.755 0.358 8.262 +-0.686 -0.671 -0.817 0.345 -0.144 0.202 8.262 +0.066 0.211 0.398 0.813 0.945 0.785 8.262 +-0.034 -0.674 0.135 0.601 0.525 1.076 8.262 +-0.147 -0.050 0.330 0.575 0.442 0.832 8.262 +-0.224 0.403 0.238 0.566 0.529 1.021 8.262 +-0.651 -0.632 0.202 0.482 0.444 0.855 8.262 +0.013 0.175 0.202 0.583 0.847 1.312 8.262 +-0.755 -0.144 -0.005 0.414 0.569 1.020 8.262 +-0.797 0.024 0.036 0.401 0.915 1.607 8.262 +-0.829 0.249 0.248 0.842 1.514 1.879 8.262 +-1.271 -0.026 0.213 0.701 1.339 2.104 8.262 +-0.748 0.500 0.106 0.865 1.400 1.820 8.262 +-0.346 0.579 0.137 0.199 0.393 1.536 8.262 +-0.940 0.489 -0.240 -0.268 0.082 0.056 8.262 +0.455 0.855 -0.050 -0.339 -0.492 -0.487 8.262 +1.403 1.227 -0.061 -0.687 -1.177 -1.252 8.262 +1.367 1.444 -0.024 -0.925 -1.453 -1.768 8.262 +0.857 1.923 -0.509 -1.472 -2.598 -3.131 8.262 +1.565 1.789 -0.427 -1.509 -2.645 -3.357 8.262 +2.096 1.837 -0.205 -1.707 -2.607 -2.770 8.262 +2.272 2.056 -0.063 -1.437 -2.662 -3.542 8.262 +2.109 2.094 -0.318 -1.655 -2.735 -3.910 8.262 +1.992 1.458 -0.439 -1.551 -2.744 -3.743 6.741 +1.775 1.008 -0.489 -1.776 -2.900 -3.673 6.741 +1.408 0.981 -0.527 -1.731 -2.677 -3.487 6.741 +1.591 0.612 -0.479 -1.780 -2.915 -3.847 6.741 +3.325 2.429 -0.489 -2.285 -3.936 -1.946 6.741 +0.743 0.628 -0.772 -1.950 -2.456 -3.005 6.741 +1.606 1.103 -0.940 -1.714 -3.080 -1.942 6.741 +0.240 0.057 -0.760 -0.928 -1.515 -1.563 6.741 +-0.497 -0.283 -0.811 -0.978 -1.057 -1.011 6.741 +-0.952 -0.244 -0.659 0.047 -0.151 -0.156 6.741 +-1.266 -0.506 -0.733 0.290 0.158 1.144 6.741 +-1.562 -0.316 -0.179 0.928 1.261 2.131 6.741 +-1.782 -0.509 -0.149 0.881 1.656 2.794 6.741 +-1.799 -0.411 -0.191 1.660 1.569 2.032 6.741 +-1.632 -0.542 -0.224 0.751 1.270 1.581 6.741 +-1.619 -0.341 -0.468 0.383 0.694 0.381 6.741 +-1.170 -0.054 -0.049 0.833 1.223 1.543 6.741 +-1.285 -0.438 -0.372 0.354 0.567 0.226 6.741 +-1.796 -0.210 -0.186 0.763 1.653 1.219 6.741 +-1.035 -0.578 -0.430 0.464 0.372 1.216 6.741 +-0.533 0.151 0.038 0.870 0.843 1.278 6.741 +-0.681 0.130 -0.160 0.632 0.529 1.178 6.741 +-0.909 -0.290 -0.121 0.660 0.421 0.450 6.741 +0.048 0.584 -0.189 1.255 1.034 0.425 6.741 +-0.733 -0.071 -0.254 0.353 0.275 0.234 6.741 +-0.700 -0.225 -0.244 0.455 0.339 -0.067 6.741 +-0.066 0.984 0.741 1.289 0.937 0.288 6.741 +10.982 10.578 5.089 13.247 12.113 6.727 6.741 +-0.979 -0.421 -0.481 -0.227 -0.525 -0.642 6.741 +-0.349 0.068 -0.146 0.466 -0.181 -0.523 6.741 +-0.531 -0.161 -0.074 0.161 0.110 -0.832 6.741 +-0.802 0.088 -0.268 0.175 0.135 -0.515 6.741 +-0.717 -0.369 -0.341 0.313 -0.120 -1.152 6.741 +-0.848 -0.685 -0.389 -0.156 -0.311 -0.500 6.741 +-1.002 -1.124 -0.539 -0.696 -0.853 -1.366 6.741 +-0.990 -0.420 -0.661 -0.472 -0.761 -2.028 6.741 +-0.757 -1.268 -0.803 -1.236 -0.717 -2.345 6.741 +-0.200 -0.273 -0.499 -0.317 -0.610 -1.301 6.741 +-0.465 -0.338 -0.530 -0.398 -0.791 -0.122 6.741 +-0.285 -0.274 -0.337 -0.296 -0.180 -0.037 6.741 +0.144 -0.317 -0.278 -0.030 0.090 0.896 6.741 +0.356 0.019 0.409 0.704 1.307 1.203 6.741 +0.211 -0.271 0.167 1.255 1.303 1.715 6.741 +0.700 -0.314 0.469 1.255 1.616 2.471 6.741 +1.278 0.278 0.589 0.647 1.431 2.380 6.741 +0.277 -0.212 0.486 0.801 1.615 2.338 6.741 +1.152 -0.261 0.358 0.457 1.311 2.323 6.741 +1.484 -0.237 0.335 0.274 1.407 2.543 6.741 +-0.361 -1.219 -0.010 0.067 0.997 2.123 6.741 +-0.216 -0.801 -0.134 -0.219 1.127 2.039 6.741 +-0.064 -1.394 -0.274 -0.301 0.529 1.277 6.741 +-0.555 -1.312 -0.281 -0.524 0.723 0.734 6.741 +-0.506 -1.040 -0.225 0.146 0.631 1.393 6.741 +-0.367 -1.349 -0.514 -0.358 0.404 1.180 6.741 +-0.496 -1.189 -0.386 -0.689 0.057 0.269 6.741 +-1.322 -1.756 -0.820 -0.807 -0.487 -0.764 6.741 +-0.927 -0.952 -0.873 -0.633 -0.855 -1.263 6.741 +-1.244 -1.784 -1.150 -1.220 -1.540 -1.845 6.741 +-0.954 -1.519 -0.905 -1.204 -1.356 -2.207 6.741 +-0.883 -1.132 -0.941 -0.790 -1.548 -2.382 6.741 +-1.879 -2.551 -1.710 -2.059 -2.692 -3.058 6.741 +-1.993 -2.216 -1.473 -1.563 -1.808 -3.022 6.741 +-1.544 -1.460 -1.033 -0.402 -1.200 -1.913 6.741 +-1.682 -1.204 -1.048 -0.924 -1.166 -1.293 6.741 +-1.645 -1.414 -1.097 -0.819 -1.328 -1.820 6.741 +-0.656 -0.499 -0.237 0.173 -0.292 -1.280 6.741 +-0.705 -0.875 -0.561 -0.154 -0.627 -0.899 6.741 +-1.314 -1.292 -0.609 -0.243 -0.648 -1.086 6.741 +-0.949 -0.952 -0.256 0.171 -0.383 -0.847 6.741 +-0.693 -0.932 -0.133 0.308 -0.020 -0.156 6.741 +-0.693 -0.672 0.013 0.160 -0.146 -0.433 6.741 +9.838 10.099 5.821 11.953 11.369 5.582 6.741 +-0.385 -0.002 0.493 0.662 0.432 0.543 6.741 +-0.608 -0.414 -0.005 0.677 0.564 0.463 6.741 +-0.353 -0.122 0.382 0.939 0.564 0.900 6.741 +-0.832 -0.493 0.001 0.642 0.468 1.410 6.741 +-0.365 -0.091 0.176 0.463 0.886 1.447 6.741 +-0.524 -0.263 -0.126 0.973 0.778 1.816 6.741 +0.011 0.318 0.574 1.379 0.905 2.106 6.741 +-0.878 -0.463 -0.078 0.583 0.792 1.754 6.741 +-1.594 -0.908 -0.261 0.440 0.894 1.826 6.741 +-1.284 0.192 -0.028 0.603 1.058 2.176 6.741 +-1.620 -0.632 -0.047 0.803 1.688 2.480 6.741 +-1.610 -0.596 -0.106 0.787 1.622 2.916 6.741 +-1.005 -0.634 -0.245 1.303 2.099 3.515 6.741 +-3.183 -0.997 -0.128 0.745 1.167 2.863 6.741 +-1.006 -0.291 -0.096 0.430 1.389 1.705 6.741 +-0.537 0.153 -0.110 -0.064 0.208 1.198 6.741 +-0.136 -0.077 -0.291 -0.356 -0.367 0.164 6.741 +0.084 0.278 -0.550 -0.839 -0.665 -0.710 6.741 +0.572 0.814 -0.434 -1.039 -1.732 -1.445 6.741 +1.054 0.833 -0.451 -1.129 -2.123 -2.436 6.741 +1.312 0.882 -0.560 -1.271 -2.240 -2.506 6.741 +1.475 1.302 -0.390 -1.640 -2.937 -3.472 6.741 +1.411 0.731 -0.819 -1.991 -2.954 -3.552 6.741 +1.926 1.397 -0.456 -1.831 -2.779 -3.473 6.741 +1.689 0.611 -0.194 -1.148 -2.098 -2.462 4.839 +1.110 0.394 -0.337 -1.343 -2.221 -2.574 4.839 +1.453 0.375 -0.282 -1.430 -2.187 -2.616 4.839 +0.588 -0.295 -0.796 -1.704 -2.410 -2.713 4.839 +1.742 0.045 -0.317 -2.339 -3.494 -1.986 4.839 +0.143 -0.859 -0.894 -1.233 -1.553 -1.729 4.839 +0.403 -0.317 -0.491 -0.926 -1.369 -0.795 4.839 +0.354 -0.598 -0.480 -0.395 -0.397 0.102 4.839 +-1.098 -0.851 -0.707 -0.163 -0.032 0.665 4.839 +-1.643 -1.136 -0.535 0.196 0.922 1.950 4.839 +-2.106 -1.314 -0.726 0.694 1.067 2.327 4.839 +-2.029 -1.219 -0.246 1.306 2.158 3.725 4.839 +-0.626 0.448 -0.491 3.496 4.742 4.035 4.839 +-2.847 -1.811 -0.512 1.234 2.262 3.793 4.839 +-2.596 -1.559 -0.514 1.148 2.128 3.090 4.839 +-2.020 -1.173 -0.237 1.318 1.923 2.841 4.839 +-1.874 -1.134 -0.210 1.184 1.828 2.628 4.839 +-1.382 -0.729 -0.184 0.960 1.305 2.714 4.839 +-5.742 -4.033 -0.354 1.542 0.734 2.134 4.839 +-1.617 -0.897 -0.309 0.846 1.260 1.726 4.839 +-1.292 -1.199 -0.077 0.913 1.090 1.723 4.839 +-1.101 -0.427 0.013 1.095 1.277 1.191 4.839 +-0.878 -0.144 0.034 1.475 0.873 1.047 4.839 +0.089 0.545 -0.099 2.235 1.623 0.815 4.839 +-1.089 -0.416 -0.155 0.608 0.532 1.288 4.839 +-1.047 0.210 -0.129 0.711 0.329 0.532 4.839 +-1.466 0.054 -0.016 0.732 0.411 -0.476 4.839 +-0.680 0.212 0.339 0.827 0.428 -0.118 4.839 +-0.424 -0.021 -0.253 0.460 -0.060 -0.487 4.839 +-1.287 -0.529 -0.480 -0.090 -0.284 -1.063 4.839 +-1.151 -0.413 -0.651 -0.262 -1.103 -1.453 4.839 +-0.832 0.129 -0.468 0.659 0.014 -1.473 4.839 +-1.092 0.120 -0.379 -0.120 -0.769 -1.305 4.839 +-0.749 -0.324 -0.265 0.034 -0.535 -1.580 4.839 +-0.554 -0.019 -0.445 0.036 -1.036 -1.897 4.839 +-1.142 -0.478 -0.960 -1.124 -1.510 -3.102 4.839 +-0.272 0.592 -0.358 -0.675 -1.498 -2.747 4.839 +0.558 -0.203 -0.495 -0.144 -1.047 -2.044 4.839 +-0.391 0.096 -0.601 -0.467 -0.992 -1.481 4.839 +-0.361 0.023 -0.204 -0.106 -0.704 -0.092 4.839 +0.886 0.450 0.017 -0.161 0.143 0.223 4.839 +-0.155 -0.062 -0.467 0.335 0.082 0.028 4.839 +0.330 0.406 -0.181 0.237 0.370 0.964 4.839 +0.303 0.215 0.334 0.477 1.136 1.713 4.839 +0.682 0.460 0.498 0.490 1.681 1.936 4.839 +1.082 1.093 0.324 0.403 1.284 2.714 4.839 +1.120 0.975 0.763 0.767 1.260 2.259 4.839 +0.045 -0.306 0.611 0.437 1.308 2.091 4.839 +0.928 0.733 0.296 0.417 1.101 2.219 4.839 +-0.481 -0.658 -0.169 0.258 0.147 1.747 4.839 +-0.166 -0.190 -0.265 -0.515 0.286 1.209 4.839 +-0.130 -0.308 -0.099 -0.240 0.419 1.942 4.839 +0.453 0.408 0.277 0.191 0.922 1.551 4.839 +-0.561 -0.650 -0.532 -0.755 -0.131 0.311 4.839 +-0.829 -0.705 -0.737 -0.938 -0.765 -0.585 4.839 +-1.200 -0.807 -0.833 -0.949 -0.934 -1.195 4.839 +-0.639 -0.796 -0.874 -1.200 -1.398 -2.285 4.839 +-0.652 -1.068 -0.944 -1.063 -1.542 -2.387 4.839 +-1.213 -1.128 -1.136 -1.362 -2.080 -2.938 4.839 +-1.604 -1.420 -1.394 -1.508 -2.365 -3.681 4.839 +-1.432 -1.073 -1.197 -1.349 -2.318 -3.940 4.839 +-2.129 -1.168 -1.281 -1.250 -2.289 -3.621 4.839 +-1.649 -1.220 -1.112 -1.259 -2.064 -3.192 4.839 +-1.720 -0.995 -0.906 -0.342 -1.473 -2.548 4.839 +-0.979 -0.394 -0.466 -0.024 -1.053 -2.098 4.839 +-1.593 -0.902 -0.859 -0.574 -0.554 -1.853 4.839 +-0.536 0.047 -0.134 0.174 -0.448 -1.390 4.839 +-0.787 -0.300 -0.390 0.106 -0.582 -1.298 4.839 +-1.041 -0.755 -0.461 0.096 -0.539 -1.130 4.839 +-0.899 -0.650 -0.041 0.245 -0.250 -0.602 4.839 +-1.029 -0.329 -0.442 0.775 -0.073 -0.093 4.839 +-13.084 -11.733 -6.502 -9.981 -10.535 -5.617 4.839 +-0.597 -0.351 -0.223 0.810 0.545 0.583 4.839 +-0.393 0.186 0.793 1.176 1.176 1.389 4.839 +-1.152 -0.042 0.401 1.249 1.076 1.464 4.839 +-0.602 -0.365 0.476 1.316 1.383 1.513 4.839 +-1.507 -0.460 -0.002 1.178 1.939 2.216 4.839 +-11.786 -12.160 -4.904 -14.646 -14.961 0.835 4.839 +-1.461 -0.961 -0.196 1.041 1.481 2.818 4.839 +-1.600 -0.449 0.360 1.292 1.807 3.419 4.839 +-1.628 -0.717 0.330 1.477 2.222 3.599 4.839 +-1.769 -0.548 0.403 1.566 2.599 3.802 4.839 +-1.959 -1.005 0.147 1.515 2.697 4.112 4.839 +-2.254 -0.904 0.106 1.687 3.404 4.703 4.839 +-2.512 -1.366 -0.124 1.413 2.878 4.745 4.839 +-2.310 -1.475 -0.274 0.965 2.298 3.952 4.839 +-1.754 -0.975 -0.152 0.688 1.811 3.309 4.839 +-1.271 -0.958 -0.213 0.617 1.248 2.423 4.839 +-0.806 -0.606 -0.203 0.197 0.719 1.791 4.839 +-0.230 -0.284 -0.144 0.266 -0.117 0.840 4.839 +0.478 -0.119 -0.135 -0.502 -0.428 0.124 4.839 +0.148 -0.091 -0.595 -1.083 -1.239 -1.449 4.839 +1.102 0.237 -0.344 -1.196 -1.510 -1.679 4.839 +1.015 0.412 -0.159 -1.090 -1.589 -1.513 4.839 +1.572 0.740 -0.172 -1.253 -1.921 -2.274 4.839 +1.779 0.803 0.004 -0.935 -2.097 -2.024 4.839 +1.487 -0.338 -0.292 -1.251 -2.089 -1.812 2.659 +1.361 -0.348 -0.381 -0.925 -1.816 -2.057 2.659 +1.225 -0.543 -0.442 -1.410 -1.859 -1.358 2.659 +1.370 -0.440 -0.175 -0.780 -1.343 -1.345 2.659 +-0.890 -3.642 -0.414 -3.730 -4.459 -0.793 2.659 +0.501 -0.833 -0.150 -0.307 -0.901 -0.240 2.659 +-0.372 -2.287 -1.397 -0.844 -0.797 0.568 2.659 +-1.067 -1.529 -0.600 -0.299 -0.070 0.562 2.659 +-1.221 -1.736 -0.480 0.138 0.855 2.273 2.659 +-1.859 -1.918 -0.523 0.747 1.509 2.971 2.659 +-2.564 -2.435 -0.761 0.685 1.662 3.404 2.659 +-2.678 -2.454 -0.572 1.540 2.534 4.194 2.659 +-3.006 -2.389 -0.415 1.736 3.068 5.120 2.659 +-3.050 -2.387 -0.340 1.844 3.092 4.945 2.659 +-2.303 -2.159 -0.095 1.866 3.004 4.646 2.659 +-2.665 -2.168 -0.364 1.454 2.203 3.731 2.659 +-2.035 -1.604 -0.143 1.519 2.507 4.192 2.659 +-2.020 -1.454 -0.132 1.396 2.188 3.659 2.659 +-4.447 -3.767 -0.346 2.616 2.474 3.131 2.659 +-1.744 -1.063 -0.091 1.267 1.729 2.621 2.659 +-1.475 -1.158 0.099 1.351 1.920 2.198 2.659 +-1.539 -1.316 -0.297 1.048 1.219 1.847 2.659 +-0.900 -0.640 -0.021 1.085 1.094 0.929 2.659 +-0.392 0.200 -0.343 1.851 1.768 1.192 2.659 +-1.054 -0.634 -0.294 0.663 0.006 0.634 2.659 +-1.393 -0.683 -0.340 0.433 0.345 -0.029 2.659 +-1.181 -0.528 -0.311 0.382 0.096 0.018 2.659 +-1.083 -0.541 -0.383 0.064 -0.346 -0.898 2.659 +-0.973 -0.292 -0.419 -0.107 -0.571 -1.154 2.659 +-0.217 -0.197 -0.232 0.641 -0.521 -1.336 2.659 +-1.708 -0.878 -1.032 -0.237 -1.257 -1.952 2.659 +-0.705 0.527 -0.553 0.252 -0.820 -1.877 2.659 +-0.531 -0.027 -0.331 -0.136 -1.122 -2.302 2.659 +-0.550 0.528 -0.063 0.190 -0.841 -2.108 2.659 +-0.812 -0.147 -0.680 -0.554 -1.843 -2.954 2.659 +-0.046 0.385 -0.463 -0.381 -1.870 -3.826 2.659 +-0.195 0.236 -0.603 -0.930 -2.163 -2.899 2.659 +-0.415 0.379 -0.666 -0.741 -2.030 -1.803 2.659 +-0.302 0.327 -0.534 -0.665 -1.489 -2.498 2.659 +0.308 0.797 -0.265 -0.229 -1.108 -1.417 2.659 +-4.731 -3.859 -3.090 -4.974 -5.523 0.137 2.659 +1.025 1.227 0.047 -0.284 -0.033 -0.169 2.659 +0.589 1.029 -0.058 -0.116 -0.879 -0.309 2.659 +0.415 0.971 -0.129 -0.071 0.033 0.980 2.659 +1.195 1.540 0.264 0.034 0.003 0.964 2.659 +0.801 0.756 0.199 -0.126 0.515 1.144 2.659 +1.225 1.441 0.558 0.282 0.644 1.650 2.659 +0.969 1.919 0.382 0.322 0.943 2.296 2.659 +1.118 1.311 0.521 -0.110 0.358 1.833 2.659 +0.898 1.838 0.389 -0.135 0.646 2.159 2.659 +0.617 0.724 0.051 0.013 -0.078 1.294 2.659 +0.786 0.887 0.110 -0.281 0.000 0.933 2.659 +0.444 0.594 -0.197 -0.923 -0.482 0.703 2.659 +0.091 0.290 -0.340 -0.572 -0.303 -0.227 2.659 +-0.330 0.025 -0.838 -1.298 -1.560 -1.721 2.659 +-0.485 -0.092 -0.885 -1.299 -1.611 -1.742 2.659 +-0.267 0.062 -0.939 -1.236 -1.998 -2.490 2.659 +-0.878 -0.316 -1.086 -1.418 -2.381 -3.394 2.659 +-0.948 -0.382 -1.252 -1.437 -2.759 -3.756 2.659 +-1.312 -0.391 -1.107 -1.625 -2.918 -3.958 2.659 +-1.147 -0.316 -1.410 -1.028 -3.142 -4.666 2.659 +-1.562 -0.545 -1.613 -1.760 -3.231 -4.846 2.659 +-1.713 -0.736 -1.629 -1.757 -3.131 -4.689 2.659 +-1.689 -0.685 -1.195 -1.180 -1.882 -3.707 2.659 +-1.333 -0.461 -0.998 -0.814 -2.052 -3.375 2.659 +-1.217 -0.363 -0.657 -0.274 -1.334 -2.684 2.659 +-1.097 -0.042 -0.544 -0.232 -1.313 -2.168 2.659 +-0.941 -0.101 -0.341 0.042 -0.574 -1.965 2.659 +-0.346 0.110 -0.044 0.215 -0.363 -1.432 2.659 +-0.764 0.211 0.019 0.963 -0.142 -0.436 2.659 +-0.527 0.355 0.407 0.633 0.044 -0.026 2.659 +9.128 10.538 5.102 12.060 11.367 5.679 2.659 +-0.438 0.216 0.678 1.109 0.822 1.160 2.659 +-0.522 0.401 0.426 1.708 1.210 1.614 2.659 +-0.162 -0.030 0.734 1.647 1.824 2.305 2.659 +-4.210 -2.694 0.364 0.675 1.837 2.251 2.659 +-0.466 0.252 0.901 2.348 2.446 3.044 2.659 +-1.107 -0.688 0.215 2.178 2.283 3.128 2.659 +-0.879 -0.238 0.711 2.076 2.727 3.722 2.659 +-2.019 -1.193 0.059 1.365 2.237 3.689 2.659 +-2.253 -1.330 0.112 1.420 2.413 4.686 2.659 +-2.092 -1.534 0.118 1.559 2.828 4.462 2.659 +-2.407 -1.365 0.139 1.791 3.211 5.632 2.659 +-2.817 -1.738 -0.012 1.748 3.493 5.991 2.659 +-2.618 -1.602 0.163 1.920 3.717 5.811 2.659 +-2.655 -1.795 -0.203 1.450 2.841 5.003 2.659 +-1.896 -1.389 0.098 1.554 2.508 4.750 2.659 +-1.485 -1.426 0.100 1.095 2.223 3.953 2.659 +-0.875 -1.167 -0.098 0.743 1.469 3.378 2.659 +-0.140 -0.821 -0.028 0.547 0.792 1.852 2.659 +-0.046 -0.101 -0.157 -0.133 0.217 1.655 2.659 +0.506 -0.786 -0.311 -0.596 -0.489 0.034 2.659 +0.912 0.195 -0.031 -0.530 -0.623 -0.131 2.659 +1.400 -0.091 0.003 -0.866 -1.207 -1.019 2.659 +1.415 -0.439 -0.251 -0.912 -1.583 -1.384 2.659 +1.481 -0.357 -0.364 -1.210 -2.023 -1.894 2.659 +1.655 -0.940 -0.054 -1.097 -1.030 -1.035 0.121 +1.324 -1.431 -0.262 -0.791 -1.531 -0.980 0.121 +1.571 -1.379 -0.121 -0.596 -1.208 -0.455 0.121 +0.875 -1.114 -0.111 -0.697 -0.528 0.014 0.121 +-1.417 -5.440 -0.046 -2.605 -2.504 0.975 0.121 +0.362 -1.456 -0.077 0.386 0.208 1.132 0.121 +-1.109 -4.836 -0.729 0.376 1.151 2.188 0.121 +-0.896 -2.262 -0.094 0.562 1.206 2.972 0.121 +-1.280 -2.691 -0.259 0.971 1.853 3.987 0.121 +-2.311 -3.045 -0.269 1.487 2.492 4.483 0.121 +-2.475 -3.298 -0.413 1.685 2.897 4.961 0.121 +-2.843 -3.093 -0.337 1.973 3.359 5.799 0.121 +-3.417 -3.488 -0.354 2.122 3.887 6.565 0.121 +-3.494 -3.054 -0.014 2.855 4.248 6.657 0.121 +-3.255 -3.465 -0.285 1.778 3.665 6.315 0.121 +-3.770 -3.629 -0.704 1.579 2.913 5.029 0.121 +-3.154 -2.921 -0.051 2.106 3.301 5.528 0.121 +-2.616 -2.895 -0.212 1.949 2.862 4.934 0.121 +-8.340 -8.057 0.044 3.197 1.657 4.917 0.121 +-2.083 -1.959 -0.097 1.878 2.375 3.996 0.121 +-2.143 -1.825 -0.139 1.586 1.976 3.690 0.121 +-2.051 -1.924 -0.116 1.214 1.515 2.999 0.121 +-1.613 -1.288 -0.143 1.167 1.168 2.114 0.121 +-0.025 0.490 -0.350 2.296 2.346 1.794 0.121 +-1.169 -0.947 -0.312 0.887 0.596 0.998 0.121 +-1.311 -1.095 -0.327 0.654 0.058 0.481 0.121 +-1.039 -0.277 0.013 0.792 0.013 -0.108 0.121 +-1.271 -1.005 -0.518 -0.040 -0.594 -1.001 0.121 +-0.319 -0.264 -0.457 0.216 -0.736 -1.649 0.121 +-0.704 -0.133 -0.537 0.121 -0.977 -1.580 0.121 +-0.578 0.098 -0.418 -0.243 -1.186 -2.637 0.121 +0.473 1.163 -0.623 0.873 -0.296 -3.006 0.121 +-0.413 0.320 -0.522 -0.382 -1.646 -3.662 0.121 +-0.969 0.044 -0.786 -0.591 -1.767 -3.368 0.121 +-0.361 0.787 -0.617 -0.705 -2.325 -4.107 0.121 +-0.223 0.325 -0.930 -1.121 -2.939 -4.675 0.121 +0.278 1.282 -0.693 -1.040 -2.512 -3.857 0.121 +-0.287 0.750 -0.876 -1.019 -2.767 -4.067 0.121 +-0.537 0.304 -1.020 -1.300 -2.880 -3.820 0.121 +-0.274 0.891 -0.634 -0.997 -2.150 -2.675 0.121 +0.737 1.294 -0.668 -1.197 -2.086 -2.610 0.121 +0.708 1.839 0.013 -0.543 -1.187 -1.267 0.121 +1.187 2.537 0.206 -0.311 -0.800 -0.596 0.121 +1.415 1.916 0.377 0.030 -0.378 0.239 0.121 +1.413 1.974 0.052 -0.418 -0.476 0.254 0.121 +1.362 1.935 0.248 -0.003 -0.218 0.941 0.121 +1.586 2.219 0.255 -0.535 -0.353 0.925 0.121 +1.532 2.580 0.645 0.057 0.107 1.449 0.121 +2.250 2.484 0.688 0.075 0.092 1.648 0.121 +1.076 1.995 0.241 -0.226 -0.077 0.911 0.121 +1.504 2.215 0.112 -0.421 -0.555 0.285 0.121 +0.839 1.744 0.053 -0.634 -0.462 0.399 0.121 +0.976 1.633 -0.219 -0.843 -1.182 -0.742 0.121 +-0.146 0.851 -0.761 -1.354 -1.584 -1.854 0.121 +0.346 1.101 -0.562 -1.595 -2.002 -2.075 0.121 +-0.924 0.638 -1.103 -1.612 -2.541 -2.600 0.121 +-0.476 0.710 -1.057 -1.724 -3.275 -3.232 0.121 +-1.088 0.438 -1.408 -1.806 -3.156 -3.868 0.121 +-0.815 0.765 -1.275 -1.802 -3.345 -4.404 0.121 +-1.003 0.512 -1.315 -1.400 -3.262 -4.826 0.121 +-1.245 0.317 -1.475 -1.734 -3.723 -5.264 0.121 +-1.378 0.124 -1.450 -1.530 -3.638 -4.662 0.121 +-0.734 0.708 -1.387 -0.650 -2.859 -4.944 0.121 +-1.801 -0.031 -1.269 -0.875 -2.759 -4.275 0.121 +-1.409 0.705 -0.930 -0.870 -2.445 -4.303 0.121 +-1.237 0.339 -0.653 -0.373 -1.688 -3.305 0.121 +-0.754 0.555 -0.479 0.208 -1.461 -2.786 0.121 +-1.202 -0.234 -0.745 -0.267 -1.131 -2.578 0.121 +-1.051 0.192 -0.613 -0.083 -1.011 -2.256 0.121 +-0.523 0.582 0.298 0.968 -0.048 -1.105 0.121 +-0.933 -0.154 0.473 0.626 -0.252 -1.483 0.121 +11.482 11.469 3.018 11.586 11.551 7.965 0.121 +-0.695 0.799 1.462 1.433 1.574 0.723 0.121 +-0.572 0.032 0.433 1.723 1.221 1.745 0.121 +-0.556 0.436 0.740 1.876 2.118 2.571 0.121 +-5.452 -3.532 0.667 0.081 1.133 2.968 0.121 +-0.937 -0.062 0.524 2.144 2.588 3.384 0.121 +-1.105 -0.526 0.774 2.508 2.979 4.333 0.121 +-1.365 -0.512 0.789 2.781 3.576 5.444 0.121 +-2.110 -1.571 0.084 2.142 2.983 4.796 0.121 +-2.044 -1.295 0.488 1.888 4.133 6.060 0.121 +-2.681 -1.883 0.155 2.172 3.650 6.009 0.121 +-2.567 -1.602 0.414 2.473 4.469 7.059 0.121 +-3.092 -2.159 0.080 2.341 4.299 7.076 0.121 +-3.002 -2.246 0.265 2.326 4.536 6.744 0.121 +-2.532 -2.281 0.417 2.274 4.313 5.943 0.121 +-2.525 -2.591 0.197 1.685 3.795 5.613 0.121 +-2.119 -1.992 0.242 1.664 3.110 5.559 0.121 +-1.466 -1.951 0.014 1.289 2.434 4.410 0.121 +-0.896 -1.552 0.080 0.688 1.618 3.508 0.121 +-0.076 -1.185 0.235 1.092 1.355 3.109 0.121 +0.332 -0.833 0.146 0.204 0.596 1.911 0.121 +0.747 -1.171 0.106 -0.359 0.559 1.175 0.121 +1.005 -1.121 -0.117 -0.506 -0.748 -0.810 0.121 +1.560 -0.975 -0.013 -0.761 -1.014 -0.285 0.121 +1.436 -1.685 -0.262 -1.695 -1.518 -0.778 0.121 +-0.407 -1.430 0.465 1.325 2.218 1.502 -1.082 +-0.341 -1.132 0.483 1.871 2.631 1.574 -1.082 +-0.229 -1.097 0.696 1.374 2.459 1.596 -1.082 +-0.046 -0.423 0.641 1.903 2.559 1.510 -1.082 +-1.290 -3.087 -0.221 -1.023 0.337 0.269 -1.082 +-0.903 -3.943 -0.675 -0.235 0.180 1.382 -1.082 +-3.161 -8.476 -1.968 0.230 1.354 2.780 -1.082 +-2.337 -4.649 -1.136 0.128 1.025 3.312 -1.082 +-2.576 -4.428 -0.752 1.044 2.334 4.938 -1.082 +-2.979 -4.615 -0.688 1.508 2.872 6.127 -1.082 +-3.726 -5.117 -1.025 1.650 3.229 6.430 -1.082 +-3.977 -5.007 -0.667 2.263 4.009 7.081 -1.082 +-1.964 -2.267 -0.645 4.957 6.852 7.872 -1.082 +-4.857 -5.042 -0.840 2.122 4.457 7.985 -1.082 +-4.282 -4.275 -0.402 2.763 4.697 7.767 -1.082 +-4.406 -4.624 -0.718 1.997 3.974 7.031 -1.082 +-4.382 -4.658 -1.003 1.817 3.530 6.506 -1.082 +-3.825 -4.057 -0.112 2.500 3.892 6.656 -1.082 +-7.345 -8.108 1.010 5.389 4.948 7.080 -1.082 +-2.867 -3.120 -0.355 1.804 2.658 5.146 -1.082 +-2.630 -3.086 -0.441 1.464 2.082 4.341 -1.082 +-2.750 -2.846 -0.525 1.210 1.605 3.284 -1.082 +-1.828 -2.071 -0.103 1.218 1.462 3.146 -1.082 +-1.684 -1.784 -0.889 1.120 1.080 1.533 -1.082 +-1.258 -1.589 -0.421 0.763 0.406 1.258 -1.082 +-1.685 -1.318 -0.581 0.547 -0.100 0.346 -1.082 +-1.129 -0.820 -0.421 0.407 -0.328 -0.441 -1.082 +-1.379 -0.746 -0.746 -0.022 -1.044 -1.584 -1.082 +-1.080 -0.514 -0.755 -0.309 -1.521 -2.321 -1.082 +-1.339 -0.772 -1.046 -0.641 -1.851 -3.364 -1.082 +-0.612 0.019 -0.713 -0.441 -2.106 -3.563 -1.082 +0.269 1.386 -0.940 0.630 -0.756 -3.758 -1.082 +-0.805 0.205 -1.049 -1.102 -2.855 -4.446 -1.082 +-0.773 0.531 -0.988 -1.012 -2.746 -4.392 -1.082 +-0.984 0.382 -1.414 -1.451 -3.457 -5.773 -1.082 +-0.465 0.932 -1.121 -1.232 -3.500 -6.166 -1.082 +-0.136 1.380 -1.095 -1.597 -3.614 -5.506 -1.082 +-0.345 1.168 -1.209 -1.479 -3.549 -4.150 -1.082 +-0.361 1.274 -1.135 -1.655 -3.671 -4.897 -1.082 +0.344 1.816 -0.781 -1.282 -2.552 -3.235 -1.082 +0.594 1.951 -0.818 -1.659 -3.080 -3.837 -1.082 +0.463 2.063 -0.758 -1.400 -2.293 -2.617 -1.082 +0.646 1.520 -0.955 -1.604 -2.520 -2.248 -1.082 +1.323 2.663 -0.154 -0.710 -1.302 -0.901 -1.082 +1.919 3.262 0.281 -0.619 -1.074 -0.662 -1.082 +0.818 2.261 -0.621 -1.331 -1.661 -0.885 -1.082 +1.574 2.755 -0.236 -0.983 -1.446 -0.386 -1.082 +1.629 2.446 -0.136 -0.584 -0.801 0.017 -1.082 +1.498 2.451 -0.236 -0.871 -1.124 -0.400 -1.082 +1.406 2.327 -0.229 -0.610 -0.907 0.068 -1.082 +1.073 2.436 -0.464 -1.262 -1.627 -0.668 -1.082 +0.507 2.039 -0.763 -1.538 -2.019 -1.198 -1.082 +0.824 2.272 -0.773 -1.399 -2.139 -1.544 -1.082 +0.333 2.045 -1.009 -1.714 -2.553 -2.103 -1.082 +0.121 1.843 -1.131 -1.633 -2.730 -2.619 -1.082 +-0.178 1.373 -1.001 -1.189 -2.019 -2.055 -1.082 +-0.100 1.308 -0.907 -0.965 -2.198 -2.134 -1.082 +-1.098 0.674 -1.805 -1.984 -3.340 -3.176 -1.082 +-0.410 1.400 -1.102 -1.209 -2.735 -3.104 -1.082 +-1.431 0.658 -1.943 -2.018 -3.989 -4.644 -1.082 +-1.388 0.687 -1.910 -1.721 -3.457 -4.771 -1.082 +-1.144 0.912 -1.494 -1.175 -3.114 -4.146 -1.082 +-1.485 0.637 -2.009 -1.536 -3.737 -5.042 -1.082 +-2.024 0.073 -1.847 -1.482 -3.087 -3.893 -1.082 +-1.463 0.509 -1.566 -1.264 -2.961 -4.243 -1.082 +-1.798 0.296 -1.578 -0.933 -2.748 -4.238 -1.082 +-1.129 0.426 -1.076 -0.598 -1.857 -3.254 -1.082 +-1.105 0.715 -0.713 -0.031 -1.330 -2.514 -1.082 +-1.292 0.380 -0.785 -0.128 -1.514 -2.665 -1.082 +-1.350 0.335 -0.675 0.271 -0.965 -2.100 -1.082 +-1.910 -0.700 -0.781 -0.663 -1.786 -2.443 -1.082 +-0.070 0.614 -1.065 0.747 -0.103 1.444 -1.082 +7.153 6.366 -0.492 5.169 5.806 4.376 -1.082 +-2.612 -1.679 -0.827 0.411 -0.169 -0.791 -1.082 +-1.126 -0.083 -0.044 1.339 1.442 0.929 -1.082 +-7.309 -5.908 -0.249 -1.556 -2.141 1.112 -1.082 +-1.454 -0.738 0.032 1.840 2.533 2.357 -1.082 +-2.263 -1.470 -0.103 2.077 2.885 3.950 -1.082 +-4.078 -3.351 -1.498 0.729 1.836 3.437 -1.082 +-3.098 -2.476 -0.435 1.687 3.071 4.034 -1.082 +-2.601 -2.152 0.065 2.427 3.991 4.276 -1.082 +-2.981 -2.297 0.143 2.618 4.483 5.225 -1.082 +-3.362 -3.028 -0.170 2.560 4.612 5.459 -1.082 +-3.765 -3.355 -0.191 2.639 5.058 7.902 -1.082 +-2.918 -2.930 -0.108 2.180 4.124 4.237 -1.082 +-1.206 -1.778 -0.158 0.864 1.473 0.634 -1.082 +-2.111 -2.411 -0.116 1.552 2.869 2.672 -1.082 +-2.758 -3.584 -0.458 1.656 3.441 4.549 -1.082 +-2.732 -3.750 -0.698 0.913 2.436 5.249 -1.082 +-2.802 -3.551 -1.380 -0.817 -0.054 1.047 -1.082 +-0.798 -1.268 -0.126 0.317 0.294 -0.677 -1.082 +-0.520 -1.042 0.298 0.851 1.414 0.309 -1.082 +-0.892 -0.912 0.306 1.394 2.023 0.274 -1.082 +-0.557 -0.991 0.468 1.475 2.531 0.976 -1.082 +-0.690 -1.311 0.421 1.526 2.274 0.827 -1.082 +-0.492 -1.242 0.557 1.635 2.328 1.540 -1.082 +-0.251 1.187 -0.290 -0.003 -0.630 -0.414 9.410 +-0.492 1.110 -0.094 0.558 0.480 0.363 9.410 +-0.712 -0.735 -0.112 0.190 0.844 0.195 9.410 +-0.412 -0.927 -0.175 0.135 0.608 0.770 9.410 +-1.302 -2.279 -0.969 -0.690 -0.299 -0.510 9.410 +-1.260 -1.701 -0.690 0.098 0.123 -0.465 9.410 +-0.401 0.474 0.169 0.298 0.499 0.336 9.410 +-0.329 0.727 -0.218 -0.256 -0.251 0.087 9.410 +-2.849 -1.437 -0.674 0.697 1.929 3.277 6.741 +-0.303 -0.644 -0.582 -1.082 -1.697 -2.738 6.741 +-1.566 -1.480 -1.284 -1.582 -2.608 -3.972 6.741 +-2.539 -0.771 0.077 1.671 2.723 4.279 6.741 -- GitLab From 50188b8e7220bc4c56d2fe3db47cbd5b9b4ef00e Mon Sep 17 00:00:00 2001 From: Andrea Orlati Date: Mon, 17 Mar 2025 16:06:30 +0100 Subject: [PATCH 143/150] fix issue #895: the request to have the indication of the rest frequency without to wait for the summar to be created lead to a new (#914) Fitszilla version (1.23), the rest freqncy is now also reported in the header of the section table. This should also be tracked in the Fitszilla document. --- CHANGELOG.md | 1 + Common/Servers/FitsWriter/include/Version.h | 5 ++- .../Servers/FitsWriter/src/EngineThread.cpp | 35 ++++++++++++++++++- Common/Servers/FitsWriter/src/FitsWriter.cpp | 3 +- .../Servers/FitsWriter/src/SummaryWriter.cpp | 1 + 5 files changed, 42 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c8e1ed874..78a63fce3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -111,3 +111,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/ issue #689 - The dataset provided by weather station has been enlarged by the wind direction. The correctponding RAL 'wx' command will noe provided wind direction readout, as well issue #621 - The maximum number of chars of the schedule file name is now 37 (extension included). This is done for fits file and archive issue with the lenght of the schedule name. issue #853 - The setSection command can now accept a wildcard (*) as section identifier. This will allow to configure all backend sections with a single command + issue #895 - FitZilla version 1.23 released, the rest frequency is also added in the header of the Section table \ No newline at end of file diff --git a/Common/Servers/FitsWriter/include/Version.h b/Common/Servers/FitsWriter/include/Version.h index cb1621ae0..cb266e16b 100644 --- a/Common/Servers/FitsWriter/include/Version.h +++ b/Common/Servers/FitsWriter/include/Version.h @@ -23,9 +23,10 @@ #define FITS_VERSION11 "V.1.2" #define FITS_VERSION12 "V.1.21" #define FITS_VERSION13 "V.1.22" +#define FITS_VERSION14 "V.1.23" -#define CURRENT_VERSION FITS_VERSION13 +#define CURRENT_VERSION FITS_VERSION14 #define DEFAULT_COMMENT CURRENT_VERSION" Created by S. Righini, M. Bartolini & A. Orlati" @@ -42,6 +43,8 @@ #define HISTORY11 FITS_VERSION11" Frequency and bandwidth columns added to Section table reporting backend sampled band" #define HISTORY12 FITS_VERSION12" SubScan offsets added to the primary header" #define HISTORY13 FITS_VERSION13" Summary file aligned to reference document" +#define HISTORY14 FITS_VERSION14" Rest frequency information also added in the header of section table" + #define CREDITS1 " " #define CREDITS2 "These data are property of:" diff --git a/Common/Servers/FitsWriter/src/EngineThread.cpp b/Common/Servers/FitsWriter/src/EngineThread.cpp index 0008d1dbb..9ed3691f7 100644 --- a/Common/Servers/FitsWriter/src/EngineThread.cpp +++ b/Common/Servers/FitsWriter/src/EngineThread.cpp @@ -629,7 +629,7 @@ void CEngineThread::runLoop() ACS::doubleSeq fluxes; ACS::longSeq feedsID; ACS::longSeq ifsID; - ACS::doubleSeq atts; + ACS::doubleSeq atts,restFreqs; ACS::longSeq sectionsID; ACS::stringSeq axisName,axisUnit; @@ -889,6 +889,39 @@ void CEngineThread::runLoop() impl.log(LM_ERROR); // not filtered, because the user need to know about the problem immediately m_data->setStatus(Management::MNG_FAILURE); } + m_info.getRestFreq(restFreqs); + if (restFreqs.length()==1) { + double rfValue; + IRA::CString keyName; + for (long j=0;jgetSectionsNumber();j++) { + if (restFreqs[0]>0.0) rfValue=restFreqs[0]; + else rfValue=DOUBLE_DUMMY_VALUE; + keyName.Format("RESTFREQ%d",j+1); + if (!m_file->setSectionHeaderKey(keyName,rfValue,"Frequency resolution of the Nth section (MHz)")) { + _EXCPT(ManagementErrors::FitsCreationErrorExImpl,impl,"CEngineThread::runLoop()"); + impl.setFileName((const char *)m_data->getFileName()); + impl.setError(m_file->getLastError()); + impl.log(LM_ERROR); // not filtered, because the user need to know about the problem immediately + m_data->setStatus(Management::MNG_FAILURE); + } + } + } + else { + double rfValue; + IRA::CString keyName; + for (long j=0;j0.0) rfValue=restFreqs[j]; + else rfValue=DOUBLE_DUMMY_VALUE; + keyName.Format("RESTFREQ%d",j+1); + if (!m_file->setSectionHeaderKey(keyName,rfValue,"Frequency resolution of the Nth section (MHz)")) { + _EXCPT(ManagementErrors::FitsCreationErrorExImpl,impl,"CEngineThread::runLoop()"); + impl.setFileName((const char *)m_data->getFileName()); + impl.setError(m_file->getLastError()); + impl.log(LM_ERROR); // not filtered, because the user need to know about the problem immediately + m_data->setStatus(Management::MNG_FAILURE); + } + } + } CFitsWriter::TFeedHeader *feedH=m_info.getFeedHeader(); if (!m_file->addFeedTable("FEED TABLE")) { _EXCPT(ManagementErrors::FitsCreationErrorExImpl,impl,"CEngineThread::runLoop()"); diff --git a/Common/Servers/FitsWriter/src/FitsWriter.cpp b/Common/Servers/FitsWriter/src/FitsWriter.cpp index b7dafd5df..57a1a3a68 100644 --- a/Common/Servers/FitsWriter/src/FitsWriter.cpp +++ b/Common/Servers/FitsWriter/src/FitsWriter.cpp @@ -234,7 +234,8 @@ bool CFitsWriter::create() if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY10,m_lastError)) return false; if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY11,m_lastError)) return false; if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY12,m_lastError)) return false; - if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY13,m_lastError)) return false; + if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY13,m_lastError)) return false; + if (!CFitsTools::primaryHeaderHistory(pFits,HISTORY14,m_lastError)) return false; if (!CFitsTools::primaryHeaderComment(pFits,CREDITS1,m_lastError)) return false; if (!CFitsTools::primaryHeaderComment(pFits,CREDITS2,m_lastError)) return false; diff --git a/Common/Servers/FitsWriter/src/SummaryWriter.cpp b/Common/Servers/FitsWriter/src/SummaryWriter.cpp index 81fc021f0..b516e783b 100644 --- a/Common/Servers/FitsWriter/src/SummaryWriter.cpp +++ b/Common/Servers/FitsWriter/src/SummaryWriter.cpp @@ -63,6 +63,7 @@ bool CSummaryWriter::create() if (!CFitsTools::primaryHeaderHistory(m_pFits,HISTORY11,m_lastError)) return false; if (!CFitsTools::primaryHeaderHistory(m_pFits,HISTORY12,m_lastError)) return false; if (!CFitsTools::primaryHeaderHistory(m_pFits,HISTORY13,m_lastError)) return false; + if (!CFitsTools::primaryHeaderHistory(m_pFits,HISTORY14,m_lastError)) return false; if (!CFitsTools::primaryHeaderComment(m_pFits,CREDITS1,m_lastError)) return false; if (!CFitsTools::primaryHeaderComment(m_pFits,CREDITS2,m_lastError)) return false; -- GitLab From cc4c6d63a049a7751b2fe0a7d40fd7b29f024456 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 31 Mar 2025 12:46:23 +0200 Subject: [PATCH 144/150] Fixed GitHub Actions Continuous Integration --- .github/workflows/workflow.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index b31e19644..f63b387d7 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: station: ['SRT', 'Medicina', 'Noto'] - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Free up space uses: jlumbroso/free-disk-space@main @@ -29,8 +29,7 @@ jobs: sudo apt update && sudo apt install vagrant - name: Install VirtualBox run: | - wget https://download.virtualbox.org/virtualbox/7.0.14/virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb - sudo apt install ./virtualbox-7.0_7.0.14-161095~Ubuntu~jammy_amd64.deb + sudo apt install virtualbox - name: Clone the repository uses: actions/checkout@v4 - name: Set up Python -- GitLab From 0415ea138f4c7175e68fd1060be9625f35015be6 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 4 Apr 2025 12:51:52 +0200 Subject: [PATCH 145/150] Continuous integration (#919) * Test for caching the virtual machine * Update for triggering the workflow * Fixed cache files path * Updated download-vm workflow * Updated deploy-discos workflow * Removed download workflow. It will go on master. * Updated deployment workflow * Updated variable for branch name * Shortened the job name * Added push as CI event --- .github/utils/download_from_gdrive.py | 53 ------------------ .github/utils/gdrive_requirements.txt | 4 -- .../{workflow.yml => deploy-discos.yml} | 54 ++++++++++++------- 3 files changed, 35 insertions(+), 76 deletions(-) delete mode 100755 .github/utils/download_from_gdrive.py delete mode 100644 .github/utils/gdrive_requirements.txt rename .github/workflows/{workflow.yml => deploy-discos.yml} (71%) diff --git a/.github/utils/download_from_gdrive.py b/.github/utils/download_from_gdrive.py deleted file mode 100755 index 1a01b42db..000000000 --- a/.github/utils/download_from_gdrive.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -from google.oauth2.credentials import Credentials -from google.auth.transport.requests import Request -from googleapiclient.discovery import build -from googleapiclient.http import MediaIoBaseDownload -import os -import io - -TOKEN_FILE = 'token.json' -VM_FILE_PATH = '/home/runner/discos_manager.ova' -ARCHIVE_FILE_PATH = '/home/runner/vagrant.tar.gz' -SCOPES = ['https://www.googleapis.com/auth/drive.readonly'] - -# Create the token file from the GH Secret -with open(TOKEN_FILE, 'w') as tokenfile: - tokenfile.write(os.environ.get('GOOGLE_DRIVE_TOKEN')) - -# Authenticate with the token and eventually update it -creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) -if creds.expired and creds.refresh_token: - creds.refresh(Request()) - -# Download the VM -creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES) -if creds.expired and creds.refresh_token: - creds.refresh(Request()) - -service = build('drive', 'v3', credentials=creds) - -downloader = MediaIoBaseDownload( - io.FileIO(ARCHIVE_FILE_PATH, 'wb'), - service.files().get_media( - fileId=os.environ.get('PROVISIONED_ARCHIVE_GDRIVE_ID') - ) -) -done = False -while not done: - _, done = downloader.next_chunk() - -downloader = MediaIoBaseDownload( - io.FileIO(VM_FILE_PATH, 'wb'), - service.files().get_media( - fileId=os.environ.get('PROVISIONED_VM_GDRIVE_ID'), - ), - chunksize=5*1024*1024 -) -done = False -while not done: - _, done = downloader.next_chunk() - -# Finally update the token file -with open(TOKEN_FILE, 'w') as tokenfile: - tokenfile.write(creds.to_json()) diff --git a/.github/utils/gdrive_requirements.txt b/.github/utils/gdrive_requirements.txt deleted file mode 100644 index 7c6866175..000000000 --- a/.github/utils/gdrive_requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -google-auth -google-auth-oauthlib -google-auth-httplib2 -google-api-python-client diff --git a/.github/workflows/workflow.yml b/.github/workflows/deploy-discos.yml similarity index 71% rename from .github/workflows/workflow.yml rename to .github/workflows/deploy-discos.yml index f63b387d7..86de67074 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/deploy-discos.yml @@ -2,10 +2,22 @@ name: DISCOS deployment and build on: push: - workflow_dispatch: + pull_request: jobs: + wait-for-download: + name: Wait for any pending download + runs-on: ubuntu-latest + concurrency: + group: download + cancel-in-progress: false + steps: + - name: Go on with deployment + run: true deploy-discos: + name: Deploy DISCOS + runs-on: ubuntu-latest + needs: wait-for-download env: REPOSITORY_TOKEN: "${{ secrets.DEPENDENCIES_TOKEN }}" GH_TOKEN: "${{ secrets.GH_WORKFLOWS_TOKEN }}" @@ -16,32 +28,37 @@ jobs: fail-fast: false matrix: station: ['SRT', 'Medicina', 'Noto'] - runs-on: ubuntu-latest steps: - name: Free up space uses: jlumbroso/free-disk-space@main with: tool-cache: true - - name: Install Vagrant + - name: Install Vagrant and VirtualBox run: | wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install vagrant - - name: Install VirtualBox - run: | sudo apt install virtualbox - - name: Clone the repository - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3' check-latest: true - - name: Download the provisioned virtual machine from Google Drive + - name: Clone the deployment repository + uses: actions/checkout@v4 + with: + repository: 'discos/deployment' + - name: Install deployment package and dependencies run: | - pip install -r .github/utils/gdrive_requirements.txt - python .github/utils/download_from_gdrive.py - gh secret set GOOGLE_DRIVE_TOKEN --org discos --visibility selected --repos discos,deployment < token.json + python -m pip install -r requirements.txt + pip install . + - name: Retrieve the VM from cache + uses: actions/cache/restore@v4 + with: + key: discos-manager-vm + path: | + /home/runner/discos_manager.ova + /home/runner/vagrant.tar.gz - name: Install the virtual machine run: | vboxmanage import discos_manager.ova --vsys 0 --options keepallmacs @@ -53,17 +70,16 @@ jobs: sed -i "s/$(cat id)/$(vboxmanage list vms | grep 'discos_manager' | grep -oP '(?<=\{)[0-9a-fA-F-]+(?=\})')/" action_provision sed -i "s/$(cat id)/$(vboxmanage list vms | grep 'discos_manager' | grep -oP '(?<=\{)[0-9a-fA-F-]+(?=\})')/" id working-directory: /home/runner/.deployment/.vagrant/machines/manager/virtualbox/ - - name: Clone the deployment repository - uses: actions/checkout@v4 - with: - repository: 'discos/deployment' - - name: Install deployment package and dependencies + - name: Set the branch name run: | - python -m pip install -r requirements.txt - pip install . + if [ "${{ github.event_name }}" == "push" ]; then + echo "BRANCH_NAME=${{ github.ref_name }}" >> $GITHUB_ENV + elif [ "${{ github.event_name }}" == "pull_request" ]; then + echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV + fi - name: Deploy DISCOS run: | - discos-deploy manager:development --deploy-only -s ${{ matrix.station }} -b ${{ github.ref_name }} + discos-deploy manager:development --deploy-only -s ${{ matrix.station }} -b ${{ env.BRANCH_NAME }} - name: Shutdown the virtual machine run: | discos-vms stop -- GitLab From e376ca0495f59cd144da1884492c2b29a8afb881 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 4 Apr 2025 16:29:35 +0200 Subject: [PATCH 146/150] Fix #906, various enhancements for Schedule parsing (#907) This additions modify the IRATools::getNextToken function in the following way: - a std::vector can be passed as delimiter (function override). The function checks if any of them is present in the string and behaves according to the old implementation; - the behavior has been enhanced so that a boolean (which defaults to false) tells the function to keep cycling through the string if multiple occurrencies of one of the delimiters is found one after the other. This allows the function to behave in the same manner whether a string contains one or more '\t' characters or a series of whitespaces ' '. The Schedule class has been modified according to these additions so that it can now parse a schedule with multiple tabs as well as whitespaces as token separators. A test has been introduced in such a way that checks if the 2 schedule.tmpl and schedule_ws.tmpl files produce the same output when checked with the `testSched` executable. ScheduleChecker now also checks whether the caller user is the same as the PROJECT keyword. This alerts the observers that copied a schedule from a previous project to be aware that DISCOS will reject the given schedule when trying to launch it, saving time. --- .../Libraries/IRALibrary/include/IRATools.h | 17 +- Common/Libraries/IRALibrary/src/IRATools.cpp | 157 +++++++++--------- Common/Servers/Scheduler/include/Schedule.h | 2 +- Common/Servers/Scheduler/src/Makefile | 5 +- Common/Servers/Scheduler/src/Schedule.cpp | 38 ++--- .../Servers/Scheduler/src/ScheduleChecker.cpp | 8 + .../Scheduler/src/Schedule_ScanList.cpp | 42 ++--- Common/Servers/Scheduler/src/testSchedule.cpp | 7 +- .../Servers/Scheduler/src/testSchedules.cpp | 38 +++++ .../Servers/Scheduler/templates/schedule.tmpl | 2 +- .../Scheduler/templates/schedule_ws.tmpl | 88 ++++++++++ 11 files changed, 282 insertions(+), 122 deletions(-) create mode 100644 Common/Servers/Scheduler/src/testSchedules.cpp create mode 100644 Common/Servers/Scheduler/templates/schedule_ws.tmpl diff --git a/Common/Libraries/IRALibrary/include/IRATools.h b/Common/Libraries/IRALibrary/include/IRATools.h index 33a03b687..3525548d7 100644 --- a/Common/Libraries/IRALibrary/include/IRATools.h +++ b/Common/Libraries/IRALibrary/include/IRATools.h @@ -354,10 +354,23 @@ public: * @param start position inside the string from which to start the next token, if a new token has been found * it points to the character immediately after the localized token * @param delimiter this is the character that separates the token - * @param it returns the next token in the string + * @param ret it returns the next token in the string + * @param stopAtFirst immediately returns (true) if the first character found is one of the delimiters, otherwise it goes further inside str * @return true if a token has been found */ - static bool getNextToken(const IRA::CString& str,int &start,char delimiter,IRA::CString &ret); + static bool getNextToken(const IRA::CString& str,int &start,const char& delimiter,IRA::CString &ret, const bool& stopAtFirst=true); + + /** + * Use this function to divide a string into separated tokens. Multiple token delimiters can be specified. + * @param str string to be divided into tokens + * @param start position inside the string from which to start the next token, if a new token has been found + * it points to the character immediately after the localized token + * @param delimiters vector that contains characters that separate the token + * @param ret it returns the next token in the string + * @param stopAtFirst immediately returns (true) if the first character found is one of the delimiters, otherwise it goes further inside str + * @return true if a token has been found + */ + static bool getNextToken(const IRA::CString& str,int &start,const std::vector& delimiters,IRA::CString &ret, const bool& stopAtFirst=true); /** * Computes the normalized (+/-PI) difference between two angles expressed in radians(a-b). For example 359°-1°=-2°,1°-359°=2°, 179°-360°=179° and so on. diff --git a/Common/Libraries/IRALibrary/src/IRATools.cpp b/Common/Libraries/IRALibrary/src/IRATools.cpp index ab893ab51..ede299471 100644 --- a/Common/Libraries/IRALibrary/src/IRATools.cpp +++ b/Common/Libraries/IRALibrary/src/IRATools.cpp @@ -40,13 +40,13 @@ void CIRATools::Wait(long long micro) DDWORD CIRATools::timeMicroSeconds(TIMEDIFFERENCE& time) { DDWORD tmp; - tmp=((((time.day()*24+time.hour())*60LL+time.minute())*60+time.second())*1000000+time.microSecond()); + tmp=((((time.day()*24+time.hour())*60LL+time.minute())*60+time.second())*1000000+time.microSecond()); return tmp; } void CIRATools::getTime(TIMEVALUE& Now) { - Now.value(TimeUtil::ace2epoch(ACE_OS::gettimeofday())); + Now.value(TimeUtil::ace2epoch(ACE_OS::gettimeofday())); } ACS::Time CIRATools::getACSTime() @@ -89,7 +89,7 @@ DDWORD CIRATools::timeDifference(TIMEVALUE& First,TIMEVALUE& Last) diff=Last.difference(First.value()); } DurationHelper diffHelper(diff); - return timeMicroSeconds(diffHelper); + return timeMicroSeconds(diffHelper); } long long CIRATools::timeSubtract(const TIMEVALUE& First,const TIMEVALUE& Second) @@ -114,7 +114,7 @@ bool CIRATools::getDBValue(maci::ContainerServices *Services,CString fieldName,d try { CDB::DAL_var Dal_p=Services->getCDB(); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - Val=Dao_p->get_double((const char *)fieldName); + Val=Dao_p->get_double((const char *)fieldName); } catch (...) { return false; @@ -130,7 +130,7 @@ bool CIRATools::getDBValue(maci::SimpleClient *client,CString fieldName,double & CORBA::Object_var obj=client->getComponent("CDB",0,false); CDB::DAL_var Dal_p=CDB::DAL::_narrow(obj); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - Val=Dao_p->get_double((const char *)fieldName); + Val=Dao_p->get_double((const char *)fieldName); } catch (...) { return false; @@ -146,7 +146,7 @@ bool CIRATools::getDBValue(maci::ContainerServices *Services,CString fieldName,l try { CDB::DAL_var Dal_p=Services->getCDB(); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - Val=Dao_p->get_long((const char *)fieldName); + Val=Dao_p->get_long((const char *)fieldName); } catch (...) { return false; @@ -162,7 +162,7 @@ bool CIRATools::getDBValue(maci::SimpleClient *client,CString fieldName,long &Va CORBA::Object_var obj=client->getComponent("CDB",0,false); CDB::DAL_var Dal_p=CDB::DAL::_narrow(obj); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - Val=Dao_p->get_long((const char *)fieldName); + Val=Dao_p->get_long((const char *)fieldName); } catch (...) { return false; @@ -179,13 +179,13 @@ bool CIRATools::getDBValue(maci::ContainerServices *Services,CString fieldName,D try { CDB::DAL_var Dal_p=Services->getCDB(); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - app=Dao_p->get_long((const char *)fieldName); + app=Dao_p->get_long((const char *)fieldName); } catch (...) { return false; } Val=(DWORD)app; - return true; + return true; } bool CIRATools::getDBValue(maci::SimpleClient *client,CString fieldName,DWORD &Val,CString Domain,CString name) @@ -197,13 +197,13 @@ bool CIRATools::getDBValue(maci::SimpleClient *client,CString fieldName,DWORD &V CORBA::Object_var obj=client->getComponent("CDB",0,false); CDB::DAL_var Dal_p=CDB::DAL::_narrow(obj); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); - app=Dao_p->get_long((const char *)fieldName); + app=Dao_p->get_long((const char *)fieldName); } catch (...) { return false; } Val=(DWORD)app; - return true; + return true; } bool CIRATools::getDBValue(maci::ContainerServices *Services,CString fieldName,CString &Val,CString Domain,CString name) @@ -227,7 +227,7 @@ bool CIRATools::getDBValue(maci::SimpleClient *client,CString fieldName,CString { CString fullName; fullName=Domain+name; - try { + try { CORBA::Object_var obj=client->getComponent("CDB",0,false); CDB::DAL_var Dal_p=CDB::DAL::_narrow(obj); CDB::DAO_var Dao_p=Dal_p->get_DAO_Servant((const char *)fullName); @@ -249,7 +249,7 @@ bool CIRATools::setDBValue(maci::ContainerServices* Services,CString fieldName,c CDB::DAL_var Dal_p=Services->getCDB(); CDB::WDAL_var wDal_p=CDB::WDAL::_narrow(Dal_p); CDB::WDAO_var wDao_p=wDal_p->get_WDAO_Servant((const char *)fullName); - wDao_p->set_double((const char *)fieldName,Val); + wDao_p->set_double((const char *)fieldName,Val); } catch (...) { return false; @@ -266,7 +266,7 @@ bool CIRATools::setDBValue(maci::ContainerServices* Services,CString fieldName,c CDB::DAL_var Dal_p=Services->getCDB(); CDB::WDAL_var wDal_p=CDB::WDAL::_narrow(Dal_p); CDB::WDAO_var wDao_p=wDal_p->get_WDAO_Servant((const char *)fullName); - wDao_p->set_long((const char *)fieldName,Val); + wDao_p->set_long((const char *)fieldName,Val); } catch (...) { return false; @@ -283,12 +283,12 @@ bool CIRATools::setDBValue(maci::ContainerServices* Services,CString fieldName,c CDB::DAL_var Dal_p=Services->getCDB(); CDB::WDAL_var wDal_p=CDB::WDAL::_narrow(Dal_p); CDB::WDAO_var wDao_p=wDal_p->get_WDAO_Servant((const char *)fullName); - wDao_p->set_long((const char *)fieldName,Val); + wDao_p->set_long((const char *)fieldName,Val); } catch (...) { return false; } - return true; + return true; } bool CIRATools::setDBValue(maci::ContainerServices* Services,CString fieldName,const CString &Val,CString Domain,CString name) @@ -300,7 +300,7 @@ bool CIRATools::setDBValue(maci::ContainerServices* Services,CString fieldName,c CDB::DAL_var Dal_p=Services->getCDB(); CDB::WDAL_var wDal_p=CDB::WDAL::_narrow(Dal_p); CDB::WDAO_var wDao_p=wDal_p->get_WDAO_Servant((const char *)fullName); - wDao_p->set_string((const char *)fieldName,(const char*)Val); + wDao_p->set_string((const char *)fieldName,(const char*)Val); } catch (...) { return false; @@ -340,11 +340,11 @@ double CIRATools::getHWAzimuth(const double& current,const double& dest,const do } if (d1<=d2) { newOne=tmpCurrent+d1; - if ((newOne>tmpMaxAz) || (newOnetmpMaxAz) || (newOnetmpMaxAz) || (newOnetmpMaxAz) || (newOne0) { //CW (typically 180...450 @@ -369,7 +369,7 @@ double CIRATools::getHWAzimuth(const double& current,const double& dest,const do } else { // not reachable in this sector (typically 180..270 newOne=tmpDest; - } + } } return newOne; } @@ -397,7 +397,12 @@ bool CIRATools::skyFrequency(const double& bf,const double& bbw,const double& rf }*/ } -bool CIRATools::getNextToken(const IRA::CString& str,int &start,char delimiter,IRA::CString &ret) +bool CIRATools::getNextToken(const IRA::CString& str,int &start,const char& delimiter,IRA::CString &ret, const bool& stopAtFirst) +{ + return getNextToken(str, start, std::vector{ delimiter }, ret, stopAtFirst); +} + +bool CIRATools::getNextToken(const IRA::CString& str,int &start,const std::vector& delimiters,IRA::CString &ret, const bool& stopAtFirst) { int i; bool ok=false; @@ -406,22 +411,24 @@ bool CIRATools::getNextToken(const IRA::CString& str,int &start,char delimiter,I token=new char[i+1]; i=0; while (str[start]!=0) { + char c = str[start]; ok=true; - if ((str[start]==delimiter)) { - start++; + start++; + if (std::any_of(delimiters.begin(), delimiters.end(), [c](char d){ return c == d; })) { + // We still have not found any meaningful character, stop if stopAtFirst or continue skipping a delimiter + if(!stopAtFirst && i==0) + continue; break; } else { - token[i]=str[start]; - start++; + token[i]=c; i++; } } token[i]=0; ret=IRA::CString(token); delete []token; - if (!ok) return false; - else return true; + return ok; } double CIRATools::differenceBetweenAnglesRad(const double& a,const double& b) @@ -504,7 +511,7 @@ bool CIRATools::strToInterval(const IRA::CString& durationString,ACS::TimeInterv else { hour=0; minute=0; - second=timeToken[0].ToDouble(); + second=timeToken[0].ToDouble(); } } else if (dCounter==2) { @@ -522,7 +529,7 @@ bool CIRATools::strToInterval(const IRA::CString& durationString,ACS::TimeInterv else if (dCounter==3) { hour=timeToken[0].ToLong(); minute=timeToken[1].ToLong(); - second=timeToken[2].ToDouble(); + second=timeToken[2].ToDouble(); } if ((hour<0) || (hour>23)) return false; if ((minute<0) || (minute>59)) return false; @@ -541,7 +548,7 @@ bool CIRATools::strToInterval(const IRA::CString& durationString,ACS::TimeInterv usec=(long)(second*1000000.0); period.hour(hour); period.minute(minute); period.second(sec); period.microSecond(usec); interval=period.value().value; - return true; + return true; } bool CIRATools::intervalToStr(const ACS::TimeInterval& interval,IRA::CString& outString,char dateDelimiter,char timeDelimiter) @@ -565,7 +572,7 @@ bool CIRATools::strToTime(const IRA::CString& timeString,ACS::Time& time,bool co IRA::CIRATools::getTime(now); int p,i=0,dCounter=0; IRA::CDateTime dt; - + while (((p=timeString.Find(dateDelimiter,i))>0) && (dCounter<2)) { dateToken[dCounter]=timeString.Mid(i,p-i); dCounter++; @@ -582,25 +589,25 @@ bool CIRATools::strToTime(const IRA::CString& timeString,ACS::Time& time,bool co } else { year=dateToken[0].ToLong(); - doy=dateToken[1].ToLong(); + doy=dateToken[1].ToLong(); } if (getNextToken(timeString,i,timeDelimiter,token)) { //now read all three fields of the time representation hour=token.ToLong(); if (getNextToken(timeString,i,timeDelimiter,token)) { minute=token.ToLong(); - if (getNextToken(timeString,i,timeDelimiter,token)) { + if (getNextToken(timeString,i,timeDelimiter,token)) { second=token.ToDouble(); } else { if (complete) return false; second=0.0; - } + } } else { if (complete) return false; minute=0; second=0.0; - } + } } else { return false; @@ -631,7 +638,7 @@ bool CIRATools::timeToStr(const ACS::Time& time,IRA::CString& outString,char dat TIMEVALUE timeE(time); outString.Format("%04lu%c%03ld%c%02ld%c%02ld%c%02ld.%03ld",(unsigned long)timeE.year(),dateDelimiter,(long)timeE.dayOfYear(),dateDelimiter,(long)timeE.hour(), timeDelimiter,(long)timeE.minute(),timeDelimiter,(long)timeE.second(),(long)timeE.microSecond()/1000); - return true; + return true; } bool CIRATools::timeToStrExtended(const ACS::Time& time,IRA::CString& outString,char dateDelimiter,char timeDelimiter) @@ -676,7 +683,7 @@ bool CIRATools::longSeqToStr(const ACS::longSeq& val,IRA::CString& outString,cha bool CIRATools::hourAngleToRad(const IRA::CString& angle,double& rad,bool complete,char delimiter) { - int p,i=0,dCounter=0; + int p,i=0,dCounter=0; long hour=0,minute=0; double second=0.0; bool sign; @@ -704,7 +711,7 @@ bool CIRATools::hourAngleToRad(const IRA::CString& angle,double& rad,bool comple else if (dCounter==3) { hour=token[0].ToLong(); minute=token[1].ToLong(); - second=token[2].ToDouble(); + second=token[2].ToDouble(); } if (token[0][0]=='-') { sign=true; @@ -720,8 +727,8 @@ bool CIRATools::hourAngleToRad(const IRA::CString& angle,double& rad,bool comple rad=slaDranrm(rad); if (sign) { rad*=-1; - } - return true; + } + return true; } bool CIRATools::radToHourAngle(const double& rad,IRA::CString& outString,char delimiter) @@ -741,7 +748,7 @@ bool CIRATools::radToHourAngle(const double& rad,IRA::CString& outString,char de bool CIRATools::sexagesimalAngleToRad(const IRA::CString& angle,double& rad,bool complete,char delimiter) { - int p,i=0,dCounter=0; + int p,i=0,dCounter=0; long deg=0,arcminute=0; double arcsecond=0.0; bool sign; @@ -769,14 +776,14 @@ bool CIRATools::sexagesimalAngleToRad(const IRA::CString& angle,double& rad,bool else if (dCounter==3) { deg=token[0].ToLong(); arcminute=token[1].ToLong(); - arcsecond=token[2].ToDouble(); + arcsecond=token[2].ToDouble(); } //degrees could also be negative...... if (token[0][0]=='-') { sign=true; deg*=-1; } - else { + else { sign=false; } if ((arcminute<0) || (arcminute>59)) return false; @@ -786,16 +793,16 @@ bool CIRATools::sexagesimalAngleToRad(const IRA::CString& angle,double& rad,bool if (sign) { rad*=-1; } - return true; + return true; } bool CIRATools::radToSexagesimalAngle(const double& rad,IRA::CString& outString,char delimiter) { char sign; - int dmsf[4]; + int dmsf[4]; double ranged=dmod(rad,D2PI); // put the angle in the range -2PI..2PI // convert it into hour minute second anf fraction..keeping track of the sign - slaDr2af(3,ranged,&sign,dmsf); + slaDr2af(3,ranged,&sign,dmsf); if (sign=='+') { outString.Format("%02d%c%02d%c%02d.%03d",dmsf[0],delimiter,dmsf[1],delimiter,dmsf[2],dmsf[3]); } @@ -810,7 +817,7 @@ bool CIRATools::angleToRad(const IRA::CString& angle,double& rad) double deg=angle.ToDouble(); rad=deg*DD2R; rad=dmod(rad,D2PI); - return true; + return true; } bool CIRATools::radToAngle(const double& rad,IRA::CString& outString) @@ -866,7 +873,7 @@ bool CIRATools::latitudeToRad(const IRA::CString& lat,double& rad,bool complete, bool CIRATools::rightAscensionToRad(const IRA::CString& ra,double& rad,bool complete,char delimiter) { //long len=ra.GetLength(); - int len=ra.GetLength(); + int len=ra.GetLength(); bool res; if (len==0) return false; if (ra[len-1]=='d') { @@ -926,7 +933,7 @@ bool CIRATools::azimuthToRad(const IRA::CString& az,double& rad,bool complete) } else return res; } - + bool CIRATools::elevationToRad(const IRA::CString& el,double& rad,bool complete) { bool res=angleToRad(el,rad); @@ -1140,13 +1147,13 @@ bool CIRATools::makeDirectory(const IRA::CString& pathName) bool CIRATools::directoryExists(const IRA::CString& path) { DIR *dir; - bool exists=false; - dir=opendir((const char *)path); - if (dir!=NULL) { - exists=true; - closedir(dir); - } - return exists; + bool exists=false; + dir=opendir((const char *)path); + if (dir!=NULL) { + exists=true; + closedir(dir); + } + return exists; } bool CIRATools::fileExists(const IRA::CString& file) @@ -1178,27 +1185,27 @@ bool CIRATools::deleteFile(const IRA::CString& file) bool CIRATools::copyFile(const IRA::CString& src,const IRA::CString& dst) { - std::ifstream in ((const char *)src); - if (in.fail()) return false; - std::ofstream out ((const char *)dst); - if (out.fail()) return false; - out << in.rdbuf(); - out.close(); - in.close(); - return true; + std::ifstream in ((const char *)src); + if (in.fail()) return false; + std::ofstream out ((const char *)dst); + if (out.fail()) return false; + out << in.rdbuf(); + out.close(); + in.close(); + return true; } bool CIRATools::extractFileName(const IRA::CString& fullPath,IRA::CString& baseDir,IRA::CString& baseName, IRA::CString& extension) { - char *dirc, *basec; - dirc=strdup((const char *)fullPath); // the APIs called below might change the content of the input string - basec=strdup((const char *)fullPath); - baseDir=IRA::CString(dirname(dirc)); - baseName=IRA::CString(basename(basec)); - if ((baseDir.GetLength()==0) || (baseName.GetLength()==0)) { - return false; - } + char *dirc, *basec; + dirc=strdup((const char *)fullPath); // the APIs called below might change the content of the input string + basec=strdup((const char *)fullPath); + baseDir=IRA::CString(dirname(dirc)); + baseName=IRA::CString(basename(basec)); + if ((baseDir.GetLength()==0) || (baseName.GetLength()==0)) { + return false; + } int pos=baseName.Find('.'); if (pos<0) { // not found extension=""; @@ -1297,9 +1304,9 @@ bool CIRATools::matchRegExp(const IRA::CString& input,const IRA::CString& expr,s std::string out(what[i].first,what[i].second); res.push_back(out.c_str()); } - start=what[0].second; - //flags|=boost::match_prev_avail; - //flags|=boost::match_not_bob; + start=what[0].second; + //flags|=boost::match_prev_avail; + //flags|=boost::match_not_bob; } return true; } diff --git a/Common/Servers/Scheduler/include/Schedule.h b/Common/Servers/Scheduler/include/Schedule.h index 6aba618e9..1badc85c1 100644 --- a/Common/Servers/Scheduler/include/Schedule.h +++ b/Common/Servers/Scheduler/include/Schedule.h @@ -24,7 +24,7 @@ #include "Configuration.h" #define _SCHED_NULLTARGET "NULL" -#define SEPARATOR '\t' +#define SEPARATORS std::vector{'\t', ' '} #define MAX_SCHED_NAME_LEN 37 /** diff --git a/Common/Servers/Scheduler/src/Makefile b/Common/Servers/Scheduler/src/Makefile index d1639108f..706a0f297 100644 --- a/Common/Servers/Scheduler/src/Makefile +++ b/Common/Servers/Scheduler/src/Makefile @@ -38,13 +38,16 @@ RESTRICT_PERMS=_tp_agc # C programs (public and local) # ----------------------------- EXECUTABLES = scheduleChecker -EXECUTABLES_L = testSched testLSTtoUT +EXECUTABLES_L = testSched testSchedules testLSTtoUT # # testSched_OBJECTS = testSchedule Schedule SubScanBinder Schedule_ScanList Configuration testSched_LIBS = IRALibrary ComponentErrors +testSchedules_OBJECTS = testSchedules Schedule SubScanBinder Schedule_ScanList Configuration +testSchedules_LIBS = IRALibrary ComponentErrors boost_system boost_filesystem + testLSTtoUT_OBJECTS = testLST2UT testLSTtoUT_LIBS = IRALibrary ComponentErrors diff --git a/Common/Servers/Scheduler/src/Schedule.cpp b/Common/Servers/Scheduler/src/Schedule.cpp index 60c1c9775..3d315dd02 100644 --- a/Common/Servers/Scheduler/src/Schedule.cpp +++ b/Common/Servers/Scheduler/src/Schedule.cpp @@ -920,48 +920,48 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS { int start=0; IRA::CString ret; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { return false; } else { // token could be extracted ret.MakeUpper(); if (ret==PROJECT) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_projectName)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_projectName,false)) { errorMsg="cannot parse project name"; return false; } else return true; } else if (ret==OBSERVER) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_observer)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_observer,false)) { errorMsg="cannot parse observer name"; return false; } else return true; } else if (ret==SCANLIST) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_scanList)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_scanList,false)) { errorMsg="cannot parse scan list file name"; return false; } else return true; } else if (ret==PROCLIST) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_configList)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_configList,false)) { errorMsg="cannot parse procedure list file name"; return false; } else return true; } else if (ret==BACKENDLIST) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_backendList)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_backendList,false)) { errorMsg="cannot parse backend configurations file name"; return false; } else return true; } else if (ret==SCANLAYOUT) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_layoutFile)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_layoutFile,false)) { errorMsg="cannot parse scan layouts file name"; return false; } @@ -969,14 +969,14 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS } else if (ret==MODE) { IRA::CString mode,rep,startTime; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,mode)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,mode,false)) { errorMsg="cannot parse schedule mode"; return false; } else { m_modeDone=true; if (mode==LSTMODE) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,rep)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,rep,false)) { errorMsg="cannot parse repetitions number for LST mode"; return false; } @@ -989,7 +989,7 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS } } else if (mode==SEQMODE) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,startTime)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,startTime,false)) { m_mode=SEQ; //if it has not an extra argument the sequential is pure return true; } @@ -1011,11 +1011,11 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS } else if (ret==ELEVATIONLIMITS) { IRA::CString minEl,maxEl; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,minEl)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,minEl,false)) { errorMsg="elevation lower limit missing or not correct"; return false; } - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,maxEl)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,maxEl,false)) { errorMsg="elevation upper limit missing or not correct"; return false; } @@ -1039,7 +1039,7 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS } else if (ret==SCANTAG) { IRA::CString scanTag; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,scanTag)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,scanTag,false)) { errorMsg="cannot parse scan tag"; return false; } @@ -1049,7 +1049,7 @@ bool CSchedule::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS return true; } else if (ret==INITPROC) { - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,m_initProc)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,m_initProc,false)) { errorMsg="cannot parse schedule initialization procedure"; return false; } @@ -1080,7 +1080,7 @@ bool CSchedule::parseScans(const IRA::CString& line,const DWORD& lnNumber,IRA::C //ACS::Time ut; TRecord *p; start=0; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { errorMsg="schedule format error"; return false; } @@ -1088,7 +1088,7 @@ bool CSchedule::parseScans(const IRA::CString& line,const DWORD& lnNumber,IRA::C ret.MakeUpper(); if (ret==SCAN_START) { //process scan definition m_currentScanDef.valid=false; - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { // scan id + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { // scan id errorMsg="scan identifier cannot be found"; return false; } @@ -1104,14 +1104,14 @@ bool CSchedule::parseScans(const IRA::CString& line,const DWORD& lnNumber,IRA::C } m_currentScanDef.id=tempId; } - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { //suffix + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { //suffix errorMsg="scan suffix cannot be found"; return false; } else { m_currentScanDef.suffix=ret; } - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { //backend:datawriter + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { //backend:datawriter errorMsg="backend/datawriter cannot be found"; return false; } @@ -1131,7 +1131,7 @@ bool CSchedule::parseScans(const IRA::CString& line,const DWORD& lnNumber,IRA::C m_currentScanDef.writerInstance=_SCHED_NULLTARGET; } } - if (IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { //layout...not mandatory + if (IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { //layout...not mandatory if (m_layoutFile=="") { // if the layout file has not been given errorMsg="scan layout without providing the scan layouts file"; return false; diff --git a/Common/Servers/Scheduler/src/ScheduleChecker.cpp b/Common/Servers/Scheduler/src/ScheduleChecker.cpp index 928c03e6f..5232866e4 100644 --- a/Common/Servers/Scheduler/src/ScheduleChecker.cpp +++ b/Common/Servers/Scheduler/src/ScheduleChecker.cpp @@ -3,6 +3,7 @@ #include "Schedule.h" #include #include +#include using namespace IRA; @@ -80,6 +81,13 @@ int main(int argc, char *argv[]) exit(-1); } if (sched.isComplete()) { + if(getpwuid(getuid())->pw_name != sched.getProjectName()) + { + CString err; + err.Format("Error found: Schedule PROJECT keyword does not match with active project!\n"); + printMessage((const char*)err); + exit(-1); + } CString msg; msg.Format("%u subscans were successfully parsed!\n",sched.getSubScansNumber()); printMessage((const char *)msg); diff --git a/Common/Servers/Scheduler/src/Schedule_ScanList.cpp b/Common/Servers/Scheduler/src/Schedule_ScanList.cpp index c03b2c1b0..7f538e62c 100644 --- a/Common/Servers/Scheduler/src/Schedule_ScanList.cpp +++ b/Common/Servers/Scheduler/src/Schedule_ScanList.cpp @@ -144,12 +144,12 @@ bool CScanList::parseLine(const IRA::CString& line,const DWORD& lnNumber,IRA::CS IRA::CString ret; Management::TScanTypes type; // get the second item..... - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { errMsg="format error"; return false; } //...the scan type - if (!IRA::CIRATools::getNextToken(line,start,SEPARATOR,ret)) { + if (!IRA::CIRATools::getNextToken(line,start,SEPARATORS,ret,false)) { errMsg="could not read scan type"; return false; } @@ -592,7 +592,7 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e Antenna::TSystemEquinox scanEquinox; // get the second item..... - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // id + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // id errMsg="cannot read scan identifier"; return false; } @@ -601,12 +601,12 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e errMsg="scan identifier cannot be zero"; return false; } - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // type + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // type errMsg="cannot read scan type"; return false; } //scan->type=Antenna::ANT_SIDEREAL; //already know it is a sidereal - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // name + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // name errMsg="cannot read source name"; return false; } @@ -626,7 +626,7 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e //scan->VradDefinition=Antenna::ANT_UNDEF_DEF; //scan->RadialVelocity=0.0; frame=Antenna::ANT_EQUATORIAL; - while (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { //get the next token...it represents the frame in which the coordinates are expressed + while (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { //get the next token...it represents the frame in which the coordinates are expressed bool ok=IRA::CIRATools::strToCoordinateFrame(token,frame); if ((frame==Antenna::ANT_EQUATORIAL) && (ok)) { if (frameOpen || offFrameOpen) { @@ -899,7 +899,7 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e IRA::CString token; Antenna::TCoordinateFrame frame; // get the second item..... - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // id + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // id errMsg="cannot read scan identifier"; return false; } @@ -908,12 +908,12 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e errMsg="scan identifier cannot be zero"; return false; } - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // type + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // type errMsg="cannot read scan type"; return false; } scan->type=Antenna::ANT_SIDEREAL; //already know it is a sidereal - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { // name + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { // name errMsg="cannot read source name"; return false; } @@ -932,7 +932,7 @@ bool CScanList::parseSidereal2(const IRA::CString& val,DWORD& id,IRA::CString& e scan->VradDefinition=Antenna::ANT_UNDEF_DEF; scan->RadialVelocity=0.0; frame=Antenna::ANT_EQUATORIAL; - while (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { //get the next token...it represents the frame in which the coordinates are expressed + while (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { //get the next token...it represents the frame in which the coordinates are expressed bool ok=IRA::CIRATools::strToCoordinateFrame(token,frame); if ((frame==Antenna::ANT_EQUATORIAL) && (ok)) { if (frameOpen || offFrameOpen) { @@ -1186,14 +1186,14 @@ bool CScanList::parseOffsetSwitch(const IRA::CString& val,int& start, IRA::CString lontoken,lattoken,token; errMsg=""; res=false; - while (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { + while (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { if (strcmp(token,OFFFRAMEEQ)==0) { offsetFrame=Antenna::ANT_EQUATORIAL; - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lontoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lontoken,false)) { errMsg="not enough parameters for equatorial offset switch"; return false; } - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lattoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lattoken,false)) { errMsg="not enough parameters for equatorial offset switch"; return false; } @@ -1210,11 +1210,11 @@ bool CScanList::parseOffsetSwitch(const IRA::CString& val,int& start, } else if (strcmp(token,OFFFRAMEHOR)==0) { offsetFrame=Antenna::ANT_HORIZONTAL; - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lontoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lontoken,false)) { errMsg="not enough parameters for horizontal offset switch"; return false; } - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lattoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lattoken,false)) { errMsg="not enough parameters for horizontal offset switch"; return false; } @@ -1231,11 +1231,11 @@ bool CScanList::parseOffsetSwitch(const IRA::CString& val,int& start, } else if (strcmp(token,OFFFRAMEGAL)==0) { offsetFrame=Antenna::ANT_GALACTIC; - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lontoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lontoken,false)) { errMsg="not enough parameters for galactic offset switch"; return false; } - if (!IRA::CIRATools::getNextToken(val,start,SEPARATOR,lattoken)) { + if (!IRA::CIRATools::getNextToken(val,start,SEPARATORS,lattoken,false)) { errMsg="not enough parameters for galactic offset switch"; return false; } @@ -1260,7 +1260,7 @@ bool CScanList::parseVRADSwitch(const IRA::CString& val,int& start,double& vrad, IRA::CString token; errMsg=""; result=false; - while (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { + while (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { if (strcmp(token,RVEL)==0) { if (parseVRADSwitch(val,start,vrad,frame,ref,errMsg)) { result=true; @@ -1277,14 +1277,14 @@ bool CScanList::parseVRADSwitch(const IRA::CString& val,int& start,double& vrad, bool CScanList::parseVRADSwitch(const IRA::CString& val,int& start,double& vrad,Antenna::TReferenceFrame& frame,Antenna::TVradDefinition& ref,IRA::CString& errMsg) { IRA::CString token; - if (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { + if (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { vrad=token.ToDouble(); } else { errMsg="not enough parameters for the radial velocity switch"; return false; } - if (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { + if (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { if (!Antenna::Definitions::map(token,frame)) { errMsg="the reference frame of the radial velocity is incorrect"; return false; @@ -1294,7 +1294,7 @@ bool CScanList::parseVRADSwitch(const IRA::CString& val,int& start,double& vrad, errMsg="not enough parameters for the radial velocity switch"; return false; } - if (IRA::CIRATools::getNextToken(val,start,SEPARATOR,token)) { + if (IRA::CIRATools::getNextToken(val,start,SEPARATORS,token,false)) { if (!Antenna::Definitions::map(token,ref)) { errMsg="the radial velocity definition is incorrect"; return false; diff --git a/Common/Servers/Scheduler/src/testSchedule.cpp b/Common/Servers/Scheduler/src/testSchedule.cpp index e678e416e..99cda2ee8 100644 --- a/Common/Servers/Scheduler/src/testSchedule.cpp +++ b/Common/Servers/Scheduler/src/testSchedule.cpp @@ -35,7 +35,7 @@ IRA::CString toDescription(const Antenna::TsubScanDescription& des) IRA::CString toType(const Management::TScanTypes& tp) { - if (tp==Management::MNG_SIDEREAL) return IRA::CString("SIDEREAL"); + if (tp==Management::MNG_SIDEREAL) return IRA::CString("SIDEREAL"); else if (tp==Management::MNG_SUN) return IRA::CString("SUN"); else if (tp==Management::MNG_MOON) return IRA::CString("MOON"); else if (tp==Management::MNG_SATELLITE) return IRA::CString("SATELLITE"); @@ -66,7 +66,10 @@ int main(int argc, char *argv[]) Management::TSubScanConfiguration *subScanConf; CSchedule::TRecord rec; ACS::stringSeq layoutDef; - CSchedule sched("../templates/","schedule.tmpl"); + std::string schedfile = "schedule.tmpl"; + if(argc > 1) + schedfile = std::string(argv[1]); + CSchedule sched("../templates/",schedfile.c_str()); //CSchedule sched("/archive/schedules/maintenance/","mbfitstest-CrossEQEQ.scd"); //CSchedule sched("/archive/schedules/","calibrationSeq.scd"); diff --git a/Common/Servers/Scheduler/src/testSchedules.cpp b/Common/Servers/Scheduler/src/testSchedules.cpp new file mode 100644 index 000000000..62e88a391 --- /dev/null +++ b/Common/Servers/Scheduler/src/testSchedules.cpp @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include + +std::string exec(const std::string command) +{ + std::array buffer; + std::string result; + + std::unique_ptr pipe(popen(command.c_str(), "r"), pclose); + if(!pipe) + { + throw std::runtime_error("popen() failed!"); + } + while(fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) + { + result += buffer.data(); + } + return result; +} + +int main() +{ + std::string binpath = boost::filesystem::canonical("/proc/self/exe").parent_path().string(); + + std::string output_tab = exec(binpath + "/testSched"); + std::string output_spaces = exec(binpath + "/testSched schedule_ws.tmpl"); + if(output_tab != output_spaces) + { + std::cout << "testSched and testSchedSpaces have different outputs, FAILURE!" << std::endl; + return -1; + } + std::cout << "testSched and testSchedSpaces have the same output, OK!" << std::endl; + return 0; +} diff --git a/Common/Servers/Scheduler/templates/schedule.tmpl b/Common/Servers/Scheduler/templates/schedule.tmpl index 9bb098c80..5ab342f96 100644 --- a/Common/Servers/Scheduler/templates/schedule.tmpl +++ b/Common/Servers/Scheduler/templates/schedule.tmpl @@ -39,7 +39,7 @@ SCANTAG: 1024 INITPROC: INITALL #This is an optional field which allows to control which targets are observed or not based on elevation limits. The two values are degrees and are the lower and the upper limit #respectively. If the keyword is not provided the default values will be kept by the system -ELEVATIONLIMITS 15.0 80.0 +ELEVATIONLIMITS: 15.0 80.0 #The schedule itself, the fields are tab separated diff --git a/Common/Servers/Scheduler/templates/schedule_ws.tmpl b/Common/Servers/Scheduler/templates/schedule_ws.tmpl new file mode 100644 index 000000000..bf4a83673 --- /dev/null +++ b/Common/Servers/Scheduler/templates/schedule_ws.tmpl @@ -0,0 +1,88 @@ +# A project string,it can be any combination of characters but spaces and blanks, it is not the project code which is used to compose the output +# file name but it can be used to distinguish between various activities during the project, for example A1245-Map and A1245-Calib. It is used +# to add a keyword in the file +PROJECT: skySurvey +# the name of the observer, can be any combination of characters but blanks +OBSERVER: AndreaOrlati +#the file that contains the parameters that defines the scans from the telescope positioning point of view. For +#example sidereal tracking or On the fly scan, and so on...... Every scan is enumerated +SCANLIST: scan.tmpl +#the file that contains the telescopes setups procedures (receiver, local oscillator, ....) that can be used during +#the observation. +PROCEDURELIST: config.tmpl +#file that contains the backend configurations that are required during the observation. This section is not +#mandatory provided that a NULL in the backend field of the schedule is given +BACKENDLIST: backend.tmpl +#file that contains extra information that define the scan to be passed to the the data recorder. This field is not mandatory. +SCANLAYOUT: layoutfile.tmpl +#This defines the schedule mode. +#In this example we have the LST based schedule. That means the various scans are +#performed based on LST mark. The telescope will be driven on the next scan that can be reached on time. If the target is not reachable the scan is skipped. +#The recording will start at exactly at the time mark given for the scan. The stop recording command will be issued at the time which is the result of scheduled start time plus +#the scheduled duration. +#The second parameter is the number of repetitions, it means the times the schedule is repeated. A -1 means +#repeat continuously. A zero or null is not allowed. +MODE: LST 1 +#in this mode the single scans are performed sequentially in the order they appear in the schedule. In that +#mode no timestamps are required. The target is checked top be above the horizon, if the test is failed the scan is skipped. The start to the acquisition is given when +#the telescope is on target. The stop time will be at effective start time plus the scheduled duration. In that mode the schedule is continuously run. +#The second argument, which is optional gives the start LST for the schedule. +#MODE: SEQ +#MODE: SEQ 21:15:36.00 +#this field is used to enumerate the scans of the schedule. The first scan will be marked with the number reported here. +# The identifier will be incremented every scan....and stored into the output file. If negative, or not given (this field is not mandatory) the +# enumeration capability is turned off. +SCANTAG: 1024 +#This procedure will be executed once at the start of the schedule. It could be NULL, in that case nothing is done. If not present it is considered to be +# NULL. The procedure must be defined in the PROCEDURELIST file. It is always executed in blocking mode, the schedule is started only when the procedure +# has been done. +INITPROC: INITALL +#This is an optional field which allows to control which targets are observed or not based on elevation limits. The two values are degrees and are the lower and the upper limit +#respectively. If the keyword is not provided the default values will be kept by the system +ELEVATIONLIMITS: 15.0 80.0 + + +#The schedule itself, the fields are tab separated +#the keyword SCAN identifies the beginning of a scan, a scan includes all the subscan enlisted before the next SCAN keyword or the end of the schedule. +#SCAN scan_id suffix backend:writer [layout] +#scan_id is progressive number (zero is not allowed) (must be unique in the schedule) that identifies the current scan. +#suffix this is the suffix of the output file. The final name of the file will be composed by the date and time of observation then the local sidereal time +# (if the schedule is LST) then the project name and at the end the suffix. +#backend this field reports about the definition (in BACKENDLIST file) to be used in the current scan. After the colon the scheduler +# expects to find the instance of the data receiver to be used. The provided name could be composed by any litteral or numerical character. +# There is reserved string that has special meanings. "NULL" means that the scan must be done with no acquisition. +#writer name of the writer instance in charge to store the data. There is reserved string that has special meanings. +# "NULL" means that the data coming from the backend are not to be stored. +#layout this is the label of the current layout to be used for the current scan. If provided the scan layout file must be given and the corresponding layout must +# exists in the file +#The subscan definition match the following pattern: +#subscan_id [startLST] duration scan PreScan PostScan +#subscan_id is the identifier of the subscan. The format must be scanid_subscanid, where the scanid and subscanid are integers, the former must match the id of the above +# scan, the former can be any positive number (a part from zero) that cannot be repeated twice inside the same scan. +#startLST if the schedule is a LST schedule this field stores the local sidereal time to start the current subscan, the format is hh:mm:ss.sss. The antenna is moved +# in the correct position in advance and the data acquisition is started. No time repetitions are allowed and +# the various times must be incrementally ordered. 00:00:00 could come after 23:59:59. +#duration number of seconds that the scan is supposed to perform data recording. After that period the data recording is stopped. +#scan the scan number (inside the file given in SCANLIST section) +#PreScan A name of a procedure that must be executed before the scan starts. It may be NULL in that case nothing is done. +# If not reported in the procedure list file the schedule is considered correct; the system will try to match the procedure with one of the system commands at +# runtime. The procedure can also be given a list of arguments. +# The default behavior is that the scheduler will wait for the procedure to finish before doing anything else. If this is not the desired approach a '@' must +# be appended to the procedure name,in that case the scheduler won't wait for the procedure completion. +#PostScan A name of a procedure that must be executed at the end of the scan. It may be NULL in that case nothing is done. It has to be reported in the procedure list file. +# The async/sync execution mode is identical to the prescan procedure. + +SC: 1 dr21 STD:MANAGEMENT/MBFits EQMAPLAYOUT +1_1 10:12:04.000 60.0 1 STANDARDPRESCAN@ STANDARDPOSTSCAN +1_2 10:12:25.000 100.0 12 NULL NULL +1_10 10:14:04.000 60.0 1 STANDARDPRESCAN@ STANDARDPOSTSCAN +1_11 10:16:29.000 60.0 1 NULL ENDSCAN=10.66@ + +SC: 2 mySource HIGH:MANAGEMENT/MBFits +2_1 10:30:14.000 300.0 4 STANDARDPRESCAN NULL +2_2 10:45:16.000 6.0 9 NULL NULL + +#id duration scan PreScan PostScan backend Writer +SC: 3 dr21 LOW::MANAGEMENT/FitsZilla +3_1 11:30:10.000 60.0 1 STANDARDPRESCAN NULL +3_2 11:36:22.200 60.0 1 STANDARDPRESCAN NULL -- GitLab From 989660728f580a08c01edeb570ae63727693e976 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Fri, 4 Apr 2025 17:10:38 +0200 Subject: [PATCH 147/150] Fix #922, SRT MS configurations are not hardcoded anymore (#923) This branch contains also some other fixes for the SRT minor servos - Replaced the word 'LookupTables' with 'Polynomial' or 'Coefficients'. - Reviewed some logging lines that erroneously appeared in the LoggingDisplay even though they were not supposed to. --- .../Boss/Configurations/Configurations.xml | 27 ++++ .../GFR/Coefficients/Coefficients.xml | 29 ++++ .../GFR/LookupTables/LookupTables.xml | 32 ----- .../M3R/Coefficients/Coefficients.xml | 19 +++ .../M3R/LookupTables/LookupTables.xml | 18 --- .../PFP/Coefficients/Coefficients.xml | 35 +++++ .../PFP/LookupTables/LookupTables.xml | 33 ----- .../SRP/Coefficients/Coefficients.xml | 99 ++++++++++++++ .../SRP/LookupTables/LookupTables.xml | 125 ------------------ .../Boss/Configurations/Configurations.xml | 28 ++++ .../GFR/Coefficients/Coefficients.xml | 31 +++++ .../GFR/LookupTables/LookupTables.xml | 34 ----- .../M3R/Coefficients/Coefficients.xml | 19 +++ .../M3R/LookupTables/LookupTables.xml | 18 --- .../SRP/Coefficients/Coefficients.xml | 99 ++++++++++++++ .../SRP/LookupTables/LookupTables.xml | 125 ------------------ .../idl/SRTMinorServo.idl | 3 +- .../include/SRTMinorServoContainers.h | 27 +--- .../PFP/Coefficients/Coefficients.xml | 35 +++++ .../PFP/LookupTables/LookupTables.xml | 33 ----- .../config/CDB/schemas/SRTMinorServoBoss.xsd | 14 ++ .../CDB/schemas/SRTMinorServoCoefficients.xsd | 33 +++++ .../CDB/schemas/SRTMinorServoLookupTable.xsd | 53 -------- .../include/SRTMinorServoBossCore.h | 10 ++ .../include/SRTMinorServoBossImpl.h | 4 +- .../SRTMinorServo/include/SRTMinorServoImpl.h | 9 +- SRT/Servers/SRTMinorServo/src/Makefile | 2 +- .../src/SRTBaseMinorServoImpl.cpp | 67 +++++++--- .../src/SRTMinorServoBossCore.cpp | 61 +++++++-- .../src/SRTMinorServoParkThread.cpp | 6 +- .../src/SRTMinorServoScanThread.cpp | 4 +- .../src/SRTMinorServoSetupThread.cpp | 12 +- .../src/SRTMinorServoTrackingThread.cpp | 6 +- .../src/SRTProgramTrackMinorServoImpl.cpp | 4 +- 34 files changed, 603 insertions(+), 551 deletions(-) create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml delete mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml delete mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml delete mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml delete mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml create mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCoefficients.xsd delete mode 100644 SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd diff --git a/SRT/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml b/SRT/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml new file mode 100644 index 000000000..5159bf12d --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml @@ -0,0 +1,27 @@ + + + + + + LLP Primario + PPP Primario + PLP Primario + HHP Primario + XKP Primario + CCG Gregoriano1 + KKG Gregoriano2 + WWG Gregoriano3 + QQG Gregoriano4 + CTR Gregoriano5 + MISTRAL Gregoriano6 + CCB BWG1 + XB BWG3 + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml new file mode 100644 index 000000000..d48dd3cd6 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml @@ -0,0 +1,29 @@ + + + + + + + + CCG ROTATION

-88.70659

+ + KKG ROTATION

-159.8899

+ + WWG ROTATION

90.971610

+ + QQG ROTATION

162.771

+ + CTR ROTATION

55.373967

+ + MISTRAL ROTATION

-51.821170

+ + + + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml deleted file mode 100644 index 9481f7890..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - ROTATION -88.70659 - ROTATION -88.70659 - ROTATION -159.8899 - ROTATION -159.8899 - ROTATION 90.971610 - ROTATION 90.971610 - ROTATION 162.771 - ROTATION 162.771 - ROTATION 55.373967 - ROTATION 55.373967 - ROTATION -51.821170 - ROTATION -51.821170 - - - - - - - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml new file mode 100644 index 000000000..296a8bdb4 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml @@ -0,0 +1,19 @@ + + + + + + + + CCBROTATION

44.95999544939037931

+ + XB ROTATION

135.003886290282340384

+ +
diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml deleted file mode 100644 index cfc134bab..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - ROTATION 44.95999544939037931 - ROTATION 44.95999544939037931 - ROTATION 135.003886290282340384 - ROTATION 135.003886290282340384 - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml new file mode 100644 index 000000000..b553b2235 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml @@ -0,0 +1,35 @@ + + + + + + + + LLPTX

0

+ LLPTZ

0

+ LLPRTHETA

0

+ + PPPTX

0

+ PPPTZ

0

+ PPPRTHETA

0

+ + PLPTX

0

+ PLPTZ

0

+ PLPRTHETA

0

+ + HHPTX

0

+ HHPTZ

0

+ HHPRTHETA

0

+ + XKPTX

0

+ XKPTZ

0

+ XKPRTHETA

0

+ +
diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml deleted file mode 100644 index 086b3785b..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml new file mode 100644 index 000000000..23ce8bfe3 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml @@ -0,0 +1,99 @@ + + + + + + + + CCG TX

-1.5

+ CCG TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ CCG TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ CCG RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ CCG RY

-0.036111111111111108

+ CCG RZ

0

+ + CCG_AS_OFFTX

-1.5

+ CCG_AS_OFFTY

28.256852219272844, -0.002707044952, -0.009870218853, 0.000031617958

+ CCG_AS_OFFTZ

9.530113849340003, -0.169826241752, 0.000419997047, 0.000003985237

+ CCG_AS_OFFRX

-0.011392527142374848, -0.0001426193499425, 0.000039508844799, -0.000000131010010

+ CCG_AS_OFFRY

-0.03611111111111111

+ CCG_AS_OFFRZ

0

+ + KKG TX

-1.5

+ KKG TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ KKG TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ KKG RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ KKG RY

-0.036111111111111108

+ KKG RZ

0

+ + KKG_AS_OFFTX

-1.5

+ KKG_AS_OFFTY

28.256852219272844, -0.002707044952, -0.009870218853, 0.000031617958

+ KKG_AS_OFFTZ

9.530113849340003, -0.169826241752, 0.000419997047, 0.000003985237

+ KKG_AS_OFFRX

-0.011392527142374848, -0.0001426193499425, 0.000039508844799, -0.000000131010010

+ KKG_AS_OFFRY

-0.03611111111111111

+ KKG_AS_OFFRZ

0

+ + WWG TX

0

+ WWG TY

0

+ WWG TZ

0

+ WWG RX

0

+ WWG RY

0

+ WWG RZ

0

+ + QQG TX

0

+ QQG TY

0

+ QQG TZ

0

+ QQG RX

0

+ QQG RY

0

+ QQG RZ

0

+ + CTR TX

0

+ CTR TY

0

+ CTR TZ

0

+ CTR RX

0

+ CTR RY

0

+ CTR RZ

0

+ + MISTRAL TX

-1.5

+ MISTRAL TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ MISTRAL TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ MISTRAL RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ MISTRAL RY

-0.036111111111111108

+ MISTRAL RZ

0

+ + CCB TX

-1.5

+ CCB TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ CCB TZ

91.5590595452, -16.4202062811, 1.16941963489, -0.040640240455, 0.000733782714288, -6.62393455442e-06, 2.36410838911e-08

+ CCB RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ CCB RY

-0.036111111111111108

+ CCB RZ

0

+ + CCB_AS_OFFTX

-1.5

+ CCB_AS_OFFTY

28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958

+ CCB_AS_OFFTZ

9.530113849340003,-0.169826241752,0.000419997047,0.000003985237

+ CCB_AS_OFFRX

-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010

+ CCB_AS_OFFRY

-0.03611111111111111

+ CCB_AS_OFFRZ

0

+ + XB TX

-1.5

+ XB TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ XB TZ

-38.3143893309, 4.30888128547, -0.18265795755, 0.00350049382452, -3.17057523513e-05, 1.11006707448e-07

+ XB RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ XB RY

-0.036111111111111108

+ XB RZ

0

+ + XB_AS_OFF TX

-1.5

+ XB_AS_OFF TY

28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958

+ XB_AS_OFF TZ

7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07

+ XB_AS_OFF RX

-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010

+ XB_AS_OFF RY

-0.03611111111111111

+ XB_AS_OFF RZ

0

+ +
diff --git a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml deleted file mode 100644 index 0cabed4bb..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 - RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 - RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 - RY-0.036111111111111108 - RZ0 - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml new file mode 100644 index 000000000..bf0a20bd8 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/Boss/Configurations/Configurations.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + CCG Gregoriano1 + KKG Gregoriano2 + WWG Gregoriano3 + QQG Gregoriano4 + CTR Gregoriano5 + MISTRAL Gregoriano6 + CABINET Gregoriano7 + CCB BWG1 + XB BWG3 + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml new file mode 100644 index 000000000..df4600854 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/Coefficients/Coefficients.xml @@ -0,0 +1,31 @@ + + + + + + + + CCG ROTATION

-88.70659

+ + KKG ROTATION

-159.8899

+ + WWG ROTATION

90.971610

+ + QQG ROTATION

162.771

+ + CTR ROTATION

55.373967

+ + MISTRAL ROTATION

-51.821170

+ + CABINET ROTATION

40

+ + + +
diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml deleted file mode 100644 index c8cb3564c..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/GFR/LookupTables/LookupTables.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - ROTATION -88.70659 - ROTATION -88.70659 - ROTATION -159.8899 - ROTATION -159.8899 - ROTATION 90.971610 - ROTATION 90.971610 - ROTATION 162.771 - ROTATION 162.771 - ROTATION 55.373967 - ROTATION 55.373967 - ROTATION -51.821170 - ROTATION -51.821170 - - ROTATION 40 - - - - - - - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml new file mode 100644 index 000000000..296a8bdb4 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml @@ -0,0 +1,19 @@ + + + + + + + + CCBROTATION

44.95999544939037931

+ + XB ROTATION

135.003886290282340384

+ +
diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml deleted file mode 100644 index 2c09bec47..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/LookupTables/LookupTables.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - ROTATION -44.95999544939037931 - ROTATION -44.95999544939037931 - ROTATION -135.003886290282340384 - ROTATION -135.003886290282340384 - - diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml new file mode 100644 index 000000000..b7490f861 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/Coefficients/Coefficients.xml @@ -0,0 +1,99 @@ + + + + + + + + CCG TX

-1.5

+ CCG TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ CCG TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ CCG RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ CCG RY

-0.036111111111111108

+ CCG RZ

0

+ + CCG_AS_OFFTX

-1.5

+ CCG_AS_OFFTY

28.256852219272844, -0.002707044952, -0.009870218853, 0.000031617958

+ CCG_AS_OFFTZ

9.530113849340003, -0.169826241752, 0.000419997047, 0.000003985237

+ CCG_AS_OFFRX

-0.011392527142374848, -0.0001426193499425, 0.000039508844799, -0.000000131010010

+ CCG_AS_OFFRY

-0.03611111111111111

+ CCG_AS_OFFRZ

0

+ + KKG TX

-1.5

+ KKG TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ KKG TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ KKG RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ KKG RY

-0.036111111111111108

+ KKG RZ

0

+ + KKG_AS_OFFTX

-1.5

+ KKG_AS_OFFTY

28.256852219272844, -0.002707044952, -0.009870218853, 0.000031617958

+ KKG_AS_OFFTZ

9.530113849340003, -0.169826241752, 0.000419997047, 0.000003985237

+ KKG_AS_OFFRX

-0.011392527142374848, -0.0001426193499425, 0.000039508844799, -0.000000131010010

+ KKG_AS_OFFRY

-0.03611111111111111

+ KKG_AS_OFFRZ

0

+ + WWG TX

0

+ WWG TY

0

+ WWG TZ

0

+ WWG RX

0

+ WWG RY

0

+ WWG RZ

0

+ + QQG TX

0

+ QQG TY

0

+ QQG TZ

0

+ QQG RX

0

+ QQG RY

0

+ QQG RZ

0

+ + CTR TX

0

+ CTR TY

0

+ CTR TZ

0

+ CTR RX

0

+ CTR RY

0

+ CTR RZ

0

+ + MISTRAL TX

-1.5

+ MISTRAL TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ MISTRAL TZ

-15.6669651675, 1.9293068324, -0.0628990613, 0.0007771141, -0.0000032940

+ MISTRAL RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ MISTRAL RY

-0.036111111111111108

+ MISTRAL RZ

0

+ + CCB TX

-1.5

+ CCB TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ CCB TZ

91.5590595452, -16.4202062811, 1.16941963489, -0.040640240455, 0.000733782714288, -6.62393455442e-06, 2.36410838911e-08

+ CCB RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ CCB RY

-0.036111111111111108

+ CCB RZ

0

+ + CCB_AS_OFFTX

-1.5

+ CCB_AS_OFFTY

28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958

+ CCB_AS_OFFTZ

9.530113849340003,-0.169826241752,0.000419997047,0.000003985237

+ CCB_AS_OFFRX

-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010

+ CCB_AS_OFFRY

-0.03611111111111111

+ CCB_AS_OFFRZ

0

+ + XB TX

-1.5

+ XB TY

29.556666666666498, 0.263472663139432, -0.018206701940039, 0.000072373113855

+ XB TZ

-38.3143893309, 4.30888128547, -0.18265795755, 0.00350049382452, -3.17057523513e-05, 1.11006707448e-07

+ XB RX

-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053

+ XB RY

-0.036111111111111108

+ XB RZ

0

+ + XB_AS_OFF TX

-1.5

+ XB_AS_OFF TY

28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958

+ XB_AS_OFF TZ

7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07

+ XB_AS_OFF RX

-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010

+ XB_AS_OFF RY

-0.03611111111111111

+ XB_AS_OFF RZ

0

+ +
diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml deleted file mode 100644 index 0cabed4bb..000000000 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/SRP/LookupTables/LookupTables.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX0 - TY0 - TZ0 - RX0 - RY0 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-15.6669651675,1.9293068324,-0.0628990613,0.0007771141,-0.0000032940 - RX-0.0055555555555569409, 0.00014822163433269445, 0.000027586713698, -0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ9.530113849340003,-0.169826241752,0.000419997047,0.000003985237 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ91.5590595452,-16.4202062811,1.16941963489,-0.040640240455,0.000733782714288,-6.62393455442e-06,2.36410838911e-08 - RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 - RY-0.036111111111111108 - RZ0 - - TX-1.5 - TY28.256852219272844,-0.002707044952,-0.009870218853,0.000031617958 - TZ7.92754535681,-1.73279985542,0.147346047014,-0.00516934108597,7.69094654954e-05,-4.0697957632e-07 - RX-0.011392527142374848,-0.0001426193499425,0.000039508844799,-0.000000131010010 - RY-0.03611111111111111 - RZ0 - - TX-1.5 - TY29.556666666666498,0.263472663139432,-0.018206701940039,0.000072373113855 - TZ-38.3143893309,4.30888128547,-0.18265795755,0.00350049382452,-3.17057523513e-05,1.11006707448e-07 - RX-0.0055555555555569409,0.00014822163433269445,0.000027586713698,-0.000000077732053 - RY-0.036111111111111108 - RZ0 - - diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index 293610d47..b88d58942 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -135,10 +135,11 @@ module MinorServo /** * This method loads from the CDB the positioning coefficients related to the given configuration * @param configuration the string representing the name of the table from which the coefficients will be loaded + * @param as_off a boolean indicating whether the servo requires a _AS_OFF configuration * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration * @return true if the servo is in use with the current configuration, false otherwise */ - boolean setup(in string configuration) raises (ComponentErrors::ComponentErrorsEx); + boolean setup(in string configuration, in boolean as_off) raises (ComponentErrors::ComponentErrorsEx); /** * This method calculates the servo coordinates for a given elevation diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index cae77edb3..e966f532d 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -70,31 +70,6 @@ namespace MinorServo double starting_elevation = 0; }; - /** - * This dictionary contains information regarding the possibile focal configurations. - * The key indicates the configuration as known by DISCOS. - * The value is a pair, the first element of the pair is the DISCOS enumeration for the relative Leonardo configuration, - * the second element of the pair indicates whether the configuration has a ASACTIVE twin configuraiton. - */ - using DiscosConfigurationNameTableType = std::map>; - const DiscosConfigurationNameTableType DiscosConfigurationNameTable = - { - //{"LLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - //{"PPP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - //{"PLP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - //{"HHP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - //{"XKP", std::make_pair(CONFIGURATION_PRIMARY, false)}, - {"CCG", std::make_pair(CONFIGURATION_GREGORIAN1, true )}, - {"KKG", std::make_pair(CONFIGURATION_GREGORIAN2, true )}, - {"WWG", std::make_pair(CONFIGURATION_GREGORIAN3, true )}, - {"QQG", std::make_pair(CONFIGURATION_GREGORIAN4, true )}, - {"TRI", std::make_pair(CONFIGURATION_GREGORIAN5, true )}, - {"MISTRAL", std::make_pair(CONFIGURATION_GREGORIAN6, true )}, - {"CCB", std::make_pair(CONFIGURATION_BWG1, true )}, - {"XB", std::make_pair(CONFIGURATION_BWG3, true )}, - {"CABINET", std::make_pair(CONFIGURATION_GREGORIAN7, false)}, - }; - /** * This dictionary contains the Leonardo focal configurations DISCOS enumerations, alongside their name inside the Leonardo minor servo system. */ @@ -134,7 +109,7 @@ namespace MinorServo (CONFIGURATION_BWG3, 23) (CONFIGURATION_BWG4, 24); - using SRTMinorServoLookupTable = std::map>; + using SRTMinorServoCoefficientsTable = std::map>; /** * This class implements a queue of time tagged positions. it extends a simple std::map with some specific methods. diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml new file mode 100644 index 000000000..b553b2235 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/Coefficients/Coefficients.xml @@ -0,0 +1,35 @@ + + + + + + + + LLPTX

0

+ LLPTZ

0

+ LLPRTHETA

0

+ + PPPTX

0

+ PPPTZ

0

+ PPPRTHETA

0

+ + PLPTX

0

+ PLPTZ

0

+ PLPRTHETA

0

+ + HHPTX

0

+ HHPTZ

0

+ HHPRTHETA

0

+ + XKPTX

0

+ XKPTZ

0

+ XKPRTHETA

0

+ +
diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml deleted file mode 100644 index 086b3785b..000000000 --- a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/PFP/LookupTables/LookupTables.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - TX 0 - TZ 0 - RTHETA 0 - - diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd index 153014681..1456191e1 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoBoss.xsd @@ -18,6 +18,19 @@ + + + + + + + + + + + + + @@ -53,5 +66,6 @@ + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCoefficients.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCoefficients.xsd new file mode 100644 index 000000000..e51c87367 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoCoefficients.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd deleted file mode 100644 index 4470ec709..000000000 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServoLookupTable.xsd +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h index b315443a8..240e5c831 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossCore.h @@ -286,6 +286,11 @@ private: */ void reset(bool force=false); + /** + * Method that loads the focal configurations names when the boss is started + */ + std::map loadConfigurations(); + /** * Method used to retrieve a configuration value from the CDB. * @param configuration the name of the value to be read from the CDB. @@ -443,6 +448,11 @@ private: */ std::map m_current_tracking_servos; + /** + * Map that contains the possible focal configurations + */ + const std::map m_DISCOS_2_LDO_configurations; + /** * Current scan parameters. */ diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h index a22cceb6b..5321bf57d 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoBossImpl.h @@ -106,8 +106,8 @@ public: virtual CORBA::Boolean isStarting(); /** - * Method that tells if the system is using ASACTIVE lookup tables or not. - * @return a CORBA::Boolean indicating if the system is configured to use ASACTIVE lookup tables or not. + * Method that tells if the system is using AS coefficients or not. + * @return a CORBA::Boolean indicating if the system is configured to use AS coefficients or not. */ virtual CORBA::Boolean isASConfiguration(); diff --git a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h index a8254f7dd..a664462c0 100644 --- a/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h +++ b/SRT/Servers/SRTMinorServo/include/SRTMinorServoImpl.h @@ -105,10 +105,11 @@ public: /** * Asks the servo system to load the commanded configuration table. * @param configuration_name the configuration the servo system should assume. + * @param as_off a boolean indicating whether the servo should use a _AS_OFF configuration * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. * @return true if the servo is in use with the current configuration, false otherwise */ - bool setup(const char* configuration_name = ""); + bool setup(const char* configuration_name = "", CORBA::Boolean as_off = false); /** * Asks the component to calculate the servo system position starting from the given elevation. @@ -524,7 +525,7 @@ private: /** * Table containing the coefficients for the positions calculations. */ - SRTMinorServoLookupTable m_current_lookup_table; + SRTMinorServoCoefficientsTable m_current_coefficients_table; /** * Configuration of the socket object. @@ -616,7 +617,7 @@ public: /** * Setup method definition. It simply calls the SRTBaseMinorServoImpl method. */ - bool setup(const char* configuration_name = "") { return SRTBaseMinorServoImpl::setup(configuration_name); } + bool setup(const char* configuration_name = "", CORBA::Boolean as_off = false) { return SRTBaseMinorServoImpl::setup(configuration_name, as_off); } /** * Declaration of all the other inherited methods. @@ -667,7 +668,7 @@ public: * @param configuration_name the configuration the servo system should assume. * @throw ComponentErrors::ComponentErrorsEx when there is an error while trying to load the table for the given configuration. */ - bool setup(const char* configuration_name = ""); + bool setup(const char* configuration_name = "", CORBA::Boolean as_off = false); /** * Declaration of all the other inherited methods. diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index a61ed3645..141c676de 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -13,7 +13,7 @@ PY_SCRIPTS = _cover _airBlade _servoReset # On-Line Database Files # ---------------------- -CDB_SCHEMAS = SRTMinorServoCommon SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoVBrainConfiguration SRTMinorServoProperties SRTMinorServoLookupTable +CDB_SCHEMAS = SRTMinorServoCommon SRTMinorServoBoss SRTMinorServo SRTMinorServoSocketConfiguration SRTMinorServoVBrainConfiguration SRTMinorServoProperties SRTMinorServoCoefficients # ---------------------------- # Libraries (public and local) diff --git a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp index 8371127f0..ce3eca5c2 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTBaseMinorServoImpl.cpp @@ -47,7 +47,7 @@ SRTBaseMinorServoImpl::SRTBaseMinorServoImpl(const ACE_CString& component_name, m_in_use_ptr(this), m_current_setup_ptr(this), m_error_code_ptr(this), - m_current_lookup_table(), + m_current_coefficients_table(), m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) { @@ -254,11 +254,11 @@ void SRTBaseMinorServoImpl::preset(const ACS::doubleSeq& virtual_coords) std::copy(coordinates.begin(), coordinates.end(), m_commanded_virtual_positions.begin()); } -bool SRTBaseMinorServoImpl::setup(const char* configuration_name) +bool SRTBaseMinorServoImpl::setup(const char* configuration_name, CORBA::Boolean as_off) { AUTO_TRACE(m_servo_name + "::setup()"); m_in_use.store(Management::MNG_FALSE); - m_current_lookup_table.clear(); + m_current_coefficients_table.clear(); m_current_setup = ""; std::string setup_name(configuration_name); @@ -269,17 +269,21 @@ bool SRTBaseMinorServoImpl::setup(const char* configuration_name) return false; } - IRA::CDBTable table(getContainerServices(), setup_name.c_str(), std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); + IRA::CDBTable table(getContainerServices(), "configuration", std::string("DataBlock/MinorServo/" + m_servo_name).c_str()); IRA::CError error; error.Reset(); - if(!table.addField(error, "axis", IRA::CDataField::STRING)) + if(!table.addField(error, "n", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field name", 0); + } + if(!table.addField(error, "a", IRA::CDataField::STRING)) { error.setExtra("Error adding field axis", 0); } - if(!table.addField(error, "coefficients", IRA::CDataField::STRING)) + if(!table.addField(error, "p", IRA::CDataField::STRING)) { - error.setExtra("Error adding field coefficients", 0); + error.setExtra("Error adding field polynomial", 0); } if(!error.isNoError()) { @@ -296,27 +300,52 @@ bool SRTBaseMinorServoImpl::setup(const char* configuration_name) throw ex.getComponentErrorsEx(); } - table.First(); - for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + // We should try to retrieve the _AS_OFF configuration if requested. If is not found, fallback to the normal one + std::string config_name = setup_name; + if(as_off) + config_name += "_AS_OFF"; + + for(size_t j = 0; j < (as_off ? 2 : 1); j++) { - std::string axis = std::string(table["axis"]->asString()); + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + std::string name = std::string(table["n"]->asString()); + if(name != config_name) + continue; - std::vector coefficients; + std::string axis = std::string(table["a"]->asString()); - std::string coefficient_str; - std::stringstream stream(std::string(table["coefficients"]->asString())); + std::vector coefficients; - while(std::getline(stream, coefficient_str, ',')) - { - coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + std::string coefficient_str; + std::stringstream stream(std::string(table["p"]->asString())); + + while(std::getline(stream, coefficient_str, ',')) + { + coefficients.push_back(std::stod(std::regex_replace(coefficient_str, std::regex("\\s+"), ""))); + } + + m_current_coefficients_table[axis] = coefficients; } - m_current_lookup_table[axis] = coefficients; + if(m_current_coefficients_table.size() > 0) + { + // Configuration found, exit the loop + break; + } + else + { + // Reset the configuration name to the default one + config_name = setup_name; + } } table.closeTable(); - if(m_current_lookup_table.size() > 0) + if(m_current_coefficients_table.size() > 0) { + if(as_off) + setup_name += "_AS_OFF"; m_current_setup = setup_name; clearUserOffsets(); clearSystemOffsets(); @@ -344,7 +373,7 @@ ACS::doubleSeq* SRTBaseMinorServoImpl::calcCoordinates(double elevation) for(size_t axis = 0; axis < m_virtual_axes; axis++) { - std::vector coefficients = m_current_lookup_table.at(m_virtual_axes_names[axis]); + std::vector coefficients = m_current_coefficients_table.at(m_virtual_axes_names[axis]); double coordinate = 0; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp index 5e3aaeb2d..a5c499f74 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoBossCore.cpp @@ -38,7 +38,8 @@ SRTMinorServoBossCore::SRTMinorServoBossCore(SRTMinorServoBossImpl& component) : m_tracking_servos{ //{ "PFP", m_component.getContainerServices()->getComponent("MINORSERVO/PFP") }, { "SRP", m_component.getContainerServices()->getComponent("MINORSERVO/SRP") } - } + }, + m_DISCOS_2_LDO_configurations(loadConfigurations()) { AUTO_TRACE("SRTMinorServoBossCore::SRTMinorServoBossCore()"); @@ -196,17 +197,16 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) std::transform(commanded_setup.begin(), commanded_setup.end(), commanded_setup.begin(), ::toupper); - std::pair cmd_configuration; SRTMinorServoFocalConfiguration commanded_configuration; try { - cmd_configuration = DiscosConfigurationNameTable.at(commanded_setup); - commanded_configuration = cmd_configuration.first; + std::string LDO_configuration = m_DISCOS_2_LDO_configurations.at(commanded_setup); + commanded_configuration = LDOConfigurationNameTable.right.at(LDO_configuration); - if(m_as_configuration.load() == Management::MNG_TRUE && cmd_configuration.second) + if(m_as_configuration.load() == Management::MNG_FALSE) { - commanded_setup += "_ASACTIVE"; + commanded_setup += "_AS_OFF"; } } catch(std::out_of_range& oor) @@ -235,8 +235,6 @@ void SRTMinorServoBossCore::setup(std::string commanded_setup) } } - ACS_LOG(LM_FULL_INFO, "servoSetup", (LM_NOTICE, ("SETTING UP '" + commanded_setup + "' CONFIGURATION").c_str())); - m_commanded_configuration.store(commanded_configuration); m_commanded_setup = commanded_setup; @@ -336,8 +334,6 @@ void SRTMinorServoBossCore::park() return; } - ACS_LOG(LM_FULL_INFO, "servoPark", (LM_NOTICE, "PARKING")); - m_commanded_configuration.store(CONFIGURATION_PARK); m_commanded_setup = "Park"; @@ -504,7 +500,7 @@ void SRTMinorServoBossCore::setASConfiguration(std::string configuration) } // Should reload the correct setup if the system was already configured or was about to be - if(!m_commanded_setup.empty()) + if(!m_commanded_setup.empty() && m_motion_status.load() != MOTION_STATUS_PARKED) { configuration = m_commanded_setup.substr(0, m_commanded_setup.find("_")); try @@ -1460,6 +1456,49 @@ void SRTMinorServoBossCore::reset(bool force) m_error_code.store(ERROR_NO_ERROR); } +std::map SRTMinorServoBossCore::loadConfigurations() +{ + AUTO_TRACE("SRTMinorServoBossCore::loadConfigurations()"); + + IRA::CDBTable table(m_component.getContainerServices(), "configuration", std::string("DataBlock/MinorServo/Boss").c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "DISCOS", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field DISCOS", 0); + } + if(!table.addField(error, "LDO", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field LDO", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + std::map map; + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + map[std::string(table["DISCOS"]->asString())] = std::string(table["LDO"]->asString()); + } + table.closeTable(); + + return map; +} + Management::TBoolean SRTMinorServoBossCore::getCDBConfiguration(std::string which_configuration) { AUTO_TRACE("SRTMinorServoBossCore::getCDBConfiguration()"); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp index 2e6dff7e2..27bf305cc 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoParkThread.cpp @@ -22,14 +22,14 @@ void SRTMinorServoParkThread::onStart() m_status = 0; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_NOTICE, "PARK THREAD STARTED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStart()", (LM_NOTICE, "Parking MinorServos...")); } void SRTMinorServoParkThread::onStop() { AUTO_TRACE("SRTMinorServoParkThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_NOTICE, "PARK THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoParkThread::onStop()", (LM_NOTICE, "MinorServos parked")); } void SRTMinorServoParkThread::runLoop() @@ -80,7 +80,7 @@ void SRTMinorServoParkThread::runLoop() { for(const auto& [name, servo] : m_core.m_servos) { - servo->setup(""); + servo->setup("", false); } m_core.m_actual_setup = m_core.m_commanded_setup; diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp index d195b2bf1..173981e0f 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoScanThread.cpp @@ -51,7 +51,7 @@ void SRTMinorServoScanThread::onStart() auto servo = m_core.m_tracking_servos.at(m_core.m_current_scan.servo_name); m_starting_coordinates = *servo->getAxesPositions(0); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_NOTICE, + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStart()", (LM_DEBUG, ("SCAN THREAD STARTED, SCANNING " + std::to_string((int)m_core.m_current_scan.scan_range) + "MM IN " + std::to_string((int)(m_core.m_current_scan.scan_duration / 10000000)) + " SECONDS ALONG " + m_core.m_current_scan.servo_name + " " + m_core.m_current_scan.axis_name + " AXIS").c_str() )); } @@ -60,7 +60,7 @@ void SRTMinorServoScanThread::onStop() { AUTO_TRACE("SRTMinorServoScanThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_NOTICE, "SCAN THREAD STOPPED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoScanThread::onStop()", (LM_DEBUG, "SCAN THREAD STOPPED")); m_core.m_scanning.store(Management::MNG_FALSE); diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index d782a86cb..cd6c05ca4 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -27,15 +27,13 @@ void SRTMinorServoSetupThread::onStart() m_LDO_configuration = LDOConfigurationNameTable.left.at(commanded_configuration); m_gregorian_cover_position = commanded_configuration == CONFIGURATION_PRIMARY ? COVER_STATUS_CLOSED : COVER_STATUS_OPEN; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_NOTICE, ("SETUP THREAD STARTED WITH '" + m_core.m_commanded_setup + "' CONFIGURATION").c_str())); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStart()", (LM_NOTICE, ("Setting up MinorServos with '" + m_core.m_commanded_setup + "' configuration").c_str())); } void SRTMinorServoSetupThread::onStop() { AUTO_TRACE("SRTMinorServoSetupThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_NOTICE, "SETUP THREAD STOPPED")); - if(m_core.m_motion_status.load() == MOTION_STATUS_TRACKING) { try @@ -47,6 +45,8 @@ void SRTMinorServoSetupThread::onStop() ACS_SHORT_LOG((LM_ERROR, ex.errorTrace.routine)); } } + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoSetupThread::onStop()", (LM_NOTICE, "MinorServos configured")); } void SRTMinorServoSetupThread::runLoop() @@ -154,7 +154,7 @@ void SRTMinorServoSetupThread::runLoop() { try { - if(servo->setup(m_core.m_commanded_setup.c_str())) + if(servo->setup(m_core.m_commanded_setup.c_str(), m_core.m_as_configuration.load())) { m_core.m_current_servos[servo_name] = servo; try @@ -176,7 +176,7 @@ void SRTMinorServoSetupThread::runLoop() } } - if(m_core.m_commanded_setup.find("_ASACTIVE") == std::string::npos) + if(!m_core.m_as_configuration.load()) { // We commanded a configuration which does not use the active surface, therefore we need to send some slightly different coordinates with a preset command @@ -198,7 +198,7 @@ void SRTMinorServoSetupThread::runLoop() } else { - // _ASACTIVE configuration, jump directly to state 7 + // AS configuration, jump directly to state 7 m_status = 7; } diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp index b45fb40e5..e59c13750 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoTrackingThread.cpp @@ -22,16 +22,16 @@ void SRTMinorServoTrackingThread::onStart() m_point_id = 0; m_point_time = 0; - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_NOTICE, "TRACKING THREAD STARTED")); + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStart()", (LM_DEBUG, "TRACKING THREAD STARTED")); } void SRTMinorServoTrackingThread::onStop() { AUTO_TRACE("SRTMinorServoTrackingThread::onStop()"); - ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_NOTICE, "TRACKING THREAD STOPPED")); - m_core.m_elevation_tracking.store(Management::MNG_FALSE); + + ACS_LOG(LM_FULL_INFO, "SRTMinorServoTrackingThread::onStop()", (LM_DEBUG, "TRACKING THREAD STOPPED")); } void SRTMinorServoTrackingThread::runLoop() diff --git a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp index ddad515e1..925881a89 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTProgramTrackMinorServoImpl.cpp @@ -122,9 +122,9 @@ bool SRTProgramTrackMinorServoImpl::status() return status; } -bool SRTProgramTrackMinorServoImpl::setup(const char* configuration_name) +bool SRTProgramTrackMinorServoImpl::setup(const char* configuration_name, CORBA::Boolean as_off) { - bool return_value = SRTBaseMinorServoImpl::setup(configuration_name); + bool return_value = SRTBaseMinorServoImpl::setup(configuration_name, as_off); m_tracking_queue.clear(); m_total_trajectory_points.store(0); -- GitLab From f2a7e07f7856da6b8305a71442775406ecf4e82e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 7 Apr 2025 13:46:51 +0000 Subject: [PATCH 148/150] Fix M3R coefficients sign --- .../DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml | 4 ++-- .../DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml index 296a8bdb4..95038cde6 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml +++ b/SRT/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml @@ -12,8 +12,8 @@ - CCBROTATION

44.95999544939037931

+ CCBROTATION

-44.95999544939037931

- XB ROTATION

135.003886290282340384

+ XB ROTATION

-135.003886290282340384

diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml index 296a8bdb4..95038cde6 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/M3R/Coefficients/Coefficients.xml @@ -12,8 +12,8 @@ - CCBROTATION

44.95999544939037931

+ CCBROTATION

-44.95999544939037931

- XB ROTATION

135.003886290282340384

+ XB ROTATION

-135.003886290282340384

-- GitLab From e311ab51df328098a835ca47d15de4560594ca33 Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Mon, 7 Apr 2025 14:20:05 +0000 Subject: [PATCH 149/150] Update for bad check on an enumeration for SRT MS --- SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp index cd6c05ca4..f610aaf3e 100644 --- a/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp +++ b/SRT/Servers/SRTMinorServo/src/SRTMinorServoSetupThread.cpp @@ -154,7 +154,7 @@ void SRTMinorServoSetupThread::runLoop() { try { - if(servo->setup(m_core.m_commanded_setup.c_str(), m_core.m_as_configuration.load())) + if(servo->setup(m_core.m_commanded_setup.c_str(), m_core.m_as_configuration.load() == Management::MNG_TRUE ? false : true)) { m_core.m_current_servos[servo_name] = servo; try @@ -176,7 +176,7 @@ void SRTMinorServoSetupThread::runLoop() } } - if(!m_core.m_as_configuration.load()) + if(m_core.m_as_configuration.load() == Management::MNG_FALSE) { // We commanded a configuration which does not use the active surface, therefore we need to send some slightly different coordinates with a preset command -- GitLab From 97f713ab4d48866e14a28d02f85ccc56214ca72e Mon Sep 17 00:00:00 2001 From: Giuseppe Carboni Date: Tue, 8 Apr 2025 17:04:43 +0200 Subject: [PATCH 150/150] Integration of new SRT LDO derotators into centos_7_compatibility branch (#925) * Moved some method from GenericDerotator to SRTKBandDerotator The methods were not generic, they were specific methods of the old SRTKBandDerotator decommissioned interface. These methods are not even called by the DewarPositioner component, therefore it was safe to remove them from the GenericDerotator interface. * Moved another unused method * Updated GenericDerotator interface * Fix #865, fix #869, updated SRTMinorServo component The component now handles correctly a SETUP command. The component is also capable of commanding the gregorian air blade with the 'setGregorianAirBladeStatus' command. A few bugs were fixed here and there. This branch MUST be tested with the real hardware before merging it onto the centos_7_compatibility branch. * Fixed small bug * Removed redundant script * Uploading files in order to test a clean repository * Updated PyDewarPositioner for Python 3 * First LDO Derotators working implementation This commit also brings some clean up inside the SRT test CDB. All the stuff that is not used in the production environment has been moved out of the production and test environment and into the Outdated CDB. * KBand derotator updates * Moved SRTDerotators out of SRTMinorServoBossCore Each derotator now has its thread for updating its status --- .../idl/GenericDerotator.idl | 51 +- .../config/CDB/schemas/DewarPositioner.xsd | 1 + .../DewarPositioner/DewarPositionerImpl.py | 176 +++--- .../src/DewarPositioner/cdbconf.py | 1 + .../src/DewarPositioner/posgenerator.py | 135 ++--- .../src/DewarPositioner/positioner.py | 115 ++-- .../NoiseGenerator/NoiseGenerator.xml | 18 - .../BACKENDS/XBackends/XBackends.xml | 17 - .../{PFP/PFP.xml => DR_GFR1/DR_GFR1.xml} | 9 +- .../MACI/Components/MINORSERVO/GFR/GFR.xml | 4 +- .../MACI/Components/MINORSERVO/M3R/M3R.xml | 4 +- .../MACI/Components/MINORSERVO/SRP/SRP.xml | 3 +- .../MACI/Components/RECEIVERS/LO_LP/LO_LP.xml | 18 - .../SRTIFDistributor/SRTIFDistributor.xml | 18 - .../SRTLPBandReceiver/SRTLPBandReceiver.xml | 18 - .../HolographyContainer.xml | 30 - .../HolographyDXCContainer.xml | 30 - .../LocalOscillatorLPContainer.xml | 37 -- .../LocalOscillatorsContainer.xml | 37 -- .../NoiseGeneratorContainer.xml | 30 - .../PyIFDistributorContainer.xml | 27 - .../SRTLPBandContainer/SRTLPBandContainer.xml | 35 -- .../MACI/Containers/XContainer/XContainer.xml | 29 - .../DewarPositioner/KKG/Mapping/Mapping.xml | 2 +- .../DR_GFR1/Properties/Properties.xml | 18 + .../MinorServo/PFP/Properties/Properties.xml | 36 -- .../DataBlock/MinorServo/Tabella Setup.csv | 2 +- SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml | 40 ++ SRT/CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../DewarPositioner/DewarPositioner.xml | 3 +- .../Components/MINORSERVO/DR_GFR1/DR_GFR1.xml | 14 + .../DewarPositioner/KKG/Mapping/Mapping.xml | 2 +- .../DR_GFR1/Properties/Properties.xml | 18 + .../CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml | 40 ++ .../CDB/alma/RECEIVERS/Boss/Boss.xml | 2 +- .../DewarPositioner/DewarPositioner.xml | 3 +- .../idl/SRTDerotator.idl | 44 ++ .../idl/SRTMinorServo.idl | 55 +- .../idl/SRTMinorServoCommon.midl | 60 ++ .../SRTMinorServoInterface/src/Makefile | 3 +- .../idl/SRTKBandDerotator.idl | 47 +- .../include/SRTMinorServoContainers.h | 23 +- .../app-defaults/simulationStartup.xml | 10 +- .../Components/MINORSERVO/DR_GFR2/DR_GFR2.xml | 14 + .../Components/MINORSERVO/DR_GFR3/DR_GFR3.xml | 14 + .../Components/MINORSERVO/DR_PFP/DR_PFP.xml | 14 + .../MACI/Components/MINORSERVO/PFP/PFP.xml | 5 +- .../SRTSBandMFReceiver/SRTSBandMFReceiver.xml | 0 .../TestNamespace/Positioner/Positioner.xml | 0 .../Positioner00/Positioner00.xml | 0 .../Positioner01/Positioner01.xml | 0 .../Positioner02/Positioner02.xml | 0 .../Positioner03/Positioner03.xml | 0 .../AntennaBossSimContainer.xml | 0 .../PositionerContainer.xml | 0 .../Containers/PyLOContainer/PyLOContainer.py | 0 .../SRTSBandContainer/SRTSBandContainer.xml | 0 .../DR_GFR2/Properties/Properties.xml | 18 + .../DR_GFR3/Properties/Properties.xml | 18 + .../DR_PFP/Properties/Properties.xml | 18 + .../CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml | 40 ++ .../CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml | 40 ++ .../CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml | 40 ++ .../CDB/alma/MINORSERVO/PFP/PFP.xml | 0 .../config/CDB/schemas/SRTMinorServo.xsd | 45 +- SRT/Servers/SRTMinorServo/include/MSDevIOs.h | 15 +- .../SRTMinorServo/include/SRTDerotatorImpl.h | 545 ++++++++++++++++++ .../include/SRTDerotatorStatusThread.h | 63 ++ SRT/Servers/SRTMinorServo/src/Makefile | 8 +- .../SRTMinorServo/src/SRTDerotatorImpl.cpp | 490 ++++++++++++++++ .../src/SRTDerotatorStatusThread.cpp | 46 ++ 71 files changed, 1974 insertions(+), 726 deletions(-) delete mode 100644 SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml delete mode 100644 SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml rename SRT/CDB/MACI/Components/MINORSERVO/{PFP/PFP.xml => DR_GFR1/DR_GFR1.xml} (70%) delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml delete mode 100644 SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml delete mode 100644 SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml delete mode 100644 SRT/CDB/MACI/Containers/XContainer/XContainer.xml create mode 100644 SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml delete mode 100644 SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml create mode 100644 SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml create mode 100644 SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml create mode 100644 SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml create mode 100644 SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml rename SRT/{ => Outdated}/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py (100%) rename SRT/{ => Outdated}/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml (100%) create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml create mode 100644 SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml rename SRT/{Configuration => Outdated}/CDB/alma/MINORSERVO/PFP/PFP.xml (100%) create mode 100644 SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h create mode 100644 SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h create mode 100644 SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp create mode 100644 SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp diff --git a/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl b/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl index c336518c0..4a2a2ab70 100644 --- a/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl +++ b/Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl @@ -43,10 +43,7 @@ module Receivers { *

Methods

: *
    *
  • setup(): allow the derotator to be ready to move
  • - *
  • powerOff(): switch the power amplifier off
  • *
  • setPosition(): set the derotator position
  • - *
  • setSpeed(): set the derotator speed, in rpm
  • - *
  • getSpeed(): get the derotator speed, in rpm
  • *
  • getActPosition(): return the actPosition value
  • *
  • getCmdPosition(): return the cmdPosition value
  • *
  • getPositionFromHistory(t): return the the derotator position at @@ -61,7 +58,8 @@ module Receivers { *
  • isSlewing(): return true when the derotator is moving
  • *
*/ - interface GenericDerotator : ACS::CharacteristicComponent { + interface GenericDerotator + { /** * This property returns the sensor encoder position in the user @@ -125,14 +123,6 @@ module Receivers { ); - /** Switch the power amplifier off - * - * @throw CORBA::SystemException - * @throw ComponentErrors::ComponentErrorsEx - */ - void powerOff() raises (ComponentErrors::ComponentErrorsEx); - - /** * @return the actPosition property value * @@ -147,6 +137,17 @@ module Receivers { ); + /** + * This method loads a position that has to be tracked by the derotator + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the derotator and the points after are always spaced by the same amount of time from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param position the position to track at the given time + * @param restart flag that says the given point is the first of a new trajectory + */ + void loadTrackingPoint(in ACS::Time point_time, in double position, in boolean restart) raises (DerotatorErrors::DerotatorErrorsEx); + + /** * @return the cmdPosition property value * @@ -178,32 +179,6 @@ module Receivers { double getPositionFromHistory(in ACS::Time t) raises (ComponentErrors::ComponentErrorsEx); - /** - * Set the derotator speed - * - * @arg speed speed in rpm - * @throw ComponentErrors::ComponentErrorsEx, - * @throw DerotatorErrors::DerotatorErrorsEx - */ - void setSpeed(in unsigned long speed) raises ( - ComponentErrors::ComponentErrorsEx, - DerotatorErrors::DerotatorErrorsEx - ); - - - /** - * Get the derotator speed - * - * @return the derotator speed in rpm - * @throw ComponentErrors::ComponentErrorsEx, - * @throw DerotatorErrors::DerotatorErrorsEx - */ - unsigned long getSpeed() raises ( - ComponentErrors::ComponentErrorsEx, - DerotatorErrors::DerotatorErrorsEx - ); - - /** * Return the maximum position value allowed. * @throw CORBA::SystemException diff --git a/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd b/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd index d9bb3de64..45d7b2f39 100644 --- a/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd +++ b/Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd @@ -25,6 +25,7 @@ + diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py index f41d8a955..2d03721d2 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py @@ -75,9 +75,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.supplier = Supplier(Receivers.DEWAR_POSITIONER_DATA_CHANNEL) except CORBAProblemExImpl as ex: logger.logError('cannot create the dewar positioner data channel') - logger.logDebug('cannot create the data channel: %s' %ex.message) + logger.logDebug('cannot create the data channel: %s' %ex) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) try: @@ -89,9 +89,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.statusThread.start() except AttributeError as ex: logger.logWarning('supplier not available') - logger.logDebug('supplier not available: %s' %ex.message) + logger.logDebug('supplier not available: %s' %ex) except Exception as ex: - logger.logError('cannot create the status thread: %s' %ex.message) + logger.logError('cannot create the status thread: %s' %ex) def initialize(self): addProperty(self, 'status', devio_ref=StatusDevIO(self.positioner)) @@ -104,9 +104,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): if self.statusThread.isAlive(): logger.logError('thread %s is alive' %self.statusThread.getName()) except AttributeError as ex: - logger.logDebug('self has no attribute `supplier`: %s' %ex.message) + logger.logDebug('self has no attribute `supplier`: %s' %ex) except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) finally: self.control.stop = False @@ -119,15 +119,15 @@ class DewarPositionerImpl(POA, cc, services, lcycle): deviceName = self.cdbconf.getAttribute('DerotatorName') device = self.client.getComponent(deviceName) except CannotGetComponentEx as ex: - reason = "cannot get the %s component: %s" %(deviceName, ex.message) + reason = "cannot get the %s component: %s" %(deviceName, ex) logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() try: @@ -137,7 +137,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): latitude_dec, compl = lat_obj.get_sync() latitude = radians(latitude_dec) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logWarning('cannot get the site information: %s' %reason) latitude = radians(float(self.cdbconf.getAttribute('Latitude'))) logger.logWarning('setting the default latitude value: %.2f radians' %latitude) @@ -163,9 +163,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.actualSetup = self.commandedSetup logger.logNotice('derotator %s setup done' %self.commandedSetup) except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except ComponentErrors.ComponentErrorsEx as ex: data_list = ex.errorTrace.data # A list @@ -175,7 +175,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', reason) @@ -191,14 +191,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): logger.logWarning('positioner not ready: a setup() is required') self.positioner.park() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() finally: self._setDefaultSetup() @@ -209,19 +209,19 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getPosition() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position") raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -229,14 +229,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getMaxLimit() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -244,14 +244,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getMinLimit() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -259,33 +259,33 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getPositionFromHistory(t) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except (DerotatorErrors.CommunicationErrorEx, ComponentErrors.ComponentErrorsEx) as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason("Cannot get the derotator position at the time %s" %s) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def getCmdPosition(self): try: return self.positioner.getCmdPosition() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -293,14 +293,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setPosition(position) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -355,19 +355,19 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.startUpdating(axis, sector, az, el, ra, dec) except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) - exc = ComponentErrorsImpl.UnexpectedExImpl(ex.message) - exc.setData('Reason', ex.message) + logger.logError(ex) + exc = ComponentErrorsImpl.UnexpectedExImpl(ex) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def stopUpdating(self): @@ -375,14 +375,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.stopUpdating() except PositionerError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.OperationErrorExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() logger.logNotice('derotator position updating stopped') @@ -391,9 +391,9 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setAutoRewindingSteps(steps) except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() @@ -409,15 +409,15 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.rewind(steps) except (PositionerError, NotAllowedError) as ex: - reason = "cannot rewind the derotator: %s" %ex.message + reason = "cannot rewind the derotator: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -433,14 +433,14 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.getRewindingStep() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -454,45 +454,45 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: return self.positioner.isReady() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is ready: %s" %ex.message + reason = "cannot known if the derotator is ready: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isSlewing(self): try: return self.positioner.isSlewing() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is slewing: %s" %ex.message + reason = "cannot known if the derotator is slewing: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isTracking(self): try: return self.positioner.isTracking() except DerotatorErrors.CommunicationErrorEx as ex: - reason = "cannot known if the derotator is tracking: %s" %ex.message + reason = "cannot known if the derotator is tracking: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def isUpdating(self): @@ -502,40 +502,40 @@ class DewarPositionerImpl(POA, cc, services, lcycle): try: self.positioner.setOffset(offset) except (PositionerError, NotAllowedError) as ex: - reason = "cannot set the derotator offset: %s" %ex.message + reason = "cannot set the derotator offset: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() def clearOffset(self): try: self.positioner.clearOffset() except PositionerError as ex: - reason = "cannot set the derotator offset: %s" %ex.message + reason = "cannot set the derotator offset: %s" %ex logger.logError(reason) exc = ComponentErrorsImpl.OperationErrorExImpl() exc.setReason(reason) raise exc.getComponentErrorsEx() except NotAllowedError as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.NotAllowedExImpl() - exc.setReason(ex.message) + exc.setReason(ex) raise exc.getComponentErrorsEx() except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) exc = ComponentErrorsImpl.UnexpectedExImpl() - exc.setData('Reason', ex.message) + exc.setData('Reason', ex) raise exc.getComponentErrorsEx() @@ -556,7 +556,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): mode = mode.upper().strip() self.positioner.setRewindingMode(mode) except PositionerError as ex: - reason = 'cannot set the rewinding mode: %s' %ex.message + reason = 'cannot set the rewinding mode: %s' %ex logger.logError(reason) exc = ComponentErrorsImpl.ValidationErrorExImpl() exc.setReason(reason) @@ -584,7 +584,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): self.positioner.control.clearScanInfo() self.cdbconf.setConfiguration(confCode.upper()) except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex logger.logError(reason) exc = ComponentErrorsImpl.UnexpectedExImpl() exc.setData('Reason', reason) @@ -633,7 +633,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): supplier.publishEvent(simple_data=event) error = False except Exception as ex: - reason = ex.getReason() if hasattr(ex, 'getReason') else ex.message + reason = ex.getReason() if hasattr(ex, 'getReason') else ex if not error: logger.logError('cannot publish the status: %s' %reason) error = True @@ -658,7 +658,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): answer = 'Error - invalid command: maybe there are too many symbols of =' except Exception as ex: success = False - answer = ex.message + answer = ex else: success = True @@ -712,7 +712,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): except (ValueError, TypeError) as ex: success = False answer = 'Error - wrong parameter usage.\nType help(%s) for details' %command - logger.logError('%s\n%s' %(ex.message, answer)) + logger.logError('%s\n%s' %(ex, answer)) return (success, answer) except ComponentErrors.ComponentErrorsEx as ex: success = False @@ -723,7 +723,7 @@ class DewarPositionerImpl(POA, cc, services, lcycle): return (success, answer) except Exception as ex: success = False - msg = ex.message if ex.message else 'unexpected exception' + msg = ex if ex else 'unexpected exception' answer = 'Error - %s' %(ex.getReason() if hasattr(ex, 'getReason') else msg) logger.logError(answer) return (success, answer) diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py index e31369e9e..40b7a3b58 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py @@ -11,6 +11,7 @@ class CDBConf(object): componentAttributes = ( 'UpdatingTime', + 'TrackingLeadTime', 'RewindingSleepTime', 'RewindingTimeout', 'DefaultConfiguration', diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py index 935a1dc74..f6f6820e8 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py @@ -1,124 +1,98 @@ -"""This module implements the position generators""" +"""This module implements the position calculation functions""" import datetime import time -from math import sin, cos, tan, atan2, degrees +from math import sin, cos, tan, atan2, degrees, isclose from IRAPy import logger from Acspy.Common.TimeHelper import getTimeStamp class PosGenerator(object): - def __init__(self, zdtimeout=5): - self.zdtimeout = zdtimeout # Timeout in case of zero division error + def __init__(self, updatingTime, trackingLeadTime): + self.updatingTime = updatingTime + self.trackingLeadTime = trackingLeadTime self.mapping = { 'parallactic': { - 'getAngleFunction': PosGenerator.getParallacticAngle, + 'getAngleFunction': PosGenerator.getParallacticAngle, 'coordinateFrame': 'horizontal' }, 'galacticParallactic': { - 'getAngleFunction': PosGenerator.getGalacticParallacticAngle, + 'getAngleFunction': PosGenerator.getGalacticParallacticAngle, 'coordinateFrame': 'equatorial' }, } - + def goto(self, iStaticPos): yield iStaticPos - # TODO: refactoring required, in order to put all the parallactic and - # galacticParallactic common code in one place - def parallactic(self, source, siteInfo): + def parallactic(self, source, siteInfo, t): """Return the parallactic angle""" + latitude = PosGenerator.getLatitude(siteInfo) + try: - latitude = siteInfo['latitude'] - except (KeyError, TypeError) as ex: - raise PosGeneratorError('cannot get the latitude: %s' %ex.message) + coordinates = source.getApparentCoordinates(t) # Values in radians + az, el = coordinates[:2] # The first two elements are (az, el) + position = PosGenerator.getParallacticAngle(latitude, az, el) + return position except Exception as ex: - raeson = 'unexpected exception getting the site latitude' - logger.logNotice(raeson) + raeson = 'cannot get the %s (az, el) values' %source._get_name() + logger.logNotice('%s: %s' %(raeson, ex)) raise PosGeneratorError(raeson) - last_zerodiv_time = datetime.datetime.now() - while True: - try: - t = getTimeStamp().value + 1*10*6 # 100 ms in the future - coordinates = source.getApparentCoordinates(t) # Values in radians - az, el = coordinates[:2] # The first two elements are (az, el) - position = PosGenerator.getParallacticAngle(latitude, az, el) - yield position - last_zerodiv_time = datetime.datetime.now() - except ZeroDivisionError: - logger.logWarning('zero division error computing the parallactic angle') - zerodiv_time = datetime.datetime.now() - last_zerodiv_time - if zerodiv_time.seconds >= self.zdtimeout: - raeson = 'zero division for more than %ds' %self.zdtimeout - logger.logError(raeson) - raise PosGeneratorError(raeson) - else: - time.sleep(0.5) - continue - except GeneratorExit: # Required in Python 2.5: - # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ - raise - except Exception as ex: - raeson = 'cannot get the %s (az, el) values' %source._get_name() - logger.logNotice('%s: %s' %(raeson, ex.message)) - raise PosGeneratorError(raeson) - - def galacticParallactic(self, source, siteInfo): + def galacticParallactic(self, source, siteInfo, t): """Return the galactic parallactic angle""" + latitude = PosGenerator.getLatitude(siteInfo) + + try: + coordinates = source.getApparentCoordinates(t) # Values in radians + az, el, ra, dec = coordinates[:4] + position = PosGenerator.getGalacticParallacticAngle(latitude, az, el, ra, dec) + return position + except Exception as ex: + raeson = 'cannot get the %s (az, el) values' %source._get_name() + logger.logNotice('%s: %s' %(raeson, ex)) + raise PosGeneratorError(raeson) + + @staticmethod + def getLatitude(siteInfo): + """Return the site latitude""" try: - latitude = siteInfo['latitude'] + return siteInfo['latitude'] except (KeyError, TypeError) as ex: - raise PosGeneratorError('cannot get the latitude: %s' %ex.message) + raise PosGeneratorError('cannot get the latitude: %s' %ex) except Exception as ex: - raeson = 'unexpected exception getting the site latitude' + raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) - last_zerodiv_time = datetime.datetime.now() - while True: - try: - t = getTimeStamp().value + 1*10*6 # 100 ms in the future - coordinates = source.getApparentCoordinates(t) # Values in radians - az, el, ra, dec = coordinates[:4] - pg = PosGenerator.getGalacticParallacticAngle(latitude, az, el, ra, dec) - yield pg - last_zerodiv_time = datetime.datetime.now() - except ZeroDivisionError: - logger.logWarning('zero division error computing the galactic parallactic angle') - zerodiv_time = datetime.datetime.now() - last_zerodiv_time - if zerodiv_time.seconds >= self.zdtimeout: - raeson = 'zero division for more than %ds' %self.zdtimeout - logger.logError(raeson) - raise PosGeneratorError(raeson) - else: - time.sleep(0.5) - continue - except GeneratorExit: # Required in Python 2.5: - # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ - raise - except Exception as ex: - raeson = 'cannot get the %s (az, el) values' %source._get_name() - logger.logNotice('%s: %s' %(raeson, ex.message)) - raise PosGeneratorError(raeson) - @staticmethod def getParallacticAngle(latitude, az, el): """Arguments in radians""" - p = atan2(-sin(az), tan(latitude)*cos(el) - sin(el)*cos(az)) - return degrees(p) + denominator = tan(latitude) * cos(el) - sin(el) * cos(az) + + # Avoid division by zero and keep continuity + if isclose(denominator, 0, abs_tol=1e-10): + return -90.0 if sin(az) > 0 else 90.0 + + return degrees(atan2(-sin(az), denominator)) @staticmethod def getGalacticAngle(ra, dec): """Arguments in radians""" - # North celestial pole coordinates in equatorial celestial frame (j200) - # ncp = ('12 51 26.28', '27 07 41.7') + # North celestial pole coordinates in equatorial celestial frame (j2000) + # ncp = ('12 51 26.28', '27 07 41.7') # ra0 = ephem.hours(ncp[0]) # dec0 = ephem.degrees(ncp[1]) ra0 = 3.3660332687500043 dec0 = 0.47347728280415174 - g = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) - return degrees(g) + + denominator = cos(dec) * tan(dec0) - sin(dec) * cos(ra-ra0) + + # Avoid division by zero and keep continuity + if isclose(denominator, 0, abs_tol=1e-10): + return 90.0 if sin(ra-ra0) > 0 else -90.0 + + return degrees(atan2(sin(ra-ra0), denominator)) @staticmethod def getGalacticParallacticAngle(latitude, az, el, ra, dec): @@ -127,7 +101,6 @@ class PosGenerator(object): g = PosGenerator.getGalacticAngle(ra, dec) return p + g - + class PosGeneratorError(Exception): pass - diff --git a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py index 03fbc071b..62471aaa5 100644 --- a/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py +++ b/Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py @@ -25,7 +25,9 @@ class Positioner(object): The `cdbconf` parameter is a CDBConf instance. """ self.conf = cdbconf - self.posgen = PosGenerator() + self.updatingTime = int(float(self.conf.getAttribute('UpdatingTime')) * 10**7) + self.trackingLeadTime = int(float(self.conf.getAttribute('TrackingLeadTime')) * 10**7) + self.posgen = PosGenerator(self.updatingTime, self.trackingLeadTime) self._setDefault() @@ -57,12 +59,11 @@ class Positioner(object): self.is_setup = True time.sleep(0.4) # Give the device the time to accomplish the setup self.control.updateScanInfo({'iStaticPos': setupPosition}) - self._start(self.posgen.goto, setupPosition) - time.sleep(0.1) # Give the thread the time to finish + self._setPosition(setupPosition) except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: - raise PositionerError("cannot set the position: %s" %ex.message) + raise PositionerError("cannot set the position: %s" %ex) except Exception as ex: - raise PositionerError(ex.message) + raise PositionerError(ex) finally: Positioner.generalLock.release() @@ -120,7 +121,7 @@ class Positioner(object): # Set the initialPosition, in order to add it to the dynamic one self.control.user_position = position except Exception as ex: - raise PositionerError('cannot set the position: %s' %ex.message) + raise PositionerError('cannot set the position: %s' %ex) def _setPosition(self, position): @@ -130,11 +131,11 @@ class Positioner(object): self.device.setPosition(self.control.target) except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: raeson = "cannot set the %s position" %self.device._get_name() - logger.logError('%s: %s' %(raeson, ex.message)) + logger.logError('%s: %s' %(raeson, ex)) raise PositionerError(raeson) except Exception as ex: raeson = "unknown exception setting the %s position" %self.device._get_name() - logger.logError('%s: %s' %(raeson, ex.message)) + logger.logError('%s: %s' %(raeson, ex)) raise PositionerError(raeson) else: raise OutOfRangeError("position %.2f out of range {%.2f, %.2f}" @@ -179,22 +180,20 @@ class Positioner(object): dParallacticPos=0, rewindingOffset=0, ) - self._start(self.posgen.goto, position) + self._setPosition(position) + self.control.mustUpdate = False else: posgen = getattr(self.posgen, functionName) angle_mapping = self.posgen.mapping[functionName] getAngleFunction = self.posgen.mapping[functionName]['getAngleFunction'] coordinateFrame = self.posgen.mapping[functionName]['coordinateFrame'] lat = self.siteInfo['latitude'] - try: - if coordinateFrame == 'horizontal': - iParallacticPos = getAngleFunction(lat, az, el) - elif coordinateFrame == 'equatorial': - iParallacticPos = getAngleFunction(lat, az, el, ra, dec) - else: - raise PositionerError('coordinate frame %s unknown' %coordinateFrame) - except ZeroDivisionError: - raise NotAllowedError('zero division error computing p(%.2f, %.2f)' %(az, el)) + if coordinateFrame == 'horizontal': + iParallacticPos = getAngleFunction(lat, az, el) + elif coordinateFrame == 'equatorial': + iParallacticPos = getAngleFunction(lat, az, el, ra, dec) + else: + raise PositionerError('coordinate frame %s unknown' %coordinateFrame) self.control.setScanInfo( axis=axis, @@ -204,15 +203,19 @@ class Positioner(object): dParallacticPos=0, rewindingOffset=0, ) - self._start(posgen, self.source, self.siteInfo) - self.control.mustUpdate = True + self._start( + posgen, + self.source, + self.siteInfo + ) + self.control.mustUpdate = True except Exception as ex: - raise PositionerError('configuration problem: %s' %ex.message) + raise PositionerError('configuration problem: %s' %ex) finally: Positioner.generalLock.release() - def _updatePosition(self, posgen, vargs): + def _updatePosition(self, posgen, source, siteInfo): try: self.control.isRewindingRequired = False self.control.isRewinding = False @@ -229,20 +232,48 @@ class Positioner(object): else: isOptimized = False - for position in posgen(*vargs): + new_trajectory = True + while True: if self.control.stop: break else: try: + if new_trajectory: + t = getTimeStamp().value + self.trackingLeadTime + position = posgen(source, siteInfo, t) Pis = self.control.scanInfo['iStaticPos'] + self.control.scanInfo['rewindingOffset'] Pip = self.control.scanInfo['iParallacticPos'] - Pdp = 0 if posgen.__name__ == 'goto' else (position - Pip) + Pdp = position - Pip target = Pis + Pdp if isOptimized else Pis + Pip + Pdp self.control.scanInfo.update({'dParallacticPos': Pdp}) - self._setPosition(target) # _setPosition() will add the offset - time.sleep(float(self.conf.getAttribute('UpdatingTime'))) + + self.control.target = target + self.control.offset + if self.device.getMinLimit() < self.control.target < self.device.getMaxLimit(): + try: + self.device.loadTrackingPoint(t, self.control.target, new_trajectory) + new_trajectory = False + t += self.updatingTime + except (DerotatorErrors.PositioningErrorEx, DerotatorErrors.CommunicationErrorEx) as ex: + raeson = "cannot set the %s position" %self.device._get_name() + logger.logError('%s: %s' %(raeson, ex)) + raise PositionerError(raeson) + except Exception as ex: + raeson = "unknown exception setting the %s position" %self.device._get_name() + logger.logError('%s: %s' %(raeson, ex)) + raise PositionerError(raeson) + else: + raise OutOfRangeError("position %.2f out of range {%.2f, %.2f}" + %(self.control.target, self.device.getMinLimit(), self.device.getMaxLimit())) + # We calculate the time to sleep + # Next point of the trajectory - TrackingLeadTime - now + # slightly less than UpdatingTime + # The resulting cycle should be around + # TrackingLeadTime seconds before the next point + time_to_sleep = max(0, t - self.trackingLeadTime - getTimeStamp().value) + time.sleep(float(time_to_sleep) / 10**7) except OutOfRangeError as ex: - logger.logInfo(ex.message) + new_trajectory = True + logger.logInfo(ex) self.control.isRewindingRequired = True if self.control.modes['rewinding'] == 'AUTO': try: @@ -250,7 +281,7 @@ class Positioner(object): except Exception as ex: # In case of wrong autoRewindingSteps self.control.isRewindingRequired = True - logger.logError('cannot rewind: %s' %ex.message) + logger.logError('cannot rewind: %s' %ex) break else: if self.control.modes['rewinding'] == 'MANUAL': @@ -262,16 +293,16 @@ class Positioner(object): else: logger.logError('wrong rewinding mode: %s' %self.control.modes['rewinding']) except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) break self.control.mustUpdate = False except KeyboardInterrupt: logger.logInfo('stopping Positioner._updatePosition() due to KeyboardInterrupt') except AttributeError as ex: logger.logError('Positioner._updatePosition(): attribute error') - logger.logDebug('Positioner._updatePosition(): %s' %ex.message) + logger.logDebug('Positioner._updatePosition(): %s' %ex) except PositionerError as ex: - logger.logError('Positioner._updatePosition(): %s' %ex.message) + logger.logError('Positioner._updatePosition(): %s' %ex) except Exception as ex: logger.logError('unexcpected exception in Positioner._updatePosition(): %s' %ex) finally: @@ -315,7 +346,7 @@ class Positioner(object): self.control.isRewindingRequired = False except Exception as ex: self.control.isRewindingRequired = True - raise PositionerError(ex.message) + raise PositionerError(ex) finally: self.control.isRewinding = False Positioner.rewindingLock.release() @@ -417,7 +448,7 @@ class Positioner(object): try: Positioner.generalLock.acquire() self.control.updateScanInfo({'iStaticPos': parkPosition}) - self._start(self.posgen.goto, parkPosition) + self._setPosition(parkPosition) finally: Positioner.generalLock.release() time.sleep(0.5) # Wait the thread stops before to set the defaults @@ -466,7 +497,7 @@ class Positioner(object): Positioner.generalLock.acquire() self.stopUpdating() self.control.updateScanInfo({'iStaticPos': position}) - self._start(self.posgen.goto, position) + self._setPosition(position) finally: Positioner.generalLock.release() @@ -481,7 +512,7 @@ class Positioner(object): else: self.stopUpdating() actPosition = self.getPosition() - self._start(self.posgen.goto, actPosition) + self._setPosition(actPosition) def clearOffset(self): @@ -569,17 +600,17 @@ class Positioner(object): def clearAutoRewindingSteps(self): self.control.autoRewindingSteps = None - def _start(self, posgen, *vargs): + def _start(self, posgen, source, siteInfo): """Start a new process that computes and sets the position""" if self.isSetup(): # self.stopUpdating() # Raise a PositionerError if the process stills alive self.t = ContainerServices.ContainerServices().getThread( name=posgen.__name__, target=self._updatePosition, - args=(posgen, vargs) + args=(posgen, source, siteInfo) ) self.t.start() - time.sleep(0.10) # In case of goto, take the time to command the position + # time.sleep(0.10) # In case of goto, take the time to command the position else: raise NotAllowedError('not configured: a setConfiguration() is required') @@ -613,12 +644,12 @@ class Positioner(object): try: status_obj = self.device._get_status() except Exception as ex: - raise PositionerError('cannot get the device status property: %s' %ex.message) + raise PositionerError('cannot get the device status property: %s' %ex) try: device_status, compl = status_obj.get_sync() except Exception as ex: - raise PositionerError('cannot get the device status value: %s' %ex.message) + raise PositionerError('cannot get the device status value: %s' %ex) if compl.code: raise PositionerError('the device status value is not valid') @@ -641,7 +672,7 @@ class Positioner(object): try: binrepr = Status.dec2bin(device_status, 6) # A string of 6 values except Exception as ex: - raise PositionerError('error in Status.dec2bin(): %s' %ex.message) + raise PositionerError('error in Status.dec2bin(): %s' %ex) po, f, ce, nr, s, w = [bool(int(item)) for item in reversed(binrepr)] if po: @@ -665,7 +696,7 @@ class Positioner(object): except NotAllowedError as ex: return '000000' # Not ready except Exception as ex: - logger.logError(ex.message) + logger.logError(ex) return '100000' # Failure finally: Positioner.generalLock.release() diff --git a/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml b/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml deleted file mode 100644 index 431cf8a1d..000000000 --- a/SRT/CDB/MACI/Components/BACKENDS/NoiseGenerator/NoiseGenerator.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml b/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml deleted file mode 100644 index f008110b9..000000000 --- a/SRT/CDB/MACI/Components/BACKENDS/XBackends/XBackends.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml similarity index 70% rename from SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml rename to SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml index a5801b66d..8e6e427d6 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -5,11 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="PFP" - Code="SRTProgramTrackMinorServoImpl" + Name="DR_GFR1" + Code="SRTDerotatorImpl" ImplLang="cpp" - Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" + Type="IDL:alma/MinorServo/SRTDerotator:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml index 23da6db86..0b019b829 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/GFR/GFR.xml @@ -5,10 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="GFR" + Name="GFR" Code="SRTGenericMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml index 94efe94c9..1d904b987 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/M3R/M3R.xml @@ -5,10 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="M3R" + Name="M3R" Code="SRTGenericMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTGenericMinorServo:1.0" Container="MinorServoContainer" - Default="true" + Default="false" /> diff --git a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml index b957480d6..ebfabed00 100644 --- a/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml +++ b/SRT/CDB/MACI/Components/MINORSERVO/SRP/SRP.xml @@ -10,6 +10,5 @@ ImplLang="cpp" Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml b/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml deleted file mode 100644 index 8b5d8351b..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/LO_LP/LO_LP.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml deleted file mode 100644 index 42b5b7832..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRTIFDistributor/SRTIFDistributor.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml b/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml deleted file mode 100644 index d6732b963..000000000 --- a/SRT/CDB/MACI/Components/RECEIVERS/SRTLPBandReceiver/SRTLPBandReceiver.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml b/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml deleted file mode 100644 index b6cba5510..000000000 --- a/SRT/CDB/MACI/Containers/HolographyContainer/HolographyContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml b/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml deleted file mode 100644 index 9d7d96a62..000000000 --- a/SRT/CDB/MACI/Containers/HolographyDXCContainer/HolographyDXCContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml b/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml deleted file mode 100644 index 46868e13a..000000000 --- a/SRT/CDB/MACI/Containers/LocalOscillatorLPContainer/LocalOscillatorLPContainer.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml b/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml deleted file mode 100644 index 3ea1b6d4d..000000000 --- a/SRT/CDB/MACI/Containers/LocalOscillatorsContainer/LocalOscillatorsContainer.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml b/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml deleted file mode 100644 index b6cba5510..000000000 --- a/SRT/CDB/MACI/Containers/NoiseGeneratorContainer/NoiseGeneratorContainer.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml b/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml deleted file mode 100644 index 6b7298a73..000000000 --- a/SRT/CDB/MACI/Containers/PyIFDistributorContainer/PyIFDistributorContainer.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml b/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml deleted file mode 100644 index c555569cc..000000000 --- a/SRT/CDB/MACI/Containers/SRTLPBandContainer/SRTLPBandContainer.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml b/SRT/CDB/MACI/Containers/XContainer/XContainer.xml deleted file mode 100644 index d807ff223..000000000 --- a/SRT/CDB/MACI/Containers/XContainer/XContainer.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - diff --git a/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml b/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml index 93d131c69..7899633de 100644 --- a/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml +++ b/SRT/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml @@ -4,7 +4,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DerotatorName="RECEIVERS/SRTKBandDerotator" + DerotatorName="MINORSERVO/DR_GFR1" ObservatoryName="ANTENNA/Observatory" CoordinateSourceName="ANTENNA/Boss" SetupPosition="0.0" diff --git a/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml @@ -0,0 +1,18 @@ + + + + + + ROTARY_AXIS_ENABLED + ROTATION + ROTATION + degree + OFFSET + diff --git a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml b/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml deleted file mode 100644 index 688491e30..000000000 --- a/SRT/CDB/alma/DataBlock/MinorServo/PFP/Properties/Properties.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - X_ENABLED - Z_MASTER_ENABLED - Z_SLAVE_ENABLED - THETA_MASTER_ENABLED - THETA_SLAVE_ENABLED - - ELONG_X - ELONG_Z_MASTER - ELONG_Z_SLAVE - ELONG_THETA_MASTER - ELONG_THETA_SLAVE - - TX - TZ - RTHETA - - mm - mm - degree - - OFFSET_TX - OFFSET_TZ - OFFSET_RTHETA - diff --git a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv index 1a9f02b7e..a686bb1a5 100644 --- a/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv +++ b/SRT/CDB/alma/DataBlock/MinorServo/Tabella Setup.csv @@ -1,7 +1,7 @@ CONFIGURATION;PFP_TX;PFP_TZ;PFP_RTHETA;SRP_TX;SRP_TY;SRP_TZ;SRP_RX;SRP_RY;SRP_RZ;M3R_RZ;GFR_RZ;DR_GFR1;DR_GFR2;DR_GFR3;DR_PFP;GREGORIAN_CAP; Primario;0;0;0;-5;5;-120;0;0;0;*;*;*;*;*;*;*; Gregoriano1;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-88.70659;*;*;*;*;4; -Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;*;*;*;*;4; +Gregoriano2;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;-159.8899;12.5;*;*;*;4; Gregoriano3;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;90.97161;*;*;*;*;4; Gregoriano4;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;162.771;*;*;*;*;4; Gregoriano5;0;0;0;-1.5;11.1393650793988;1.08830677049999;0.049894179898239;-0.036111111111111;0;*;55.373967;*;*;*;*;4; diff --git a/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml index 4f67761f9..6f82987bb 100644 --- a/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ - + diff --git a/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml b/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml index 12b213ea4..8a57982ba 100644 --- a/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml +++ b/SRT/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml @@ -4,7 +4,8 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - UpdatingTime="0.1" + UpdatingTime="0.2" + TrackingLeadTime="2.6" RewindingSleepTime="0.1" RewindingTimeout="200" DefaultConfiguration="FIXED" diff --git a/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..8e6e427d6 --- /dev/null +++ b/SRT/Configuration/CDB/MACI/Components/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,14 @@ + + diff --git a/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml b/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml index 93d131c69..7899633de 100644 --- a/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml +++ b/SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/Mapping/Mapping.xml @@ -4,7 +4,7 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - DerotatorName="RECEIVERS/SRTKBandDerotator" + DerotatorName="MINORSERVO/DR_GFR1" ObservatoryName="ANTENNA/Observatory" CoordinateSourceName="ANTENNA/Boss" SetupPosition="0.0" diff --git a/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Configuration/CDB/alma/DataBlock/MinorServo/DR_GFR1/Properties/Properties.xml @@ -0,0 +1,18 @@ + + + + + + ROTARY_AXIS_ENABLED + ROTATION + ROTATION + degree + OFFSET + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml b/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Configuration/CDB/alma/MINORSERVO/DR_GFR1/DR_GFR1.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml index 4f67761f9..b098cecce 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/Boss/Boss.xml @@ -28,7 +28,7 @@ - + diff --git a/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml b/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml index 12b213ea4..8a57982ba 100644 --- a/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml +++ b/SRT/Configuration/CDB/alma/RECEIVERS/DewarPositioner/DewarPositioner.xml @@ -4,7 +4,8 @@ xmlns:baci="urn:schemas-cosylab-com:BACI:1.0" xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - UpdatingTime="0.1" + UpdatingTime="0.2" + TrackingLeadTime="2.6" RewindingSleepTime="0.1" RewindingTimeout="200" DefaultConfiguration="FIXED" diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl new file mode 100644 index 000000000..aa65c3ccc --- /dev/null +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTDerotator.idl @@ -0,0 +1,44 @@ +#ifndef __SRTDEROTATOR_IDL__ +#define __SRTDEROTATOR_IDL__ +/***************************************************************\ + * Authors: + * Giuseppe Carboni + * + * Created: Mon May 06 10:00:00 CEST 2024 +\***************************************************************/ + +#include "GenericDerotator.idl" +#include "SRTMinorServoCommon.idl" + +#pragma prefix "alma" + +module MinorServo +{ + /** + * This IDL interface describes the CORBA interface of a common Leonardo Derotator component. + */ + interface SRTDerotator : SRTLDOBaseProperties, Receivers::GenericDerotator, ACS::CharacteristicComponent + { + /** + * This property indicates the ID of the trajectory. It always corresponds to starting time of the trajectory, expressed as the UNIX Epoch * 1000 (long) + */ + readonly attribute ACS::ROlong trajectory_id; + + /** + * This property indicates the total number of points loaded into the current trajectory + */ + readonly attribute ACS::ROlong total_trajectory_points; + + /** + * This property indicates the number of points of the current trajectory which remain to be tracked + */ + readonly attribute ACS::ROlong remaining_trajectory_points; + + /** + * This method asks the hardware its status and updates the properties. + */ + boolean updateStatus(); + }; +}; + +#endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl index b88d58942..6cd48ffbe 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServo.idl @@ -17,61 +17,8 @@ module MinorServo * This IDL interface describes the CORBA interface of a common SRTMinorServo component. * This is simply the base interface from which the SRTGenericMinorServo and SRTProgramTrackMinorServo interfaces inherit. */ - interface SRTBaseMinorServo : ACS::CharacteristicComponent + interface SRTBaseMinorServo : SRTLDOBaseProperties, ACS::CharacteristicComponent { - /** - * This property tells if all the servo axes are enabled - */ - readonly attribute Management::ROTBoolean enabled; - - /** - * This property tells the status of the servo drive cabinet - */ - readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; - - /** - * This property tells if the servo is in blocked state and cannot move - */ - readonly attribute Management::ROTBoolean block; - - /** - * This property returns the current operative mode of the servo - */ - readonly attribute ROSRTMinorServoOperativeMode operative_mode; - - /** - * This property returns the sequence of statuses of the servo physical axes - */ - readonly attribute ACS::RObooleanSeq physical_axes_enabled; - - /** - * This property returns the sequence of current positions of the physical axes of the servo - */ - readonly attribute ACS::ROdoubleSeq physical_positions; - - /** - * This property returns the number of virtual axes of the servo - */ - readonly attribute ACS::ROlong virtual_axes; - - /** - * This property returns the current plain positions of the virtual axes of the servo - * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets - */ - readonly attribute ACS::ROdoubleSeq plain_virtual_positions; - - /** - * This property returns the current positions of the virtual axes of the servo - * The positions returned by this property equals to the plain virtual positions minus the offsets - */ - readonly attribute ACS::ROdoubleSeq virtual_positions; - - /** - * This property returns the current offsets of the virtual axes of the servo - * The offset values are the sum of user and system offsets - */ - readonly attribute ACS::ROdoubleSeq virtual_offsets; - /** * This property returns the current user offsets of the virtual axes of the servo */ diff --git a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl index 45980430f..54c6585a6 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl +++ b/SRT/Interfaces/SRTMinorServoInterface/idl/SRTMinorServoCommon.midl @@ -126,5 +126,65 @@ module MinorServo ERROR_DRIVE_CABINET }; ACS_ENUM(SRTMinorServoError); + + /* + * This IDL interface describes the CORBA interface of a common Leonardo Minor Servo System component. + * This interface contains the properties that are common to a focus path minor servo system and a derotator minor servo system. + */ + interface SRTLDOBaseProperties + { + /** + * This property tells if all the servo axes are enabled + */ + readonly attribute Management::ROTBoolean enabled; + + /** + * This property tells the status of the servo drive cabinet + */ + readonly attribute ROSRTMinorServoCabinetStatus drive_cabinet_status; + + /** + * This property tells if the servo is in blocked state and cannot move + */ + readonly attribute Management::ROTBoolean block; + + /** + * This property returns the current operative mode of the servo + */ + readonly attribute ROSRTMinorServoOperativeMode operative_mode; + + /** + * This property returns the sequence of statuses of the servo physical axes + */ + readonly attribute ACS::RObooleanSeq physical_axes_enabled; + + /** + * This property returns the sequence of current positions of the physical axes of the servo + */ + readonly attribute ACS::ROdoubleSeq physical_positions; + + /** + * This property returns the number of virtual axes of the servo + */ + readonly attribute ACS::ROlong virtual_axes; + + /** + * This property returns the current plain positions of the virtual axes of the servo + * The plain positions are the positions returned from the Leonardo servo system, without subtracting the offsets + */ + readonly attribute ACS::ROdoubleSeq plain_virtual_positions; + + /** + * This property returns the current positions of the virtual axes of the servo + * The positions returned by this property equals to the plain virtual positions minus the offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_positions; + + /** + * This property returns the current offsets of the virtual axes of the servo + * The offset values are the sum of user and system offsets + */ + readonly attribute ACS::ROdoubleSeq virtual_offsets; + }; }; #endif diff --git a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile index 9cac56365..2ddc48b82 100644 --- a/SRT/Interfaces/SRTMinorServoInterface/src/Makefile +++ b/SRT/Interfaces/SRTMinorServoInterface/src/Makefile @@ -24,11 +24,12 @@ CSOURCENAMES = \ # # IDL FILES # -IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTMinorServoCommon +IDL_FILES = SRTMinorServoBoss SRTMinorServo SRTDerotator SRTMinorServoCommon SRTMinorServoCommonStubs_LIBS = baciStubs ManagmentDefinitionsStubs MinorServoDefinitionsStubs ComponentErrorsStubs MinorServoErrorsStubs SRTMinorServoStubs_LIBS = SRTMinorServoCommonStubs SRTMinorServoBossStubs_LIBS = SRTMinorServoCommonStubs MinorServoBossStubs +SRTDerotatorStubs_LIBS = SRTMinorServoCommonStubs GenericDerotatorStubs # # INCLUDE STANDARDS diff --git a/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl b/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl index 2710d184f..d06172932 100644 --- a/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl +++ b/SRT/Interfaces/SRTReceiversInterface/idl/SRTKBandDerotator.idl @@ -10,7 +10,17 @@ module Receivers { - interface SRTKBandDerotator : GenericDerotator { + interface SRTKBandDerotator : GenericDerotator, ACS::CharacteristicComponent + { + + /** + *

Methods

: + *
    + *
  • powerOff(): switch the power amplifier off
  • + *
  • setSpeed(): set the derotator speed, in rpm
  • + *
  • getSpeed(): get the derotator speed, in rpm
  • + *
+ */ /** Computation of the sensor lenght * @@ -104,9 +114,42 @@ module Receivers { ComponentErrors::ComponentErrorsEx ); - }; + + /** Switch the power amplifier off + * + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + */ + void powerOff() raises (ComponentErrors::ComponentErrorsEx); + + + /** + * Set the derotator speed + * + * @arg speed speed in rpm + * @throw ComponentErrors::ComponentErrorsEx, + * @throw DerotatorErrors::DerotatorErrorsEx + */ + void setSpeed(in unsigned long speed) raises ( + ComponentErrors::ComponentErrorsEx, + DerotatorErrors::DerotatorErrorsEx + ); + + + /** + * Get the derotator speed + * + * @return the derotator speed in rpm + * @throw ComponentErrors::ComponentErrorsEx, + * @throw DerotatorErrors::DerotatorErrorsEx + */ + unsigned long getSpeed() raises ( + ComponentErrors::ComponentErrorsEx, + DerotatorErrors::DerotatorErrorsEx + ); + }; }; #endif diff --git a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h index e966f532d..e4474676c 100644 --- a/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h +++ b/SRT/Libraries/SRTMinorServoLibrary/include/SRTMinorServoContainers.h @@ -583,7 +583,7 @@ namespace MinorServo const std::string getPlainCommand() const { std::shared_lock lock(m_mutex); - return this->get("PLAIN_COMMAND"); + return this->count("PLAIN_COMMAND") > 0 ? this->get("PLAIN_COMMAND") : ""; } /** @@ -593,7 +593,7 @@ namespace MinorServo const std::string getPlainAnswer() const { std::shared_lock lock(m_mutex); - return this->get("PLAIN_ANSWER"); + return this->count("PLAIN_ANSWER") > 0 ? this->get("PLAIN_ANSWER") : ""; } protected: @@ -883,6 +883,25 @@ namespace MinorServo */ const std::vector m_virtual_offsets; }; + + /** + * This class is a specialization of the SRTMinorServoStatus for a derotator of the Leonardo Minor Servo System. + */ + class SRTDerotatorStatus : public SRTMinorServoStatus + { + public: + using SRTMinorServoStatus::SRTMinorServoStatus; + + /** + * This method returns the current derotator position. There is a sign inversion since the LDO derotator sign is opposite to the required one. + * @return the current derotator position + */ + double getActualPosition() const + { + double position = getVirtualPositions()[0]; + return position == 0 ? position : -position; + } + }; } #endif diff --git a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml index 55d8ba5ca..197c93cfa 100644 --- a/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml +++ b/SRT/Misc/SRTScripts/app-defaults/simulationStartup.xml @@ -14,7 +14,7 @@ - + @@ -64,7 +64,7 @@ MASTERHOST discos - + LocalOscillatorCContainer py @@ -190,7 +190,7 @@ MASTERHOST discos - + TotalPowerContainer cpp diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml new file mode 100644 index 000000000..7f7a82187 --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR2/DR_GFR2.xml @@ -0,0 +1,14 @@ + + diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml new file mode 100644 index 000000000..3b329339a --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_GFR3/DR_GFR3.xml @@ -0,0 +1,14 @@ + + diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml new file mode 100644 index 000000000..05bdc74fb --- /dev/null +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/DR_PFP/DR_PFP.xml @@ -0,0 +1,14 @@ + + diff --git a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml index a5801b66d..f3b9c99df 100644 --- a/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml +++ b/SRT/Outdated/CDB/MACI/Components/MINORSERVO/PFP/PFP.xml @@ -5,11 +5,10 @@ xmlns:cdb="urn:schemas-cosylab-com:CDB:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - Name="PFP" + Name="PFP" Code="SRTProgramTrackMinorServoImpl" ImplLang="cpp" Type="IDL:alma/MinorServo/SRTProgramTrackMinorServo:1.0" Container="MinorServoContainer" - Default="true" - + Default="false" /> diff --git a/SRT/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml b/SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml similarity index 100% rename from SRT/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml rename to SRT/Outdated/CDB/MACI/Components/RECEIVERS/SRTSBandMFReceiver/SRTSBandMFReceiver.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner/Positioner.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner00/Positioner00.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner01/Positioner01.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner02/Positioner02.xml diff --git a/SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml b/SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml similarity index 100% rename from SRT/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml rename to SRT/Outdated/CDB/MACI/Components/TestNamespace/Positioner03/Positioner03.xml diff --git a/SRT/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml b/SRT/Outdated/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/AntennaBossSimContainer/AntennaBossSimContainer.xml diff --git a/SRT/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml b/SRT/Outdated/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/PositionerContainer/PositionerContainer.xml diff --git a/SRT/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py b/SRT/Outdated/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py similarity index 100% rename from SRT/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py rename to SRT/Outdated/CDB/MACI/Containers/PyLOContainer/PyLOContainer.py diff --git a/SRT/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml b/SRT/Outdated/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml similarity index 100% rename from SRT/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml rename to SRT/Outdated/CDB/MACI/Containers/SRTSBandContainer/SRTSBandContainer.xml diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR2/Properties/Properties.xml @@ -0,0 +1,18 @@ + + + + + + ROTARY_AXIS_ENABLED + ROTATION + ROTATION + degree + OFFSET + diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_GFR3/Properties/Properties.xml @@ -0,0 +1,18 @@ + + + + + + ROTARY_AXIS_ENABLED + ROTATION + ROTATION + degree + OFFSET + diff --git a/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml new file mode 100644 index 000000000..9ebb604a1 --- /dev/null +++ b/SRT/Outdated/CDB/alma/DataBlock/MinorServo/DR_PFP/Properties/Properties.xml @@ -0,0 +1,18 @@ + + + + + + ROTARY_AXIS_ENABLED + ROTATION + ROTATION + degree + OFFSET + diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR2/DR_GFR2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml new file mode 100644 index 000000000..df76d9833 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_GFR3/DR_GFR3.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml b/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml new file mode 100644 index 000000000..18191fa80 --- /dev/null +++ b/SRT/Outdated/CDB/alma/MINORSERVO/DR_PFP/DR_PFP.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml b/SRT/Outdated/CDB/alma/MINORSERVO/PFP/PFP.xml similarity index 100% rename from SRT/Configuration/CDB/alma/MINORSERVO/PFP/PFP.xml rename to SRT/Outdated/CDB/alma/MINORSERVO/PFP/PFP.xml diff --git a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd index 88b054568..34ec43182 100644 --- a/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd +++ b/SRT/Servers/SRTMinorServo/config/CDB/schemas/SRTMinorServo.xsd @@ -19,7 +19,7 @@ - + @@ -34,12 +34,6 @@ - - - - - - @@ -51,6 +45,21 @@ + + + + + + + + + + + + + + + @@ -66,7 +75,29 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h index 49749dc7f..8a53266bf 100644 --- a/SRT/Servers/SRTMinorServo/include/MSDevIOs.h +++ b/SRT/Servers/SRTMinorServo/include/MSDevIOs.h @@ -47,6 +47,8 @@ namespace MinorServo /** * It writes values into controller. Unused because all the properties are read-only. + * Derotator update, the cmdPosition is actually a RW property, but the position is never set anywhere by using the DevIO. + * I will keep this implementation that does nothing and the position will be set by the setPosition or programTrack methods. */ void write(const T& value, ACS::Time& timestamp) { @@ -237,7 +239,7 @@ namespace MinorServo * The templates is specialized for the types listed right below and compilation will fail if the developer attempts to use it for an unknown MSDevIO type. */ template + is_any_v && is_any_v || (std::is_same_v && std::is_same_v>) + is_any_v || (std::is_same_v && std::is_same_v>) >> class MSGenericDevIO : public MSBaseDevIO { diff --git a/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h b/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h new file mode 100644 index 000000000..546b7f55c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTDerotatorImpl.h @@ -0,0 +1,545 @@ +#ifndef __SRTDEROTATORIMPL_H__ +#define __SRTDEROTATORIMPL_H__ + +/** + * SRTDerotatorImpl.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ManagementErrors.h" +#include "DerotatorErrors.h" +#include "SRTMinorServoSocket.h" +#include "MSDevIOs.h" +#include "SRTDerotatorStatusThread.h" +#include + +class SRTDerotatorStatusThread; + + +using namespace MinorServo; + +/** + * This class implements the base ACS::CharacteristicComponent CORBA interface for a SRTDerotator component. + * It is inherited by the other classes declared below. + */ +class SRTDerotatorImpl : public baci::CharacteristicComponentImpl, public virtual POA_MinorServo::SRTDerotator +{ + friend class SRTDerotatorStatusThread; + +public: + /** + * Constructor. + * @param component_name component's name. This is also the name that will be used to find the configuration data for the component in the Configuration DataBase. + * @param container_services pointer to the class that exposes all services offered by container. + * @throw ComponentErrors::ComponentErrorsEx when there has been an issue reading some value from the CDB. + */ + SRTDerotatorImpl(const ACE_CString& component_name, maci::ContainerServices* container_services); + + /** + * Destructor. + */ + virtual ~SRTDerotatorImpl(); + + /** + * Called to give the component time to initialize itself. The component reads in configuration files/parameters, builds up connection. + * Called before execute. It is implemented as a synchronous (blocking) call. + * @throw ComponentErrors::ComponentErrorsEx when there has been a memory allocation issue with the properties pointers. + */ + void initialize(); + + /** + * Called after initialize to tell the component that it has to be ready to accept incoming functional calls any time. + * Must be implemented as a synchronous (blocking) call. In this class the default implementation only logs the COMPSTATE_OPERATIONAL. + */ + void execute(); + + /** + * Called by the container before destroying the server in a normal situation. This function takes charge of releasing all resources. + */ + void cleanUp(); + + /** + * Called by the container in case of error or emergency situation. + * This function tries to free all resources even though there is no warranty that the function is completely executed before the component is destroyed. + */ + void aboutToAbort(); + + /** + * Asks the servo system to get ready. + * @throw DerotatorErrors::DerotatorErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + void setup(); + + // TODO: this should be a simple preset command + void setPosition(CORBA::Double position); + + // TODO easy implementation, return last commanded preset or programTrack position + double getCmdPosition() { return m_commanded_position.load(); }; + + // TODO return current position, just read the devio or the AnswerMap + double getActPosition() { return getPositionFromHistory(0); }; + + /** + * Returns the rotation the derotator was at the given time acs_time. + * @param acs_time the epoch we want to retrieve the derotator position. + * @throw MinorServoErrors::MinorServoErrorsEx when the position history is empty. + * @throw ComponentErrors::ComponentErrorsEx when the position history is empty + * @return a double object containing the derotator position at the given epoch. + */ + double getPositionFromHistory(ACS::Time acs_time); + + // TODO: easy implementation, return the min and max values read from the CDB + double getMinLimit() { return m_min; }; + double getMaxLimit() { return m_max; }; + + // TODO: degrees between 2 lateral feeds. How to implement this with new receivers? + double getStep() { return m_step; }; + + // TODO: easy implementation + bool isReady(); + bool isSlewing(); + + /** + * Returns the tracking status of the minor servo. + * @return true if the minor servo is tracking within the tracking error, false otherwise + */ + bool isTracking() { return m_tracking.load() == Management::MNG_TRUE; } + + /** + * This method loads a position that has to be tracked by the derotator + * @param point_time an ACS::Time object indicating the time associated with the coordinates to be tracked. + * Only the start time is sent to the derotator and the points after are always spaced by the same amount of time from one another. + * It is still necessary to fill this field in order to associate a time to the coordinates inside the component. + * @param position the position to track at the given time + * @param restart flag that restarts the tracking with a new trajectory + */ + void loadTrackingPoint(ACS::Time point_time, CORBA::Double position, CORBA::Boolean restart); + + /** + * Asks the component to calculate the servo system position starting from the given elevation. + * @param elevation the elevation we want to use to calculate and retrieve the servo system coordinates, expressed in degrees. + * @throw MinorServoErrors::MinorServoErrorsEx when the servo has not been configured yet and has not loaded any coefficient for the position calculation. + * @return a pointer to the double sequence object containing the calculated coordinates of the servo system. + */ + //ACS::doubleSeq* calcCoordinates(CORBA::Double elevation); + + /** + * Asks the component the virtual axes user offsets. + * @return a pointer to the double sequence object containing the current virtual axes user offsets of the servo system. + */ + //ACS::doubleSeq* getUserOffsets(); + + /** + * Load a single virtual axis user offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired user offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis_name is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + //void setUserOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes user offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void clearUserOffsets(); + + /** + * Asks the component the virtual axes system offsets. + * @return a pointer to the double sequence object containing the current virtual axes system offsets of the servo system. + */ + //ACS::doubleSeq* getSystemOffsets(); + + /** + * Load a single virtual axis system offset to the component and to the servo system. + * @param axis_name the name of the axis to load the given offset to. + * @param offset the desired system offset, expressed in millimeters or degrees, depending if the axis is a translation axis or a rotation one. + * @throw MinorServoErrors::MinorServoErrorsEx when the given axis is unknown, when the sum of user and system offsets for the given axis are out of range, + * when there has been a communication error or when the command was not accepted. + */ + //void setSystemOffset(const char* axis_name, CORBA::Double offset); + + /** + * Resets the virtual axes system offsets to 0. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void clearSystemOffsets(); + + /** + * Reload the user and the system offsets to the minor servo when the Leonardo offsets do not correspond to the sum of the DISCOS user and system offsets. + * @throw MinorServoErrors::MinorServoErrorsEx when there has been a communication error or when the command was not accepted. + */ + //void reloadOffsets(); + + /** + * Returns the maximum travel time to get from a starting position to a destination position. + * @param start a double sequence containing the starting position. If the provided sequence is empty, the current axes positions are used for the calculation. + * @param dest a double sequence containing the destination position. + * @throw MinorServoErrors::MinorServoErrorsEx when receiving a starting position sequence of length different from zero or the number of virtual axes of the servo, + * when receiving a destination position sequence of lenght different from the number of virtual axes of the servo + * @return an ACS::TimeInterval object representing the total duration of the movement from the starting position to the destination position + */ + //ACS::TimeInterval getTravelTime(const ACS::doubleSeq& start, const ACS::doubleSeq& dest); + + /** + * Returns the minimum and maximum range of the virtual axes of the servo system, as reference arguments. + * @param min_ranges_out a double sequence object containing the minimum ranges of the virtual axes of the servo system. + * @param max_ranges_out a double sequence object containing the maximum ranges of the virtual axes of the servo system. + */ + //void getAxesRanges(ACS::doubleSeq_out min_ranges_out, ACS::doubleSeq_out max_ranges_out); + + /** + * Returns a reference to the enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean property enabled. + */ + virtual Management::ROTBoolean_ptr enabled(); + + /** + * Returns a reference to the drive_cabinet_status property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoCabinerStatus (enumeration) property drive_cabinet_status. + */ + virtual ROSRTMinorServoCabinetStatus_ptr drive_cabinet_status(); + + /** + * Returns a reference to the block property implementation of the IDL interface. + * @return pointer to the read-only boolean property block. + */ + virtual Management::ROTBoolean_ptr block(); + + /** + * Returns a reference to the operative_mode property implementation of the IDL interface. + * @return pointer to the read-only SRTMinorServoOperativeMode (enumeration) property operative_mode. + */ + virtual ROSRTMinorServoOperativeMode_ptr operative_mode(); + + /** + * Returns a reference to the physical_axes_enabled property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_axes_enabled. + */ + virtual ACS::RObooleanSeq_ptr physical_axes_enabled(); + + /** + * Returns a reference to the physical_positions property implementation of the IDL interface. + * @return pointer to the read-only boolean sequence property physical_positions. + */ + virtual ACS::ROdoubleSeq_ptr physical_positions(); + + /** + * Returns a reference to the virtual_axes property implementation of the IDL interface. + * @return pointer to the read-only long property virtual_axes. + */ + virtual ACS::ROlong_ptr virtual_axes(); + + /** + * Returns a reference to the plain_virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property plain_virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr plain_virtual_positions(); + + /** + * Returns a reference to the virtual_positions property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_positions. + */ + virtual ACS::ROdoubleSeq_ptr virtual_positions(); + + /** + * Returns a reference to the virtual_offsets property implementation of the IDL interface. + * @return pointer to the read-only double sequence property virtual_offsets. + */ + virtual ACS::ROdoubleSeq_ptr virtual_offsets(); + + /** + * Returns a reference to the tracking property implementation of the IDL interface. + * @return pointer to the read-only boolean property tracking. + */ + virtual Management::ROTBoolean_ptr tracking(); + + /** + * Returns a reference to the trajectory_id property implementation of the IDL interface. + * @return pointer to the read-only long property trajectory_id. + */ + virtual ACS::ROlong_ptr trajectory_id(); + + /** + * Returns a reference to the total_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property total_trajectory_points. + */ + virtual ACS::ROlong_ptr total_trajectory_points(); + + /** + * Returns a reference to the remaining_trajectory_points property implementation of the IDL interface. + * @return pointer to the read-only long property remaining_trajectory_points. + */ + virtual ACS::ROlong_ptr remaining_trajectory_points(); + + virtual ACS::RWdouble_ptr cmdPosition(); + + virtual ACS::ROdouble_ptr actPosition(); + + /** + * Returns a reference to the positionDiff property implementation of the IDL interface. + * @return pointer to the read-only double sequence property positionDiff. + */ + virtual ACS::ROdouble_ptr positionDiff(); + + virtual ACS::ROpattern_ptr status(); + +private: + /** + * Updates the status of the component by asking the hardware its status. + */ + bool updateStatus(); + + /** + * Checks if the socket is connected and if the minor servo system is in a good state. + * @throw MinorServoErrors::MinorServoErrorsEx when the socket is not connected or when the minor servo system is blocked or the drive cabinet is in error state. + */ + void checkLineStatus(); + + /** + * Static function used to retrieve some constants from the component CDB xml schema. + * @param object the instance of this class, used inside the function logic. + * @param constant the name of the constants we want to retrieve from the CDB. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB or when it has a non meaningful value. + * @return a vector of doubles containing the retrieved constants, its length is the same as the number of virtual axes of the servo system. + */ + //static std::vector getMotionConstant(SRTBaseMinorServoImpl& object, const std::string& constant); + + /** + * Static function used to retrieve a table from the CDB DataBlock directory. Used inside the initialization list. + * @param object the instance of this class, used inside the function logic. + * @param properties_name the name of the block to retrieve as written inside the DataBlock file. + * @throw ComponentErrors::ComponentErrorsEx when the requested value cannot be read from the CDB. + * @return a vector of strings containing the retrieved table fields. + */ + static std::vector getPropertiesTable(SRTDerotatorImpl& object, const std::string& properties_name); + + /** + * Attributes. + * Keep the same order for the initialization list. + */ + + /** + * Name of the component. + */ + const std::string m_component_name; + + /** + * Name of the servo system. + */ + const std::string m_servo_name; + + /** + * Number of virtual axes of the servo system. + */ + const size_t m_virtual_axes; + + /** + * Number of physical axes of the servo system. + */ + const size_t m_physical_axes; + + /** + * Name of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_names; + + /** + * Units of the virtual axes of the servo system. + */ + const std::vector m_virtual_axes_units; + + /** + * Dictionary containing the last status retrieved form the servo system. + */ + SRTDerotatorStatus m_status; + + /** + * Commanded user offsets for each axis of the servo system. + */ + std::vector m_user_offsets; + + /** + * Commanded system offsets for each axis of the servo system. + */ + std::vector m_system_offsets; + + /** + * Queue of positions assumed by the servo system in time. + */ + SRTMinorServoPositionsQueue m_positions_queue; + + /** + * The offset to apply to bring the derotator to the receiver rest position. + */ + const double m_zero_offset; + + /** + * Minimum ranges of the axes of the servo system. + */ + const double m_min; + + /** + * Maximum ranges of the axes of the servo system. + */ + const double m_max; + + /** + * Queue of positions to be assumed by the servo system when tracking a trajectory. + */ + SRTMinorServoPositionsQueue m_tracking_queue; + + /** + * Degrees between 2 adjacent lateral feeds. + */ + const double m_step; + + /** + * Tracking delta values for all minor servo system virtual axes. + */ + const double m_tracking_delta; + + /** + * Tracking error values for all minor servo system virtual axes. + */ + std::vector m_tracking_error; + + /** + * Indicates if the servo system is tracking or not. It is tracking when the position error is lower than the tracking delta for all the virtual axes. + */ + std::atomic m_tracking; + + /** + * Current trajectory ID. + */ + std::atomic m_trajectory_id; + + /** + * Total trajectory points of the current trajectory. + */ + std::atomic m_total_trajectory_points; + + /** + * Remaining trajectory points of the current trajectory. + */ + std::atomic m_remaining_trajectory_points; + + std::atomic m_commanded_position; + + std::atomic m_position_difference; + + std::atomic m_status_pattern; + + /** + * Current speed of rotation + */ + double m_c_s; + + /** + * Pointer to the enabled property. + */ + baci::SmartPropertyPointer> m_enabled_ptr; + + /** + * Pointer to the drive_cabinet_status property. + */ + baci::SmartPropertyPointer> m_drive_cabinet_status_ptr; + + /** + * Pointer to the block property. + */ + baci::SmartPropertyPointer> m_block_ptr; + + /** + * Pointer to the operative_mode property. + */ + baci::SmartPropertyPointer> m_operative_mode_ptr; + + /** + * Pointer to the physical_axes_enabled property. + */ + baci::SmartPropertyPointer m_physical_axes_enabled_ptr; + + /** + * Pointer to the physical_positions property. + */ + baci::SmartPropertyPointer m_physical_positions_ptr; + + /** + * Pointer to the virtual_axes property. + */ + baci::SmartPropertyPointer m_virtual_axes_ptr; + + /** + * Pointer to the plain_virtual_positions property. + */ + baci::SmartPropertyPointer m_plain_virtual_positions_ptr; + + /** + * Pointer to the virtual_positions property. + */ + baci::SmartPropertyPointer m_virtual_positions_ptr; + + /** + * Pointer to the virtual_offsets property. + */ + baci::SmartPropertyPointer m_virtual_offsets_ptr; + + /** + * Pointer to the tracking property. + */ + baci::SmartPropertyPointer> m_tracking_ptr; + + /** + * Pointer to the trajectory_id property. + */ + baci::SmartPropertyPointer m_trajectory_id_ptr; + + /** + * Pointer to the total_trajectory_points property. + */ + baci::SmartPropertyPointer m_total_trajectory_points_ptr; + + /** + * Pointer to the remaining_trajectory_points property. + */ + baci::SmartPropertyPointer m_remaining_trajectory_points_ptr; + + baci::SmartPropertyPointer m_actual_position_ptr; + baci::SmartPropertyPointer m_commanded_position_ptr; + baci::SmartPropertyPointer m_position_difference_ptr; + baci::SmartPropertyPointer m_status_ptr; + + /** + * Configuration of the socket object. + */ + const SRTMinorServoSocketConfiguration& m_socket_configuration; + + /** + * Socket object. + */ + SRTMinorServoSocket& m_socket; + + /** + * Pointer to the status thread. + */ + SRTDerotatorStatusThread* m_status_thread; +}; + +#endif diff --git a/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h b/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h new file mode 100644 index 000000000..b0c3ece33 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/include/SRTDerotatorStatusThread.h @@ -0,0 +1,63 @@ +#ifndef _SRTDEROTATORSTATUSTHREAD_H_ +#define _SRTDEROTATORSTATUSTHREAD_H_ + +/** + * SRTDerotatorStatusThread.h + * Giuseppe Carboni (giuseppe.carboni@inaf.it) + */ + +#include "SuppressWarnings.h" +#include +#include +#include "SRTMinorServoSocket.h" +#include "SRTDerotatorImpl.h" + +class SRTDerotatorImpl; + + +/** + * This class implements a status thread. This thread is in charge of updating the status of the relative derotator component. + */ +class SRTDerotatorStatusThread : public ACS::Thread +{ +public: + /** + * Constructor. + * @param name thread name + * @param response_time thread's heartbeat response time in 100ns unit. Default value is 1s. + * @param sleep_time thread's sleep time in 100ns unit. Default value is 100ms. + */ + SRTDerotatorStatusThread(const ACE_CString& name, SRTDerotatorImpl& component, const ACS::TimeInterval& response_time=ThreadBase::defaultResponseTime, const ACS::TimeInterval& sleep_time=ThreadBase::defaultSleepTime); + + /** + * Destructor. + */ + ~SRTDerotatorStatusThread(); + + /** + * This method is executed once when the thread starts. + */ + virtual void onStart(); + + /** + * This method is executed once when the thread stops. + */ + virtual void onStop(); + + /** + * This method overrides the thread implementation class. + * The thread can be exited by calling ACS::ThreadBase::stop or ACS::ThreadBase::exit command. + */ + virtual void runLoop(); + +private: + SRTDerotatorImpl& m_component; + + /** + * The sleeping time of the thread. + * The thread should be cycling at a constant rate, therefore the inner sleeping time is always updated taking into account this and the thread execution time. + */ + ACS::TimeInterval m_sleep_time; +}; + +#endif /*_SRTDEROTATORSTATUSTHREAD_H_*/ diff --git a/SRT/Servers/SRTMinorServo/src/Makefile b/SRT/Servers/SRTMinorServo/src/Makefile index 141c676de..3cf5a0bcd 100644 --- a/SRT/Servers/SRTMinorServo/src/Makefile +++ b/SRT/Servers/SRTMinorServo/src/Makefile @@ -18,12 +18,12 @@ CDB_SCHEMAS = SRTMinorServoCommon SRTMinorServoBoss SRTMinorServo SRTMinorServoS # ---------------------------- # Libraries (public and local) # ---------------------------- -LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl +LIBRARIES = SRTGenericMinorServoImpl SRTProgramTrackMinorServoImpl SRTMinorServoBossImpl SRTDerotatorImpl USER_CFLAGS = SRTMinorServoBossImpl_OBJECTS = SRTMinorServoBossCore SRTMinorServoSetupThread SRTMinorServoParkThread SRTMinorServoTrackingThread SRTMinorServoScanThread SRTMinorServoBossImpl SRTMinorServoStatusThread -SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc +SRTMinorServoBossImpl_LIBS = IRALibrary SRTMinorServoBossStubs SRTMinorServoStubs SRTDerotatorStubs ComponentErrors MinorServoErrors ManagementErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary AntennaBossStubs SRTMinorServoSocketLibrary ParserErrors DiscosVersion acsnc SRTMinorServoBossImpl_CFLAGS = -std=c++17 -fconcepts SRTMinorServoBossCore_CFLAGS = -std=c++17 -fconcepts SRTMinorServoStatusThread_CFLAGS = -std=c++17 -fconcepts @@ -39,6 +39,10 @@ SRTGenericMinorServoImpl_CFLAGS = -std=c++17 -fconcepts SRTProgramTrackMinorServoImpl_OBJECTS = SRTProgramTrackMinorServoImpl SRTBaseMinorServoImpl SRTProgramTrackMinorServoImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoErrors MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary DiscosVersion SRTProgramTrackMinorServoImpl_CFLAGS = -std=c++17 -fconcepts +SRTDerotatorImpl_OBJECTS = SRTDerotatorImpl SRTDerotatorStatusThread +SRTDerotatorImpl_LIBS = IRALibrary SRTMinorServoStubs MinorServoDefinitionsStubs SRTMinorServoCommandLibrary SRTMinorServoSocketLibrary GenericDerotatorStubs SRTDerotatorStubs DerotatorErrors DiscosVersion +SRTDerotatorImpl_CFLAGS = -std=c++17 -fconcepts +SRTDerotatorStatusThread_CFLAGS = -std=c++17 -fconcepts # ---------------------------------------------------------------------- diff --git a/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp b/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp new file mode 100644 index 000000000..b00a29420 --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTDerotatorImpl.cpp @@ -0,0 +1,490 @@ +#include "SRTDerotatorImpl.h" + +using namespace MinorServo; + +SRTDerotatorImpl::SRTDerotatorImpl(const ACE_CString& component_name, maci::ContainerServices* container_services): + CharacteristicComponentImpl(component_name, container_services), + m_component_name(std::string(component_name.c_str())), + m_servo_name(std::string(strchr(component_name.c_str(), '/') + 1)), + m_virtual_axes(getCDBValue(container_services, "virtual_axes")), + m_physical_axes(getCDBValue(container_services, "physical_axes")), + m_virtual_axes_names(SRTDerotatorImpl::getPropertiesTable(*this, "virtual_positions")), + m_virtual_axes_units(SRTDerotatorImpl::getPropertiesTable(*this, "virtual_axes_units")), + m_status( + m_servo_name, + SRTDerotatorImpl::getPropertiesTable(*this, "physical_axes_enabled"), + SRTDerotatorImpl::getPropertiesTable(*this, "physical_positions"), + m_virtual_axes_names, + SRTDerotatorImpl::getPropertiesTable(*this, "virtual_offsets") + ), + m_positions_queue(5 * 60 * int(1 / getCDBValue(container_services, "status_thread_period", "/MINORSERVO/Boss")), m_virtual_axes), + m_zero_offset(getCDBValue(container_services, "zero_offset")), + m_min(-(getCDBValue(container_services, "max_range") - m_zero_offset)), + m_max(-(getCDBValue(container_services, "min_range") - m_zero_offset)), + m_tracking_queue(1500, m_virtual_axes), + m_step(getCDBValue(container_services, "step")), + m_tracking_delta(getCDBValue(container_services, "tracking_delta")), + m_tracking_error(m_virtual_axes, 0.0), + m_tracking(Management::MNG_FALSE), + m_trajectory_id(0), + m_total_trajectory_points(0), + m_remaining_trajectory_points(0), + m_commanded_position(0), + m_position_difference(0), + m_status_pattern(0), + m_c_s(0), + m_enabled_ptr(this), + m_drive_cabinet_status_ptr(this), + m_block_ptr(this), + m_operative_mode_ptr(this), + m_physical_axes_enabled_ptr(this), + m_physical_positions_ptr(this), + m_virtual_axes_ptr(this), + m_plain_virtual_positions_ptr(this), + m_virtual_positions_ptr(this), + m_virtual_offsets_ptr(this), + m_tracking_ptr(this), + m_trajectory_id_ptr(this), + m_total_trajectory_points_ptr(this), + m_remaining_trajectory_points_ptr(this), + m_actual_position_ptr(this), + m_commanded_position_ptr(this), + m_position_difference_ptr(this), + m_status_ptr(this), + m_socket_configuration(SRTMinorServoSocketConfiguration::getInstance(container_services)), + m_socket(SRTMinorServoSocket::getInstance(m_socket_configuration.m_ip_address, m_socket_configuration.m_port, m_socket_configuration.m_timeout)) +{ + AUTO_TRACE(m_servo_name + "::SRTDerotatorImpl()"); +} + +SRTDerotatorImpl::~SRTDerotatorImpl() +{ + AUTO_TRACE(m_servo_name + "::~SRTDerotatorImpl()"); + + if(m_status_thread != nullptr) + { + m_status_thread->terminate(); + getContainerServices()->getThreadManager()->destroy(m_status_thread); + } +} + +void SRTDerotatorImpl::initialize() +{ + AUTO_TRACE(m_servo_name + "::initialize()"); + + try + { + m_enabled_ptr = new ROEnumImpl((m_component_name + ":enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("enabled", m_status, &SRTMinorServoStatus::isEnabled), true); + m_drive_cabinet_status_ptr = new ROEnumImpl((m_component_name + ":drive_cabinet_status").c_str(), getComponent(), + new MSAnswerMapDevIO("drive_cabinet_status", m_status, &SRTMinorServoStatus::getDriveCabinetStatus), true); + m_block_ptr = new ROEnumImpl((m_component_name + ":block").c_str(), getComponent(), + new MSAnswerMapDevIO("block", m_status, &SRTMinorServoStatus::isBlocked), true); + m_operative_mode_ptr = new ROEnumImpl((m_component_name + ":operative_mode").c_str(), getComponent(), + new MSAnswerMapDevIO("operative_mode", m_status, &SRTMinorServoStatus::getOperativeMode), true); + m_physical_axes_enabled_ptr = new baci::RObooleanSeq((m_component_name + ":physical_axes_enabled").c_str(), getComponent(), + new MSAnswerMapDevIO("physical_axes_enabled", m_status, &SRTMinorServoStatus::getPhysicalAxesEnabled), true); + m_physical_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":physical_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("physical_positions", m_status, &SRTMinorServoStatus::getPhysicalPositions), true); + m_virtual_axes_ptr = new baci::ROlong((m_component_name + ":virtual_axes").c_str(), getComponent(), + new MSGenericDevIO(m_virtual_axes), true); + m_plain_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":plain_virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("plain_virtual_positions", m_status, &SRTMinorServoStatus::getPlainVirtualPositions), true); + m_virtual_positions_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_positions").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_positions", m_status, &SRTMinorServoStatus::getVirtualPositions), true); + m_virtual_offsets_ptr = new baci::ROdoubleSeq((m_component_name + ":virtual_offsets").c_str(), getComponent(), + new MSAnswerMapDevIO("virtual_offsets", m_status, &SRTMinorServoStatus::getVirtualOffsets), true); + m_tracking_ptr = new ROEnumImpl((m_component_name + ":tracking").c_str(), getComponent(), + new MSGenericDevIO>(m_tracking), true); + m_trajectory_id_ptr = new baci::ROlong((m_component_name + ":trajectory_id").c_str(), getComponent(), + new MSGenericDevIO>(m_trajectory_id), true); + m_total_trajectory_points_ptr = new baci::ROlong((m_component_name + ":total_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_total_trajectory_points), true); + m_remaining_trajectory_points_ptr = new baci::ROlong((m_component_name + ":remaining_trajectory_points").c_str(), getComponent(), + new MSGenericDevIO>(m_remaining_trajectory_points), true); + m_actual_position_ptr = new baci::ROdouble((m_component_name + ":actPosition").c_str(), getComponent(), + new MSAnswerMapDevIO("actPosition", m_status, &SRTDerotatorStatus::getActualPosition), true); + m_commanded_position_ptr = new baci::RWdouble((m_component_name + ":cmdPosition").c_str(), getComponent(), + new MSGenericDevIO>(m_commanded_position), true); + m_position_difference_ptr = new baci::ROdouble((m_component_name + ":positionDiff").c_str(), getComponent(), + new MSGenericDevIO>(m_position_difference), true); + m_status_ptr = new baci::ROpattern((m_component_name + ":status").c_str(), getComponent(), + new MSGenericDevIO>(m_status_pattern), true); + } + catch(std::bad_alloc& ba) + { + _EXCPT(ComponentErrors::MemoryAllocationExImpl, ex, (m_servo_name + "::initialize()").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + // Try to read the current status of the derotator + try + { + updateStatus(); + } + catch(...) + { + // This block is necessary since the socket might not be connected yet. If the Leonardo system is not reachable the status(); call will fail, but we want to instantiate the component anyway + // A non connected socket will try to connect every time a new command is sent, therefore the status thread will establish the connection as soon as possible. + } +} + +void SRTDerotatorImpl::execute() +{ + AUTO_TRACE(m_servo_name + "::execute()"); + + try + { + m_status_thread = getContainerServices()->getThreadManager()->create((m_component_name + "StatusThread").c_str(), *this); + m_status_thread->setSleepTime(getCDBValue(getContainerServices(), "status_thread_period") * 10000000); + m_status_thread->resume(); + } + catch(acsthreadErrType::CanNotSpawnThreadExImpl& impl) + { + // The thread failed to start for some reason + _ADD_BACKTRACE(ComponentErrors::CanNotStartThreadExImpl, ex, impl, (m_component_name + "::startThread()").c_str()); + ex.setThreadName((m_component_name + "StatusThread").c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +void SRTDerotatorImpl::cleanUp() +{ + AUTO_TRACE(m_servo_name + "::cleanUp()"); +} + +void SRTDerotatorImpl::aboutToAbort() +{ + AUTO_TRACE(m_servo_name + "::aboutToAbort()"); +} + +/////////////////// PUBLIC methods +bool SRTDerotatorImpl::updateStatus() +{ + AUTO_TRACE(m_servo_name + "::status()"); + + // Initialize the status variable + long status = 0; + + // We don't check if the socket is connected here since a status command will try to reconnect it automatically + try + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::status(m_servo_name), m_status); + + ACS::Time last_timestamp = m_status.getTimestamp(); + + // Send the zero offset if not correct + if(m_status.getVirtualOffsets()[0] != m_zero_offset) + { + m_socket.sendCommand(SRTMinorServoCommandLibrary::offset(m_servo_name, { m_zero_offset })); + } + + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + { + // Set to failure + status |= (1L << 1); + // Not ready as well + status |= (1L << 3); + } + + if(!isReady()) + { + // No failures but not ready + status |= (1L << 3); + } + + if(isSlewing()) + { + status |= (1L << 4); + } + + double current_point = m_status.getActualPosition(); + + // Calculate the current speed of the axes, °/s + try + { + std::pair> previous_point = m_positions_queue.get(last_timestamp); + m_c_s = (current_point - previous_point.second[0]) * ((double(last_timestamp - previous_point.first)) / 10000000); + } + catch(...) + { + // Empty queue, first reading, skip the speed calculation + } + + if(m_status.getOperativeMode() == OPERATIVE_MODE_PROGRAMTRACK) + { + try + { + m_commanded_position = m_tracking_queue.get(last_timestamp).second[0]; + m_remaining_trajectory_points.store(m_tracking_queue.getRemainingPoints(last_timestamp)); + } + catch(...) + { + // Weird, we should have at least one tracking point by now, just skip + } + } + + m_positions_queue.put(last_timestamp, { current_point }); + m_position_difference.store(m_commanded_position - current_point); + if(std::fabs(m_position_difference.load()) <= m_tracking_delta) + { + m_tracking.store(Management::MNG_TRUE); + } + else + { + m_tracking.store(Management::MNG_FALSE); + } + } + catch(...) + { + // Communication error, sets failure, communication error and not ready bits + status |= (1L << 1); + status |= (1L << 2); + status |= (1L << 3); + + m_status_pattern.store(status); + return false; + } + + m_status_pattern.store(status); + return true; +} + +void SRTDerotatorImpl::setup() +{ + AUTO_TRACE(m_servo_name + "::setup()"); +} + +void SRTDerotatorImpl::setPosition(CORBA::Double position) +{ + AUTO_TRACE(m_servo_name + "::setPosition()"); + + checkLineStatus(); + + if(position < m_min || position > m_max) + { + _EXCPT(DerotatorErrors::OutOfRangeErrorExImpl, ex, (m_servo_name + "::setPosition()").c_str()); + ex.addData("Reason", std::string("Resulting position " + std::to_string(position) + " out of range.").c_str()); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + // Sign inversion required + double pos = position * -1; + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::preset(m_servo_name, std::vector{ pos })).checkOutput()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::setPosition()").c_str()); + ex.addData("Reason", "Received NAK in response to a PRESET command."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + m_commanded_position.store(position); +} + +double SRTDerotatorImpl::getPositionFromHistory(ACS::Time acs_time) +{ + AUTO_TRACE(m_servo_name + "::getPositionFromHistory()"); + + // Get the latest position + if(acs_time == 0) + { + acs_time = getTimeStamp(); + } + + try + { + return m_positions_queue.get(acs_time).second[0]; + } + catch(std::logic_error& le) + { + // TODO: change this to ComponentErrors + _EXCPT(ComponentErrors::OperationErrorExImpl, ex, (m_servo_name + "::getPositionFromHistory()").c_str()); + ex.setReason("Positions history is empty!"); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } +} + +bool SRTDerotatorImpl::isReady() +{ + // Always ready unless it has errors + return (m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) ? false : true; +} + +bool SRTDerotatorImpl::isSlewing() +{ + SRTMinorServoOperativeMode operative_mode = m_status.getOperativeMode(); + if(operative_mode == OPERATIVE_MODE_PROGRAMTRACK) + { + if(m_remaining_trajectory_points.load() > 0) + { + // We are still tracking a trajectory, therefore we are slewing + return true; + } + else + { + // Trajectory is finished, the derotator might still be slowing down to 0°/s but for simplicity we say it's not slewing anymore + return false; + } + } + else if(operative_mode == OPERATIVE_MODE_UNKNOWN) + { + // We trust the protocol, this means the derotator is moving due to a preset command + return true; + } + + return false; +} + +void SRTDerotatorImpl::loadTrackingPoint(ACS::Time point_time, CORBA::Double position, CORBA::Boolean restart) +{ + AUTO_TRACE(m_servo_name + "::loadTrackingPoint()"); + + checkLineStatus(); + + if(position < m_min || position > m_max) + { + _EXCPT(DerotatorErrors::OutOfRangeErrorExImpl, ex, (m_servo_name + "::loadTrackingPoint()").c_str()); + ex.addData("Reason", std::string("Resulting position " + std::to_string(position) + " out of range.").c_str()); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + unsigned int trajectory_id, point_id; + + if(restart) + { + trajectory_id = (unsigned int)(IRA::CIRATools::ACSTime2UNIXEpoch(point_time)); + point_id = 0; + } + else + { + trajectory_id = m_trajectory_id.load(); + point_id = m_total_trajectory_points.load(); + } + + if(!m_socket.sendCommand(SRTMinorServoCommandLibrary::programTrack(m_servo_name, trajectory_id, point_id, std::vector{ -position }, restart ? IRA::CIRATools::ACSTime2UNIXEpoch(point_time) : 0)).checkOutput()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "::loadTrackingPoint()").c_str()); + ex.addData("Reason", "Received NAK in response to a PROGRAMTRACK command."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + if(restart) + { + // Clear the tracking queue to avoid interpolation between 2 different trajectories + m_tracking_queue.clear(); + } + + m_trajectory_id.store(trajectory_id); + m_tracking_queue.put(point_time, { position }); + m_total_trajectory_points.store(point_id + 1); +} + + +/////////////////// PROTECTED methods +void SRTDerotatorImpl::checkLineStatus() +{ + if(!m_socket.isConnected()) + { + _EXCPT(DerotatorErrors::CommunicationErrorExImpl, ex, (m_servo_name + "checkLineStatus()").c_str()); + ex.addData("Reason", "Socket not connected."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } + + if(m_status.isBlocked() == Management::MNG_TRUE || m_status.getDriveCabinetStatus() == DRIVE_CABINET_ERROR) + { + _EXCPT(DerotatorErrors::UnexpectedErrorExImpl, ex, (m_servo_name + "::checkLineStatus()").c_str()); + ex.addData("Reason", "Servo system blocked or drive cabinet error."); + ex.log(LM_DEBUG); + throw ex.getDerotatorErrorsEx(); + } +} + +/////////////////// PRIVATE methods +std::vector SRTDerotatorImpl::getPropertiesTable(SRTDerotatorImpl& object, const std::string& properties_name) +{ + AUTO_STATIC_TRACE(object.m_servo_name + "::getPropertiesTable()"); + + std::vector properties; + + IRA::CDBTable table(object.getContainerServices(), properties_name.c_str(), std::string("DataBlock/MinorServo/" + object.m_servo_name).c_str()); + IRA::CError error; + error.Reset(); + + if(!table.addField(error, "property_name", IRA::CDataField::STRING)) + { + error.setExtra("Error adding field property_name", 0); + } + if(!error.isNoError()) + { + _EXCPT_FROM_ERROR(ComponentErrors::IRALibraryResourceExImpl, ex, error); + ex.setCode(error.getErrorCode()); + ex.setDescription((const char *)error.getDescription()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + if(!table.openTable(error)) + { + _EXCPT_FROM_ERROR(ComponentErrors::CDBAccessExImpl, ex, error); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + table.First(); + for(unsigned int i = 0; i < table.recordCount(); i++, table.Next()) + { + properties.push_back(std::string(table["property_name"]->asString())); + } + table.closeTable(); + + size_t expected_size = 0; + + if(properties_name.find("virtual_") == 0) + { + expected_size = object.m_virtual_axes; + } + else if(properties_name.find("physical_") == 0) + { + expected_size = object.m_physical_axes; + } + + if(expected_size == 0 || properties.size() != expected_size) + { + _EXCPT(ComponentErrors::CDBAccessExImpl, ex, (object.m_servo_name + "::initialize()").c_str()); + ex.setFieldName(properties_name.c_str()); + ex.log(LM_DEBUG); + throw ex.getComponentErrorsEx(); + } + + return properties; +} + + +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_enabled_ptr, enabled); +GET_PROPERTY_REFERENCE(ROSRTMinorServoCabinetStatus, SRTDerotatorImpl, m_drive_cabinet_status_ptr, drive_cabinet_status); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_block_ptr, block); +GET_PROPERTY_REFERENCE(ROSRTMinorServoOperativeMode, SRTDerotatorImpl, m_operative_mode_ptr, operative_mode); +GET_PROPERTY_REFERENCE(ACS::RObooleanSeq, SRTDerotatorImpl, m_physical_axes_enabled_ptr, physical_axes_enabled); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_physical_positions_ptr, physical_positions); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_virtual_axes_ptr, virtual_axes); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_plain_virtual_positions_ptr, plain_virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_virtual_positions_ptr, virtual_positions); +GET_PROPERTY_REFERENCE(ACS::ROdoubleSeq, SRTDerotatorImpl, m_virtual_offsets_ptr, virtual_offsets); +GET_PROPERTY_REFERENCE(Management::ROTBoolean, SRTDerotatorImpl, m_tracking_ptr, tracking); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_trajectory_id_ptr, trajectory_id); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_total_trajectory_points_ptr, total_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROlong, SRTDerotatorImpl, m_remaining_trajectory_points_ptr, remaining_trajectory_points); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTDerotatorImpl, m_actual_position_ptr, actPosition); +GET_PROPERTY_REFERENCE(ACS::RWdouble, SRTDerotatorImpl, m_commanded_position_ptr, cmdPosition); +GET_PROPERTY_REFERENCE(ACS::ROdouble, SRTDerotatorImpl, m_position_difference_ptr, positionDiff); +GET_PROPERTY_REFERENCE(ACS::ROpattern, SRTDerotatorImpl, m_status_ptr, status); + +MACI_DLL_SUPPORT_FUNCTIONS(SRTDerotatorImpl) diff --git a/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp b/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp new file mode 100644 index 000000000..e9ddd980c --- /dev/null +++ b/SRT/Servers/SRTMinorServo/src/SRTDerotatorStatusThread.cpp @@ -0,0 +1,46 @@ +#include "SRTDerotatorStatusThread.h" + +using namespace MinorServo; + +SRTDerotatorStatusThread::SRTDerotatorStatusThread(const ACE_CString& name, SRTDerotatorImpl& component, const ACS::TimeInterval& response_time, const ACS::TimeInterval& sleep_time) : + ACS::Thread(name, response_time, sleep_time), + m_component(component), + m_sleep_time(this->getSleepTime()) +{ + AUTO_TRACE("SRTDerotatorStatusThread::SRTDerotatorStatusThread()"); +} + +SRTDerotatorStatusThread::~SRTDerotatorStatusThread() +{ + AUTO_TRACE("SRTDerotatorStatusThread::~SRTDerotatorStatusThread()"); +} + +void SRTDerotatorStatusThread::onStart() +{ + AUTO_TRACE("SRTDerotatorStatusThread::onStart()"); + + ACS_LOG(LM_FULL_INFO, "SRTDerotatorStatusThread::onStart()", (LM_DEBUG, "STATUS THREAD STARTED")); +} + +void SRTDerotatorStatusThread::onStop() +{ + AUTO_TRACE("SRTDerotatorStatusThread::onStop()"); + + ACS_LOG(LM_FULL_INFO, "SRTDerotatorStatusThread::onStop()", (LM_DEBUG, "STATUS THREAD STOPPED")); +} + +void SRTDerotatorStatusThread::runLoop() +{ + AUTO_TRACE("SRTDerotatorStatusThread::runLoop()"); + + ACS::Time t0 = getTimeStamp(); + unsigned long sleep_time = 10000000; + + if(m_component.updateStatus()) + { + // Update the sleep time in order to not drift away by adding latency + sleep_time = std::max(m_sleep_time - (getTimeStamp() - t0), (long unsigned int)0); + } + + this->setSleepTime(sleep_time); +} -- GitLab